370 lines
9.8 KiB
C++
370 lines
9.8 KiB
C++
/*
|
|
Copyright (C) 2005-2006 Feeling Software Inc.
|
|
MIT License: http://www.opensource.org/licenses/mit-license.php
|
|
*/
|
|
|
|
#include "StdAfx.h"
|
|
#include "FCDocument/FCDPhysicsAnalyticalGeometry.h"
|
|
#include "FCDocument/FCDPhysicsParameterGeneric.h"
|
|
#include "FCDocument/FCDocument.h"
|
|
#include "FUtils/FUDaeParser.h"
|
|
#include "FUtils/FUDaeWriter.h"
|
|
using namespace FUDaeParser;
|
|
using namespace FUDaeWriter;
|
|
|
|
FCDPhysicsAnalyticalGeometry::FCDPhysicsAnalyticalGeometry(FCDocument* document) : FCDEntity(document, "AnalyticalGeometry")
|
|
{
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry::~FCDPhysicsAnalyticalGeometry()
|
|
{
|
|
}
|
|
|
|
|
|
// Load from a XML node the given physicsAnalyticalGeometry
|
|
FUStatus FCDPhysicsAnalyticalGeometry::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status = FCDEntity::LoadFromXML(node);
|
|
return status;
|
|
}
|
|
|
|
FCDPASBox::FCDPASBox(FCDocument* document) : FCDPhysicsAnalyticalGeometry(document)
|
|
{
|
|
halfExtents.x = halfExtents.y = halfExtents.z = 0.f;
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry* FCDPASBox::Clone()
|
|
{
|
|
FCDPASBox* clone = new FCDPASBox(GetDocument());
|
|
FCDEntity::Clone(clone);
|
|
clone->halfExtents = halfExtents;
|
|
return clone;
|
|
}
|
|
|
|
FUStatus FCDPASBox::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status;
|
|
|
|
if (!IsEquivalent(node->name, DAE_BOX_ELEMENT))
|
|
{
|
|
return status.Warning(FS("Box is not of the right type."), node->line);
|
|
}
|
|
|
|
for (xmlNode* child = node->children; child != NULL; child = child->next)
|
|
{
|
|
if (child->type != XML_ELEMENT_NODE) continue;
|
|
|
|
if(IsEquivalent(child->name, DAE_HALF_EXTENTS_ELEMENT))
|
|
{
|
|
const char* halfExt = ReadNodeContentDirect(child);
|
|
halfExtents.x = FUStringConversion::ToFloat(&halfExt);
|
|
halfExtents.y = FUStringConversion::ToFloat(&halfExt);
|
|
halfExtents.z = FUStringConversion::ToFloat(&halfExt);
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
xmlNode* FCDPASBox::WriteToXML(xmlNode* node) const
|
|
{
|
|
xmlNode* geomNode = AddChild(node, DAE_BOX_ELEMENT);
|
|
string s = FUStringConversion::ToString(halfExtents);
|
|
AddChild(geomNode, DAE_HALF_EXTENTS_ELEMENT, s);
|
|
return geomNode;
|
|
}
|
|
|
|
|
|
FCDPASPlane::FCDPASPlane(FCDocument* document) : FCDPhysicsAnalyticalGeometry(document)
|
|
{
|
|
normal.x = normal.y = normal.z = d = 0.f;
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry* FCDPASPlane::Clone()
|
|
{
|
|
FCDPASPlane* clone = new FCDPASPlane(GetDocument());
|
|
FCDEntity::Clone(clone);
|
|
clone->normal = normal;
|
|
return clone;
|
|
}
|
|
|
|
FUStatus FCDPASPlane::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status;
|
|
|
|
if (!IsEquivalent(node->name, DAE_PLANE_ELEMENT))
|
|
{
|
|
return status.Warning(FS("Plane is not of the right type."), node->line);
|
|
}
|
|
|
|
for (xmlNode* child = node->children; child != NULL; child = child->next)
|
|
{
|
|
if (child->type != XML_ELEMENT_NODE) continue;
|
|
|
|
if(IsEquivalent(child->name, DAE_EQUATION_ELEMENT))
|
|
{
|
|
const char* eq = ReadNodeContentDirect(child);
|
|
normal.x = FUStringConversion::ToFloat(&eq);
|
|
normal.y = FUStringConversion::ToFloat(&eq);
|
|
normal.z = FUStringConversion::ToFloat(&eq);
|
|
d = FUStringConversion::ToFloat(&eq);
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
xmlNode* FCDPASPlane::WriteToXML(xmlNode* node) const
|
|
{
|
|
xmlNode* geomNode = AddChild(node, DAE_PLANE_ELEMENT);
|
|
FMVector4 equation;
|
|
equation.w = normal.x; equation.x = normal.y; equation.y = normal.z; equation.z = d;
|
|
string s = FUStringConversion::ToString(equation);
|
|
AddChild(geomNode, DAE_EQUATION_ELEMENT, s);
|
|
return geomNode;
|
|
}
|
|
|
|
|
|
FCDPASSphere::FCDPASSphere(FCDocument* document) : FCDPhysicsAnalyticalGeometry(document)
|
|
{
|
|
radius = 0.f;
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry* FCDPASSphere::Clone()
|
|
{
|
|
FCDPASSphere* clone = new FCDPASSphere(GetDocument());
|
|
FCDEntity::Clone(clone);
|
|
clone->radius = radius;
|
|
return clone;
|
|
}
|
|
|
|
FUStatus FCDPASSphere::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status;
|
|
|
|
if (!IsEquivalent(node->name, DAE_SPHERE_ELEMENT))
|
|
{
|
|
return status.Warning(FS("Sphere is not of the right type."), node->line);
|
|
}
|
|
|
|
for (xmlNode* child = node->children; child != NULL; child = child->next)
|
|
{
|
|
if (child->type != XML_ELEMENT_NODE) continue;
|
|
|
|
if(IsEquivalent(child->name, DAE_RADIUS_ELEMENT))
|
|
{
|
|
radius = FUStringConversion::ToFloat(ReadNodeContentDirect(child));
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
xmlNode* FCDPASSphere::WriteToXML(xmlNode* node) const
|
|
{
|
|
xmlNode* geomNode = AddChild(node, DAE_SPHERE_ELEMENT);
|
|
AddChild(geomNode, DAE_RADIUS_ELEMENT, radius);
|
|
return geomNode;
|
|
}
|
|
|
|
FCDPASCylinder::FCDPASCylinder(FCDocument* document) : FCDPhysicsAnalyticalGeometry(document)
|
|
{
|
|
height = 0.f;
|
|
radius = 0.f;
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry* FCDPASCylinder::Clone()
|
|
{
|
|
FCDPASCylinder* clone = new FCDPASCylinder(GetDocument());
|
|
FCDEntity::Clone(clone);
|
|
clone->radius = radius;
|
|
clone->height = height;
|
|
return clone;
|
|
}
|
|
|
|
FUStatus FCDPASCylinder::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status;
|
|
|
|
if (!IsEquivalent(node->name, DAE_CYLINDER_ELEMENT))
|
|
{
|
|
return status.Warning(FS("Sphere is not of the right type."), node->line);
|
|
}
|
|
|
|
for (xmlNode* child = node->children; child != NULL; child = child->next)
|
|
{
|
|
if (child->type != XML_ELEMENT_NODE) continue;
|
|
|
|
if(IsEquivalent(child->name, DAE_HEIGHT_ELEMENT))
|
|
{
|
|
height = FUStringConversion::ToFloat(ReadNodeContentDirect(child));
|
|
}
|
|
else if(IsEquivalent(child->name, DAE_RADIUS_ELEMENT))
|
|
{
|
|
radius = FUStringConversion::ToFloat(ReadNodeContentDirect(child));
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
xmlNode* FCDPASCylinder::WriteToXML(xmlNode* node) const
|
|
{
|
|
xmlNode* geomNode = AddChild(node, DAE_CYLINDER_ELEMENT);
|
|
AddChild(geomNode, DAE_HEIGHT_ELEMENT, height);
|
|
AddChild(geomNode, DAE_RADIUS_ELEMENT, radius);
|
|
return geomNode;
|
|
}
|
|
|
|
FCDPASCapsule::FCDPASCapsule(FCDocument* document) : FCDPhysicsAnalyticalGeometry(document)
|
|
{
|
|
height = 0.f;
|
|
radius = 0.f;
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry* FCDPASCapsule::Clone()
|
|
{
|
|
FCDPASCapsule* clone = new FCDPASCapsule(GetDocument());
|
|
FCDEntity::Clone(clone);
|
|
clone->radius = radius;
|
|
clone->height = height;
|
|
return clone;
|
|
}
|
|
|
|
FUStatus FCDPASCapsule::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status;
|
|
|
|
if (!IsEquivalent(node->name, DAE_CAPSULE_ELEMENT))
|
|
{
|
|
return status.Warning(FS("Capsule is not of the right type."), node->line);
|
|
}
|
|
|
|
for (xmlNode* child = node->children; child != NULL; child = child->next)
|
|
{
|
|
if (child->type != XML_ELEMENT_NODE) continue;
|
|
|
|
if(IsEquivalent(child->name, DAE_HEIGHT_ELEMENT))
|
|
{
|
|
height = FUStringConversion::ToFloat(ReadNodeContentDirect(child));
|
|
}
|
|
else if(IsEquivalent(child->name, DAE_RADIUS_ELEMENT))
|
|
{
|
|
radius = FUStringConversion::ToFloat(ReadNodeContentDirect(child));
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
xmlNode* FCDPASCapsule::WriteToXML(xmlNode* node) const
|
|
{
|
|
xmlNode* geomNode = AddChild(node, DAE_CAPSULE_ELEMENT);
|
|
AddChild(geomNode, DAE_HEIGHT_ELEMENT, height);
|
|
AddChild(geomNode, DAE_RADIUS_ELEMENT, radius);
|
|
return geomNode;
|
|
}
|
|
|
|
FCDPASTaperedCapsule::FCDPASTaperedCapsule(FCDocument* document) : FCDPASCapsule(document)
|
|
{
|
|
radius2 = 0.f;
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry* FCDPASTaperedCapsule::Clone()
|
|
{
|
|
FCDPASTaperedCapsule* clone = new FCDPASTaperedCapsule(GetDocument());
|
|
FCDEntity::Clone(clone);
|
|
clone->radius = radius;
|
|
return clone;
|
|
}
|
|
|
|
FUStatus FCDPASTaperedCapsule::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status;
|
|
|
|
if (!IsEquivalent(node->name, DAE_TAPERED_CAPSULE_ELEMENT))
|
|
{
|
|
return status.Warning(FS("Tapered Capsule is not of the right type."), node->line);
|
|
}
|
|
|
|
for (xmlNode* child = node->children; child != NULL; child = child->next)
|
|
{
|
|
if (child->type != XML_ELEMENT_NODE) continue;
|
|
|
|
if(IsEquivalent(child->name, DAE_HEIGHT_ELEMENT))
|
|
{
|
|
const char* h = ReadNodeContentDirect(child);
|
|
height = FUStringConversion::ToFloat(&h);
|
|
}
|
|
else if(IsEquivalent(child->name, DAE_RADIUS1_ELEMENT))
|
|
{
|
|
const char* rad = ReadNodeContentDirect(child);
|
|
radius = FUStringConversion::ToFloat(&rad);
|
|
}
|
|
else if(IsEquivalent(child->name, DAE_RADIUS2_ELEMENT))
|
|
{
|
|
const char* rad = ReadNodeContentDirect(child);
|
|
radius2 = FUStringConversion::ToFloat(&rad);
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
xmlNode* FCDPASTaperedCapsule::WriteToXML(xmlNode* node) const
|
|
{
|
|
xmlNode* geomNode = AddChild(node, DAE_TAPERED_CAPSULE_ELEMENT);
|
|
AddChild(geomNode, DAE_HEIGHT_ELEMENT, height);
|
|
AddChild(geomNode, DAE_RADIUS1_ELEMENT, radius);
|
|
AddChild(geomNode, DAE_RADIUS2_ELEMENT, radius2);
|
|
return geomNode;
|
|
}
|
|
|
|
FCDPASTaperedCylinder::FCDPASTaperedCylinder(FCDocument* document) : FCDPASCylinder(document)
|
|
{
|
|
radius2 = 0.f;
|
|
}
|
|
|
|
FCDPhysicsAnalyticalGeometry* FCDPASTaperedCylinder::Clone()
|
|
{
|
|
FCDPASTaperedCylinder* clone = new FCDPASTaperedCylinder(GetDocument());
|
|
FCDEntity::Clone(clone);
|
|
clone->radius = radius;
|
|
return clone;
|
|
}
|
|
|
|
FUStatus FCDPASTaperedCylinder::LoadFromXML(xmlNode* node)
|
|
{
|
|
FUStatus status;
|
|
|
|
if (!IsEquivalent(node->name, DAE_TAPERED_CYLINDER_ELEMENT))
|
|
{
|
|
return status.Warning(FS("Tapered cylinder is not of the right type."), node->line);
|
|
}
|
|
|
|
for (xmlNode* child = node->children; child != NULL; child = child->next)
|
|
{
|
|
if (child->type != XML_ELEMENT_NODE) continue;
|
|
|
|
if(IsEquivalent(child->name, DAE_HEIGHT_ELEMENT))
|
|
{
|
|
const char* h = ReadNodeContentDirect(child);
|
|
height = FUStringConversion::ToFloat(&h);
|
|
}
|
|
else if(IsEquivalent(child->name, DAE_RADIUS1_ELEMENT))
|
|
{
|
|
const char* rad = ReadNodeContentDirect(child);
|
|
radius = FUStringConversion::ToFloat(&rad);
|
|
}
|
|
else if(IsEquivalent(child->name, DAE_RADIUS2_ELEMENT))
|
|
{
|
|
const char* rad = ReadNodeContentDirect(child);
|
|
radius2 = FUStringConversion::ToFloat(&rad);
|
|
}
|
|
}
|
|
return status;
|
|
}
|
|
|
|
xmlNode* FCDPASTaperedCylinder::WriteToXML(xmlNode* node) const
|
|
{
|
|
xmlNode* geomNode = AddChild(node, DAE_TAPERED_CYLINDER_ELEMENT);
|
|
AddChild(geomNode, DAE_HEIGHT_ELEMENT, height);
|
|
AddChild(geomNode, DAE_RADIUS1_ELEMENT, radius);
|
|
AddChild(geomNode, DAE_RADIUS2_ELEMENT, radius2);
|
|
return geomNode;
|
|
}
|