コード例 #1
0
//ModifyObject will do all the work in a full modifier
//This includes casting objects to their correct form, doing modifications
//changing their parameters, etc
void ProjectionHolderUVW::ModifyObject(TimeValue t, ModContext &mc, ObjectState * os, INode *node) 
{
	ObjectWrapper object;
	object.Init(t,*os,false, ObjectWrapper::allEnable, ObjectWrapper::triObject);

	if( object.IsEmpty() )
		return;

	// Check topology
	if( object.NumFaces() != mData.mFaces.Count() )
		return;
	
	for( int i=0; i<object.NumFaces(); i++ ) {
		GenFace face = object.GetFace(i);
		if( face.numVerts != mData.mFaces[i].numVerts )
			return;
	}

	if( mData.miMapChannel != VERTEX_CHANNEL_NUM ) {
		// Check Channel Support
		if( !object.GetChannelSupport(mData.miMapChannel) ) 
			object.SetChannelSupport( mData.miMapChannel, true );

		object.SetNumMapVerts( mData.miMapChannel, mData.mP3Data.Count() );

		for( int i=0; i<mData.mP3Data.Count(); i++ )
			object.SetMapVert( mData.miMapChannel, i, mData.mP3Data[i] );

		for( int i=0; i<mData.mFaces.Count(); i++ ) {
			object.SetMapFace( mData.miMapChannel, i, mData.mFaces[i] );
			// Material ID Support
			if( mData.mDoMaterialIDs )
				object.SetMtlID(i, mData.mMatID[i] );
		}

		os->obj->PointsWereChanged();
	}
	else {
		object.SetNumVerts( mData.mP3Data.Count() );

		for( int i=0; i<mData.mP3Data.Count(); i++ )
			object.SetVert( i, mData.mP3Data[i] );

		for( int i=0; i<mData.mFaces.Count(); i++ ) {
			object.SetFace( i, mData.mFaces[i] );
			// Material ID Support
			if( mData.mDoMaterialIDs )
				object.SetMtlID(i, mData.mMatID[i] );
		}

		os->obj->PointsWereChanged();
		if( object.Type() == ObjectWrapper::polyObject ) {
			MNMesh *poly = object.GetPolyMesh();
			if( poly )
				poly->FillInMesh();
		}
		else if( object.Type() == ObjectWrapper::triObject ) {
			Mesh *mesh = object.GetTriMesh();
			if( mesh )
				mesh->InvalidateTopologyCache();
		}
	}

	Interval iv;
	iv = FOREVER;
	iv &= mData.mSrcInterval;

	if( mData.miMapChannel > 0 ) 
		iv &= os->obj->ChannelValidity (t, TEXMAP_CHAN_NUM);
	else if( mData.miMapChannel == VERTEX_CHANNEL_NUM ) {
		iv &= os->obj->ChannelValidity(t,GEOM_CHAN_NUM);
		iv &= os->obj->ChannelValidity(t,TOPO_CHAN_NUM);
	}
	else
		iv &= os->obj->ChannelValidity(t,VERT_COLOR_CHAN_NUM);

	if( mData.miMapChannel > 0 ) 
		os->obj->UpdateValidity(TEXMAP_CHAN_NUM,iv);
	else if( mData.miMapChannel == VERTEX_CHANNEL_NUM ) {
		os->obj->UpdateValidity(GEOM_CHAN_NUM,iv);	
		os->obj->UpdateValidity(TOPO_CHAN_NUM,iv);	
	}
	else
		os->obj->UpdateValidity(VERT_COLOR_CHAN_NUM,iv);
}