#include <math.h>
#include <maya/MPxNode.h>
#include <maya/MIOStream.h>
#include <maya/MString.h>
#include <maya/MTypeId.h>
#include <maya/MPlug.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnLightDataAttribute.h>
#include <maya/MFloatVector.h>
#include <maya/MFnPlugin.h>
{
public:
LightNode();
~LightNode() override;
SchedulingType
schedulingType()
const override {
return SchedulingType::kParallel; }
static void * creator();
private
:
static MObject aLightShadowFraction;
static MObject aPreShadowIntensity;
};
MObject LightNode::aInputDirection;
MObject LightNode::aLightDirection;
MObject LightNode::aLightIntensity;
MObject LightNode::aLightShadowFraction;
MObject LightNode::aPreShadowIntensity;
MObject LightNode::aLightBlindData;
LightNode::LightNode()
{
}
LightNode::~LightNode()
{
}
void * LightNode::creator()
{
return new LightNode();
}
{
aInputDirection = nAttr.
createPoint(
"inputDirection",
"id" );
aLightDirection = nAttr.
createPoint(
"lightDirection",
"ld" );
aLightIntensity = nAttr.
createColor(
"lightIntensity",
"li" );
aLightAmbient = nAttr.
create(
"lightAmbient",
"la",
aLightDiffuse = nAttr.
create(
"lightDiffuse",
"ldf",
aLightSpecular = nAttr.
create(
"lightSpecular",
"ls",
aLightShadowFraction = nAttr.
create(
"lightShadowFraction",
"lsf",
aPreShadowIntensity = nAttr.
create(
"preShadowIntensity",
"psi",
aLightBlindData = nAttr.
createAddr(
"lightBlindData",
"lbld");
aLightData = lAttr.
create(
"lightData",
"ltd",
aLightDirection, aLightIntensity,
aLightAmbient,
aLightDiffuse, aLightSpecular,
aLightShadowFraction,
aPreShadowIntensity, aLightBlindData);
lAttr.
setDefault(-1.0f, 0.0f, 0.0f, 1.0f, 0.5f, 0.2f,
true,
true,
true, 0.0f, 1.0f, NULL);
CHECK_MSTATUS ( attributeAffects (aLightIntensity, aLightData) );
CHECK_MSTATUS ( attributeAffects (aLightDirection, aLightData) );
CHECK_MSTATUS ( attributeAffects (aLightShadowFraction, aLightData) );
CHECK_MSTATUS ( attributeAffects (aPreShadowIntensity, aLightData) );
CHECK_MSTATUS ( attributeAffects (aLightBlindData, aLightData) );
CHECK_MSTATUS ( attributeAffects (aInputDirection, aLightData) );
return MS::kSuccess;
}
{
if ((plug != aLightData) && (plug.
parent() != aLightData))
return MS::kUnknownParameter;
resultColor = LColor * LIntensity;
outIntensity = resultColor;
outDirection = LDirection;
bool& outAmbient = outLightDataHandle.
child(aLightAmbient).
asBool();
outAmbient = LAmbient;
bool& outDiffuse = outLightDataHandle.
child(aLightDiffuse).
asBool();
outDiffuse = LDiffuse;
bool& outSpecular = outLightDataHandle.
child(aLightSpecular).
asBool();
outSpecular = LSpecular;
float& outSFraction = outLightDataHandle.
child(aLightShadowFraction).
asFloat();
outSFraction = 1.0f;
float& outPSIntensity = outLightDataHandle.
child(aPreShadowIntensity).
asFloat();
outPSIntensity = (resultColor[0] + resultColor[1] + resultColor[2]) / 3.0f;
void*& outBlindData = outLightDataHandle.
child(aLightBlindData).
asAddr();
outBlindData = NULL;
return MS::kSuccess;
}
{
const MString UserClassify(
"light" );
MFnPlugin plugin( obj, PLUGIN_COMPANY,
"4.5",
"Any");
CHECK_MSTATUS ( plugin.registerNode(
"directLight", LightNode::id,
LightNode::creator, LightNode::initialize,
return MS::kSuccess;
}
{
return MS::kSuccess;
}