Search code examples
c++pointersmayamaya-api

Create a pointer to a MFnMesh


I am trying to create function that receive a MFnMesh pointer and do things on it.

The problem is that I cannot convert my MFnMesh to a pointer, I think the problem is not only on this class but on MFnBaseClass because I get this error.

/usr/autodesk/maya2015-x64/include/maya/MFnBase.h:168:14: error: ‘MFnMesh* MFnMesh::operator&() const’ is private
   MFnClass * operator& () const
              ^
/usr/autodesk/maya2015-x64/include/maya/MFnDagNode.h:237:2: note: in expansion of macro ‘declareMinimalMFn’
  declareMinimalMFn( MFnClass );          \
  ^
/usr/autodesk/maya2015-x64/include/maya/MFnMesh.h:243:2: note: in expansion of macro ‘declareDagMFn’
  declareDagMFn(MFnMesh, MFnDagNode);
  ^
/home/k.masson/Documents/maya/km_extendedColorSet/src/km_particlesToColorSet.cpp:159:9: error: within this context
   test(&meshFn);
         ^

Here is the function test which is in somefile.h and included in the file which call the function.

void test(MFnMesh * meshFn){
  MStatus status = MS::kSuccess;
  MString csName("YOLOSWAQDAZD");
  status = meshFn->createColorSetDataMesh(csName);
  MCheckStatus(status,"Error creating new color set");
}

And here is what I do before calling the test function.

// Get the out mesh data
        MDataHandle outMeshHandle = data.outputValue(aOutGeometry, &status);
        MCheckStatus(status,"ERROR getting aOutGeometry");

        // Copy the in mesh to the output
        outMeshHandle.copy(inMeshData);

        // Create a function set for the out mesh
        MFnMesh meshFn(outMeshHandle.asMesh());
        test(&meshFn);

I didn't found any way to convert my MFnMesh to a pointer so I tried to directly call it as an object and not a pointer like this.

test(meshFn);

void test(MFnMesh meshFn){
  MStatus status = MS::kSuccess;
  MString csName("YOLOSWAQDAZD");
  status = meshFn.createColorSetDataMesh(csName);
  MCheckStatus(status,"Error creating new color set");
}

And I get this :

/usr/autodesk/maya2015-x64/include/maya/MFnMesh.h:243:16: error: ‘MFnMesh::MFnMesh(const MFnMesh&)’ is private
  declareDagMFn(MFnMesh, MFnDagNode);
                ^
/usr/autodesk/maya2015-x64/include/maya/MFnBase.h:166:9: note: in definition of macro ‘declareMinimalMFn’
         MFnClass( const MFnClass &rhs );                            \
         ^
/usr/autodesk/maya2015-x64/include/maya/MFnMesh.h:243:2: note: in expansion of macro ‘declareDagMFn’
  declareDagMFn(MFnMesh, MFnDagNode);
  ^
/home/k.masson/Documents/maya/km_extendedColorSet/src/km_particlesToColorSet.cpp:159:14: error: within this context
   test(meshFn);
              ^
In file included from /home/k.masson/Documents/maya/km_extendedColorSet/src/km_particlesToColorSet.cpp:29:0:
/home/k.masson/Documents/maya/km_extendedColorSet/src/kmColorSetTool.h:29:6: error:   initializing argument 1 of ‘void test(MFnMesh)’
 void test(MFnMesh meshFn){

So do you know if there is anyway to create a function that acts on a MFnBase class in a fashion way, or even a class with a MFnBase attribute ? I don't know we can't do this kind of process which is really current..

I am new to c++ so it may be possible that I did a dumb mistake.


Solution

  • The MFnBaseClass does not allow to use the conversion to a pointer, instead, use a reference which works almost the same. See References vs. Pointers for more information.

    The correct signature for my function is

    void test(MFnMesh& meshFn)
    

    And the way to use it is

    test(meshFn);
    

    And to use the reference in the function, just use it as a regular object

    void test(MFnMesh& meshFn){
      MStatus status = MS::kSuccess;
      MString csName("YOLOSWAQDAZD");
      status = meshFn.createColorSetDataMesh(csName);
      MCheckStatus(status,"Error creating new color set");
    }