/// Returns the arnold shader assigned to the procedural. This duplicates /// code in GeometryTranslator.h, but there's not much can be done about that /// since the GeometryTranslator isn't part of the MtoA public API. AtNode *arnoldShader(AtNode* node) { m_displaced = false; float maximumDisplacementPadding = -AI_BIG; bool enableAutoBump = false; unsigned instNumber = m_dagPath.isInstanced() ? m_dagPath.instanceNumber() : 0; MPlug shadingGroupPlug = GetNodeShadingGroup(m_dagPath.node(), instNumber); //find and export any displacment shaders attached // DISPLACEMENT MATERIAL EXPORT MPlugArray connections; MFnDependencyNode fnDGShadingGroup(shadingGroupPlug.node()); MPlug shaderPlug = fnDGShadingGroup.findPlug("displacementShader"); shaderPlug.connectedTo(connections, true, false); // are there any connections to displacementShader? if (connections.length() > 0) { m_displaced = true; MObject dispNode = connections[0].node(); GetDisplacement(dispNode, maximumDisplacementPadding, enableAutoBump); m_dispPadding = maximumDisplacementPadding; AtNode* dispImage(ExportNode(connections[0])); m_dispNode = dispImage; } // Only export displacement attributes if a displacement is applied if (m_displaced) { std::cout << "arnoldShader::m_displaced :: " << m_displaced << std::endl; // Note that disp_height has no actual influence on the scale of the displacement if it is vector based // it only influences the computation of the displacement bounds // AiNodeSetFlt(node, "disp_padding", maximumDisplacementPadding); } // return the exported surface shader return ExportNode( shadingGroupPlug ); }
/// Returns the arnold shader to assign to the procedural. AtNode *arnoldShader() { bool overrideShaders = false; MPlug plug = FindMayaObjectPlug( "overrideProceduralShaders" ); if( !plug.isNull() ) { // if we've been told explicitly not to override the shaders // in the procedurals, then early out. overrideShaders = plug.asBool(); if( !overrideShaders ) { return 0; } } unsigned instNumber = m_dagPath.isInstanced() ? m_dagPath.instanceNumber() : 0; MPlug shadingGroupPlug = GetNodeShadingGroup(m_dagPath.node(), instNumber); if( !overrideShaders ) { // if we weren't explicitly told to override the shaders, then // decide whether to or not based on whether a non-default // shader has been applied to the shape by the user. MObject shadingGroupNode = shadingGroupPlug.node(); MFnDependencyNode fnShadingGroupNode( shadingGroupNode ); if( fnShadingGroupNode.name() != "initialShadingGroup" ) { overrideShaders = true; } } if( overrideShaders ) { return ExportNode( shadingGroupPlug ); } else { return 0; } }
// Get shading engine // void CScriptedShapeTranslator::GetShapeInstanceShader(MDagPath& dagPath, MFnDependencyNode &shadingEngineNode) { // Get instance shadingEngine shadingEngineNode.setObject(MObject::kNullObj); // First try the usual way MPlug shadingGroupPlug = GetNodeShadingGroup(dagPath.node(), (dagPath.isInstanced() ? dagPath.instanceNumber() : 0)); if (!shadingGroupPlug.isNull()) { shadingEngineNode.setObject(shadingGroupPlug.node()); return; } char buffer[64]; // Check connection from any shadingEngine on shape MStringArray connections; MGlobal::executeCommand("listConnections -s 1 -d 0 -c 1 -type shadingEngine "+dagPath.fullPathName(), connections); MSelectionList sl; if (connections.length() == 0) { // Check for direct surface shader connection MGlobal::executeCommand("listConnections -s 1 -d 0 -c 1 "+dagPath.fullPathName(), connections); for (unsigned int cidx=0; cidx<connections.length(); cidx+=2) { MString srcNode = connections[cidx+1]; // Get node classification, if can find arnold/shader/surface -> got it MStringArray rv; MGlobal::executeCommand("getClassification `nodeType "+srcNode+"`", rv); if (rv.length() > 0 && rv[0].indexW("arnold/shader/surface") != -1) { connections.clear(); MGlobal::executeCommand("listConnections -s 0 -d 1 -c 1 -type shadingEngine "+srcNode, connections); if (connections.length() == 2) { sl.add(connections[1]); } break; } } } else if (connections.length() == 2) { // Single connection, use same shader for all instances sl.add(connections[1]); } else if (connections.length() > 2) { // Many connections, expects the destination plug in shape to be an array // Use instance number as logical index, if this fails, use first shadingEngine in list bool found = false; sprintf(buffer, "[%d]", dagPath.instanceNumber()); MString iidx = buffer; for (unsigned int cidx = 0; cidx < connections.length(); cidx += 2) { MString conn = connections[cidx]; if (conn.length() < iidx.length()) { continue; } if (conn.substring(conn.length() - iidx.length(), conn.length() - 1) != iidx) { continue; } sl.add(connections[cidx+1]); found = true; break; } if (!found) { MGlobal::displayWarning("[mtoaScriptedTranslators] Instance shader plug not found, use first found shadingEngine \"" + connections[1] + "\""); sl.add(connections[1]); } } if (sl.length() == 1) { MObject shadingEngineObj; if (sl.getDependNode(0, shadingEngineObj) == MS::kSuccess && shadingEngineObj.apiType() == MFn::kShadingEngine) { shadingEngineNode.setObject(shadingEngineObj); } else { if (shadingEngineObj != MObject::kNullObj) { MFnDependencyNode dn(shadingEngineObj); MGlobal::displayWarning("[mtoaScriptedTranslators] Not a shading engine \"" + dn.name() + "\""); } } } }