Przeglądaj źródła

Merge pull request #394 from blackberry-gaming/next-dgough

Next dgough
Chris Culy 13 lat temu
rodzic
commit
cede12bf99

+ 1 - 7
gameplay-encoder/src/DAESceneEncoder.cpp

@@ -261,13 +261,7 @@ void DAESceneEncoder::write(const std::string& filepath, const EncoderArguments&
     daeElement* scene = NULL;
     daeElement* scene = NULL;
     if (domScene && domScene->getInstance_visual_scene())
     if (domScene && domScene->getInstance_visual_scene())
     {
     {
-        scene = domScene->getInstance_visual_scene()->getUrl().getElement();
-        if (scene->getElementType() != COLLADA_TYPE::VISUAL_SCENE)
-        {
-            // This occured once where Maya exported a Node and Scene element with the same ID.
-            fprintf(stderr,"Error: instance_visual_scene does not reference visual_scene for file:%s\n", filepath.c_str());
-            return;
-        }
+        scene = getVisualScene(domScene);
         if (scene)
         if (scene)
         {
         {
             if (nodeId == NULL)
             if (nodeId == NULL)

+ 27 - 0
gameplay-encoder/src/DAEUtil.cpp

@@ -391,4 +391,31 @@ void getAnimationChannels(const domAnimationRef& animationRef, const std::string
     }
     }
 }
 }
 
 
+domVisual_scene* getVisualScene(const domCOLLADA::domSceneRef& domScene)
+{
+    daeElement* scene = domScene->getInstance_visual_scene()->getUrl().getElement();
+    if (scene->getElementType() == COLLADA_TYPE::VISUAL_SCENE)
+    {
+        return static_cast<domVisual_scene*>(scene);
+    }
+
+    // DAE_FBX sometimes doesn't export an ID. In that case, see if there is only one visual scene and use that.
+    // Most of the time there is only one visual scene.
+    domCOLLADA* root = (domCOLLADA*)domScene->getDocument()->getDomRoot();
+    domLibrary_visual_scenes_Array& visualSceneLibrary = root->getLibrary_visual_scenes_array();
+    size_t visualSceneLibraryCount = visualSceneLibrary.getCount();
+    for (size_t i = 0; i < visualSceneLibraryCount; ++i)
+    {
+        domLibrary_visual_scenesRef scenesRef = visualSceneLibrary.get(i);
+        domVisual_scene_Array visualScenes = scenesRef->getVisual_scene_array();
+        size_t visualSceneCount = visualScenes.getCount();
+        for (size_t j = 0; j < visualSceneCount; ++j)
+        {
+            domVisual_sceneRef visualScene = visualScenes.get(j);
+            return visualScene.cast();
+        }
+    }
+    return NULL;
+}
+
 }
 }

+ 9 - 0
gameplay-encoder/src/DAEUtil.h

@@ -123,6 +123,15 @@ void moveChannelAndSouresToAnimation(domChannelRef& channel, domAnimationRef& an
  */
  */
 bool isEmptyAnimation(domAnimationRef& animation);
 bool isEmptyAnimation(domAnimationRef& animation);
 
 
+/**
+ * Gets the visual scene from the given COLLADA dom scene.
+ * 
+ * @param COLLADA dom scene.
+ * 
+ * @return The visual scene or NULL if not found.
+ */
+domVisual_scene* getVisualScene(const domCOLLADA::domSceneRef& domScene);
+
 }
 }
 
 
 #endif
 #endif

+ 2 - 2
gameplay-encoder/src/GPBDecoder.cpp

@@ -62,7 +62,7 @@ void GPBDecoder::readRefs()
 {
 {
     fprintf(_outFile, "<RefTable>\n");
     fprintf(_outFile, "<RefTable>\n");
     // read number of refs
     // read number of refs
-    unsigned int refCount;
+    unsigned int refCount = 0;
     assert(read(&refCount));
     assert(read(&refCount));
     for (size_t i = 0; i < refCount; ++i)
     for (size_t i = 0; i < refCount; ++i)
     {
     {
@@ -74,7 +74,7 @@ void GPBDecoder::readRefs()
 void GPBDecoder::readRef()
 void GPBDecoder::readRef()
 {
 {
     std::string xref = readString(_file);
     std::string xref = readString(_file);
-    unsigned int type, offset;
+    unsigned int type = 0, offset = 0;
     assert(read(&type));
     assert(read(&type));
     assert(read(&offset));
     assert(read(&offset));
     
     

+ 0 - 5
gameplay-encoder/src/TTFFontEncoder.cpp

@@ -23,11 +23,6 @@ static void writeUint(FILE* fp, unsigned int i)
     fwrite(&i, sizeof(unsigned int), 1, fp);
     fwrite(&i, sizeof(unsigned int), 1, fp);
 }
 }
 
 
-static void writeFloat(FILE* fp, float f)
-{
-    fwrite(&f, sizeof(float), 1, fp);
-}
-
 static void writeString(FILE* fp, const char* str)
 static void writeString(FILE* fp, const char* str)
 {
 {
     unsigned int len = strlen(str);
     unsigned int len = strlen(str);