diff options
| -rw-r--r-- | indra/llrender/llgl.cpp | 6 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 1 | ||||
| -rwxr-xr-x | indra/newview/llfloatermodelpreview.cpp | 60 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.h | 1 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 203 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.h | 5 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 85 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_model_preview.xml | 10 | 
8 files changed, 229 insertions, 142 deletions
| diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 04fe99ec1f..9022026248 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -325,6 +325,7 @@ LLGLManager::LLGLManager() :  	mHasVertexShader(FALSE),  	mHasFragmentShader(FALSE),  	mHasOcclusionQuery(FALSE), +	mHasOcclusionQuery2(FALSE),  	mHasPointParameters(FALSE),  	mHasDrawBuffers(FALSE),  	mHasTextureRectangle(FALSE), @@ -666,6 +667,7 @@ void LLGLManager::initExtensions()  	mHasARBEnvCombine = ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts);  	mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression");  	mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts); +	mHasOcclusionQuery2 = ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts);  	mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);  	mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);  	// mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad @@ -782,6 +784,10 @@ void LLGLManager::initExtensions()  	{  		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query" << LL_ENDL;  	} +	if (!mHasOcclusionQuery2) +	{ +		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query2" << LL_ENDL; +	}  	if (!mHasPointParameters)  	{  		LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_point_parameters" << LL_ENDL; diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 4630811679..ff4e6078c9 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -89,6 +89,7 @@ public:  	BOOL mHasVertexShader;  	BOOL mHasFragmentShader;  	BOOL mHasOcclusionQuery; +	BOOL mHasOcclusionQuery2;  	BOOL mHasPointParameters;  	BOOL mHasDrawBuffers;  	BOOL mHasDepthClamp; diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 05a4b245d1..0f2924d8aa 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -283,6 +283,7 @@ BOOL LLFloaterModelPreview::postBuild()  	childSetAction("lod_browse", onBrowseLOD, this);
 +	childSetCommitCallback("cancel_btn", onCancel, this);
  	childSetCommitCallback("crease_angle", onGenerateNormalsCommit, this);
  	childSetCommitCallback("generate_normals", onGenerateNormalsCommit, this);
 @@ -559,7 +560,14 @@ void LLFloaterModelPreview::draw()  		LLMutexLock lock(mStatusLock);
  		childSetTextArg("status", "[STATUS]", mStatusMessage);
  	}
 -
 +	else
 +	{
 +		childSetVisible("Simplify", true);
 +		childSetVisible("simplify_cancel", false);
 +		childSetVisible("Decompose", true);
 +		childSetVisible("decompose_cancel", false);
 +	}
 +	
  	U32 resource_cost = mModelPreview->mResourceCost*10;
  	if (childGetValue("upload_textures").asBoolean())
 @@ -735,7 +743,8 @@ void LLFloaterModelPreview::onPhysicsParamCommit(LLUICtrl* ctrl, void* data)  //static
  void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)
  {
 -	LLCDStageData* stage = (LLCDStageData*) data;
 +	LLCDStageData* stage_data = (LLCDStageData*) data;
 +	std::string stage = stage_data->mName;
  	if (sInstance)
  	{
 @@ -750,11 +759,22 @@ void LLFloaterModelPreview::onPhysicsStageExecute(LLUICtrl* ctrl, void* data)  			for (S32 i = 0; i < sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS].size(); ++i)
  			{
  				LLModel* mdl = sInstance->mModelPreview->mModel[LLModel::LOD_PHYSICS][i];
 -				DecompRequest* request = new DecompRequest(stage->mName, mdl);
 +				DecompRequest* request = new DecompRequest(stage, mdl);
  				sInstance->mCurRequest.insert(request);
  				gMeshRepo.mDecompThread->submitRequest(request);
  			}
  		}
 +
 +		if (stage == "Decompose")
 +		{
 +			sInstance->childSetVisible("Decompose", false);
 +			sInstance->childSetVisible("decompose_cancel", true);
 +		}
 +		else if (stage == "Simplify")
 +		{
 +			sInstance->childSetVisible("Simplify", false);
 +			sInstance->childSetVisible("simplify_cancel", true);
 +		}
  	}
  }
 @@ -777,6 +797,15 @@ void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)  	sInstance->mModelPreview->setPhysicsFromLOD(which_mode);
  }
 +//static 
 +void LLFloaterModelPreview::onCancel(LLUICtrl* ctrl, void* data)
 +{
 +	if (sInstance)
 +	{
 +		sInstance->closeFloater(false);
 +	}
 +}
 +
  //static
  void LLFloaterModelPreview::onPhysicsStageCancel(LLUICtrl* ctrl, void*data)
  {
 @@ -795,7 +824,9 @@ void LLFloaterModelPreview::initDecompControls()  {
  	LLSD key;
 -	childSetCommitCallback("cancel_btn", onPhysicsStageCancel, NULL);
 +	childSetCommitCallback("simplify_cancel", onPhysicsStageCancel, NULL);
 +	childSetCommitCallback("decompose_cancel", onPhysicsStageCancel, NULL);
 +
  	childSetCommitCallback("physics_lod_combo", onPhysicsUseLOD, NULL);
  	childSetCommitCallback("physics_browse", onPhysicsBrowse, NULL);
 @@ -2059,7 +2090,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)  	mBuildShareTolerance = 0.f;
  	mBuildQueueMode = GLOD_QUEUE_GREEDY;
  	mBuildBorderMode = GLOD_BORDER_UNLOCK;
 -	mBuildOperator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE;
 +	mBuildOperator = GLOD_OPERATOR_EDGE_COLLAPSE;
  	mViewOption["show_textures"] = false;
 @@ -2767,7 +2798,9 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation)  		lod_mode = GLOD_TRIANGLE_BUDGET;
  		if (which_lod != -1)
  		{
 -			limit = mFMP->childGetValue("lod_triangle_limit").asInteger();
 +			//SH-632 take budget as supplied limit+1 to prevent GLOD from creating a smaller
 +			//decimation when the given decimation is possible
 +			limit = mFMP->childGetValue("lod_triangle_limit").asInteger(); //+1;
  		}
  	}
  	else
 @@ -2785,11 +2818,11 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation)  	if (build_operator == 0)
  	{
 -		build_operator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE;
 +		build_operator = GLOD_OPERATOR_EDGE_COLLAPSE;
  	}
  	else
  	{
 -		build_operator = GLOD_OPERATOR_EDGE_COLLAPSE;
 +		build_operator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE;
  	}
  	U32 queue_mode=0;
 @@ -4276,11 +4309,14 @@ void LLFloaterModelPreview::DecompRequest::completed()  	if (sInstance)
  	{
 -		if (sInstance->mModelPreview)
 +		if (mContinue)
  		{
 -			sInstance->mModelPreview->mPhysicsMesh[mModel] = mHullMesh;
 -			sInstance->mModelPreview->mDirty = true;
 -			LLFloaterModelPreview::sInstance->mModelPreview->refresh();
 +			if (sInstance->mModelPreview)
 +			{
 +				sInstance->mModelPreview->mPhysicsMesh[mModel] = mHullMesh;
 +				sInstance->mModelPreview->mDirty = true;
 +				LLFloaterModelPreview::sInstance->mModelPreview->refresh();
 +			}
  		}
  		sInstance->mCurRequest.erase(this);
 diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 52ebec84d0..9dceb9c145 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -187,6 +187,7 @@ protected:  	static void onPhysicsParamCommit(LLUICtrl* ctrl, void* userdata);  	static void onPhysicsStageExecute(LLUICtrl* ctrl, void* userdata); +	static void onCancel(LLUICtrl* ctrl, void* userdata);  	static void onPhysicsStageCancel(LLUICtrl* ctrl, void* userdata);  	static void onPhysicsBrowse(LLUICtrl* ctrl, void* userdata); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index cc54f21a7e..cb72f35eee 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -222,7 +222,17 @@ static U8 sOcclusionIndices[] =  		b000, b110, b100, b101, b001, b011, b010, b110,  }; -U8* get_box_fan_indices(LLCamera* camera, const LLVector4a& center) +U32 get_box_fan_indices(LLCamera* camera, const LLVector4a& center) +{ +	LLVector4a origin; +	origin.load3(camera->getOrigin().mV); + +	S32 cypher = center.greaterThan(origin).getGatheredBits() & 0x7; +	 +	return cypher*8; +} + +U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center)  {  	LLVector4a origin;  	origin.load3(camera->getOrigin().mV); @@ -231,12 +241,21 @@ U8* get_box_fan_indices(LLCamera* camera, const LLVector4a& center)  	return sOcclusionIndices+cypher*8;  } -						 + +  void LLSpatialGroup::buildOcclusion()  { -	if (!mOcclusionVerts) +	if (mOcclusionVerts.isNull())  	{ -		mOcclusionVerts = new LLVector4a[8]; +		mOcclusionVerts = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX, GL_DYNAMIC_DRAW_ARB); +		mOcclusionVerts->allocateBuffer(8, 64, true); +	 +		LLStrider<U16> idx; +		mOcclusionVerts->getIndexStrider(idx); +		for (U32 i = 0; i < 64; i++) +		{ +			*idx++ = sOcclusionIndices[i]; +		}  	}  	LLVector4a fudge; @@ -251,7 +270,12 @@ void LLSpatialGroup::buildOcclusion()  	r.setMin(r, r2); -	LLVector4a* v = mOcclusionVerts; +	LLStrider<LLVector3> pos; +	 +	mOcclusionVerts->getVertexStrider(pos); + +	LLVector4a* v = (LLVector4a*) pos.get(); +  	const LLVector4a& c = mBounds[0];  	const LLVector4a& s = r; @@ -275,10 +299,13 @@ void LLSpatialGroup::buildOcclusion()  	for (S32 i = 0; i < 8; ++i)  	{ -		v[i] = s; -		v[i].mul(octant[i]); -		v[i].add(c); +		LLVector4a p; +		p.setMul(s, octant[i]); +		p.add(c); +		v[i] = p;  	} +	 +	mOcclusionVerts->setBuffer(0);  	clearState(LLSpatialGroup::OCCLUSION_DIRTY);  } @@ -339,7 +366,6 @@ LLSpatialGroup::~LLSpatialGroup()  		sQueryPool.release(mOcclusionQuery[LLViewerCamera::sCurCameraID]);  	} -	delete [] mOcclusionVerts;  	mOcclusionVerts = NULL;  	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION); @@ -881,12 +907,9 @@ void LLSpatialGroup::shift(const LLVector4a &offset)  		gPipeline.markRebuild(this, TRUE);  	} -	if (mOcclusionVerts) +	if (mOcclusionVerts.notNull())  	{ -		for (U32 i = 0; i < 8; i++) -		{ -			mOcclusionVerts[i].add(offset); -		} +		setState(OCCLUSION_DIRTY);  	}  } @@ -1423,7 +1446,6 @@ void LLSpatialGroup::destroyGL()  		}  	} -	delete [] mOcclusionVerts;  	mOcclusionVerts = NULL;  	for (LLSpatialGroup::element_iter i = getData().begin(); i != getData().end(); ++i) @@ -1516,31 +1538,37 @@ void LLSpatialGroup::checkOcclusion()  		}  		else if (isOcclusionState(QUERY_PENDING))  		{	//otherwise, if a query is pending, read it back -			GLuint res = 1; -			if (!isOcclusionState(DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID]) -			{ -				glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_ARB, &res);	 -			} -			if (isOcclusionState(DISCARD_QUERY)) -			{ -				res = 2; -			} +			GLuint available = 0; +			glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available); +			if (available) +			{ //result is available, read it back, otherwise wait until next frame +				GLuint res = 1; +				if (!isOcclusionState(DISCARD_QUERY) && mOcclusionQuery[LLViewerCamera::sCurCameraID]) +				{ +					glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_ARB, &res);	 +				} -			if (res > 0) -			{ -				assert_states_valid(this); -				clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF); -				assert_states_valid(this); -			} -			else -			{ -				assert_states_valid(this); -				setOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF); -				assert_states_valid(this); -			} +				if (isOcclusionState(DISCARD_QUERY)) +				{ +					res = 2; +				} -			clearOcclusionState(QUERY_PENDING | DISCARD_QUERY); +				if (res > 0) +				{ +					assert_states_valid(this); +					clearOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF); +					assert_states_valid(this); +				} +				else +				{ +					assert_states_valid(this); +					setOcclusionState(LLSpatialGroup::OCCLUDED, LLSpatialGroup::STATE_MODE_DIFF); +					assert_states_valid(this); +				} + +				clearOcclusionState(QUERY_PENDING | DISCARD_QUERY); +			}  		}  		else if (mSpatialPartition->isOcclusionEnabled() && isOcclusionState(LLSpatialGroup::OCCLUDED))  		{	//check occlusion has been issued for occluded node that has not had a query issued @@ -1566,54 +1594,59 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)  		}  		else  		{ +			if (!isOcclusionState(QUERY_PENDING) || isOcclusionState(DISCARD_QUERY))  			{ -				LLFastTimer t(FTM_RENDER_OCCLUSION); +				{ //no query pending, or previous query to be discarded +					LLFastTimer t(FTM_RENDER_OCCLUSION); -				if (!mOcclusionQuery[LLViewerCamera::sCurCameraID]) -				{ -					mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate(); -				} +					if (!mOcclusionQuery[LLViewerCamera::sCurCameraID]) +					{ +						mOcclusionQuery[LLViewerCamera::sCurCameraID] = sQueryPool.allocate(); +					} -				if (!mOcclusionVerts || isState(LLSpatialGroup::OCCLUSION_DIRTY)) -				{ -					buildOcclusion(); -				} -				 -				// Depth clamp all water to avoid it being culled as a result of being -				// behind the far clip plane, and in the case of edge water to avoid -				// it being culled while still visible. -				bool const use_depth_clamp = gGLManager.mHasDepthClamp && -											(mSpatialPartition->mDrawableType == LLDrawPool::POOL_WATER || -											mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER); -				if (use_depth_clamp) -				{ -					glEnable(GL_DEPTH_CLAMP); -				} -				 -				glBeginQueryARB(GL_SAMPLES_PASSED_ARB, mOcclusionQuery[LLViewerCamera::sCurCameraID]);					 -				glVertexPointer(3, GL_FLOAT, 16, mOcclusionVerts); -				if (camera->getOrigin().isExactlyZero()) -				{ //origin is invalid, draw entire box -					glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, -												GL_UNSIGNED_BYTE, sOcclusionIndices); -					glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, -							GL_UNSIGNED_BYTE, sOcclusionIndices+b111*8); -				} -				else -				{ -					glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, -								GL_UNSIGNED_BYTE, get_box_fan_indices(camera, mBounds[0])); -				} -				glEndQueryARB(GL_SAMPLES_PASSED_ARB); -				 -				if (use_depth_clamp) -				{ -					glDisable(GL_DEPTH_CLAMP); +					if (mOcclusionVerts.isNull() || isState(LLSpatialGroup::OCCLUSION_DIRTY)) +					{ +						buildOcclusion(); +					} +					 +					// Depth clamp all water to avoid it being culled as a result of being +					// behind the far clip plane, and in the case of edge water to avoid +					// it being culled while still visible. +					bool const use_depth_clamp = gGLManager.mHasDepthClamp && +												(mSpatialPartition->mDrawableType == LLDrawPool::POOL_WATER || +												mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER); +					if (use_depth_clamp) +					{ +						glEnable(GL_DEPTH_CLAMP); +					} +					 +					U32 mode = gGLManager.mHasOcclusionQuery2 ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED_ARB; + +					glBeginQueryARB(mode, mOcclusionQuery[LLViewerCamera::sCurCameraID]);					 +					 +					mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX); + +					if (camera->getOrigin().isExactlyZero()) +					{ //origin is invalid, draw entire box +						mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, 0); +						mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, b111*8);				 +					} +					else +					{ +						mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0])); +					} + +					glEndQueryARB(mode); +					 +					if (use_depth_clamp) +					{ +						glDisable(GL_DEPTH_CLAMP); +					}  				} -			} -			setOcclusionState(LLSpatialGroup::QUERY_PENDING); -			clearOcclusionState(LLSpatialGroup::DISCARD_QUERY); +				setOcclusionState(LLSpatialGroup::QUERY_PENDING); +				clearOcclusionState(LLSpatialGroup::DISCARD_QUERY); +			}  		}  	}  } @@ -2607,17 +2640,17 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)  			gGL.color4f(0.f, 0.75f, 0.f, 0.5f);  			pushBufferVerts(group, LLVertexBuffer::MAP_VERTEX);  		} -		else if (camera && group->mOcclusionVerts) +		else if (camera && group->mOcclusionVerts.notNull())  		{  			LLVertexBuffer::unbind(); -			glVertexPointer(3, GL_FLOAT, 16, group->mOcclusionVerts); - +			group->mOcclusionVerts->setBuffer(LLVertexBuffer::MAP_VERTEX); +			  			glColor4f(1.0f, 0.f, 0.f, 0.5f); -			glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0])); +			group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));  			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);  			glColor4f(1.0f, 1.f, 1.f, 1.0f); -			glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, GL_UNSIGNED_BYTE, get_box_fan_indices(camera, group->mBounds[0])); +			group->mOcclusionVerts->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, group->mBounds[0]));  			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);  		}  	} diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 16ec9f780b..85fd66b297 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -59,7 +59,8 @@ S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVe  void pushVerts(LLFace* face, U32 mask);  // get index buffer for binary encoded axis vertex buffer given a box at center being viewed by given camera -U8* get_box_fan_indices(LLCamera* camera, const LLVector4a& center); +U32 get_box_fan_indices(LLCamera* camera, const LLVector4a& center); +U8* get_box_fan_indices_ptr(LLCamera* camera, const LLVector4a& center);  class LLDrawInfo : public LLRefCount   { @@ -393,7 +394,7 @@ public:  	LLSpatialPartition* mSpatialPartition;  	LLPointer<LLVertexBuffer> mVertexBuffer; -	LLVector4a*				mOcclusionVerts; +	LLPointer<LLVertexBuffer> mOcclusionVerts;  	GLuint					mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];  	U32 mBufferUsage; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 5e1f56ac97..24327bf535 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -4136,11 +4136,12 @@ void LLPipeline::renderDebug()  					gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV);  					gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV);  					gGL.end(); -					} - +				}  			} -			/*for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();  +			/*gGL.flush(); +			glLineWidth(16-i*2); +			for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();   					iter != LLWorld::getInstance()->getRegionList().end(); ++iter)  			{  				LLViewerRegion* region = *iter; @@ -4155,7 +4156,9 @@ void LLPipeline::renderDebug()  						}  					}  				} -			}*/ +			} +			gGL.flush(); +			glLineWidth(1.f);*/  		}  	} @@ -7084,6 +7087,8 @@ void LLPipeline::renderDeferredLighting()  			std::list<LLVector4> light_colors; +			LLVertexBuffer::unbind(); +  			F32 v[24];  			glVertexPointer(3, GL_FLOAT, 0, v); @@ -7173,7 +7178,7 @@ void LLPipeline::renderDeferredLighting()  							glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);  							glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);  							glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, -								GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center)); +								GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));  							stop_glerror();  						}  					} @@ -7239,7 +7244,7 @@ void LLPipeline::renderDeferredLighting()  					glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);  					glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);  					glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8, -							GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center)); +							GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));  				}  				gDeferredSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);  				unbindDeferredShader(gDeferredSpotLightProgram); @@ -7650,11 +7655,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		LLCamera camera = camera_in;  		camera.setFar(camera.getFar()*0.87654321f);  		LLPipeline::sReflectionRender = TRUE; -		S32 occlusion = LLPipeline::sUseOcclusion; - -		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; - -		LLPipeline::sUseOcclusion = llmin(occlusion, 1);  		gPipeline.pushRenderTypeMask(); @@ -7693,19 +7693,20 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  			glClearColor(0,0,0,0);  			mWaterRef.bindTarget(); +			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER0;  			gGL.setColorMask(true, true);  			mWaterRef.clear();  			gGL.setColorMask(true, false);  			mWaterRef.getViewport(gGLViewport); -			 +  			stop_glerror();  			glPushMatrix();  			mat.set_scale(glh::vec3f(1,1,-1));  			mat.set_translate(glh::vec3f(0,0,height*2.f)); -			 +  			glh::matrix4f current = glh_get_current_modelview();  			mat = current * mat; @@ -7725,22 +7726,24 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			glCullFace(GL_FRONT);  			static LLCullResult ref_result; -		 +  			if (LLDrawPoolWater::sNeedsDistortionUpdate)  			{  				//initial sky pass (no user clip plane)  				{ //mask out everything but the sky  					gPipeline.pushRenderTypeMask();  					gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, -												LLPipeline::RENDER_TYPE_WL_SKY, -												LLPipeline::END_RENDER_TYPES); +						LLPipeline::RENDER_TYPE_WL_SKY, +						LLPipeline::END_RENDER_TYPES); +  					static LLCullResult result;  					updateCull(camera, result);  					stateSort(camera, result); +  					andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, -										LLPipeline::RENDER_TYPE_CLOUDS, -										LLPipeline::RENDER_TYPE_WL_SKY, -										LLPipeline::END_RENDER_TYPES); +						LLPipeline::RENDER_TYPE_CLOUDS, +						LLPipeline::RENDER_TYPE_WL_SKY, +						LLPipeline::END_RENDER_TYPES);  					renderGeom(camera, TRUE);  					gPipeline.popRenderTypeMask(); @@ -7749,23 +7752,23 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  				gPipeline.pushRenderTypeMask();  				clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER, -									LLPipeline::RENDER_TYPE_VOIDWATER, -									LLPipeline::RENDER_TYPE_GROUND, -									LLPipeline::RENDER_TYPE_SKY, -									LLPipeline::RENDER_TYPE_CLOUDS, -									LLPipeline::END_RENDER_TYPES);	 +					LLPipeline::RENDER_TYPE_VOIDWATER, +					LLPipeline::RENDER_TYPE_GROUND, +					LLPipeline::RENDER_TYPE_SKY, +					LLPipeline::RENDER_TYPE_CLOUDS, +					LLPipeline::END_RENDER_TYPES);	 -					S32 detail = gSavedSettings.getS32("RenderReflectionDetail"); +				S32 detail = gSavedSettings.getS32("RenderReflectionDetail");  				if (detail > 0)  				{ //mask out selected geometry based on reflection detail  					if (detail < 4)  					{  						clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES); -					if (detail < 3) -					{ -							clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES); -						if (detail < 2) +						if (detail < 3)  						{ +							clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES); +							if (detail < 2) +							{  								clearRenderTypeMask(LLPipeline::RENDER_TYPE_VOLUME, END_RENDER_TYPES);  							}  						} @@ -7776,16 +7779,16 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  					updateCull(camera, ref_result, 1);  					stateSort(camera, ref_result);  				}	 -				 -			if (LLDrawPoolWater::sNeedsDistortionUpdate) -			{ -					if (gSavedSettings.getS32("RenderReflectionDetail") > 0) + +				if (LLDrawPoolWater::sNeedsDistortionUpdate)  				{ -					gPipeline.grabReferences(ref_result); -					LLGLUserClipPlane clip_plane(plane, mat, projection); -					renderGeom(camera); -				} -			}	 +					if (gSavedSettings.getS32("RenderReflectionDetail") > 0) +					{ +						gPipeline.grabReferences(ref_result); +						LLGLUserClipPlane clip_plane(plane, mat, projection); +						renderGeom(camera); +					} +				}	  				gPipeline.popRenderTypeMask();  			}	 @@ -7823,6 +7826,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			LLColor4& col = LLDrawPoolWater::sWaterFogColor;  			glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f);  			mWaterDis.bindTarget(); +			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WATER1;  			mWaterDis.getViewport(gGLViewport);  			if (!LLPipeline::sUnderWaterRender || LLDrawPoolWater::sNeedsReflectionUpdate) @@ -7861,7 +7865,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		LLDrawPoolWater::sNeedsDistortionUpdate = FALSE;  		LLPlane npnorm(-pnorm, -pd);  		LLViewerCamera::getInstance()->setUserClipPlane(npnorm); -		LLPipeline::sUseOcclusion = occlusion;  		LLGLState::checkStates();  		LLGLState::checkTextureChannels(); @@ -7871,6 +7874,8 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		{  			gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());  		} + +		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;  	}  } @@ -7993,6 +7998,8 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	//glCullFace(GL_FRONT); +	LLVertexBuffer::unbind(); +  	{  		LLFastTimer ftm(FTM_SHADOW_SIMPLE);  		LLGLDisable test(GL_ALPHA_TEST); diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index e34636db57..f23cb60121 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -169,12 +169,12 @@          Queue Mode:        </text>        <combo_box follows="top|left" name="build_operator" top_pad="5" left="45" width="100" height="20"> -        <combo_item name="half_edge_collapse"> -          Half Edge Collapse -        </combo_item>          <combo_item name="edge_collapse">            Edge Collapse          </combo_item> +        <combo_item name="half_edge_collapse"> +          Half Edge Collapse +        </combo_item>        </combo_box>        <combo_box follows="top|left" name="queue_mode" left_pad="5" width="100" height="20"> @@ -205,7 +205,7 @@            Lock          </combo_item>        </combo_box> -      <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" height="20"/> +      <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" decimal_digits="5" initial_value="0.00001" height="20"/>        <text left="10" top_pad="35" follows="top|left" width="240" height="15">          Generate Normals @@ -295,6 +295,7 @@          <check_box name="Close Holes (Slow)" follows="top|left" top_pad="10" height="15" label="Close Holes (slow)"/>          <button left="200" bottom_delta="0" width="90" follows="top|left" label="Analyze" name="Decompose" height="20"/> +        <button left="200" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="decompose_cancel" visble="false" height="20"/>        </panel> @@ -324,6 +325,7 @@          <slider name="Detail Scale" label="Detail Scale:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>          <slider name="Retain%" label="Retain:" label_width="120" width="270" follows="top|left" bottom_delta="0" left_delta="0" visible="false" height="20"/>          <button left="190" width="90" follows="top|left" label="Simplify" name="Simplify" height="20"/> +        <button left="190" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="simplify_cancel" height="20"/>        </panel> | 
