summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraham Linden <graham@lindenlab.com>2018-10-09 01:17:26 +0100
committerGraham Linden <graham@lindenlab.com>2018-10-09 01:17:26 +0100
commit8c4258009b09f16751437d0549067ab2950e725a (patch)
treeed02d7d89ff8c7c17deab4fccf57114ee864602b
parentffc6393309d06446f9d1361f0f0282b2110768ae (diff)
SL-9709
Make VOWater objects avoid culling.
-rw-r--r--indra/newview/llworld.cpp51
-rw-r--r--indra/newview/llworld.h3
-rw-r--r--indra/newview/pipeline.cpp57
3 files changed, 87 insertions, 24 deletions
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index cee47a591e..a519b5a957 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -873,6 +873,57 @@ void LLWorld::waterHeightRegionInfo(std::string const& sim_name, F32 water_heigh
}
}
+void LLWorld::precullWaterObjects(LLCamera& camera, LLCullResult* cull, bool include_void_water)
+{
+ if (!gAgent.getRegion())
+ {
+ return;
+ }
+
+ if (mRegionList.empty())
+ {
+ LL_WARNS() << "No regions!" << LL_ENDL;
+ return;
+ }
+
+ for (region_list_t::iterator iter = mRegionList.begin();
+ iter != mRegionList.end(); ++iter)
+ {
+ LLViewerRegion* regionp = *iter;
+ LLVOWater* waterp = regionp->getLand().getWaterObj();
+ if (waterp && waterp->mDrawable)
+ {
+ waterp->mDrawable->setVisible(camera);
+ cull->pushDrawable(waterp->mDrawable);
+ }
+ }
+
+ if (include_void_water)
+ {
+ for (std::list<LLVOWater*>::iterator iter = mHoleWaterObjects.begin();
+ iter != mHoleWaterObjects.end(); ++ iter)
+ {
+ LLVOWater* waterp = *iter;
+ if (waterp && waterp->mDrawable)
+ {
+ waterp->mDrawable->setVisible(camera);
+ cull->pushDrawable(waterp->mDrawable);
+ }
+ }
+ }
+
+ S32 dir;
+ for (dir = 0; dir < 8; dir++)
+ {
+ LLVOWater* waterp = mEdgeWaterObjects[dir];
+ if (waterp && waterp->mDrawable)
+ {
+ waterp->mDrawable->setVisible(camera);
+ cull->pushDrawable(waterp->mDrawable);
+ }
+ }
+}
+
void LLWorld::updateWaterObjects()
{
if (!gAgent.getRegion())
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index c9ac241d5a..9722448746 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -138,6 +138,9 @@ public:
LLViewerTexture *getDefaultWaterTexture();
void updateWaterObjects();
+
+ void precullWaterObjects(LLCamera& camera, LLCullResult* cull, bool include_void_water);
+
void waterHeightRegionInfo(std::string const& sim_name, F32 water_height);
void shiftRegions(const LLVector3& offset);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index a513588568..c1b7fdc780 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -88,6 +88,7 @@
#include "llvocache.h"
#include "llvoground.h"
#include "llvosky.h"
+#include "llvowlsky.h"
#include "llvotree.h"
#include "llvovolume.h"
#include "llvosurfacepatch.h"
@@ -2415,21 +2416,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
{
LLVector3 pnorm;
F32 height = region->getWaterHeight();
- if (water_clip < 0)
- { //camera is above water, clip plane points up
- pnorm.setVec(0,0,1);
- plane.setVec(pnorm, -height);
- }
- else if (water_clip > 0)
- { //camera is below water, clip plane points down
- pnorm = LLVector3(0,0,-1);
- plane.setVec(pnorm, height);
- }
+ pnorm.setVec(0,0,-(F32)water_clip);
+ plane.setVec(pnorm, height * pnorm.mV[VZ]);
}
}
glh::matrix4f modelview = get_last_modelview();
- glh::matrix4f proj = get_last_projection();
+ glh::matrix4f proj = get_last_projection();
+
LLGLUserClipPlane clip(plane, modelview, proj, water_clip != 0 && LLPipeline::sReflectionRender);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
@@ -2455,9 +2449,9 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
LLViewerRegion* region = *iter;
- if (water_clip != 0)
+ if (water_clip != 0 && LLPipeline::sReflectionRender)
{
- LLPlane plane(LLVector3(0,0, (F32) -water_clip), (F32) water_clip*region->getWaterHeight());
+ LLPlane plane(LLVector3(0,0, -(F32)water_clip), water_clip * region->getWaterHeight());
camera.setUserClipPlane(plane);
}
else
@@ -2513,7 +2507,20 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
sCull->pushDrawable(gSky.mVOGroundp->mDrawable);
}
+ if (hasRenderType(LLPipeline::RENDER_TYPE_WL_SKY) &&
+ gPipeline.canUseWindLightShaders() &&
+ gSky.mVOWLSkyp.notNull() &&
+ gSky.mVOWLSkyp->mDrawable.notNull())
+ {
+ gSky.mVOWLSkyp->mDrawable->setVisible(camera);
+ sCull->pushDrawable(gSky.mVOWLSkyp->mDrawable);
+ }
+ if (hasRenderType(LLPipeline::RENDER_TYPE_WATER))
+ {
+ LLWorld::getInstance()->precullWaterObjects(camera, sCull, hasRenderType(LLPipeline::RENDER_TYPE_VOIDWATER));
+ }
+
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.popMatrix();
gGL.matrixMode(LLRender::MM_MODELVIEW);
@@ -9823,21 +9830,23 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
F32 plane_d;
S32 water_clip = 0;
- if (!LLViewerCamera::getInstance()->cameraUnderWater())
- { //camera is above water, clip plane points up
- pnorm.setVec(0,0,1);
- plane_d = -water_height;
- plane.setVec(pnorm, -distance_to_water);
- water_clip = -1;
+
+ if (LLViewerCamera::getInstance()->cameraUnderWater())
+ {
+ //camera is below water, clip plane points down
+ water_clip = 1;
}
else
- { //camera is below water, clip plane points down
- pnorm = LLVector3(0,0,-1);
- plane_d = water_height;
- plane.setVec(pnorm, distance_to_water);
- water_clip = 1;
+ {
+ //camera is above water, clip plane points up
+ water_clip = -1;
}
+ //camera is below water, clip plane points down
+ pnorm = LLVector3(0,0,-(F32)water_clip);
+ plane_d = water_height * pnorm.mV[VZ];
+ plane.setVec(pnorm, distance_to_water * pnorm.mV[VZ]);
+
bool materials_in_water = false;
#if MATERIALS_IN_REFLECTIONS