From: <axl...@us...> - 2009-03-20 01:55:25
|
Revision: 185 http://hgengine.svn.sourceforge.net/hgengine/?rev=185&view=rev Author: axlecrusher Date: 2009-03-20 01:55:12 +0000 (Fri, 20 Mar 2009) Log Message: ----------- fallback enabled XML attributes Modified Paths: -------------- Mercury2/scenegraph.xml Mercury2/src/XMLParser.cpp Mercury2/src/XMLParser.h Modified: Mercury2/scenegraph.xml =================================================================== --- Mercury2/scenegraph.xml 2009-03-19 22:45:56 UTC (rev 184) +++ Mercury2/scenegraph.xml 2009-03-20 01:55:12 UTC (rev 185) @@ -2,18 +2,23 @@ <node type="transformnode" movz="0" roty="0"> <node type="viewport" fov="45" aspect="1.3333" near="0.01" far="100"/> </node> - <node type="transformnode" movz="-3"> + <node type="transformnode" movz="-3" name="fallbackTest"> <node type="renderablenode"> <asset type="texture" file="test.bmp"/> <asset type="quad"/> </node> + <node type="transformnode" movx="-1" movy="-1" fallback="fallbackTest"> + <node type="renderablenode"> + <asset type="quad"/> + </node> + </node> </node> - <node type="transformnode" movz="-3" movx="-1" movy="-1"> + <node type="transformnode" movx="-1" movy="-1" fallback="fallbackTest"> <node type="renderablenode"> <asset type="quad"/> </node> </node> - <node type="transformnode" movz="-3" movx="1" movy="-1"> + <node type="transformnode" movx="1" movy="-1" fallback="fallbackTest"> <node type="renderablenode"> <asset type="texture" file="test2.png"/> <asset type="texture" file="test.bmp"/> Modified: Mercury2/src/XMLParser.cpp =================================================================== --- Mercury2/src/XMLParser.cpp 2009-03-19 22:45:56 UTC (rev 184) +++ Mercury2/src/XMLParser.cpp 2009-03-20 01:55:12 UTC (rev 185) @@ -23,35 +23,60 @@ XMLNode XMLNode::NextNode() const { - for (xmlNode* node = m_node->next; node; node=node->next) - if (node->type == XML_ELEMENT_NODE) - return XMLNode(node,m_doc); + if ( IsValid() ) + { + for (xmlNode* node = m_node->next; node; node=node->next) + if (node->type == XML_ELEMENT_NODE) + return XMLNode(node,m_doc); + +//falling back here seem like a bad idea, high chance of infinite loops? +// XMLNode fall = FindFallbackNode(); +// return fall.NextNode(); + } return XMLNode(); } XMLNode XMLNode::PreviousNode() const { - for (xmlNode* node = m_node->prev; node; node=node->prev) - if (node->type == XML_ELEMENT_NODE) - return XMLNode(node,m_doc); + if ( IsValid() ) + { + for (xmlNode* node = m_node->prev; node; node=node->prev) + if (node->type == XML_ELEMENT_NODE) + return XMLNode(node,m_doc); + +//falling back here seem like a bad idea, high chance of infinite loops? +// XMLNode fall = FindFallbackNode(); +// return fall.PreviousNode(); + } return XMLNode(); } XMLNode XMLNode::Child() const { - for (xmlNode* node = m_node->children; node; node=node->next) - if (node->type == XML_ELEMENT_NODE) return XMLNode(node,m_doc); + if ( IsValid() ) + { + for (xmlNode* node = m_node->children; node; node=node->next) + if (node->type == XML_ELEMENT_NODE) return XMLNode(node,m_doc); + +//falling back here seem like a bad idea, high chance of infinite loops? +// XMLNode fall = FindFallbackNode(); +// return fall.Child(); + } return XMLNode(); } MString XMLNode::Name() const { - return MString((const char*)m_node->name); //XXX fix utf8 + if ( !IsValid() ) return ""; + return MString((const char*)m_node->name); } MString XMLNode::Content() const { MString data; + + if ( !IsValid() ) return data; + // xmlChar* d = xmlNodeListGetString(m_doc, m_node->xmlChildrenNode, 1); xmlChar* d = xmlNodeGetContent(m_node); @@ -67,6 +92,9 @@ MString XMLNode::Attribute(const MString& tag) const { MString data; + + if ( !IsValid() ) return data; + xmlChar* d = xmlGetProp(m_node, (const xmlChar*)tag.c_str()); if (d) @@ -76,43 +104,44 @@ } else { - d = xmlGetProp(m_node, (const xmlChar*)"fallback"); - if (d) - { - //start searching at the root - XMLNode root( xmlDocGetRootElement(m_doc) ); - //prevent infinite recursion on self - if ( root.m_node != m_node ) - { - XMLNode fall = root.FindFallbackNode( MString((const char*)d) ); - data = fall.Attribute(tag); - } - } + XMLNode fall = FindFallbackNode(); + data = fall.Attribute(tag); } - if (d) xmlFree(d); - return data; } -/* -MString XMLNode::FindFallbackAttribute(const MString& path) + +XMLNode XMLNode::FindFallbackNode() const { - - xmlChar* d = xmlGetProp(m_node, (const xmlChar*)tag.c_str()); + xmlChar* d = xmlGetProp(m_node, (const xmlChar*)"fallback"); + XMLNode n; + if (d) { - + //start searching at the root + XMLNode root( xmlDocGetRootElement(m_doc) ); + //prevent infinite recursion on self + if ( root.m_node != m_node ) + { + n = root.RecursiveFindFallbackNode( MString((const char*)d) ); + } + xmlFree(d); } - MString p = path; + + return n; } -*/ -XMLNode XMLNode::FindFallbackNode(const MString& path) const + +XMLNode XMLNode::RecursiveFindFallbackNode(const MString& path) const { + if ( !IsValid() ) return XMLNode(); + if (path.length() > 0) { - MString name = path.substr(0, path.find(".")); + int pos = path.find("."); + MString name = pos<=0?path:path.substr(0, pos); + MString rpath = pos<=0?"":path.substr(pos); for (XMLNode n = this->Child(); n.IsValid(); n = n.NextNode()) - if (n.Attribute("name") == name) return n.FindFallbackNode(path); + if (n.Attribute("name") == name) return n.RecursiveFindFallbackNode(rpath); return XMLNode(); } return *this; Modified: Mercury2/src/XMLParser.h =================================================================== --- Mercury2/src/XMLParser.h 2009-03-19 22:45:56 UTC (rev 184) +++ Mercury2/src/XMLParser.h 2009-03-20 01:55:12 UTC (rev 185) @@ -30,11 +30,12 @@ MString Attribute(const MString & tag) const; // MString FindFallbackAttribute(); - XMLNode FindFallbackNode(const MString& path) const; inline bool IsValid() const { return m_node!=NULL; } - + XMLNode FindFallbackNode() const; private: + XMLNode RecursiveFindFallbackNode(const MString& path) const; + xmlNode* m_node; xmlDoc* m_doc; //parent doc, don't free }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |