Skip to content

Commit

Permalink
Fixed|Map Renderer: Always use the glow properties of the surface bou…
Browse files Browse the repository at this point in the history
…nd material

When an alternative material is chosen for a wall section, such as
when using the lighting debug mode (rend-tex 2), the glow strength
properties should be taken from the surface bound material.
  • Loading branch information
danij-deng committed May 6, 2013
1 parent d5d0d36 commit 712bd7f
Showing 1 changed file with 62 additions and 62 deletions.
124 changes: 62 additions & 62 deletions doomsday/client/src/render/rend_main.cpp
Expand Up @@ -1462,90 +1462,89 @@ static bool writeWallSection(SectionEdge const &leftEdge, SectionEdge const &rig
deltaL += (sectionOffset / lineLength) * deltaDiff;
}

rendworldpoly_params_t parm; zap(parm);

parm.flags = RPF_DEFAULT;
parm.forceOpaque = (flags & WSF_FORCE_OPAQUE)? true : false;
parm.alpha = (flags & WSF_FORCE_OPAQUE)? 1 : opacity;
parm.mapElement = &mapElement;
parm.elmIdx = section;
parm.bsuf = &biasSurface;
parm.normal = &surface.normal();
parm.texTL = &texTL;
parm.texBR = &texBR;
parm.surfaceLightLevelDL = deltaL;
parm.surfaceLightLevelDR = deltaR;
parm.blendMode = BM_NORMAL;
parm.materialOrigin = &leftEdge.materialOrigin();
parm.materialScale = &materialScale;

parm.isWall = true;
parm.wall.sectionWidth = width;
parm.wall.leftEdge = &leftEdge;
parm.wall.rightEdge = &rightEdge;

MaterialSnapshot const &ms = material->prepare(mapSurfaceMaterialSpec(GL_REPEAT, GL_REPEAT));

// Fill in the remaining params data.
bool const writeToSkyMask = (material->isSkyMasked() && !devRendSkyMode);
Vector3f const *topColor = 0, *bottomColor = 0;
blendmode_t blendMode = BM_NORMAL;
uint lightListIdx = 0, shadowListIdx = 0;
float glowStrength = 0;
if(!writeToSkyMask)
if(material->isSkyMasked() && !devRendSkyMode)
{
// Make any necessary adjustments to the draw flags to suit the
// current texture mode.
if(!isTwoSidedMiddle)
parm.flags |= RPF_SKYMASK;
}
else
{
if(isTwoSidedMiddle)
{
blendMode = BM_NORMAL;
parm.blendMode = surface.blendMode();
if(parm.blendMode == BM_NORMAL && noSpriteTrans)
parm.blendMode = BM_ZEROALPHA; // "no translucency" mode
}
else

if(glowFactor > .0001f)
{
if(surface.blendMode() == BM_NORMAL && noSpriteTrans)
blendMode = BM_ZEROALPHA; // "no translucency" mode
if(material == surface.materialPtr())
{
parm.glowing = ms.glowStrength();
}
else
blendMode = surface.blendMode();
}

// Polyobj surfaces never shadow.
if(side.line().isFromPolyobj())
flags &= ~WSF_ADD_RADIO;
{
Material *actualMaterial = surface.hasMaterial()? surface.materialPtr()
: &App_Materials().find(de::Uri("System", Path("missing"))).material();

if(glowFactor > .0001f)
glowStrength = ms.glowStrength() * glowFactor; // Global scale factor.
MaterialSnapshot const &ms = actualMaterial->prepare(Rend_MapSurfaceMaterialSpec());
parm.glowing = ms.glowStrength();
}

// Dynamic Lights?
if(flags & WSF_ADD_DYNLIGHTS)
{
lightListIdx = projectSurfaceLights(surface, glowStrength, texTL, texBR,
isTwoSidedMiddle);
parm.glowing *= glowFactor; // Global scale factor.
}

// Dynamic shadows?
if(flags & WSF_ADD_DYNSHADOWS)
{
shadowListIdx = projectSurfaceShadows(surface, glowStrength, texTL, texBR);
}
side.chooseSurfaceTintColors(section, &parm.surfaceColor, &parm.wall.surfaceColor2);
}

if(glowStrength > 0)
flags &= ~WSF_ADD_RADIO;
// Project dynamic Lights?
if((flags & WSF_ADD_DYNLIGHTS) && !(parm.flags & RPF_SKYMASK))
{
parm.lightListIdx = projectSurfaceLights(surface, parm.glowing, texTL, texBR,
isTwoSidedMiddle);
}

side.chooseSurfaceTintColors(section, &topColor, &bottomColor);
// Project dynamic shadows?
if((flags & WSF_ADD_DYNSHADOWS) && !(parm.flags & RPF_SKYMASK))
{
parm.shadowListIdx = projectSurfaceShadows(surface, parm.glowing, texTL, texBR);
}

/*
* Geometry write/drawing begins.
*/

if(isTwoSidedMiddle && side.sectorPtr() != currentBspLeaf->sectorPtr())
{
// Temporarily modify the draw state.
currentSectorLightColor = R_GetSectorLightColor(side.sector());
currentSectorLightLevel = side.sector().lightLevel();
}

rendworldpoly_params_t parm; zap(parm);

parm.flags = RPF_DEFAULT | (writeToSkyMask? RPF_SKYMASK : 0);
parm.forceOpaque = (flags & WSF_FORCE_OPAQUE)? true : false;
parm.alpha = (flags & WSF_FORCE_OPAQUE)? 1 : opacity;
parm.mapElement = &mapElement;
parm.elmIdx = section;
parm.bsuf = &biasSurface;
parm.normal = &surface.normal();
parm.texTL = &texTL;
parm.texBR = &texBR;
parm.surfaceLightLevelDL = deltaL;
parm.surfaceLightLevelDR = deltaR;
parm.surfaceColor = topColor;
parm.glowing = glowStrength;
parm.blendMode = blendMode;
parm.materialOrigin = &leftEdge.materialOrigin();
parm.materialScale = &materialScale;
parm.lightListIdx = lightListIdx;
parm.shadowListIdx = shadowListIdx;

parm.isWall = true;
parm.wall.surfaceColor2 = bottomColor;
parm.wall.sectionWidth = width;
parm.wall.leftEdge = &leftEdge;
parm.wall.rightEdge = &rightEdge;

rvertex_t *rvertices;
// Allocate enough vertices for the divisions too.
if(leftEdge.divisionCount() || rightEdge.divisionCount())
Expand Down Expand Up @@ -1583,7 +1582,8 @@ static bool writeWallSection(SectionEdge const &leftEdge, SectionEdge const &rig
if(opaque)
{
// Render FakeRadio for this section?
if(!writeToSkyMask && (flags & WSF_ADD_RADIO))
if((flags & WSF_ADD_RADIO) &&
!((parm.flags & RPF_SKYMASK) || parm.glowing > 0 || side.line().isFromPolyobj()))
{
Rend_RadioUpdateForLineSide(side);
LineSideRadioData &frData = Rend_RadioDataForLineSide(side);
Expand Down

0 comments on commit 712bd7f

Please sign in to comment.