Files
bullet3/Extras/FCollada/FCDocument/FCDPhysicsSceneNode.cpp
2006-05-25 19:18:29 +00:00

113 lines
3.6 KiB
C++

/*
Copyright (C) 2005-2006 Feeling Software Inc.
MIT License: http://www.opensource.org/licenses/mit-license.php
*/
/*
Based on the FS Import classes:
Copyright (C) 2005-2006 Feeling Software Inc
Copyright (C) 2005-2006 Autodesk Media Entertainment
MIT License: http://www.opensource.org/licenses/mit-license.php
*/
#include "StdAfx.h"
#include "FCDocument/FCDocument.h"
#include "FCDocument/FCDPhysicsSceneNode.h"
#include "FCDocument/FCDPhysicsModelInstance.h"
#include "FUtils/FUDaeParser.h"
#include "FUtils/FUDaeWriter.h"
#include "FUtils/FUFileManager.h"
#include "FUtils/FUStringConversion.h"
#include "FCDocument/FCDExtra.h"
using namespace FUDaeParser;
using namespace FUDaeWriter;
FCDPhysicsSceneNode::FCDPhysicsSceneNode(FCDocument* document) : FCDEntity(document, "PhysicsSceneNode")
{
//FIXME: no default values are specified in the 1.4 spec!
gravity.x = 0.f; gravity.y = -9.8f; gravity.z = 0.f;
timestep = 1.f;
}
FCDPhysicsSceneNode::~FCDPhysicsSceneNode()
{
CLEAR_POINTER_VECTOR(instances);
}
// Parse a <scene> or a <node> node from a COLLADA document
FUStatus FCDPhysicsSceneNode::LoadFromXML(xmlNode* sceneNode)
{
FUStatus status = FCDEntity::LoadFromXML(sceneNode);
if (!status) return status;
if(IsEquivalent(sceneNode->name, DAE_PHYSICS_SCENE_ELEMENT))
{
for (xmlNode* child = sceneNode->children; child != NULL; child = child->next)
{
if (child->type != XML_ELEMENT_NODE) continue;
// Look for instantiation elements
if (IsEquivalent(child->name, DAE_INSTANCE_PHYSICS_MODEL_ELEMENT))
{
FUUri url = ReadNodeUrl(child);
if (url.prefix.empty())
{
FCDPhysicsModel* entity = GetDocument()->FindPhysicsModel(url.suffix);
if (entity != NULL)
{
FCDPhysicsModelInstance* instance = new FCDPhysicsModelInstance(GetDocument(), (FCDEntity*)entity);
instances.push_back(instance);
status.AppendStatus(instance->LoadFromXML(child));
continue;
}
}
status.Warning(FS("Unable to retrieve FCDPhysicsModel instance for scene node: ") + TO_FSTRING(GetDaeId()), child->line);
}
else if(IsEquivalent(child->name, DAE_TECHNIQUE_COMMON_ELEMENT))
{
xmlNode* gravityNode = FindChildByType(child, DAE_GRAVITY_ATTRIBUTE);
if(gravityNode)
{
const char* gravityVal = ReadNodeContentDirect(gravityNode);
gravity.x = FUStringConversion::ToFloat(&gravityVal);
gravity.y = FUStringConversion::ToFloat(&gravityVal);
gravity.z = FUStringConversion::ToFloat(&gravityVal);
}
xmlNode* timestepNode = FindChildByType(child, DAE_TIME_STEP_ATTRIBUTE);
if(timestepNode)
{
timestep = FUStringConversion::ToFloat(ReadNodeContentDirect(timestepNode));
}
}
else if (IsEquivalent(child->name, DAE_EXTRA_ELEMENT))
{
// The extra information is loaded by the FCDEntity class.
}
}
}
return status;
}
// Write out a <physics_scene> element to a COLLADA xml document
xmlNode* FCDPhysicsSceneNode::WriteToXML(xmlNode* parentNode) const
{
xmlNode* physicsSceneNode = WriteToEntityXML(parentNode, DAE_PHYSICS_SCENE_ELEMENT);
if (physicsSceneNode == NULL) return physicsSceneNode;
WriteToNodeXML(physicsSceneNode);
return physicsSceneNode;
}
// Write out a <physics_scene> element to a COLLADA xml document
void FCDPhysicsSceneNode::WriteToNodeXML(xmlNode* node) const
{
// Write out the instantiation
for (FCDPhysicsModelInstanceList::const_iterator itI = instances.begin(); itI != instances.end(); ++itI)
{
FCDEntityInstance* instance = (*itI);
instance->WriteToXML(node);
}
// Write out the extra information
FCDEntity::WriteToExtraXML(node);
}