Maya API C ++: получить материал из поли - PullRequest
0 голосов
/ 17 октября 2018

Я пишу плагин для Maya 2018, используя Maya API C ++.Я уже успешно получил сетку и создал итератор для перебора всех полигонов:

 ...
 MFnMesh fnMesh(mdagPath, &stat); 
 if (MS::kSuccess != stat)
 {
    // error get mesh
    return MS::kFailure;
 }
 MItMeshPolygon polyIter(mdagPath, mComponent, &stat);
 if (MS::kSuccess != stat) 
 {
    // error create iterator
    return MS::kFailure;
 }
 ...

Я успешно получаю вершины, нормали, координаты текстуры.Но как получить материал, который накладывается на текущий полигон?И вместе с материальной текстурой.

1 Ответ

0 голосов
/ 27 октября 2018

Я получаю все материалы, затем я получаю все поли в текущем материале:

MStatus stat = MStatus::kSuccess;
MSpace::Space space = MSpace::kWorld; 
MFnSet fnSet(set, &stat); 
if (stat == MS::kFailure) 
{
    MStreamUtils::stdErrorStream() << "ERROR: MFnSet::MFnSet\n";
    return MStatus::kNotImplemented;
}
MItMeshPolygon polyIter(mdagPath, comp, &stat); // iterator on vertex
if ((stat == MS::kFailure)) 
{
    MStreamUtils::stdErrorStream() << "ERROR: Can't create poly iterator!\n";
    return MStatus::kNotImplemented;
}
MFnDependencyNode fnNode(set); 
MPlug shaderPlug = fnNode.findPlug("surfaceShader");
MPlugArray connectedPlugs;
if (shaderPlug.isNull())
{
    MStreamUtils::stdErrorStream() << "ERROR: Can't find material!\n";
    return MStatus::kNotImplemented;
}
shaderPlug.connectedTo(connectedPlugs, true, false);
MFnDependencyNode fnDN(connectedPlugs[0].node());

MItDependencyGraph dgIt(shaderPlug, MFn::kFileTexture, 
    MItDependencyGraph::kUpstream,
    MItDependencyGraph::kBreadthFirst,
    MItDependencyGraph::kNodeLevel,
    &stat);
if (stat == MS::kFailure)
{
    MStreamUtils::stdErrorStream() << "ERROR: Can't load graph textures\n";
    return MStatus::kNotImplemented;
}
dgIt.disablePruningOnFilter();
if (dgIt.isDone()) 
{
    MStreamUtils::stdErrorStream() << "Warning: Material " << fnDN.name().asChar() << " not textured\n";
    //return MStatus::kNotImplemented;
}

// no need, here we get the texture
MObject textureNode = dgIt.thisNode();
MPlug filenamePlug = MFnDependencyNode(textureNode).findPlug("fileTextureName");
MString textureName; // name texture + path
filenamePlug.getValue(textureName);
(; !polyIter.isDone(); polyIter.next())
{
    // here get poly and perform actions on it
}
...