174 lines
5.0 KiB
C++
Executable File
174 lines
5.0 KiB
C++
Executable File
//-----------------------------------------------------------------------------
|
|
// Torque Game Engine
|
|
// Copyright (C) GarageGames.com, Inc.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning(disable : 4786)
|
|
#endif
|
|
|
|
#include "appSceneEnum.h"
|
|
#include "appSequence.h"
|
|
|
|
namespace DTS
|
|
{
|
|
|
|
AppSequence * AppSceneEnum::getSequence(AppNode * node)
|
|
{
|
|
const char * prefix = "Sequence::";
|
|
const char * name = node->getName();
|
|
if (!strnicmp(name,prefix,strlen(prefix)))
|
|
return new AppSequenceNode(node);
|
|
prefix = "Sequence_";
|
|
if (!strnicmp(name,prefix,strlen(prefix)))
|
|
return new AppSequenceNode(node);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
bool AppSceneEnum::processNode(AppNode * node)
|
|
{
|
|
// Helper method to help rot nodes that we find in the scene.
|
|
|
|
// At this stage we do not need to collect all the nodes
|
|
// because the tree structure will still be there when we
|
|
// build the shape. What we need to do right now is grab
|
|
// the top of all the subtrees, any meshes hanging on the
|
|
// root level (these will be lower detail levels, we don't
|
|
// need to grab meshes on the sub-trees because they will
|
|
// be found when we recurse into the sub-tree), the bounds
|
|
// node, and any sequences.
|
|
|
|
const char * name = node->getName();
|
|
const char * pname = node->getParentName();
|
|
|
|
AppConfig::PrintDump(PDPass1,avar("Processing Node %s with parent %s\r\n", name, pname));
|
|
|
|
AppSequence * seq = getSequence(node);
|
|
if (seq)
|
|
{
|
|
sequences.push_back(seq);
|
|
return true;
|
|
}
|
|
|
|
if (node->isDummy())
|
|
return false;
|
|
|
|
if (isSubtree(node))
|
|
{
|
|
// Add this node to the subtree list...
|
|
AppConfig::PrintDump(PDPass1,avar("Found subtree starting at Node \"%s\"\r\n",name));
|
|
subtrees.push_back(node);
|
|
return true;
|
|
}
|
|
|
|
// See if it is a bounding box. If so, save it as THE bounding
|
|
// box for the scene
|
|
if (node->isBounds())
|
|
{
|
|
if (boundsNode)
|
|
{
|
|
setExportError("More than one bounds node found.");
|
|
AppConfig::PrintDump(PDPass1,"More than one bounds node found.\r\n");
|
|
}
|
|
else
|
|
AppConfig::PrintDump(PDPass1,"Bounding box found\r\n");
|
|
boundsNode = node;
|
|
return true;
|
|
}
|
|
|
|
// if we use this node, then be sure to return true so the caller doesn't delete it
|
|
bool used = false;
|
|
|
|
if (node->getNumMesh()!=0)
|
|
{
|
|
for (S32 i=0; i<node->getNumMesh(); i++)
|
|
{
|
|
AppMesh * mesh = node->getMesh(i);
|
|
if (mesh->isSkin())
|
|
{
|
|
AppConfig::PrintDump(PDPass1,avar("Skin \"%s\" with parent \"%s\" added to entry list\r\n",mesh->getName(),pname));
|
|
skins.push_back(mesh);
|
|
used = true;
|
|
}
|
|
else
|
|
{
|
|
if (node->isParentRoot())
|
|
{
|
|
AppConfig::PrintDump(PDPass1,avar("Mesh \"%s\" with parent \"%s\" added to entry list\r\n",mesh->getName(),pname));
|
|
meshNodes.push_back(node);
|
|
meshes.push_back(mesh);
|
|
used = true;
|
|
}
|
|
}
|
|
}
|
|
if (used)
|
|
usedNodes.push_back(node);
|
|
}
|
|
return used;
|
|
}
|
|
|
|
bool AppSceneEnum::isSubtree(AppNode * node)
|
|
{
|
|
return node->isParentRoot() && node->getNumMesh() == 0;
|
|
}
|
|
|
|
AppSceneEnum::AppSceneEnum()
|
|
{
|
|
boundsNode = NULL;
|
|
}
|
|
|
|
AppSceneEnum::~AppSceneEnum()
|
|
{
|
|
S32 i;
|
|
for (i=0; i<usedNodes.size(); i++)
|
|
delete usedNodes[i];
|
|
for (i=0; i<subtrees.size(); i++)
|
|
delete subtrees[i];
|
|
for (i=0; i<sequences.size(); i++)
|
|
delete sequences[i];
|
|
delete boundsNode;
|
|
}
|
|
|
|
Shape * AppSceneEnum::processScene()
|
|
{
|
|
setExportError(NULL);
|
|
|
|
AppConfig::PrintDump(PDPass1,"First pass: enumerate scene...\r\n\r\n");
|
|
|
|
enumScene();
|
|
|
|
if (!boundsNode)
|
|
AppConfig::SetExportError("No bounds found");
|
|
|
|
if (AppConfig::IsExportError())
|
|
return NULL;
|
|
|
|
AppConfig::PrintDump(PDPass2,"\r\nSecond pass: put shape structure together...\r\n\r\n");
|
|
|
|
// set up bounds node
|
|
shapeMimic.addBounds(boundsNode);
|
|
|
|
// add other subtrees
|
|
S32 i;
|
|
for (i=0; i<subtrees.size(); i++)
|
|
shapeMimic.addSubtree(subtrees[i]);
|
|
|
|
// add meshes
|
|
for (i=0; i<meshes.size(); i++)
|
|
shapeMimic.addMesh(meshNodes[i],meshes[i]);
|
|
|
|
// add skin
|
|
for (i=0; i<skins.size(); i++)
|
|
shapeMimic.addSkin(skins[i]);
|
|
|
|
// add sequences
|
|
for (i=0; i<sequences.size(); i++)
|
|
shapeMimic.addSequence(sequences[i]);
|
|
|
|
// generate the shape
|
|
return shapeMimic.generateShape();
|
|
}
|
|
|
|
}; // namespace DTS
|