#include "AbcBulletStringTable.h"
#include "MayaTransformCollectionWriter.h"
#include "MayaUtility.h"
#include <maya/MDataHandle.h>
#include <maya/MFnPluginData.h>
#include <maya/MPxData.h>
#include <maya/MDagPath.h>
#include <maya/MSelectionList.h>
#include <maya/MItSelectionList.h>
#include <maya/MQuaternion.h>
#include <maya/MGlobal.h>
#include <maya/MStringResource.h>
#include <maya/MMatrix.h>
#include <maya/MPoint.h>
void MayaTransformCollectionItem::sample(
double iFrame,
const MMatrix& wmat)
{
mXform = wmat * mInvMat;
#if _DEBUG
if (mVerbose)
{
unsigned int i = 0;
i=0;
args[i++] = name();
strItem.
format(
"sample=^1s, node=^2s",args);
strInfo += strItem;
i=0;
args[i++].
set(Alembic::AbcGeom::RadiansToDegrees(euler[0]));
args[i++].
set(Alembic::AbcGeom::RadiansToDegrees(euler[1]));
args[i++].
set(Alembic::AbcGeom::RadiansToDegrees(euler[2]));
strItem.
format(
"translation=[^1s, ^2s, ^3s], eulerRot=[^4s, ^5s, ^6s] degreesRot=[^7s, ^8s, ^9s]", args);
strInfo += ", ";
strInfo += strItem;
}
#endif
}
double MayaTransformCollectionItem::asDouble(Alembic::AbcGeom::XformOperationType channelOp, Alembic::Util::uint32_t channelNum)
{
double result = 0.0;
if (isTranslationChannel(channelOp,channelNum))
{
}
else if (isRotationChannel(channelOp,channelNum))
{
int index = (channelOp==Alembic::AbcGeom::kRotateXOperation) ? 0 : (channelOp==Alembic::AbcGeom::kRotateYOperation) ? 1 : 2;
result = mXform.eulerRotation()[index];
}
return result;
}
MayaTransformCollectionWriter::MayaTransformCollectionWriter
(
Alembic::AbcGeom::OObject & iParent,
Alembic::Util::uint32_t iTimeIndex,
const JobArgs & iArgs
)
: mVerbose(iArgs.verbose)
{
mCollisionObjectsPlug = depSolvedState.
findPlug(
"outCollisionObjects", &stat);
for (unsigned i=0, m = mCollisionObjectsPlug.evaluateNumElements(); i < m && mCollisionObjectsPlug.isArray(); i++)
{
MPlug elementPlug = mCollisionObjectsPlug[i];
stat = sList.
add(fullpath);
{
parentDagPath.pop();
invMat = parentDagPath.inclusiveMatrixInverse();
}
MayaTransformCollectionItemPtr sampler =
MayaTransformCollectionItemPtr(new MayaTransformCollectionItem(name, invMat, i, iArgs.verbose));
mSamplerList.push_back(sampler);
{
sampler->sample(iTimeIndex, dhMatrix.
asMatrix());
}
MayaTransformWriterPtr trans;
Alembic::Abc::OObject iRoot = iParent;
Alembic::Abc::OObject iCurrent = iRoot;
int j;
int numPaths = dag.length();
if (numPaths>1)
{
std::vector< MDagPath > dagList;
for (j = numPaths - 1; j > -1; j--, dag.pop())
{
dagList.push_back(dag);
}
std::vector< MDagPath >::iterator iStart = dagList.begin();
std::vector< MDagPath >::iterator iCur = dagList.end();
iCur--;
for (; iCur != iStart; iCur--)
{
MString currentDagPathName = (*iCur).fullPathName();
currentDagPathName.
split(
'|', pathArray);
iCurrent = iRoot;
for (
unsigned int i = 0; i < pathArray.
length(); i++) {
MString step = util::stripNamespaces(pathArray[i], iArgs.stripNamespace);
Alembic::Abc::OObject iPriorCurrent = iCurrent;
iCurrent = iCurrent.getChild(step.
asChar());
if (!iCurrent.valid()) {
iCurrent = iPriorCurrent;
trans = MayaTransformWriterPtr(new MayaTransformWriter(iCurrent, *iCur, iTimeIndex, iArgs));
iCurrent = iCurrent.getChild(step.
asChar());
}
}
}
}
assert(iCurrent.valid());
trans = MayaTransformWriterPtr(new MayaTransformWriter(
iCurrent, *sampler, iTimeIndex, iArgs));
mTransList.push_back(trans);
AttributesWriterPtr attrs = trans->getAttrs();
if (attrs)
{
if (iTimeIndex != 0 && attrs->isAnimated())
mTransAttrList.push_back(attrs);
}
}
}
MayaTransformCollectionWriter::~MayaTransformCollectionWriter()
{
}
void MayaTransformCollectionWriter::write(double iFrame)
{
std::vector< MayaTransformWriterPtr >::iterator tcur =
mTransList.begin();
std::vector< MayaTransformCollectionItemPtr >::iterator scur =
mSamplerList.begin();
std::vector< MayaTransformWriterPtr >::iterator tend =
mTransList.end();
std::vector< MayaTransformCollectionItemPtr >::iterator send =
mSamplerList.end();
assert( mSamplerList.size() == mTransList.size() );
for (unsigned int i=0, m = mCollisionObjectsPlug.evaluateNumElements(); tcur != tend && scur != send && i < m; tcur++, scur++, i++)
{
MPlug elementPlug = mCollisionObjectsPlug[i];
(*scur)->sample(iFrame, dhMatrix.
asMatrix());
(*tcur)->write();
}
std::vector< AttributesWriterPtr >::iterator tattrCur =
mTransAttrList.begin();
std::vector< AttributesWriterPtr >::iterator tattrEnd =
mTransAttrList.end();
for(; tattrCur != tattrEnd; tattrCur++)
{
(*tattrCur)->write();
}
}
bool MayaTransformCollectionWriter::isAnimated() const
{
return true;
}