diff options
| -rw-r--r-- | indra/llprimitive/llmodel.cpp | 8 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.h | 18 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 330 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.h | 2 | ||||
| -rw-r--r-- | indra/newview/llpanelvolume.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 2 | 
6 files changed, 212 insertions, 150 deletions
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index ea0ea931af..def276c808 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1692,13 +1692,13 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)  	}  	else  	{  //no exact match found, get closest point -		const F32 epsilon = 2.f/65536; +		const F32 epsilon = 1e-5f;  		weight_map::iterator iter_up = mSkinWeights.lower_bound(pos);  		weight_map::iterator iter_down = ++iter_up;  		weight_map::iterator best = iter_up; -		F32 min_dist = (iter->first - pos).magVecSquared(); +		F32 min_dist = (iter->first - pos).magVec();  		bool done = false;  		while (!done) @@ -1709,7 +1709,7 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)  			if (iter_up != mSkinWeights.end() && ++iter_up != mSkinWeights.end())  			{  				done = false; -				F32 dist = (iter_up->first - pos).magVecSquared(); +				F32 dist = (iter_up->first - pos).magVec();  				if (dist < epsilon)  				{ @@ -1727,7 +1727,7 @@ LLModel::weight_list& LLModel::getJointInfluences(const LLVector3& pos)  			{  				done = false; -				F32 dist = (iter_down->first - pos).magVecSquared(); +				F32 dist = (iter_down->first - pos).magVec();  				if (dist < epsilon)  				{ diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 35fdf3f3d6..90c1c252ed 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -218,13 +218,29 @@ public:  		}  	}; +	 +	struct JointPositionalCompare +	{ +		//Are the doubles the same w/in epsilon specified tolerance +		bool areEqual( double a, double b ) +		{ +			const float epsilon = 1e-5f; +			return (abs(a - b) > epsilon) && (a < b); +		} +		//Make sure that we return false for any values that are within the tolerance for equivalence +		bool operator() ( const LLVector3& a, const LLVector3& b ) +		{ +			 return ( areEqual( a[0],b[0]) && areEqual( a[1],b[1] ) && areEqual( a[2],b[2]) ) ? false : true;		 +		} +	}; +  	//copy of position array for this model -- mPosition[idx].mV[X,Y,Z]  	std::vector<LLVector3> mPosition;  	//map of positions to skin weights --- mSkinWeights[pos].mV[0..4] == <joint_index>.<weight>  	//joint_index corresponds to mJointList  	typedef std::vector<JointWeight> weight_list; -	typedef std::map<LLVector3, weight_list > weight_map; +	typedef std::map<LLVector3, weight_list, JointPositionalCompare > weight_map;  	weight_map mSkinWeights;  	//get list of weight influences closest to given position diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index e68a8cc84a..6e3008049f 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1543,8 +1543,7 @@ bool LLModelLoader::doLoadModel()  							LLMatrix4 trans = normalized_transformation;  							trans *= skin_info.mBindShapeMatrix; -							skin_info.mBindShapeMatrix = trans; -							 +							skin_info.mBindShapeMatrix = trans;							  						} @@ -1747,15 +1746,15 @@ bool LLModelLoader::doLoadModel()  												}  											} -											model->mSkinInfo.mInvBindMatrix.push_back(mat); +											model->mSkinInfo.mInvBindMatrix.push_back(mat);											  										}  									}  								}  							}  						} -						//Now that we've parsed the joint array, let's determine if we have a full rig -						//(which means we have all the joints that are required for an avatar versus +						//Now that we've parsed the jointa werray, let's determine if we have a full rig +						//(which means we have all the joint sthat are required for an avatar versus  						//a skinned asset attached to a node in a file that contains an entire skeleton,  						//but does not use the skeleton).						  						buildJointToNodeMappingFromScene( root ); @@ -2159,15 +2158,29 @@ void LLModelLoader::processJointToNodeMapping( domNode* pNode )  			mJointsFromNode.push_front( pNode->getName() );  		}  		//2. Handle the kiddo's -		daeTArray< daeSmartRef<daeElement> > childOfChild = pNode->getChildren(); -		S32 childOfChildCount = childOfChild.getCount(); -		for (S32 i = 0; i < childOfChildCount; ++i) +		processChildJoints( pNode ); +	} +	else +	{ +		//Determine if the're any children wrt to this failed node. +		//This occurs when an armature is exported and ends up being what essentially amounts to +		//as the root for the visual_scene +		processChildJoints( pNode ); +	} +} +//----------------------------------------------------------------------------- +// processChildJoint() +//----------------------------------------------------------------------------- +void LLModelLoader::processChildJoints( domNode* pParentNode ) +{	 +	daeTArray< daeSmartRef<daeElement> > childOfChild = pParentNode->getChildren(); +	S32 childOfChildCount = childOfChild.getCount(); +	for (S32 i = 0; i < childOfChildCount; ++i) +	{ +		domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] ); +		if ( pChildNode )  		{ -			domNode* pChildNode = daeSafeCast<domNode>( childOfChild[i] ); -			if ( pChildNode ) -			{ -				processJointToNodeMapping( pChildNode ); -			} +			processJointToNodeMapping( pChildNode );  		}  	}  } @@ -2353,8 +2366,20 @@ void LLModelLoader::loadTextures()  //-----------------------------------------------------------------------------  bool LLModelLoader::isNodeAJoint( domNode* pNode )  { -	if ( !pNode || pNode->getName() == NULL) +	if ( !pNode )  	{ +		llinfos<<"Created node is NULL"<<llendl; +		return false; +	} +	 +	if ( pNode->getName() == NULL ) +	{ +		llinfos<<"Parsed node has no name "<<llendl; +		//Attempt to write the node id, if possible (aids in debugging the visual scene) +		if ( pNode->getId() ) +		{ +			llinfos<<"Parsed node ID: "<<pNode->getId()<<llendl; +		}  		return false;  	} @@ -4868,6 +4893,8 @@ BOOL LLModelPreview::render()  													  target_pos);											// point of interest +	z_near = llclamp(z_far * 0.001f, 0.001f, 0.1f); +  	LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, width, height, FALSE, z_near, z_far);  	stop_glerror(); @@ -4944,18 +4971,22 @@ BOOL LLModelPreview::render()  					if (textures)  					{ -						const std::string& binding = instance.mModel->mMaterialList[i]; -						const LLImportMaterial& material = instance.mMaterial[binding]; +						int materialCnt = instance.mModel->mMaterialList.size(); +						if ( i < materialCnt ) +						{ +							const std::string& binding = instance.mModel->mMaterialList[i];						 +							const LLImportMaterial& material = instance.mMaterial[binding]; -						llassert(binding == model->mMaterialList[i]); +							llassert(binding == model->mMaterialList[i]); -						glColor4fv(material.mDiffuseColor.mV); -						if (material.mDiffuseMap.notNull()) -						{ -							if (material.mDiffuseMap->getDiscardLevel() > -1) +							glColor4fv(material.mDiffuseColor.mV); +							if (material.mDiffuseMap.notNull())  							{ -								gGL.getTexUnit(0)->bind(material.mDiffuseMap, true); -								mTextureSet.insert(material.mDiffuseMap.get()); +								if (material.mDiffuseMap->getDiscardLevel() > -1) +								{ +									gGL.getTexUnit(0)->bind(material.mDiffuseMap, true); +									mTextureSet.insert(material.mDiffuseMap.get()); +								}  							}  						}  					} @@ -4983,184 +5014,197 @@ BOOL LLModelPreview::render()  			if (physics)  			{  				glClear(GL_DEPTH_BUFFER_BIT); -				LLGLEnable blend(GL_BLEND); -				gGL.blendFunc(LLRender::BF_ONE, LLRender::BF_ZERO); - -				for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) +				 +				for (U32 i = 0; i < 2; i++)  				{ -					LLModelInstance& instance = *iter; +					if (i == 0) +					{ //depth only pass +						gGL.setColorMask(false, false); +					} +					else +					{ +						gGL.setColorMask(true, true); +					} -					LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS]; +					//enable alpha blending on second pass but not first pass +					LLGLState blend(GL_BLEND, i);  +					 +					gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA); -					if (!model) +					for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)  					{ -						continue; -					} +						LLModelInstance& instance = *iter; -					gGL.pushMatrix(); -					LLMatrix4 mat = instance.mTransform; +						LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS]; -					glMultMatrixf((GLfloat*) mat.mMatrix); +						if (!model) +						{ +							continue; +						} +						gGL.pushMatrix(); +						LLMatrix4 mat = instance.mTransform; -					bool render_mesh = true; +						glMultMatrixf((GLfloat*) mat.mMatrix); -					LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; -					if (decomp) -					{ -						LLMutexLock(decomp->mMutex); -						LLModel::Decomposition& physics = model->mPhysics; +						bool render_mesh = true; -						if (!physics.mHull.empty()) +						LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; +						if (decomp)  						{ -							render_mesh = false; +							LLMutexLock(decomp->mMutex); -							if (physics.mMesh.empty()) -							{ //build vertex buffer for physics mesh -								gMeshRepo.buildPhysicsMesh(physics); -							} +							LLModel::Decomposition& physics = model->mPhysics; + +							if (!physics.mHull.empty()) +							{ +								render_mesh = false; + +								if (physics.mMesh.empty()) +								{ //build vertex buffer for physics mesh +									gMeshRepo.buildPhysicsMesh(physics); +								} -							if (!physics.mMesh.empty()) -							{ //render hull instead of mesh -								for (U32 i = 0; i < physics.mMesh.size(); ++i) -								{ -									if (explode > 0.f) +								if (!physics.mMesh.empty()) +								{ //render hull instead of mesh +									for (U32 i = 0; i < physics.mMesh.size(); ++i)  									{ -										gGL.pushMatrix(); +										if (explode > 0.f) +										{ +											gGL.pushMatrix(); -										LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters; -										offset *= explode; +											LLVector3 offset = model->mHullCenter[i]-model->mCenterOfHullCenters; +											offset *= explode; -										gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]); -									} +											gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]); +										} -									static std::vector<LLColor4U> hull_colors; +										static std::vector<LLColor4U> hull_colors; -									if (i+1 >= hull_colors.size()) -									{ -										hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 255)); -									} +										if (i+1 >= hull_colors.size()) +										{ +											hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128)); +										}  										glColor4ubv(hull_colors[i].mV); -									LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals); +										LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals); -									if (explode > 0.f) -									{ -										gGL.popMatrix(); +										if (explode > 0.f) +										{ +											gGL.popMatrix(); +										}  									}  								}  							}  						} -					} -					if (render_mesh) -					{ -						if (mVertexBuffer[LLModel::LOD_PHYSICS].empty()) +						if (render_mesh)  						{ -							genBuffers(LLModel::LOD_PHYSICS, false); -						} -						for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i) -						{ -							LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; - -							buffer->setBuffer(type_mask & buffer->getTypeMask()); +							if (mVertexBuffer[LLModel::LOD_PHYSICS].empty()) +							{ +								genBuffers(LLModel::LOD_PHYSICS, false); +							} +							for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i) +							{ +								LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; -							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); -							gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -							glColor4f(0.4f, 0.4f, 0.0f, 0.4f); +								gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +								glColor4f(0.4f, 0.4f, 0.0f, 0.4f); -							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); +								buffer->setBuffer(type_mask & buffer->getTypeMask()); +								buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); -							glColor3f(1.f, 1.f, 0.f); +								glColor3f(1.f, 1.f, 0.f); -							glLineWidth(2.f); -							glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -							buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); +								glLineWidth(2.f); +								glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +								buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); -							glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -							glLineWidth(1.f); +								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +								glLineWidth(1.f); +							}  						} -					} - -					gGL.popMatrix(); -				} -				glLineWidth(3.f); -				glPointSize(8.f); -				gPipeline.enableLightsFullbright(LLColor4::white); -				//show degenerate triangles -				LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); -				LLGLDisable cull(GL_CULL_FACE); -				glColor4f(1.f,0.f,0.f,1.f); -				const LLVector4a scale(0.5f); - -				for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) -				{ -					LLModelInstance& instance = *iter; +						gGL.popMatrix(); +					} -					LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS]; +					glLineWidth(3.f); +					glPointSize(8.f); +					gPipeline.enableLightsFullbright(LLColor4::white); +					//show degenerate triangles +					LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); +					LLGLDisable cull(GL_CULL_FACE); +					glColor4f(1.f,0.f,0.f,1.f); +					const LLVector4a scale(0.5f); -					if (!model) +					for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)  					{ -						continue; -					} +						LLModelInstance& instance = *iter; -					gGL.pushMatrix(); -					LLMatrix4 mat = instance.mTransform; +						LLModel* model = instance.mLOD[LLModel::LOD_PHYSICS]; -					glMultMatrixf((GLfloat*) mat.mMatrix); +						if (!model) +						{ +							continue; +						} +						gGL.pushMatrix(); +						LLMatrix4 mat = instance.mTransform; -					LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; -					if (decomp) -					{ -						LLMutexLock(decomp->mMutex); +						glMultMatrixf((GLfloat*) mat.mMatrix); -						LLModel::Decomposition& physics = model->mPhysics; -						if (physics.mHull.empty()) +						LLPhysicsDecomp* decomp = gMeshRepo.mDecompThread; +						if (decomp)  						{ -							if (mVertexBuffer[LLModel::LOD_PHYSICS].empty()) +							LLMutexLock(decomp->mMutex); + +							LLModel::Decomposition& physics = model->mPhysics; + +							if (physics.mHull.empty())  							{ -								genBuffers(LLModel::LOD_PHYSICS, false); -							} +								if (mVertexBuffer[LLModel::LOD_PHYSICS].empty()) +								{ +									genBuffers(LLModel::LOD_PHYSICS, false); +								} -							for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i) -							{ -								LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; +								for (U32 i = 0; i < mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); ++i) +								{ +									LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; -								buffer->setBuffer(type_mask & buffer->getTypeMask()); +									buffer->setBuffer(type_mask & buffer->getTypeMask()); -								LLStrider<LLVector3> pos_strider;  -								buffer->getVertexStrider(pos_strider, 0); -								LLVector4a* pos = (LLVector4a*) pos_strider.get(); +									LLStrider<LLVector3> pos_strider;  +									buffer->getVertexStrider(pos_strider, 0); +									LLVector4a* pos = (LLVector4a*) pos_strider.get(); -								LLStrider<U16> idx; -								buffer->getIndexStrider(idx, 0); +									LLStrider<U16> idx; +									buffer->getIndexStrider(idx, 0); -								for (U32 i = 0; i < buffer->getNumIndices(); i += 3) -								{ -									LLVector4a v1; v1.setMul(pos[*idx++], scale); -									LLVector4a v2; v2.setMul(pos[*idx++], scale); -									LLVector4a v3; v3.setMul(pos[*idx++], scale); - -									if (ll_is_degenerate(v1,v2,v3)) +									for (U32 i = 0; i < buffer->getNumIndices(); i += 3)  									{ -										buffer->draw(LLRender::LINE_LOOP, 3, i); -										buffer->draw(LLRender::POINTS, 3, i); +										LLVector4a v1; v1.setMul(pos[*idx++], scale); +										LLVector4a v2; v2.setMul(pos[*idx++], scale); +										LLVector4a v3; v3.setMul(pos[*idx++], scale); + +										if (ll_is_degenerate(v1,v2,v3)) +										{ +											buffer->draw(LLRender::LINE_LOOP, 3, i); +											buffer->draw(LLRender::POINTS, 3, i); +										}  									}  								}  							}  						} -					} -					gGL.popMatrix(); +						gGL.popMatrix(); +					} +					glLineWidth(1.f); +					glPointSize(1.f); +					gPipeline.enableLightsPreview(); +					gGL.setSceneBlendType(LLRender::BT_ALPHA);  				} -				glLineWidth(1.f); -				glPointSize(1.f); -				gPipeline.enableLightsPreview(); -				gGL.setSceneBlendType(LLRender::BT_ALPHA);  			}  		}  		else diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index c24e171024..f383b3fe98 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -125,7 +125,7 @@ public:  	void buildJointToNodeMappingFromScene( daeElement* pRoot );  	void processJointToNodeMapping( domNode* pNode ); - +	void processChildJoints( domNode* pParentNode );  	//map of avatar joints as named in COLLADA assets to internal joint names  	std::map<std::string, std::string> mJointMap; diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index bb87601d20..12eea7844d 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -351,7 +351,7 @@ void LLPanelVolume::getState( )  	getChild<LLUICtrl>("Flexible1D Checkbox Ctrl")->setValue(is_flexible);  	if (is_flexible || (volobjp && volobjp->canBeFlexible()))  	{ -		getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp); +		getChildView("Flexible1D Checkbox Ctrl")->setEnabled(editable && single_volume && volobjp && !volobjp->isMesh());  	}  	else  	{ diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e473901609..5579473b8b 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -166,6 +166,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gWLCloudProgram);  	mShaderList.push_back(&gAvatarProgram);  	mShaderList.push_back(&gObjectShinyProgram); +	mShaderList.push_back(&gObjectShinyNonIndexedProgram);  	mShaderList.push_back(&gWaterProgram);  	mShaderList.push_back(&gAvatarEyeballProgram);   	mShaderList.push_back(&gObjectSimpleProgram); @@ -190,6 +191,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gObjectFullbrightWaterProgram);  	mShaderList.push_back(&gAvatarWaterProgram);  	mShaderList.push_back(&gObjectShinyWaterProgram); +	mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);  	mShaderList.push_back(&gUnderWaterProgram);  	mShaderList.push_back(&gDeferredSunProgram);  	mShaderList.push_back(&gDeferredBlurLightProgram);  | 
