mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-12-01 00:12:27 +00:00
- rewrote render loop for walls. Not working yet.
This commit is contained in:
parent
4d7e7deea8
commit
5448b335c6
3 changed files with 69 additions and 77 deletions
|
@ -114,7 +114,6 @@ public:
|
||||||
{
|
{
|
||||||
RWF_BLANK = 0,
|
RWF_BLANK = 0,
|
||||||
RWF_TEXTURED = 1, // actually not being used anymore because with buffers it's even less efficient not writing the texture coordinates - but leave it here
|
RWF_TEXTURED = 1, // actually not being used anymore because with buffers it's even less efficient not writing the texture coordinates - but leave it here
|
||||||
RWF_GLOW = 2,
|
|
||||||
RWF_NOSPLIT = 4,
|
RWF_NOSPLIT = 4,
|
||||||
RWF_NORENDER = 8,
|
RWF_NORENDER = 8,
|
||||||
};
|
};
|
||||||
|
@ -136,6 +135,7 @@ public:
|
||||||
fixed_t viewdistance;
|
fixed_t viewdistance;
|
||||||
|
|
||||||
GLWallLightEntry *lights;
|
GLWallLightEntry *lights;
|
||||||
|
unsigned int lightsize;
|
||||||
int lightlevel;
|
int lightlevel;
|
||||||
BYTE type;
|
BYTE type;
|
||||||
BYTE flags;
|
BYTE flags;
|
||||||
|
@ -176,6 +176,7 @@ private:
|
||||||
void SetupLights();
|
void SetupLights();
|
||||||
bool PrepareLight(texcoord * tcs, ADynamicLight * light);
|
bool PrepareLight(texcoord * tcs, ADynamicLight * light);
|
||||||
void RenderWall(int textured, unsigned int *store = NULL);
|
void RenderWall(int textured, unsigned int *store = NULL);
|
||||||
|
void RenderTextured(int rflags);
|
||||||
|
|
||||||
void FloodPlane(int pass);
|
void FloodPlane(int pass);
|
||||||
|
|
||||||
|
|
|
@ -236,7 +236,8 @@ void GLWall::SplitWall(sector_t * frontsector, bool translucent)
|
||||||
}
|
}
|
||||||
::SplitWall.Clock();
|
::SplitWall.Clock();
|
||||||
|
|
||||||
lights = (GLWallLightEntry*)GLWallLightEntryArena.Alloc(sizeof(GLWallLightEntry)*lightlist.Size());
|
lightsize = lightlist.Size();
|
||||||
|
lights = (GLWallLightEntry*)GLWallLightEntryArena.Alloc(sizeof(GLWallLightEntry)*lightsize);
|
||||||
secplane_t *upperplane = &topplane;
|
secplane_t *upperplane = &topplane;
|
||||||
for (unsigned i = 0; i < lightlist.Size(); i++)
|
for (unsigned i = 0; i < lightlist.Size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -1293,6 +1294,7 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector)
|
||||||
Colormap = frontsector->ColorMap;
|
Colormap = frontsector->ColorMap;
|
||||||
flags = 0;
|
flags = 0;
|
||||||
dynlightindex = UINT_MAX;
|
dynlightindex = UINT_MAX;
|
||||||
|
lights = NULL;
|
||||||
|
|
||||||
int rel = 0;
|
int rel = 0;
|
||||||
int orglightlevel = gl_ClampLight(frontsector->lightlevel);
|
int orglightlevel = gl_ClampLight(frontsector->lightlevel);
|
||||||
|
|
|
@ -182,11 +182,6 @@ void GLWall::RenderWall(int textured, unsigned int *store)
|
||||||
tcs[1]=uplft;
|
tcs[1]=uplft;
|
||||||
tcs[2]=uprgt;
|
tcs[2]=uprgt;
|
||||||
tcs[3]=lorgt;
|
tcs[3]=lorgt;
|
||||||
if ((flags&GLWF_GLOW) && (textured & RWF_GLOW))
|
|
||||||
{
|
|
||||||
gl_RenderState.SetGlowPlanes(topplane, bottomplane);
|
|
||||||
gl_RenderState.SetGlowParams(topglowcolor, bottomglowcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(textured & RWF_NORENDER))
|
if (!(textured & RWF_NORENDER))
|
||||||
{
|
{
|
||||||
|
@ -306,6 +301,59 @@ void GLWall::RenderMirrorSurface()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void GLWall::RenderTextured(int rflags)
|
||||||
|
{
|
||||||
|
int tmode = gl_RenderState.GetTextureMode();
|
||||||
|
int rel = getExtraLight();
|
||||||
|
|
||||||
|
if (flags & GLWF_GLOW)
|
||||||
|
{
|
||||||
|
gl_RenderState.EnableGlow(true);
|
||||||
|
gl_RenderState.SetGlowPlanes(topplane, bottomplane);
|
||||||
|
gl_RenderState.SetGlowParams(topglowcolor, bottomglowcolor);
|
||||||
|
}
|
||||||
|
gl_RenderState.SetMaterial(gltexture, flags & 3, 0, -1, false);
|
||||||
|
|
||||||
|
if (type == RENDERWALL_M2SNF)
|
||||||
|
{
|
||||||
|
if (flags & GLT_CLAMPY)
|
||||||
|
{
|
||||||
|
if (tmode == TM_MODULATE) gl_RenderState.SetTextureMode(TM_CLAMPY);
|
||||||
|
}
|
||||||
|
gl_SetFog(255, 0, NULL, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
float absalpha = fabsf(alpha);
|
||||||
|
if (lights == NULL)
|
||||||
|
{
|
||||||
|
gl_SetColor(lightlevel, rel, Colormap, absalpha);
|
||||||
|
if (type != RENDERWALL_M2SNF) gl_SetFog(lightlevel, rel, &Colormap, RenderStyle == STYLE_Add);
|
||||||
|
RenderWall(rflags);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned int store[2];
|
||||||
|
//RenderWall(rflags, store);
|
||||||
|
gl_RenderState.EnableSplit(true);
|
||||||
|
for (unsigned i = 0; i < lightsize; i++)
|
||||||
|
{
|
||||||
|
gl_SetColor(lights[i].lightlevel, rel, lights[i].colormap, absalpha);
|
||||||
|
if (type != RENDERWALL_M2SNF) gl_SetFog(lights[i].lightlevel, rel, &lights[i].colormap, RenderStyle == STYLE_Add);
|
||||||
|
gl_RenderState.SetSplitPlanes(*lights[i].cliptop, *lights[i].clipbottom);
|
||||||
|
//GLRenderer->mVBO->RenderArray(GL_TRIANGLE_FAN, store[0], store[1]);
|
||||||
|
RenderWall(rflags);
|
||||||
|
}
|
||||||
|
gl_RenderState.EnableSplit(false);
|
||||||
|
}
|
||||||
|
gl_RenderState.SetTextureMode(tmode);
|
||||||
|
gl_RenderState.EnableGlow(false);
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
@ -315,57 +363,26 @@ void GLWall::RenderMirrorSurface()
|
||||||
|
|
||||||
void GLWall::RenderTranslucentWall()
|
void GLWall::RenderTranslucentWall()
|
||||||
{
|
{
|
||||||
bool transparent = gltexture? gltexture->GetTransparent() : false;
|
|
||||||
|
|
||||||
// currently the only modes possible are solid, additive or translucent
|
|
||||||
// and until that changes I won't fix this code for the new blending modes!
|
|
||||||
bool isadditive = RenderStyle == STYLE_Add;
|
|
||||||
|
|
||||||
if (gl_fixedcolormap == CM_DEFAULT && gl_lights && (gl.flags & RFL_BUFFER_STORAGE))
|
if (gl_fixedcolormap == CM_DEFAULT && gl_lights && (gl.flags & RFL_BUFFER_STORAGE))
|
||||||
{
|
{
|
||||||
SetupLights();
|
SetupLights();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!transparent) gl_RenderState.AlphaFunc(GL_GEQUAL, gl_mask_threshold);
|
|
||||||
else gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f);
|
|
||||||
if (isadditive) gl_RenderState.BlendFunc(GL_SRC_ALPHA,GL_ONE);
|
|
||||||
|
|
||||||
int extra;
|
|
||||||
if (gltexture)
|
if (gltexture)
|
||||||
{
|
{
|
||||||
gl_RenderState.EnableGlow(!!(flags & GLWF_GLOW));
|
if (!gltexture->GetTransparent()) gl_RenderState.AlphaFunc(GL_GEQUAL, gl_mask_threshold);
|
||||||
gl_RenderState.SetMaterial(gltexture, flags & 3, 0, -1, false);
|
else gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f);
|
||||||
extra = getExtraLight();
|
if (RenderStyle == STYLE_Add) gl_RenderState.BlendFunc(GL_SRC_ALPHA,GL_ONE);
|
||||||
|
RenderTextured(RWF_TEXTURED | RWF_NOSPLIT);
|
||||||
|
if (RenderStyle == STYLE_Add) gl_RenderState.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gl_RenderState.EnableTexture(false);
|
gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f);
|
||||||
extra = 0;
|
gl_SetColor(lightlevel, 0, Colormap, fabsf(alpha));
|
||||||
}
|
gl_SetFog(lightlevel, 0, &Colormap, RenderStyle == STYLE_Add);
|
||||||
int tmode = gl_RenderState.GetTextureMode();
|
RenderWall(RWF_NOSPLIT);
|
||||||
|
|
||||||
gl_SetColor(lightlevel, extra, Colormap, fabsf(alpha));
|
|
||||||
if (type!=RENDERWALL_M2SNF) gl_SetFog(lightlevel, extra, &Colormap, isadditive);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (flags & GLT_CLAMPY)
|
|
||||||
{
|
|
||||||
if (tmode == TM_MODULATE) gl_RenderState.SetTextureMode(TM_CLAMPY);
|
|
||||||
}
|
|
||||||
gl_SetFog(255, 0, NULL, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
RenderWall(RWF_TEXTURED|RWF_NOSPLIT);
|
|
||||||
|
|
||||||
// restore default settings
|
|
||||||
if (isadditive) gl_RenderState.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
if (!gltexture)
|
|
||||||
{
|
|
||||||
gl_RenderState.EnableTexture(true);
|
gl_RenderState.EnableTexture(true);
|
||||||
}
|
}
|
||||||
gl_RenderState.EnableGlow(false);
|
|
||||||
gl_RenderState.SetTextureMode(tmode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -375,17 +392,6 @@ void GLWall::RenderTranslucentWall()
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
void GLWall::Draw(int pass)
|
void GLWall::Draw(int pass)
|
||||||
{
|
{
|
||||||
int rel;
|
|
||||||
int tmode;
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
if (seg->linedef-lines==879)
|
|
||||||
{
|
|
||||||
int a = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
switch (pass)
|
switch (pass)
|
||||||
{
|
{
|
||||||
case GLPASS_LIGHTSONLY:
|
case GLPASS_LIGHTSONLY:
|
||||||
|
@ -396,28 +402,11 @@ void GLWall::Draw(int pass)
|
||||||
SetupLights();
|
SetupLights();
|
||||||
// fall through
|
// fall through
|
||||||
case GLPASS_PLAIN:
|
case GLPASS_PLAIN:
|
||||||
rel = rellight + getExtraLight();
|
RenderTextured(RWF_TEXTURED);
|
||||||
gl_SetColor(lightlevel, rel, Colormap,1.0f);
|
|
||||||
tmode = gl_RenderState.GetTextureMode();
|
|
||||||
if (type!=RENDERWALL_M2SNF) gl_SetFog(lightlevel, rel, &Colormap, false);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (flags & GLT_CLAMPY)
|
|
||||||
{
|
|
||||||
if (tmode == TM_MODULATE) gl_RenderState.SetTextureMode(TM_CLAMPY);
|
|
||||||
}
|
|
||||||
gl_SetFog(255, 0, NULL, false);
|
|
||||||
}
|
|
||||||
gl_RenderState.EnableGlow(!!(flags & GLWF_GLOW));
|
|
||||||
gl_RenderState.SetMaterial(gltexture, flags & 3, false, -1, false);
|
|
||||||
RenderWall(RWF_TEXTURED|RWF_GLOW);
|
|
||||||
gl_RenderState.EnableGlow(false);
|
|
||||||
gl_RenderState.SetTextureMode(tmode);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GLPASS_TRANSLUCENT:
|
case GLPASS_TRANSLUCENT:
|
||||||
|
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case RENDERWALL_MIRRORSURFACE:
|
case RENDERWALL_MIRRORSURFACE:
|
||||||
|
|
Loading…
Reference in a new issue