From a4632e2c07cfb6f97e05f3ff7974ae58be608922 Mon Sep 17 00:00:00 2001 From: HMH Date: Wed, 12 Mar 2014 23:42:51 +0100 Subject: [PATCH] added renderingfunction for tunelayer and tuneoverlay-function to display the zone-number --- src/game/client/render.h | 2 + src/game/client/render_map.cpp | 132 +++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) diff --git a/src/game/client/render.h b/src/game/client/render.h index b2e6b0af5..83dbd7ee0 100644 --- a/src/game/client/render.h +++ b/src/game/client/render.h @@ -84,9 +84,11 @@ public: 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 RenderTuneOverlay(CTuneTile *pTune, 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); + void RenderTunemap(CTuneTile *pTune, 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 446759c35..205cf7cdd 100644 --- a/src/game/client/render_map.cpp +++ b/src/game/client/render_map.cpp @@ -466,6 +466,46 @@ void CRenderTools::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } +void CRenderTools::RenderTuneOverlay(CTuneTile *pTune, int w, int h, float Scale) +{ + float ScreenX0, ScreenY0, ScreenX1, ScreenY1; + Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); + + int StartY = (int)(ScreenY0/Scale)-1; + int StartX = (int)(ScreenX0/Scale)-1; + int EndY = (int)(ScreenY1/Scale)+1; + int EndX = (int)(ScreenX1/Scale)+1; + + for(int y = StartY; y < EndY; y++) + for(int x = StartX; x < EndX; x++) + { + int mx = x; + int my = y; + + + 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 = pTune[c].m_Number; + if(Index) + { + char aBuf[16]; + str_format(aBuf, sizeof(aBuf), "%d", Index); + UI()->TextRender()->Text(0, mx*Scale+11.f, my*Scale+6.f, Scale/1.5f-5.f, aBuf, -1); // numbers shouldnt be too big and in the center of the tile + } + } + + 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; @@ -782,3 +822,95 @@ void CRenderTools::RenderSwitchmap(CSwitchTile *pSwitchTile, int w, int h, float Graphics()->QuadsEnd(); Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } + +void CRenderTools::RenderTunemap(CTuneTile *pTune, 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 = pTune[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); +} +