void LuxRenderer::createAreaLightMesh(mtlu_MayaObject *obj) { MString meshName(""); MFnDependencyNode depFn(obj->mobject); MObject otherSideObj = getOtherSideNode(MString("mtlu_areaLight_geo"), obj->mobject); if( otherSideObj != MObject::kNullObj) { }else{ int indices[6] = {0,1,2,2,3,0}; float floatPointArray[12] = {-1, -1, 0, -1, 1, 0, 1, 1, 0, 1, -1, 0}; float floatNormalArray[12] = {0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1}; ParamSet triParams = CreateParamSet(); triParams->AddInt("indices", indices, 6); triParams->AddPoint("P", floatPointArray, 4); triParams->AddNormal("N", floatNormalArray, 4); lux->transformBegin(); float fm[16]; MMatrix tm = obj->transformMatrices[0]; setZUp(tm, fm); this->lux->transform(fm); this->lux->shape("trianglemesh", boost::get_pointer(triParams)); lux->transformEnd(); } }
bool IsLayerVisible(MDagPath& dp) { MStatus stat = MStatus::kSuccess; MDagPath dagPath = dp; while (stat == MStatus::kSuccess) { MFnDependencyNode node(dagPath.node()); MPlug doPlug = node.findPlug("drawOverride", &stat); if (stat) { MObject layer = getOtherSideNode(doPlug); MFnDependencyNode layerNode(layer, &stat); if (stat) { bool visibility = true; if (getBool("visibility", layerNode, visibility)) if (!visibility) return false; if (getEnumInt("displayType", layerNode) == 1) // template return false; } } stat = dagPath.pop(); } return true; }
bool IsLayerVisible(MDagPath& dp) { MStatus stat = MStatus::kSuccess; MDagPath dagPath = dp; while (stat == MStatus::kSuccess) { MFnDependencyNode node(dagPath.node()); MPlug doPlug = node.findPlug("drawOverride", &stat); if( stat ) { MObject layer = getOtherSideNode(doPlug); MFnDependencyNode layerNode(layer, &stat); if( stat ) { MGlobal::displayInfo(MString("check layer ") + layerNode.name() + " for node " + dagPath.fullPathName()); bool visibility = true; if(getBool("visibility", layerNode, visibility)) if(!visibility) return false; } } stat = dagPath.pop(); } return true; }
MObject getOtherSideNode(const MString& plugName, MObject& thisObject, MStringArray& otherSidePlugNames) { MStatus stat; MObject result = MObject::kNullObj; MFnDependencyNode depFn(thisObject, &stat); if (stat != MStatus::kSuccess) return result; MPlug plug = depFn.findPlug(plugName, &stat); if (stat != MStatus::kSuccess)return result; if (!plug.isConnected()) { int numChildConnects = plug.numConnectedChildren(); if (numChildConnects == 0) return result; else { for (int i = 0; i < numChildConnects; i++) { MPlug child = plug.child(i); MString otherSidePlugName; MObject childObj = getOtherSideNode(child.partialName(false), thisObject, otherSidePlugName); if (childObj != MObject::kNullObj) { otherSidePlugNames.append(otherSidePlugName); result = childObj; } else otherSidePlugNames.append(MString("")); } } } else { MPlugArray plugArray; plug.connectedTo(plugArray, 1, 0, &stat); if (stat != MStatus::kSuccess) return result; if (plugArray.length() == 0) return result; MPlug otherSidePlug = plugArray[0]; result = otherSidePlug.node(); otherSidePlugNames.append(otherSidePlug.name()); } return result; }
void getConnectedNodes(MObject& thisObject, MObjectArray& nodeList) { MFnDependencyNode depFn(thisObject); MPlugArray connectedPlugs; depFn.getConnections(connectedPlugs); int numConnections = connectedPlugs.length(); for( int i = 0; i < numConnections; i++) { // check for incoming connections only. Outgoing connections are not relevant MPlug plug = connectedPlugs[i]; // an plug can be source AND destination at the same time, like the displacement attribute of a displacementShader if( plug.isSource() && !plug.isDestination()) continue; MObject plugObject = getOtherSideNode(plug); if( plugObject != MObject::kNullObj) nodeList.append(plugObject); } //return (numConnections > 0); }
void CoronaRenderer::defineMaterial(Corona::IInstance* instance, std::shared_ptr<MayaObject> mobj) { std::shared_ptr<mtco_MayaObject> obj = std::static_pointer_cast<mtco_MayaObject>(mobj); MFnDependencyNode globalsNode(objectFromName("coronaGlobals")); if (getBoolAttr("useGlobalMaterialOverride", globalsNode, false)) { MObject surfaceShader = getOtherSideNode(MString("globalMaterialOverride"), globalsNode.object()); // get shading group for reuse MFnDependencyNode surfaceShaderNode(surfaceShader); MPlug outColorPlug = surfaceShaderNode.findPlug("outColor"); MObject shadingGroupObject; if (outColorPlug.isConnected()) { MPlugArray outArray; outColorPlug.connectedTo(outArray, false, true); if (outArray.length() > 0) { shadingGroupObject = outArray[0].node(); } } if (shadingGroupObject != MObject::kNullObj) if (assingExistingMat(shadingGroupObject, obj)) return; Corona::SharedPtr<Corona::IMaterial> base = defineCoronaMaterial(surfaceShader, obj); Corona::IMaterialSet ms = Corona::IMaterialSet(base); setRenderStats(ms, obj); obj->instance->addMaterial(ms); return; } getObjectShadingGroups(obj->dagPath, obj->perFaceAssignments, obj->shadingGroups, false); if( obj->shadingGroups.length() > 0) { for (uint sgId = 0; sgId < obj->shadingGroups.length(); sgId++) { MObject shadingGroup = obj->shadingGroups[sgId]; Logging::debug(MString("---------- Check shading group: ") + getObjectName(shadingGroup) + " for existence on object named " + obj->fullName); if (assingExistingMat(shadingGroup, obj)) return; MObject surfaceShader = getConnectedInNode(shadingGroup, "surfaceShader"); // check obj set overrides MObject connectedSet = getConnectedObjSet(obj->dagPath); if (connectedSet != MObject::kNullObj) { MFnDependencyNode setFn(connectedSet); Logging::debug(MString("Found connected object set:") + setFn.name()); MPlug shaderOverride = setFn.findPlug("mtco_mtlOverride"); if (!shaderOverride.isNull()) { MObject connectedObject = getConnectedInNode(shaderOverride); if (connectedObject != MObject::kNullObj) surfaceShader = connectedObject; } } // raytype shader is a special case. Here a material set gets different materials, so I have to call defineCoronaMaterial several times MFnDependencyNode shaderMat(surfaceShader); Corona::SharedPtr<Corona::IMaterial> base = nullptr; Corona::SharedPtr<Corona::IMaterial> reflect = nullptr; Corona::SharedPtr<Corona::IMaterial> refract = nullptr; Corona::SharedPtr<Corona::IMaterial> direct = nullptr; if (shaderMat.typeName() == "CoronaRaytype") { MPlug basePlug = shaderMat.findPlug("base"); MPlug reflectPlug = shaderMat.findPlug("reflect"); MPlug refractPlug = shaderMat.findPlug("refract"); MPlug directPlug = shaderMat.findPlug("direct"); if (basePlug.isConnected()) { MObject inNode = getConnectedInNode(basePlug); base = defineCoronaMaterial(inNode, nullptr); } if (reflectPlug.isConnected()) { MObject inNode = getConnectedInNode(reflectPlug); reflect = defineCoronaMaterial(inNode, nullptr); } if (refractPlug.isConnected()) { MObject inNode = getConnectedInNode(refractPlug); refract = defineCoronaMaterial(inNode, nullptr); } if (directPlug.isConnected()) { MObject inNode = getConnectedInNode(directPlug); direct = defineCoronaMaterial(inNode, nullptr); } } else{ base = defineCoronaMaterial(surfaceShader, obj); } Corona::IMaterialSet ms = Corona::IMaterialSet(base); ms.overrides.direct = direct; ms.overrides.reflect = reflect; ms.overrides.refract = refract; setRenderStats(ms, obj); obj->instance->addMaterial(ms); } } else{ Corona::SharedPtr<Corona::IMaterial> mat = defineCoronaMaterial(MObject::kNullObj, nullptr); Corona::IMaterialSet ms = Corona::IMaterialSet(mat); setRenderStats(ms, obj); obj->instance->addMaterial(ms); } }