#include <maya/MGlobal.h>
#include "animFileExport.h"
#include <maya/MString.h>
#include <maya/MFnAnimCurve.h>
#include <iostream>
#include <fstream>
const char *kMmString = "mm";
const char *kCmString = "cm";
const char *kMString = "m";
const char *kKmString = "km";
const char *kInString = "in";
const char *kFtString = "ft";
const char *kYdString = "yd";
const char *kMiString = "mi";
const char *kMmLString = "millimeter";
const char *kCmLString = "centimeter";
const char *kMLString = "meter";
const char *kKmLString = "kilometer";
const char *kInLString = "inch";
const char *kFtLString = "foot";
const char *kYdLString = "yard";
const char *kMiLString = "mile";
const char *kRadString = "rad";
const char *kDegString = "deg";
const char *kMinString = "min";
const char *kSecString = "sec";
const char *kRadLString = "radian";
const char *kDegLString = "degree";
const char *kMinLString = "minute";
const char *kSecLString = "second";
const char *kHourTString = "hour";
const char *kMinTString = "min";
const char *kSecTString = "sec";
const char *kMillisecTString = "millisec";
const char *kGameTString = "game";
const char *kFileTString = "film";
const char *kPalTString = "pal";
const char *kNtscTString = "ntsc";
const char *kShowTString = "show";
const char *kPalFTString = "palf";
const char *kNtscFTString = "ntscf";
const char *kUnitlessString = "unitless";
const char *kUnknownTimeString = "Unknown Time Unit";
const char *kUnknownAngularString = "Unknown Angular Unit";
const char *kUnknownLinearString = "Unknown Linear Unit";
animUnitNames::animUnitNames()
{
}
animUnitNames::~animUnitNames()
{
}
{
switch(unit) {
break;
break;
break;
break;
default:
name.
set(kUnknownAngularString);
break;
}
}
{
switch(unit) {
break;
break;
break;
break;
default:
name.
set(kUnknownAngularString);
break;
}
}
{
switch(unit) {
break;
break;
break;
break;
break;
break;
break;
break;
default:
name.
set(kUnknownLinearString);
break;
}
}
{
switch(unit) {
break;
break;
break;
break;
break;
break;
break;
break;
default:
name.
set(kUnknownLinearString);
break;
}
}
{
switch(unit) {
break;
break;
break;
name.
set(kMillisecTString);
break;
break;
break;
break;
break;
break;
break;
break;
default:
name.
set(kUnknownTimeString);
break;
}
}
{
setToLongName(unit, name);
}
const char *kWordTangentGlobal = "global";
const char *kWordTangentFixed = "fixed";
const char *kWordTangentLinear = "linear";
const char *kWordTangentFlat = "flat";
const char *kWordTangentSmooth = "spline";
const char *kWordTangentStep = "step";
const char *kWordTangentStepNext = "stepnext";
const char *kWordTangentSlow = "slow";
const char *kWordTangentFast = "fast";
const char *kWordTangentClamped = "clamped";
const char *kWordTangentPlateau = "plateau";
const char *kWordTangentAuto = "auto";
const char *kWordConstant = "constant";
const char *kWordLinear = "linear";
const char *kWordCycle = "cycle";
const char *kWordCycleRelative = "cycleRelative";
const char *kWordOscillate = "oscillate";
const char *kWordTypeUnknown = "unknown";
const char *kWordTypeLinear = "linear";
const char *kWordTypeAngular = "angular";
const char *kWordTypeTime = "time";
const char *kWordTypeUnitless = "unitless";
const char *kAnim = "anim";
const char *kAnimData = "animData";
const char *kMovData = "movData";
const char *kMayaVersion = "mayaVersion";
const char *kAnimVersion = "animVersion";
const char *kTimeUnit = "timeUnit";
const char *kLinearUnit = "linearUnit";
const char *kAngularUnit = "angularUnit";
const char *kStartTime = "startTime";
const char *kEndTime = "endTime";
const char *kStartUnitless = "startUnitless";
const char *kEndUnitless = "endUnitless";
const char *kAnimVersionString = "1.1";
const char *kTwoSpace = " ";
const char *kInputString = "input";
const char *kOutputString = "output";
const char *kWeightedString = "weighted";
const char *kPreInfinityString = "preInfinity";
const char *kPostInfinityString = "postInfinity";
const char *kInputUnitString = "inputUnit";
const char *kOutputUnitString = "outputUnit";
const char *kTanAngleUnitString = "tangentAngleUnit";
const char *kKeysString = "keys";
const char kSemiColonChar = ';';
const char kSpaceChar = ' ';
const char kBraceLeftChar = '{';
const char kBraceRightChar = '}';
animBase::animBase ()
{
resetUnits();
}
animBase::~animBase()
{
}
void animBase::resetUnits()
{
}
const char *
{
switch (type) {
return (kWordTangentGlobal);
return (kWordTangentFixed);
return (kWordTangentLinear);
return (kWordTangentFlat);
return (kWordTangentSmooth);
return (kWordTangentStep);
return (kWordTangentSlow);
return (kWordTangentFast);
return (kWordTangentClamped);
return (kWordTangentPlateau);
return (kWordTangentStepNext);
return (kWordTangentAuto);
default:
break;
}
return (kWordTangentGlobal);
}
const char *
{
switch (type) {
return (kWordConstant);
return (kWordLinear);
return (kWordCycle);
return (kWordCycleRelative);
return (kWordOscillate);
default:
break;
}
return (kWordConstant);
}
const char *
{
switch (type) {
return (kWordTypeLinear);
return (kWordTypeAngular);
return (kWordTypeTime);
return (kWordTypeUnitless);
return (kWordTypeUnitless);
}
return (kWordTypeUnknown);
}
const char *
animBase::boolInputTypeAsWord(bool isUnitless)
{
if (isUnitless) {
return (kWordTypeUnitless);
} else {
return (kWordTypeTime);
}
}
animWriter::animWriter()
{
}
animWriter::~animWriter()
{
}
bool animWriter::writeHeader(std::ofstream& clip,
double startTime, double endTime,
double startUnitless, double endUnitless
)
{
if (!clip) {
return false;
}
clip << kAnimVersion << kSpaceChar << kAnimVersionString << kSemiColonChar << std::endl;
if (startTime != endTime) {
animUnitNames::setToShortName(timeUnit, unit);
clip << kTimeUnit << kSpaceChar << unit << kSemiColonChar << std::endl;
animUnitNames::setToShortName(linearUnit, unit);
clip << kLinearUnit << kSpaceChar << unit << kSemiColonChar << std::endl;
animUnitNames::setToShortName(angularUnit, unit);
clip << kAngularUnit << kSpaceChar << unit << kSemiColonChar << std::endl;
clip << kStartTime << kSpaceChar << startTime << kSemiColonChar << std::endl;
clip << kEndTime << kSpaceChar << endTime << kSemiColonChar << std::endl;
}
if (startUnitless != endUnitless) {
clip << kStartUnitless << kSpaceChar << startUnitless <<
kSemiColonChar << std::endl;
clip << kEndUnitless << kSpaceChar << endUnitless <<
kSemiColonChar << std::endl;
}
return true;
}
bool animWriter::writeAnimCurve(std::ofstream &clip,
bool verboseUnits )
{
if (NULL == animCurveObj || animCurveObj->
isNull() || !clip) {
return true;
}
if (MS::kSuccess != status) {
std::cerr << "Error: Could not read the anim curve for export." << std::endl;
return false;
}
clip << kAnimData << kSpaceChar << kBraceLeftChar << std::endl;
clip << kTwoSpace << kInputString << kSpaceChar <<
boolInputTypeAsWord(animCurve.isUnitlessInput()) <<
kSemiColonChar << std::endl;
clip << kTwoSpace << kOutputString << kSpaceChar <<
outputTypeAsWord(animCurve.animCurveType()) << kSemiColonChar << std::endl;
clip << kTwoSpace << kWeightedString << kSpaceChar <<
(animCurve.isWeighted() ? 1 : 0) << kSemiColonChar << std::endl;
if (verboseUnits) {
clip << kTwoSpace << kInputUnitString << kSpaceChar;
if (animCurve.isTimeInput()) {
animUnitNames::setToShortName(timeUnit, unitName);
clip << unitName;
} else {
clip << kUnitlessString;
}
clip << kSemiColonChar << std::endl;
clip << kTwoSpace << kOutputUnitString << kSpaceChar;
}
double conversion = 1.0;
switch (animCurve.animCurveType()) {
animUnitNames::setToShortName(angularUnit, unitName);
if (verboseUnits) clip << unitName;
{
conversion = angle.as(angularUnit);
}
break;
animUnitNames::setToShortName(linearUnit, unitName);
if (verboseUnits) clip << unitName;
{
conversion = distance.as(linearUnit);
}
break;
animUnitNames::setToShortName(timeUnit, unitName);
if (verboseUnits) clip << unitName;
break;
default:
if (verboseUnits) clip << kUnitlessString;
break;
}
if (verboseUnits) clip << kSemiColonChar << std::endl;
if (verboseUnits) {
animUnitNames::setToShortName(angularUnit, angleUnitName);
clip << kTwoSpace << kTanAngleUnitString <<
kSpaceChar << angleUnitName << kSemiColonChar << std::endl;
}
clip << kTwoSpace << kPreInfinityString << kSpaceChar <<
infinityTypeAsWord(animCurve.preInfinityType()) <<
kSemiColonChar << std::endl;
clip << kTwoSpace << kPostInfinityString << kSpaceChar <<
infinityTypeAsWord(animCurve.postInfinityType()) <<
kSemiColonChar << std::endl;
clip << kTwoSpace << kKeysString << kSpaceChar << kBraceLeftChar << std::endl;
unsigned numKeys = animCurve.numKeys();
for (unsigned i = 0; i < numKeys; i++) {
clip << kTwoSpace << kTwoSpace;
if (animCurve.isUnitlessInput()) {
clip << animCurve.unitlessInput(i);
}
else {
clip << animCurve.time(i).value();
}
clip << kSpaceChar << (conversion*animCurve.value(i));
clip << kSpaceChar << tangentTypeAsWord(animCurve.inTangentType(i));
clip << kSpaceChar << tangentTypeAsWord(animCurve.outTangentType(i));
clip << kSpaceChar << (animCurve.tangentsLocked(i) ? 1 : 0);
clip << kSpaceChar << (animCurve.weightsLocked(i) ? 1 : 0);
clip << kSpaceChar << (animCurve.isBreakdown(i) ? 1 : 0);
double weight;
animCurve.getTangent(i, angle, weight, true);
clip << kSpaceChar << angle.
as(angularUnit);
clip << kSpaceChar << weight;
}
double weight;
animCurve.getTangent(i, angle, weight, false);
clip << kSpaceChar << angle.
as(angularUnit);
clip << kSpaceChar << weight;
}
clip << kSemiColonChar << std::endl;
}
clip << kTwoSpace << kBraceRightChar << std::endl;
clip << kBraceRightChar << std::endl;
return true;
}