diff options
| author | Dave Parks <davep@lindenlab.com> | 2010-10-15 16:33:22 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2010-10-15 16:33:22 -0500 | 
| commit | 997d66d348b3c6a19ecd2f5b092f68f645712eb1 (patch) | |
| tree | c5d13f10ab27b32b0746290b8dbf3df45c38c673 | |
| parent | 70a98095c05df10eda3289988b6bdb21dbfaa0f3 (diff) | |
Fix for various crashes on exit and leaks when using convex decomposition.
Make rendering of convex hullified prims work in physics shape display.
Reviewed by Falcon.
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 13 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.cpp | 40 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 26 | ||||
| -rw-r--r-- | install.xml | 4 | 
4 files changed, 46 insertions, 37 deletions
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 258da7b406..d067970806 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -868,16 +868,17 @@ void LLFloaterModelPreview::showDecompFloater()  		cur_y += 30; -		const LLCDStageData* stage; -		S32 stage_count = 0; -		if (LLConvexDecomposition::getInstance() != NULL) +		static const LLCDStageData* stage = NULL; +		static S32 stage_count = 0; + +		if (!stage && LLConvexDecomposition::getInstance() != NULL)  		{  			stage_count = LLConvexDecomposition::getInstance()->getStages(&stage);  		} -		const LLCDParam* param; -		S32 param_count = 0; -		if (LLConvexDecomposition::getInstance() != NULL) +		static const LLCDParam* param = NULL; +		static S32 param_count = 0; +		if (!param && LLConvexDecomposition::getInstance() != NULL)  		{  			param_count = LLConvexDecomposition::getInstance()->getParameters(¶m);  		} diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index e97fd52c7e..3c51781dfa 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -460,7 +460,7 @@ LLMeshRepoThread::~LLMeshRepoThread()  void LLMeshRepoThread::run()  {  	mCurlRequest = new LLCurlRequest(); -	LLCDResult res =	LLConvexDecomposition::initThread(); +	LLCDResult res = LLConvexDecomposition::initThread();  	if (res != LLCD_OK)  	{  		llwarns << "convex decomposition unable to be loaded" << llendl; @@ -1835,6 +1835,8 @@ void LLMeshRepository::init()  {  	mMeshMutex = new LLMutex(NULL); +	LLConvexDecomposition::getInstance()->initSystem(); +  	mDecompThread = new LLPhysicsDecomp();  	mDecompThread->start(); @@ -1843,6 +1845,8 @@ void LLMeshRepository::init()  		apr_sleep(100);  	} +	 +	  	mThread = new LLMeshRepoThread();  	mThread->start();  } @@ -1870,6 +1874,8 @@ void LLMeshRepository::shutdown()  		delete mDecompThread;  		mDecompThread = NULL;  	} + +	LLConvexDecomposition::quitSystem();  } @@ -2807,8 +2813,12 @@ void LLPhysicsDecomp::doDecomposition()  	//build parameter map  	std::map<std::string, const LLCDParam*> param_map; -	const LLCDParam* params; -	S32 param_count = LLConvexDecomposition::getInstance()->getParameters(¶ms); +	static const LLCDParam* params = NULL; +	static S32 param_count = 0; +	if (!params) +	{ +		param_count = LLConvexDecomposition::getInstance()->getParameters(¶ms); +	}  	for (S32 i = 0; i < param_count; ++i)  	{ @@ -2965,8 +2975,13 @@ void LLPhysicsDecomp::doDecompositionSingleHull()  	//set all parameters to default  	std::map<std::string, const LLCDParam*> param_map; -	const LLCDParam* params; -	S32 param_count = LLConvexDecomposition::getInstance()->getParameters(¶ms); +	static const LLCDParam* params = NULL; +	static S32 param_count = 0; + +	if (!params) +	{ +		param_count = LLConvexDecomposition::getInstance()->getParameters(¶ms); +	}  	LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance(); @@ -3048,13 +3063,18 @@ void LLPhysicsDecomp::doDecompositionSingleHull()  void LLPhysicsDecomp::run()  { -	LLConvexDecomposition::initSystem(); +	LLConvexDecomposition::getInstance()->initThread();  	mInited = true;  	LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance(); -	const LLCDStageData* stages; -	S32 num_stages = decomp->getStages(&stages); +	static const LLCDStageData* stages = NULL; +	static S32 num_stages = 0; +	 +	if (!stages) +	{ +		num_stages = decomp->getStages(&stages); +	}  	for (S32 i = 0; i < num_stages; i++)  	{ @@ -3083,8 +3103,8 @@ void LLPhysicsDecomp::run()  		}  	} -	LLConvexDecomposition::quitSystem(); - +	LLConvexDecomposition::getInstance()->quitThread(); +	  	//delete mSignal;  	delete mMutex;  	mSignal = NULL; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index c40a411978..6ce6a3ecdb 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2911,7 +2911,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  		{  			renderMeshBaseHull(volume, data_mask, color);  		} -#if 0 && LL_WINDOWS  +#if LL_WINDOWS   		else  		{  			LLVolumeParams volume_params = volume->getVolume()->getParams(); @@ -2958,8 +2958,6 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  				LLCDMeshData res; -				LLConvexDecomposition::getInstance()->initThread(); -  				LLConvexDecomposition::getInstance()->generateSingleHullMeshFromMesh( &mesh, &res );  				//copy res into phys_volume @@ -2970,11 +2968,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  				phys_volume->mHullIndices = (U16*) malloc(idx_size);  				phys_volume->mNumHullIndices = res.mNumTriangles*3; -				const F32* v = mesh.mVertexBase; +				const F32* v = res.mVertexBase;  				for (S32 i = 0; i < res.mNumVertices; ++i)  				{ -					F32* p = (F32*) ((U8*)v+i*mesh.mVertexStrideBytes); +					F32* p = (F32*) ((U8*)v+i*res.mVertexStrideBytes);  					phys_volume->mHullPoints[i].load3(p);  				} @@ -3000,8 +2998,6 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  						phys_volume->mHullIndices[i*3+2] = (U16) idx[2];  					}  				} - -				LLConvexDecomposition::getInstance()->quitThread();  			}  			if (phys_volume->mHullPoints) @@ -3014,20 +3010,12 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  				glColor3fv(color.mV);  				LLVertexBuffer::unbind(); -				glPointSize(2.f); -				gGL.begin(LLRender::POINTS); -				gGL.color3fv(color.mV); -				for (U32 i = 0; i < phys_volume->mNumHullPoints; i++) -				{ -					gGL.vertex3fv(phys_volume->mHullPoints[i].getF32ptr()); -				} -				gGL.end(); -				gGL.flush();				 -				//glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); +				glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints); +				glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); -				/*glColor4fv(color.mV); +				glColor4fv(color.mV);  				glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -				glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);*/ +				glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);  				gGL.popMatrix();  			} diff --git a/install.xml b/install.xml index b0421be92f..8cefeb57a8 100644 --- a/install.xml +++ b/install.xml @@ -1058,9 +1058,9 @@ anguage Infrstructure (CLI) international standard</string>            <key>windows</key>            <map>              <key>md5sum</key> -            <string>7c7526e45f8d0281bf4c0981911463ef</string> +            <string>409963e47d8db736f9e3be43560f6a93</string>              <key>url</key> -            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-windows-20101006.tar.bz2</uri> +            <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/llconvexdecomposition-0.3-windows-20101015.tar.bz2</uri>            </map>            <key>linux</key>            <map>  | 
