【发布时间】:2019-03-22 09:16:29
【问题描述】:
我目前正在为 Maya 开发一个自定义视口插件。目前,我正在尝试将 Maya 中的材质解析为我自己的自定义框架材质。
我创建了一个回调,当添加 Lambert 着色器时调用它(参见下面的代码 sn-p)。我觉得这个回调甚至在初始化(刚刚)添加的 Lambert 着色器之前就被调用了,但这不是重点。
MCallbackId lambert_added_id = MDGMessage::addNodeAddedCallback(
LambertAddedCallback, // The callback function
"lambert", // The type of object that triggers the callback
m_material_parser.get(), // Client data
&status // Return status
);
返回状态为MStatus::kSuccess。每当我添加 Lambert 着色器时,都会触发此回调。
虽然我的问题是.. 我如何获得添加此材质的网格节点?我尝试获取 Lambert 着色器的连接,但没有(参见下面的代码 sn-p)。
void LambertAddedCallback(MObject& node, void* client_data)
{
assert(node.apiType() == MFn::Type::kLambert);
MFnLambertShader fn_lambert(node);
MGlobal::displayInfo(node.apiTypeStr() + MString(" added!"));
{
MString str = fn_lambert.parentNamespace();
MGlobal::displayInfo((str + " = parentNameSpace").asChar());
}
{
MPlugArray plug_array;
fn_lambert.getConnections(plug_array);
auto num = plug_array.length();
MGlobal::displayInfo("Pluggies: ");
for (int i = 0; i < plug_array.length(); ++i)
{
MGlobal::displayInfo(plug_array[i].name().asChar());
}
}
}
回调打印:
= parentNamespace
没有打印任何其他内容,这意味着没有parentNamespace,也没有连接到它的插头..?我知道当您将朗伯着色器添加到网格时,它会作为着色器组中的表面着色器应用。但我在回调中找不到这种关系。
那么,我的问题是:我可以得到这个 Lambert 着色器(以及如何)绑定到的网格吗?
【问题讨论】:
标签: c++ callback shader mesh maya-api