mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Fix #586 (display the killing clipping rectangle)
This commit is contained in:
parent
7f407aa303
commit
6f58c49f7d
|
@ -263,6 +263,21 @@ void CMapLayers::OnRender()
|
|||
RenderTools()->RenderTilemap(pTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_OPAQUE,
|
||||
EnvelopeEval, this, pTMap->m_ColorEnv, pTMap->m_ColorEnvOffset);
|
||||
Graphics()->BlendNormal();
|
||||
|
||||
//Draw kill tiles outside the entity clipping rectangle
|
||||
if(IsGameLayer)
|
||||
{
|
||||
|
||||
//Slow blinking to hint that it's not a part of the map
|
||||
double Seconds = time_get()/(double)time_freq();
|
||||
vec4 ColorHint = vec4(1.0f, 1.0f, 1.0f, 0.3f + 0.7f*(1.0+sin(2.0f*pi*Seconds/3.f))/2.0f);
|
||||
|
||||
RenderTools()->RenderTileRetangle(-201, -201, pTMap->m_Width+402, pTMap->m_Height+402,
|
||||
0, TILE_DEATH, //Display air inside, death outside
|
||||
32.0f, Color*ColorHint, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_TRANSPARENT,
|
||||
EnvelopeEval, this, pTMap->m_ColorEnv, pTMap->m_ColorEnvOffset);
|
||||
}
|
||||
|
||||
RenderTools()->RenderTilemap(pTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_TRANSPARENT,
|
||||
EnvelopeEval, this, pTMap->m_ColorEnv, pTMap->m_ColorEnvOffset);
|
||||
}
|
||||
|
|
|
@ -76,6 +76,7 @@ public:
|
|||
void RenderQuads(CQuad *pQuads, int NumQuads, int Flags, ENVELOPE_EVAL pfnEval, void *pUser);
|
||||
void ForceRenderQuads(CQuad *pQuads, int NumQuads, int Flags, ENVELOPE_EVAL pfnEval, void *pUser, float Alpha = 1.0f);
|
||||
void RenderTilemap(CTile *pTiles, int w, int h, float Scale, vec4 Color, int RenderFlags, ENVELOPE_EVAL pfnEval, void *pUser, int ColorEnv, int ColorEnvOffset);
|
||||
void RenderTileRetangle(int X, int Y, int w, int h, unsigned char indexIn, unsigned char indexOut, float Scale, vec4 Color, int RenderFlags, ENVELOPE_EVAL pfnEval, void *pUser, int ColorEnv, int ColorEnvOffset);
|
||||
|
||||
// helpers
|
||||
void MapscreenToWorld(float CenterX, float CenterY, float ParallaxX, float ParallaxY,
|
||||
|
|
|
@ -176,6 +176,83 @@ void CRenderTools::ForceRenderQuads(CQuad *pQuads, int NumQuads, int RenderFlags
|
|||
Graphics()->QuadsEnd();
|
||||
}
|
||||
|
||||
void CRenderTools::RenderTileRetangle(int X, int Y, int w, int h, unsigned char indexIn, unsigned char indexOut, float Scale, vec4 Color, int RenderFlags,
|
||||
ENVELOPE_EVAL pfnEval, void *pUser, int ColorEnv, int ColorEnvOffset)
|
||||
{
|
||||
//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;
|
||||
|
||||
float r=1, g=1, b=1, a=1;
|
||||
if(ColorEnv >= 0)
|
||||
{
|
||||
float aChannels[4];
|
||||
pfnEval(ColorEnvOffset/1000.0f, ColorEnv, aChannels, pUser);
|
||||
r = aChannels[0];
|
||||
g = aChannels[1];
|
||||
b = aChannels[2];
|
||||
a = aChannels[3];
|
||||
}
|
||||
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(Color.r*r, Color.g*g, Color.b*b, Color.a*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++)
|
||||
{
|
||||
unsigned char Index = (x<X || x>=X+w || y<Y || y>Y+h) ? indexOut : indexIn;
|
||||
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::RenderTilemap(CTile *pTiles, int w, int h, float Scale, vec4 Color, int RenderFlags,
|
||||
ENVELOPE_EVAL pfnEval, void *pUser, int ColorEnv, int ColorEnvOffset)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue