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"
	}
}
Exemple #4
0
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();
		}
	}
}