tge/tools/max2dtsExporterPro/maxAppNode.cpp
2017-04-17 06:17:10 -06:00

154 lines
4.0 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "maxAppNode.h"
#include "maxAppMesh.h"
#include "DTSUtil.h"
#pragma pack(push,8)
#include <max.h>
#pragma pack(pop)
namespace DTS
{
MaxAppNode::MaxAppNode(INode * maxNode)
{
mMaxNode = maxNode;
}
void MaxAppNode::buildMeshList()
{
::ObjectState os = mMaxNode->EvalWorldState(0);
if (os.obj->CanConvertToType(triObjectClassID))
mMeshes.push_back(new MaxAppMesh(mMaxNode,this));
}
void MaxAppNode::buildChildList()
{
for (S32 i=0; i<mMaxNode->NumberOfChildren(); i++)
{
INode * child = mMaxNode->GetChildNode(i);
mChildNodes.push_back(new MaxAppNode(child));
}
}
bool MaxAppNode::isEqual(AppNode * node)
{
MaxAppNode * maxAppNode = dynamic_cast<MaxAppNode*>(node);
return maxAppNode && (maxAppNode->mMaxNode == mMaxNode);
}
Matrix<4,4,F32> MaxAppNode::getNodeTransform(const AppTime & time)
{
// Get the node marix then copy from max format into our matrix struct
// Note that this results in a transpose of the matrix...
Matrix3 nodeMat = mMaxNode->GetNodeTM( SecToTicks(time.getF32()) );
return convertFromMaxMatrix(nodeMat);
}
bool MaxAppNode::animatesTransform(const AppSequenceData & seqData)
{
Interval range(SecToTicks(seqData.startTime.getF32()),SecToTicks(seqData.endTime.getF32()));
Interval test = range;
// does this sequence animate the bounds node, if so, add ground transform
S32 midpoint = (range.Start() + range.End()) / 2;
mMaxNode->GetNodeTM(midpoint,&test);
return ( test.Start()!=range.Start() || test.End()!=range.End() );
}
const char * MaxAppNode::getName()
{
if (!mName)
mName = strnew(mMaxNode->GetName());
return mName;
}
const char * MaxAppNode::getParentName()
{
if (!mParentName)
mParentName = mMaxNode->GetParentNode() ? strnew(mMaxNode->GetParentNode()->GetName()) : strnew("ROOT");
return mParentName;
}
bool MaxAppNode::isBillboard()
{
bool temp;
return getBool( "enableBillboard", temp) || AppNode::isBillboard();
}
bool MaxAppNode::isBillboardZAxis()
{
bool temp;
S32 value;
if( getBool( "enableBillboard", temp) )
{
if( getInt("bb_Type", value) && value == 2 )
return true;
}
return AppNode::isBillboardZAxis();
}
bool MaxAppNode::isParentRoot()
{
return (mMaxNode->GetParentNode()==NULL) || mMaxNode->GetParentNode()->IsRootNode();
}
bool MaxAppNode::getFloat(const char * propName, F32 & defaultVal)
{
// don't trust max not to touch value...
F32 val;
if (mMaxNode->GetUserPropFloat(propName,val))
{
defaultVal = val;
return true;
}
return false;
}
bool MaxAppNode::getInt(const char * propName, S32 & defaultVal)
{
// don't trust max not to touch value...
S32 val;
if (mMaxNode->GetUserPropInt(propName,val))
{
defaultVal = val;
return true;
}
return false;
}
bool MaxAppNode::getBool(const char * propName, bool & defaultVal)
{
// don't trust max not to touch value...
BOOL val;
if (mMaxNode->GetUserPropBool(propName,val))
{
defaultVal = val ? true : false;
return true;
}
return false;
}
Matrix<4,4,F32> convertFromMaxMatrix(Matrix3 & mat)
{
Matrix<4,4,F32> ret;
for (S32 i=0; i<4; i++)
{
Point3 row = mat.GetRow(i);
Vector<F32,4> col;
col.set(0,row.x);
col.set(1,row.y);
col.set(2,row.z);
col.set(3,i==3 ? 1 : 0);
ret.setCol(i,col);
}
return ret;
}
};