MStatus OccLightNode::initialize_shader_parameters()
{
	//CM_TRACE_FUNC("OccLightNode::initialize_shader_parameters()");
	MFnTypedAttribute   tAttr;
	MFnStringData       tDefault;
	MFnNumericAttribute nAttr;
	MFnEnumAttribute    eAttr;
	MFnLightDataAttribute lAttr;
	MFnStringData stringData;
	MStatus status, sstat;

	CREATE_FLOAT(nAttr, akocc,			"Kocc",			"k",	1.0);
	CREATE_INT(nAttr,	asamples,		"samples",		"sam",	64);
	CREATE_FLOAT(nAttr,	amaxdist,		"maxdist",		"max",	1e36);
	CREATE_STRING(tAttr,adistribution,	"distribution",	"dis",	"cosine");
	CREATE_BOOL(nAttr,	a__nonspecular,	"__nonspecular","nsp",	1);

	IfMErrorWarn( attributeAffects( akocc,			aOutColor ) );
	IfMErrorWarn( attributeAffects( asamples,		aOutColor ) );
	IfMErrorWarn( attributeAffects( amaxdist,		aOutColor ) );
	IfMErrorWarn( attributeAffects( adistribution,	aOutColor ) );
	IfMErrorWarn( attributeAffects( a__nonspecular,	aOutColor ) );

	return MS::kSuccess;
}
MStatus PhysicalsunNode::initialize_shader_parameters()
{
    //CM_TRACE_FUNC("PhysicalsunNode::initialize_shader_parameters()");
    MFnTypedAttribute   tAttr;
    MFnStringData       tDefault;
    MFnNumericAttribute nAttr;
    MFnEnumAttribute    eAttr;
    MFnLightDataAttribute lAttr;
    MFnStringData stringData;
    MStatus status, sstat;

    CREATE_FLOAT(nAttr, ai_multiplier,		"multiplier",		"mul", 1.0);
    CREATE_COLOR(nAttr, ai_rgb_unit_conversion, "rgb_unit_conversion", "uc", 0.0, 0.0, 0.0);
    CREATE_FLOAT(nAttr, ai_haze,			"haze",			"haz", 0.0);
    CREATE_FLOAT(nAttr, ai_redblueshift,	"redblueshift",	"rbs", 0.0);
    CREATE_FLOAT(nAttr, ai_saturation,		"saturation",		"sat", 0.7);
    CREATE_FLOAT(nAttr, ai_horizon_height,	"horizon_height", "hoh", 0.0);
    CREATE_FLOAT(nAttr, ai_shadow_softness, "shadow_softness","ssf", 0.0);
    CREATE_STRING(tAttr,ai_shadowmap,		"shadowmap",		"sm",  "raytrace");
    CREATE_INT(nAttr,	ai_shadow_samples,	"shadow_samples",	"ssp", 3);
    CREATE_BOOL(nAttr,  ai_y_is_up,			"y_is_up",		"yup", false );

    IfMErrorWarn( attributeAffects( ai_multiplier,			aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_rgb_unit_conversion,	aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_haze,				aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_redblueshift,		aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_saturation,			aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_horizon_height,		aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_shadow_softness,		aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_shadowmap,			aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_shadow_samples,		aOutColor ) );
    IfMErrorWarn( attributeAffects( ai_y_is_up,				aOutColor ) );

    return MS::kSuccess;
}
	void Renderer::generate_pfxhair(liqRibNodePtr &ribNode__, liqRibPfxHairData* phair, const int degree)
	{
		CM_TRACE_FUNC("generate_pfxhair("<<ribNode__->getTransformNodeFullPath()<<")");

		MStatus status;
		MFnPfxGeometry pfxhair(phair->objDagPath, &status);
		IfMErrorWarn(status);



		MRenderLineArray profileArray;
		MRenderLineArray creaseArray;
		MRenderLineArray intersectionArray;
		MRenderLineArray copy;

		bool doLines          = true;
		bool doTwist          = true;
		bool doWidth          = true;
		bool doFlatness       = false;
		bool doParameter      = false;
		bool doColor          = true;
		bool doIncandescence  = false;
		bool doTransparency   = true;
		bool doWorldSpace     = false;

		IfMErrorWarn( pfxhair.getLineData( profileArray, creaseArray, intersectionArray, doLines, doTwist, doWidth, doFlatness, doParameter, doColor, doIncandescence, doTransparency, doWorldSpace) );

		//todo

	}
Пример #4
0
MStatus btSPHMgrNode::initialize()
{
	_LogFunctionCall("btSPHMgrNode::initialize()");

	MStatus status;
	MFnUnitAttribute uAttr;	
	MFnNumericAttribute nAttr;
	MFnTypedAttribute tAttr;

	i_particleShape = nAttr.create(particleShape, ps, MFnNumericData::kInt, 0, &status);
	IfMErrorWarn(status);
	IfMErrorWarn(addAttribute(i_particleShape));

	i_particlePPAttr = nAttr.create(particlePPAttr, pppa, MFnNumericData::kInt, 0, &status);
	IfMErrorWarn(status);
	IfMErrorWarn(addAttribute(i_particlePPAttr));

	i_particleCount = nAttr.create( particleCount, pc, MFnNumericData::kInt, 300,&status);
	IfMErrorWarn(status);
	IfMErrorWarn(addAttribute( i_particleCount ));

	i_obstacleAABB = tAttr.create(obstacleBox, obox, MFnData::kMesh, MObject::kNullObj, &status);
	IfMErrorWarn(status);
	IfMErrorWarn(addAttribute(i_obstacleAABB));

	i_initAABB = tAttr.create(initBox, ibox, MFnData::kMesh, MObject::kNullObj, &status);
	IfMErrorWarn(status);
	IfMErrorWarn(addAttribute(i_initAABB));

	return MS::kSuccess;
}
void liqIPRNodeMessage::onOtherNode(const MString &node, std::vector<MString> &updateObjectName)
{
	MStringArray descendents;
	MString cmd("listRelatives -allDescendents "+node);
	MGlobal::executeCommand(cmd, descendents);

	for(int i=0; i<descendents.length(); ++i)
	{
		addUpdateObject(updateObjectName, descendents[i]);//record descendents[i]
		
		MDagPath dagPath;
		getDagPathByName(dagPath, descendents[i].asChar());

		if( dagPath.node().hasFn(MFn::kTransform) )
		{
			onOtherNode(descendents[i], updateObjectName);//visit descendents[i]
		}
		else if( dagPath.node().hasFn(MFn::kMesh) )
		{
			std::vector<std::string> shaderPlugs;
			liquid::RendererMgr::getInstancePtr()->
				getRenderer()->getValidShaderPlugsInShadingGroup(shaderPlugs);


			IfMErrorWarn(dagPath.extendToShape());//extend to shape

			std::vector<std::string> shadingGroups;
			getShadingGroups(dagPath.fullPathName(), shadingGroups);
			for(std::size_t j=0; j<shadingGroups.size(); ++j)//for each shading group
			{
				MString shadingGroup(shadingGroups[j].c_str());

				for(std::size_t k=0; k<shaderPlugs.size(); ++k)//for each shader plug
				{
					MString shaderPlug(shaderPlugs[k].c_str());

					int isShaderPlugExist;
					cmd = "attributeQuery -node \""+shadingGroup+"\" -ex \""+shaderPlug+"\"";
					IfMErrorMsgWarn(MGlobal::executeCommand( cmd, isShaderPlugExist), cmd);
					if( isShaderPlugExist )
					{
						//get the source shade node of $shadingGroup.$shaderPlug
						MStringArray shaders;
						cmd = "listConnections -s true -d false -plugs false (\""+shadingGroup+"\" + \"."+shaderPlug+"\")";
						IfMErrorMsgWarn(MGlobal::executeCommand( cmd, shaders), cmd);
						
						if( shaders.length() > 0 )//has source shader node
						{
							onShaderNode(shaders[0], updateObjectName);
						}//if( shaders.length() > 0 )//has source shader node

					}//if( isShaderPlugExist )
				}//for each shader plug


			}//for each shading group
		}//kMesh
	}//for(int i=0; i<descendents.length(); ++i)

}
Пример #6
0
void Visitor::outputUpstreamShader(const char* shaderNodeName)
{
	CM_TRACE_FUNC("Visitor::outputUpstreamShader("<<shaderNodeName<<")");

	MString nodetype;
	IfMErrorWarn(MGlobal::executeCommand( ("nodeType \""+MString(shaderNodeName)+"\""), nodetype));

	_outputUpstreamShader(shaderNodeName, nodetype.asChar());
}
MStatus TestLightNode::initialize_shader_parameters()
{
	//CM_TRACE_FUNC("TestLightNode::initialize_shader_parameters()");
	MFnTypedAttribute   tAttr;
	MFnStringData       tDefault;
	MFnNumericAttribute nAttr;
	MFnEnumAttribute    eAttr;
	MFnLightDataAttribute lAttr;
	MStatus status;

	CREATE_COLOR(nAttr, alightcolor, "lightcolor", "lc",  1.0f, 1.0f, 1.0f);
	CREATE_FLOAT(nAttr, aintensity,  "intensity",  "its", 1.0f);

	IfMErrorWarn( attributeAffects( alightcolor,	aOutColor ) );
	IfMErrorWarn( attributeAffects( aintensity,		aOutColor ) );

	return MS::kSuccess;
}
MStatus TestLightNode::compute( const MPlug& plug, MDataBlock& block )
{
	//CM_TRACE_FUNC("SkyLightNode::compute(job="<<plug.name()<<",block)");

	// outColor or individual R, G, B channel
	if( (plug == aOutColor)			|| (plug.parent() == aOutColor)		  ||
		(plug == aOutTransparency)	|| (plug.parent() == aOutTransparency)
		) 
	{

		// init shader
		MStatus status;
		MFloatVector& lightcolor  = block.inputValue(alightcolor).asFloatVector();


		//rendering begin (maya software)
		MFloatVector resultColor;
		resultColor = lightcolor;

		//rendering end

		// set ouput color attribute
		MDataHandle outColorHandle = block.outputValue( aOutColor, &status );
		IfMErrorWarn(status);
		outColorHandle.asFloatVector() = resultColor;
		outColorHandle.setClean();

		MDataHandle outTransHandle = block.outputValue( aOutTransparency, &status );
		IfMErrorWarn(status);
		outTransHandle.asFloatVector() = MFloatVector(0.0, 0.0, 0.0);
		outTransHandle.setClean();
	} 
	else {
		return MS::kUnknownParameter;
	}

	return MS::kSuccess;
}
bool liqIPRNodeMessage::isShaderNode(const MString &node)const 
{
	MString cmd;

	MString nodetype;
	cmd = "nodeType \""+node+"\"";
	IfMErrorWarn(MGlobal::executeCommand( cmd, nodetype));

	if( liquidmaya::ShaderMgr::getSingletonPtr()->hasShaderType(nodetype.asChar()) )
	{
		return true;
	}else{
		return false;
	}
}
void liqIPRNodeMessage::gatherUpdateObjects(std::vector<MString>& objects)
{
	MStatus status;

	//get selection list
	MSelectionList 	selection;
	IfMErrorWarn(MGlobal::getActiveSelectionList( selection ));

	for ( unsigned int i=0; i<selection.length(); i++ )
	{
		MObject node;
		IfMErrorWarn(selection.getDependNode( i, node ));

		MFnDependencyNode nodeFn(node, &status);
		IfMErrorWarn(status);

		const MString nodeName(nodeFn.name());
		objects.push_back(nodeName);//record current node

		if( isShaderNode(nodeName) )
		{
			onShaderNode(nodeName, objects);
		}
		else{
			onOtherNode(nodeName, objects);
		}
	}

	//add current camera shape node
	MStringArray cameraShapeFullPaths;
	IfMErrorWarn(MGlobal::executeCommand("string $cam = `getAttr liquidGlobals.renderCamera`; ls -long $cam;", cameraShapeFullPaths));
	objects.push_back(cameraShapeFullPaths[0]);

	//add current camera transform node

}
MStatus liqIPRNodeMessage::doIt( const MArgList& args)
//
// Takes the  nodes that are on the active selection list and adds an
// attriubte changed callback to each one.
//
{	
	MStatus 		stat;

	for( unsigned i( 0 ); i < args.length(); i++ ) 
	{
		MString arg = args.asString( i, &stat );
		IfMErrorWarn(stat);

		if( (arg == kRegisterFlag) || (arg == kRegisterFlagLong) ){
			isRunningIPR = 1;
			liqRibTranslator::getInstancePtr()->IPRRenderBegin();
			IfMErrorWarn(registerCallback());
			//liqRibTranslator::getInstancePtr()->IPRDoIt();
		}
		else if( (arg == kUnregisterFlag) || (arg == kUnregisterFlagLong) ){
			IfMErrorWarn(unregisterCallback());

			liqRibTranslator::getInstancePtr()->IPRRenderEnd();
			isRunningIPR = 0;
		}
		else if( (arg == kIsRunningIPR) || (arg == kIsRunningIPRLong) ){
			setResult(isRunningIPR);
		}
		else{
			liquidMessage2(messageError,"Parameter [%s] is undefined in liqIPRNodeMessage.", arg.asChar());
			return MS::kUnknownParameter;
		}
	}

	return MS::kSuccess;
}
	bool RNodeVisitorMgr::visit(const char *node)
	{
		CM_TRACE_FUNC("RNodeVisitorMgr::visit("<<node<<")");

		MString nodeType;
		IfMErrorWarn( MGlobal::executeCommand( ("nodeType \""+MString(node)+"\""), nodeType) );

		std::map<
			std::string, 
			liquid::RenderNodeVisitorInterface2*
		>::iterator i = m_map.find(nodeType.asChar());
		
		if( i == m_map.end())//not found
		{
			return false;
		}
		
		return i->second->visit(node);
	}
	bool RNodeVisitorMgr::onCreateInstance(const char *node)
	{
		//in batch mode, this function is called after the rendering, 
		//so it complains the cm::trace file is not open, so I omit this CM_TRACE_FUNC()
		//CM_TRACE_FUNC("RNodeVisitorMgr::onCreateInstance("<<node<<")");

		MString nodeType;
		IfMErrorWarn( MGlobal::executeCommand( ("nodeType \""+MString(node)+"\""), nodeType) );

		std::map<
			std::string, 
			liquid::RenderNodeVisitorInterface2*
		>::iterator i = m_map.find(nodeType.asChar());

		if( i == m_map.end())//not found
		{
			return false;
		}

		return i->second->onCreateInstance(node);
	}
Пример #14
0
void Visitor::postOutput()
{
	CM_TRACE_FUNC("Visitor::postOutput()");

	//compile the shader
	MString shaderdir(getShaderDirectory());
	MString outSLO(renderman::getShaderFilePath_SLO(shaderNodeName.c_str()));
	MString srcSL (renderman::getShaderFilePath_SRC(shaderNodeName.c_str()));

	MString result;
	//NOTE:
	//     the include directory can't contain '.', so I move _3delight to %LIQUID_ROOT%\dependence
	//"shader.exe -o \"outSLO\" -I\"%LIQUID_ROOT%\dependence\_3delight" \"srcSL\""
	IfMErrorWarn(MGlobal::executeCommand("system(\"shader -o \\\""+outSLO+"\\\" -I\\\"%LIQUID_ROOT%/dependence/_3delight\\\" \\\""+srcSL+"\\\"\")", result, true));

	//show the error if there is.
	std::string strRes(result.toLowerCase().asChar());
	if(strRes.find("error") != std::string::npos)
	{
		liqAssert(strRes.c_str());
	}


}
// @node	maya shader node name
void Visitor::visitFile(const char* node)
{	
	CM_TRACE_FUNC("Visitor::visitFile("<<node<<")");

	OutputHelper o(RSLfile);

	o.addInclude("file.h");

	o.beginRSL( node );

	MString mayaTexName(getFileNodeImageName(node));
	MString texName = mayaTexName + ".tex";
	//system("txmake mayaTexName texName");
	IfMErrorWarn(MGlobal::executeCommand("system(\"txmake "+mayaTexName+" "+texName+"\")", true));

	//input
	o.addRSLVariable(       "", "float",  "alphaGain",		"alphaGain",	node);
	o.addRSLVariable("uniform", "float",  "alphaIsLuminance",	"alphaIsLuminance",	node);
	o.addRSLVariable(       "", "float",  "alphaOffset",	"alphaOffset",	node);
	o.addRSLVariable(       "", "color",  "colorGain",		"colorGain",	node);
	o.addRSLVariable(       "", "color",  "colorOffset",	"colorOffset",	node);
	o.addRSLVariable(       "", "color",  "defaultColor",	"defaultColor",	node);
	o.addRSLVariable(       "", "float2", "uvCoord",		"uvCoord",node);
	//texName
	o.addRSLVariable("uniform", "float", "filterType",		"filterType",	node);
	o.addRSLVariable("uniform", "float", "filter",			"filter",		node);
	o.addRSLVariable(       "", "float", "filterOffset",	"filterOffset",	node);
	o.addRSLVariable("uniform", "float", "invert",			"invert",		node);
	o.addRSLVariable("uniform", "float", "fileHasAlpha",	"fileHasAlpha",	node);
	//o.addRSLVariable("index", "num_channels",	"num_channels",	node);
	//output
	o.addRSLVariable(       "", "float", "outAlpha",		"outAlpha",		node);
	o.addRSLVariable(       "", "vector", "outColor",		"outColor",		node);
	o.addRSLVariable(       "", "vector", "outTransparency",	"outTransparency",	node);


	o.addToRSL("{");
	o.addToRSL("  color _outColor;");
	o.addToRSL("  color _outTransparency;");
	o.addToRSL("  maya_file("
						//Inputs
						"alphaGain,         \n\t"
						"alphaIsLuminance,  \n\t"
						"alphaOffset,       \n\t"
						"colorGain,         \n\t"
						"colorOffset,       \n\t"
						"defaultColor,      \n\t"
						"\""+texName+"\",   \n\t"
						"filterType,        \n\t"
						"filter,            \n\t"
						"filterOffset,      \n\t"
						"invert,            \n\t"
						"uvCoord,           \n\t"
						//Outputs
						"outAlpha,          \n\t"
						"_outColor,         \n\t"
						"_outTransparency   \n"
			   "   );");

	o.addToRSL("  outColor        = vector _outColor;");
	o.addToRSL("  outTransparency = vector _outTransparency;");

	o.addToRSL("}");
	o.endRSL();
}
MStatus OccLightNode::initialize()
{
	MFnTypedAttribute   tAttr;
	MFnStringData       tDefault;
	MFnNumericAttribute nAttr;
	MFnEnumAttribute    eAttr;
	MFnLightDataAttribute lAttr;
	MStatus status;
	MObject string;

	// Create input attributes
	aRmanShader = tAttr.create( MString("rmanShader"), MString("rms"), MFnData::kString, tDefault.create(getTypeName()), &status );
	MAKE_INPUT(tAttr);

	aRmanShaderType = tAttr.create( MString("rmanShaderType"), MString("rst"), MFnData::kString, tDefault.create(getShaderClasscification()), &status );
	MAKE_INPUT(tAttr);

	aRmanShaderLong = tAttr.create( MString("rmanShaderLong"), MString("rml"), MFnData::kString, aRmanShaderLong, &status );
	MAKE_INPUT(tAttr);

	aRmanShaderLif = tAttr.create(  MString("rmanShaderLif"),  MString("lif"), MFnData::kString, aRmanShaderLif, &status );
	MAKE_INPUT(tAttr);

	aRmanParams = tAttr.create(  MString("rmanParams"),  MString("rpr"), MFnData::kStringArray, aRmanParams, &status );
	MAKE_INPUT(tAttr);

	aRmanDetails = tAttr.create(  MString("rmanDetails"),  MString("rdt"), MFnData::kStringArray, aRmanDetails, &status );
	MAKE_INPUT(tAttr);

	aRmanTypes = tAttr.create(  MString("rmanTypes"),  MString("rty"), MFnData::kStringArray, aRmanTypes, &status );
	MAKE_INPUT(tAttr);

	aRmanDefaults = tAttr.create(  MString("rmanDefaults"),  MString("rdf"), MFnData::kStringArray, aRmanDefaults, &status );
	MAKE_INPUT(tAttr);

	aRmanArraySizes = tAttr.create(  MString("rmanArraySizes"),  MString("ras"), MFnData::kIntArray, aRmanArraySizes, &status );
	MAKE_INPUT(tAttr);

	aRmanLifCmds = tAttr.create(  MString("rmanLifCmds"),  MString("rlc"), MFnData::kStringArray, aRmanLifCmds, &status );
	MAKE_INPUT(tAttr);

	aRmanMethods = tAttr.create(  MString("rmanMethods"),  MString("rmt"), MFnData::kStringArray, aRmanMethods, &status );
	MAKE_INPUT(tAttr);

	aRmanIsOutput = tAttr.create(  MString("rmanIsOutput"),  MString("rio"), MFnData::kIntArray, aRmanIsOutput, &status );
	MAKE_INPUT(tAttr);

	aRmanAccept = tAttr.create(  MString("rmanAccept"),  MString("rma"), MFnData::kStringArray, aRmanAccept, &status );
	MAKE_INPUT(tAttr);


	aOutColor = nAttr.createColor("outColor", "oc");
	MAKE_OUTPUT(nAttr);
	aOutTransparency = nAttr.createColor("outTransparency", "ot");
	MAKE_OUTPUT(nAttr);

	IfMErrorWarn( addAttribute( aRmanShader ) );
	IfMErrorWarn( addAttribute( aRmanShaderType ) );
	IfMErrorWarn( addAttribute( aRmanShaderLong ) );
	IfMErrorWarn( addAttribute( aRmanShaderLif ) );
	IfMErrorWarn( addAttribute( aRmanParams ) );
	IfMErrorWarn( addAttribute( aRmanDetails ) );
	IfMErrorWarn( addAttribute( aRmanTypes ) );
	IfMErrorWarn( addAttribute( aRmanDefaults ) );
	IfMErrorWarn( addAttribute( aRmanArraySizes ) );
	IfMErrorWarn( addAttribute( aRmanLifCmds ) );
	IfMErrorWarn( addAttribute( aRmanMethods) );
	IfMErrorWarn( addAttribute( aRmanIsOutput) );
	IfMErrorWarn( addAttribute( aRmanAccept) );

	IfMErrorWarn( addAttribute( aOutColor ) );
	IfMErrorWarn( addAttribute( aOutTransparency ) );

	initialize_shader_parameters();

	return MS::kSuccess;
}
Пример #17
0
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
}
	void Renderer::_write_pfxhair(liqRibPfxHairData* pData, const structJob &currentJob__)
	{
		CM_TRACE_FUNC("_write_pfxhair("<<pData->getFullPathName()<<","<<currentJob__.name<<")");
		//
		if( pData->isEmpty() ) 
		{
			liquidMessage2(messageWarning, "pfxHair is empty: %s",  pData->getFullPathName());
			return;
		}

		//
 		liqRibNodePtr ribNode__ = liqRibTranslator::getInstancePtr()->htable->find(
 			pData->objDagPath.fullPathName(), 
 			pData->objDagPath,
 			MRT_Unknown
 			);
 		assert( ribNode__!=0 );
 		assert( ribNode__->path().fullPathName() == pData->objDagPath.fullPathName() );

		const bool bMotionBlur =
			ribNode__->motion.transformationBlur &&
			( ribNode__->object( 1 ) ) &&
			//( ribNode__->object(0)->type != MRT_Locator ) && // Why the f**k do we not allow motion blur for locators?
			( !currentJob__.isShadow || currentJob__.deepShadows );

		bool bGeometryMotion = 
			liqglo.liqglo_doDef 
			&& bMotionBlur
			&& ( ribNode__->object(0)->type != MRT_RibGen );

		unsigned int sample_first = 0;
		unsigned int sample_last = bGeometryMotion? (liqglo.liqglo_motionSamples - 1):sample_first;

		_s("\n// Renderer::exportOneGeometry_Mesh("<<ribNode__->name.asChar()<<","<<sample_first<<","<<sample_last<<")");

		const liqRibDataPtr data = ribNode__->object(sample_first)->getDataPtr();

//


//		//
		MStatus status;

		int degree;
		MFnDagNode fnDN(data->objDagPath);
		IfMErrorWarn( liquidGetPlugValue(fnDN, "degree", degree, status) );
//
//		MIntArray triangleCounts,triangleVertices;
//		IfMErrorWarn(fnMesh.getTriangles(triangleCounts, triangleVertices));
//
//		MString currentUVsetName;
//		IfMErrorWarn(fnMesh.getCurrentUVSetName(currentUVsetName));
//
		// geometry data (shape)
		_s("\n//############################### mesh #");
		_s("//shape full path name="<<data->getFullPathName());
#ifdef TRANSFORM_SHAPE_PAIR
		const std::string objectName(ribNode__->name.asChar());//shape
#else// SHAPE SHAPE_object PAIR
		const std::string objectName(getObjectName(ribNode__->name.asChar()));//shape+"_object"
#endif

		//todo
	}
Пример #19
0
	void Helper4::addVariableSS(const std::string& param_name_as, const std::string& param_type_as, const std::string& param_name_maya )
	{
		//std::string ss_name(getSurfaceShaderName(m_nodename,m_ss_model));

		asr::ParamArray ss_params;
		{
			std::string param_value;
			const std::string plugName(param_name_maya);

			MString fullPlugName((m_nodename+"."+plugName).c_str());
			int connected = liquidmaya::ShaderMgr::getSingletonPtr()->convertibleConnection(fullPlugName.asChar());
			if(connected ==0)
			{
				if( isType("color", param_type_as) )
				{
					MDoubleArray val; 
					val.setLength(3);
					IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", val));

					param_value = m_nodename+"_"+plugName;
					createColor3(m_assembly->colors(), param_value.c_str(), val[0], val[1], val[2]);
				}
				else if( isType("scalar", param_type_as) )
				{
					MDoubleArray val; 
					val.setLength(3);
					IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", val));

					//val contains (r,b,g) value, but I only use val[0] for 'scalar'
					MString strVal0;
					strVal0.set(val[0]);
					param_value = strVal0.asChar();
				}
				else if( isType("string", param_type_as))
				{
					MString val;
					IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", val));
					param_value = val.asChar();
				}
				else {
					liquidMessage2(messageWarning,"only [color],[scalar],[string] are handled for an unconnected plug in Surface Shader. "
						"the plug of %s is unhandled.", fullPlugName.asChar());
					param_value = "unhandled";
				}
			}
			else if(connected == 1)//the plug is linked in.
			{
				if( isType("texture_instance", param_type_as) )
				{
					MStringArray srcPlug;
					IfMErrorWarn(MGlobal::executeCommand("listConnections -source true -plugs true \""+fullPlugName+"\"", srcPlug));
					assert(srcPlug.length()==1);
					MStringArray src;
					srcPlug[0].split('.',src);
					MString srcNode(src[0]);

					if( is2DTexture(srcNode) || is3DTexture(srcNode) )
					{
						//visitFile(srcNode.asChar());
						param_value = getTextureInstanceName(srcNode.asChar());
					}else{
						liquidMessage2(messageWarning,"only [texture2D],[texture3D] are handled for a texture_instance connected-in plug in Surface Shader."
							"the plug of %s is unhandled.", fullPlugName.asChar());
						param_value = "unhandled";
					}
				}
				else{
					liquidMessage2(messageWarning,"only [texture_instance] is handled for a connected-in plug in Surface Shader."
						"the plug of %s is unhandled.", fullPlugName.asChar());
					param_value = "unhandled";
				}
			}else{
				liquidMessage2(messageWarning,"[%s] is connected out.", fullPlugName.asChar());
			}
			//
			addVariableSS(param_name_as, param_value);
		}
	}
Пример #20
0
	void Helper4::addVariableBSDF( const std::string& param_name_as, const std::string& param_type_as, const std::string& param_name_maya )
	{
		std::string param_value;
		const std::string plugName(param_name_maya);

		MString fullPlugName((m_nodename+"."+plugName).c_str());
		int connected = liquidmaya::ShaderMgr::getSingletonPtr()->convertibleConnection(fullPlugName.asChar());
		if( connected == 0 )
		{
			if( isType("color", param_type_as) )
			{
				MDoubleArray val; 
				val.setLength(3);
				IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", val));

				param_value = m_nodename+"_"+plugName;
				createColor3(m_assembly->colors(), param_value.c_str(), val[0], val[1], val[2]);
			}
			else if( isType("scalar", param_type_as) )
			{
				MDoubleArray val; 
				val.setLength(3);
				IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", val));

				//val contains (r,b,g) value, but I only use val[0] for 'scalar'
				MString strVal0;
				strVal0.set(val[0]);
				param_value = strVal0.asChar();
			}
			else {
				liquidMessage2(messageWarning,"only [color],[scalar] are handled for an unconnected plug in BSDF. "
					"the plug of %s is unhandled.", fullPlugName.asChar());
				param_value = "unhandled";
			}
		}
		else if(connected == 1)//the color plug is linked in.
		{
			if( isType("texture_instance", param_type_as) )
			{
				MStringArray srcPlug;
				IfMErrorWarn(MGlobal::executeCommand("listConnections -source true -plugs true \""+fullPlugName+"\"", srcPlug));
				assert(srcPlug.length()==1);
				MStringArray src;
				srcPlug[0].split('.',src);
				MString srcNode(src[0]);
				if( is2DTexture(srcNode) || is3DTexture(srcNode) )
				{
					//visitFile(srcNode.asChar());
					param_value = getTextureInstanceName(srcNode.asChar());
				}else{
					liquidMessage2(messageWarning,"type of [%s] is unhandled.(not 2Dtexture and 3Dtexture). [%s]", srcNode.asChar(), fullPlugName.asChar());
					param_value = "unhandled";
				}
			}
			else if( isType("bsdf", param_type_as) )
			{
				//bsdf0 value
				MString srcBSDFModel; 
				IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", srcBSDFModel));

				MStringArray srcPlug;
				IfMErrorWarn(MGlobal::executeCommand("listConnections -source true -plugs true \""+fullPlugName+"\"", srcPlug));
				assert(srcPlug.length()==1);
				MStringArray src;
				srcPlug[0].split('.',src);
				MString srcNode(src[0]);

				param_value = srcNode.asChar();
			}
			else{
				liquidMessage2(messageWarning,"only [texture_instance],[bsdf] are handled for a connected-in plug in BSDF."
					"the plug of %s is unhandled.", fullPlugName.asChar());
				param_value = "unhandled";
			}

		}else{// $(fullPlugName) is connected out
			// if $(fullPlugName) plug is connected out to "bsdf0"/"bsdf1" of a "bsdf_mix" node,
			// we also need to create this plug for appleseed

			// get destination node(s)
			MStringArray desNodePlug;
			IfMErrorWarn(MGlobal::executeCommand("listConnections -destination true -plugs true \""+fullPlugName+"\"", desNodePlug));
			
			// check whether $(fullPlugName) is connected to a BSDF node
			bool isConnectedToA_BSDFMixNode = false;
			MString desPlug;
			for(std::size_t i = 0; i< desNodePlug.length(); ++i)
			{
				MStringArray des;
				desNodePlug[i].split('.',des);
				MString desNode(des[0]);

				//destination node BSDF type
				MString desNodeBSDFType;
				IfMErrorWarn(MGlobal::executeCommand( "getAttr \""+desNode+".rmanShaderType\"", desNodeBSDFType));

				if(desNodeBSDFType == "bsdf_mix")
				{
					isConnectedToA_BSDFMixNode = true;
					desPlug = des[1];
				}
			}

			// if $(fullPlugName) is connected out to "bsdf0"/"bsdf1" of a "bsdf_mix" node
			// we also need to create this plug for appleseed
			if( isConnectedToA_BSDFMixNode && (desPlug=="bsdf0" ||desPlug=="bsdf1") )
			{
				if( isType("color", param_type_as) )
				{
					MDoubleArray val; 
					val.setLength(3);
					IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", val));

					param_value = m_nodename+"_"+plugName;
					createColor3(m_assembly->colors(), param_value.c_str(), val[0], val[1], val[2]);
				}
				else if( isType("scalar", param_type_as) )
				{
					MDoubleArray val; 
					val.setLength(3);
					IfMErrorWarn(MGlobal::executeCommand("getAttr (\""+fullPlugName+"\")", val));

					//val contains (r,b,g) value, but I only use val[0] for 'scalar'
					MString strVal0;
					strVal0.set(val[0]);
					param_value = strVal0.asChar();
				}
				else if( isType("texture_instance", param_type_as) )
				{
					MStringArray srcPlug;
					IfMErrorWarn(MGlobal::executeCommand("listConnections -source true -plugs true \""+fullPlugName+"\"", srcPlug));
					assert(srcPlug.length()==1);
					MStringArray src;
					srcPlug[0].split('.',src);
					MString srcNode(src[0]);
					if( is2DTexture(srcNode) || is3DTexture(srcNode) )
					{
						//visitFile(srcNode.asChar());
						param_value = getTextureInstanceName(srcNode.asChar());
					}else{
						liquidMessage2(messageWarning,"type of [%s] is unhandled.(not 2Dtexture and 3Dtexture). [%s]", srcNode.asChar(), fullPlugName.asChar());
						param_value = "unhandled";
					}
				}
				else {
					liquidMessage2(messageWarning,"only [color],[scalar],[texture_instance] are handled for an connected-out plug in BSDF. "
						"the plug of %s is unhandled.", fullPlugName.asChar());
					param_value = "unhandled";
				}
			}//if( nodetype=="bsdf_mix" && (desPlug=="bsdf0" ||desPlug=="bsdf1") )
			else {
				liquidMessage2(messageWarning,"[%s] is connected out. But not connected to brdf node, or not brdf0/brdf1 of a brdf node."
					" So I don't create the value for this plug.", fullPlugName.asChar());
			}
		}
		//
		addVariableBSDF(param_name_as, param_value);
	}
Пример #21
0
/// \brief	This function is called once when our plugin is loaded. We can use
///			it to register any custom nodes, mel functions etc.
/// \param	obj	-	a handle to the loaded plugin
/// \return	an MStatus error code
///
EXPORT MStatus initializePlugin( MObject obj )
{
	_LogFunctionCall("initializePlugin()");
	
	init_logs("c:/bulletSPH.log");
	MStatus   status;

	// a classification for where the node will appear on the create menus
	// of the multilister and hypershade.
	const MString UserClassify( "shader/surface" );

	MFnPlugin plugin( obj, "Rob Bateman", "1.0", "Any");

	//
	//status = plugin.registerNode( btSPHContext::typeName, 
	//								btSPHContext::typeId,
	//								btSPHContext::creator,
	//								btSPHContext::initialize,
	//								MPxNode::kLocatorNode );
	//IfMErrorMsgReturn(status, "regist btSPHContext error.", status);
	//MCallbackId CallbackID_AddSPHContext = 
	//	MDGMessage::addNodeAddedCallback(
	//	btSPHContext::addedCallback, 
	//	btSPHContext::typeName, &status
	//	);
	//IfMErrorWarn(status);
	//MCallbackId CallbackID_RemoveSPHContext = 
	//	MDGMessage::addNodeRemovedCallback(
	//	btSPHContext::removedCallback, 
	//	btSPHContext::typeName, &status
	//	);
	//IfMErrorWarn(status);

	////
	status = plugin.registerNode( btSPHNode::typeName, 
									btSPHNode::typeId,
									btSPHNode::creator,
									btSPHNode::initialize,
									MPxNode::kEmitterNode );
	IfMErrorMsgReturn(status, "regist btSPHNode error.", status);
	MCallbackId CallbackID_AddSPHNode = 
		MDGMessage::addNodeAddedCallback(
		btSPHNode::addedCallback, 
		btSPHNode::typeName, &status
		);
	IfMErrorWarn(status);
	MCallbackId CallbackID_RemoveSPHNode = 
		MDGMessage::addNodeRemovedCallback(
		btSPHNode::removedCallback,
		btSPHNode::typeName, &status
		);
	IfMErrorWarn(status);

	////
	//status = plugin.registerNode( simpleFluidEmitter::typeName,
	//	simpleFluidEmitter::typeId,
	//	simpleFluidEmitter::creator,
	//	simpleFluidEmitter::initialize,
	//	MPxNode::kFluidEmitterNode );
	//IfMErrorWarn(status);
	//
	////
	//status = plugin.registerNode( torusField::typeName,
	//	torusField::typeId,
	//	torusField::creator,
	//	torusField::initialize,
	//	MPxNode::kFieldNode );
	//IfMErrorWarn(status);

	//
	status = plugin.registerNode(
		particleAttrNode::typeName,
		particleAttrNode::typeId,
		particleAttrNode::creator,
		particleAttrNode::initialize,
		MPxNode::kParticleAttributeMapperNode );
	IfMErrorWarn(status);

	//
	status = plugin.registerCommand( 
		btSPHCmd::typeName, 
		btSPHCmd::creator, 
		btSPHCmd::newSyntax);
	IfMErrorMsgReturn(status, "regist btSPHCmd error.", status);

	//
	status = plugin.registerNode(
		btSPHMgrNode::typeName,
		btSPHMgrNode::typeId,
		btSPHMgrNode::creator,
		btSPHMgrNode::initialize,
		MPxNode::kDependNode );
	IfMErrorWarn(status);
	//
	MGlobal::executeCommand("source \"SPHMain.mel\"; g_btSPH_Start();");

	return status;
}
MStatus liqIPRNodeMessage::registerCallback()
{
	//MGlobal::displayInfo( "liqIPRNodeMessage::registerCallback()");

	MStatus 		stat;
	std::vector<MString> updateObjectName;
    MCallbackId     id;
    
	gatherUpdateObjects(updateObjectName);

    for ( unsigned int i=0; i<updateObjectName.size(); i++ )
    {
		MSelectionList selection;
		IfMErrorWarn(MGlobal::getSelectionListByName(updateObjectName[i], selection));

		if( selection.length() == 0 )//not found
			continue;

		MObject obj;
		IfMErrorWarn(selection.getDependNode( 0, obj ));

		MGlobal::displayInfo(MString("add callback for node: ") + updateObjectName[i]);

        //AttributeChangedCallback
	    id = MNodeMessage::addAttributeChangedCallback( obj, liquidIPR_AttributeChangedCallback, NULL,  &stat);
		IfMErrorWarn(stat);
	    if ( stat ) {
		    callbackIds.append( id );
    	} else {
	    	cout << "MNodeMessage.addAttributeChangedCallback("<<updateObjectName[i]<<") failed\n";
    	}

		//AttributeAddedOrRemovedCallback

		//NodeDirtyCallback
// 		id = MNodeMessage::addNodeDirtyCallback( node, liquidIPR_NodeDirtyCallback, NULL,  &stat);
// 		IfMErrorWarn(stat);
// 		if ( stat ) {
// 			callbackIds.append( id );
// 		} else {
// 			cout << "MNodeMessage.addNodeDirtyCallback failed\n";
// 		}

		//addNodeDirtyPlugCallback
// 		id = MNodeMessage::addNodeDirtyPlugCallback( node, liquidIPR_NodeDirtyPlugCallback, NULL,  &stat);
// 		IfMErrorWarn(stat);		
// 		if ( stat ) {
// 			callbackIds.append( id );
// 		} else {
// 			cout << "MNodeMessage.addNodeDirtyPlugCallback failed\n";
// 		}

		//addNameChangedCallback

		//addNodeAboutToDeleteCallback
		//addNodePreRemovalCallback
		//addNodeDestroyedCallback
		//addKeyableChangeOverride
		//
    }
    
	return MS::kSuccess;
}