@@ -158,7 +158,7 @@ std::size_t GLTFExporter::buildPrimitiveVertex(Mesh& mesh, std::vector<Face> fac
158158 data.push_back (mesh.vertices [face.v3 ].convertToFixedPoint (0 ));
159159 }
160160
161- return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3);
161+ return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3, TINYGLTF_TARGET_ARRAY_BUFFER );
162162}
163163
164164std::size_t GLTFExporter::buildPrimitiveNormal (Mesh& mesh, std::vector<Face> faces)
@@ -172,7 +172,7 @@ std::size_t GLTFExporter::buildPrimitiveNormal(Mesh& mesh, std::vector<Face> fac
172172 data.push_back (mesh.normals [face.n3 ]);
173173 }
174174
175- return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3);
175+ return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3, TINYGLTF_TARGET_ARRAY_BUFFER );
176176}
177177
178178std::size_t GLTFExporter::buildPrimitiveColor (std::vector<Face> faces)
@@ -186,7 +186,7 @@ std::size_t GLTFExporter::buildPrimitiveColor(std::vector<Face> faces)
186186 data.push_back (face.color3 );
187187 }
188188
189- return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE, TINYGLTF_TYPE_VEC3);
189+ return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE, TINYGLTF_TYPE_VEC3, TINYGLTF_TARGET_ARRAY_BUFFER );
190190}
191191
192192std::size_t GLTFExporter::buildPrimitiveTexcoord (std::vector<Face> faces)
@@ -200,14 +200,15 @@ std::size_t GLTFExporter::buildPrimitiveTexcoord(std::vector<Face> faces)
200200 data.push_back (TexCoord (face.uv3 , tim.getSize ()));
201201 }
202202
203- return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC2);
203+ return buildAccessor (data, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC2, TINYGLTF_TARGET_ARRAY_BUFFER );
204204}
205205
206- template <typename T> std::size_t GLTFExporter::buildAccessor (std::vector<T> data, int componentType, int type)
206+ template <typename T>
207+ std::size_t GLTFExporter::buildAccessor (std::vector<T> data, int componentType, int type, int target)
207208{
208209 tinygltf::Buffer buffer;
209- T min = {} ;
210- T max = {} ;
210+ T min = data[ 0 ] ;
211+ T max = data[ 0 ] ;
211212
212213 for (T& val : data)
213214 {
@@ -223,7 +224,7 @@ template<typename T> std::size_t GLTFExporter::buildAccessor(std::vector<T> data
223224 view.buffer = bufferId;
224225 view.byteLength = buffer.data .size ();
225226 view.byteOffset = 0 ;
226- view.target = TINYGLTF_TARGET_ARRAY_BUFFER ;
227+ view.target = target ;
227228
228229 auto viewId = push (model.bufferViews , view);
229230
@@ -291,7 +292,6 @@ void GLTFExporter::buildSkeletonScene()
291292 scene.nodes .push_back (id);
292293
293294 if (id > 0 ) model.skins [skinId].joints .push_back (id);
294- node.skin = skinId;
295295 }
296296
297297 model.defaultScene = push (model.scenes , scene);
@@ -361,6 +361,8 @@ int32_t GLTFExporter::buildMaterial(MaterialMode mode)
361361 return id;
362362}
363363
364+ #include < iostream>
365+
364366void GLTFExporter::buildAnimations ()
365367{
366368 for (auto & raw : mmd.anims ->anims )
@@ -378,34 +380,46 @@ void GLTFExporter::buildAnimations()
378380 std::vector<float > scaleTime;
379381 std::vector<FVector> scale;
380382
383+ float time = -1 ;
381384 for (int i = 0 ; i < a.data [Axis::POS_X].size (); i++)
382385 {
383386 auto posX = a.data [Axis::POS_X][i];
384387 auto posY = a.data [Axis::POS_Y][i];
385388 auto posZ = a.data [Axis::POS_Z][i];
386389
390+ if (time >= posX.first ) continue ;
391+
387392 posTime.push_back (posX.first );
388393 pos.emplace_back (posX.second , posY.second , posZ.second );
394+ time = posX.first ;
389395 }
390396
397+ time = -1 ;
391398 for (int i = 0 ; i < a.data [Axis::ROT_X].size (); i++)
392399 {
393400 auto rotX = a.data [Axis::ROT_X][i];
394401 auto rotY = a.data [Axis::ROT_Y][i];
395402 auto rotZ = a.data [Axis::ROT_Z][i];
396403
404+ if (time >= rotX.first ) continue ;
405+
397406 rotTime.push_back (rotX.first );
398407 rot.emplace_back (FVector{ rotX.second , rotY.second , rotZ.second });
408+ time = rotX.first ;
399409 }
400410
411+ time = -1 ;
401412 for (int i = 0 ; i < a.data [Axis::SCALE_X].size (); i++)
402413 {
403414 auto scaleX = a.data [Axis::SCALE_X][i];
404415 auto scaleY = a.data [Axis::SCALE_Y][i];
405416 auto scaleZ = a.data [Axis::SCALE_Z][i];
406417
418+ if (time >= scaleX.first ) continue ;
419+
407420 scaleTime.push_back (scaleX.first );
408421 scale.emplace_back (scaleX.second , scaleY.second , scaleZ.second );
422+ time = scaleX.first ;
409423 }
410424
411425 tinygltf::AnimationChannel posChannel;
@@ -415,17 +429,17 @@ void GLTFExporter::buildAnimations()
415429 tinygltf::AnimationSampler rotSampler;
416430 tinygltf::AnimationSampler scaleSampler;
417431
418- posSampler.input = buildAccessor (posTime, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_SCALAR);
432+ posSampler.input = buildAccessor (posTime, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_SCALAR, 0 );
419433 posSampler.interpolation = " LINEAR" ;
420- posSampler.output = buildAccessor (pos, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3);
434+ posSampler.output = buildAccessor (pos, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3, 0 );
421435
422- rotSampler.input = buildAccessor (rotTime, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_SCALAR);
436+ rotSampler.input = buildAccessor (rotTime, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_SCALAR, 0 );
423437 rotSampler.interpolation = " LINEAR" ;
424- rotSampler.output = buildAccessor (rot, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC4);
438+ rotSampler.output = buildAccessor (rot, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC4, 0 );
425439
426- scaleSampler.input = buildAccessor (scaleTime, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_SCALAR);
440+ scaleSampler.input = buildAccessor (scaleTime, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_SCALAR, 0 );
427441 scaleSampler.interpolation = " LINEAR" ;
428- scaleSampler.output = buildAccessor (scale, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3);
442+ scaleSampler.output = buildAccessor (scale, TINYGLTF_COMPONENT_TYPE_FLOAT, TINYGLTF_TYPE_VEC3, 0 );
429443
430444 posChannel.target_node = nodeId;
431445 posChannel.target_path = " translation" ;
@@ -514,13 +528,13 @@ GLTFExporter::GLTFExporter(Model& mmd, AbstractTIM& tim)
514528 buildTexture ();
515529}
516530
517- void GLTFExporter::save (const std::string& filename)
531+ bool GLTFExporter::save (const std::string& filename)
518532{
519533 tinygltf::TinyGLTF gltf;
520- gltf.WriteGltfSceneToFile (&model,
521- filename,
522- true , // embedImages
523- true , // embedBuffers
524- true , // pretty print
525- false ); // write binary
534+ return gltf.WriteGltfSceneToFile (&model,
535+ filename,
536+ true , // embedImages
537+ true , // embedBuffers
538+ true , // pretty print
539+ false ); // write binary
526540}
0 commit comments