diff options
| -rw-r--r-- | indra/llprimitive/llmodel.cpp | 20 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.h | 10 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 55 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.h | 4 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.h | 10 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_model_preview.xml | 7 | 
7 files changed, 92 insertions, 28 deletions
| diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index cd9e5cfa54..6637f41966 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -671,6 +671,7 @@ LLSD LLModel::writeModel(  	const LLModel::Decomposition& decomp,  	BOOL upload_skin,  	BOOL upload_joints, +    BOOL lock_scale_if_joint_position,  	BOOL nowrite,  	BOOL as_slm,  	int submodel_id) @@ -690,7 +691,7 @@ LLSD LLModel::writeModel(  	if (skinning)  	{ //write skinning block -		mdl["skin"] = high->mSkinInfo.asLLSD(upload_joints); +		mdl["skin"] = high->mSkinInfo.asLLSD(upload_joints, lock_scale_if_joint_position);  	}  	if (!decomp.mBaseHull.empty() || @@ -1451,11 +1452,17 @@ void LLMeshSkinInfo::fromLLSD(LLSD& skin)  		mPelvisOffset = skin["pelvis_offset"].asReal();  	} -    // FIXME BENTO check contents of asset. -    mLockScaleIfJointPosition = true; +    if (skin.has("lock_scale_if_joint_position")) +    { +        mLockScaleIfJointPosition = skin["lock_scale_if_joint_position"].asBoolean(); +    } +	else +	{ +		mLockScaleIfJointPosition = false; +	}  } -LLSD LLMeshSkinInfo::asLLSD(bool include_joints) const +LLSD LLMeshSkinInfo::asLLSD(bool include_joints, bool lock_scale_if_joint_position) const  {  	LLSD ret; @@ -1493,6 +1500,11 @@ LLSD LLMeshSkinInfo::asLLSD(bool include_joints) const  			}  		} +        if (lock_scale_if_joint_position) +        { +            ret["lock_scale_if_joint_position"] = mLockScaleIfJointPosition; +        } +  		ret["pelvis_offset"] = mPelvisOffset;  	} diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index fe6ce148c4..c23d65bc8f 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -42,16 +42,17 @@ class domMesh;  class LLMeshSkinInfo   {  public: +	LLMeshSkinInfo() { } +	LLMeshSkinInfo(LLSD& data); +	void fromLLSD(LLSD& data); +	LLSD asLLSD(bool include_joints, bool lock_scale_if_joint_position) const; +  	LLUUID mMeshID;  	std::vector<std::string> mJointNames;  	std::vector<LLMatrix4> mInvBindMatrix;  	std::vector<LLMatrix4> mAlternateBindMatrix;      std::vector<U32> mJointRemap; -	LLMeshSkinInfo() { } -	LLMeshSkinInfo(LLSD& data); -	void fromLLSD(LLSD& data); -	LLSD asLLSD(bool include_joints) const;  	LLMatrix4 mBindShapeMatrix;  	float mPelvisOffset;      bool mLockScaleIfJointPosition; @@ -139,6 +140,7 @@ public:  		const LLModel::Decomposition& decomp,  		BOOL upload_skin,  		BOOL upload_joints, +        BOOL lock_scale_if_joint_position,  		BOOL nowrite = FALSE,  		BOOL as_slm = FALSE,  		int submodel_id = 0); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index c1ec86b110..7aae48cf5d 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -298,6 +298,7 @@ BOOL LLFloaterModelPreview::postBuild()  	childSetCommitCallback("upload_skin", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);  	childSetCommitCallback("upload_joints", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL); +	childSetCommitCallback("lock_scale_if_joint_position", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);  	childSetCommitCallback("upload_textures", boost::bind(&LLFloaterModelPreview::toggleCalculateButton, this), NULL);  	childSetTextArg("status", "[STATUS]", getString("status_idle")); @@ -311,6 +312,7 @@ BOOL LLFloaterModelPreview::postBuild()  	childSetCommitCallback("upload_skin", onUploadSkinCommit, this);  	childSetCommitCallback("upload_joints", onUploadJointsCommit, this); +	childSetCommitCallback("lock_scale_if_joint_position", onUploadJointsCommit, this);  	childSetCommitCallback("import_scale", onImportScaleCommit, this);  	childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this); @@ -323,6 +325,7 @@ BOOL LLFloaterModelPreview::postBuild()  	childDisable("upload_skin");  	childDisable("upload_joints"); +	childDisable("lock_scale_if_joint_position");  	initDecompControls(); @@ -488,6 +491,7 @@ void LLFloaterModelPreview::onClickCalculateBtn()  	bool upload_skinweights = childGetValue("upload_skin").asBoolean();  	bool upload_joint_positions = childGetValue("upload_joints").asBoolean(); +    bool lock_scale_if_joint_position = childGetValue("lock_scale_if_joint_position").asBoolean();      if (upload_joint_positions)      { @@ -499,7 +503,8 @@ void LLFloaterModelPreview::onClickCalculateBtn()  	mUploadModelUrl.clear();  	gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale, -                          childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, +                          childGetValue("upload_textures").asBoolean(),  +                          upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,                            mUploadModelUrl, false,  						  getWholeModelFeeObserverHandle()); @@ -1324,9 +1329,10 @@ U32 LLModelPreview::calcResourceCost()  					   decomp,  					   mFMP->childGetValue("upload_skin").asBoolean(),  					   mFMP->childGetValue("upload_joints").asBoolean(), +					   mFMP->childGetValue("lock_scale_if_joint_position").asBoolean(),  					   TRUE, -						FALSE, -						instance.mModel->mSubmodelID); +					   FALSE, +					   instance.mModel->mSubmodelID);  			num_hulls += decomp.mHull.size();  			for (U32 i = 0; i < decomp.mHull.size(); ++i) @@ -1651,7 +1657,7 @@ void LLModelPreview::rebuildUploadData()  } -void LLModelPreview::saveUploadData(bool save_skinweights, bool save_joint_positions) +void LLModelPreview::saveUploadData(bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position)  {  	if (!mLODFile[LLModel::LOD_HIGH].empty())  	{ @@ -1660,12 +1666,13 @@ void LLModelPreview::saveUploadData(bool save_skinweights, bool save_joint_posit          if (LLModelLoader::getSLMFilename(filename, slm_filename))          { -			saveUploadData(slm_filename, save_skinweights, save_joint_positions); +			saveUploadData(slm_filename, save_skinweights, save_joint_positions, lock_scale_if_joint_position);  		}  	}  } -void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions) +void LLModelPreview::saveUploadData(const std::string& filename,  +                                    bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position)  {  	std::set<LLPointer<LLModel> > meshes; @@ -1706,7 +1713,9 @@ void LLModelPreview::saveUploadData(const std::string& filename, bool save_skinw  				instance.mLOD[LLModel::LOD_LOW],   				instance.mLOD[LLModel::LOD_IMPOSTOR],   				decomp,  -				save_skinweights, save_joint_positions, +				save_skinweights,  +                save_joint_positions, +                lock_scale_if_joint_position,                  FALSE, TRUE, instance.mModel->mSubmodelID);  			data["mesh"][instance.mModel->mLocalID] = str.str(); @@ -1946,6 +1955,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)  		bool skin_weights = false;  		bool joint_positions = false; +		bool lock_scale_if_joint_position = false;  		for (S32 lod = 0; lod < LLModel::NUM_LODS; ++lod)  		{ //for each LoD @@ -1993,6 +2003,10 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)  							{  								joint_positions = true;  							} +							if (list_iter->mModel->mSkinInfo.mLockScaleIfJointPosition) +							{ +								lock_scale_if_joint_position = true; +							}  						}  					}  				} @@ -2016,6 +2030,13 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)  				mViewOption["show_joint_positions"] = true;  				fmp->childSetValue("upload_joints", true);  			} + +			if (lock_scale_if_joint_position) +			{ +				fmp->enableViewOption("lock_scale_if_joint_position"); +				mViewOption["lock_scale_if_joint_position"] = true; +				fmp->childSetValue("lock_scale_if_joint_position", true); +			}  		}  		//copy high lod to base scene for LoD generation @@ -3645,7 +3666,17 @@ BOOL LLModelPreview::render()  		mFMP->childSetValue("upload_joints", false);  		upload_joints = false;		  	}	 -		 + +    if (upload_skin && upload_joints) +    { +        mFMP->childEnable("lock_scale_if_joint_position"); +    } +    else +    { +        mFMP->childDisable("lock_scale_if_joint_position"); +        mFMP->childSetValue("lock_scale_if_joint_position", false); +    } +      	//Only enable joint offsets if it passed the earlier critiquing  	if ( isRigValidForJointPositionUpload() )    	{ @@ -4239,15 +4270,17 @@ void LLFloaterModelPreview::onUpload(void* user_data)  	bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean();  	bool upload_joint_positions = mp->childGetValue("upload_joints").asBoolean(); - +    bool lock_scale_if_joint_position = mp->childGetValue("lock_scale_if_joint_position").asBoolean();  	if (gSavedSettings.getBOOL("MeshImportUseSLM"))  	{ -        mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions); +        mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions, lock_scale_if_joint_position);      }  	gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale, -						  mp->childGetValue("upload_textures").asBoolean(), upload_skinweights, upload_joint_positions, mp->mUploadModelUrl, +						  mp->childGetValue("upload_textures").asBoolean(),  +                          upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,  +                          mp->mUploadModelUrl,  						  true, LLHandle<LLWholeModelFeeObserver>(), mp->getWholeModelUploadObserverHandle());  } diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 217ac35888..a7a5c1b33a 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -270,8 +270,8 @@ public:  	void restoreNormals();  	U32 calcResourceCost();  	void rebuildUploadData(); -	void saveUploadData(bool save_skinweights, bool save_joint_poisitions); -	void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_poisitions); +	void saveUploadData(bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position); +	void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position);  	void clearIncompatible(S32 lod);  	void updateStatusMessages();  	void updateLodControls(S32 lod); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 54f8fb93d0..5f8f42a1d6 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1896,7 +1896,8 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32  }  LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures, -									   bool upload_skin, bool upload_joints, const std::string & upload_url, bool do_upload, +									   bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, +                                       const std::string & upload_url, bool do_upload,  									   LLHandle<LLWholeModelFeeObserver> fee_observer,  									   LLHandle<LLWholeModelUploadObserver> upload_observer)    : LLThread("mesh upload"), @@ -1911,6 +1912,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,  	mUploadTextures = upload_textures;  	mUploadSkin = upload_skin;  	mUploadJoints = upload_joints; +    mLockScaleIfJointPosition = lock_scale_if_joint_position;  	mMutex = new LLMutex(NULL);  	mPendingUploads = 0;  	mFinished = false; @@ -2097,6 +2099,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)  				decomp,  				mUploadSkin,  				mUploadJoints, +                mLockScaleIfJointPosition,  				FALSE,  				FALSE,  				data.mBaseModel->mSubmodelID); @@ -2255,6 +2258,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)  				decomp,  				mUploadSkin,  				mUploadJoints, +                mLockScaleIfJointPosition,  				FALSE,  				FALSE,  				data.mBaseModel->mSubmodelID); @@ -3946,11 +3950,13 @@ LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)  void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, -								   bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload, +								   bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, +                                   std::string upload_url, bool do_upload,  								   LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)  { -	LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints, upload_url,  -														do_upload, fee_observer, upload_observer); +	LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, +                                                        upload_skin, upload_joints, lock_scale_if_joint_position,  +                                                        upload_url, do_upload, fee_observer, upload_observer);  	mUploadWaitList.push_back(thread);  } diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index a762042597..30f042845a 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -400,6 +400,7 @@ public:  	bool			mUploadTextures;  	bool			mUploadSkin;  	bool			mUploadJoints; +    bool			mLockScaleIfJointPosition;  	volatile bool	mDiscarded;  	LLHost			mHost; @@ -407,7 +408,8 @@ public:  	std::string		mWholeModelUploadURL;  	LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures, -					   bool upload_skin, bool upload_joints, const std::string & upload_url, bool do_upload = true, +					   bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, +                       const std::string & upload_url, bool do_upload = true,  					   LLHandle<LLWholeModelFeeObserver> fee_observer = (LLHandle<LLWholeModelFeeObserver>()),  					   LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));  	~LLMeshUploadThread(); @@ -510,8 +512,10 @@ public:  	LLSD& getMeshHeader(const LLUUID& mesh_id);  	void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, -			bool upload_skin, bool upload_joints, std::string upload_url, bool do_upload = true, -					 LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()), LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>())); +                     bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, +                     std::string upload_url, bool do_upload = true, +					 LLHandle<LLWholeModelFeeObserver> fee_observer= (LLHandle<LLWholeModelFeeObserver>()),  +                     LLHandle<LLWholeModelUploadObserver> upload_observer = (LLHandle<LLWholeModelUploadObserver>()));  	S32 getMeshSize(const LLUUID& mesh_id, S32 lod); 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 d2c8dddfe1..2750316f2e 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -1217,6 +1217,13 @@               label_text.text_color="White"               name="upload_joints"               top_pad="15"/> +           <check_box +             follows="top|left" +             height="15" +             label="Lock scale if joint position defined" +             label_text.text_color="White" +             name="lock_scale_if_joint_position" +             top_pad="15"/>             <text               follows="top|left"               height="15" | 
