check if bones exist before creating skin
authorAngelo Scandaliato <angelo@adtile.me>
Sun, 16 Oct 2016 00:21:55 +0000 (17:21 -0700)
committerAngelo Scandaliato <angelo@adtile.me>
Sun, 16 Oct 2016 00:21:55 +0000 (17:21 -0700)
code/glTFExporter.cpp

index 3c13db8..074d365 100644 (file)
@@ -517,17 +517,23 @@ void glTFExporter::ExportMeshes()
     }
 
     //----------------------------------------
-    // For the skin
+    // Initialize variables for the skin
+    bool createSkin = false;
+    for (unsigned int idx_mesh = 0; idx_mesh < mScene->mNumMeshes; ++idx_mesh) {
+        const aiMesh* aim = mScene->mMeshes[idx_mesh];
+        if(aim->HasBones()) {
+            createSkin = true;
+            break;
+        }
+    }
+
+    Ref<Skin> skinRef;
     std::string skinName = mAsset->FindUniqueID("skin", "skin");
-    Ref<Skin> skinRef = mAsset->skins.Create(skinName);
-    skinRef->name = skinName;
-    // std::vector<glTF::mat4> inverseBindMatricesData;
     std::vector<aiMatrix4x4> inverseBindMatricesData;
-
-    // Identity Matrix   =====>  skinRef->bindShapeMatrix
-    // Temporary. Hard-coded identity matrix here
-    skinRef->bindShapeMatrix.isPresent = true;
-    IdentityMatrix4(skinRef->bindShapeMatrix.value);
+    if(createSkin) {
+        skinRef = mAsset->skins.Create(skinName);
+        skinRef->name = skinName;
+    }
     //----------------------------------------
 
        for (unsigned int idx_mesh = 0; idx_mesh < mScene->mNumMeshes; ++idx_mesh) {
@@ -725,24 +731,30 @@ void glTFExporter::ExportMeshes()
     //----------------------------------------
     // Finish the skin
     // Create the Accessor for skinRef->inverseBindMatrices
-    mat4* invBindMatrixData = new mat4[inverseBindMatricesData.size()];
-    for (int idx_joint = 0; idx_joint < inverseBindMatricesData.size(); ++idx_joint) {
-        CopyValue(inverseBindMatricesData[idx_joint], invBindMatrixData[idx_joint]);
-    }
+    if (createSkin) {
+        mat4* invBindMatrixData = new mat4[inverseBindMatricesData.size()];
+        for (int idx_joint = 0; idx_joint < inverseBindMatricesData.size(); ++idx_joint) {
+            CopyValue(inverseBindMatricesData[idx_joint], invBindMatrixData[idx_joint]);
+        }
 
-    Ref<Accessor> invBindMatrixAccessor = ExportData(*mAsset, skinName, b, inverseBindMatricesData.size(), invBindMatrixData, AttribType::MAT4, AttribType::MAT4, ComponentType_FLOAT);
-    if (invBindMatrixAccessor) skinRef->inverseBindMatrices = invBindMatrixAccessor;
+        Ref<Accessor> invBindMatrixAccessor = ExportData(*mAsset, skinName, b, inverseBindMatricesData.size(), invBindMatrixData, AttribType::MAT4, AttribType::MAT4, ComponentType_FLOAT);
+        if (invBindMatrixAccessor) skinRef->inverseBindMatrices = invBindMatrixAccessor;
 
-    // Find node that contains this mesh and add "skeletons" and "skin" attributes to that node.
-    Ref<Node> rootNode = mAsset->nodes.Get(unsigned(0));
-    Ref<Node> meshNode;
-    std::string meshID = mAsset->meshes.Get(unsigned(0))->id;
-    FindMeshNode(rootNode, meshNode, meshID);
+        // Identity Matrix   =====>  skinRef->bindShapeMatrix
+        // Temporary. Hard-coded identity matrix here
+        skinRef->bindShapeMatrix.isPresent = true;
+        IdentityMatrix4(skinRef->bindShapeMatrix.value);
 
-    Ref<Node> rootJoint = FindSkeletonRootJoint(skinRef);
-    meshNode->skeletons.push_back(rootJoint);
-    meshNode->skin = skinRef;
-    //----------------------------------------
+        // Find node that contains this mesh and add "skeletons" and "skin" attributes to that node.
+        Ref<Node> rootNode = mAsset->nodes.Get(unsigned(0));
+        Ref<Node> meshNode;
+        std::string meshID = mAsset->meshes.Get(unsigned(0))->id;
+        FindMeshNode(rootNode, meshNode, meshID);
+
+        Ref<Node> rootJoint = FindSkeletonRootJoint(skinRef);
+        meshNode->skeletons.push_back(rootJoint);
+        meshNode->skin = skinRef;
+    }
 }
 
 /*