new stuff

This commit is contained in:
Tarion 2026-07-03 03:41:25 +02:00
parent 8998bc3936
commit 64c8492e5c
No known key found for this signature in database
6907 changed files with 3401899 additions and 0 deletions

View file

@ -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

View file

@ -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).

View file

@ -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
© 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
assimp/test/models/glTF2/MorphStressTest/glTF/Base_AO.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

View file

@ -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
assimp/test/models/glTF2/MorphStressTest/glTF/TinyGrid.png (Stored with Git LFS) Normal file

Binary file not shown.