Browse Source

Export tangents in GLTF (#5900)

Previously tangents were not being exported. If they are present, they should also be properly
exported.

Co-authored-by: Kim Kulling <[email protected]>
Julian Knodt 7 months ago
parent
commit
258cdfd2bc
2 changed files with 15 additions and 0 deletions
  1. 1 0
      code/AssetLib/glTF2/glTF2AssetWriter.inl
  2. 14 0
      code/AssetLib/glTF2/glTF2Exporter.cpp

+ 1 - 0
code/AssetLib/glTF2/glTF2AssetWriter.inl

@@ -608,6 +608,7 @@ namespace glTF2 {
                 {
                 {
                     WriteAttrs(w, attrs, p.attributes.position, "POSITION");
                     WriteAttrs(w, attrs, p.attributes.position, "POSITION");
                     WriteAttrs(w, attrs, p.attributes.normal, "NORMAL");
                     WriteAttrs(w, attrs, p.attributes.normal, "NORMAL");
+                    WriteAttrs(w, attrs, p.attributes.tangent, "TANGENT");
                     WriteAttrs(w, attrs, p.attributes.texcoord, "TEXCOORD", true);
                     WriteAttrs(w, attrs, p.attributes.texcoord, "TEXCOORD", true);
                     WriteAttrs(w, attrs, p.attributes.color, "COLOR", true);
                     WriteAttrs(w, attrs, p.attributes.color, "COLOR", true);
                     WriteAttrs(w, attrs, p.attributes.joint, "JOINTS", true);
                     WriteAttrs(w, attrs, p.attributes.joint, "JOINTS", true);

+ 14 - 0
code/AssetLib/glTF2/glTF2Exporter.cpp

@@ -1215,6 +1215,20 @@ void glTF2Exporter::ExportMeshes() {
             p.attributes.normal.push_back(n);
             p.attributes.normal.push_back(n);
         }
         }
 
 
+        /******************** Tangents ********************/
+        if (nullptr != aim->mTangents) {
+            for (uint32_t i = 0; i < aim->mNumVertices; ++i) {
+                aim->mTangents[i].NormalizeSafe();
+            }
+            Ref<Accessor> t = ExportData(
+                *mAsset, meshId, b, aim->mNumVertices, aim->mTangents, AttribType::VEC3,
+                AttribType::VEC3, ComponentType_FLOAT, BufferViewTarget_ARRAY_BUFFER
+            );
+            if (t) {
+                p.attributes.tangent.push_back(t);
+            }
+        }
+
         /************** Texture coordinates **************/
         /************** Texture coordinates **************/
         for (int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) {
         for (int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) {
             if (!aim->HasTextureCoords(i)) {
             if (!aim->HasTextureCoords(i)) {