Cleanup and render-to-texture tweaks.
Added two new debug render modes Fixed bizarre issue with line-widths being sporadically inconsistent in ui. (needs glFlush for some reason)
This commit is contained in:
@@ -146,6 +146,7 @@ const LLMatrix4* gGLLastMatrix = NULL;
|
||||
std::string gPoolNames[] =
|
||||
{
|
||||
// Correspond to LLDrawpool enum render type
|
||||
"NONE",
|
||||
"POOL_SIMPLE",
|
||||
"POOL_TERRAIN",
|
||||
"POOL_BUMP",
|
||||
@@ -380,6 +381,7 @@ void LLPipeline::init()
|
||||
LLViewerShaderMgr::instance()->setShaders();
|
||||
|
||||
stop_glerror();
|
||||
setLightingDetail(-1);
|
||||
}
|
||||
|
||||
LLPipeline::~LLPipeline()
|
||||
@@ -452,8 +454,6 @@ void LLPipeline::cleanup()
|
||||
|
||||
releaseGLBuffers();
|
||||
|
||||
mBloomImagep = NULL;
|
||||
mBloomImage2p = NULL;
|
||||
mFaceSelectImagep = NULL;
|
||||
|
||||
mMovedBridge.clear();
|
||||
@@ -558,13 +558,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
|
||||
//static
|
||||
void LLPipeline::updateRenderDeferred()
|
||||
{
|
||||
BOOL deferred = (gSavedSettings.getBOOL("RenderDeferred") &&
|
||||
sRenderDeferred = (gSavedSettings.getBOOL("RenderDeferred") &&
|
||||
LLRenderTarget::sUseFBO &&
|
||||
gSavedSettings.getBOOL("VertexShaderEnable") &&
|
||||
gSavedSettings.getBOOL("RenderAvatarVP") &&
|
||||
gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE;
|
||||
|
||||
sRenderDeferred = deferred;
|
||||
gSavedSettings.getBOOL("WindLightUseAtmosShaders") &&
|
||||
!gUseWireframe);
|
||||
}
|
||||
|
||||
void LLPipeline::releaseGLBuffers()
|
||||
@@ -1398,6 +1397,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
|
||||
gGLLastMatrix = NULL;
|
||||
glLoadMatrixd(gGLLastModelView);
|
||||
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDisable test(GL_ALPHA_TEST);
|
||||
@@ -1475,10 +1475,10 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
|
||||
{
|
||||
mScreen.flush();
|
||||
}
|
||||
/*else if (LLPipeline::sUseOcclusion > 1)
|
||||
else if (LLPipeline::sUseOcclusion > 1)
|
||||
{
|
||||
glFlush();
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
void LLPipeline::markNotCulled(LLSpatialGroup* group, LLCamera& camera)
|
||||
@@ -2372,6 +2372,7 @@ void LLPipeline::postSort(LLCamera& camera)
|
||||
|
||||
assertInitialized();
|
||||
|
||||
llpushcallstacks ;
|
||||
//rebuild drawable geometry
|
||||
for (LLCullResult::sg_list_t::iterator i = sCull->beginDrawableGroups(); i != sCull->endDrawableGroups(); ++i)
|
||||
{
|
||||
@@ -2382,7 +2383,7 @@ void LLPipeline::postSort(LLCamera& camera)
|
||||
group->rebuildGeom();
|
||||
}
|
||||
}
|
||||
|
||||
llpushcallstacks ;
|
||||
//rebuild groups
|
||||
sCull->assertDrawMapsEmpty();
|
||||
|
||||
@@ -2400,10 +2401,10 @@ void LLPipeline::postSort(LLCamera& camera)
|
||||
}
|
||||
LLSpatialGroup::sNoDelete = TRUE;*/
|
||||
|
||||
|
||||
rebuildPriorityGroups();
|
||||
|
||||
|
||||
|
||||
llpushcallstacks ;
|
||||
|
||||
const S32 bin_count = 1024*8;
|
||||
|
||||
static LLCullResult::drawinfo_list_t alpha_bins[bin_count];
|
||||
@@ -2504,7 +2505,7 @@ void LLPipeline::postSort(LLCamera& camera)
|
||||
|
||||
std::sort(sCull->beginAlphaGroups(), sCull->endAlphaGroups(), LLSpatialGroup::CompareDepthGreater());
|
||||
}
|
||||
|
||||
llpushcallstacks ;
|
||||
// only render if the flag is set. The flag is only set if we are in edit mode or the toggle is set in the menus
|
||||
static const LLCachedControl<bool> beacon_always_on("BeaconAlwaysOn",false);
|
||||
if (beacon_always_on && !sShadowRender)
|
||||
@@ -2553,7 +2554,7 @@ void LLPipeline::postSort(LLCamera& camera)
|
||||
forAllVisibleDrawables(renderSoundHighlights);
|
||||
}
|
||||
}
|
||||
|
||||
llpushcallstacks ;
|
||||
// If managing your telehub, draw beacons at telehub and currently selected spawnpoint.
|
||||
if (LLFloaterTelehub::renderBeacons())
|
||||
{
|
||||
@@ -2583,6 +2584,7 @@ void LLPipeline::postSort(LLCamera& camera)
|
||||
}
|
||||
|
||||
//LLSpatialGroup::sNoDelete = FALSE;
|
||||
llpushcallstacks ;
|
||||
}
|
||||
|
||||
|
||||
@@ -2615,7 +2617,12 @@ void render_hud_elements()
|
||||
|
||||
// Render debugging beacons.
|
||||
//gObjectList.renderObjectBeacons();
|
||||
//LLHUDObject::renderAll();
|
||||
|
||||
//TO-DO:
|
||||
//V2 moved this line from LLPipeline::renderGeom
|
||||
//Uncomment once multisample z-buffer issues are figured out on ati cards.
|
||||
// LLHUDObject::renderAll();
|
||||
|
||||
//gObjectList.resetObjectBeacons();
|
||||
}
|
||||
else if (gForceRenderLandFence)
|
||||
@@ -2938,6 +2945,9 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
|
||||
{
|
||||
// Render debugging beacons.
|
||||
gObjectList.renderObjectBeacons();
|
||||
//TO-DO:
|
||||
//V2 moved this line to LLPipeline::render_hud_elements
|
||||
//Migrate once multisample z-buffer issues are figured out on ati cards.
|
||||
LLHUDObject::renderAll();
|
||||
gObjectList.resetObjectBeacons();
|
||||
}
|
||||
@@ -3167,26 +3177,32 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
|
||||
gGLLastMatrix = NULL;
|
||||
glLoadMatrixd(gGLModelView);
|
||||
|
||||
renderHighlights();
|
||||
mHighlightFaces.clear();
|
||||
|
||||
renderDebug();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
|
||||
//TO-DO:
|
||||
//V2 moved block to LLPipeline::renderDeferredLighting
|
||||
//Migrate once multisample z-buffer issues are figured out on ati cards.
|
||||
{
|
||||
// Render debugging beacons.
|
||||
gObjectList.renderObjectBeacons();
|
||||
LLHUDObject::renderAll();
|
||||
gObjectList.resetObjectBeacons();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Make sure particle effects disappear
|
||||
LLHUDObject::renderAllForTimer();
|
||||
}
|
||||
renderHighlights();
|
||||
mHighlightFaces.clear();
|
||||
|
||||
renderDebug();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
|
||||
{
|
||||
// Render debugging beacons.
|
||||
gObjectList.renderObjectBeacons();
|
||||
LLHUDObject::renderAll();
|
||||
gObjectList.resetObjectBeacons();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Make sure particle effects disappear
|
||||
LLHUDObject::renderAllForTimer();
|
||||
}
|
||||
}
|
||||
//END
|
||||
|
||||
if (occlude)
|
||||
{
|
||||
occlude = FALSE;
|
||||
@@ -3282,6 +3298,9 @@ void LLPipeline::renderDebug()
|
||||
{
|
||||
LLMemType mt(LLMemType::MTYPE_PIPELINE);
|
||||
|
||||
if(!mRenderDebugMask)
|
||||
return;
|
||||
|
||||
assertInitialized();
|
||||
|
||||
gGL.color4f(1,1,1,1);
|
||||
@@ -3446,6 +3465,55 @@ void LLPipeline::renderDebug()
|
||||
}
|
||||
}
|
||||
|
||||
if (mRenderDebugMask & LLPipeline::RENDER_DEBUG_BUILD_QUEUE)
|
||||
{
|
||||
U32 count = 0;
|
||||
U32 size = mBuildQ2.size();
|
||||
LLColor4 col;
|
||||
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
gGL.getTexUnit(0)->bind(LLViewerImage::sWhiteImagep.get());
|
||||
|
||||
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin(); iter != mGroupQ2.end(); ++iter)
|
||||
{
|
||||
LLSpatialGroup* group = *iter;
|
||||
if (group->isDead())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
LLSpatialBridge* bridge = group->mSpatialPartition->asBridge();
|
||||
|
||||
if (bridge && (!bridge->mDrawable || bridge->mDrawable->isDead()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bridge)
|
||||
{
|
||||
gGL.pushMatrix();
|
||||
glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
|
||||
}
|
||||
|
||||
F32 alpha = (F32) (size-count)/size;
|
||||
|
||||
|
||||
LLVector2 c(1.f-alpha, alpha);
|
||||
c.normVec();
|
||||
|
||||
|
||||
++count;
|
||||
col.set(c.mV[0], c.mV[1], 0, alpha*0.5f+0.1f);
|
||||
group->drawObjectBox(col);
|
||||
|
||||
if (bridge)
|
||||
{
|
||||
gGL.popMatrix();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gGL.flush();
|
||||
}
|
||||
|
||||
@@ -4257,32 +4325,28 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
|
||||
LLVector4 light_pos_gl(light_pos, 1.0f);
|
||||
|
||||
F32 light_radius = llmax(light->getLightRadius(), 0.001f);
|
||||
F32 atten, quad;
|
||||
|
||||
#if 0 //1.9.1
|
||||
if (pool->getVertexShaderLevel() > 0)
|
||||
{
|
||||
atten = light_radius;
|
||||
quad = llmax(light->getLightFalloff(), 0.0001f);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
F32 x = (3.f * (1.f + light->getLightFalloff()));
|
||||
atten = x / (light_radius); // % of brightness at radius
|
||||
quad = 0.0f;
|
||||
}
|
||||
F32 x = (3.f * (1.f + light->getLightFalloff())); // why this magic? probably trying to match a historic behavior.
|
||||
float linatten = x / (light_radius); // % of brightness at radius
|
||||
|
||||
mHWLightColors[cur_light] = light_color;
|
||||
S32 gllight = GL_LIGHT0+cur_light;
|
||||
glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
|
||||
glLightfv(gllight, GL_DIFFUSE, light_color.mV);
|
||||
glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
|
||||
glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
|
||||
glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
|
||||
glLightf (gllight, GL_LINEAR_ATTENUATION, atten);
|
||||
glLightf (gllight, GL_QUADRATIC_ATTENUATION, quad);
|
||||
glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
|
||||
glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
|
||||
glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
|
||||
glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
|
||||
//Point lights
|
||||
{
|
||||
glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
|
||||
glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
|
||||
|
||||
// we use specular.w = 1.0 as a cheap hack for the shaders to know that this is omnidirectional rather than a spotlight
|
||||
const float specular[] = {0.f, 0.f, 0.f, 1.f};
|
||||
glLightfv(gllight, GL_SPECULAR, specular);
|
||||
//llinfos << "boring light" << llendl;
|
||||
}
|
||||
cur_light++;
|
||||
if (cur_light >= 8)
|
||||
{
|
||||
@@ -4299,7 +4363,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
|
||||
glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
|
||||
}
|
||||
|
||||
if (gAgent.getAvatarObject() &&
|
||||
if (isAgentAvatarValid() &&
|
||||
gAgent.getAvatarObject()->mSpecialRenderMode == 3)
|
||||
{
|
||||
LLColor4 light_color = LLColor4::white;
|
||||
@@ -4309,13 +4373,10 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
|
||||
LLVector4 light_pos_gl(light_pos, 1.0f);
|
||||
|
||||
F32 light_radius = 16.f;
|
||||
F32 atten, quad;
|
||||
|
||||
{
|
||||
F32 x = 3.f;
|
||||
atten = x / (light_radius); // % of brightness at radius
|
||||
quad = 0.0f;
|
||||
}
|
||||
float linatten = x / (light_radius); // % of brightness at radius
|
||||
|
||||
mHWLightColors[2] = light_color;
|
||||
S32 gllight = GL_LIGHT2;
|
||||
glLightfv(gllight, GL_POSITION, light_pos_gl.mV);
|
||||
@@ -4323,8 +4384,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
|
||||
glLightfv(gllight, GL_AMBIENT, LLColor4::black.mV);
|
||||
glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
|
||||
glLightf (gllight, GL_CONSTANT_ATTENUATION, 0.0f);
|
||||
glLightf (gllight, GL_LINEAR_ATTENUATION, atten);
|
||||
glLightf (gllight, GL_QUADRATIC_ATTENUATION, quad);
|
||||
glLightf (gllight, GL_LINEAR_ATTENUATION, linatten);
|
||||
glLightf (gllight, GL_QUADRATIC_ATTENUATION, 0.0f);
|
||||
glLightf (gllight, GL_SPOT_EXPONENT, 0.0f);
|
||||
glLightf (gllight, GL_SPOT_CUTOFF, 180.0f);
|
||||
}
|
||||
@@ -4341,6 +4402,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
|
||||
void LLPipeline::enableLights(U32 mask)
|
||||
{
|
||||
assertInitialized();
|
||||
|
||||
if (mLightingDetail == 0)
|
||||
{
|
||||
mask &= 0xf003; // sun and backlight only (and fullbright bit)
|
||||
@@ -5528,6 +5590,14 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
|
||||
gGL.getTexUnit(0)->activate();
|
||||
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
|
||||
|
||||
//TO-DO:
|
||||
//V2 requires this for hover text and such since they have been pulled out of geom render.
|
||||
//Do this when multisample z-buffer issues are figured out
|
||||
/*if (LLRenderTarget::sUseFBO)
|
||||
{ //copy depth buffer from mScreen to framebuffer
|
||||
LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(),
|
||||
0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
@@ -5836,6 +5906,9 @@ void LLPipeline::renderDeferredLighting()
|
||||
|
||||
{
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
//TO-DO:
|
||||
//V2 changed to LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
|
||||
//Do this when multisample z-buffer issues are figured out
|
||||
LLGLDepthTest depth(GL_FALSE);
|
||||
stop_glerror();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
@@ -5852,6 +5925,9 @@ void LLPipeline::renderDeferredLighting()
|
||||
|
||||
{
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
//TO-DO:
|
||||
//V2 changed to LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
|
||||
//Do this when multisample z-buffer issues are figured out
|
||||
LLGLDepthTest depth(GL_FALSE);
|
||||
stop_glerror();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
@@ -6088,6 +6164,26 @@ void LLPipeline::renderDeferredLighting()
|
||||
popRenderTypeMask();
|
||||
}
|
||||
|
||||
//TO-DO:
|
||||
//V2 moved block from LLPipeline::renderGeomPostDeferred
|
||||
//Migrate once multisample z-buffer issues are figured out on ati cards.
|
||||
/*{
|
||||
//render highlights, etc.
|
||||
renderHighlights();
|
||||
mHighlightFaces.clear();
|
||||
|
||||
renderDebug();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
|
||||
{
|
||||
// Render debugging beacons.
|
||||
gObjectList.renderObjectBeacons();
|
||||
gObjectList.resetObjectBeacons();
|
||||
}
|
||||
}*/
|
||||
|
||||
mScreen.flush();
|
||||
|
||||
}
|
||||
@@ -6251,48 +6347,47 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
|
||||
gPipeline.popRenderTypeMask();
|
||||
}
|
||||
|
||||
gPipeline.pushRenderTypeMask();
|
||||
|
||||
clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER,
|
||||
LLPipeline::RENDER_TYPE_VOIDWATER,
|
||||
LLPipeline::RENDER_TYPE_GROUND,
|
||||
LLPipeline::RENDER_TYPE_SKY,
|
||||
LLPipeline::RENDER_TYPE_CLASSIC_CLOUDS,
|
||||
LLPipeline::RENDER_TYPE_WL_CLOUDS,
|
||||
LLPipeline::END_RENDER_TYPES);
|
||||
|
||||
if (gSavedSettings.getBOOL("RenderWaterReflections"))
|
||||
{ //mask out selected geometry based on reflection detail
|
||||
S32 detail = gSavedSettings.getS32("RenderReflectionDetail");
|
||||
if (detail > 0)
|
||||
//if (detail > 0)
|
||||
{ //mask out selected geometry based on reflection detail
|
||||
{
|
||||
if (detail < 4)
|
||||
{
|
||||
clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES);
|
||||
gPipeline.pushRenderTypeMask();
|
||||
if (detail < 3)
|
||||
{
|
||||
clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
|
||||
clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES);
|
||||
if (detail < 2)
|
||||
{
|
||||
clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES);
|
||||
if (detail < 1)
|
||||
{
|
||||
clearRenderTypeMask(LLPipeline::RENDER_TYPE_VOLUME, END_RENDER_TYPES);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER,
|
||||
LLPipeline::RENDER_TYPE_VOIDWATER,
|
||||
LLPipeline::RENDER_TYPE_GROUND,
|
||||
LLPipeline::RENDER_TYPE_SKY,
|
||||
LLPipeline::RENDER_TYPE_CLASSIC_CLOUDS,
|
||||
LLPipeline::RENDER_TYPE_WL_CLOUDS,
|
||||
LLPipeline::END_RENDER_TYPES);
|
||||
static LLCachedControl<bool> skip_distortion_updates("SkipReflectOcclusionUpdates",false);
|
||||
LLPipeline::sSkipUpdate = skip_distortion_updates;
|
||||
LLGLUserClipPlane clip_plane(plane, mat, projection);
|
||||
LLGLDisable cull(GL_CULL_FACE);
|
||||
updateCull(camera, ref_result, 1);
|
||||
stateSort(camera, ref_result);
|
||||
gPipeline.grabReferences(ref_result);
|
||||
renderGeom(camera);
|
||||
LLPipeline::sSkipUpdate = FALSE;
|
||||
gPipeline.popRenderTypeMask();
|
||||
}
|
||||
gPipeline.grabReferences(ref_result);
|
||||
LLGLUserClipPlane clip_plane(plane, mat, projection);
|
||||
renderGeom(camera);
|
||||
LLPipeline::sSkipUpdate = FALSE;
|
||||
}
|
||||
}
|
||||
gPipeline.popRenderTypeMask();
|
||||
}
|
||||
glCullFace(GL_BACK);
|
||||
glPopMatrix();
|
||||
|
||||
Reference in New Issue
Block a user