mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-14 08:30:50 +00:00
- added light plane clipping for decals as well.
This commit is contained in:
parent
faa08410de
commit
f11f86f05d
1 changed files with 69 additions and 14 deletions
|
@ -308,14 +308,7 @@ void GLWall::DrawDecal(DBaseDecal *decal)
|
|||
gl_RenderState.SetObjectColor(decal->AlphaColor|0xff000000);
|
||||
}
|
||||
|
||||
gl_SetColor(light, rel, p, a);
|
||||
|
||||
// for additively drawn decals we must temporarily set the fog color to black.
|
||||
PalEntry fc = gl_RenderState.GetFogColor();
|
||||
if (decal->RenderStyle.BlendOp == STYLEOP_Add && decal->RenderStyle.DestAlpha == STYLEALPHA_One)
|
||||
{
|
||||
gl_RenderState.SetFog(0,-1);
|
||||
}
|
||||
|
||||
|
||||
gl_SetRenderStyle(decal->RenderStyle, false, false);
|
||||
|
@ -326,6 +319,17 @@ void GLWall::DrawDecal(DBaseDecal *decal)
|
|||
if (decal->RenderStyle.SrcAlpha == STYLEALPHA_One) gl_RenderState.AlphaFunc(GL_GEQUAL, gl_mask_sprite_threshold);
|
||||
else gl_RenderState.AlphaFunc(GL_GREATER, 0.f);
|
||||
|
||||
|
||||
gl_SetColor(light, rel, p, a);
|
||||
// for additively drawn decals we must temporarily set the fog color to black.
|
||||
PalEntry fc = gl_RenderState.GetFogColor();
|
||||
if (decal->RenderStyle.BlendOp == STYLEOP_Add && decal->RenderStyle.DestAlpha == STYLEALPHA_One)
|
||||
{
|
||||
gl_RenderState.SetFog(0,-1);
|
||||
}
|
||||
|
||||
if (lightlist == NULL)
|
||||
{
|
||||
gl_RenderState.Apply();
|
||||
FFlatVertex *ptr = GLRenderer->mVBO->GetBuffer();
|
||||
for (i = 0; i < 4; i++)
|
||||
|
@ -334,6 +338,39 @@ void GLWall::DrawDecal(DBaseDecal *decal)
|
|||
ptr++;
|
||||
}
|
||||
GLRenderer->mVBO->RenderCurrent(ptr, GL_TRIANGLE_FAN);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (unsigned k = 0; k < lightlist->Size(); k++)
|
||||
{
|
||||
secplane_t &lowplane = k == (*lightlist).Size() - 1 ? bottomplane : (*lightlist)[k + 1].plane;
|
||||
|
||||
float low1 = lowplane.ZatPoint(dv[1].x, dv[i].y);
|
||||
float low2 = lowplane.ZatPoint(dv[2].x, dv[2].y);
|
||||
|
||||
if (low1 < dv[1].z && low2 < dv[2].z)
|
||||
{
|
||||
int thisll = (*lightlist)[k].caster != NULL ? gl_ClampLight(*(*lightlist)[k].p_lightlevel) : lightlevel;
|
||||
FColormap thiscm;
|
||||
thiscm.FadeColor = Colormap.FadeColor;
|
||||
thiscm.CopyFrom3DLight(&(*lightlist)[k]);
|
||||
gl_SetColor(thisll, rel, thiscm, a);
|
||||
if (glset.nocoloredspritelighting) thiscm.Decolorize();
|
||||
gl_SetFog(thisll, rel, &thiscm, RenderStyle == STYLE_Add);
|
||||
gl_RenderState.SetSplitPlanes((*lightlist)[k].plane, lowplane);
|
||||
|
||||
gl_RenderState.Apply();
|
||||
FFlatVertex *ptr = GLRenderer->mVBO->GetBuffer();
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
ptr->Set(dv[i].x, dv[i].z, dv[i].y, dv[i].u, dv[i].v);
|
||||
ptr++;
|
||||
}
|
||||
GLRenderer->mVBO->RenderCurrent(ptr, GL_TRIANGLE_FAN);
|
||||
}
|
||||
if (low1 <= dv[0].z && low2 <= dv[3].z) break;
|
||||
}
|
||||
}
|
||||
|
||||
rendered_decals++;
|
||||
gl_RenderState.SetTextureMode(TM_MODULATE);
|
||||
|
@ -350,14 +387,32 @@ void GLWall::DrawDecal(DBaseDecal *decal)
|
|||
void GLWall::DoDrawDecals()
|
||||
{
|
||||
if (seg->sidedef && seg->sidedef->AttachedDecals)
|
||||
{
|
||||
if (lightlist != NULL)
|
||||
{
|
||||
gl_RenderState.EnableSplit(true);
|
||||
glEnable(GL_CLIP_DISTANCE3);
|
||||
glEnable(GL_CLIP_DISTANCE4);
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_SetFog(lightlevel, rellight + getExtraLight(), &Colormap, false);
|
||||
}
|
||||
|
||||
DBaseDecal *decal = seg->sidedef->AttachedDecals;
|
||||
while (decal)
|
||||
{
|
||||
DrawDecal(decal);
|
||||
decal = decal->WallNext;
|
||||
}
|
||||
|
||||
if (lightlist != NULL)
|
||||
{
|
||||
glDisable(GL_CLIP_DISTANCE3);
|
||||
glDisable(GL_CLIP_DISTANCE4);
|
||||
gl_RenderState.EnableSplit(false);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue