2010-05-29 07:25:38 +00:00
# include <stdio.h>
# include <engine/graphics.h>
# include <engine/keys.h> //temp
# include <engine/shared/config.h>
2009-10-27 14:38:53 +00:00
2010-05-29 07:25:38 +00:00
# include <game/layers.h>
# include <game/client/gameclient.h>
# include <game/client/component.h>
# include <game/client/render.h>
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
# include <game/client/components/camera.h>
# include <game/client/components/mapimages.h>
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
2010-05-29 07:25:38 +00:00
# include "maplayers.h"
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
CMapLayers : : CMapLayers ( int t )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
m_Type = t ;
m_pLayers = 0 ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CMapLayers : : OnInit ( )
{
m_pLayers = Layers ( ) ;
}
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
void CMapLayers : : MapScreenToGroup ( float CenterX , float CenterY , CMapItemGroup * pGroup )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
float Points [ 4 ] ;
RenderTools ( ) - > MapscreenToWorld ( CenterX , CenterY , pGroup - > m_ParallaxX / 100.0f , pGroup - > m_ParallaxY / 100.0f ,
pGroup - > m_OffsetX , pGroup - > m_OffsetY , Graphics ( ) - > ScreenAspect ( ) , 1.0f , Points ) ;
Graphics ( ) - > MapScreen ( Points [ 0 ] , Points [ 1 ] , Points [ 2 ] , Points [ 3 ] ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CMapLayers : : EnvelopeEval ( float TimeOffset , int Env , float * pChannels , void * pUser )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CMapLayers * pThis = ( CMapLayers * ) pUser ;
pChannels [ 0 ] = 0 ;
pChannels [ 1 ] = 0 ;
pChannels [ 2 ] = 0 ;
pChannels [ 3 ] = 0 ;
2008-08-27 15:48:50 +00:00
2010-06-09 16:24:38 +00:00
CEnvPoint * pPoints = 0 ;
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
int Start , Num ;
pThis - > m_pLayers - > Map ( ) - > GetType ( MAPITEMTYPE_ENVPOINTS , & Start , & Num ) ;
if ( Num )
pPoints = ( CEnvPoint * ) pThis - > m_pLayers - > Map ( ) - > GetItem ( Start , 0 , 0 ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
int Start , Num ;
pThis - > m_pLayers - > Map ( ) - > GetType ( MAPITEMTYPE_ENVELOPE , & Start , & Num ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
if ( Env > = Num )
2008-08-27 15:48:50 +00:00
return ;
2010-05-29 07:25:38 +00:00
CMapItemEnvelope * pItem = ( CMapItemEnvelope * ) pThis - > m_pLayers - > Map ( ) - > GetItem ( Start + Env , 0 , 0 ) ;
pThis - > RenderTools ( ) - > RenderEvalEnvelope ( pPoints + pItem - > m_StartPoint , pItem - > m_NumPoints , 4 , pThis - > Client ( ) - > LocalTime ( ) + TimeOffset , pChannels ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CMapLayers : : OnRender ( )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( Client ( ) - > State ( ) ! = IClient : : STATE_ONLINE & & Client ( ) - > State ( ) ! = IClient : : STATE_DEMOPLAYBACK )
2008-08-30 09:16:29 +00:00
return ;
2010-05-29 07:25:38 +00:00
CUIRect Screen ;
Graphics ( ) - > GetScreen ( & Screen . x , & Screen . y , & Screen . w , & Screen . h ) ;
2009-01-12 14:43:39 +00:00
2010-05-29 07:25:38 +00:00
vec2 Center = m_pClient - > m_pCamera - > m_Center ;
2008-08-27 15:48:50 +00:00
//float center_x = gameclient.camera->center.x;
//float center_y = gameclient.camera->center.y;
2010-05-29 07:25:38 +00:00
bool PassedGameLayer = false ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
for ( int g = 0 ; g < m_pLayers - > NumGroups ( ) ; g + + )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CMapItemGroup * pGroup = m_pLayers - > GetGroup ( g ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
if ( ! g_Config . m_GfxNoclip & & pGroup - > m_Version > = 2 & & pGroup - > m_UseClipping )
2008-08-27 15:48:50 +00:00
{
// set clipping
2010-05-29 07:25:38 +00:00
float Points [ 4 ] ;
MapScreenToGroup ( Center . x , Center . y , m_pLayers - > GameGroup ( ) ) ;
Graphics ( ) - > GetScreen ( & Points [ 0 ] , & Points [ 1 ] , & Points [ 2 ] , & Points [ 3 ] ) ;
float x0 = ( pGroup - > m_ClipX - Points [ 0 ] ) / ( Points [ 2 ] - Points [ 0 ] ) ;
float y0 = ( pGroup - > m_ClipY - Points [ 1 ] ) / ( Points [ 3 ] - Points [ 1 ] ) ;
float x1 = ( ( pGroup - > m_ClipX + pGroup - > m_ClipW ) - Points [ 0 ] ) / ( Points [ 2 ] - Points [ 0 ] ) ;
float y1 = ( ( pGroup - > m_ClipY + pGroup - > m_ClipH ) - Points [ 1 ] ) / ( Points [ 3 ] - Points [ 1 ] ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
Graphics ( ) - > ClipEnable ( ( int ) ( x0 * Graphics ( ) - > ScreenWidth ( ) ) , ( int ) ( y0 * Graphics ( ) - > ScreenHeight ( ) ) ,
( int ) ( ( x1 - x0 ) * Graphics ( ) - > ScreenWidth ( ) ) , ( int ) ( ( y1 - y0 ) * Graphics ( ) - > ScreenHeight ( ) ) ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
MapScreenToGroup ( Center . x , Center . y , pGroup ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
for ( int l = 0 ; l < pGroup - > m_NumLayers ; l + + )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CMapItemLayer * pLayer = m_pLayers - > GetLayer ( pGroup - > m_StartLayer + l ) ;
bool Render = false ;
bool IsGameLayer = false ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
if ( pLayer = = ( CMapItemLayer * ) m_pLayers - > GameLayer ( ) )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
IsGameLayer = true ;
PassedGameLayer = 1 ;
2008-08-27 15:48:50 +00:00
}
2009-01-17 22:19:13 +00:00
// skip rendering if detail layers if not wanted
2010-05-29 07:25:38 +00:00
if ( pLayer - > m_Flags & LAYERFLAG_DETAIL & & ! g_Config . m_GfxHighDetail & & ! IsGameLayer )
2009-01-17 22:19:13 +00:00
continue ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
if ( m_Type = = - 1 )
Render = true ;
else if ( m_Type = = 0 )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
if ( PassedGameLayer )
2008-08-27 15:48:50 +00:00
return ;
2010-05-29 07:25:38 +00:00
Render = true ;
2008-08-27 15:48:50 +00:00
}
else
{
2010-05-29 07:25:38 +00:00
if ( PassedGameLayer & & ! IsGameLayer )
Render = true ;
2008-08-27 15:48:50 +00:00
}
2010-09-05 03:29:27 +00:00
if ( pLayer - > m_Type = = LAYERTYPE_TILES & & Input ( ) - > KeyPressed ( KEY_KP0 ) & & g_Config . m_DbgLayers ) //This is what caused the client to lag when kp0 is pressed ingame also caused crashes on linux
2010-05-29 07:25:38 +00:00
{
CMapItemLayerTilemap * pTMap = ( CMapItemLayerTilemap * ) pLayer ;
CTile * pTiles = ( CTile * ) m_pLayers - > Map ( ) - > GetData ( pTMap - > m_Data ) ;
char buf [ 256 ] ;
str_format ( buf , sizeof ( buf ) , " %d%d_%dx%d " , g , l , pTMap - > m_Width , pTMap - > m_Height ) ;
FILE * f = fopen ( buf , " w " ) ;
for ( int y = 0 ; y < pTMap - > m_Height ; y + + )
{
for ( int x = 0 ; x < pTMap - > m_Width ; x + + )
fprintf ( f , " %d, " , pTiles [ y * pTMap - > m_Width + x ] . m_Index ) ;
fprintf ( f , " \n " ) ;
}
fclose ( f ) ;
}
if ( Render & & ! IsGameLayer )
2008-08-27 15:48:50 +00:00
{
//layershot_begin();
2010-05-29 07:25:38 +00:00
if ( pLayer - > m_Type = = LAYERTYPE_TILES )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CMapItemLayerTilemap * pTMap = ( CMapItemLayerTilemap * ) pLayer ;
if ( pTMap - > m_Image = = - 1 )
2009-10-27 14:38:53 +00:00
Graphics ( ) - > TextureSet ( - 1 ) ;
2008-08-27 15:48:50 +00:00
else
2010-05-29 07:25:38 +00:00
Graphics ( ) - > TextureSet ( m_pClient - > m_pMapimages - > Get ( pTMap - > m_Image ) ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
CTile * pTiles = ( CTile * ) m_pLayers - > Map ( ) - > GetData ( pTMap - > m_Data ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > BlendNone ( ) ;
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > RenderTilemap ( pTiles , pTMap - > m_Width , pTMap - > m_Height , 32.0f , vec4 ( 1 , 1 , 1 , 1 ) , TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_OPAQUE ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > BlendNormal ( ) ;
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > RenderTilemap ( pTiles , pTMap - > m_Width , pTMap - > m_Height , 32.0f , vec4 ( 1 , 1 , 1 , 1 ) , TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
else if ( pLayer - > m_Type = = LAYERTYPE_QUADS )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
CMapItemLayerQuads * pQLayer = ( CMapItemLayerQuads * ) pLayer ;
if ( pQLayer - > m_Image = = - 1 )
2009-10-27 14:38:53 +00:00
Graphics ( ) - > TextureSet ( - 1 ) ;
2008-08-27 15:48:50 +00:00
else
2010-05-29 07:25:38 +00:00
Graphics ( ) - > TextureSet ( m_pClient - > m_pMapimages - > Get ( pQLayer - > m_Image ) ) ;
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
CQuad * pQuads = ( CQuad * ) m_pLayers - > Map ( ) - > GetDataSwapped ( pQLayer - > m_Data ) ;
2008-08-27 15:48:50 +00:00
2009-10-27 14:38:53 +00:00
Graphics ( ) - > BlendNone ( ) ;
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > RenderQuads ( pQuads , pQLayer - > m_NumQuads , LAYERRENDERFLAG_OPAQUE , EnvelopeEval , this ) ;
2009-10-27 14:38:53 +00:00
Graphics ( ) - > BlendNormal ( ) ;
2010-05-29 07:25:38 +00:00
RenderTools ( ) - > RenderQuads ( pQuads , pQLayer - > m_NumQuads , LAYERRENDERFLAG_TRANSPARENT , EnvelopeEval , this ) ;
2008-08-27 15:48:50 +00:00
}
//layershot_end();
}
}
2010-05-29 07:25:38 +00:00
if ( ! g_Config . m_GfxNoclip )
2009-10-27 14:38:53 +00:00
Graphics ( ) - > ClipDisable ( ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
if ( ! g_Config . m_GfxNoclip )
2009-10-27 14:38:53 +00:00
Graphics ( ) - > ClipDisable ( ) ;
2009-01-12 14:43:39 +00:00
// reset the screen like it was before
2010-05-29 07:25:38 +00:00
Graphics ( ) - > MapScreen ( Screen . x , Screen . y , Screen . w , Screen . h ) ;
2008-08-27 15:48:50 +00:00
}