diff options
| author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2016-09-27 08:03:48 -0400 | 
|---|---|---|
| committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2016-09-27 08:03:48 -0400 | 
| commit | 996861e21bf165d73ebd80eae50ad1e8f61ee55d (patch) | |
| tree | 6162de48ebb08e8f46bf361f488ef85b2391b8f0 /indra/newview | |
| parent | 2be27c26e849935600efde49399cbeff399c45a3 (diff) | |
| parent | 6c46b3caf20af1a2987c0ca4ed0bf8e6ebe80fb4 (diff) | |
merge
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llappearancemgr.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 57 | ||||
| -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/llviewerobject.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 133 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.h | 15 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_model_preview.xml | 7 | 
10 files changed, 174 insertions, 76 deletions
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index ff5439d610..d403e39329 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -857,7 +857,7 @@ void LLWearableHoldingPattern::onAllComplete()  		// attachments, even those that are not being removed. This is  		// needed to get joint positions all slammed down to their  		// pre-attachment states. -		gAgentAvatarp->clearAttachmentPosOverrides(); +		gAgentAvatarp->clearAttachmentOverrides();  		if (objects_to_remove.size() || items_to_add.size())  		{ @@ -880,7 +880,7 @@ void LLWearableHoldingPattern::onAllComplete()  			 ++it)  		{  			LLViewerObject *objectp = *it; -			gAgentAvatarp->addAttachmentPosOverridesForObject(objectp); +			gAgentAvatarp->addAttachmentOverridesForObject(objectp);  		}  		// Add new attachments to match those requested. diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 93775b62ed..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,18 +491,20 @@ 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)      {          // Diagnostic message showing list of joints for which joint offsets are defined.          // FIXME - given time, would be much better to put this in the UI, in updateStatusMessages(). -		mModelPreview->getPreviewAvatar()->showAttachmentPosOverrides(); +		mModelPreview->getPreviewAvatar()->showAttachmentOverrides();      }  	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/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 5edc3c9745..db0adad3c0 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -370,7 +370,7 @@ void LLViewerObject::markDead()  		if (av && LLVOAvatar::getRiggedMeshID(this,mesh_id))  		{  			// This case is needed for indirectly attached mesh objects. -			av->resetJointPositionsOnDetach(mesh_id); +			av->resetJointsOnDetach(mesh_id);  		}  		// Mark itself as dead diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index e9f00f04fa..7af15fb351 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1860,8 +1860,8 @@ void LLVOAvatar::resetSkeleton()      //LLVector3 pelvis_pos = getJoint("mPelvis")->getPosition();      //LLQuaternion pelvis_rot = getJoint("mPelvis")->getRotation(); -    // Clear all attachment pos overrides -    clearAttachmentPosOverrides(); +    // Clear all attachment pos and scale overrides +    clearAttachmentOverrides();      // Note that we call buildSkeleton twice in this function. The first time is      // just to get the right scale for the collision volumes, because @@ -1910,7 +1910,7 @@ void LLVOAvatar::resetSkeleton()      updateVisualParams();      // Restore attachment pos overrides -    rebuildAttachmentPosOverrides(); +    rebuildAttachmentOverrides();      LL_DEBUGS("Avatar") << avString() << " reset ends" << LL_ENDL;  } @@ -5422,9 +5422,9 @@ bool LLVOAvatar::jointIsRiggedTo(const std::string& joint_name, const LLViewerOb      return false;  } -void LLVOAvatar::clearAttachmentPosOverrides() +void LLVOAvatar::clearAttachmentOverrides()  { -    LLScopedContextString str("clearAttachmentPosOverrides " + getFullname()); +    LLScopedContextString str("clearAttachmentOverrides " + getFullname());  	//Subsequent joints are relative to pelvis  	avatar_joint_list_t::iterator iter = mSkeleton.begin(); @@ -5437,6 +5437,10 @@ void LLVOAvatar::clearAttachmentPosOverrides()  		{  			pJoint->clearAttachmentPosOverrides();  		} +		if (pJoint) +		{ +			pJoint->clearAttachmentScaleOverrides(); +		}  	}      // Attachment points @@ -5453,11 +5457,11 @@ void LLVOAvatar::clearAttachmentPosOverrides()  }  //----------------------------------------------------------------------------- -// rebuildAttachmentPosOverrides +// rebuildAttachmentOverrides  //----------------------------------------------------------------------------- -void LLVOAvatar::rebuildAttachmentPosOverrides() +void LLVOAvatar::rebuildAttachmentOverrides()  { -    LLScopedContextString str("rebuildAttachmentPosOverrides " + getFullname()); +    LLScopedContextString str("rebuildAttachmentOverrides " + getFullname());      // Attachment points  	for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); @@ -5470,7 +5474,7 @@ void LLVOAvatar::rebuildAttachmentPosOverrides()              for (LLViewerJointAttachment::attachedobjs_vec_t::iterator at_it = attachment_pt->mAttachedObjects.begin();  				 at_it != attachment_pt->mAttachedObjects.end(); ++at_it)              { -                addAttachmentPosOverridesForObject(*at_it); +                addAttachmentOverridesForObject(*at_it);              }          }      } @@ -5478,7 +5482,7 @@ void LLVOAvatar::rebuildAttachmentPosOverrides()  //-----------------------------------------------------------------------------  // addAttachmentPosOverridesForObject  //----------------------------------------------------------------------------- -void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo) +void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo)  {  	LLVOAvatar *av = vo->getAvatarAncestor();  	if (!av || (av != this)) @@ -5486,7 +5490,7 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)  		LL_WARNS("Avatar") << "called with invalid avatar" << LL_ENDL;  	} -    LLScopedContextString str("addAttachmentPosOverridesForObject " + av->getFullname()); +    LLScopedContextString str("addAttachmentOverridesForObject " + av->getFullname());  	// Process all children  	LLViewerObject::const_child_list_t& children = vo->getChildren(); @@ -5494,7 +5498,7 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)  		 it != children.end(); ++it)  	{  		LLViewerObject *childp = *it; -		addAttachmentPosOverridesForObject(childp); +		addAttachmentOverridesForObject(childp);  	}  	LLVOVolume *vobj = dynamic_cast<LLVOVolume*>(vo); @@ -5535,19 +5539,26 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)  					{   									  						pJoint->setId( currentId );  						const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();									 - -                        bool override_changed; -                        pJoint->addAttachmentPosOverride( jointPos, mesh_id, avString(), override_changed ); - -                        if (override_changed) +                        if (pJoint->aboveJointPosThreshold(jointPos))                          { -                            //If joint is a pelvis then handle old/new pelvis to foot values -                            if ( lookingForJoint == "mPelvis" ) -                            {	 -                                pelvisGotSet = true;											 -                            }										 -                        } +                            bool override_changed; +                            pJoint->addAttachmentPosOverride( jointPos, mesh_id, avString(), override_changed ); +                            if (override_changed) +                            { +                                //If joint is a pelvis then handle old/new pelvis to foot values +                                if ( lookingForJoint == "mPelvis" ) +                                {	 +                                    pelvisGotSet = true;											 +                                }										 +                            } +                            if (pSkinData->mLockScaleIfJointPosition) +                            { +                                // Note that unlike positions, there's no threshold check here, +                                // just a lock at the default value. +                                pJoint->addAttachmentScaleOverride(pJoint->getDefaultScale(), mesh_id, avString()); +                            } +                        }  					}										  				}																  				if (pelvisZOffset != 0.0F) @@ -5577,9 +5588,10 @@ void LLVOAvatar::addAttachmentPosOverridesForObject(LLViewerObject *vo)  //-----------------------------------------------------------------------------  // getAttachmentOverrideNames  //----------------------------------------------------------------------------- -void LLVOAvatar::getAttachmentOverrideNames(std::set<std::string>& names) const +void LLVOAvatar::getAttachmentOverrideNames(std::set<std::string>& pos_names, std::set<std::string>& scale_names) const  {      LLVector3 pos; +    LLVector3 scale;      LLUUID mesh_id;      // Bones @@ -5589,7 +5601,11 @@ void LLVOAvatar::getAttachmentOverrideNames(std::set<std::string>& names) const  		const LLJoint* pJoint = (*iter);  		if (pJoint && pJoint->hasAttachmentPosOverride(pos,mesh_id))  		{ -            names.insert(pJoint->getName()); +            pos_names.insert(pJoint->getName()); +		} +		if (pJoint && pJoint->hasAttachmentScaleOverride(scale,mesh_id)) +		{ +            scale_names.insert(pJoint->getName());  		}  	} @@ -5601,36 +5617,47 @@ void LLVOAvatar::getAttachmentOverrideNames(std::set<std::string>& names) const  		const LLViewerJointAttachment *attachment_pt = (*iter).second;          if (attachment_pt && attachment_pt->hasAttachmentPosOverride(pos,mesh_id))          { -            names.insert(attachment_pt->getName()); +            pos_names.insert(attachment_pt->getName());          } +        // Attachment points don't have scales.      }  }  //----------------------------------------------------------------------------- -// showAttachmentPosOverrides +// showAttachmentOverrides  //----------------------------------------------------------------------------- -void LLVOAvatar::showAttachmentPosOverrides(bool verbose) const +void LLVOAvatar::showAttachmentOverrides(bool verbose) const  { -    std::set<std::string> joint_names; -    getAttachmentOverrideNames(joint_names); -    if (joint_names.size()) +    std::set<std::string> pos_names, scale_names; +    getAttachmentOverrideNames(pos_names, scale_names); +    if (pos_names.size())      {          std::stringstream ss; -        std::copy(joint_names.begin(), joint_names.end(), std::ostream_iterator<std::string>(ss, ",")); -        LL_DEBUGS("Avatar") << getFullname() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL; +        std::copy(pos_names.begin(), pos_names.end(), std::ostream_iterator<std::string>(ss, ",")); +        LL_INFOS() << getFullname() << " attachment positions defined for joints: " << ss.str() << "\n" << LL_ENDL;      }      else      {          LL_DEBUGS("Avatar") << getFullname() << " no attachment positions defined for any joints" << "\n" << LL_ENDL;      } +    if (scale_names.size()) +    { +        std::stringstream ss; +        std::copy(scale_names.begin(), scale_names.end(), std::ostream_iterator<std::string>(ss, ",")); +        LL_INFOS() << getFullname() << " attachment scales defined for joints: " << ss.str() << "\n" << LL_ENDL; +    } +    else +    { +        LL_INFOS() << getFullname() << " no attachment scales defined for any joints" << "\n" << LL_ENDL; +    }      if (!verbose)      {          return;      } -    LLVector3 pos; +    LLVector3 pos, scale;      LLUUID mesh_id;      S32 count = 0; @@ -5644,6 +5671,11 @@ void LLVOAvatar::showAttachmentPosOverrides(bool verbose) const  			pJoint->showAttachmentPosOverrides(getFullname());              count++;  		} +		if (pJoint && pJoint->hasAttachmentScaleOverride(scale,mesh_id)) +		{ +			pJoint->showAttachmentScaleOverrides(getFullname()); +            count++; +        }  	}      // Attachment points @@ -5661,15 +5693,15 @@ void LLVOAvatar::showAttachmentPosOverrides(bool verbose) const      if (count)      { -        LL_DEBUGS("Avatar") << avString() << " end of pos overrides" << LL_ENDL; +        LL_DEBUGS("Avatar") << avString() << " end of pos, scale overrides" << LL_ENDL;          LL_DEBUGS("Avatar") << "=================================" << LL_ENDL;      }  }  //----------------------------------------------------------------------------- -// resetJointPositionsOnDetach +// resetJointsOnDetach  //----------------------------------------------------------------------------- -void LLVOAvatar::resetJointPositionsOnDetach(LLViewerObject *vo) +void LLVOAvatar::resetJointsOnDetach(LLViewerObject *vo)  {  	LLVOAvatar *av = vo->getAvatarAncestor();  	if (!av || (av != this)) @@ -5683,21 +5715,21 @@ void LLVOAvatar::resetJointPositionsOnDetach(LLViewerObject *vo)  		 it != children.end(); ++it)  	{  		LLViewerObject *childp = *it; -		resetJointPositionsOnDetach(childp); +		resetJointsOnDetach(childp);  	}  	// Process self.  	LLUUID mesh_id;  	if (getRiggedMeshID(vo,mesh_id))  	{ -		resetJointPositionsOnDetach(mesh_id); +		resetJointsOnDetach(mesh_id);  	}  }  //----------------------------------------------------------------------------- -// resetJointPositionsOnDetach +// resetJointsOnDetach  //----------------------------------------------------------------------------- -void LLVOAvatar::resetJointPositionsOnDetach(const LLUUID& mesh_id) +void LLVOAvatar::resetJointsOnDetach(const LLUUID& mesh_id)  {	  	//Subsequent joints are relative to pelvis  	avatar_joint_list_t::iterator iter = mSkeleton.begin(); @@ -5713,7 +5745,8 @@ void LLVOAvatar::resetJointPositionsOnDetach(const LLUUID& mesh_id)  		{			              bool dummy; // unused  			pJoint->setId( LLUUID::null ); -			pJoint->removeAttachmentPosOverride(mesh_id, avString(), dummy); +			pJoint->removeAttachmentPosOverride(mesh_id, avString(),dummy); +			pJoint->removeAttachmentScaleOverride(mesh_id, avString());  		}		  		if ( pJoint && pJoint == pJointPelvis)  		{ @@ -6414,7 +6447,7 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )  	LLUUID mesh_id;  	if (getRiggedMeshID(pVO, mesh_id))  	{ -		resetJointPositionsOnDetach(mesh_id); +		resetJointsOnDetach(mesh_id);  		if ( gAgentCamera.cameraCustomizeAvatar() )  		{  			gAgent.unpauseAnimation(); @@ -8448,6 +8481,20 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara  								 pJoint->getName().c_str(), pos[0], pos[1], pos[2], mesh_id.asString().c_str());  			}  		} +        // Joint scale overrides +		for (iter = mSkeleton.begin(); iter != end; ++iter) +		{ +			LLJoint* pJoint = (*iter); +		 +			LLVector3 scale; +			LLUUID mesh_id; + +			if (pJoint->hasAttachmentScaleOverride(scale,mesh_id)) +			{ +				apr_file_printf( file, "\t\t<joint_scale name=\"%s\" scale=\"%f %f %f\" mesh_id=\"%s\"/>\n",  +								 pJoint->getName().c_str(), scale[0], scale[1], scale[2], mesh_id.asString().c_str()); +			} +		}  		F32 pelvis_fixup;  		LLUUID mesh_id;  		if (hasPelvisFixup(pelvis_fixup, mesh_id)) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b67aa62b06..64171e7243 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -200,15 +200,16 @@ public:  	virtual LLJoint*		getJoint(const std::string &name); -	void 					addAttachmentPosOverridesForObject(LLViewerObject *vo); -	void					resetJointPositionsOnDetach(const LLUUID& mesh_id); -	void					resetJointPositionsOnDetach(LLViewerObject *vo); +	void 					addAttachmentOverridesForObject(LLViewerObject *vo); +	void					resetJointsOnDetach(const LLUUID& mesh_id); +	void					resetJointsOnDetach(LLViewerObject *vo);      bool					jointIsRiggedTo(const std::string& joint_name);      bool					jointIsRiggedTo(const std::string& joint_name, const LLViewerObject *vo); -	void					clearAttachmentPosOverrides(); -	void					rebuildAttachmentPosOverrides(); -    void                    showAttachmentPosOverrides(bool verbose = false) const; -    void                    getAttachmentOverrideNames(std::set<std::string>& names) const; +	void					clearAttachmentOverrides(); +	void					rebuildAttachmentOverrides(); +    void                    showAttachmentOverrides(bool verbose = false) const; +    void                    getAttachmentOverrideNames(std::set<std::string>& pos_names,  +                                                       std::set<std::string>& scale_names) const;  	/*virtual*/ const LLUUID&	getID() const;  	/*virtual*/ void			addDebugText(const std::string& text); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index c9cd2fd27a..6d3e2e4a39 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4778,11 +4778,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)              if (rigged && pAvatarVO)              { -                pAvatarVO->addAttachmentPosOverridesForObject(vobj); +                pAvatarVO->addAttachmentOverridesForObject(vobj);  				if (pAvatarVO->isSelf())  				{                      bool verbose = true; -					pAvatarVO->showAttachmentPosOverrides(verbose); +					pAvatarVO->showAttachmentOverrides(verbose);  				}              } 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"  | 
