Beispiel #1
0
// --------------------------------------------------------------------------------------------
MStatus polyModifierCmd::processMeshNode( modifyPolyData& data )
// --------------------------------------------------------------------------------------------
{
	MStatus status = MS::kSuccess;

	// Declare our function sets. Use MFnDagNode here so
	// we can retrieve the parent transform.
	//
	MFnDagNode dagNodeFn;
	

	// Use the DAG path to retrieve our mesh shape node. 
	//
	data.meshNodeShape = fDagPath.node();
	dagNodeFn.setObject( data.meshNodeShape );

	// ASSERT: meshNodeShape node should have a parent transform!
	//
	MStatusAssert( (0 < dagNodeFn.parentCount()),
				   "0 < dagNodeFn.parentCount() -- meshNodeshape has no parent transform" );
	data.meshNodeTransform = dagNodeFn.parent(0);
	
	data.meshNodeDestPlug = dagNodeFn.findPlug( "inMesh" );
	data.meshNodeDestAttr = data.meshNodeDestPlug.attribute();



	return status;
}
void tLocatorMgr::scanScene(const float lframe__, const int sample__,
						  boost::shared_ptr< liqRibHT > &htable__,
						  int &count__,
						  MStatus &returnStatus__)
{
	CM_TRACE_FUNC("tLocatorMgr::scanScene("<<lframe__<<","<<sample__<<",htable__,count__,returnStatus__)");

	//[refactor 10] beg from scanScene()
	MItDag dagCoordSysIterator( MItDag::kDepthFirst, MFn::kLocator, &returnStatus__);

	for (; !dagCoordSysIterator.isDone(); dagCoordSysIterator.next()) 
	{
#if (Refactoring == 0)
		LIQ_CHECK_CANCEL_REQUEST;
#endif
		MDagPath path;
		MObject currentNode;
		currentNode = dagCoordSysIterator.item();
		MFnDagNode dagNode;
		dagCoordSysIterator.getPath( path );
		if(MS::kSuccess != returnStatus__) 
			continue;
		if(!currentNode.hasFn(MFn::kDagNode)) 
			continue;
		returnStatus__ = dagNode.setObject( currentNode );
		if(MS::kSuccess != returnStatus__) 
			continue;

		// scanScene: if it's a coordinate system then insert it into the hash table
		if( dagNode.typeName() == "liquidCoordSys" ) 
		{
			int coordType = 0;
			MPlug typePlug = dagNode.findPlug( "type", &returnStatus__ );
			if( MS::kSuccess == returnStatus__ ) 
				typePlug.getValue( coordType );

			bool useSamples( ( sample__ > 0 ) && isObjectMotionBlur( path ) );

			ObjectType mrttype = getMRTType(currentNode, coordType);
			ObjectType mrttype_shouldbe = ( coordType == 5 )? MRT_ClipPlane : MRT_Coord;
			if( mrttype != mrttype_shouldbe ){
				liquidMessage2(messageError, "mrttype[%d] should be %d", mrttype_shouldbe);
			}
			htable__->insert( path, 
				lframe__, 
				( useSamples )? sample__ : 0, 
				mrttype, //( coordType == 5 )? MRT_ClipPlane : MRT_Coord, 
				count__++ );
			continue;
		}
	}
	//[refactor 10] end from scanScene()
}
MStatus sgBDataCmd_key::importData()
{
	MStatus status;

	MTime::Unit currentUnit = MTime().unit();

	MPlugArray connections;

	sgObject_keyData& objectKeyData = m_objectKeyDataImport;
	MObject& oTarget = objectKeyData.oTargetNode;
	MDoubleArray& dArrTime = objectKeyData.dArrTime;
	MTime::Unit unit = (MTime::Unit)objectKeyData.unit;
	MFnDagNode fnNode = oTarget;

	MPlugArray targetPlugs;

	unsigned int numAttr = objectKeyData.namesAttribute.length();
	unsigned int lengthTime = dArrTime.length();

	for( unsigned int j=0; j<numAttr; j++ )
	{
		if( numAttr <= j ) break;
		MPlug targetPlug = fnNode.findPlug( objectKeyData.namesAttribute[j] );
		
		targetPlug.connectedTo( connections, true, false );
		if( connections.length() ){
			m_dgMod_connection.disconnect( connections[0], targetPlug );
			m_dgMod_delete.deleteNode( connections[0].node() );
		}
		m_dgMod_connection.doIt();
		m_dgMod_delete.doIt();

		MObject oAnimCurve = MFnAnimCurve().create( targetPlug );
		m_oArrKeyAfter.append( oAnimCurve );
		MFnAnimCurve fnAnimCurve( oAnimCurve );
		for( unsigned int k=0; k<lengthTime; k++ )
		{
			double& dTime  = dArrTime[k];
			double& dValue = objectKeyData.dArrValuesArray[ k*numAttr+j ];

			MTime mTime( dTime, unit );
			mTime.setUnit( currentUnit );
			fnAnimCurve.addKeyframe( mTime, dValue );
		}
	}

	return MS::kSuccess;
};
Beispiel #4
0
bool polyExporter::isVisible(MFnDagNode & fnDag, MStatus& status) 
//Summary:	determines if the given DAG node is currently visible
//Args   :	fnDag - the DAG node to check
//Returns:	true if the node is visible;		
//			false otherwise
{
	if(fnDag.isIntermediateObject())
		return false;

	MPlug visPlug = fnDag.findPlug("visibility", &status);
	if (MStatus::kFailure == status) {
		MGlobal::displayError("MPlug::findPlug");
		return false;
	} else {
		bool visible;
		status = visPlug.getValue(visible);
		if (MStatus::kFailure == status) {
			MGlobal::displayError("MPlug::getValue");
		}
		return visible;
	}
}
MStatus sgBDataCmd_key::setObjectKeyDataDefault( sgObject_keyData& objectKeyData, const MDagPath& dagPathTarget, bool bMatrixType )
{
	MStatus status;
	objectKeyData.oTargetNode = dagPathTarget.node();
	objectKeyData.numAttr = 0;
	objectKeyData.namesAttribute.clear();
	objectKeyData.lengthTime = 0;
	objectKeyData.dArrTime.clear();
	objectKeyData.dArrValuesArray.clear();

	MFnDagNode fnDagNode = dagPathTarget;

	MPlugArray plugArrTransform;
	MPlugArray plugArrVis;

	plugArrTransform.append( fnDagNode.findPlug( "tx" ) );
	plugArrTransform.append( fnDagNode.findPlug( "ty" ) );
	plugArrTransform.append( fnDagNode.findPlug( "tz" ) );
	plugArrTransform.append( fnDagNode.findPlug( "rx" ) );
	plugArrTransform.append( fnDagNode.findPlug( "ry" ) );
	plugArrTransform.append( fnDagNode.findPlug( "rz" ) );
	plugArrTransform.append( fnDagNode.findPlug( "sx" ) );
	plugArrTransform.append( fnDagNode.findPlug( "sy" ) );
	plugArrTransform.append( fnDagNode.findPlug( "sz" ) );

	plugArrVis.append( fnDagNode.findPlug( "v" ) );

	if( bMatrixType )
	{
		if( plugsHasConnection( plugArrVis ) )
		{
			objectKeyData.numAttr++;
			objectKeyData.namesAttribute.append( "visibility" );
		}
		if( plugsHasConnection( plugArrTransform ) )
		{
			objectKeyData.numAttr += 9;
			objectKeyData.namesAttribute.append( "translateX" );
			objectKeyData.namesAttribute.append( "translateY" );
			objectKeyData.namesAttribute.append( "translateZ" );
			objectKeyData.namesAttribute.append( "rotateX" );
			objectKeyData.namesAttribute.append( "rotateY" );
			objectKeyData.namesAttribute.append( "rotateZ" );
			objectKeyData.namesAttribute.append( "scaleX" );
			objectKeyData.namesAttribute.append( "scaleY" );
			objectKeyData.namesAttribute.append( "scaleZ" );
		}
	}
	else
	{
		MPlugArray plugArr;
		for( unsigned int j=0; j< plugArrTransform.length(); j++ )
		{
			MPlug& plug = plugArrTransform[j];

			plug.connectedTo( plugArr, true, false );
			if( !plugArr.length() )
			{
				MPlug plugParent = plug.parent( &status );
				if( !status ) continue;
				plugParent.connectedTo( plugArr, true, false );
				if( !plugArr.length() ) continue;
			}
			objectKeyData.numAttr++;
			objectKeyData.namesAttribute.append( MFnAttribute( plug.attribute() ).name() );
		}
		plugArrVis[0].connectedTo( plugArr, true, false );
		if( plugArr.length() )
		{
			objectKeyData.numAttr++;
			objectKeyData.namesAttribute.append( MFnAttribute( plugArrVis[0].attribute() ).name() );
		}
	}
	objectKeyData.dArrValuesArray.clear();
	return MS::kSuccess;
}
Beispiel #6
0
MStatus polyModifierCmd::processUpstreamNode( modifyPolyData& data )
{
	MStatus status = MS::kSuccess;

	// Declare our function sets - Although dagNodeFn derives from depNodeFn, we need
	//							   both since dagNodeFn can only refer to DAG objects.
	//							   We will use depNodeFn for all times other when dealing
	//							   with the DAG.
	//
	MFnDependencyNode	depNodeFn;
	MFnDagNode			dagNodeFn;

	// Use the selected node's plug connections to find the upstream plug.
	// Since we are looking at the selected node's inMesh attribute, it will
	// always have only one connection coming in if it has history, and none
	// otherwise.
	//
	// If there is no history, copy the selected node and place it ahead of the
	// modifierNode as the new upstream node so that the modifierNode has an
	// input mesh to operate on.
	//
	MPlugArray tempPlugArray;

	if( fHasHistory )
	{
		// Since we have history, look for what connections exist on the
		// meshNode "inMesh" plug. "inMesh" plugs should only ever have one
		// connection.
		//
		data.meshNodeDestPlug.connectedTo( tempPlugArray, true, false);

		// ASSERT: Only one connection should exist on meshNodeShape.inMesh!
		//
		MStatusAssert( (tempPlugArray.length() == 1),
					   "tempPlugArray.length() == 1 -- 0 or >1 connections on meshNodeShape.inMesh" );
		data.upstreamNodeSrcPlug = tempPlugArray[0];

		// Construction history only deals with shapes, so we can grab the
		// upstreamNodeShape off of the source plug.
		//
		data.upstreamNodeShape = data.upstreamNodeSrcPlug.node();
		depNodeFn.setObject( data.upstreamNodeShape );
		data.upstreamNodeSrcAttr = data.upstreamNodeSrcPlug.attribute();

		// Disconnect the upstream node and the selected node, so we can
		// replace them with our own connections below.
		//
		fDGModifier.disconnect( data.upstreamNodeSrcPlug,
								data.meshNodeDestPlug );

	}
	else	// No History (!fHasHistory)
	{
		// Use the DAG node function set to duplicate the shape of the meshNode.
		// The duplicate method will return an MObject handle to the transform
		// of the duplicated shape, so traverse the dag to locate the shape. Store
		// this duplicate shape as our "upstream" node to drive the input for the 
		// modifierNode.
		//
		dagNodeFn.setObject( data.meshNodeShape );
		data.upstreamNodeTransform = dagNodeFn.duplicate( false, false );
		dagNodeFn.setObject( data.upstreamNodeTransform );

		// Ensure that our upstreamNode is pointing to a shape.
		//
		MStatusAssert( (0 < dagNodeFn.childCount()),
					   "0 < dagNodeFn.childCount() -- Duplicate meshNode transform has no shape." );
		data.upstreamNodeShape = dagNodeFn.child(0);

		// Re-parent the upstreamNodeShape under our original transform
		//
		status = fDagModifier.reparentNode( data.upstreamNodeShape, data.meshNodeTransform );
		MCheckStatus( status, "reparentNode" );

		// Perform the DAG re-parenting
		// 
		// Note: This reparent must be performed before the deleteNode() is called.
		//		 See polyModifierCmd.h (see definition of fDagModifier) for more details.
		//
		status = fDagModifier.doIt();
		MCheckStatus( status, "fDagModifier.doIt()" );

		// Mark the upstreamNodeShape (the original shape) as an intermediate object
		// (making it invisible to the user)
		//
		dagNodeFn.setObject( data.upstreamNodeShape );
		dagNodeFn.setIntermediateObject( true );

		// Get the upstream node source attribute
		//
		data.upstreamNodeSrcAttr = dagNodeFn.attribute( "outMesh" );
		data.upstreamNodeSrcPlug = dagNodeFn.findPlug( "outMesh", &status );

		// Remove the duplicated transform node (clean up)
		//
		status = fDagModifier.deleteNode( data.upstreamNodeTransform );
		MCheckStatus( status, "deleteNode" );

		// Perform the DAG delete node
		//
		// Note: This deleteNode must be performed after the reparentNode() method is
		//		 completed. See polyModifierCmd.h (see definition of fDagModifier) for
		//		 details.
		//
		status = fDagModifier.doIt();
		MCheckStatus( status, "fDagModifier.doIt()" );

		// Cache the DAG path to the duplicate shape
		//
		dagNodeFn.getPath( fDuplicateDagPath );
	}

	return status;
}