From f9a35fc4c622cf5b151900dd4590818d965a506b Mon Sep 17 00:00:00 2001 From: prep <prep@lindenlab.com> Date: Mon, 15 Nov 2010 14:02:03 -0500 Subject: Implemented support for getting at the child translational element if the SID fails to resolved. --- indra/newview/llfloatermodelpreview.cpp | 85 ++++++++++++++++++++------------- indra/newview/llfloatermodelpreview.h | 2 + indra/newview/llvovolume.cpp | 3 +- 3 files changed, 55 insertions(+), 35 deletions(-) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 1c73a6cb31..a37469422d 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1424,41 +1424,49 @@ void LLModelLoader::run() char str[64]={0}; sprintf(str,"./%s",(*jointIt).second.c_str() ); //llwarns<<"Joint "<< str <<llendl; + + //Setup the resolver + daeSIDResolver resolver( pSkeletonRootNode, str ); + + //Look for the joint + domNode* pJoint = daeSafeCast<domNode>( resolver.getElement() ); + if ( pJoint ) + { + //Pull out the translate id and store it in the jointTranslations map + daeSIDResolver jointResolver( pJoint, "./translate" ); + domTranslate* pTranslate = daeSafeCast<domTranslate>( jointResolver.getElement() ); + + LLMatrix4 workingTransform; + + //Translation via SID + if ( pTranslate ) + { + domFloat3 jointTrans = pTranslate->getValue(); + LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] ); + workingTransform.setTranslation( singleJointTranslation ); + } + else + { + //Translation via child from element + daeElement* pTranslateElement = getChildFromElement( pJoint, "translate" ); + if ( pTranslateElement && pTranslateElement->typeID() != domTranslate::ID() ) + { + llwarns<< "The found element is not a translate node" <<llendl; + missingID = true; + } + else + { + domTranslate* pTranslateChild = dynamic_cast<domTranslate*>( pTranslateElement ); + domFloat3 translateChild = pTranslateChild->getValue(); + LLVector3 singleJointTranslation( translateChild[0], translateChild[1], translateChild[2] ); + workingTransform.setTranslation( singleJointTranslation ); + } + } + //Store the joint transform w/respect to it's name. + jointTransforms[(*jointIt).second.c_str()] = workingTransform; + } - //Setup the resolver - daeSIDResolver resolver( pSkeletonRootNode, str ); - //Look for the joint - domNode* pJoint = daeSafeCast<domNode>(resolver.getElement()); - if ( pJoint ) - { - //Pull out the translate id and store it in the jointTranslations map - daeSIDResolver jointResolver( pJoint, "./translate" ); - domTranslate* pTranslate = daeSafeCast<domTranslate>( jointResolver.getElement() ); - - LLMatrix4 workingTransform; - - //Translation - if ( pTranslate ) - { - domFloat3 jointTrans = pTranslate->getValue(); - LLVector3 singleJointTranslation( jointTrans[0], jointTrans[1], jointTrans[2] ); - workingTransform.setTranslation( singleJointTranslation ); - } - else - { - missingID = true; - llwarns<< "No translation sid!" << llendl; - } - //Store the joint transform w/respect to it's name. - jointTransforms[(*jointIt).second.c_str()] = workingTransform; - - } - else - { - missingID = true; - llwarns<< "Missing joint." << llendl; - } } //If anything failed in regards to extracting the skeleton, joints or translation id, @@ -1759,6 +1767,17 @@ void LLModelLoader::run() mPreview->loadModelCallback(mLod); } } + +daeElement* LLModelLoader::getChildFromElement( daeElement* pElement, std::string const & name ) +{ + daeElement* pChildOfElement = pElement->getChild( name.c_str() ); + if ( pChildOfElement ) + { + return pChildOfElement; + } + llwarns<< "Could not find a child [" << name << "] for the element: \"" << pElement->getAttribute("id") << "\"" << llendl; + return NULL; +} void LLModelLoader::processElement(daeElement* element) { diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index a7e87ba9a1..e58596449b 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -101,6 +101,8 @@ public: LLImportMaterial profileToMaterial(domProfile_COMMON* material); std::string getElementLabel(daeElement *element); LLColor4 getDaeColor(daeElement* element); + + daeElement* getChildFromElement( daeElement* pElement, std::string const & name ); //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/llvovolume.cpp b/indra/newview/llvovolume.cpp index 10b7816caf..fe11570cf6 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4086,8 +4086,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) { pAvatarVO->setPelvisOffset( true, jointPos ); //Trigger to rebuild viewer AV - pelvisGotSet = true; - //pAvatarVO->setPosition( pAvatarVO->getCharacterPosition() + jointPos ); + pelvisGotSet = true; } } else -- cgit v1.2.3