diff options
| -rw-r--r-- | indra/llprimitive/llmodel.cpp | 61 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.h | 6 | ||||
| -rwxr-xr-x | indra/newview/llfloatermodelpreview.cpp | 57 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.h | 3 | 
4 files changed, 116 insertions, 11 deletions
| diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index d8e4d4a173..d13e6b662c 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1903,14 +1903,70 @@ bool LLModel::loadModel(std::istream& is)  } -void LLModel::matchMaterialOrder(LLModel* ref) +bool LLModel::isMaterialListSubset( LLModel* ref )  { -	llassert(ref->mMaterialList.size() == mMaterialList.size()); +	int refCnt = ref->mMaterialList.size(); +	int modelCnt = mMaterialList.size(); +	 +	for (U32 src = 0; src < modelCnt; ++src) +	{				 +		bool foundRef = false; +		 +		for (U32 dst = 0; dst < refCnt; ++dst) +		{ +			//llinfos<<mMaterialList[src]<<" "<<ref->mMaterialList[dst]<<llendl; +			foundRef = mMaterialList[src] == ref->mMaterialList[dst];									 +				 +			if ( foundRef ) +			{	 +				break; +			}										 +		} +		if (!foundRef) +		{ +			return false; +		} +	} +	 +	return true; +} + +bool LLModel::needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt ) +{ +	bool changed = false; +	if ( refFaceCnt< modelFaceCnt ) +	{ +		refFaceCnt += modelFaceCnt - refFaceCnt; +		changed = true; +	} +	else  +	if ( modelFaceCnt < refFaceCnt ) +	{ +		modelFaceCnt += refFaceCnt - modelFaceCnt; +		changed = true; +	} +	 +	return changed; +} +bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt ) +{ +	//Is this a subset? +	//LODs cannot currently add new materials, e.g. +	//1. ref = a,b,c lod1 = d,e => This is not permitted +	//2. ref = a,b,c lod1 = c => This would be permitted +	 +	bool isASubset = isMaterialListSubset( ref ); +	if ( !isASubset ) +	{ +		return false; +	} +	  	std::map<std::string, U32> index_map;  	//build a map of material slot names to face indexes  	bool reorder = false; +  	std::set<std::string> base_mat;  	std::set<std::string> cur_mat; @@ -1952,6 +2008,7 @@ void LLModel::matchMaterialOrder(LLModel* ref)  	//override material list with reference model ordering  	mMaterialList = ref->mMaterialList; +	return true;  } diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 9a7b9fa271..1cf528fd9f 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -176,8 +176,10 @@ public:  	//reorder face list based on mMaterialList in this and reference so   	//order matches that of reference (material ordering touchup) -	void matchMaterialOrder(LLModel* reference); - +	bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); +	bool isMaterialListSubset( LLModel* ref ); +	bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); +	  	std::vector<std::string> mMaterialList;  	//data used for skin weights diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index b1b5e69968..80db002f0e 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -3186,8 +3186,14 @@ void LLModelPreview::rebuildUploadData()  		{  			for (U32 j = 0; j < mBaseModel.size(); ++j)  			{ -				mModel[i][j]->matchMaterialOrder(mBaseModel[j]); -				llassert(mModel[i][j]->mMaterialList == mBaseModel[j]->mMaterialList); +				 +				int refFaceCnt = 0; +				int modelFaceCnt = 0; +				 +				if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) ) +				{ +					mFMP->childDisable( "calculate_btn" ); +				}  			}  		}  	} @@ -4765,6 +4771,42 @@ void LLModelPreview::createPreviewAvatar( void )  	}  } +void LLModelPreview::addEmptyFace( LLModel* pTarget ) +{ +	U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; +	 +	LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0); +	 +	buff->allocateBuffer(1, 3, true); +	memset( buff->getMappedData(), 0, buff->getSize() ); +	memset( buff->getIndicesPointer(), 0, buff->getIndicesSize() ); +		 +	buff->validateRange( 0, buff->getNumVerts()-1, buff->getNumIndices(), 0 ); +		 +	LLStrider<LLVector3> pos; +	LLStrider<LLVector3> norm; +	LLStrider<LLVector2> tc; +	LLStrider<U16> index; +		 +	buff->getVertexStrider(pos); +		 +	if ( type_mask & LLVertexBuffer::MAP_NORMAL ) +	{ +		buff->getNormalStrider(norm); +	} +	if ( type_mask & LLVertexBuffer::MAP_TEXCOORD0 ) +	{ +		buff->getTexCoord0Strider(tc); +	} +		 +	buff->getIndexStrider(index); +		 +	//resize face array +	int faceCnt = pTarget->getNumVolumeFaces(); +	pTarget->setNumVolumeFaces( faceCnt+1 );	 +	pTarget->setVolumeFaceData( faceCnt+1, pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices() ); +	 +}	  //-----------------------------------------------------------------------------  // render()  //----------------------------------------------------------------------------- @@ -4976,8 +5018,13 @@ BOOL LLModelPreview::render()  			{  				for (U32 j = 0; j < mBaseModel.size(); ++j)  				{ -					mModel[i][j]->matchMaterialOrder(mBaseModel[j]); -					llassert(mModel[i][j]->mMaterialList == mBaseModel[j]->mMaterialList); +					int refFaceCnt = 0; +					int modelFaceCnt = 0; +										 +					if ( !mModel[i][j]->matchMaterialOrder(mBaseModel[j], refFaceCnt, modelFaceCnt ) ) +					{ +						mFMP->childDisable( "calculate_btn" ); +					}  				}  			}  		} @@ -5019,8 +5066,6 @@ BOOL LLModelPreview::render()  							const std::string& binding = instance.mModel->mMaterialList[i];						  							const LLImportMaterial& material = instance.mMaterial[binding]; -							llassert(binding == model->mMaterialList[i]); -						  							glColor4fv(material.mDiffuseColor.mV);  							if (material.mDiffuseMap.notNull())  							{ diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index f383b3fe98..723e8c48b8 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -336,7 +336,8 @@ public:  	void updateStatusMessages();  	void clearGLODGroup();  	void onLODParamCommit(bool enforce_tri_limit); - +	void addEmptyFace( LLModel* pTarget ); +	  	const bool getModelPivot( void ) const { return mHasPivot; }  	void setHasPivot( bool val ) { mHasPivot = val; }  	void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; } | 
