//----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- MStatus CVsSkinnerCmd::FindSkinnerNodesInHierarchy( const MDagPath &iDagPath, MSelectionList &oList ) { MStatus retVal( MS::kFailure ); MDagPath rDagPath( iDagPath ); // Root dag path while ( rDagPath.length() > 1U ) { rDagPath.pop(); } MDagPath mDagPath; MDagPath sDagPath; uint nShapes; MItDag dIt; if ( rDagPath.length() ) { dIt.reset( rDagPath ); } for ( ; !dIt.isDone(); dIt.next() ) { if ( !dIt.getPath( mDagPath ) ) continue; mDagPath.numberOfShapesDirectlyBelow( nShapes ); for ( uint i( 0U ); i != nShapes; ++i ) { sDagPath = mDagPath; sDagPath.extendToShapeDirectlyBelow( i ); if ( !IsSkinnerNode( sDagPath ) ) continue; oList.add( sDagPath, MObject::kNullObj, true ); retVal = MS::kSuccess; } if ( !ConnectedToSkinnerNode( mDagPath, sDagPath ) ) continue; oList.add( sDagPath, MObject::kNullObj, true ); retVal = MS::kSuccess; } return retVal; }
bool HesperisIO::GetCurves(const MDagPath &root, MDagPathArray & dst) { MStatus stat; MItDag iter; iter.reset(root, MItDag::kDepthFirst, MFn::kNurbsCurve); for(; !iter.isDone(); iter.next()) { MDagPath apath; iter.getPath( apath ); if(IsCurveValid(apath)) { MFnDagNode fdag(apath); if(!fdag.isIntermediateObject()) dst.append(apath); } } return dst.length() > 0; }
MBoundingBox AbcWriteJob::getBoundingBox(double iFrame, const MMatrix & eMInvMat) { MStatus status; MBoundingBox curBBox; if (iFrame == mFirstFrame) { // Set up bbox shape map in the first frame. // If we have a lot of transforms and shapes, we don't need to // iterate them for each frame. MItDag dagIter; for (dagIter.reset(mCurDag); !dagIter.isDone(); dagIter.next()) { MObject object = dagIter.currentItem(); MDagPath path; dagIter.getPath(path); // short-circuit if the selection flag is on but this node is not in the // active selection // MGlobal::isSelected(ob) doesn't work, because DG node and DAG node is // not the same even if they refer to the same MObject if (mArgs.useSelectionList && !mSList.hasItem(path)) { dagIter.prune(); continue; } MFnDagNode dagNode(path, &status); if (status == MS::kSuccess) { // check for riCurves flag for flattening all curve object to // one curve group MPlug riCurvesPlug = dagNode.findPlug("riCurves", &status); if ( status == MS::kSuccess && riCurvesPlug.asBool() == true) { MBoundingBox box = dagNode.boundingBox(); box.transformUsing(path.exclusiveMatrix()*eMInvMat); curBBox.expand(box); // Prune this curve group dagIter.prune(); // Save children paths std::map< MDagPath, util::ShapeSet, util::cmpDag >::iterator iter = mBBoxShapeMap.insert(std::make_pair(mCurDag, util::ShapeSet())).first; if (iter != mBBoxShapeMap.end()) (*iter).second.insert(path); } else if (object.hasFn(MFn::kParticle) || object.hasFn(MFn::kMesh) || object.hasFn(MFn::kNurbsCurve) || object.hasFn(MFn::kNurbsSurface) ) { if (util::isIntermediate(object)) continue; MBoundingBox box = dagNode.boundingBox(); box.transformUsing(path.exclusiveMatrix()*eMInvMat); curBBox.expand(box); // Save children paths std::map< MDagPath, util::ShapeSet, util::cmpDag >::iterator iter = mBBoxShapeMap.insert(std::make_pair(mCurDag, util::ShapeSet())).first; if (iter != mBBoxShapeMap.end()) (*iter).second.insert(path); } } } } else { // We have already find out all the shapes for the dag path. std::map< MDagPath, util::ShapeSet, util::cmpDag >::iterator iter = mBBoxShapeMap.find(mCurDag); if (iter != mBBoxShapeMap.end()) { // Iterate through the saved paths to calculate the box. util::ShapeSet& paths = (*iter).second; for (util::ShapeSet::iterator pathIter = paths.begin(); pathIter != paths.end(); pathIter++) { MFnDagNode dagNode(*pathIter, &status); if (status == MS::kSuccess) { MBoundingBox box = dagNode.boundingBox(); box.transformUsing((*pathIter).exclusiveMatrix()*eMInvMat); curBBox.expand(box); } } } } return curBBox; }
//----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- MSelectionList CVsSkinnerCmd::DoNewVolumes( const MDagPath &skinnerPath, const MSelectionList &skeletonList ) { MSelectionList retList; const bool optSelected( m_undo.ArgDatabase().isFlagSet( kOptSelected ) ); MSelectionList optSelection; m_undo.ArgDatabase().getObjects( optSelection ); // TODO: Maybe some fancier logic to only create volumes on joints that make sense? // Perhaps the ol' has children but no shapes gag? Watch out for vstHelperBones! MDagPath mDagPath; for ( MItSelectionList sIt( optSelection ); !sIt.isDone(); sIt.next() ) { if ( sIt.itemType() == MItSelectionList::kDagSelectionItem && sIt.getDagPath( mDagPath ) && mDagPath.hasFn( MFn::kTransform ) ) { if ( optSelected ) { MObject cObj( DoNewVolume( skinnerPath, mDagPath ) ); if ( cObj.isNull() ) { mwarn << "Couldn't create new volume on " << skinnerPath.partialPathName() << " using " << mDagPath.partialPathName() << " as a parent" << std::endl; } else { retList.add( skinnerPath, cObj, true ); } } else { MItDag dIt; for ( dIt.reset( mDagPath ); !dIt.isDone(); dIt.next() ) { dIt.getPath( mDagPath ); if ( mDagPath.childCount() ) { uint nShapes( 0 ); mDagPath.numberOfShapesDirectlyBelow( nShapes ); if ( nShapes == 0U || mDagPath.hasFn( MFn::kJoint ) ) { MObject cObj( DoNewVolume( skinnerPath, mDagPath ) ); if ( cObj.isNull() ) { mwarn << "Couldn't create new volume on " << skinnerPath.partialPathName() << " using " << mDagPath.partialPathName() << " as a parent" << std::endl; } else { retList.add( skinnerPath, cObj, true ); } } } } } } } return retList; }