|
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.
|