MDagPath Object::getDagPath(MStatus & status) const { bool isValid = m_dagPath.isValid(&status); if (!status) { status.perror("MDagPath::isValid"); return m_dagPath; } if (!isValid) { if (m_object.isNull()) { status = MStatus::kInvalidParameter; return MDagPath(); } MDagPath dagPath; if (!(status = MDagPath::getAPathTo(m_object, dagPath))) { status.perror("MDagPath::getAPathTo"); return MDagPath(); } return dagPath; } return m_dagPath; }
// Handle node attr change void geomteryChangedCallback( MNodeMessage::AttributeMessage msg, MPlug & plug, MPlug & otherPlug, void* clientData) { GeometryItem *item = (GeometryItem *)clientData; if (item) { MMessage::removeCallback( item->m_objectChangeMonitor ); item->m_objectChangeMonitor = 0; item->m_objectPath = MDagPath(); // Assign in valid dag path to mark as "bad" } }
// Handle node dirty changes void geometryDirtyCallback( void* clientData ) { GeometryItem *item = (GeometryItem *)clientData; if (item) { MMessage::removeCallback( item->m_objectDirtyMonitor ); item->m_objectDirtyMonitor = 0; item->m_objectPath = MDagPath(); // Assign in valid dag path to mark as "bad" } }
MStatus DeleteIntermediateObjects(MDagPath& path) { MStatus status; MDagPath pathMesh(path); while (GetShapeNode(pathMesh, true) == MS::kSuccess) { status = MGlobal::executeCommand("delete " + pathMesh.partialPathName()); CHECK_MSTATUS_AND_RETURN_IT(status); pathMesh = MDagPath(path); } return MS::kSuccess; }
MStatus SelectRingToolCmd2::doIt( const MArgList &args ) { //MGlobal::displayInfo( "doIt" ); MStatus stat; MGlobal::getActiveSelectionList( prevSel ); // Initialize to default values selEdges = true; selFaces = false; selVertices = false; selEdgeObject = MDagPath(); selEdgeComp = MObject::kNullObj; listAdjust = MGlobal::kReplaceList; selType = RING; // Get the options from the command line MArgDatabase argData( syntax(), args, &stat ); if( !stat ) return stat; if( argData.isFlagSet( edgeFlag ) ) { MString edgeSpec; argData.getFlagArgument( edgeFlag, 0, edgeSpec ); MSelectionList sel; sel.add( edgeSpec ); sel.getDagPath( 0, selEdgeObject, selEdgeComp ); //MFnSingleIndexedComponent si( selEdgeComp ); //MGlobal::displayInfo( MString("doing stuff on ") + selEdgeObject.fullPathName() + " " + si.element(0) ); } if( argData.isFlagSet( selEdgesFlag ) ) argData.getFlagArgument( selEdgesFlag, 0, selEdges ); if( argData.isFlagSet( selFacesFlag ) ) argData.getFlagArgument( selFacesFlag, 0, selFaces ); if( argData.isFlagSet( selVerticesFlag ) ) argData.getFlagArgument( selVerticesFlag, 0, selVertices ); if( argData.isFlagSet( listAdjustFlag ) ) { unsigned value; argData.getFlagArgument( listAdjustFlag, 0, value ); listAdjust = MGlobal::ListAdjustment( value ); } if( argData.isFlagSet( selTypeFlag ) ) argData.getFlagArgument( selTypeFlag, 0, selType ); return redoIt(); }
// Handle node delete void geometryDeleteCallback( MObject &node, MDGModifier& modifier, void* clientData ) { GeometryItem *item = (GeometryItem *)clientData; if (item) { MMessage::removeCallback( item->m_objectDeleteMonitor ); item->m_objectDeleteMonitor = 0; item->m_objectPath = MDagPath(); // Assign in valid dag path to mark as "bad" } }
void DX11ResourceManager::clearResources(bool onlyInvalidItems, bool clearShaders) { GeometryItemList::const_iterator git, end_git; end_git = m_geometryItemList.end(); for (git = m_geometryItemList.begin(); git != end_git; git++) { GeometryItem *item = *git; if (item) { if (!onlyInvalidItems || (onlyInvalidItems && !(item->m_objectPath.isValid() ))) { if (item->m_objectGeometry) { delete item->m_objectGeometry; item->m_objectGeometry = NULL; } item->m_objectPath = MDagPath(); // Assign invalid dag path // Kill the delete monitor if (item->m_objectDeleteMonitor) { MMessage::removeCallback( item->m_objectDeleteMonitor ); item->m_objectDeleteMonitor = 0; } // Kill the attr changed monitor if (item->m_objectChangeMonitor) { MMessage::removeCallback( item->m_objectChangeMonitor ); item->m_objectChangeMonitor = 0; } // Kill node dirty monitor if (item->m_objectDirtyMonitor) { MMessage::removeCallback( item->m_objectDirtyMonitor ); item->m_objectDirtyMonitor = 0; } } } } if (!onlyInvalidItems) m_geometryItemList.clear(); TextureItemList::const_iterator tit, end_tit; end_tit = m_textureItemList.end(); for (tit = m_textureItemList.begin(); tit != end_tit; tit++) { TextureItem *item = *tit; if (item) { if (!onlyInvalidItems || (onlyInvalidItems && !(item->m_mayaNode.isValid() ))) { if (item->m_texture) { delete item->m_texture; item->m_texture = NULL; } item->m_mayaNode = MObject::kNullObj; // Kill the delete monitor if (item->m_objectDeleteMonitor) { MMessage::removeCallback( item->m_objectDeleteMonitor ); item->m_objectDeleteMonitor = 0; } // Kill the attr changed monitor if (item->m_objectChangeMonitor) { MMessage::removeCallback( item->m_objectChangeMonitor ); item->m_objectChangeMonitor = 0; } } } } if (!onlyInvalidItems) m_textureItemList.clear(); if (clearShaders) { // Clean up surface effects list { SurfaceEffectItemList::const_iterator eit, end_eit; end_eit = m_SurfaceEffectItemList.end(); for (eit = m_SurfaceEffectItemList.begin(); eit != end_eit; eit++) { SurfaceEffectItem *item = eit->second; if (item) { if (item->fVertexShader) item->fVertexShader->Release(); if (item->fPixelShader) item->fPixelShader->Release(); if (item->fInputLayout) item->fInputLayout->Release(); delete item; } } m_SurfaceEffectItemList.clear(); } } }