У меня есть плагин Maya в C ++. В этом плагине функция timeChange запускается всякий раз, когда время изменяется в Maya.
Я хочу создать определенную форму сетки при достижении заданного времени. Форма создана правильно, но при желании назначить шейдеру фигуру, она говорит, что форма не может быть найдена. Повторное выполнение назначения с помощью кнопки или через интерфейс MEL работает правильно.
Алгоритм заключается в следующем:
Когда это не удается:
— Изменение времени
— Событие сработало (статическая функция)
— Форма создана
— Назначение шейдера через API с помощью команды mel -> Error
— Назначение шейдера через интерфейс с той же командой mel -> Works
Когда это работает:
— Функция нажата кнопкой
— Форма создана
— Назначение шейдера через API командой mel -> Works
void MyClass::CreateOneShape()
{
MDagPath thisDagNode;
MFnDagNode dagPath;
MString rootName;
// CREATING SHAPE
log("Will create shape");
MFnDependencyNode fnPolySp;
MObject objPolySp = fnPolySp.create("polyPrimitiveMisc");
MFnDagNode fnPolyTrans;
MObject objPolyTrans = fnPolyTrans.create("transform");
MFnDagNode fnPolyShape;
MObject objPolyShp = fnPolyShape.create("mesh", objPolyTrans,&status);
rootName="Unit_";
fnPolyShape.setName(rootName+MString()+UnitId+"_Shape");
MFnTransform m(objPolyTrans);
m.setName(rootName+MString()+UnitId);
MFnDagNode n(theMesh,&status);
MDagPath dp;
status=n.getPath(dp);
MFnMesh fn(dp,&status);
MObjectArray shaders;
MIntArray indices;
status=fn.getConnectedShaders(0,shaders,indices);
for (int sh=0;sh<shaders.length();sh++)
{
MFnDependencyNode dep(shaders[sh]);
// Below is the command that fails when called in an event function and works when called via a button function.
MString cmd="select -cl ; select -r "+rootName+MString()+UnitId+"_Shape.f[" + MString()+int(surfaceNb) + "] ; sets -e -forceElement " + dep.name() + ";";
MGlobal::executeCommand(cmd);
surfaceNb++;
}
}
void timeChanged(MyClass *clientData)
{
clientData->CreateOneShape(); --> Gives error that shape cannot be found
}
void buttonClicked()
{
CreateOneShape(); --> Works fine
}
Как правильно назначить мой шейдер в функции, запускаемой по событию?
Это звучит странно, но главная проблема в том, что вы не вызвали MDGModifier :: doIt (), чтобы заставить Maya обновить свои внутренние состояния, прежде чем пытаться создать больше соединений. И вместо этого я бы использовал MDagModifier :: createNode () для захвата его в правильный стек отмены при вызове функции doIt (). То, как вы это делаете, заключается в том, что вы создаете шаг отмены для каждого, в то время как вы, безусловно, хотите захватить все в одном. MDagModifier является производной от MDGModifier, поэтому он также имеет функцию doIt (). Поскольку иногда сложнее создавать соединения шейдеров / групп, вызов MEL — это хорошо, но вызовите doIt () раньше, это должно решить вашу проблему. Если нет, дайте мне знать, и я напишу код для демонстрации этого.
Других решений пока нет …