#include "cgfxShaderCommon.h"
#include "cgfxVector.h"
#include <maya/MMatrix.h>
#include <maya/MFnMatrixAttribute.h>
#include <maya/MFnMatrixData.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MPlug.h>
#ifdef _WIN32
MTypeId cgfxVector::sId( 4084862001 );
#else
MTypeId cgfxVector::sId( 0xF37A0C31 );
#endif
cgfxVector::cgfxVector()
{
}
cgfxVector::~cgfxVector()
{
}
#ifdef CGFX_DEBUG
#include <stdarg.h>
#ifdef _WIN32
#endif
#else
static inline void dprintf(char* format, ...)
{
}
#endif
{
if( plug == sWorldVector ||
plug == sWorldVectorX ||
plug == sWorldVectorY ||
plug == sWorldVectorZ ||
plug == sWorldVectorW)
{
if (!status)
{
status.
perror(
"cgfxVector: isDirection handle");
return status;
}
if (!status)
{
status.
perror(
"cgfxVector: vector handle");
return status;
}
MPlug matrixPlug(thisMObject(), sMatrix);
if (matrixPlug.isNull())
{
OutputDebugString("matrixPlug is NULL!\n");
}
matrixPlug.getValue(oMatrix);
if (!status)
{
status.
perror(
"cgfxVector: matrix data");
}
matrix= fndMatrix.
matrix(&status);
if (!status)
{
status.
perror(
"cgfxVector: get matrix");
}
#if 0
if (!status)
{
status.
perror(
"cgfxVector: matrix handle");
}
oMatrix = dhMatrix.
data();
if (!status)
{
status.
perror(
"cgfxVector: matrix function set");
}
#endif
bool isDirection = dhIsDirection.
asBool();
double mat[4][4];
double ix, iy, iz, iw;
float ox, oy, oz, ow;
ix = vector[0];
iy = vector[1];
iz = vector[2];
iw = isDirection ? 0.0 : 1.0;
ox = (float)(mat[0][0] * ix +
mat[1][0] * iy +
mat[2][0] * iz +
mat[3][0] * iw);
oy = (float)(mat[0][1] * ix +
mat[1][1] * iy +
mat[2][1] * iz +
mat[3][1] * iw);
oz = (float)(mat[0][2] * ix +
mat[1][2] * iy +
mat[2][2] * iz +
mat[3][2] * iw);
ow = (float)(mat[0][3] * ix +
mat[1][3] * iy +
mat[2][3] * iz +
mat[3][3] * iw);
if (!status)
{
status.
perror(
"cgfxVector: worldVector handle");
return status;
}
if (!status)
{
status.
perror(
"cgfxVector: worldVectorW handle");
return status;
}
dhWVector.
set(ox, oy, oz);
}
else
{
return MS::kUnknownParameter;
}
return MS::kSuccess;
}
void* cgfxVector::creator()
{
return new cgfxVector;
}
{
sVectorX = nAttr.
create(
"vectorX",
"vx",
if (!status)
{
status.
perror(
"cgfxVector: create vectorX");
return status;
}
sVectorY = nAttr.
create(
"vectorY",
"vy",
if (!status)
{
status.
perror(
"cgfxVector: create vectorY");
return status;
}
sVectorZ = nAttr.
create(
"vectorZ",
"vz",
if (!status)
{
status.
perror(
"cgfxVector: create vectorZ");
return status;
}
sVector = nAttr.
create(
"vector",
"v",
sVectorX, sVectorY, sVectorZ, &status);
if (!status)
{
status.
perror(
"cgfxVector: create vector");
return status;
}
sIsDirection = nAttr.
create(
"isDirection",
"id",
if (!status)
{
status.
perror(
"cgfxVector: create isDirection");
return status;
}
sMatrix = mAttr.
create(
"matrix",
"m",
if (!status)
{
status.
perror(
"cgfxVector: create matrix");
return status;
}
sWorldVectorX = nAttr.
create(
"worldVectorX",
"wvx",
if (!status)
{
status.
perror(
"cgfxVector: create worldVectorX");
return status;
}
sWorldVectorY = nAttr.
create(
"worldVectorY",
"wvy",
if (!status)
{
status.
perror(
"cgfxVector: create worldVectorY");
return status;
}
sWorldVectorZ = nAttr.
create(
"worldVectorZ",
"wvz",
if (!status)
{
status.
perror(
"cgfxVector: create worldVectorZ");
return status;
}
sWorldVectorW = nAttr.
create(
"worldVectorW",
"wvw",
if (!status)
{
status.
perror(
"cgfxVector: create worldVectorW");
return status;
}
sWorldVector = nAttr.
create(
"worldVector",
"wv",
sWorldVectorX, sWorldVectorY, sWorldVectorZ,
&status);
if( !status )
{
status.
perror(
"cgfxVector: create worldVector");
return status;
}
status = addAttribute(sVector);
if (!status)
{
status.
perror(
"cgfxVector: addAttribute vector");
return status;
}
status = addAttribute(sIsDirection);
if (!status)
{
status.
perror(
"cgfxVector: addAttribute isDirection");
return status;
}
status = addAttribute(sMatrix);
if (!status)
{
status.
perror(
"cgfxVector: addAttribute matrix");
return status;
}
status = addAttribute(sWorldVector);
if (!status)
{
status.
perror(
"cgfxVector: addAttribute worldVector");
return status;
}
status = addAttribute(sWorldVectorW);
if (!status)
{
status.
perror(
"cgfxVector: addAttribute worldVectorW");
return status;
}
status = attributeAffects(sVector, sWorldVector);
if (!status)
{
status.
perror(
"cgfxVector: attributeAffects vector -> worldVector");
return status;
}
status = attributeAffects(sIsDirection, sWorldVector);
if (!status)
{
status.
perror(
"cgfxVector: attributeAffects isDirection -> worldVector");
return status;
}
status = attributeAffects(sMatrix, sWorldVector);
if (!status)
{
status.
perror(
"cgfxVector: attributeAffects matrix -> worldVector");
return status;
}
status = attributeAffects(sVector, sWorldVectorW);
if (!status)
{
status.
perror(
"cgfxVector: attributeAffects vector -> worldVectorW");
return status;
}
status = attributeAffects(sIsDirection, sWorldVectorW);
if (!status)
{
status.
perror(
"cgfxVector: attributeAffects isDirection -> worldVectorW");
return status;
}
status = attributeAffects(sMatrix, sWorldVectorW);
if (!status)
{
status.
perror(
"cgfxVector: attributeAffects matrix -> worldVectorW");
return status;
}
return MS::kSuccess;
}