Browse Source

Add reference screenshots for complex bundled test 3D model files (#5822)

Feature: Add reference screenshots for complex bundled test 3D model files

Co-authored-by: Steve M <[email protected]>
Co-authored-by: Kim Kulling <[email protected]>
Steve M 10 tháng trước cách đây
mục cha
commit
f7bb1bc170
91 tập tin đã thay đổi với 2686 bổ sung0 xóa
  1. 10 0
      test/models-nonbsd/AMF/ref/README.md
  2. BIN
      test/models-nonbsd/AMF/ref/screenshots/3bananas_embedded_texture.png
  3. 9 0
      test/models-nonbsd/B3D/ref/README.md
  4. BIN
      test/models-nonbsd/B3D/ref/screenshots/dwarf2_b3d.gif
  5. BIN
      test/models-nonbsd/B3D/ref/screenshots/turtle1_b3d.gif
  6. 4 0
      test/models-nonbsd/BLEND/ref/README.md
  7. BIN
      test/models-nonbsd/BLEND/ref/screenshots/fleurOptonl_blend.png
  8. 4 0
      test/models-nonbsd/HMP/ref/README.md
  9. BIN
      test/models-nonbsd/HMP/ref/screenshots/terrain_withtexture_hmp.png
  10. 4 0
      test/models-nonbsd/LWS/ref/README.md
  11. BIN
      test/models-nonbsd/LWS/ref/screenshots/quickdraw_v2_2_lws.gif
  12. 12 0
      test/models-nonbsd/MD5/ref/README.md
  13. BIN
      test/models-nonbsd/MD5/ref/screenshots/Bob_md5anim.gif
  14. BIN
      test/models-nonbsd/MD5/ref/screenshots/Bob_md5mesh.gif
  15. 4 0
      test/models-nonbsd/MDL/IDPO (Quake1)/ref/README.md
  16. BIN
      test/models-nonbsd/MDL/IDPO (Quake1)/ref/screenshots/gijoe_mdl.png
  17. 9 0
      test/models-nonbsd/Ogre/OgreSDK/ref/README.md
  18. BIN
      test/models-nonbsd/Ogre/OgreSDK/ref/screenshots/fish_mesh.gif
  19. BIN
      test/models-nonbsd/Ogre/OgreSDK/ref/screenshots/ninja_mesh.gif
  20. 14 0
      test/models-nonbsd/X3D/ref/README.md
  21. BIN
      test/models-nonbsd/X3D/ref/screenshots/ChevyTahoe_x3d_irr_xml.png
  22. BIN
      test/models-nonbsd/X3D/ref/screenshots/ChevyTahoe_x3d_pugi_xml.png
  23. 6 0
      test/models/AC/ref/README.md
  24. BIN
      test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png
  25. 18 0
      test/models/ASE/ref/README.md
  26. BIN
      test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif
  27. 16 0
      test/models/BVH/ref/README.md
  28. BIN
      test/models/BVH/ref/screenshots/01_01_bvh.gif
  29. BIN
      test/models/BVH/ref/screenshots/01_03_bvh.gif
  30. BIN
      test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif
  31. 6 0
      test/models/Collada/ref/README.md
  32. BIN
      test/models/Collada/ref/screenshots/human_zae.png
  33. 4 0
      test/models/HMP/ref/README.md
  34. BIN
      test/models/HMP/ref/screenshots/terrain_hmp.png
  35. 4 0
      test/models/IQM/ref/README.md
  36. BIN
      test/models/IQM/ref/screenshots/mrfixit_iqm.png
  37. 14 0
      test/models/IRR/ref/README.md
  38. BIN
      test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif
  39. BIN
      test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif
  40. BIN
      test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif
  41. 7 0
      test/models/MD2/ref/README.md
  42. BIN
      test/models/MD2/ref/screenshots/faerie_md2.png
  43. BIN
      test/models/MD2/ref/screenshots/sydney_md2.png
  44. BIN
      test/models/OpenGEX/texture/Concrete.tga
  45. 7 0
      test/models/TER/ref/README.md
  46. BIN
      test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png
  47. BIN
      test/models/TER/ref/screenshots/RealisticTerrain_ter.png
  48. BIN
      test/models/USD/MotionCaptureROM.usdc
  49. 8 0
      test/models/USD/README.md
  50. 4 0
      test/models/USD/ref/README.md
  51. BIN
      test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png
  52. 7 0
      test/models/X/ref/README.md
  53. BIN
      test/models/X/ref/screenshots/BCN_Epileptic_X.gif
  54. BIN
      test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif
  55. 14 0
      test/models/X3D/ref/README.md
  56. BIN
      test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png
  57. BIN
      test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png
  58. 15 0
      test/models/glTF2/AnimatedMorphCube/LICENSE.md
  59. 12 0
      test/models/glTF2/AnimatedMorphCube/README.body.md
  60. 36 0
      test/models/glTF2/AnimatedMorphCube/README.md
  61. BIN
      test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin
  62. 282 0
      test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf
  63. 20 0
      test/models/glTF2/AnimatedMorphSphere/README.md
  64. 0 0
      test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin
  65. 276 0
      test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf
  66. 17 0
      test/models/glTF2/MorphPrimitivesTest/LICENSE.md
  67. 21 0
      test/models/glTF2/MorphPrimitivesTest/README.body.md
  68. 50 0
      test/models/glTF2/MorphPrimitivesTest/README.md
  69. BIN
      test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin
  70. 331 0
      test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf
  71. BIN
      test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg
  72. 15 0
      test/models/glTF2/MorphStressTest/LICENSE.md
  73. 62 0
      test/models/glTF2/MorphStressTest/README.body.md
  74. 87 0
      test/models/glTF2/MorphStressTest/README.md
  75. BIN
      test/models/glTF2/MorphStressTest/glTF/Base_AO.png
  76. BIN
      test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png
  77. BIN
      test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin
  78. 999 0
      test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf
  79. BIN
      test/models/glTF2/MorphStressTest/glTF/TinyGrid.png
  80. 15 0
      test/models/glTF2/SimpleMorph/LICENSE.md
  81. 17 0
      test/models/glTF2/SimpleMorph/README.body.md
  82. 41 0
      test/models/glTF2/SimpleMorph/README.md
  83. 189 0
      test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf
  84. BIN
      test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin
  85. BIN
      test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin
  86. 16 0
      test/models/glTF2/ref/README.md
  87. BIN
      test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif
  88. BIN
      test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif
  89. BIN
      test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif
  90. BIN
      test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif
  91. BIN
      test/models/glTF2/ref/screenshots/SimpleMorph.gif

+ 10 - 0
test/models-nonbsd/AMF/ref/README.md

@@ -0,0 +1,10 @@
+# AMF 3D model reference images
+
+## 3_bananas.amf embedded texture
+3_bananas.amf embeds a strange-looking texture, but believe when applied to the model it ends up
+rendering correctly.
+
+(Note that this is a relatively rare example of a 3D model with an "uncompressed" embedded texture,
+may be useful for developers looking to test their assimp embedded texture implementations)
+
+<img alt="3bananas_embedded_texture.png" src="screenshots%2F3bananas_embedded_texture.png" width=320 />

BIN
test/models-nonbsd/AMF/ref/screenshots/3bananas_embedded_texture.png


+ 9 - 0
test/models-nonbsd/B3D/ref/README.md

@@ -0,0 +1,9 @@
+# B3D 3D model reference images
+
+## dwarf2.b3d
+Note: there's a weird artifact in the animation when the character starts running
+
+<img alt="dwarf2.b3d" src="screenshots/dwarf2_b3d.gif" width=180 />
+
+## turtle1.b3d
+<img alt="turtle1.b3d" src="screenshots/turtle1_b3d.gif" width=320 />

BIN
test/models-nonbsd/B3D/ref/screenshots/dwarf2_b3d.gif


BIN
test/models-nonbsd/B3D/ref/screenshots/turtle1_b3d.gif


+ 4 - 0
test/models-nonbsd/BLEND/ref/README.md

@@ -0,0 +1,4 @@
+# BLEND 3D model reference images
+
+## fleurOptonl.blend
+<img alt="fleurOptonl.blend" src="screenshots/fleurOptonl_blend.png" width=180 />

BIN
test/models-nonbsd/BLEND/ref/screenshots/fleurOptonl_blend.png


+ 4 - 0
test/models-nonbsd/HMP/ref/README.md

@@ -0,0 +1,4 @@
+# HMP 3D model reference images
+
+## terrain_withtexture.hmp
+<img alt="terrain_withtexture.hmp" src="screenshots/terrain_withtexture_hmp.png" width=180 />

BIN
test/models-nonbsd/HMP/ref/screenshots/terrain_withtexture_hmp.png


+ 4 - 0
test/models-nonbsd/LWS/ref/README.md

@@ -0,0 +1,4 @@
+# LWS 3D model reference images
+
+## QuickDraw v.2.2.lws
+<img alt="QuickDraw v.2.2.lws" src="screenshots/quickdraw_v2_2_lws.gif" width=320 />

BIN
test/models-nonbsd/LWS/ref/screenshots/quickdraw_v2_2_lws.gif


+ 12 - 0
test/models-nonbsd/MD5/ref/README.md

@@ -0,0 +1,12 @@
+# MD5 3D model reference images
+
+## Bob.md5anim
+Bones/skeleton-only animation visualization
+
+<img alt="Bob.md5anim" src="screenshots/Bob_md5anim.gif" width=180 />
+
+
+## Bob.md5mesh
+Skinned, textured animated model
+
+<img alt="Bob.md5mesh" src="screenshots/Bob_md5mesh.gif" width=180 />

BIN
test/models-nonbsd/MD5/ref/screenshots/Bob_md5anim.gif


BIN
test/models-nonbsd/MD5/ref/screenshots/Bob_md5mesh.gif


+ 4 - 0
test/models-nonbsd/MDL/IDPO (Quake1)/ref/README.md

@@ -0,0 +1,4 @@
+# IDPO 3D model reference images
+
+## gijoe.mdl
+<img alt="gijoe.mdl" src="screenshots/gijoe_mdl.png" width=180 />

BIN
test/models-nonbsd/MDL/IDPO (Quake1)/ref/screenshots/gijoe_mdl.png


+ 9 - 0
test/models-nonbsd/Ogre/OgreSDK/ref/README.md

@@ -0,0 +1,9 @@
+# OgreSDK 3D model reference images
+
+## fish.mesh
+<img alt="fish.mesh" src="screenshots/fish_mesh.gif" width=320 />
+
+## ninja.mesh
+Simple rigged/skinned model with about 20 animations
+
+<img alt="ninja.mesh" src="screenshots/ninja_mesh.gif" width=180 />

BIN
test/models-nonbsd/Ogre/OgreSDK/ref/screenshots/fish_mesh.gif


BIN
test/models-nonbsd/Ogre/OgreSDK/ref/screenshots/ninja_mesh.gif


+ 14 - 0
test/models-nonbsd/X3D/ref/README.md

@@ -0,0 +1,14 @@
+# X3D 3D model reference images
+
+## ChevyTahoe.x3d
+
+### Working (using IRR xml parser)
+ChevyTahoe as of 29 Sep 2020 git commit `6a4c338`, using IRR xml parsing, renders OK:
+
+<img alt="ChevyTahoe.x3d (irr_xml)" src="screenshots%2FChevyTahoe_x3d_irr_xml.png" width=320 />
+
+### Broken (using pugi xml parser)
+ChevyTahoe as of 1 Dec 2021 git commit `1614934`, using pugi xml parsing, renders with 
+missing meshes and obvious artifacts:
+
+<img alt="ChevyTahoe.x3d (pugi_xml)" src="screenshots%2FChevyTahoe_x3d_pugi_xml.png" width=320 />

BIN
test/models-nonbsd/X3D/ref/screenshots/ChevyTahoe_x3d_irr_xml.png


BIN
test/models-nonbsd/X3D/ref/screenshots/ChevyTahoe_x3d_pugi_xml.png


+ 6 - 0
test/models/AC/ref/README.md

@@ -0,0 +1,6 @@
+# AC 3D model reference images
+
+## sample_subdiv.ac
+Note that there appear to be some small holes in the surface in a few places
+
+<img alt="sample_subdiv.ac (as solid)" src="screenshots/sample_subdiv_ac_solid.png" width=180 />

BIN
test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png


+ 18 - 0
test/models/ASE/ref/README.md

@@ -0,0 +1,18 @@
+# ASE 3D model reference images
+
+## MotionCaptureROM.ase
+
+### Model is pure node animation of separate rigid meshes, no bones/mesh deformation
+Note: this model has no bones/skeleton; the body is formed of separate rigid meshes
+for each segment (e.g. upper arm, lower arm, upper leg, lower leg are all separate meshses) 
+and animation  is entirely driven by changing node transformations over the animation timeline, 
+rather than deforming vertices via bones and associated weights.
+
+### Artifacts
+Animation has known artifacts, as stated in [MotionCaptureROM.source.txt](../MotionCaptureROM.source.txt):
+```
+NOTE: The errors in the middle of the animation are caused by problems during recording,
+it's not an importer issue.
+```
+
+<img alt="MotionCaptureROM.ase" src="screenshots/MotionCaptureROM_ase.gif" width=320 />

BIN
test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif


+ 16 - 0
test/models/BVH/ref/README.md

@@ -0,0 +1,16 @@
+# BVH 3D model reference images
+
+## 01_01.bvh
+Three hops forward, turn around, three hops back, turn around, three hops forward
+
+<img alt="01_01.bvh" src="screenshots/01_01_bvh.gif" width=180 />
+
+## 01_03.bvh
+Climb step ladder, hang on bar, climb step ladder, hang on bar
+
+<img alt="01_03.bvh" src="screenshots/01_03_bvh.gif" width=320 />
+
+## Boxing_Toes.bvh
+Boxer warming up, throwing punches, getting hit, going to canvas
+
+<img alt="Boxing_Toes.bvh" src="screenshots/Boxing_Toes_bvh.gif" width=180 />

BIN
test/models/BVH/ref/screenshots/01_01_bvh.gif


BIN
test/models/BVH/ref/screenshots/01_03_bvh.gif


BIN
test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif


+ 6 - 0
test/models/Collada/ref/README.md

@@ -0,0 +1,6 @@
+# Collada 3D model reference images
+
+## human.zae
+Compressed Collada file (.zae)
+
+<img alt="human.zae" src="screenshots/human_zae.png" width=180 />

BIN
test/models/Collada/ref/screenshots/human_zae.png


+ 4 - 0
test/models/HMP/ref/README.md

@@ -0,0 +1,4 @@
+# HMP 3D model reference images
+
+## terrain.hmp
+<img alt="terrain.hmp" src="screenshots/terrain_hmp.png" width=180 />

BIN
test/models/HMP/ref/screenshots/terrain_hmp.png


+ 4 - 0
test/models/IQM/ref/README.md

@@ -0,0 +1,4 @@
+# IQM 3D model reference images
+
+## mrfixit.iqm
+<img alt="mrfixit.iqm" src="screenshots/mrfixit_iqm.png" width=180 />

BIN
test/models/IQM/ref/screenshots/mrfixit_iqm.png


+ 14 - 0
test/models/IRR/ref/README.md

@@ -0,0 +1,14 @@
+# IRR 3D model reference images
+
+## scenegraphAnimMod_UTF16LE.irr
+
+### Animation "AnimationSet0"
+Dwarf animated; primitive objects not animated
+
+<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr.gif" width=320 />
+<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif" width=180 />
+
+### Animation "Irr_GlobalAnimChannel"
+Primitive objects animate; dwarf not animated (Animation playback sped up significantly)
+
+<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif" width=180 />

BIN
test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif


BIN
test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif


BIN
test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif


+ 7 - 0
test/models/MD2/ref/README.md

@@ -0,0 +1,7 @@
+# MD2 3D model reference images
+
+## faerie.md2
+<img alt="faerie.md2" src="screenshots/faerie_md2.png" width=180 />
+
+## sydney.md2
+<img alt="sydney.md2" src="screenshots/sydney_md2.png" width=180 />

BIN
test/models/MD2/ref/screenshots/faerie_md2.png


BIN
test/models/MD2/ref/screenshots/sydney_md2.png


BIN
test/models/OpenGEX/texture/Concrete.tga


+ 7 - 0
test/models/TER/ref/README.md

@@ -0,0 +1,7 @@
+# TER 3D model reference images
+
+## RealisticTerrain.ter
+<img alt="RealisticTerrain.ter" src="screenshots/RealisticTerrain_ter.png" width=180 />
+
+## RealisticTerrain_Large.ter
+<img alt="RealisticTerrain_Large.ter" src="screenshots/RealisticTerrain_Large_ter.png" width=180 />

BIN
test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png


BIN
test/models/TER/ref/screenshots/RealisticTerrain_ter.png


BIN
test/models/USD/MotionCaptureROM.usdc


+ 8 - 0
test/models/USD/README.md

@@ -0,0 +1,8 @@
+# USD model files
+
+## MotionCaptureROM.usdc
+Converted bundled .wrl test model:
+    https://github.com/assimp/assimp/blob/master/test/models/WRL/MotionCaptureROM.WRL
+to .usdc format via website:
+    https://imagetostl.com/convert/file/wrl/to/usd#convert
+(As of Oct 2024, animations have not been verified as present or correct)

+ 4 - 0
test/models/USD/ref/README.md

@@ -0,0 +1,4 @@
+# USD 3D model reference images
+
+## MotionCaptureROM.usdc
+<img alt="MotionCaptureROM.usdc" src="screenshots/MotionCaptureROM_usdc.png" width=180 />

BIN
test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png


+ 7 - 0
test/models/X/ref/README.md

@@ -0,0 +1,7 @@
+# X 3D model reference images
+
+## BCN_Epileptic.X
+<img alt="BCN_Epileptic.X" src="screenshots/BCN_Epileptic_X.gif" width=180 />
+
+## Testwuson.X playing animation "Wuson_Run"
+<img alt="Testwuson.X" src="screenshots/Testwuson_X_anim_Wuson_Run.gif" width=180 />

BIN
test/models/X/ref/screenshots/BCN_Epileptic_X.gif


BIN
test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif


+ 14 - 0
test/models/X3D/ref/README.md

@@ -0,0 +1,14 @@
+# X3D 3D model reference images
+
+## ComputerKeyboard.x3d
+
+### Working (using IRR xml parser)
+ComputerKeyboard as of 29 Sep 2020 git commit `6a4c338`, using IRR xml parsing, renders OK:
+
+<img alt="ComputerKeyboard.x3d (IRR xml)" src="screenshots/ComputerKeyboard_x3d_irr_xml.png" width=320 />
+
+### Broken (using pugi xml parser)
+ComputerKeyboard as of 1 Dec 2021 git commit `1614934`, using pugi xml parsing, renders with 
+missing meshes and obvious artifacts:
+
+<img alt="ComputerKeyboard.x3d (pugi xml)" src="screenshots/ComputerKeyboard_x3d_pugi_xml.png" width=320 />

BIN
test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png


BIN
test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png


+ 15 - 0
test/models/glTF2/AnimatedMorphCube/LICENSE.md

@@ -0,0 +1,15 @@
+# LICENSE file for the model: Animated Morph Cube
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+  * [CC0 1.0 Universal]("https://creativecommons.org/publicdomain/zero/1.0/legalcode") [SPDX license identifier: "CC0-1.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+  * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata

+ 12 - 0
test/models/glTF2/AnimatedMorphCube/README.body.md

@@ -0,0 +1,12 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot.gif)
+
+## Description
+
+The cube contains two morph targets in it:
+
+  * **`thin`** : moves the vertices so that it becomes super-thin 
+  * **`angle`** : moves the vertices so that it forms a ramp
+
+The animation loops, morphing between these two states.

+ 36 - 0
test/models/glTF2/AnimatedMorphCube/README.md

@@ -0,0 +1,36 @@
+# Animated Morph Cube
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+Demonstrates a simple cube with two simple morph targets and an animation that transitions between them both.
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/AnimatedMorphCube/glTF-Binary/AnimatedMorphCube.glb) in SampleViewer
+* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/AnimatedMorphCube/glTF-Binary/AnimatedMorphCube.glb)
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.gif)
+
+## Description
+
+The cube contains two morph targets in it:
+
+  * **`thin`** : moves the vertices so that it becomes super-thin 
+  * **`angle`** : moves the vertices so that it forms a ramp
+
+The animation loops, morphing between these two states.
+
+## Legal
+
+&copy; 2017, Public. [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/legalcode)
+
+ - Microsoft for Everything
+
+#### Assembled by modelmetadata

BIN
test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin


+ 282 - 0
test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf

@@ -0,0 +1,282 @@
+{
+  "accessors": [
+    {
+      "bufferView": 0,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 1,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC4"
+    },
+    {
+      "bufferView": 2,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3",
+      "max": [
+        0.0100000035,
+        0.0100000035,
+        0.01
+      ],
+      "min": [
+        -0.0100000044,
+        -0.0100000054,
+        -0.01
+      ]
+    },
+    {
+      "bufferView": 3,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3",
+      "name": "thin"
+    },
+    {
+      "bufferView": 4,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3",
+      "max": [
+        0.0,
+        0.01893253,
+        0.0
+      ],
+      "min": [
+        0.0,
+        0.0,
+        0.0
+      ],
+      "name": "thin"
+    },
+    {
+      "bufferView": 5,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3",
+      "name": "thin"
+    },
+    {
+      "bufferView": 6,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3",
+      "name": "angle"
+    },
+    {
+      "bufferView": 7,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3",
+      "max": [
+        0.0,
+        0.0198908355,
+        0.0
+      ],
+      "min": [
+        0.0,
+        0.0,
+        0.0
+      ],
+      "name": "angle"
+    },
+    {
+      "bufferView": 8,
+      "componentType": 5126,
+      "count": 24,
+      "type": "VEC3",
+      "name": "angle"
+    },
+    {
+      "bufferView": 9,
+      "componentType": 5123,
+      "count": 36,
+      "type": "SCALAR"
+    },
+    {
+      "bufferView": 10,
+      "componentType": 5126,
+      "count": 127,
+      "type": "SCALAR",
+      "max": [
+        4.19999743
+      ],
+      "min": [
+        0.0
+      ]
+    },
+    {
+      "bufferView": 11,
+      "componentType": 5126,
+      "count": 254,
+      "type": "SCALAR"
+    }
+  ],
+  "animations": [
+    {
+      "channels": [
+        {
+          "sampler": 0,
+          "target": {
+            "node": 0,
+            "path": "weights"
+          }
+        }
+      ],
+      "samplers": [
+        {
+          "input": 10,
+          "interpolation": "LINEAR",
+          "output": 11
+        }
+      ],
+      "name": "Square"
+    }
+  ],
+  "asset": {
+    "generator": "glTF Tools for Unity",
+    "version": "2.0"
+  },
+  "bufferViews": [
+    {
+      "buffer": 0,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 288,
+      "byteLength": 384
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 672,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 960,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1248,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1536,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1824,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 2112,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 2400,
+      "byteLength": 288
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 2688,
+      "byteLength": 72
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 2760,
+      "byteLength": 508
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 3268,
+      "byteLength": 1016
+    }
+  ],
+  "buffers": [
+    {
+      "uri": "AnimatedMorphCube.bin",
+      "byteLength": 4284
+    }
+  ],
+  "meshes": [
+    {
+      "primitives": [
+        {
+          "attributes": {
+            "NORMAL": 0,
+            "TANGENT": 1,
+            "POSITION": 2
+          },
+          "indices": 9,
+          "material": 0,
+          "targets": [
+            {
+              "NORMAL": 3,
+              "POSITION": 4,
+              "TANGENT": 5
+            },
+            {
+              "NORMAL": 6,
+              "POSITION": 7,
+              "TANGENT": 8
+            }
+          ]
+        }
+      ],
+      "weights": [
+        0.0,
+        0.0
+      ],
+      "name": "Cube"
+    }
+  ],
+  "materials": [
+    {
+      "pbrMetallicRoughness": {
+        "baseColorFactor": [
+          0.6038274,
+          0.6038274,
+          0.6038274,
+          1.0
+        ],
+        "metallicFactor": 0.0,
+        "roughnessFactor": 0.5
+      },
+      "name": "Material"
+    }
+  ],
+  "nodes": [
+    {
+      "mesh": 0,
+      "rotation": [
+        0.0,
+        0.7071067,
+        -0.7071068,
+        0.0
+      ],
+      "scale": [
+        100.0,
+        100.0,
+        100.0
+      ],
+      "name": "AnimatedMorphCube"
+    }
+  ],
+  "scene": 0,
+  "scenes": [
+    {
+      "nodes": [
+        0
+      ]
+    }
+  ]
+}

+ 20 - 0
test/models/glTF2/AnimatedMorphSphere/README.md

@@ -0,0 +1,20 @@
+# Animated Morph Sphere
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.gif)
+
+## Description
+
+The sphere contains two morph targets in it:
+
+  * **`blob`** : moves the vertices so that it becomes a somewhat amorphous fat, blob shape.
+  * **`ship`** : moves the vertices so that it looks a bit like a spaceship, the goal being
+    to just make it a much more complicated morph example than the [cube](../AnimatedMorphCube/README.md).
+
+The animation loops, morphing between these two states.
+
+## License Information
+
+[![CC0](http://i.creativecommons.org/p/zero/1.0/88x31.png)](http://creativecommons.org/publicdomain/zero/1.0/)  
+To the extent possible under law, Microsoft has waived all copyright and related or neighboring rights to this asset.

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin


+ 276 - 0
test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf

@@ -0,0 +1,276 @@
+{
+  "accessors": [
+    {
+      "bufferView": 0,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3"
+    },
+    {
+      "bufferView": 1,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC4"
+    },
+    {
+      "bufferView": 2,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3",
+      "max": [
+        0.009999998,
+        0.009999991,
+        0.01
+      ],
+      "min": [
+        -0.0100000026,
+        -0.0100000035,
+        -0.01
+      ]
+    },
+    {
+      "bufferView": 3,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3",
+      "name": "Ship"
+    },
+    {
+      "bufferView": 4,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3",
+      "max": [
+        0.0313265175,
+        0.0226246975,
+        0.008465132
+      ],
+      "min": [
+        -0.0313265137,
+        -0.022857653,
+        0.0
+      ],
+      "name": "Ship"
+    },
+    {
+      "bufferView": 5,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3",
+      "name": "Ship"
+    },
+    {
+      "bufferView": 6,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3",
+      "name": "Blob"
+    },
+    {
+      "bufferView": 7,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3",
+      "max": [
+        0.008781092,
+        0.0,
+        0.0
+      ],
+      "min": [
+        -0.008781091,
+        -0.0007655843,
+        0.0
+      ],
+      "name": "Blob"
+    },
+    {
+      "bufferView": 8,
+      "componentType": 5126,
+      "count": 1876,
+      "type": "VEC3",
+      "name": "Blob"
+    },
+    {
+      "bufferView": 9,
+      "componentType": 5123,
+      "count": 2880,
+      "type": "SCALAR"
+    },
+    {
+      "bufferView": 10,
+      "componentType": 5126,
+      "count": 217,
+      "type": "SCALAR",
+      "max": [
+        7.19999456
+      ],
+      "min": [
+        0.0
+      ]
+    },
+    {
+      "bufferView": 11,
+      "componentType": 5126,
+      "count": 434,
+      "type": "SCALAR"
+    }
+  ],
+  "animations": [
+    {
+      "channels": [
+        {
+          "sampler": 0,
+          "target": {
+            "node": 0,
+            "path": "weights"
+          }
+        }
+      ],
+      "samplers": [
+        {
+          "input": 10,
+          "interpolation": "LINEAR",
+          "output": 11
+        }
+      ],
+      "name": "Globe"
+    }
+  ],
+  "asset": {
+    "generator": "glTF Tools for Unity",
+    "version": "2.0"
+  },
+  "bufferViews": [
+    {
+      "buffer": 0,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 22512,
+      "byteLength": 30016
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 52528,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 75040,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 97552,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 120064,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 142576,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 165088,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 187600,
+      "byteLength": 22512
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 210112,
+      "byteLength": 5760
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 215872,
+      "byteLength": 868
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 216740,
+      "byteLength": 1736
+    }
+  ],
+  "buffers": [
+    {
+      "uri": "AnimatedMorphSphere.bin",
+      "byteLength": 218476
+    }
+  ],
+  "meshes": [
+    {
+      "primitives": [
+        {
+          "attributes": {
+            "NORMAL": 0,
+            "TANGENT": 1,
+            "POSITION": 2
+          },
+          "indices": 9,
+          "material": 0,
+          "targets": [
+            {
+              "NORMAL": 3,
+              "POSITION": 4,
+              "TANGENT": 5
+            },
+            {
+              "NORMAL": 6,
+              "POSITION": 7,
+              "TANGENT": 8
+            }
+          ]
+        }
+      ],
+      "weights": [
+        0.0,
+        0.0
+      ],
+      "name": "Sphere"
+    }
+  ],
+  "materials": [
+    {
+      "pbrMetallicRoughness": {
+        "metallicFactor": 0.0,
+        "roughnessFactor": 0.5
+      },
+      "name": "No Name"
+    }
+  ],
+  "nodes": [
+    {
+      "mesh": 0,
+      "rotation": [
+        0.0,
+        0.7071067,
+        -0.7071068,
+        0.0
+      ],
+      "scale": [
+        100.0,
+        100.0,
+        100.0
+      ],
+      "name": "AnimatedMorphSphere"
+    }
+  ],
+  "scene": 0,
+  "scenes": [
+    {
+      "nodes": [
+        0
+      ]
+    }
+  ]
+}

+ 17 - 0
test/models/glTF2/MorphPrimitivesTest/LICENSE.md

@@ -0,0 +1,17 @@
+# LICENSE file for the model: Morph-Primitives Test
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+  * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+  * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+  * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata

+ 21 - 0
test/models/glTF2/MorphPrimitivesTest/README.body.md

@@ -0,0 +1,21 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot.jpg)
+
+## Description
+
+This model contains a simple mesh with two primitives:  A larger red primitive displays a grid covering 3 of the 4 quadrants of the model's area, followed by a smaller green primitive covering the last quadrant.
+
+Each primitive has a morph target that creates an elevated area within these quadrants.  The model's only mesh contains a `weights: [0.5]` instruction that should cause these morph targets to be applied at half strength, raising the center of the model as shown in the screenshot above.
+
+## Common Problems
+
+If the entire model appears perfectly flat, it is likely that the morph targets have not been applied as requested.
+
+If the red area or green area is missing, particularly in the Draco-compressed version of this model, it could indicate a problem with decompression or with support of multiple primitives within a single mesh.
+
+## Author
+
+Model by [@ft-lab](https://github.com/ft-lab).
+
+

+ 50 - 0
test/models/glTF2/MorphPrimitivesTest/README.md

@@ -0,0 +1,50 @@
+# Morph-Primitives Test
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+Tests a morph target on multiple primitives.
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphPrimitivesTest/glTF-Binary/MorphPrimitivesTest.glb) in SampleViewer
+* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphPrimitivesTest/glTF-Binary/MorphPrimitivesTest.glb)
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.jpg)
+
+## Description
+
+This model contains a simple mesh with two primitives:  A larger red primitive displays a grid covering 3 of the 4 quadrants of the model's area, followed by a smaller green primitive covering the last quadrant.
+
+Each primitive has a morph target that creates an elevated area within these quadrants.  The model's only mesh contains a `weights: [0.5]` instruction that should cause these morph targets to be applied at half strength, raising the center of the model as shown in the screenshot above.
+
+## Common Problems
+
+If the entire model appears perfectly flat, it is likely that the morph targets have not been applied as requested.
+
+If the red area or green area is missing, particularly in the Draco-compressed version of this model, it could indicate a problem with decompression or with support of multiple primitives within a single mesh.
+
+## Author
+
+Model by [@ft-lab](https://github.com/ft-lab).
+
+
+
+
+## Legal
+
+&copy; 2018, ft-lab. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode)
+
+ - ft-lab for Everything
+
+&copy; 2020, Frank Galligan. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode)
+
+ - Frank Galligan for DRACO compression
+
+#### Assembled by modelmetadata

BIN
test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin


+ 331 - 0
test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf

@@ -0,0 +1,331 @@
+{
+  "asset": {
+    "generator": "glTF Converter for Shade3D",
+    "version": "2.0",
+    "extras": {
+      "title": "multiple_primitives",
+      "author": "ft-lab",
+      "license": "CC BY-4.0 (https://creativecommons.org/licenses/by/4.0/)"
+    }
+  },
+  "accessors": [
+    {
+      "bufferView": 0,
+      "componentType": 5123,
+      "count": 72,
+      "type": "SCALAR",
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 1,
+      "componentType": 5126,
+      "count": 21,
+      "type": "VEC3",
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 2,
+      "componentType": 5126,
+      "count": 21,
+      "type": "VEC3",
+      "max": [
+        0.5,
+        0,
+        0.5
+      ],
+      "min": [
+        -0.5,
+        0,
+        -0.5
+      ],
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 3,
+      "componentType": 5126,
+      "count": 21,
+      "type": "VEC2",
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 4,
+      "componentType": 5126,
+      "count": 21,
+      "type": "VEC3",
+      "max": [
+        0,
+        0.20000000298023224,
+        0
+      ],
+      "min": [
+        0,
+        0,
+        0
+      ],
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 5,
+      "componentType": 5123,
+      "count": 24,
+      "type": "SCALAR",
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 6,
+      "componentType": 5126,
+      "count": 9,
+      "type": "VEC3",
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 7,
+      "componentType": 5126,
+      "count": 9,
+      "type": "VEC3",
+      "max": [
+        0.5,
+        0,
+        0
+      ],
+      "min": [
+        0,
+        0,
+        -0.5
+      ],
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 8,
+      "componentType": 5126,
+      "count": 9,
+      "type": "VEC2",
+      "byteOffset": 0
+    },
+    {
+      "bufferView": 9,
+      "componentType": 5126,
+      "count": 9,
+      "type": "VEC3",
+      "max": [
+        0,
+        0.20000000298023224,
+        0
+      ],
+      "min": [
+        0,
+        0,
+        0
+      ],
+      "byteOffset": 0
+    }
+  ],
+  "bufferViews": [
+    {
+      "buffer": 0,
+      "byteOffset": 0,
+      "byteLength": 144,
+      "target": 34963
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 144,
+      "byteLength": 252,
+      "target": 34962,
+      "byteStride": 12
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 396,
+      "byteLength": 252,
+      "target": 34962,
+      "byteStride": 12
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 648,
+      "byteLength": 168,
+      "target": 34962,
+      "byteStride": 8
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 816,
+      "byteLength": 252,
+      "target": 34962,
+      "byteStride": 12
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1068,
+      "byteLength": 48,
+      "target": 34963
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1116,
+      "byteLength": 108,
+      "target": 34962,
+      "byteStride": 12
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1224,
+      "byteLength": 108,
+      "target": 34962,
+      "byteStride": 12
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1332,
+      "byteLength": 72,
+      "target": 34962,
+      "byteStride": 8
+    },
+    {
+      "buffer": 0,
+      "byteOffset": 1404,
+      "byteLength": 108,
+      "target": 34962,
+      "byteStride": 12
+    }
+  ],
+  "buffers": [
+    {
+      "name": "MorphPrimitivesTest",
+      "byteLength": 1512,
+      "uri": "MorphPrimitivesTest.bin"
+    }
+  ],
+  "images": [
+    {
+      "name": "uv_texture.jpg",
+      "mimeType": "image/jpeg",
+      "uri": "uv_texture.jpg"
+    }
+  ],
+  "materials": [
+    {
+      "pbrMetallicRoughness": {
+        "baseColorFactor": [
+          1,
+          0,
+          0,
+          1
+        ],
+        "baseColorTexture": {
+          "index": 0,
+          "texCoord": 0
+        },
+        "metallicFactor": 0,
+        "roughnessFactor": 1
+      },
+      "name": "red",
+      "emissiveFactor": [
+        0,
+        0,
+        0
+      ],
+      "alphaMode": "OPAQUE",
+      "doubleSided": false
+    },
+    {
+      "pbrMetallicRoughness": {
+        "baseColorFactor": [
+          0,
+          1,
+          0,
+          1
+        ],
+        "baseColorTexture": {
+          "index": 0,
+          "texCoord": 0
+        },
+        "metallicFactor": 0,
+        "roughnessFactor": 1
+      },
+      "name": "green",
+      "emissiveFactor": [
+        0,
+        0,
+        0
+      ],
+      "alphaMode": "OPAQUE",
+      "doubleSided": false
+    }
+  ],
+  "meshes": [
+    {
+      "weights": [
+        0.5
+      ],
+      "name": "mesh",
+      "primitives": [
+        {
+          "attributes": {
+            "NORMAL": 1,
+            "POSITION": 2,
+            "TEXCOORD_0": 3
+          },
+          "indices": 0,
+          "material": 0,
+          "targets": [
+            {
+              "POSITION": 4
+            }
+          ],
+          "mode": 4
+        },
+        {
+          "attributes": {
+            "POSITION": 7,
+            "NORMAL": 6,
+            "TEXCOORD_0": 8
+          },
+          "indices": 5,
+          "material": 1,
+          "targets": [
+            {
+              "POSITION": 9
+            }
+          ],
+          "mode": 4
+        }
+      ]
+    }
+  ],
+  "nodes": [
+    {
+      "children": [
+        1
+      ],
+      "name": "ルートパート"
+    },
+    {
+      "mesh": 0,
+      "name": "mesh"
+    }
+  ],
+  "samplers": [
+    {
+      "minFilter": 9729,
+      "wrapS": 10497,
+      "wrapT": 10497
+    }
+  ],
+  "scenes": [
+    {
+      "nodes": [
+        0
+      ],
+      "name": "Scene"
+    }
+  ],
+  "textures": [
+    {
+      "sampler": 0,
+      "source": 0
+    }
+  ],
+  "scene": 0
+}

BIN
test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg


+ 15 - 0
test/models/glTF2/MorphStressTest/LICENSE.md

@@ -0,0 +1,15 @@
+# LICENSE file for the model: Morph Stress Test
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+  * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+  * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata

+ 62 - 0
test/models/glTF2/MorphStressTest/README.body.md

@@ -0,0 +1,62 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot_large.png)
+
+## Description
+
+This model has a base mesh, plus eight morph targets.  The base and each of the morph targets has
+both a POSITION and a NORMAL accessor, resulting in no less than 18 vertex attributes being requested
+by a typical implementation.  This number can be too high for many realtime graphics systems, and
+the client runtime may take steps to limit the overall number of morph targets and/or limit the
+number of active morph targets.
+
+As such, this model is not expected to render correctly everywhere.  Instead, it pushes the limits
+to see how many morph targets can move at once before problems become apparent.
+
+## Animations
+
+Three animations are included:
+
+---
+### "Individuals"
+
+![Individuals animation](screenshot/Anim_Individuals.gif)
+
+Each morph target is exercised one at a time, and returns to zero strength before the next one
+starts to move.  This offers runtimes the best chance of success, as vertex attributes need only
+be allocated for one morph target at a time.  Even so, systems that pre-allocate morph target
+attributes may place an upper limit here, allowing only some of the test blocks to move.
+
+---
+### "TheWave"
+
+![Wave animation](screenshot/Anim_TheWave.gif)
+
+This animation tests a wave of morph targets being activated simultaneously.  This does require
+a high number of vertex attributes to be available.  If glitches in movement are observed,
+continue on to the "Pulse" animation for closer inspection.
+
+---
+### "Pulse"
+
+![Pulse animation](screenshot/Anim_Pulse.gif)
+
+This is the most stressful test, with all 8 morph targets reaching full strength before any
+begin to subside.  Some runtimes may place limits on how many morph targets can be active at
+once, resulting in a distinctive visual pattern here:  Only the first N test blocks will
+appear to move, where N is the number of simultaneous active morph targets allowed.  Test
+blocks on the right will remain frozen in the starting position until the first few blocks
+on the left have returned to rest.  After the blocks on the left have returned to rest, they
+could relinquish their vertex attributes to blocks on the right, allowing those blocks to
+"catch up" to their assigned positions in the animation.
+
+It is also possible that there could be a hard limit on the number of morph targets, regardless
+of whether they are active or not.  In this case, only the first N blocks will move at all,
+and the remainder will be frozen the entire time.
+
+---
+## Implementation Notes
+
+BabylonJS has shared some technical details of their "Infinite Morph Targets" implementation
+in [this YouTube video](https://www.youtube.com/watch?v=LBPRmGgU0PE).
+

+ 87 - 0
test/models/glTF2/MorphStressTest/README.md

@@ -0,0 +1,87 @@
+# Morph Stress Test
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+Tests up to 8 morph targets.
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphStressTest/glTF-Binary/MorphStressTest.glb) in SampleViewer
+* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphStressTest/glTF-Binary/MorphStressTest.glb)
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot_large.png)
+
+## Description
+
+This model has a base mesh, plus eight morph targets.  The base and each of the morph targets has
+both a POSITION and a NORMAL accessor, resulting in no less than 18 vertex attributes being requested
+by a typical implementation.  This number can be too high for many realtime graphics systems, and
+the client runtime may take steps to limit the overall number of morph targets and/or limit the
+number of active morph targets.
+
+As such, this model is not expected to render correctly everywhere.  Instead, it pushes the limits
+to see how many morph targets can move at once before problems become apparent.
+
+## Animations
+
+Three animations are included:
+
+---
+### "Individuals"
+
+![Individuals animation](screenshot/Anim_Individuals.gif)
+
+Each morph target is exercised one at a time, and returns to zero strength before the next one
+starts to move.  This offers runtimes the best chance of success, as vertex attributes need only
+be allocated for one morph target at a time.  Even so, systems that pre-allocate morph target
+attributes may place an upper limit here, allowing only some of the test blocks to move.
+
+---
+### "TheWave"
+
+![Wave animation](screenshot/Anim_TheWave.gif)
+
+This animation tests a wave of morph targets being activated simultaneously.  This does require
+a high number of vertex attributes to be available.  If glitches in movement are observed,
+continue on to the "Pulse" animation for closer inspection.
+
+---
+### "Pulse"
+
+![Pulse animation](screenshot/Anim_Pulse.gif)
+
+This is the most stressful test, with all 8 morph targets reaching full strength before any
+begin to subside.  Some runtimes may place limits on how many morph targets can be active at
+once, resulting in a distinctive visual pattern here:  Only the first N test blocks will
+appear to move, where N is the number of simultaneous active morph targets allowed.  Test
+blocks on the right will remain frozen in the starting position until the first few blocks
+on the left have returned to rest.  After the blocks on the left have returned to rest, they
+could relinquish their vertex attributes to blocks on the right, allowing those blocks to
+"catch up" to their assigned positions in the animation.
+
+It is also possible that there could be a hard limit on the number of morph targets, regardless
+of whether they are active or not.  In this case, only the first N blocks will move at all,
+and the remainder will be frozen the entire time.
+
+---
+## Implementation Notes
+
+BabylonJS has shared some technical details of their "Infinite Morph Targets" implementation
+in [this YouTube video](https://www.youtube.com/watch?v=LBPRmGgU0PE).
+
+
+
+## Legal
+
+&copy; 2021, Analytical Graphics, Inc.. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode)
+
+ - Ed Mackey for Everything
+
+#### Assembled by modelmetadata

BIN
test/models/glTF2/MorphStressTest/glTF/Base_AO.png


BIN
test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png


BIN
test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin


+ 999 - 0
test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf

@@ -0,0 +1,999 @@
+{
+    "asset" : {
+        "copyright" : "CC-BY 4.0 Copyright 2021 Analytical Graphics, Inc. Model and Textures by Ed Mackey.",
+        "generator" : "Khronos glTF Blender I/O v1.5.13",
+        "version" : "2.0"
+    },
+    "scene" : 0,
+    "scenes" : [
+        {
+            "name" : "Scene",
+            "nodes" : [
+                0
+            ]
+        }
+    ],
+    "nodes" : [
+        {
+            "mesh" : 0,
+            "name" : "Main"
+        }
+    ],
+    "animations" : [
+        {
+            "channels" : [
+                {
+                    "sampler" : 0,
+                    "target" : {
+                        "node" : 0,
+                        "path" : "weights"
+                    }
+                }
+            ],
+            "name" : "Individuals",
+            "samplers" : [
+                {
+                    "input" : 42,
+                    "interpolation" : "LINEAR",
+                    "output" : 43
+                }
+            ]
+        },
+        {
+            "channels" : [
+                {
+                    "sampler" : 0,
+                    "target" : {
+                        "node" : 0,
+                        "path" : "weights"
+                    }
+                }
+            ],
+            "name" : "TheWave",
+            "samplers" : [
+                {
+                    "input" : 44,
+                    "interpolation" : "LINEAR",
+                    "output" : 45
+                }
+            ]
+        },
+        {
+            "channels" : [
+                {
+                    "sampler" : 0,
+                    "target" : {
+                        "node" : 0,
+                        "path" : "weights"
+                    }
+                }
+            ],
+            "name" : "Pulse",
+            "samplers" : [
+                {
+                    "input" : 46,
+                    "interpolation" : "LINEAR",
+                    "output" : 47
+                }
+            ]
+        }
+    ],
+    "materials" : [
+        {
+            "doubleSided" : true,
+            "name" : "Base",
+            "occlusionTexture" : {
+                "index" : 0,
+                "texCoord" : 1
+            },
+            "pbrMetallicRoughness" : {
+                "baseColorTexture" : {
+                    "index" : 1
+                },
+                "metallicFactor" : 0,
+                "roughnessFactor" : 0.4000000059604645
+            }
+        },
+        {
+            "doubleSided" : true,
+            "name" : "TestMaterial",
+            "pbrMetallicRoughness" : {
+                "baseColorTexture" : {
+                    "index" : 2
+                },
+                "metallicFactor" : 0,
+                "roughnessFactor" : 0.5
+            }
+        }
+    ],
+    "meshes" : [
+        {
+            "extras" : {
+                "targetNames" : [
+                    "Key 1",
+                    "Key 2",
+                    "Key 3",
+                    "Key 4",
+                    "Key 5",
+                    "Key 6",
+                    "Key 7",
+                    "Key 8"
+                ]
+            },
+            "name" : "Cube",
+            "primitives" : [
+                {
+                    "attributes" : {
+                        "POSITION" : 0,
+                        "NORMAL" : 1,
+                        "TEXCOORD_0" : 2,
+                        "TEXCOORD_1" : 3
+                    },
+                    "indices" : 4,
+                    "material" : 0,
+                    "targets" : [
+                        {
+                            "POSITION" : 5,
+                            "NORMAL" : 6
+                        },
+                        {
+                            "POSITION" : 7,
+                            "NORMAL" : 8
+                        },
+                        {
+                            "POSITION" : 9,
+                            "NORMAL" : 10
+                        },
+                        {
+                            "POSITION" : 11,
+                            "NORMAL" : 12
+                        },
+                        {
+                            "POSITION" : 13,
+                            "NORMAL" : 14
+                        },
+                        {
+                            "POSITION" : 15,
+                            "NORMAL" : 16
+                        },
+                        {
+                            "POSITION" : 17,
+                            "NORMAL" : 18
+                        },
+                        {
+                            "POSITION" : 19,
+                            "NORMAL" : 20
+                        }
+                    ]
+                },
+                {
+                    "attributes" : {
+                        "POSITION" : 21,
+                        "NORMAL" : 22,
+                        "TEXCOORD_0" : 23,
+                        "TEXCOORD_1" : 24
+                    },
+                    "indices" : 25,
+                    "material" : 1,
+                    "targets" : [
+                        {
+                            "POSITION" : 26,
+                            "NORMAL" : 27
+                        },
+                        {
+                            "POSITION" : 28,
+                            "NORMAL" : 29
+                        },
+                        {
+                            "POSITION" : 30,
+                            "NORMAL" : 31
+                        },
+                        {
+                            "POSITION" : 32,
+                            "NORMAL" : 33
+                        },
+                        {
+                            "POSITION" : 34,
+                            "NORMAL" : 35
+                        },
+                        {
+                            "POSITION" : 36,
+                            "NORMAL" : 37
+                        },
+                        {
+                            "POSITION" : 38,
+                            "NORMAL" : 39
+                        },
+                        {
+                            "POSITION" : 40,
+                            "NORMAL" : 41
+                        }
+                    ]
+                }
+            ],
+            "weights" : [
+                0,
+                0,
+                0,
+                0,
+                0,
+                0,
+                0,
+                0
+            ]
+        }
+    ],
+    "textures" : [
+        {
+            "sampler" : 0,
+            "source" : 0
+        },
+        {
+            "sampler" : 0,
+            "source" : 1
+        },
+        {
+            "sampler" : 0,
+            "source" : 2
+        }
+    ],
+    "images" : [
+        {
+            "mimeType" : "image/png",
+            "name" : "Base_AO",
+            "uri" : "Base_AO.png"
+        },
+        {
+            "mimeType" : "image/png",
+            "name" : "TinyGrid",
+            "uri" : "TinyGrid.png"
+        },
+        {
+            "mimeType" : "image/png",
+            "name" : "ColorSwatches",
+            "uri" : "ColorSwatches.png"
+        }
+    ],
+    "accessors" : [
+        {
+            "bufferView" : 0,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                2,
+                0,
+                0.5
+            ],
+            "min" : [
+                -2,
+                -0.10000002384185791,
+                -0.5
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 1,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 2,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC2"
+        },
+        {
+            "bufferView" : 3,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC2"
+        },
+        {
+            "bufferView" : 4,
+            "componentType" : 5123,
+            "count" : 36,
+            "type" : "SCALAR"
+        },
+        {
+            "bufferView" : 5,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 6,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 7,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 8,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 9,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 10,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 11,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 12,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 13,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 14,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 15,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 16,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 17,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 18,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 19,
+            "componentType" : 5126,
+            "count" : 24,
+            "max" : [
+                0,
+                0,
+                0
+            ],
+            "min" : [
+                0,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 20,
+            "componentType" : 5126,
+            "count" : 24,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 21,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                1.875,
+                0.5,
+                0.25
+            ],
+            "min" : [
+                -1.875,
+                0,
+                -0.25
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 22,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 23,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC2"
+        },
+        {
+            "bufferView" : 24,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC2"
+        },
+        {
+            "bufferView" : 25,
+            "componentType" : 5123,
+            "count" : 7200,
+            "type" : "SCALAR"
+        },
+        {
+            "bufferView" : 26,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.04999995231628418,
+                1,
+                0
+            ],
+            "min" : [
+                -0.04999995231628418,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 27,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 28,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.04999995231628418,
+                1,
+                0
+            ],
+            "min" : [
+                -0.04999995231628418,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 29,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 30,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.050000011920928955,
+                1,
+                0
+            ],
+            "min" : [
+                -0.050000011920928955,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 31,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 32,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.050000011920928955,
+                1,
+                0
+            ],
+            "min" : [
+                -0.04999999701976776,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 33,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 34,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.04999999701976776,
+                1,
+                0
+            ],
+            "min" : [
+                -0.050000011920928955,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 35,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 36,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.050000011920928955,
+                1,
+                0
+            ],
+            "min" : [
+                -0.050000011920928955,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 37,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 38,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.04999995231628418,
+                1,
+                0
+            ],
+            "min" : [
+                -0.04999995231628418,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 39,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 40,
+            "componentType" : 5126,
+            "count" : 1504,
+            "max" : [
+                0.04999995231628418,
+                1,
+                0
+            ],
+            "min" : [
+                -0.04999995231628418,
+                0,
+                0
+            ],
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 41,
+            "componentType" : 5126,
+            "count" : 1504,
+            "type" : "VEC3"
+        },
+        {
+            "bufferView" : 42,
+            "componentType" : 5126,
+            "count" : 281,
+            "max" : [
+                9.366666666666667
+            ],
+            "min" : [
+                0.03333333333333333
+            ],
+            "type" : "SCALAR"
+        },
+        {
+            "bufferView" : 43,
+            "componentType" : 5126,
+            "count" : 2248,
+            "type" : "SCALAR"
+        },
+        {
+            "bufferView" : 44,
+            "componentType" : 5126,
+            "count" : 59,
+            "max" : [
+                1.9666666666666666
+            ],
+            "min" : [
+                0.03333333333333333
+            ],
+            "type" : "SCALAR"
+        },
+        {
+            "bufferView" : 45,
+            "componentType" : 5126,
+            "count" : 472,
+            "type" : "SCALAR"
+        },
+        {
+            "bufferView" : 46,
+            "componentType" : 5126,
+            "count" : 191,
+            "max" : [
+                6.366666666666666
+            ],
+            "min" : [
+                0.03333333333333333
+            ],
+            "type" : "SCALAR"
+        },
+        {
+            "bufferView" : 47,
+            "componentType" : 5126,
+            "count" : 1528,
+            "type" : "SCALAR"
+        }
+    ],
+    "bufferViews" : [
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 0
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 288
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 192,
+            "byteOffset" : 576
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 192,
+            "byteOffset" : 768
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 72,
+            "byteOffset" : 960
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 1032
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 1320
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 1608
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 1896
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 2184
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 2472
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 2760
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 3048
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 3336
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 3624
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 3912
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 4200
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 4488
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 4776
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 5064
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 288,
+            "byteOffset" : 5352
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 5640
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 23688
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 12032,
+            "byteOffset" : 41736
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 12032,
+            "byteOffset" : 53768
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 14400,
+            "byteOffset" : 65800
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 80200
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 98248
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 116296
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 134344
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 152392
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 170440
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 188488
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 206536
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 224584
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 242632
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 260680
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 278728
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 296776
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 314824
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 332872
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 18048,
+            "byteOffset" : 350920
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 1124,
+            "byteOffset" : 368968
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 8992,
+            "byteOffset" : 370092
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 236,
+            "byteOffset" : 379084
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 1888,
+            "byteOffset" : 379320
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 764,
+            "byteOffset" : 381208
+        },
+        {
+            "buffer" : 0,
+            "byteLength" : 6112,
+            "byteOffset" : 381972
+        }
+    ],
+    "samplers" : [
+        {
+            "magFilter" : 9729,
+            "minFilter" : 9987
+        }
+    ],
+    "buffers" : [
+        {
+            "byteLength" : 388084,
+            "uri" : "MorphStressTest.bin"
+        }
+    ]
+}

BIN
test/models/glTF2/MorphStressTest/glTF/TinyGrid.png


+ 15 - 0
test/models/glTF2/SimpleMorph/LICENSE.md

@@ -0,0 +1,15 @@
+# LICENSE file for the model: Simple Morph
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+  * [CC0 1.0 Universal]("https://creativecommons.org/publicdomain/zero/1.0/legalcode") [SPDX license identifier: "CC0-1.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+  * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata

+ 17 - 0
test/models/glTF2/SimpleMorph/README.body.md

@@ -0,0 +1,17 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot.png)
+
+## Notes
+
+This is an example of a glTF asset that uses morph targets, as described in the
+[Simple Morph Target](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.md)
+section of the glTF tutorial.
+
+## Data layout
+
+The following image shows the data layout of this sample:
+
+![simpleMorphStructure](screenshot/simpleMorphStructure.png)
+
+

+ 41 - 0
test/models/glTF2/SimpleMorph/README.md

@@ -0,0 +1,41 @@
+# Simple Morph
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+A triangle with a morph animation applied
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/SimpleMorph/glTF/SimpleMorph.gltf) in SampleViewer
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.png)
+
+## Notes
+
+This is an example of a glTF asset that uses morph targets, as described in the
+[Simple Morph Target](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.md)
+section of the glTF tutorial.
+
+## Data layout
+
+The following image shows the data layout of this sample:
+
+![simpleMorphStructure](screenshot/simpleMorphStructure.png)
+
+
+
+
+## Legal
+
+&copy; 2017, Public. [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/legalcode)
+
+ - javagl for Everything
+
+#### Assembled by modelmetadata

+ 189 - 0
test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf

@@ -0,0 +1,189 @@
+{
+  "scene" : 0,
+  "scenes":[
+    {
+      "nodes":[
+        0
+      ]
+    }
+  ],
+  "nodes":[
+    {
+      "mesh":0
+    }
+  ],
+  "meshes":[
+    {
+      "primitives":[
+        {
+          "attributes":{
+            "POSITION":1
+          },
+          "targets":[
+            {
+              "POSITION":2
+            },
+            {
+              "POSITION":3
+            }
+          ],
+          "indices":0
+        }
+      ],
+      "weights":[
+        0.5,
+        0.5
+      ]
+    }
+  ],
+  "animations":[
+    {
+      "samplers":[
+        {
+          "input":4,
+          "interpolation":"LINEAR",
+          "output":5
+        }
+      ],
+      "channels":[
+        {
+          "sampler":0,
+          "target":{
+            "node":0,
+            "path":"weights"
+          }
+        }
+      ]
+    }
+  ],
+  "buffers":[
+    {
+      "uri" : "simpleMorphGeometry.bin",
+      "byteLength":116
+    },
+    {
+      "uri" : "simpleMorphAnimation.bin",
+      "byteLength":60
+    }
+  ],
+  "bufferViews":[
+    {
+      "buffer":0,
+      "byteOffset":0,
+      "byteLength":6,
+      "target":34963
+    },
+    {
+      "buffer":0,
+      "byteOffset":8,
+      "byteLength":108,
+      "byteStride":12,
+      "target":34962
+    },
+    {
+      "buffer":1,
+      "byteOffset":0,
+      "byteLength":20
+    },
+    {
+      "buffer":1,
+      "byteOffset":20,
+      "byteLength":40
+    }
+  ],
+  "accessors":[
+    {
+      "bufferView":0,
+      "byteOffset":0,
+      "componentType":5123,
+      "count":3,
+      "type":"SCALAR",
+      "max":[
+        2
+      ],
+      "min":[
+        0
+      ]
+    },
+    {
+      "bufferView":1,
+      "byteOffset":0,
+      "componentType":5126,
+      "count":3,
+      "type":"VEC3",
+      "max":[
+        1.0,
+        0.5,
+        0.0
+      ],
+      "min":[
+        0.0,
+        0.0,
+        0.0
+      ]
+    },
+    {
+      "bufferView":1,
+      "byteOffset":36,
+      "componentType":5126,
+      "count":3,
+      "type":"VEC3",
+      "max":[
+        0.0,
+        1.0,
+        0.0
+      ],
+      "min":[
+        -1.0,
+        0.0,
+        0.0
+      ]
+    },
+    {
+      "bufferView":1,
+      "byteOffset":72,
+      "componentType":5126,
+      "count":3,
+      "type":"VEC3",
+      "max":[
+        1.0,
+        1.0,
+        0.0
+      ],
+      "min":[
+        0.0,
+        0.0,
+        0.0
+      ]
+    },
+    {
+      "bufferView":2,
+      "byteOffset":0,
+      "componentType":5126,
+      "count":5,
+      "type":"SCALAR",
+      "max":[
+        4.0
+      ],
+      "min":[
+        0.0
+      ]
+    },
+    {
+      "bufferView":3,
+      "byteOffset":0,
+      "componentType":5126,
+      "count":10,
+      "type":"SCALAR",
+      "max":[
+        1.0
+      ],
+      "min":[
+        0.0
+      ]
+    }
+  ],
+  "asset":{
+    "version":"2.0"
+  }
+}

BIN
test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin


BIN
test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin


+ 16 - 0
test/models/glTF2/ref/README.md

@@ -0,0 +1,16 @@
+# glTF 3D model reference images
+
+## AnimatedMorphCube
+<img alt="AnimatedMorphCube" src="screenshots/AnimatedMorphCube.gif" width=180 />
+
+## AnimatedMorphSphere
+<img alt="AnimatedMorphSphere" src="screenshots/AnimatedMorphSphere.gif" width=180 />
+
+## MorphPrimitivesTest
+<img alt="MorphPrimitivesTest" src="screenshots/MorphPrimitivesTest.gif" width=180 />
+
+## MorphStressTest
+<img alt="MorphStressTest" src="screenshots/MorphStressTest_cycle_animations.gif" width=180 />
+
+## SimpleMorph
+<img alt="SimpleMorph" src="screenshots/SimpleMorph.gif" width=180 />

BIN
test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif


BIN
test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif


BIN
test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif


BIN
test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif


BIN
test/models/glTF2/ref/screenshots/SimpleMorph.gif


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác