1
0
forked from mirrors/0ad
This was SVN commit r665.
This commit is contained in:
Ykkrosh
2004-07-08 15:22:09 +00:00
parent 92f14cd90a
commit a8f48ff7e0
13 changed files with 1224 additions and 290 deletions
+92 -123
View File
@@ -1,14 +1,10 @@
#include "precompiled.h"
#undef new // if it was redefined for leak detection, since xerces doesn't like it
#include "BaseEntity.h"
#include "ObjectManager.h"
#include "CStr.h"
#include "XML.h"
// automatically use namespace ..
XERCES_CPP_NAMESPACE_USE
#include "ps/Xeromyces.h"
CBaseEntity::CBaseEntity()
{
@@ -32,125 +28,98 @@ CBaseEntity::~CBaseEntity()
bool CBaseEntity::loadXML( CStr filename )
{
bool parseOK = false;
// Initialize XML library
XMLPlatformUtils::Initialize();
CXeromyces XeroFile;
try
{
// Create parser instance
XercesDOMParser *parser = new XercesDOMParser();
// Setup parser
parser->setValidationScheme(XercesDOMParser::Val_Auto);
parser->setDoNamespaces(false);
parser->setDoSchema(false);
parser->setCreateEntityReferenceNodes(false);
// Set customized error handler
CXercesErrorHandler *errorHandler = new CXercesErrorHandler();
parser->setErrorHandler(errorHandler);
CVFSEntityResolver *entityResolver = new CVFSEntityResolver(filename);
parser->setEntityResolver(entityResolver);
// Get main node
CVFSInputSource source;
parseOK=source.OpenFile(filename)==0;
if (parseOK)
{
// Parse file
parser->parse(source);
// Check how many errors
parseOK = parser->getErrorCount() == 0;
}
if (parseOK) {
// parsed successfully - grab our data
DOMDocument *doc = parser->getDocument();
DOMElement *element = doc->getDocumentElement();
// root_name should be Object
CStr root_name = XMLTranscode( element->getNodeName() );
// should have at least 3 children - Name, ModelName and TextureName
DOMNodeList *children = element->getChildNodes();
int numChildren=children->getLength();
for (int i=0; i<numChildren; ++i) {
// Get node
DOMNode *child = children->item(i);
// A child element
if (child->getNodeType() == DOMNode::ELEMENT_NODE)
{
// First get element and not node
DOMElement *child_element = (DOMElement*)child;
CStr element_name = XMLTranscode( child_element->getNodeName() );
DOMNode *value_node= child_element->getChildNodes()->item(0);
CStr element_value=value_node ? XMLTranscode(value_node->getNodeValue()) : "";
if( element_name == CStr( "Name" ) )
{
m_name = element_value;
}
else if( element_name == CStr( "Actor" ) )
{
m_actorObject = g_ObjMan.FindObject( element_value );
}
else if( element_name == CStr( "Speed" ) )
{
m_speed = element_value.ToFloat();
}
else if( element_name == CStr( "TurningRadius" ) )
{
m_turningRadius = element_value.ToFloat();
}
else if( element_name == CStr( "Size" ) )
{
if( !m_bound_circle )
m_bound_circle = new CBoundingCircle();
CStr radius = XMLTranscode( child_element->getAttribute( (XMLCh*)L"Radius" ) );
m_bound_circle->setRadius( radius.ToFloat() );
m_bound_type = CBoundingObject::BOUND_CIRCLE;
}
else if( element_name == CStr( "Footprint" ) )
{
if( !m_bound_box )
m_bound_box = new CBoundingBox();
CStr width = XMLTranscode( child_element->getAttribute( (XMLCh*)L"Width" ) );
CStr height = XMLTranscode( child_element->getAttribute( (XMLCh*)L"Height" ) );
m_bound_box->setDimensions( width.ToFloat(), height.ToFloat() );
m_bound_type = CBoundingObject::BOUND_OABB;
}
else if( element_name == CStr( "BoundsOffset" ) )
{
CStr x = XMLTranscode( child_element->getAttribute( (XMLCh*)L"x" ) );
CStr y = XMLTranscode( child_element->getAttribute( (XMLCh*)L"y" ) );
if( !m_bound_circle )
m_bound_circle = new CBoundingCircle();
if( !m_bound_box )
m_bound_box = new CBoundingBox();
m_bound_circle->m_offset.x = x.ToFloat();
m_bound_circle->m_offset.y = y.ToFloat();
m_bound_box->m_offset.x = x.ToFloat();
m_bound_box->m_offset.y = y.ToFloat();
}
}
}
}
delete parser;
delete errorHandler;
delete entityResolver;
XeroFile.Load(filename);
}
catch (...)
{
return false;
}
XMLPlatformUtils::Terminate();
return parseOK;
// Define all the elements and attributes used in the XML file
#define EL(x) int el_##x = XeroFile.getElementID(L#x)
#define AT(x) int at_##x = XeroFile.getAttributeID(L#x)
EL(entity);
EL(name);
EL(actor);
EL(speed);
EL(turningradius);
EL(size);
EL(footprint);
EL(boundsoffset);
AT(radius);
AT(width);
AT(height);
AT(x);
AT(y);
#undef AT
#undef EL
XMBElement Root = XeroFile.getRoot();
assert(Root.getNodeName() == el_entity);
XMBElementList RootChildren = Root.getChildNodes();
for (int i = 0; i < RootChildren.Count; ++i)
{
XMBElement Child = RootChildren.item(i);
int ChildName = Child.getNodeName();
if (ChildName == el_name)
{
m_name = tocstr(Child.getText());
}
else if (ChildName == el_actor)
{
m_actorObject = g_ObjMan.FindObject( tocstr(Child.getText()) );
}
else if (ChildName == el_speed)
{
m_speed = CStr16(Child.getText()).ToFloat();
}
else if (ChildName == el_turningradius)
{
m_turningRadius = CStr16(Child.getText()).ToFloat();
}
else if (ChildName == el_size)
{
if( !m_bound_circle )
m_bound_circle = new CBoundingCircle();
CStr16 radius = Child.getAttributes().getNamedItem(at_radius);
m_bound_circle->setRadius( radius.ToFloat() );
m_bound_type = CBoundingObject::BOUND_CIRCLE;
}
else if (ChildName == el_footprint)
{
if( !m_bound_box )
m_bound_box = new CBoundingBox();
CStr16 width = Child.getAttributes().getNamedItem(at_width);
CStr16 height = Child.getAttributes().getNamedItem(at_height);
m_bound_box->setDimensions( width.ToFloat(), height.ToFloat() );
m_bound_type = CBoundingObject::BOUND_OABB;
}
else if (ChildName == el_boundsoffset)
{
CStr16 x = Child.getAttributes().getNamedItem(at_x);
CStr16 y = Child.getAttributes().getNamedItem(at_y);
if( !m_bound_circle )
m_bound_circle = new CBoundingCircle();
if( !m_bound_box )
m_bound_box = new CBoundingBox();
m_bound_circle->m_offset.x = x.ToFloat();
m_bound_circle->m_offset.y = y.ToFloat();
m_bound_box->m_offset.x = x.ToFloat();
m_bound_box->m_offset.y = y.ToFloat();
}
}
return true;
}