2004-06-03 20:38:14 +02:00
|
|
|
#include "precompiled.h"
|
2004-06-15 23:08:05 +02:00
|
|
|
#undef new // if it was redefined for leak detection, since xerces doesn't like it
|
2004-06-03 20:38:14 +02:00
|
|
|
|
2004-05-22 01:46:16 +02:00
|
|
|
#include "BaseEntity.h"
|
|
|
|
#include "ObjectManager.h"
|
|
|
|
#include "CStr.h"
|
|
|
|
|
2004-06-03 15:27:01 +02:00
|
|
|
#include "XML.h"
|
2004-05-22 01:46:16 +02:00
|
|
|
|
|
|
|
// automatically use namespace ..
|
|
|
|
XERCES_CPP_NAMESPACE_USE
|
|
|
|
|
2004-06-11 00:24:03 +02:00
|
|
|
CBaseEntity::CBaseEntity()
|
2004-05-30 04:18:49 +02:00
|
|
|
{
|
2004-06-11 00:24:03 +02:00
|
|
|
m_base = NULL;
|
|
|
|
m_base.associate( this, "super" );
|
|
|
|
m_name.associate( this, "name" );
|
|
|
|
m_speed.associate( this, "speed" );
|
|
|
|
m_turningRadius.associate( this, "turningRadius" );
|
|
|
|
|
2004-05-30 04:18:49 +02:00
|
|
|
m_bound_circle = NULL;
|
|
|
|
m_bound_box = NULL;
|
|
|
|
}
|
|
|
|
|
2004-05-30 03:57:26 +02:00
|
|
|
CBaseEntity::~CBaseEntity()
|
|
|
|
{
|
|
|
|
if( m_bound_box )
|
|
|
|
delete( m_bound_box );
|
|
|
|
if( m_bound_circle )
|
|
|
|
delete( m_bound_circle );
|
|
|
|
}
|
|
|
|
|
2004-05-22 01:46:16 +02:00
|
|
|
bool CBaseEntity::loadXML( CStr filename )
|
|
|
|
{
|
|
|
|
bool parseOK = false;
|
|
|
|
|
|
|
|
// Initialize XML library
|
|
|
|
XMLPlatformUtils::Initialize();
|
|
|
|
{
|
|
|
|
// 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);
|
2004-06-03 15:27:01 +02:00
|
|
|
|
|
|
|
CVFSEntityResolver *entityResolver = new CVFSEntityResolver(filename);
|
|
|
|
parser->setEntityResolver(entityResolver);
|
2004-05-22 01:46:16 +02:00
|
|
|
|
|
|
|
// Get main node
|
2004-06-03 15:27:01 +02:00
|
|
|
CVFSInputSource source;
|
|
|
|
parseOK=source.OpenFile(filename)==0;
|
|
|
|
|
|
|
|
if (parseOK)
|
|
|
|
{
|
|
|
|
// Parse file
|
|
|
|
parser->parse(source);
|
|
|
|
|
|
|
|
// Check how many errors
|
|
|
|
parseOK = parser->getErrorCount() == 0;
|
|
|
|
}
|
2004-05-22 01:46:16 +02:00
|
|
|
|
|
|
|
if (parseOK) {
|
|
|
|
// parsed successfully - grab our data
|
|
|
|
DOMDocument *doc = parser->getDocument();
|
|
|
|
DOMElement *element = doc->getDocumentElement();
|
|
|
|
|
|
|
|
// root_name should be Object
|
2004-06-03 15:27:01 +02:00
|
|
|
CStr root_name = XMLTranscode( element->getNodeName() );
|
2004-05-22 01:46:16 +02:00
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
2004-06-14 01:37:37 +02:00
|
|
|
CStr element_name = XMLTranscode( child_element->getNodeName() );
|
2004-05-22 01:46:16 +02:00
|
|
|
DOMNode *value_node= child_element->getChildNodes()->item(0);
|
2004-06-14 01:37:37 +02:00
|
|
|
CStr element_value=value_node ? XMLTranscode(value_node->getNodeValue()) : "";
|
2004-05-22 01:46:16 +02:00
|
|
|
|
2004-05-26 22:57:25 +02:00
|
|
|
if( element_name == CStr( "Name" ) )
|
|
|
|
{
|
2004-05-22 01:46:16 +02:00
|
|
|
m_name = element_value;
|
2004-05-26 22:57:25 +02:00
|
|
|
}
|
|
|
|
else if( element_name == CStr( "Actor" ) )
|
|
|
|
{
|
2004-05-22 01:46:16 +02:00
|
|
|
m_actorObject = g_ObjMan.FindObject( element_value );
|
2004-05-26 22:57:25 +02:00
|
|
|
}
|
|
|
|
else if( element_name == CStr( "Speed" ) )
|
|
|
|
{
|
2004-05-22 01:46:16 +02:00
|
|
|
m_speed = element_value.ToFloat();
|
2004-05-29 05:32:33 +02:00
|
|
|
}
|
|
|
|
else if( element_name == CStr( "TurningRadius" ) )
|
|
|
|
{
|
|
|
|
m_turningRadius = element_value.ToFloat();
|
|
|
|
}
|
2004-05-26 22:57:25 +02:00
|
|
|
else if( element_name == CStr( "Size" ) )
|
|
|
|
{
|
|
|
|
if( !m_bound_circle )
|
|
|
|
m_bound_circle = new CBoundingCircle();
|
2004-06-18 20:46:34 +02:00
|
|
|
CStr radius = XMLTranscode( child_element->getAttribute( (XMLCh*)L"Radius" ) );
|
2004-05-26 22:57:25 +02:00
|
|
|
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();
|
2004-06-18 20:46:34 +02:00
|
|
|
CStr width = XMLTranscode( child_element->getAttribute( (XMLCh*)L"Width" ) );
|
|
|
|
CStr height = XMLTranscode( child_element->getAttribute( (XMLCh*)L"Height" ) );
|
2004-05-26 22:57:25 +02:00
|
|
|
|
|
|
|
m_bound_box->setDimensions( width.ToFloat(), height.ToFloat() );
|
|
|
|
m_bound_type = CBoundingObject::BOUND_OABB;
|
|
|
|
}
|
|
|
|
else if( element_name == CStr( "BoundsOffset" ) )
|
|
|
|
{
|
2004-06-18 20:46:34 +02:00
|
|
|
CStr x = XMLTranscode( child_element->getAttribute( (XMLCh*)L"x" ) );
|
|
|
|
CStr y = XMLTranscode( child_element->getAttribute( (XMLCh*)L"y" ) );
|
2004-05-26 22:57:25 +02:00
|
|
|
|
|
|
|
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();
|
2004-05-29 05:32:33 +02:00
|
|
|
|
2004-05-22 01:46:16 +02:00
|
|
|
}
|
2004-05-29 05:32:33 +02:00
|
|
|
|
2004-05-22 01:46:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
delete parser;
|
2004-06-03 15:27:01 +02:00
|
|
|
delete errorHandler;
|
|
|
|
delete entityResolver;
|
2004-05-22 01:46:16 +02:00
|
|
|
}
|
|
|
|
XMLPlatformUtils::Terminate();
|
|
|
|
|
|
|
|
return parseOK;
|
|
|
|
}
|