Add ExtraTags class for handling tags inside an extra block.
authorNathan Letwory <nathan@letworyinteractive.com>
Fri, 25 Mar 2011 11:07:57 +0000 (11:07 +0000)
committerNathan Letwory <nathan@letworyinteractive.com>
Fri, 25 Mar 2011 11:07:57 +0000 (11:07 +0000)
source/blender/collada/CMakeLists.txt
source/blender/collada/DocumentImporter.cpp
source/blender/collada/DocumentImporter.h
source/blender/collada/ExtraHandler.cpp
source/blender/collada/ExtraHandler.h
source/blender/collada/ExtraTags.cpp [new file with mode: 0644]
source/blender/collada/ExtraTags.h [new file with mode: 0644]

index 830e22f70d7ef304901a41f4571b49e0de9626e0..13c33e63869c8e3fe9e6cddb47f509e415c62196 100644 (file)
@@ -64,6 +64,7 @@ set(SRC
        DocumentImporter.cpp
        EffectExporter.cpp
        ExtraHandler.cpp
+       ExtraTags.cpp
        GeometryExporter.cpp
        ImageExporter.cpp
        InstanceWriter.cpp
@@ -85,6 +86,7 @@ set(SRC
        DocumentImporter.h
        EffectExporter.h
        ExtraHandler.h
+       ExtraTags.h
        GeometryExporter.h
        ImageExporter.h
        InstanceWriter.h
index 77c2fc971ac26814338964da16817ee847e3aae9..b0bbe49a1820bf02d74e7f170b52440db25a7fb2 100644 (file)
@@ -101,7 +101,15 @@ DocumentImporter::DocumentImporter(bContext *C, const char *filename) :
        anim_importer(&unit_converter, &armature_importer, CTX_data_scene(C))
 {}
 
-DocumentImporter::~DocumentImporter() {}
+DocumentImporter::~DocumentImporter()
+{
+       std::map<COLLADAFW::UniqueId, ExtraTags*>::iterator etit;
+       etit = uid_tags_map.begin();
+       while(etit!=uid_tags_map.end()) {
+               delete etit->second;
+               etit++;
+       }
+}
 
 bool DocumentImporter::import()
 {
@@ -997,8 +1005,17 @@ bool DocumentImporter::writeKinematicsScene( const COLLADAFW::KinematicsScene* k
        return true;
 }
 
-bool DocumentImporter::addElementData( const COLLADAFW::UniqueId &uid)
+ExtraTags* DocumentImporter::getExtraTags(const COLLADAFW::UniqueId &uid)
+{
+       if(uid_tags_map.find(uid)==uid_tags_map.end()) {
+               return NULL;
+       }
+       return uid_tags_map[uid];
+}
+
+bool DocumentImporter::addExtraTags( const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags)
 {
+       uid_tags_map[uid] = extra_tags;
        return true;
 }
 
index 949185471f4a4eb44ce7e1a784a12533975459cb..1905dfe6a3e63e9c20309c080e8b5705cd25772b 100644 (file)
@@ -45,6 +45,7 @@
 #include "AnimationImporter.h"
 #include "ArmatureImporter.h"
 #include "MeshImporter.h"
+#include "ExtraTags.h"
 
 
 struct Main;
@@ -122,7 +123,9 @@ public:
        bool writeKinematicsScene(const COLLADAFW::KinematicsScene*);
 
        /** Add element and data for UniqueId */
-       bool addElementData(const COLLADAFW::UniqueId &uid);
+       bool addExtraTags(const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags);
+       /** Get an extisting ExtraTags for uid */
+       ExtraTags* getExtraTags(const COLLADAFW::UniqueId &uid);
 
 private:
 
@@ -142,6 +145,7 @@ private:
        std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
        std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
        std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
+       std::map<COLLADAFW::UniqueId, ExtraTags*> uid_tags_map;
        std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
        std::map<COLLADAFW::UniqueId, Object*> object_map;
        std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
index 3ab34e70c8cd6ce9af14b1b66b19c6cd64eb5d9d..9dc5f4e4ee6eea81b923e0334d4dd810a95bc910 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "ExtraHandler.h"
 
-ExtraHandler::ExtraHandler(DocumentImporter *dimp)
+ExtraHandler::ExtraHandler(DocumentImporter *dimp) : currentExtraTags(0)
 {
        this->dimp = dimp;
 }
@@ -40,22 +40,27 @@ ExtraHandler::~ExtraHandler() {}
 
 bool ExtraHandler::elementBegin( const char* elementName, const char** attributes)
 {
-       printf("begin: %s\n", elementName);
+       // \todo attribute handling for profile tags
+       currentElement = std::string(elementName);
        return true;
 }
 
 bool ExtraHandler::elementEnd(const char* elementName )
 {
-       printf("end: %s\n", elementName);
        currentUid = COLLADAFW::UniqueId();
+       currentExtraTags = 0;
+       currentElement.clear();
        return true;
 }
 
 bool ExtraHandler::textData(const char* text, size_t textLength)
 {
-       char buf[1024] = {0};
-       BLI_snprintf(buf, textLength, "%s", text);
-       printf("data: %s\n", buf);
+       char buf[1024];
+       
+       if(currentElement.length() == 0) return false;
+       
+       BLI_snprintf(buf, textLength+1, "%s", text);
+       currentExtraTags->addTag(std::string(currentElement), std::string(buf));
        return true;
 }
 
@@ -64,10 +69,16 @@ bool ExtraHandler::parseElement (
        const unsigned long& elementHash, 
        const COLLADAFW::UniqueId& uniqueId ) {
                if(BLI_strcaseeq(profileName, "blender")) {
-                       printf("In parseElement for supported profile %s for id %s\n", profileName, uniqueId.toAscii().c_str());
+                       //printf("In parseElement for supported profile %s for id %s\n", profileName, uniqueId.toAscii().c_str());
                        currentUid = uniqueId;
+                       ExtraTags *et = dimp->getExtraTags(uniqueId);
+                       if(!et) {
+                               et = new ExtraTags(std::string(profileName));
+                               dimp->addExtraTags(uniqueId, et);
+                       }
+                       currentExtraTags = et;
                        return true;
                }
-               printf("In parseElement for unsupported profile %s for id %s\n", profileName, uniqueId.toAscii().c_str());
+               //printf("In parseElement for unsupported profile %s for id %s\n", profileName, uniqueId.toAscii().c_str());
                return false;
 }
index df26310d69658f9a2b97fa5d09db813264737c9a..de3b063290d5f05244d09d077790c799be3e1531 100644 (file)
@@ -71,5 +71,7 @@ private:
        DocumentImporter* dimp;
        /** Holds Id of element for which <extra> XML elements are handled. */
        COLLADAFW::UniqueId currentUid;
+       ExtraTags* currentExtraTags;
+       std::string currentElement;
 };
 
diff --git a/source/blender/collada/ExtraTags.cpp b/source/blender/collada/ExtraTags.cpp
new file mode 100644 (file)
index 0000000..4fce276
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExtraTags.cpp
+ *  \ingroup collada
+ */
+
+#include <stddef.h>
+#include "BLI_string.h"
+
+#include <iostream>
+
+#include "ExtraTags.h"
+
+ExtraTags::ExtraTags(const std::string profile)
+{
+       this->profile = profile;
+}
+
+ExtraTags::~ExtraTags()
+{
+}
+
+bool ExtraTags::addTag(const std::string tag, const std::string data)
+{
+       //std::cout << "ready to add " << tag << ": " << data << "." << std::endl;
+       
+       return true;
+}
\ No newline at end of file
diff --git a/source/blender/collada/ExtraTags.h b/source/blender/collada/ExtraTags.h
new file mode 100644 (file)
index 0000000..09a8674
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExtraTags.h
+ *  \ingroup collada
+ */
+
+#include <string>
+#include <map>
+#include <vector>
+
+/** \brief Class for saving <extra> tags for a specific UniqueId.
+ */
+class ExtraTags
+{
+public:
+       /** Constructor. */
+       ExtraTags(const std::string profile);
+
+       /** Destructor. */
+       virtual ~ExtraTags();
+
+       /** Handle the beginning of an element. */
+       bool addTag( const std::string tag, const std::string data);
+       
+private:
+       /** Disable default copy constructor. */
+       ExtraTags( const ExtraTags& pre );
+       /** Disable default assignment operator. */
+       const ExtraTags& operator= ( const ExtraTags& pre );
+       
+       std::string profile;
+};