#include "AbcWriteJob.h"
#include <Alembic/AbcCoreOgawa/All.h>
namespace
{
void hasDuplicates(const util::ShapeSet & dagPath, unsigned int stripDepth)
{
std::map<std::string, MDagPath> roots;
const util::ShapeSet::const_iterator end = dagPath.end();
for (util::ShapeSet::const_iterator it = dagPath.begin();
it != end; it++)
{
std::string fullName = it->fullPathName().asChar();
if (!fullName.empty() && fullName[0] == '|')
{
fullName = fullName.substr(1);
}
if (stripDepth > 0)
{
fullName = util::stripNamespaces(name, stripDepth).
asChar();
}
std::map<std::string, MDagPath>::iterator strIt =
roots.find(fullName);
if (strIt != roots.end())
{
std::string theError = "Conflicting root node names specified: ";
theError += it->fullPathName().asChar();
theError += " ";
theError += strIt->second.fullPathName().asChar();
if (stripDepth > 0)
{
theError += " with -stripNamespace specified.";
}
throw std::runtime_error(theError);
}
else
{
roots[fullName] = *it;
}
}
}
void addToString(std::string & str,
const std::string & name, unsigned int value)
{
if (value > 0)
{
std::stringstream ss;
ss << value;
str += name + std::string(" ") + ss.str() + std::string(" ");
}
}
void processCallback(std::string iCallback, bool isMelCallback,
{
if (iCallback.empty())
return;
size_t pos = iCallback.find("#FRAME#");
if ( pos != std::string::npos )
{
std::stringstream sstrm;
sstrm.precision(std::numeric_limits<double>::digits10);
sstrm << iFrame;
std::string str = sstrm.str();
iCallback.replace(pos, 7, str);
}
pos = iCallback.find("#BOUNDS#");
if ( pos != std::string::npos )
{
std::stringstream sstrm;
sstrm.precision(std::numeric_limits<float>::digits10);
sstrm <<
" " << iBbox.
min().
x <<
" " << iBbox.
min().
y <<
" " <<
iBbox.
min().
z <<
" " << iBbox.
max().
x <<
" " <<
std::string str = sstrm.str();
iCallback.replace(pos, 8, str);
}
pos = iCallback.find("#BOUNDSARRAY#");
if ( pos != std::string::npos )
{
std::stringstream sstrm;
sstrm.precision(std::numeric_limits<float>::digits10);
if (isMelCallback)
{
sstrm << " {";
}
else
{
sstrm << " [";
}
sstrm << iBbox.
min().
x <<
"," << iBbox.
min().
y <<
"," <<
iBbox.
min().
z <<
"," << iBbox.
max().
x <<
"," <<
if (isMelCallback)
{
sstrm << "} ";
}
else
{
sstrm << "] ";
}
std::string str = sstrm.str();
iCallback.replace(pos, 13, str);
}
if (isMelCallback)
else
}
}
AbcWriteJob::AbcWriteJob(const char * iFileName,
bool iAsOgawa,
std::set<double> & iTransFrames,
Alembic::AbcCoreAbstract::TimeSamplingPtr iTransTime,
std::set<double> & iShapeFrames,
Alembic::AbcCoreAbstract::TimeSamplingPtr iShapeTime,
const JobArgs & iArgs)
{
mFileName = iFileName;
mAsOgawa = iAsOgawa;
mBoxIndex = 0;
mArgs = iArgs;
mShapeSamples = 1;
mTransSamples = 1;
if (mArgs.useSelectionList)
{
bool emptyDagPaths = mArgs.dagPaths.empty();
mSList = activeList;
unsigned int selectionSize = activeList.
length();
for (unsigned int index = 0; index < selectionSize; index ++)
{
if (status == MS::kSuccess)
{
unsigned int length = dagPath.
length();
while (--length)
{
}
if (emptyDagPaths)
{
mArgs.dagPaths.insert(dagPath);
}
}
}
}
mTransFrames = iTransFrames;
mShapeFrames = iShapeFrames;
mTransTime = iTransTime;
mTransTimeIndex = 0;
mShapeTime = iShapeTime;
mShapeTimeIndex = 0;
assert(!mTransFrames.empty() && !mShapeFrames.empty());
mFirstFrame = *(mTransFrames.begin());
std::set<double>::iterator last = mTransFrames.end();
last--;
mLastFrame = *last;
last = mShapeFrames.end();
last--;
double lastShapeFrame = *last;
if (lastShapeFrame > mLastFrame)
mLastFrame = lastShapeFrame;
}
{
if (iFrame == mFirstFrame)
{
{
if (mArgs.useSelectionList && !mSList.hasItem(path))
{
continue;
}
if (status == MS::kSuccess)
{
MPlug riCurvesPlug = dagNode.findPlug(
"riCurves",
true, &status);
if ( status == MS::kSuccess && riCurvesPlug.
asBool() ==
true)
{
std::map< MDagPath, util::ShapeSet, util::cmpDag >::iterator iter =
mBBoxShapeMap.insert(std::make_pair(mCurDag, util::ShapeSet())).first;
if (iter != mBBoxShapeMap.end())
(*iter).second.insert(path);
}
{
if (util::isIntermediate(object))
continue;
std::map< MDagPath, util::ShapeSet, util::cmpDag >::iterator iter =
mBBoxShapeMap.insert(std::make_pair(mCurDag, util::ShapeSet())).first;
if (iter != mBBoxShapeMap.end())
(*iter).second.insert(path);
}
}
}
}
else
{
std::map< MDagPath, util::ShapeSet, util::cmpDag >::iterator iter =
mBBoxShapeMap.find(mCurDag);
if (iter != mBBoxShapeMap.end())
{
util::ShapeSet& paths = (*iter).second;
for (util::ShapeSet::iterator pathIter = paths.begin();
pathIter != paths.end(); pathIter++)
{
if (status == MS::kSuccess)
{
}
}
}
}
return curBBox;
}
bool AbcWriteJob::checkCurveGrp()
{
bool init = false;
int degree = 0;
for (; !itDag.isDone(); itDag.next())
{
if (itDag.getPath(curvePath) == MS::kSuccess)
{
{
if (!init)
{
degree = fn.degree();
form = fn.form();
init = true;
}
else
{
if (degree != fn.degree() || form != fn.form())
return false;
}
}
}
}
return true;
}
void AbcWriteJob::setup(double iFrame, MayaTransformWriterPtr iParent, GetMembersMap& gmMap)
{
if (mArgs.useSelectionList && !mSList.hasItem(mCurDag))
return;
if (util::isIntermediate(ob))
{
return;
}
if (mArgs.excludeInvisible && !util::isRenderable(ob))
{
return;
}
MPlug riCurvesPlug = fnDepNode.findPlug(
"riCurves",
true, &status);
bool riCurvesVal = riCurvesPlug.
asBool();
bool writeOutAsGroup = false;
if (riCurvesVal)
{
writeOutAsGroup = checkCurveGrp();
if (writeOutAsGroup == false)
{
MString msg =
"Curves have different degrees or close ";
msg += "states, not writing out as curve group";
}
}
if ( status == MS::kSuccess && riCurvesVal && writeOutAsGroup)
{
if( !mArgs.writeCurvesGroup )
{
return;
}
MayaNurbsCurveWriterPtr nurbsCurve;
if (iParent == NULL)
{
Alembic::Abc::OObject obj = mRoot.getTop();
nurbsCurve = MayaNurbsCurveWriterPtr(new MayaNurbsCurveWriter(
mCurDag, obj, mShapeTimeIndex, true, mArgs));
}
else
{
Alembic::Abc::OObject obj = iParent->getObject();
nurbsCurve = MayaNurbsCurveWriterPtr(new MayaNurbsCurveWriter(
mCurDag, obj, mShapeTimeIndex, true, mArgs));
}
if (nurbsCurve->isAnimated() && mShapeTimeIndex != 0)
{
mCurveList.push_back(nurbsCurve);
mStats.mCurveAnimNum++;
mStats.mCurveAnimCurves += nurbsCurve->getNumCurves();
mStats.mCurveAnimCVs += nurbsCurve->getNumCVs();
}
else
{
mStats.mCurveStaticNum++;
mStats.mCurveStaticCurves += nurbsCurve->getNumCurves();
mStats.mCurveStaticCVs += nurbsCurve->getNumCVs();
}
AttributesWriterPtr attrs = nurbsCurve->getAttrs();
if (mShapeTimeIndex != 0 && attrs->isAnimated())
mShapeAttrList.push_back(attrs);
}
{
MayaTransformWriterPtr trans;
if (status != MS::kSuccess)
{
MString msg =
"Initialize transform node ";
msg += mCurDag.fullPathName();
msg += " failed, skipping.";
return;
}
if (iParent == NULL)
{
Alembic::Abc::OObject obj = mRoot.getTop();
trans = MayaTransformWriterPtr(new MayaTransformWriter(
obj, mCurDag, mTransTimeIndex, mArgs));
}
else
{
trans = MayaTransformWriterPtr(new MayaTransformWriter(
*iParent, mCurDag, mTransTimeIndex, mArgs));
}
if (trans->isAnimated() && mTransTimeIndex != 0)
{
mTransList.push_back(trans);
mStats.mTransAnimNum++;
}
else
{
mStats.mTransStaticNum++;
}
AttributesWriterPtr attrs = trans->getAttrs();
if (mTransTimeIndex != 0 && attrs->isAnimated())
mTransAttrList.push_back(attrs);
unsigned int numChild = mCurDag.childCount();
for (unsigned int i = 0; i < numChild; ++i)
{
if (mCurDag.push(mCurDag.child(i)) == MS::kSuccess)
{
setup(iFrame, trans, gmMap);
mCurDag.pop();
}
}
}
{
if( !mArgs.writeLocators )
{
return;
}
if (status != MS::kSuccess)
{
MString msg =
"Initialize locator node ";
msg += mCurDag.fullPathName();
msg += " failed, skipping.";
return;
}
if (iParent != NULL)
{
Alembic::Abc::OObject obj = iParent->getObject();
MayaLocatorWriterPtr locator(new MayaLocatorWriter(
mCurDag, obj, mShapeTimeIndex, mArgs));
if (locator->isAnimated() && mShapeTimeIndex != 0)
{
mLocatorList.push_back(locator);
mStats.mLocatorAnimNum++;
}
else
{
mStats.mLocatorStaticNum++;
}
AttributesWriterPtr attrs = locator->getAttrs();
if (mShapeTimeIndex != 0 && attrs->isAnimated())
mShapeAttrList.push_back(attrs);
}
else
{
err += fnLocator.name() + " since it doesn't have a parent.";
}
}
{
if( !mArgs.writeParticles )
{
return;
}
if (status != MS::kSuccess)
{
MString msg =
"Initialize particle system ";
msg += mCurDag.fullPathName();
msg += " failed, skipping.";
return;
}
if (iParent != NULL)
{
Alembic::Abc::OObject obj = iParent->getObject();
MayaPointPrimitiveWriterPtr particle(new MayaPointPrimitiveWriter(
iFrame, mCurDag, obj, mShapeTimeIndex, mArgs));
if (particle->isAnimated() && mShapeTimeIndex != 0)
{
mPointList.push_back(particle);
mStats.mPointAnimNum++;
mStats.mPointAnimCVs += particle->getNumCVs();
}
else
{
mStats.mPointStaticNum++;
mStats.mPointStaticCVs += particle->getNumCVs();
}
AttributesWriterPtr attrs = particle->getAttrs();
if (mShapeTimeIndex != 0 && attrs->isAnimated())
mShapeAttrList.push_back(attrs);
}
else
{
err += mFnParticle.name() + " since it doesn't have a parent.";
}
}
{
if( !mArgs.writeMeshes)
{
return;
}
if (status != MS::kSuccess)
{
MString msg =
"Initialize mesh node ";
msg += mCurDag.fullPathName();
msg += " failed, skipping.";
return;
}
if (iParent != NULL)
{
Alembic::Abc::OObject obj = iParent->getObject();
MayaMeshWriterPtr mesh(new MayaMeshWriter(mCurDag, obj,
mShapeTimeIndex, mArgs, gmMap));
if (mesh->isAnimated() && mShapeTimeIndex != 0)
{
mMeshList.push_back(mesh);
if (mesh->isSubD())
{
mStats.mSubDAnimNum++;
mStats.mSubDAnimCVs += mesh->getNumCVs();
mStats.mSubDAnimFaces += mesh->getNumFaces();
}
else
{
mStats.mPolyAnimNum++;
mStats.mPolyAnimCVs += mesh->getNumCVs();
mStats.mPolyAnimFaces += mesh->getNumFaces();
}
}
else
{
if (mesh->isSubD())
{
mStats.mSubDStaticNum++;
mStats.mSubDStaticCVs += mesh->getNumCVs();
mStats.mSubDStaticFaces += mesh->getNumFaces();
}
else
{
mStats.mPolyStaticNum++;
mStats.mPolyStaticCVs += mesh->getNumCVs();
mStats.mPolyStaticFaces += mesh->getNumFaces();
}
}
AttributesWriterPtr attrs = mesh->getAttrs();
if (mShapeTimeIndex != 0 && attrs->isAnimated())
mShapeAttrList.push_back(attrs);
}
else
{
err += fnMesh.name() + " since it doesn't have a parent.";
}
}
{
if( !mArgs.writeCameras )
{
return;
}
if (status != MS::kSuccess)
{
MString msg =
"Initialize camera node ";
msg += mCurDag.fullPathName();
msg += " failed, skipping.";
return;
}
if (iParent != NULL)
{
Alembic::Abc::OObject obj = iParent->getObject();
MayaCameraWriterPtr camera(new MayaCameraWriter(
mCurDag, obj, mShapeTimeIndex, mArgs));
if (camera->isAnimated() && mShapeTimeIndex != 0)
{
mCameraList.push_back(camera);
mStats.mCameraAnimNum++;
}
else
mStats.mCameraStaticNum++;
AttributesWriterPtr attrs = camera->getAttrs();
if (mShapeTimeIndex != 0 && attrs->isAnimated())
mShapeAttrList.push_back(attrs);
}
else
{
err += fnCamera.name() + " since it doesn't have a parent.";
}
}
{
if( !mArgs.writeNurbsSurfaces )
{
return;
}
if (status != MS::kSuccess)
{
MString msg =
"Initialize nurbs surface ";
msg += mCurDag.fullPathName();
msg += " failed, skipping.";
return;
}
if (iParent != NULL)
{
Alembic::Abc::OObject obj = iParent->getObject();
MayaNurbsSurfaceWriterPtr nurbsSurface(new MayaNurbsSurfaceWriter(
mCurDag, obj, mShapeTimeIndex, mArgs));
if (nurbsSurface->isAnimated() && mShapeTimeIndex != 0)
{
mNurbsList.push_back(nurbsSurface);
mStats.mNurbsAnimNum++;
mStats.mNurbsAnimCVs += nurbsSurface->getNumCVs();
}
else
{
mStats.mNurbsStaticNum++;
mStats.mNurbsStaticCVs += nurbsSurface->getNumCVs();
}
AttributesWriterPtr attrs = nurbsSurface->getAttrs();
if (mShapeTimeIndex != 0 && attrs->isAnimated())
mShapeAttrList.push_back(attrs);
}
else
{
err += fnNurbsSurface.name() + " since it doesn't have a parent.";
}
}
{
if( !mArgs.writeNurbsCurves )
{
return;
}
if (status != MS::kSuccess)
{
MString msg =
"Initialize curve node ";
msg += mCurDag.fullPathName();
msg += " failed, skipping.";
return;
}
if (iParent != NULL)
{
Alembic::Abc::OObject obj = iParent->getObject();
MayaNurbsCurveWriterPtr nurbsCurve(new MayaNurbsCurveWriter(
mCurDag, obj, mShapeTimeIndex, false, mArgs));
if (nurbsCurve->isAnimated() && mShapeTimeIndex != 0)
{
mCurveList.push_back(nurbsCurve);
mStats.mCurveAnimNum++;
mStats.mCurveAnimCurves++;
mStats.mCurveAnimCVs += nurbsCurve->getNumCVs();
}
else
{
mStats.mCurveStaticNum++;
mStats.mCurveStaticCurves++;
mStats.mCurveStaticCVs += nurbsCurve->getNumCVs();
}
AttributesWriterPtr attrs = nurbsCurve->getAttrs();
if (mShapeTimeIndex != 0 && attrs->isAnimated())
mShapeAttrList.push_back(attrs);
}
else
{
err += fnNurbsCurve.name() + " since it doesn't have a parent.";
}
}
else
{
MString warn = mCurDag.fullPathName() +
" is an unsupported type of ";
}
}
AbcWriteJob::~AbcWriteJob()
{
}
bool AbcWriteJob::eval(double iFrame)
{
if (iFrame == mFirstFrame)
{
hasDuplicates(mArgs.dagPaths, mArgs.stripNamespace);
std::string appWriter = "Maya ";
appWriter += " AbcExport v";
appWriter += ABCEXPORT_VERSION;
std::string userInfo = "Exported from: ";
if (userInfo.find('=') != std::string::npos ||
userInfo.find(';') != std::string::npos)
{
userInfo = "";
}
mRoot = CreateArchiveWithInfo(Alembic::AbcCoreOgawa::WriteArchive(),
mFileName, appWriter, userInfo,
Alembic::Abc::ErrorHandler::kThrowPolicy);
mShapeTimeIndex = mRoot.addTimeSampling(*mShapeTime);
mTransTimeIndex = mRoot.addTimeSampling(*mTransTime);
mBoxProp = Alembic::AbcGeom::CreateOArchiveBounds(mRoot,
mTransTimeIndex);
if (!mRoot.valid())
{
std::string theError = "Unable to create abc file";
throw std::runtime_error(theError);
}
mArgs.setFirstAnimShape = (iFrame == *mShapeFrames.begin());
util::ShapeSet::const_iterator end = mArgs.dagPaths.end();
GetMembersMap gmMap;
for (util::ShapeSet::const_iterator it = mArgs.dagPaths.begin();
it != end; ++it)
{
mCurDag = *it;
setup(iFrame * util::spf(), MayaTransformWriterPtr(), gmMap);
}
perFrameCallback(iFrame);
}
else
{
std::set<double>::iterator checkFrame = mShapeFrames.find(iFrame);
bool foundShapeFrame = false;
if (checkFrame != mShapeFrames.end())
{
assert(mRoot != NULL);
foundShapeFrame = true;
mShapeSamples ++;
double curTime = iFrame * util::spf();
std::vector< MayaCameraWriterPtr >::iterator camIt, camEnd;
camEnd = mCameraList.end();
for (camIt = mCameraList.begin(); camIt != camEnd; camIt++)
{
(*camIt)->write();
}
std::vector< MayaMeshWriterPtr >::iterator meshIt, meshEnd;
meshEnd = mMeshList.end();
for (meshIt = mMeshList.begin(); meshIt != meshEnd; meshIt++)
{
(*meshIt)->write();
if ((*meshIt)->isSubD())
{
mStats.mSubDAnimCVs += (*meshIt)->getNumCVs();
}
else
{
mStats.mPolyAnimCVs += (*meshIt)->getNumCVs();
}
}
std::vector< MayaNurbsCurveWriterPtr >::iterator curveIt, curveEnd;
curveEnd = mCurveList.end();
for (curveIt = mCurveList.begin(); curveIt != curveEnd; curveIt++)
{
(*curveIt)->write();
mStats.mCurveAnimCVs += (*curveIt)->getNumCVs();
}
std::vector< MayaNurbsSurfaceWriterPtr >::iterator nurbsIt,nurbsEnd;
nurbsEnd = mNurbsList.end();
for (nurbsIt = mNurbsList.begin(); nurbsIt != nurbsEnd; nurbsIt++)
{
(*nurbsIt)->write();
mStats.mNurbsAnimCVs += (*nurbsIt)->getNumCVs();
}
std::vector< MayaLocatorWriterPtr >::iterator locIt, locEnd;
locEnd = mLocatorList.end();
for (locIt = mLocatorList.begin(); locIt != locEnd; locIt++)
{
(*locIt)->write();
}
std::vector< MayaPointPrimitiveWriterPtr >::iterator ptIt, ptEnd;
ptEnd = mPointList.end();
for (ptIt = mPointList.begin(); ptIt != ptEnd; ptIt++)
{
(*ptIt)->write(curTime);
mStats.mPointAnimCVs += (*ptIt)->getNumCVs();
}
std::vector< AttributesWriterPtr >::iterator sattrCur =
mShapeAttrList.begin();
std::vector< AttributesWriterPtr >::iterator sattrEnd =
mShapeAttrList.end();
for(; sattrCur != sattrEnd; sattrCur++)
{
(*sattrCur)->write();
}
}
checkFrame = mTransFrames.find(iFrame);
bool foundTransFrame = false;
if (checkFrame != mTransFrames.end())
{
assert(mRoot.valid());
foundTransFrame = true;
mTransSamples ++;
std::vector< MayaTransformWriterPtr >::iterator tcur =
mTransList.begin();
std::vector< MayaTransformWriterPtr >::iterator tend =
mTransList.end();
for (; tcur != tend; tcur++)
{
(*tcur)->write();
}
std::vector< AttributesWriterPtr >::iterator tattrCur =
mTransAttrList.begin();
std::vector< AttributesWriterPtr >::iterator tattrEnd =
mTransAttrList.end();
for(; tattrCur != tattrEnd; tattrCur++)
{
(*tattrCur)->write();
}
}
if (foundTransFrame || foundShapeFrame)
perFrameCallback(iFrame);
}
if (iFrame == mLastFrame)
{
postCallback(iFrame);
return true;
}
return false;
}
void AbcWriteJob::perFrameCallback(double iFrame)
{
util::ShapeSet::iterator it = mArgs.dagPaths.begin();
const util::ShapeSet::iterator end = mArgs.dagPaths.end();
for (; it != end; it ++)
{
mCurDag = *it;
if (mArgs.worldSpace)
{
}
else
{
eMInvMat = mCurDag.exclusiveMatrixInverse();
}
bbox.
expand(getBoundingBox(iFrame, eMInvMat));
}
Alembic::Abc::V3d min(bbox.
min().
x, bbox.
min().
y, bbox.
min().
z);
Alembic::Abc::V3d max(bbox.
max().
x, bbox.
max().
y, bbox.
max().
z);
Alembic::Abc::Box3d b(min, max);
mBoxProp.set(b);
processCallback(mArgs.melPerFrameCallback, true, iFrame, bbox);
processCallback(mArgs.pythonPerFrameCallback, false, iFrame, bbox);
}
void AbcWriteJob::postCallback(double iFrame)
{
std::string statsStr = "";
addToString(statsStr, "SubDStaticNum", mStats.mSubDStaticNum);
addToString(statsStr, "SubDAnimNum", mStats.mSubDAnimNum);
addToString(statsStr, "SubDStaticCVs", mStats.mSubDStaticCVs);
addToString(statsStr, "SubDAnimCVs", mStats.mSubDAnimCVs);
addToString(statsStr, "SubDStaticFaces", mStats.mSubDStaticFaces);
addToString(statsStr, "SubDAnimFaces", mStats.mSubDAnimFaces);
addToString(statsStr, "PolyStaticNum", mStats.mPolyStaticNum);
addToString(statsStr, "PolyAnimNum", mStats.mPolyAnimNum);
addToString(statsStr, "PolyStaticCVs", mStats.mPolyStaticCVs);
addToString(statsStr, "PolyAnimCVs", mStats.mPolyAnimCVs);
addToString(statsStr, "PolyStaticFaces", mStats.mPolyStaticFaces);
addToString(statsStr, "PolyAnimFaces", mStats.mPolyAnimFaces);
addToString(statsStr, "CurveStaticNum", mStats.mCurveStaticNum);
addToString(statsStr, "CurveStaticCurves", mStats.mCurveStaticCurves);
addToString(statsStr, "CurveAnimNum", mStats.mCurveAnimNum);
addToString(statsStr, "CurveAnimCurves", mStats.mCurveAnimCurves);
addToString(statsStr, "CurveStaticCVs", mStats.mCurveStaticCVs);
addToString(statsStr, "CurveAnimCVs", mStats.mCurveAnimCVs);
addToString(statsStr, "PointStaticNum", mStats.mPointStaticNum);
addToString(statsStr, "PointAnimNum", mStats.mPointAnimNum);
addToString(statsStr, "PointStaticCVs", mStats.mPointStaticCVs);
addToString(statsStr, "PointAnimCVs", mStats.mPointAnimCVs);
addToString(statsStr, "NurbsStaticNum", mStats.mNurbsStaticNum);
addToString(statsStr, "NurbsAnimNum", mStats.mNurbsAnimNum);
addToString(statsStr, "NurbsStaticCVs", mStats.mNurbsStaticCVs);
addToString(statsStr, "NurbsAnimCVs", mStats.mNurbsAnimCVs);
addToString(statsStr, "TransStaticNum", mStats.mTransStaticNum);
addToString(statsStr, "TransAnimNum", mStats.mTransAnimNum);
addToString(statsStr, "LocatorStaticNum", mStats.mLocatorStaticNum);
addToString(statsStr, "LocatorAnimNum", mStats.mLocatorAnimNum);
addToString(statsStr, "CameraStaticNum", mStats.mCameraStaticNum);
addToString(statsStr, "CameraAnimNum", mStats.mCameraAnimNum);
if (statsStr.length() > 0)
{
Alembic::Abc::OStringProperty stats(mRoot.getTop().getProperties(),
"statistics");
stats.set(statsStr);
}
if (mTransTimeIndex != 0)
{
propName += static_cast<int>(mTransTimeIndex);
propName += ".samples";
Alembic::Abc::OUInt32Property samp(mRoot.getTop().getProperties(),
}
if (mShapeTimeIndex != 0 && mShapeTimeIndex != mTransTimeIndex)
{
propName += static_cast<int>(mShapeTimeIndex);
propName += ".samples";
Alembic::Abc::OUInt32Property samp(mRoot.getTop().getProperties(),
}
if (mArgs.melPostCallback.find("#BOUNDS#") != std::string::npos ||
mArgs.pythonPostCallback.find("#BOUNDS#") != std::string::npos ||
mArgs.melPostCallback.find("#BOUNDSARRAY#") != std::string::npos ||
mArgs.pythonPostCallback.find("#BOUNDSARRAY#") != std::string::npos)
{
util::ShapeSet::const_iterator it = mArgs.dagPaths.begin();
const util::ShapeSet::const_iterator end = mArgs.dagPaths.end();
for (; it != end; it ++)
{
mCurDag = *it;
if (mArgs.worldSpace)
{
}
else
{
eMInvMat = mCurDag.exclusiveMatrixInverse();
}
bbox.
expand(getBoundingBox(iFrame, eMInvMat));
}
}
processCallback(mArgs.melPostCallback, true, iFrame, bbox);
processCallback(mArgs.pythonPostCallback, false, iFrame, bbox);
}