forked from mirrors/0ad
XMB
This was SVN commit r665.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user