void OutputHelper::addRSLVariable(const MString& inputQualifier, MString rslType, const MString& rslName, const MString& mayaName, const MString& mayaNode) { MString cmd; // If the user specified that the type was an array of floats // (eg "float2"), extract the size and set the type to float. int rslTypeSize = 1; MString matchedStr; IfMErrorWarn(MGlobal::executeCommand("match(\"float[0-9]+$\",\""+rslType+"\")", matchedStr)); if(matchedStr != "") { IfMErrorWarn(MGlobal::executeCommand("match(\"[0-9]+$\",\""+rslType+"\")", matchedStr)); rslTypeSize = matchedStr.asInt(); rslType = "float"; } // Create the plug's name, and check for convertible connections. MString plug(mayaNode+"."+mayaName); int connected = liquidmaya::ShaderMgr::getSingletonPtr()->convertibleConnection(plug.asChar()); // If there are no convertible connections, then we have to // write out the variable into the shader's body. if( connected == 0 ) { //rslTypeSize(int) --> rslTypeSizeStr(string) MString rslTypeSizeStr; rslTypeSizeStr.set(rslTypeSize); // Write out the description of the variable. rslShaderBody += (" "+inputQualifier + " " + rslType + " " + rslName); rslShaderBody += ( rslTypeSize != 1 )? ( "[" + rslTypeSizeStr + "] = " ) :( " = " + rslType + " " ); // Write out the value of the variable. if( rslType=="color" ||rslType=="point" ||rslType=="normal" ||rslType=="vector") { MDoubleArray val; val.setLength(3); IfMErrorWarn(MGlobal::executeCommand("getAttr \""+plug+"\"", val)); //val(double) --> valStr(string) MStringArray valStr; valStr.setLength(3); valStr[0].set(val[0]); valStr[1].set(val[1]); valStr[2].set(val[2]); rslShaderBody +="("+valStr[0]+","+valStr[1]+","+valStr[2]+")"; }else if(rslType=="string"){ MString val; IfMErrorWarn(MGlobal::executeCommand("getAttr \""+plug+"\"", val)); rslShaderBody +="\""+val+"\""; }else if(rslType=="float"){ if(rslTypeSize == 1){ double val; IfMErrorWarn(MGlobal::executeCommand("getAttr \""+plug+"\"", val)); //val(double) --> valStr(string) MString valStr; valStr.set(val); rslShaderBody += valStr; }else{ rslShaderBody += "{ "; MDoubleArray val; val.setLength(rslTypeSize); IfMErrorWarn(MGlobal::executeCommand("getAttr \""+plug+"\"", val)); for(int i=0; i<rslTypeSize; ++i){ if( i != 0 ){ rslShaderBody += ", "; } //val[i](double) --> valStr(string) MString valStr; valStr.set(val[i]); rslShaderBody += valStr; } rslShaderBody += " }"; } } rslShaderBody += ";\n"; }//if( $connected == 0 ) // Otherwise, we have a convertible connection, so we'll be // adding the variable to the block's header. else{ rslShaderHeader += " "; // Note if it's connected as an output. if(connected == 2){ rslShaderHeader += "output "; } // Write out the description. rslShaderHeader += ( rslType + " " + rslName ); if( rslTypeSize != 1 ) { rslShaderHeader += "[]"; } rslShaderHeader += ";\n"; // if(connected == 1) { MStringArray srcPlug; IfMErrorWarn(MGlobal::executeCommand("listConnections -source true -plugs true \""+plug+"\"", srcPlug)); assert(srcPlug.length()==1); rslShaderBody +="//"+plug+" <-- "+srcPlug[0]+"\n"; } }//else }