diff --git a/src/game/client/components/maplayers.cpp b/src/game/client/components/maplayers.cpp index 897ac8e24..436b47686 100644 --- a/src/game/client/components/maplayers.cpp +++ b/src/game/client/components/maplayers.cpp @@ -195,7 +195,7 @@ void CMapLayers::OnRender() } } - if((Render && !IsGameLayer && !IsFrontLayer && !IsTeleLayer && !IsSwitchLayer && !IsSpeedupLayer && (!g_Config.m_ClShowEntities || !g_Config.m_ClDDRaceCheats)) || ((g_Config.m_ClShowEntities && g_Config.m_ClDDRaceCheats) && (IsGameLayer || IsFrontLayer || IsTeleLayer || IsSwitchLayer || IsSpeedupLayer))) + if((Render && !IsGameLayer && (!g_Config.m_ClShowEntities || !g_Config.m_ClDDRaceCheats)) || ((g_Config.m_ClShowEntities && g_Config.m_ClDDRaceCheats) && IsGameLayer)) { //layershot_begin(); @@ -237,6 +237,57 @@ void CMapLayers::OnRender() //layershot_end(); } + else if((g_Config.m_ClShowEntities && g_Config.m_ClDDRaceCheats) && IsFrontLayer) + { + CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; + Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); + + CTile *pFrontTiles = (CTile *)m_pLayers->Map()->GetData(pTMap->m_Front); + Graphics()->BlendNone(); + vec4 Color = vec4(pTMap->m_Color.r/255.0f, pTMap->m_Color.g/255.0f, pTMap->m_Color.b/255.0f, pTMap->m_Color.a/255.0f); + RenderTools()->RenderTilemap(pFrontTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_OPAQUE); + Graphics()->BlendNormal(); + RenderTools()->RenderTilemap(pFrontTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_TRANSPARENT); + } + else if((g_Config.m_ClShowEntities && g_Config.m_ClDDRaceCheats) && IsSwitchLayer) + { + CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; + Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); + + CSwitchTile *pSwitchTiles = (CSwitchTile *)m_pLayers->Map()->GetData(pTMap->m_Switch); + Graphics()->BlendNone(); + vec4 Color = vec4(pTMap->m_Color.r/255.0f, pTMap->m_Color.g/255.0f, pTMap->m_Color.b/255.0f, pTMap->m_Color.a/255.0f); + RenderTools()->RenderSwitchmap(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_OPAQUE); + Graphics()->BlendNormal(); + RenderTools()->RenderSwitchmap(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_TRANSPARENT); + RenderTools()->RenderSwitchOverlay(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f); + } + else if((g_Config.m_ClShowEntities && g_Config.m_ClDDRaceCheats) && IsTeleLayer) + { + CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; + Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); + + CTeleTile *pTeleTiles = (CTeleTile *)m_pLayers->Map()->GetData(pTMap->m_Tele); + Graphics()->BlendNone(); + vec4 Color = vec4(pTMap->m_Color.r/255.0f, pTMap->m_Color.g/255.0f, pTMap->m_Color.b/255.0f, pTMap->m_Color.a/255.0f); + RenderTools()->RenderTelemap(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_OPAQUE); + Graphics()->BlendNormal(); + RenderTools()->RenderTelemap(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_TRANSPARENT); + RenderTools()->RenderTeleOverlay(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f); + } + else if((g_Config.m_ClShowEntities && g_Config.m_ClDDRaceCheats) && IsSpeedupLayer) + { + CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; + Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); + + CSpeedupTile *pSpeedupTiles = (CSpeedupTile *)m_pLayers->Map()->GetData(pTMap->m_Speedup); + Graphics()->BlendNone(); + vec4 Color = vec4(pTMap->m_Color.r/255.0f, pTMap->m_Color.g/255.0f, pTMap->m_Color.b/255.0f, pTMap->m_Color.a/255.0f); + RenderTools()->RenderSpeedupmap(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_OPAQUE); + Graphics()->BlendNormal(); + RenderTools()->RenderSpeedupmap(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_TRANSPARENT); + RenderTools()->RenderSpeedupOverlay(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f); + } } if(!g_Config.m_GfxNoclip) Graphics()->ClipDisable(); diff --git a/src/game/client/render.h b/src/game/client/render.h index 5c1f0dfc6..45e39a143 100644 --- a/src/game/client/render.h +++ b/src/game/client/render.h @@ -79,10 +79,12 @@ public: // DDRace - void RenderTelemap(CTeleTile *pTele, int w, int h, float Scale); - void RenderSpeedupmap(CSpeedupTile *pTele, int w, int h, float Scale); - void RenderFrontmap(CTile *pTiles, int w, int h, float Scale, vec4 Color, int Flags); - void RenderSwitchmap(CSwitchTile *pSwitch, int w, int h, float Scale); + void RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale); + void RenderSpeedupOverlay(CSpeedupTile *pTele, int w, int h, float Scale); + void RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale); + void RenderTelemap(CTeleTile *pTele, int w, int h, float Scale, vec4 Color, int RenderFlags); + void RenderSpeedupmap(CSpeedupTile *pTele, int w, int h, float Scale, vec4 Color, int RenderFlags); + void RenderSwitchmap(CSwitchTile *pSwitch, int w, int h, float Scale, vec4 Color, int RenderFlags); }; #endif diff --git a/src/game/client/render_map.cpp b/src/game/client/render_map.cpp index 242667805..052c60e02 100644 --- a/src/game/client/render_map.cpp +++ b/src/game/client/render_map.cpp @@ -304,7 +304,7 @@ void CRenderTools::RenderTilemap(CTile *pTiles, int w, int h, float Scale, vec4 Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } -void CRenderTools::RenderTelemap(CTeleTile *pTele, int w, int h, float Scale) +void CRenderTools::RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale) { float ScreenX0, ScreenY0, ScreenX1, ScreenY1; Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); @@ -344,7 +344,7 @@ void CRenderTools::RenderTelemap(CTeleTile *pTele, int w, int h, float Scale) Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } -void CRenderTools::RenderSpeedupmap(CSpeedupTile *pSpeedup, int w, int h, float Scale) +void CRenderTools::RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, float Scale) { float ScreenX0, ScreenY0, ScreenX1, ScreenY1; Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); @@ -400,7 +400,7 @@ void CRenderTools::RenderSpeedupmap(CSpeedupTile *pSpeedup, int w, int h, float Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } -void CRenderTools::RenderSwitchmap(CSwitchTile *pSwitch, int w, int h, float Scale) +void CRenderTools::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale) { float ScreenX0, ScreenY0, ScreenX1, ScreenY1; Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); @@ -447,3 +447,320 @@ void CRenderTools::RenderSwitchmap(CSwitchTile *pSwitch, int w, int h, float Sca Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } + +void CRenderTools::RenderTelemap(CTeleTile *pTele, int w, int h, float Scale, vec4 Color, int RenderFlags) +{ + float ScreenX0, ScreenY0, ScreenX1, ScreenY1; + Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); + + // calculate the final pixelsize for the tiles + float TilePixelSize = 1024/32.0f; + float FinalTileSize = Scale/(ScreenX1-ScreenX0) * Graphics()->ScreenWidth(); + float FinalTilesetScale = FinalTileSize/TilePixelSize; + + Graphics()->QuadsBegin(); + Graphics()->SetColor(Color.r, Color.g, Color.b, Color.a); + + int StartY = (int)(ScreenY0/Scale)-1; + int StartX = (int)(ScreenX0/Scale)-1; + int EndY = (int)(ScreenY1/Scale)+1; + int EndX = (int)(ScreenX1/Scale)+1; + + // adjust the texture shift according to mipmap level + float TexSize = 1024.0f; + float Frac = (1.25f/TexSize) * (1/FinalTilesetScale); + float Nudge = (0.5f/TexSize) * (1/FinalTilesetScale); + + for(int y = StartY; y < EndY; y++) + for(int x = StartX; x < EndX; x++) + { + int mx = x; + int my = y; + + if(RenderFlags&TILERENDERFLAG_EXTEND) + { + if(mx<0) + mx = 0; + if(mx>=w) + mx = w-1; + if(my<0) + my = 0; + if(my>=h) + my = h-1; + } + else + { + if(mx<0) + continue; // mx = 0; + if(mx>=w) + continue; // mx = w-1; + if(my<0) + continue; // my = 0; + if(my>=h) + continue; // my = h-1; + } + + int c = mx + my*w; + + unsigned char Index = pTele[c].m_Type; + if(Index) + { + bool Render = false; + if(RenderFlags&LAYERRENDERFLAG_TRANSPARENT) + Render = true; + + if(Render) + { + + int tx = Index%16; + int ty = Index/16; + int Px0 = tx*(1024/16); + int Py0 = ty*(1024/16); + int Px1 = Px0+(1024/16)-1; + int Py1 = Py0+(1024/16)-1; + + float x0 = Nudge + Px0/TexSize+Frac; + float y0 = Nudge + Py0/TexSize+Frac; + float x1 = Nudge + Px1/TexSize-Frac; + float y1 = Nudge + Py0/TexSize+Frac; + float x2 = Nudge + Px1/TexSize-Frac; + float y2 = Nudge + Py1/TexSize-Frac; + float x3 = Nudge + Px0/TexSize+Frac; + float y3 = Nudge + Py1/TexSize-Frac; + + Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); + IGraphics::CQuadItem QuadItem(x*Scale, y*Scale, Scale, Scale); + Graphics()->QuadsDrawTL(&QuadItem, 1); + } + } + } + + Graphics()->QuadsEnd(); + Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); +} + +void CRenderTools::RenderSpeedupmap(CSpeedupTile *pSpeedupTile, int w, int h, float Scale, vec4 Color, int RenderFlags) +{ + //Graphics()->TextureSet(img_get(tmap->image)); + float ScreenX0, ScreenY0, ScreenX1, ScreenY1; + Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); + //Graphics()->MapScreen(screen_x0-50, screen_y0-50, screen_x1+50, screen_y1+50); + + // calculate the final pixelsize for the tiles + float TilePixelSize = 1024/32.0f; + float FinalTileSize = Scale/(ScreenX1-ScreenX0) * Graphics()->ScreenWidth(); + float FinalTilesetScale = FinalTileSize/TilePixelSize; + + Graphics()->QuadsBegin(); + Graphics()->SetColor(Color.r, Color.g, Color.b, Color.a); + + int StartY = (int)(ScreenY0/Scale)-1; + int StartX = (int)(ScreenX0/Scale)-1; + int EndY = (int)(ScreenY1/Scale)+1; + int EndX = (int)(ScreenX1/Scale)+1; + + // adjust the texture shift according to mipmap level + float TexSize = 1024.0f; + float Frac = (1.25f/TexSize) * (1/FinalTilesetScale); + float Nudge = (0.5f/TexSize) * (1/FinalTilesetScale); + + for(int y = StartY; y < EndY; y++) + for(int x = StartX; x < EndX; x++) + { + int mx = x; + int my = y; + + if(RenderFlags&TILERENDERFLAG_EXTEND) + { + if(mx<0) + mx = 0; + if(mx>=w) + mx = w-1; + if(my<0) + my = 0; + if(my>=h) + my = h-1; + } + else + { + if(mx<0) + continue; // mx = 0; + if(mx>=w) + continue; // mx = w-1; + if(my<0) + continue; // my = 0; + if(my>=h) + continue; // my = h-1; + } + + int c = mx + my*w; + + unsigned char Index = pSpeedupTile[c].m_Type; + if(Index) + { + bool Render = false; + if(RenderFlags&LAYERRENDERFLAG_TRANSPARENT) + Render = true; + + if(Render) + { + + int tx = Index%16; + int ty = Index/16; + int Px0 = tx*(1024/16); + int Py0 = ty*(1024/16); + int Px1 = Px0+(1024/16)-1; + int Py1 = Py0+(1024/16)-1; + + float x0 = Nudge + Px0/TexSize+Frac; + float y0 = Nudge + Py0/TexSize+Frac; + float x1 = Nudge + Px1/TexSize-Frac; + float y1 = Nudge + Py0/TexSize+Frac; + float x2 = Nudge + Px1/TexSize-Frac; + float y2 = Nudge + Py1/TexSize-Frac; + float x3 = Nudge + Px0/TexSize+Frac; + float y3 = Nudge + Py1/TexSize-Frac; + + Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); + IGraphics::CQuadItem QuadItem(x*Scale, y*Scale, Scale, Scale); + Graphics()->QuadsDrawTL(&QuadItem, 1); + } + } + } + + Graphics()->QuadsEnd(); + Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); +} + +void CRenderTools::RenderSwitchmap(CSwitchTile *pSwitchTile, int w, int h, float Scale, vec4 Color, int RenderFlags) +{ + //Graphics()->TextureSet(img_get(tmap->image)); + float ScreenX0, ScreenY0, ScreenX1, ScreenY1; + Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); + //Graphics()->MapScreen(screen_x0-50, screen_y0-50, screen_x1+50, screen_y1+50); + + // calculate the final pixelsize for the tiles + float TilePixelSize = 1024/32.0f; + float FinalTileSize = Scale/(ScreenX1-ScreenX0) * Graphics()->ScreenWidth(); + float FinalTilesetScale = FinalTileSize/TilePixelSize; + + Graphics()->QuadsBegin(); + Graphics()->SetColor(Color.r, Color.g, Color.b, Color.a); + + int StartY = (int)(ScreenY0/Scale)-1; + int StartX = (int)(ScreenX0/Scale)-1; + int EndY = (int)(ScreenY1/Scale)+1; + int EndX = (int)(ScreenX1/Scale)+1; + + // adjust the texture shift according to mipmap level + float TexSize = 1024.0f; + float Frac = (1.25f/TexSize) * (1/FinalTilesetScale); + float Nudge = (0.5f/TexSize) * (1/FinalTilesetScale); + + for(int y = StartY; y < EndY; y++) + for(int x = StartX; x < EndX; x++) + { + int mx = x; + int my = y; + + if(RenderFlags&TILERENDERFLAG_EXTEND) + { + if(mx<0) + mx = 0; + if(mx>=w) + mx = w-1; + if(my<0) + my = 0; + if(my>=h) + my = h-1; + } + else + { + if(mx<0) + continue; // mx = 0; + if(mx>=w) + continue; // mx = w-1; + if(my<0) + continue; // my = 0; + if(my>=h) + continue; // my = h-1; + } + + int c = mx + my*w; + + unsigned char Index = pSwitchTile[c].m_Type; + if(Index) + { + unsigned char Flags = pSwitchTile[c].m_Flags; + + bool Render = false; + if(Flags&TILEFLAG_OPAQUE) + { + if(RenderFlags&LAYERRENDERFLAG_OPAQUE) + Render = true; + } + else + { + if(RenderFlags&LAYERRENDERFLAG_TRANSPARENT) + Render = true; + } + + if(Render) + { + + int tx = Index%16; + int ty = Index/16; + int Px0 = tx*(1024/16); + int Py0 = ty*(1024/16); + int Px1 = Px0+(1024/16)-1; + int Py1 = Py0+(1024/16)-1; + + float x0 = Nudge + Px0/TexSize+Frac; + float y0 = Nudge + Py0/TexSize+Frac; + float x1 = Nudge + Px1/TexSize-Frac; + float y1 = Nudge + Py0/TexSize+Frac; + float x2 = Nudge + Px1/TexSize-Frac; + float y2 = Nudge + Py1/TexSize-Frac; + float x3 = Nudge + Px0/TexSize+Frac; + float y3 = Nudge + Py1/TexSize-Frac; + + if(Flags&TILEFLAG_VFLIP) + { + x0 = x2; + x1 = x3; + x2 = x3; + x3 = x0; + } + + if(Flags&TILEFLAG_HFLIP) + { + y0 = y3; + y2 = y1; + y3 = y1; + y1 = y0; + } + + if(Flags&TILEFLAG_ROTATE) + { + float Tmp = x0; + x0 = x3; + x3 = x2; + x2 = x1; + x1 = Tmp; + Tmp = y0; + y0 = y3; + y3 = y2; + y2 = y1; + y1 = Tmp; + } + + Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); + IGraphics::CQuadItem QuadItem(x*Scale, y*Scale, Scale, Scale); + Graphics()->QuadsDrawTL(&QuadItem, 1); + } + } + } + + Graphics()->QuadsEnd(); + Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); +} diff --git a/src/game/editor/ed_layer_tiles.cpp b/src/game/editor/ed_layer_tiles.cpp index fce720fce..add60bee3 100644 --- a/src/game/editor/ed_layer_tiles.cpp +++ b/src/game/editor/ed_layer_tiles.cpp @@ -74,11 +74,11 @@ void CLayerTiles::Render() // Render DDRace Layers if(m_Tele) - m_pEditor->RenderTools()->RenderTelemap(((CLayerTele*)this)->m_pTeleTile, m_Width, m_Height, 32.0f); + m_pEditor->RenderTools()->RenderTeleOverlay(((CLayerTele*)this)->m_pTeleTile, m_Width, m_Height, 32.0f); if(m_Speedup) - m_pEditor->RenderTools()->RenderSpeedupmap(((CLayerSpeedup*)this)->m_pSpeedupTile, m_Width, m_Height, 32.0f); + m_pEditor->RenderTools()->RenderSpeedupOverlay(((CLayerSpeedup*)this)->m_pSpeedupTile, m_Width, m_Height, 32.0f); if(m_Switch) - m_pEditor->RenderTools()->RenderSwitchmap(((CLayerSwitch*)this)->m_pSwitchTile, m_Width, m_Height, 32.0f); + m_pEditor->RenderTools()->RenderSwitchOverlay(((CLayerSwitch*)this)->m_pSwitchTile, m_Width, m_Height, 32.0f); } int CLayerTiles::ConvertX(float x) const { return (int)(x/32.0f); }