diff options
author | Graham Linden <graham@lindenlab.com> | 2019-01-08 17:20:56 -0800 |
---|---|---|
committer | Graham Linden <graham@lindenlab.com> | 2019-01-08 17:20:56 -0800 |
commit | b865fc88e575e39111418a329362eada368445cd (patch) | |
tree | 9e08290dbc80a7c603e4baec36b8f7a72fdf5ee3 /indra/newview/pipeline.cpp | |
parent | 0931bbbf96b540a8547569b0941c1be810b7c3d4 (diff) |
Fix broken distortion map rendering (was culling everything).
Clean up deferred\alpha shader to allow re-entrant graphics switching (link error on 2nd compile/link of deferred shaders).
Clean up some uses of pragma(optimize,...).
Diffstat (limited to 'indra/newview/pipeline.cpp')
-rw-r--r-- | indra/newview/pipeline.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index e60828a81c..887421d3f8 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -336,6 +336,7 @@ bool LLPipeline::sShadowRender = false; bool LLPipeline::sWaterReflections = false; bool LLPipeline::sRenderGlow = false; bool LLPipeline::sReflectionRender = false; +bool LLPipeline::sDistortionRender = false; bool LLPipeline::sImpostorRender = false; bool LLPipeline::sImpostorRenderAlphaDepthPass = false; bool LLPipeline::sUnderWaterRender = false; @@ -2425,7 +2426,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl if (to_texture) { - if (LLPipeline::sRenderDeferred && LLPipeline::sReflectionRender) + if (LLPipeline::sRenderDeferred && LLPipeline::sReflectionRender) { mWaterOcclusionDepth.bindTarget(); } @@ -8330,7 +8331,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ (F32) gGLViewport[3]); } - if (sReflectionRender && shader.getUniformLocation(LLShaderMgr::MODELVIEW_MATRIX)) + if (sReflectionRender && !LLPipeline::sDistortionRender && !shader.getUniformLocation(LLShaderMgr::MODELVIEW_MATRIX)) { shader.uniformMatrix4fv(LLShaderMgr::MODELVIEW_MATRIX, 1, FALSE, mReflectionModelView.m); } @@ -9613,6 +9614,8 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) static bool last_update = true; if (last_update) { + gPipeline.pushRenderTypeMask(); + camera.setFar(camera_in.getFar()); clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER, LLPipeline::RENDER_TYPE_VOIDWATER, @@ -9620,7 +9623,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) END_RENDER_TYPES); stop_glerror(); - LLPipeline::sUnderWaterRender = ! LLViewerCamera::getInstance()->cameraUnderWater(); + LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater(); if (LLPipeline::sUnderWaterRender) { @@ -9632,6 +9635,8 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) } LLViewerCamera::updateFrustumPlanes(camera); + LLPipeline::sDistortionRender = true; + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); LLColor3 col = LLEnvironment::instance().getCurrentWater()->getWaterFogColor(); @@ -9645,28 +9650,30 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) { //clip out geometry on the same side of water as the camera mat = get_current_modelview(); - LLPlane plane(-pnorm, -distance_to_water); - LLGLUserClipPlane clip_plane(plane, mat, projection); + LLPlane plane(pnorm, water_height); + LLGLUserClipPlane clip_plane(plane, mat, projection); + static LLCullResult result; updateCull(camera, result, water_clip, &plane); stateSort(camera, result); gGL.setColorMask(true, true); mWaterDis.clear(); - - gGL.setColorMask(true, false); - if (LLPipeline::sRenderDeferred) { mWaterDis.flush(); - gPipeline.mWaterDeferredScreen.bindTarget(); - gGL.setColorMask(true, true); + gGL.setColorMask(true, true); glClearColor(0,0,0,0); + gPipeline.mWaterDeferredDepth.bindTarget(); + gPipeline.mWaterDeferredDepth.clear(); + gPipeline.mWaterDeferredScreen.bindTarget(); gPipeline.mWaterDeferredScreen.clear(); gPipeline.grabReferences(result); + gGL.setColorMask(true, false); + renderGeomDeferred(camera); } else @@ -9696,6 +9703,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) } mWaterDis.flush(); + + LLPipeline::sDistortionRender = false; + + gPipeline.popRenderTypeMask(); } last_update = LLDrawPoolWater::sNeedsReflectionUpdate && LLDrawPoolWater::sNeedsDistortionUpdate; |