If you look at the "<maya install>/include/maya/MPxDeformerNode.h" you can
see public attributes that your class will inherit.

*       **// Inherited attributes**     **/// input attribute,
multi** **static** MObject input;**     **/// input geometry
attribute**     **static** MObject inputGeom;** **/// input group id
attribute**     **static** MObject groupId;**   **/// geometry output
attribute**     **static** MObject outputGeom;**        **/// weight list
attribute, multi**      **static** MObject weightList;**        **/// weight
attribute, multi**      **static** MObject weights;**   **/// envelope
attribute**     **static** MObject envelope;*

I would guess that they would follow the same name convention in swig
wrappers.  I had the understanding that the query to the
DataBlock::inputArrayValue  again would only require that data structure to
be rebuilt. This wouldn't actually mark any input dependancey node dirty
would it? Also if you were accessing a different part of the dataBlock for
instance a compare mesh that wasn't in the input multi it would be fine
right, just having the input multi rebuilt is a waste?

On Thu, Feb 12, 2009 at 10:04 AM, jasonosipa <[email protected]> wrote:

>
> This is a re: to one post up, Chad and I obviously did a little simul-
> posting :)
>
> On Feb 12, 10:03 am, jasonosipa <[email protected]> wrote:
> > Sure - logically I get that, too, but tactically, I don't, and that's
> > the problem.
> >
> > Usually, in non-deformer town, to pull information about a connected
> > object out of the dataBlock, you'd need to have declared an MObject
> > for the attribute in the class, then created and added the attribute
> > in your init, only then do you know what you can even get at in the
> > compute:
> >
> > class myNode():
> >   myAttr = om.MObject
> >
> >   def compute( self, plug, dataBlock ):
> >     sourceMesh = dataBlock.inputValue( myNode.myAttr ).asMesh()
> >     #and away we go...
> >
> > def nodeInit():
> >   tAttr = om.MFnTypedAttribute()
> >   myNode.myAttr = tAttr.create( 'somethingCool', 'sc',
> > om.MFnData.kMesh )
> >   myNode.addAttribute( myNode.myAttr )
> >
> > But, in a deformer some of the connecting and setup happens a little
> > smoke-and-mirrors, and (it would seem) I don't have access to the
> > mesh, to make it an MFnMesh, to be able to run
> > MFnMesh.getVertexNormal, OR I'll have to get that info another way,
> > which is the core of my question.  To get at the mesh in the compute
> > example I just gave, I have "dataBlock.inputValue
> > ( myNode.myAttr ).asMesh()". Now, that's only possible because I
> > created and added, and can ask for the inputValue of myNode.myAttr by
> > name.  If, as the deformer does, attributes have been created/
> > connected "under the hood", how do I access them?  Essentially, I'm
> > trying to do "dataBlock.inputValue( myNode.????? ).asMesh )",
> > where ????? is some access through the tweak and groupParts that are/
> > were created, or there is some more magic to dataBlock eluding me.
> >
> > There has to be a way, in MPxDeformer, to get more than just
> > positions.  I can't imagine that Maya would provide a 'basic' deformer
> > with MPxDeformer that couldn't do a bloody thing besides read ONLY
> > positions, nothing else, then tangle them, then write them.  Seems
> > kinda silly and wildly limited.  I'm sure I'm missing something, some
> > other access to the normals...
> >
> > So, phrased another way - "How do I get normals in a deformer? ( def
> > deform(...): )"
> >
> > I hope this clarifies the pretzel a little more.
> >
> > On Feb 12, 9:18 am, Matthew Chapman <[email protected]> wrote:
> >
> > > Jason,
> >
> > > This shoud work in the deform as well. Even though the deform is passed
> some
> > > extra objects it still has a standard dataBlock that you can pull any
> data
> > > from.  I think the reason why the deform is setup this way is because
> the
> > > MItGeometry is only passed the components that are in the "deform
> > > set"/"group parts". This  guarantees  **that only the components that
> need
> > > it get deformed. The MitGeom should be used to set the output back into
> the
> > > data block, but anything can be pulled out of the data block for
> querying.
> >
> > > Matt
> >
> > > srcMesh     = dataBlock.inputValue( <node>.aSourceShape ).asMesh()
> > > srcFnMesh = om.MFnMesh( srcMesh )
> > > srcVerts     = om.MPointArray()
> > > srcFnMesh.getPoints( srcVerts, om.MSpace.kWorld )
> > > vertCount   = srcVerts.length()
> >
> > > getVector   = om.MVector()
> >
> > > for i in range( 0, vertCount ):
> > >  srcFnMesh.getVertexNormal( i,
> > >                                             False,
> > >                                             getVector,
> > >                                             om.MSpace.kWorld )
> >
> > > On Thu, Feb 12, 2009 at 7:59 AM, jasonosipa <[email protected]>
> wrote:
> >
> > > > I have a pretzel I need some cheese and mustard for...
> >
> > > > So, I am trying to take a node and turn it into a deformer.  The
> > > > MPxDeformer route, for the most part looks/feels significantly
> cleaner
> > > > and easier to deal with, but I've run into this one weird thing.  I
> > > > don't know how to get all the information I need in the deform def,
> > > > specifically a vertex normal.  A deform gets this stuff:
> >
> > > > def deform( self, dataBlock, itGeo, localToWorldMatrix, mIndex ):
> >
> > > > And a compute gets this stuff:
> >
> > > > def compute( self, plug, dataBlock ):
> >
> > > > But the dataBlock for the compute has attributes *I* set up to get
> the
> > > > meshes connected, whereas in the dataBlock for the deform, there are
> > > > important attributes "magically" added that I'm not sure how to
> > > > interface with.  So, I've got the deform def working, minus one thing
> > > > - I need to do get at vertex normals, but am missing key information.
> > > > The way I did that in a compute def was (condensed to only the
> > > > relevant bits):
> >
> > > > srcMesh     = dataBlock.inputValue( <node>.aSourceShape ).asMesh()
> > > > srcFnMesh = om.MFnMesh( srcMesh )
> > > > srcVerts     = om.MPointArray()
> > > > srcFnMesh.getPoints( srcVerts, om.MSpace.kWorld )
> > > > vertCount   = srcVerts.length()
> >
> > > > getVector   = om.MVector()
> >
> > > > for i in range( 0, vertCount ):
> > > >  srcFnMesh.getVertexNormal( i,
> > > >                                             False,
> > > >                                             getVector,
> > > >                                             om.MSpace.kWorld )
> >
> > > > But I can't seem to figure out any way to set up an MFnMesh object to
> > > > allow this to work in the deform def, like it did in the compute,
> > > > because you're already passed a MItGeometry iterator (itGeo), from
> > > > which it seems tricky to find a mesh to work with.  In a compute, you
> > > > can get at attributes like a source mesh because it was defined by
> you
> > > > in the init, but in a deform's datablock, certain thing are "just
> > > > magically there".  How does one get at the *now orig* shape to set up
> > > > an MFnMesh with?
> >
> > > > OR is there some other trick to getting at normal information while
> > > > working in an MItGeometry object (looks like all you can get is
> > > > position...)
> >
> > > > Thanks!
> >
> >
> >
>

--~--~---------~--~----~------------~-------~--~----~
Yours,
Maya-Python Club Team.
-~----------~----~----~----~------~----~------~--~---

Reply via email to