Merge master into feature/release-aur
@@ -19,7 +19,7 @@ The UI is available in English (default) and Nederlands. **Settings** (on the st
19
19
20
20
## Project and bodies
21
21
22
The start screen offers **Load project** and **New project**, both with a system file picker. New project asks for a parent folder (**Choose folder…**) and a project name, and creates `<folder>/<name>/`. The name must not be empty, must not contain `/ \ < > : " | ? *` or control characters and must not end with a dot; if the folder already exists it must be empty. Errors are shown in the form and nothing is created. The new folder receives `character.ppd` (with that name) and the folders `assets/body/`, `assets/equipment/`, `presets/`, `cache/` and `renders/`. The bundled default bodies (see *Attribution*) are copied into `assets/body/male/` and `assets/body/female/`, each with its `license.txt`, and set as the male and female body, so the project renders immediately. (`--preview-fixture` and the tests use the small CC0 test bodies instead.) Below the buttons the last 5 opened or created projects are listed (**Recently opened**); click a name to open it. A project that no longer exists is greyed out with *not found*. The list is `recent.json` in the user config directory (`$XDG_CONFIG_HOME/paperdoll-renderer/`, by default `~/.config/paperdoll-renderer/`, on Windows `%APPDATA%\paperdoll-renderer\`; override with `PAPERDOLL_CONFIG_DIR`). `--preview-fixture` creates a temporary sample project and opens the male body.
22
The start screen offers **Load project** and **New project**, both with a system file picker. New project asks for a parent folder (**Choose folder…**) and a project name, and creates `<folder>/<name>/`. The name must not be empty, must not contain `/ \ < > : " | ? *` or control characters and must not end with a dot; if the folder already exists it must be empty. Errors are shown in the form and nothing is created. The new folder receives `character.ppd` (with that name) and the folders `assets/body/`, `assets/equipment/`, `presets/`, `cache/` and `renders/`. The bundled default bodies (see *Attribution*) are copied into `assets/body/male/` and `assets/body/female/`, each with its `license.txt`, and set as the male and female body, so the project renders immediately. The equipment list also gets the female-only hair preset `presets/female-hair.ppe`. (`--preview-fixture` and the tests use the small CC0 test bodies instead.) Below the buttons the last 5 opened or created projects are listed (**Recently opened**); click a name to open it. A project that no longer exists is greyed out with *not found*. The list is `recent.json` in the user config directory (`$XDG_CONFIG_HOME/paperdoll-renderer/`, by default `~/.config/paperdoll-renderer/`, on Windows `%APPDATA%\paperdoll-renderer\`; override with `PAPERDOLL_CONFIG_DIR`). `--preview-fixture` creates a temporary sample project and opens the male body.
23
23
24
24
The first project view shows the bodies. **Choose male / Choose female** selects a model. An external file is copied into the project folder; if the name exists the copy gets its own name. Models with side files can be placed in the project folder with their relative folder structure and selected there. **Import overview** lists meshes, materials, textures, joints and clips of glTF/GLB, FBX and OBJ+MTL. FBX bodies are normalized once on load (right-handed Y-up, meters) and then drawn like glTF/GLB in the live 3D preview and production render, with all their animation stacks as clips.
25
25
@@ -36,7 +36,7 @@ The first project view shows the bodies. **Choose male / Choose female** selects
36
36
37
37
### Multiple meshes and skins (glTF/GLB)
38
38
39
A skinned glTF/GLB body is loaded completely: all mesh nodes and all skins. The joints of all skins are merged into one skeleton (joints present in several skins count once; at most 128). A mesh node without a skin moves rigidly with the nearest ancestor that is a joint; if it has none, it hangs from the first joint. Its rest position in the scene is kept exactly (mirrored transforms flip the triangle winding). Materials stay per primitive: base color factor × albedo texture, alpha cutoff and vertex colors; every primitive uses its own material, in the live preview and in production. External image files (`uri` next to the `.gltf`) are resolved relative to the model, like embedded and `data:` images. `KHR_texture_transform` on the base color texture (offset, rotation, scale and `texCoord`) is applied once to the UVs on load. The sampler wrap mode is not read: textures are always sampled nearest with REPEAT, so CLAMP/MIRROR look different outside the 0–1 UV range. `KHR_materials_specular` feeds the body's specular map per primitive: `specularFactor` × the alpha of `specularTexture` (sampled with the base-colour UVs; `specularColor*` is not used); in the live preview it drives the highlight. Without the extension a body's specular is zero. Metallic/roughness, normal, occlusion and emissive textures and morph targets are not used; the normal map comes from geometry (metallic/roughness is not converted; a scalar specular cannot reproduce PBR physically).
39
A skinned glTF/GLB body is loaded completely: all mesh nodes and all skins. The joints of all skins are merged into one skeleton (joints present in several skins count once; at most 128). A mesh node without a skin moves rigidly with the nearest ancestor that is a joint; if it has none, it hangs from the first joint. Its rest position in the scene is kept exactly (mirrored transforms flip the triangle winding). Materials stay per primitive: base color factor × albedo texture, alpha cutoff and vertex colors; every primitive uses its own material, in the live preview and in production. Materials with `alphaMode` `BLEND` (eyes' cornea, eyelashes, hair cards) are drawn after the opaque ones and alpha-blended over them, without writing depth until a final depth-only pass; blending between overlapping BLEND layers follows file order (no sorting). External image files (`uri` next to the `.gltf`) are resolved relative to the model, like embedded and `data:` images. `KHR_texture_transform` on the base color texture (offset, rotation, scale and `texCoord`) is applied once to the UVs on load. The sampler wrap mode is not read: textures are always sampled nearest with REPEAT, so CLAMP/MIRROR look different outside the 0–1 UV range. `KHR_materials_specular` feeds the body's specular map per primitive: `specularFactor` × the alpha of `specularTexture` (sampled with the base-colour UVs; `specularColor*` is not used); in the live preview it drives the highlight. Without the extension a body's specular is zero. Metallic/roughness, normal, occlusion and emissive textures and morph targets are not used; the normal map comes from geometry (metallic/roughness is not converted; a scalar specular cannot reproduce PBR physically).
40
40
41
41
### Static bodies (OBJ, glTF/FBX without skin)
42
42
@@ -208,7 +208,7 @@ The default starter bodies are third-party assets, bundled in `assets/default-bo
208
208
- **Animated walking Male Base Mesh** by assetfactory — https://sketchfab.com/3d-models/animated-walking-male-base-mesh-cf6fd4382d7745468328115b49223d90 — Sketchfab Standard licence.
209
209
- **Animated Female Base Mesh** by assetfactory — https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec — Sketchfab Standard licence.
210
210
211
Details are in `THIRD_PARTY_NOTICES.md`, which every package ships next to the licence. The synthetic test bodies in `tests/fixtures/bodies/` are CC0.
211
The bundled female has its hair removed (and one stray one-key animation); the hair is the bundled female-only equipment preset `female-hair`, rigid on the head joint. Details are in `THIRD_PARTY_NOTICES.md`, which every package ships next to the licence. The synthetic test bodies in `tests/fixtures/bodies/` are CC0.
212
212
213
213
## Tests
214
214
@@ -19,7 +19,7 @@ The UI is available in English (default) and Nederlands. **Settings** (on the st19
19
20
## Project and bodies20
## Project and bodies21
21
22
The start screen offers **Load project** and **New project**, both with a system file picker. New project asks for a parent folder (**Choose folder…**) and a project name, and creates `<folder>/<name>/`. The name must not be empty, must not contain `/ \ < > : " | ? *` or control characters and must not end with a dot; if the folder already exists it must be empty. Errors are shown in the form and nothing is created. The new folder receives `character.ppd` (with that name) and the folders `assets/body/`, `assets/equipment/`, `presets/`, `cache/` and `renders/`. The bundled default bodies (see *Attribution*) are copied into `assets/body/male/` and `assets/body/female/`, each with its `license.txt`, and set as the male and female body, so the project renders immediately. (`--preview-fixture` and the tests use the small CC0 test bodies instead.) Below the buttons the last 5 opened or created projects are listed (**Recently opened**); click a name to open it. A project that no longer exists is greyed out with *not found*. The list is `recent.json` in the user config directory (`$XDG_CONFIG_HOME/paperdoll-renderer/`, by default `~/.config/paperdoll-renderer/`, on Windows `%APPDATA%\paperdoll-renderer\`; override with `PAPERDOLL_CONFIG_DIR`). `--preview-fixture` creates a temporary sample project and opens the male body.22
The start screen offers **Load project** and **New project**, both with a system file picker. New project asks for a parent folder (**Choose folder…**) and a project name, and creates `<folder>/<name>/`. The name must not be empty, must not contain `/ \ < > : " | ? *` or control characters and must not end with a dot; if the folder already exists it must be empty. Errors are shown in the form and nothing is created. The new folder receives `character.ppd` (with that name) and the folders `assets/body/`, `assets/equipment/`, `presets/`, `cache/` and `renders/`. The bundled default bodies (see *Attribution*) are copied into `assets/body/male/` and `assets/body/female/`, each with its `license.txt`, and set as the male and female body, so the project renders immediately. The equipment list also gets the female-only hair preset `presets/female-hair.ppe`. (`--preview-fixture` and the tests use the small CC0 test bodies instead.) Below the buttons the last 5 opened or created projects are listed (**Recently opened**); click a name to open it. A project that no longer exists is greyed out with *not found*. The list is `recent.json` in the user config directory (`$XDG_CONFIG_HOME/paperdoll-renderer/`, by default `~/.config/paperdoll-renderer/`, on Windows `%APPDATA%\paperdoll-renderer\`; override with `PAPERDOLL_CONFIG_DIR`). `--preview-fixture` creates a temporary sample project and opens the male body.23
23
24
The first project view shows the bodies. **Choose male / Choose female** selects a model. An external file is copied into the project folder; if the name exists the copy gets its own name. Models with side files can be placed in the project folder with their relative folder structure and selected there. **Import overview** lists meshes, materials, textures, joints and clips of glTF/GLB, FBX and OBJ+MTL. FBX bodies are normalized once on load (right-handed Y-up, meters) and then drawn like glTF/GLB in the live 3D preview and production render, with all their animation stacks as clips.24
The first project view shows the bodies. **Choose male / Choose female** selects a model. An external file is copied into the project folder; if the name exists the copy gets its own name. Models with side files can be placed in the project folder with their relative folder structure and selected there. **Import overview** lists meshes, materials, textures, joints and clips of glTF/GLB, FBX and OBJ+MTL. FBX bodies are normalized once on load (right-handed Y-up, meters) and then drawn like glTF/GLB in the live 3D preview and production render, with all their animation stacks as clips.25
25
@@ -36,7 +36,7 @@ The first project view shows the bodies. **Choose male / Choose female** selects36
36
37
### Multiple meshes and skins (glTF/GLB)37
### Multiple meshes and skins (glTF/GLB)38
38
39
A skinned glTF/GLB body is loaded completely: all mesh nodes and all skins. The joints of all skins are merged into one skeleton (joints present in several skins count once; at most 128). A mesh node without a skin moves rigidly with the nearest ancestor that is a joint; if it has none, it hangs from the first joint. Its rest position in the scene is kept exactly (mirrored transforms flip the triangle winding). Materials stay per primitive: base color factor × albedo texture, alpha cutoff and vertex colors; every primitive uses its own material, in the live preview and in production. External image files (`uri` next to the `.gltf`) are resolved relative to the model, like embedded and `data:` images. `KHR_texture_transform` on the base color texture (offset, rotation, scale and `texCoord`) is applied once to the UVs on load. The sampler wrap mode is not read: textures are always sampled nearest with REPEAT, so CLAMP/MIRROR look different outside the 0–1 UV range. `KHR_materials_specular` feeds the body's specular map per primitive: `specularFactor` × the alpha of `specularTexture` (sampled with the base-colour UVs; `specularColor*` is not used); in the live preview it drives the highlight. Without the extension a body's specular is zero. Metallic/roughness, normal, occlusion and emissive textures and morph targets are not used; the normal map comes from geometry (metallic/roughness is not converted; a scalar specular cannot reproduce PBR physically).39
A skinned glTF/GLB body is loaded completely: all mesh nodes and all skins. The joints of all skins are merged into one skeleton (joints present in several skins count once; at most 128). A mesh node without a skin moves rigidly with the nearest ancestor that is a joint; if it has none, it hangs from the first joint. Its rest position in the scene is kept exactly (mirrored transforms flip the triangle winding). Materials stay per primitive: base color factor × albedo texture, alpha cutoff and vertex colors; every primitive uses its own material, in the live preview and in production. Materials with `alphaMode` `BLEND` (eyes' cornea, eyelashes, hair cards) are drawn after the opaque ones and alpha-blended over them, without writing depth until a final depth-only pass; blending between overlapping BLEND layers follows file order (no sorting). External image files (`uri` next to the `.gltf`) are resolved relative to the model, like embedded and `data:` images. `KHR_texture_transform` on the base color texture (offset, rotation, scale and `texCoord`) is applied once to the UVs on load. The sampler wrap mode is not read: textures are always sampled nearest with REPEAT, so CLAMP/MIRROR look different outside the 0–1 UV range. `KHR_materials_specular` feeds the body's specular map per primitive: `specularFactor` × the alpha of `specularTexture` (sampled with the base-colour UVs; `specularColor*` is not used); in the live preview it drives the highlight. Without the extension a body's specular is zero. Metallic/roughness, normal, occlusion and emissive textures and morph targets are not used; the normal map comes from geometry (metallic/roughness is not converted; a scalar specular cannot reproduce PBR physically).40
40
41
### Static bodies (OBJ, glTF/FBX without skin)41
### Static bodies (OBJ, glTF/FBX without skin)42
42
@@ -208,7 +208,7 @@ The default starter bodies are third-party assets, bundled in `assets/default-bo208
- **Animated walking Male Base Mesh** by assetfactory — https://sketchfab.com/3d-models/animated-walking-male-base-mesh-cf6fd4382d7745468328115b49223d90 — Sketchfab Standard licence.208
- **Animated walking Male Base Mesh** by assetfactory — https://sketchfab.com/3d-models/animated-walking-male-base-mesh-cf6fd4382d7745468328115b49223d90 — Sketchfab Standard licence.209
- **Animated Female Base Mesh** by assetfactory — https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec — Sketchfab Standard licence.209
- **Animated Female Base Mesh** by assetfactory — https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec — Sketchfab Standard licence.210
210
211
Details are in `THIRD_PARTY_NOTICES.md`, which every package ships next to the licence. The synthetic test bodies in `tests/fixtures/bodies/` are CC0.211
The bundled female has its hair removed (and one stray one-key animation); the hair is the bundled female-only equipment preset `female-hair`, rigid on the head joint. Details are in `THIRD_PARTY_NOTICES.md`, which every package ships next to the licence. The synthetic test bodies in `tests/fixtures/bodies/` are CC0.212
212
213
## Tests213
## Tests214
214
@@ -19,7 +19,10 @@ Their licence was checked and approved by Tim Falken for this use.
19
19
- Source: https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec
20
20
- Licence: Sketchfab Standard (https://sketchfab.com/licenses) — under basic restrictions, use worldwide, on all types of media, commercially or not, and in all types of derivative works.
21
21
22
The only change from the downloaded files is the buffer `uri` in each `.gltf`
23
(`scene.bin` → `male.bin` / `female.bin`), matching the renamed `.bin` files.
22
Changes from the downloaded files:
23
24
- Both: the buffer `uri` in each `.gltf` (`scene.bin` → `male.bin` / `female.bin`), matching the renamed `.bin` files.
25
- Female (`scripts/edit_default_female.py`): the stray animation `FemaleArmature|ponytail01MeshAction.001` (one key that resets the armature rotation, so the body lay on its back) is removed; the hair mesh (material `ponytail01`) with its material and texture is removed so hair can be added as equipment; `female.bin` is compacted accordingly.
26
- The removed hair is the bundled equipment preset `assets/default-equipment/female-hair.ppe` (same author, source and licence; `examples/bake_female_hair.rs`): baked rigid to the `head` joint at the rest pose (it was skinned to several bones), with its original texture.
24
27
25
28
The synthetic test bodies in `tests/fixtures/bodies/` are CC0 (see that folder's `LICENSE`).
@@ -19,7 +19,10 @@ Their licence was checked and approved by Tim Falken for this use.19
- Source: https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec19
- Source: https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec20
- Licence: Sketchfab Standard (https://sketchfab.com/licenses) — under basic restrictions, use worldwide, on all types of media, commercially or not, and in all types of derivative works.20
- Licence: Sketchfab Standard (https://sketchfab.com/licenses) — under basic restrictions, use worldwide, on all types of media, commercially or not, and in all types of derivative works.21
21
22
The only change from the downloaded files is the buffer `uri` in each `.gltf`22
Changes from the downloaded files:23
(`scene.bin` → `male.bin` / `female.bin`), matching the renamed `.bin` files.23
24
- Both: the buffer `uri` in each `.gltf` (`scene.bin` → `male.bin` / `female.bin`), matching the renamed `.bin` files.25
- Female (`scripts/edit_default_female.py`): the stray animation `FemaleArmature|ponytail01MeshAction.001` (one key that resets the armature rotation, so the body lay on its back) is removed; the hair mesh (material `ponytail01`) with its material and texture is removed so hair can be added as equipment; `female.bin` is compacted accordingly.26
- The removed hair is the bundled equipment preset `assets/default-equipment/female-hair.ppe` (same author, source and licence; `examples/bake_female_hair.rs`): baked rigid to the `head` joint at the rest pose (it was skinned to several bones), with its original texture.24
27
25
The synthetic test bodies in `tests/fixtures/bodies/` are CC0 (see that folder's `LICENSE`).28
The synthetic test bodies in `tests/fixtures/bodies/` are CC0 (see that folder's `LICENSE`).The contents of this binary file are not shown.
@@ -1,7 +1,7 @@
1
1
{
2
2
"accessors": [
3
3
{
4
"bufferView": 3,
4
"bufferView": 0,
5
5
"componentType": 5126,
6
6
"count": 124,
7
7
"max": [
@@ -17,8 +17,7 @@
17
17
"type": "VEC3"
18
18
},
19
19
{
20
"bufferView": 3,
21
"byteOffset": 1488,
20
"bufferView": 1,
22
21
"componentType": 5126,
23
22
"count": 124,
24
23
"max": [
@@ -48,14 +47,13 @@
48
47
"type": "VEC2"
49
48
},
50
49
{
51
"bufferView": 1,
50
"bufferView": 3,
52
51
"componentType": 5125,
53
52
"count": 576,
54
53
"type": "SCALAR"
55
54
},
56
55
{
57
"bufferView": 3,
58
"byteOffset": 2976,
56
"bufferView": 4,
59
57
"componentType": 5126,
60
58
"count": 524,
61
59
"max": [
@@ -71,8 +69,7 @@
71
69
"type": "VEC3"
72
70
},
73
71
{
74
"bufferView": 3,
75
"byteOffset": 9264,
72
"bufferView": 5,
76
73
"componentType": 5126,
77
74
"count": 524,
78
75
"max": [
@@ -88,8 +85,7 @@
88
85
"type": "VEC3"
89
86
},
90
87
{
91
"bufferView": 2,
92
"byteOffset": 992,
88
"bufferView": 6,
93
89
"componentType": 5126,
94
90
"count": 524,
95
91
"max": [
@@ -103,15 +99,13 @@
103
99
"type": "VEC2"
104
100
},
105
101
{
106
"bufferView": 1,
107
"byteOffset": 2304,
102
"bufferView": 7,
108
103
"componentType": 5125,
109
104
"count": 2940,
110
105
"type": "SCALAR"
111
106
},
112
107
{
113
"bufferView": 3,
114
"byteOffset": 15552,
108
"bufferView": 8,
115
109
"componentType": 5126,
116
110
"count": 552,
117
111
"max": [
@@ -127,8 +121,7 @@
127
121
"type": "VEC3"
128
122
},
129
123
{
130
"bufferView": 3,
131
"byteOffset": 22176,
124
"bufferView": 9,
132
125
"componentType": 5126,
133
126
"count": 552,
134
127
"max": [
@@ -144,8 +137,7 @@
144
137
"type": "VEC3"
145
138
},
146
139
{
147
"bufferView": 2,
148
"byteOffset": 5184,
140
"bufferView": 10,
149
141
"componentType": 5126,
150
142
"count": 552,
151
143
"max": [
@@ -159,15 +151,13 @@
159
151
"type": "VEC2"
160
152
},
161
153
{
162
"bufferView": 1,
163
"byteOffset": 14064,
154
"bufferView": 11,
164
155
"componentType": 5125,
165
156
"count": 3180,
166
157
"type": "SCALAR"
167
158
},
168
159
{
169
"bufferView": 3,
170
"byteOffset": 28800,
160
"bufferView": 12,
171
161
"componentType": 5126,
172
162
"count": 65532,
173
163
"max": [
@@ -183,8 +173,7 @@
183
173
"type": "VEC3"
184
174
},
185
175
{
186
"bufferView": 3,
187
"byteOffset": 815184,
176
"bufferView": 13,
188
177
"componentType": 5126,
189
178
"count": 65532,
190
179
"max": [
@@ -200,8 +189,7 @@
200
189
"type": "VEC3"
201
190
},
202
191
{
203
"bufferView": 2,
204
"byteOffset": 9600,
192
"bufferView": 14,
205
193
"componentType": 5126,
206
194
"count": 65532,
207
195
"max": [
@@ -215,15 +203,13 @@
215
203
"type": "VEC2"
216
204
},
217
205
{
218
"bufferView": 1,
219
"byteOffset": 26784,
206
"bufferView": 15,
220
207
"componentType": 5125,
221
208
"count": 287676,
222
209
"type": "SCALAR"
223
210
},
224
211
{
225
"bufferView": 3,
226
"byteOffset": 1601568,
212
"bufferView": 16,
227
213
"componentType": 5126,
228
214
"count": 9149,
229
215
"max": [
@@ -239,8 +225,7 @@
239
225
"type": "VEC3"
240
226
},
241
227
{
242
"bufferView": 3,
243
"byteOffset": 1711356,
228
"bufferView": 17,
244
229
"componentType": 5126,
245
230
"count": 9149,
246
231
"max": [
@@ -256,8 +241,7 @@
256
241
"type": "VEC3"
257
242
},
258
243
{
259
"bufferView": 2,
260
"byteOffset": 533856,
244
"bufferView": 18,
261
245
"componentType": 5126,
262
246
"count": 9149,
263
247
"max": [
@@ -271,15 +255,13 @@
271
255
"type": "VEC2"
272
256
},
273
257
{
274
"bufferView": 1,
275
"byteOffset": 1177488,
258
"bufferView": 19,
276
259
"componentType": 5125,
277
260
"count": 33396,
278
261
"type": "SCALAR"
279
262
},
280
263
{
281
"bufferView": 3,
282
"byteOffset": 1821144,
264
"bufferView": 20,
283
265
"componentType": 5126,
284
266
"count": 250,
285
267
"max": [
@@ -295,8 +277,7 @@
295
277
"type": "VEC3"
296
278
},
297
279
{
298
"bufferView": 3,
299
"byteOffset": 1824144,
280
"bufferView": 21,
300
281
"componentType": 5126,
301
282
"count": 250,
302
283
"max": [
@@ -312,8 +293,7 @@
312
293
"type": "VEC3"
313
294
},
314
295
{
315
"bufferView": 2,
316
"byteOffset": 607048,
296
"bufferView": 22,
317
297
"componentType": 5126,
318
298
"count": 250,
319
299
"max": [
@@ -327,70 +307,13 @@
327
307
"type": "VEC2"
328
308
},
329
309
{
330
"bufferView": 1,
331
"byteOffset": 1311072,
310
"bufferView": 23,
332
311
"componentType": 5125,
333
312
"count": 1104,
334
313
"type": "SCALAR"
335
314
},
336
315
{
337
"bufferView": 3,
338
"byteOffset": 1827144,
339
"componentType": 5126,
340
"count": 3902,
341
"max": [
342
0.7412804365158081,
343
16.114208221435547,
344
1.2630138397216797
345
],
346
"min": [
347
-0.761985182762146,
348
12.552064895629883,
349
-1.1836838722229004
350
],
351
"type": "VEC3"
352
},
353
{
354
"bufferView": 3,
355
"byteOffset": 1873968,
356
"componentType": 5126,
357
"count": 3902,
358
"max": [
359
0.9999988675117493,
360
0.9993376731872559,
361
0.9998865127563477
362
],
363
"min": [
364
-0.9994397759437561,
365
-0.89373379945755,
366
-0.9994388818740845
367
],
368
"type": "VEC3"
369
},
370
{
371
"bufferView": 2,
372
"byteOffset": 609048,
373
"componentType": 5126,
374
"count": 3902,
375
"max": [
376
0.9869999885559082,
377
0.9937000274658203
378
],
379
"min": [
380
0.013399999588727951,
381
0.010400000028312206
382
],
383
"type": "VEC2"
384
},
385
{
386
"bufferView": 1,
387
"byteOffset": 1315488,
388
"componentType": 5125,
389
"count": 16056,
390
"type": "SCALAR"
391
},
392
{
393
"bufferView": 5,
316
"bufferView": 24,
394
317
"componentType": 5126,
395
318
"count": 54,
396
319
"max": [
@@ -432,13 +355,13 @@
432
355
"type": "MAT4"
433
356
},
434
357
{
435
"bufferView": 0,
358
"bufferView": 25,
436
359
"componentType": 5123,
437
360
"count": 124,
438
361
"type": "VEC4"
439
362
},
440
363
{
441
"bufferView": 4,
364
"bufferView": 26,
442
365
"componentType": 5126,
443
366
"count": 124,
444
367
"max": [
@@ -456,15 +379,13 @@
456
379
"type": "VEC4"
457
380
},
458
381
{
459
"bufferView": 0,
460
"byteOffset": 992,
382
"bufferView": 27,
461
383
"componentType": 5123,
462
384
"count": 524,
463
385
"type": "VEC4"
464
386
},
465
387
{
466
"bufferView": 4,
467
"byteOffset": 1984,
388
"bufferView": 28,
468
389
"componentType": 5126,
469
390
"count": 524,
470
391
"max": [
@@ -482,15 +403,13 @@
482
403
"type": "VEC4"
483
404
},
484
405
{
485
"bufferView": 0,
486
"byteOffset": 5184,
406
"bufferView": 29,
487
407
"componentType": 5123,
488
408
"count": 552,
489
409
"type": "VEC4"
490
410
},
491
411
{
492
"bufferView": 4,
493
"byteOffset": 10368,
412
"bufferView": 30,
494
413
"componentType": 5126,
495
414
"count": 552,
496
415
"max": [
@@ -508,15 +427,13 @@
508
427
"type": "VEC4"
509
428
},
510
429
{
511
"bufferView": 0,
512
"byteOffset": 9600,
430
"bufferView": 31,
513
431
"componentType": 5123,
514
432
"count": 65532,
515
433
"type": "VEC4"
516
434
},
517
435
{
518
"bufferView": 4,
519
"byteOffset": 19200,
436
"bufferView": 32,
520
437
"componentType": 5126,
521
438
"count": 65532,
522
439
"max": [
@@ -534,15 +451,13 @@
534
451
"type": "VEC4"
535
452
},
536
453
{
537
"bufferView": 0,
538
"byteOffset": 533856,
454
"bufferView": 33,
539
455
"componentType": 5123,
540
456
"count": 9149,
541
457
"type": "VEC4"
542
458
},
543
459
{
544
"bufferView": 4,
545
"byteOffset": 1067712,
460
"bufferView": 34,
546
461
"componentType": 5126,
547
462
"count": 9149,
548
463
"max": [
@@ -560,15 +475,13 @@
560
475
"type": "VEC4"
561
476
},
562
477
{
563
"bufferView": 0,
564
"byteOffset": 607048,
478
"bufferView": 35,
565
479
"componentType": 5123,
566
480
"count": 250,
567
481
"type": "VEC4"
568
482
},
569
483
{
570
"bufferView": 4,
571
"byteOffset": 1214096,
484
"bufferView": 36,
572
485
"componentType": 5126,
573
486
"count": 250,
574
487
"max": [
@@ -586,33 +499,7 @@
586
499
"type": "VEC4"
587
500
},
588
501
{
589
"bufferView": 0,
590
"byteOffset": 609048,
591
"componentType": 5123,
592
"count": 3902,
593
"type": "VEC4"
594
},
595
{
596
"bufferView": 4,
597
"byteOffset": 1218096,
598
"componentType": 5126,
599
"count": 3902,
600
"max": [
601
1.0,
602
0.4871094226837158,
603
0.33214032649993896,
604
0.0
605
],
606
"min": [
607
0.3354552686214447,
608
0.0,
609
0.0,
610
0.0
611
],
612
"type": "VEC4"
613
},
614
{
615
"bufferView": 6,
502
"bufferView": 37,
616
503
"componentType": 5126,
617
504
"count": 29,
618
505
"max": [
@@ -624,7 +511,7 @@
624
511
"type": "SCALAR"
625
512
},
626
513
{
627
"bufferView": 8,
514
"bufferView": 38,
628
515
"componentType": 5126,
629
516
"count": 29,
630
517
"max": [
@@ -642,8 +529,7 @@
642
529
"type": "VEC4"
643
530
},
644
531
{
645
"bufferView": 6,
646
"byteOffset": 116,
532
"bufferView": 39,
647
533
"componentType": 5126,
648
534
"count": 48,
649
535
"max": [
@@ -655,8 +541,7 @@
655
541
"type": "SCALAR"
656
542
},
657
543
{
658
"bufferView": 8,
659
"byteOffset": 464,
544
"bufferView": 40,
660
545
"componentType": 5126,
661
546
"count": 48,
662
547
"max": [
@@ -674,8 +559,7 @@
674
559
"type": "VEC4"
675
560
},
676
561
{
677
"bufferView": 6,
678
"byteOffset": 308,
562
"bufferView": 41,
679
563
"componentType": 5126,
680
564
"count": 48,
681
565
"max": [
@@ -687,8 +571,7 @@
687
571
"type": "SCALAR"
688
572
},
689
573
{
690
"bufferView": 8,
691
"byteOffset": 1232,
574
"bufferView": 42,
692
575
"componentType": 5126,
693
576
"count": 48,
694
577
"max": [
@@ -706,8 +589,7 @@
706
589
"type": "VEC4"
707
590
},
708
591
{
709
"bufferView": 6,
710
"byteOffset": 500,
592
"bufferView": 43,
711
593
"componentType": 5126,
712
594
"count": 29,
713
595
"max": [
@@ -719,8 +601,7 @@
719
601
"type": "SCALAR"
720
602
},
721
603
{
722
"bufferView": 8,
723
"byteOffset": 2000,
604
"bufferView": 44,
724
605
"componentType": 5126,
725
606
"count": 29,
726
607
"max": [
@@ -738,8 +619,7 @@
738
619
"type": "VEC4"
739
620
},
740
621
{
741
"bufferView": 6,
742
"byteOffset": 616,
622
"bufferView": 45,
743
623
"componentType": 5126,
744
624
"count": 48,
745
625
"max": [
@@ -751,8 +631,7 @@
751
631
"type": "SCALAR"
752
632
},
753
633
{
754
"bufferView": 8,
755
"byteOffset": 2464,
634
"bufferView": 46,
756
635
"componentType": 5126,
757
636
"count": 48,
758
637
"max": [
@@ -770,8 +649,7 @@
770
649
"type": "VEC4"
771
650
},
772
651
{
773
"bufferView": 6,
774
"byteOffset": 808,
652
"bufferView": 47,
775
653
"componentType": 5126,
776
654
"count": 1,
777
655
"max": [
@@ -783,7 +661,7 @@
783
661
"type": "SCALAR"
784
662
},
785
663
{
786
"bufferView": 7,
664
"bufferView": 48,
787
665
"componentType": 5126,
788
666
"count": 1,
789
667
"max": [
@@ -799,8 +677,7 @@
799
677
"type": "VEC3"
800
678
},
801
679
{
802
"bufferView": 6,
803
"byteOffset": 812,
680
"bufferView": 49,
804
681
"componentType": 5126,
805
682
"count": 48,
806
683
"max": [
@@ -812,8 +689,7 @@
812
689
"type": "SCALAR"
813
690
},
814
691
{
815
"bufferView": 8,
816
"byteOffset": 3232,
692
"bufferView": 50,
817
693
"componentType": 5126,
818
694
"count": 48,
819
695
"max": [
@@ -831,8 +707,7 @@
831
707
"type": "VEC4"
832
708
},
833
709
{
834
"bufferView": 6,
835
"byteOffset": 1004,
710
"bufferView": 51,
836
711
"componentType": 5126,
837
712
"count": 1,
838
713
"max": [
@@ -844,25 +719,23 @@
844
719
"type": "SCALAR"
845
720
},
846
721
{
847
"bufferView": 7,
848
"byteOffset": 12,
722
"bufferView": 52,
849
723
"componentType": 5126,
850
724
"count": 1,
851
725
"max": [
852
726
2.384185791015625e-07,
853
727
0.13778603076934814,
854
-2.9802322387695313e-08
728
-2.9802322387695312e-08
855
729
],
856
730
"min": [
857
731
2.384185791015625e-07,
858
732
0.13778603076934814,
859
-2.9802322387695313e-08
733
-2.9802322387695312e-08
860
734
],
861
735
"type": "VEC3"
862
736
},
863
737
{
864
"bufferView": 6,
865
"byteOffset": 1008,
738
"bufferView": 53,
866
739
"componentType": 5126,
867
740
"count": 29,
868
741
"max": [
@@ -874,8 +747,7 @@
874
747
"type": "SCALAR"
875
748
},
876
749
{
877
"bufferView": 8,
878
"byteOffset": 4000,
750
"bufferView": 54,
879
751
"componentType": 5126,
880
752
"count": 29,
881
753
"max": [
@@ -893,8 +765,7 @@
893
765
"type": "VEC4"
894
766
},
895
767
{
896
"bufferView": 6,
897
"byteOffset": 1124,
768
"bufferView": 55,
898
769
"componentType": 5126,
899
770
"count": 48,
900
771
"max": [
@@ -906,8 +777,7 @@
906
777
"type": "SCALAR"
907
778
},
908
779
{
909
"bufferView": 8,
910
"byteOffset": 4464,
780
"bufferView": 56,
911
781
"componentType": 5126,
912
782
"count": 48,
913
783
"max": [
@@ -925,8 +795,7 @@
925
795
"type": "VEC4"
926
796
},
927
797
{
928
"bufferView": 6,
929
"byteOffset": 1316,
798
"bufferView": 57,
930
799
"componentType": 5126,
931
800
"count": 48,
932
801
"max": [
@@ -938,8 +807,7 @@
938
807
"type": "SCALAR"
939
808
},
940
809
{
941
"bufferView": 8,
942
"byteOffset": 5232,
810
"bufferView": 58,
943
811
"componentType": 5126,
944
812
"count": 48,
945
813
"max": [
@@ -957,8 +825,7 @@
957
825
"type": "VEC4"
958
826
},
959
827
{
960
"bufferView": 6,
961
"byteOffset": 1508,
828
"bufferView": 59,
962
829
"componentType": 5126,
963
830
"count": 29,
964
831
"max": [
@@ -970,8 +837,7 @@
970
837
"type": "SCALAR"
971
838
},
972
839
{
973
"bufferView": 8,
974
"byteOffset": 6000,
840
"bufferView": 60,
975
841
"componentType": 5126,
976
842
"count": 29,
977
843
"max": [
@@ -989,8 +855,7 @@
989
855
"type": "VEC4"
990
856
},
991
857
{
992
"bufferView": 6,
993
"byteOffset": 1624,
858
"bufferView": 61,
994
859
"componentType": 5126,
995
860
"count": 48,
996
861
"max": [
@@ -1002,8 +867,7 @@
1002
867
"type": "SCALAR"
1003
868
},
1004
869
{
1005
"bufferView": 8,
1006
"byteOffset": 6464,
870
"bufferView": 62,
1007
871
"componentType": 5126,
1008
872
"count": 48,
1009
873
"max": [
@@ -1021,8 +885,7 @@
1021
885
"type": "VEC4"
1022
886
},
1023
887
{
1024
"bufferView": 6,
1025
"byteOffset": 1816,
888
"bufferView": 63,
1026
889
"componentType": 5126,
1027
890
"count": 48,
1028
891
"max": [
@@ -1034,8 +897,7 @@
1034
897
"type": "SCALAR"
1035
898
},
1036
899
{
1037
"bufferView": 8,
1038
"byteOffset": 7232,
900
"bufferView": 64,
1039
901
"componentType": 5126,
1040
902
"count": 48,
1041
903
"max": [
@@ -1053,8 +915,7 @@
1053
915
"type": "VEC4"
1054
916
},
1055
917
{
1056
"bufferView": 6,
1057
"byteOffset": 2008,
918
"bufferView": 65,
1058
919
"componentType": 5126,
1059
920
"count": 29,
1060
921
"max": [
@@ -1066,8 +927,7 @@
1066
927
"type": "SCALAR"
1067
928
},
1068
929
{
1069
"bufferView": 8,
1070
"byteOffset": 8000,
930
"bufferView": 66,
1071
931
"componentType": 5126,
1072
932
"count": 29,
1073
933
"max": [
@@ -1085,8 +945,7 @@
1085
945
"type": "VEC4"
1086
946
},
1087
947
{
1088
"bufferView": 6,
1089
"byteOffset": 2124,
948
"bufferView": 67,
1090
949
"componentType": 5126,
1091
950
"count": 1,
1092
951
"max": [
@@ -1098,25 +957,23 @@
1098
957
"type": "SCALAR"
1099
958
},
1100
959
{
1101
"bufferView": 7,
1102
"byteOffset": 24,
960
"bufferView": 68,
1103
961
"componentType": 5126,
1104
962
"count": 1,
1105
963
"max": [
1106
964
8.046627044677734e-07,
1107
965
0.27365753054618835,
1108
2.9802322387695313e-08
966
2.9802322387695312e-08
1109
967
],
1110
968
"min": [
1111
969
8.046627044677734e-07,
1112
970
0.27365753054618835,
1113
2.9802322387695313e-08
971
2.9802322387695312e-08
1114
972
],
1115
973
"type": "VEC3"
1116
974
},
1117
975
{
1118
"bufferView": 6,
1119
"byteOffset": 2128,
976
"bufferView": 69,
1120
977
"componentType": 5126,
1121
978
"count": 29,
1122
979
"max": [
@@ -1128,8 +985,7 @@
1128
985
"type": "SCALAR"
1129
986
},
1130
987
{
1131
"bufferView": 8,
1132
"byteOffset": 8464,
988
"bufferView": 70,
1133
989
"componentType": 5126,
1134
990
"count": 29,
1135
991
"max": [
@@ -1147,8 +1003,7 @@
1147
1003
"type": "VEC4"
1148
1004
},
1149
1005
{
1150
"bufferView": 6,
1151
"byteOffset": 2244,
1006
"bufferView": 71,
1152
1007
"componentType": 5126,
1153
1008
"count": 1,
1154
1009
"max": [
@@ -1160,8 +1015,7 @@
1160
1015
"type": "SCALAR"
1161
1016
},
1162
1017
{
1163
"bufferView": 7,
1164
"byteOffset": 36,
1018
"bufferView": 72,
1165
1019
"componentType": 5126,
1166
1020
"count": 1,
1167
1021
"max": [
@@ -1177,8 +1031,7 @@
1177
1031
"type": "VEC3"
1178
1032
},
1179
1033
{
1180
"bufferView": 6,
1181
"byteOffset": 2248,
1034
"bufferView": 73,
1182
1035
"componentType": 5126,
1183
1036
"count": 28,
1184
1037
"max": [
@@ -1190,8 +1043,7 @@
1190
1043
"type": "SCALAR"
1191
1044
},
1192
1045
{
1193
"bufferView": 8,
1194
"byteOffset": 8928,
1046
"bufferView": 74,
1195
1047
"componentType": 5126,
1196
1048
"count": 28,
1197
1049
"max": [
@@ -1209,8 +1061,7 @@
1209
1061
"type": "VEC4"
1210
1062
},
1211
1063
{
1212
"bufferView": 6,
1213
"byteOffset": 2360,
1064
"bufferView": 75,
1214
1065
"componentType": 5126,
1215
1066
"count": 40,
1216
1067
"max": [
@@ -1222,8 +1073,7 @@
1222
1073
"type": "SCALAR"
1223
1074
},
1224
1075
{
1225
"bufferView": 7,
1226
"byteOffset": 48,
1076
"bufferView": 76,
1227
1077
"componentType": 5126,
1228
1078
"count": 40,
1229
1079
"max": [
@@ -1239,8 +1089,7 @@
1239
1089
"type": "VEC3"
1240
1090
},
1241
1091
{
1242
"bufferView": 6,
1243
"byteOffset": 2520,
1092
"bufferView": 77,
1244
1093
"componentType": 5126,
1245
1094
"count": 48,
1246
1095
"max": [
@@ -1252,8 +1101,7 @@
1252
1101
"type": "SCALAR"
1253
1102
},
1254
1103
{
1255
"bufferView": 8,
1256
"byteOffset": 9376,
1104
"bufferView": 78,
1257
1105
"componentType": 5126,
1258
1106
"count": 48,
1259
1107
"max": [
@@ -1271,8 +1119,7 @@
1271
1119
"type": "VEC4"
1272
1120
},
1273
1121
{
1274
"bufferView": 6,
1275
"byteOffset": 2712,
1122
"bufferView": 79,
1276
1123
"componentType": 5126,
1277
1124
"count": 48,
1278
1125
"max": [
@@ -1284,8 +1131,7 @@
1284
1131
"type": "SCALAR"
1285
1132
},
1286
1133
{
1287
"bufferView": 8,
1288
"byteOffset": 10144,
1134
"bufferView": 80,
1289
1135
"componentType": 5126,
1290
1136
"count": 48,
1291
1137
"max": [
@@ -1303,8 +1149,7 @@
1303
1149
"type": "VEC4"
1304
1150
},
1305
1151
{
1306
"bufferView": 6,
1307
"byteOffset": 2904,
1152
"bufferView": 81,
1308
1153
"componentType": 5126,
1309
1154
"count": 1,
1310
1155
"max": [
@@ -1316,8 +1161,7 @@
1316
1161
"type": "SCALAR"
1317
1162
},
1318
1163
{
1319
"bufferView": 7,
1320
"byteOffset": 528,
1164
"bufferView": 82,
1321
1165
"componentType": 5126,
1322
1166
"count": 1,
1323
1167
"max": [
@@ -1333,8 +1177,7 @@
1333
1177
"type": "VEC3"
1334
1178
},
1335
1179
{
1336
"bufferView": 6,
1337
"byteOffset": 2908,
1180
"bufferView": 83,
1338
1181
"componentType": 5126,
1339
1182
"count": 48,
1340
1183
"max": [
@@ -1346,8 +1189,7 @@
1346
1189
"type": "SCALAR"
1347
1190
},
1348
1191
{
1349
"bufferView": 8,
1350
"byteOffset": 10912,
1192
"bufferView": 84,
1351
1193
"componentType": 5126,
1352
1194
"count": 48,
1353
1195
"max": [
@@ -1365,8 +1207,7 @@
1365
1207
"type": "VEC4"
1366
1208
},
1367
1209
{
1368
"bufferView": 6,
1369
"byteOffset": 3100,
1210
"bufferView": 85,
1370
1211
"componentType": 5126,
1371
1212
"count": 48,
1372
1213
"max": [
@@ -1378,8 +1219,7 @@
1378
1219
"type": "SCALAR"
1379
1220
},
1380
1221
{
1381
"bufferView": 7,
1382
"byteOffset": 540,
1222
"bufferView": 86,
1383
1223
"componentType": 5126,
1384
1224
"count": 48,
1385
1225
"max": [
@@ -1395,8 +1235,7 @@
1395
1235
"type": "VEC3"
1396
1236
},
1397
1237
{
1398
"bufferView": 6,
1399
"byteOffset": 3292,
1238
"bufferView": 87,
1400
1239
"componentType": 5126,
1401
1240
"count": 48,
1402
1241
"max": [
@@ -1408,8 +1247,7 @@
1408
1247
"type": "SCALAR"
1409
1248
},
1410
1249
{
1411
"bufferView": 8,
1412
"byteOffset": 11680,
1250
"bufferView": 88,
1413
1251
"componentType": 5126,
1414
1252
"count": 48,
1415
1253
"max": [
@@ -1427,8 +1265,7 @@
1427
1265
"type": "VEC4"
1428
1266
},
1429
1267
{
1430
"bufferView": 6,
1431
"byteOffset": 3484,
1268
"bufferView": 89,
1432
1269
"componentType": 5126,
1433
1270
"count": 29,
1434
1271
"max": [
@@ -1440,8 +1277,7 @@
1440
1277
"type": "SCALAR"
1441
1278
},
1442
1279
{
1443
"bufferView": 8,
1444
"byteOffset": 12448,
1280
"bufferView": 90,
1445
1281
"componentType": 5126,
1446
1282
"count": 29,
1447
1283
"max": [
@@ -1459,8 +1295,7 @@
1459
1295
"type": "VEC4"
1460
1296
},
1461
1297
{
1462
"bufferView": 6,
1463
"byteOffset": 3600,
1298
"bufferView": 91,
1464
1299
"componentType": 5126,
1465
1300
"count": 38,
1466
1301
"max": [
@@ -1472,8 +1307,7 @@
1472
1307
"type": "SCALAR"
1473
1308
},
1474
1309
{
1475
"bufferView": 8,
1476
"byteOffset": 12912,
1310
"bufferView": 92,
1477
1311
"componentType": 5126,
1478
1312
"count": 38,
1479
1313
"max": [
@@ -1491,8 +1325,7 @@
1491
1325
"type": "VEC4"
1492
1326
},
1493
1327
{
1494
"bufferView": 6,
1495
"byteOffset": 3752,
1328
"bufferView": 93,
1496
1329
"componentType": 5126,
1497
1330
"count": 1,
1498
1331
"max": [
@@ -1504,8 +1337,7 @@
1504
1337
"type": "SCALAR"
1505
1338
},
1506
1339
{
1507
"bufferView": 7,
1508
"byteOffset": 1116,
1340
"bufferView": 94,
1509
1341
"componentType": 5126,
1510
1342
"count": 1,
1511
1343
"max": [
@@ -1521,8 +1353,7 @@
1521
1353
"type": "VEC3"
1522
1354
},
1523
1355
{
1524
"bufferView": 6,
1525
"byteOffset": 3756,
1356
"bufferView": 95,
1526
1357
"componentType": 5126,
1527
1358
"count": 48,
1528
1359
"max": [
@@ -1534,8 +1365,7 @@
1534
1365
"type": "SCALAR"
1535
1366
},
1536
1367
{
1537
"bufferView": 8,
1538
"byteOffset": 13520,
1368
"bufferView": 96,
1539
1369
"componentType": 5126,
1540
1370
"count": 48,
1541
1371
"max": [
@@ -1553,8 +1383,7 @@
1553
1383
"type": "VEC4"
1554
1384
},
1555
1385
{
1556
"bufferView": 6,
1557
"byteOffset": 3948,
1386
"bufferView": 97,
1558
1387
"componentType": 5126,
1559
1388
"count": 29,
1560
1389
"max": [
@@ -1566,8 +1395,7 @@
1566
1395
"type": "SCALAR"
1567
1396
},
1568
1397
{
1569
"bufferView": 8,
1570
"byteOffset": 14288,
1398
"bufferView": 98,
1571
1399
"componentType": 5126,
1572
1400
"count": 29,
1573
1401
"max": [
@@ -1585,8 +1413,7 @@
1585
1413
"type": "VEC4"
1586
1414
},
1587
1415
{
1588
"bufferView": 6,
1589
"byteOffset": 4064,
1416
"bufferView": 99,
1590
1417
"componentType": 5126,
1591
1418
"count": 48,
1592
1419
"max": [
@@ -1598,8 +1425,7 @@
1598
1425
"type": "SCALAR"
1599
1426
},
1600
1427
{
1601
"bufferView": 8,
1602
"byteOffset": 14752,
1428
"bufferView": 100,
1603
1429
"componentType": 5126,
1604
1430
"count": 48,
1605
1431
"max": [
@@ -1617,8 +1443,7 @@
1617
1443
"type": "VEC4"
1618
1444
},
1619
1445
{
1620
"bufferView": 6,
1621
"byteOffset": 4256,
1446
"bufferView": 101,
1622
1447
"componentType": 5126,
1623
1448
"count": 1,
1624
1449
"max": [
@@ -1630,8 +1455,7 @@
1630
1455
"type": "SCALAR"
1631
1456
},
1632
1457
{
1633
"bufferView": 7,
1634
"byteOffset": 1128,
1458
"bufferView": 102,
1635
1459
"componentType": 5126,
1636
1460
"count": 1,
1637
1461
"max": [
@@ -1647,8 +1471,7 @@
1647
1471
"type": "VEC3"
1648
1472
},
1649
1473
{
1650
"bufferView": 6,
1651
"byteOffset": 4260,
1474
"bufferView": 103,
1652
1475
"componentType": 5126,
1653
1476
"count": 48,
1654
1477
"max": [
@@ -1660,8 +1483,7 @@
1660
1483
"type": "SCALAR"
1661
1484
},
1662
1485
{
1663
"bufferView": 8,
1664
"byteOffset": 15520,
1486
"bufferView": 104,
1665
1487
"componentType": 5126,
1666
1488
"count": 48,
1667
1489
"max": [
@@ -1679,8 +1501,7 @@
1679
1501
"type": "VEC4"
1680
1502
},
1681
1503
{
1682
"bufferView": 6,
1683
"byteOffset": 4452,
1504
"bufferView": 105,
1684
1505
"componentType": 5126,
1685
1506
"count": 1,
1686
1507
"max": [
@@ -1692,8 +1513,7 @@
1692
1513
"type": "SCALAR"
1693
1514
},
1694
1515
{
1695
"bufferView": 7,
1696
"byteOffset": 1140,
1516
"bufferView": 106,
1697
1517
"componentType": 5126,
1698
1518
"count": 1,
1699
1519
"max": [
@@ -1709,8 +1529,7 @@
1709
1529
"type": "VEC3"
1710
1530
},
1711
1531
{
1712
"bufferView": 6,
1713
"byteOffset": 4456,
1532
"bufferView": 107,
1714
1533
"componentType": 5126,
1715
1534
"count": 29,
1716
1535
"max": [
@@ -1722,8 +1541,7 @@
1722
1541
"type": "SCALAR"
1723
1542
},
1724
1543
{
1725
"bufferView": 8,
1726
"byteOffset": 16288,
1544
"bufferView": 108,
1727
1545
"componentType": 5126,
1728
1546
"count": 29,
1729
1547
"max": [
@@ -1741,8 +1559,7 @@
1741
1559
"type": "VEC4"
1742
1560
},
1743
1561
{
1744
"bufferView": 6,
1745
"byteOffset": 4572,
1562
"bufferView": 109,
1746
1563
"componentType": 5126,
1747
1564
"count": 48,
1748
1565
"max": [
@@ -1754,8 +1571,7 @@
1754
1571
"type": "SCALAR"
1755
1572
},
1756
1573
{
1757
"bufferView": 8,
1758
"byteOffset": 16752,
1574
"bufferView": 110,
1759
1575
"componentType": 5126,
1760
1576
"count": 48,
1761
1577
"max": [
@@ -1773,8 +1589,7 @@
1773
1589
"type": "VEC4"
1774
1590
},
1775
1591
{
1776
"bufferView": 6,
1777
"byteOffset": 4764,
1592
"bufferView": 111,
1778
1593
"componentType": 5126,
1779
1594
"count": 1,
1780
1595
"max": [
@@ -1786,8 +1601,7 @@
1786
1601
"type": "SCALAR"
1787
1602
},
1788
1603
{
1789
"bufferView": 7,
1790
"byteOffset": 1152,
1604
"bufferView": 112,
1791
1605
"componentType": 5126,
1792
1606
"count": 1,
1793
1607
"max": [
@@ -1803,8 +1617,7 @@
1803
1617
"type": "VEC3"
1804
1618
},
1805
1619
{
1806
"bufferView": 6,
1807
"byteOffset": 4768,
1620
"bufferView": 113,
1808
1621
"componentType": 5126,
1809
1622
"count": 48,
1810
1623
"max": [
@@ -1816,8 +1629,7 @@
1816
1629
"type": "SCALAR"
1817
1630
},
1818
1631
{
1819
"bufferView": 8,
1820
"byteOffset": 17520,
1632
"bufferView": 114,
1821
1633
"componentType": 5126,
1822
1634
"count": 48,
1823
1635
"max": [
@@ -1835,8 +1647,7 @@
1835
1647
"type": "VEC4"
1836
1648
},
1837
1649
{
1838
"bufferView": 6,
1839
"byteOffset": 4960,
1650
"bufferView": 115,
1840
1651
"componentType": 5126,
1841
1652
"count": 29,
1842
1653
"max": [
@@ -1848,8 +1659,7 @@
1848
1659
"type": "SCALAR"
1849
1660
},
1850
1661
{
1851
"bufferView": 8,
1852
"byteOffset": 18288,
1662
"bufferView": 116,
1853
1663
"componentType": 5126,
1854
1664
"count": 29,
1855
1665
"max": [
@@ -1867,8 +1677,7 @@
1867
1677
"type": "VEC4"
1868
1678
},
1869
1679
{
1870
"bufferView": 6,
1871
"byteOffset": 5076,
1680
"bufferView": 117,
1872
1681
"componentType": 5126,
1873
1682
"count": 48,
1874
1683
"max": [
@@ -1880,8 +1689,7 @@
1880
1689
"type": "SCALAR"
1881
1690
},
1882
1691
{
1883
"bufferView": 8,
1884
"byteOffset": 18752,
1692
"bufferView": 118,
1885
1693
"componentType": 5126,
1886
1694
"count": 48,
1887
1695
"max": [
@@ -1899,8 +1707,7 @@
1899
1707
"type": "VEC4"
1900
1708
},
1901
1709
{
1902
"bufferView": 6,
1903
"byteOffset": 5268,
1710
"bufferView": 119,
1904
1711
"componentType": 5126,
1905
1712
"count": 1,
1906
1713
"max": [
@@ -1912,8 +1719,7 @@
1912
1719
"type": "SCALAR"
1913
1720
},
1914
1721
{
1915
"bufferView": 7,
1916
"byteOffset": 1164,
1722
"bufferView": 120,
1917
1723
"componentType": 5126,
1918
1724
"count": 1,
1919
1725
"max": [
@@ -1929,8 +1735,7 @@
1929
1735
"type": "VEC3"
1930
1736
},
1931
1737
{
1932
"bufferView": 6,
1933
"byteOffset": 5272,
1738
"bufferView": 121,
1934
1739
"componentType": 5126,
1935
1740
"count": 48,
1936
1741
"max": [
@@ -1942,8 +1747,7 @@
1942
1747
"type": "SCALAR"
1943
1748
},
1944
1749
{
1945
"bufferView": 8,
1946
"byteOffset": 19520,
1750
"bufferView": 122,
1947
1751
"componentType": 5126,
1948
1752
"count": 48,
1949
1753
"max": [
@@ -1961,8 +1765,7 @@
1961
1765
"type": "VEC4"
1962
1766
},
1963
1767
{
1964
"bufferView": 6,
1965
"byteOffset": 5464,
1768
"bufferView": 123,
1966
1769
"componentType": 5126,
1967
1770
"count": 29,
1968
1771
"max": [
@@ -1974,8 +1777,7 @@
1974
1777
"type": "SCALAR"
1975
1778
},
1976
1779
{
1977
"bufferView": 8,
1978
"byteOffset": 20288,
1780
"bufferView": 124,
1979
1781
"componentType": 5126,
1980
1782
"count": 29,
1981
1783
"max": [
@@ -1993,8 +1795,7 @@
1993
1795
"type": "VEC4"
1994
1796
},
1995
1797
{
1996
"bufferView": 6,
1997
"byteOffset": 5580,
1798
"bufferView": 125,
1998
1799
"componentType": 5126,
1999
1800
"count": 48,
2000
1801
"max": [
@@ -2006,12 +1807,11 @@
2006
1807
"type": "SCALAR"
2007
1808
},
2008
1809
{
2009
"bufferView": 8,
2010
"byteOffset": 20752,
1810
"bufferView": 126,
2011
1811
"componentType": 5126,
2012
1812
"count": 48,
2013
1813
"max": [
2014
0.13546773791313171,
1814
0.1354677379131317,
2015
1815
0.03768495097756386,
2016
1816
0.25654536485671997,
2017
1817
0.9796718955039978
@@ -2025,8 +1825,7 @@
2025
1825
"type": "VEC4"
2026
1826
},
2027
1827
{
2028
"bufferView": 6,
2029
"byteOffset": 5772,
1828
"bufferView": 127,
2030
1829
"componentType": 5126,
2031
1830
"count": 1,
2032
1831
"max": [
@@ -2038,8 +1837,7 @@
2038
1837
"type": "SCALAR"
2039
1838
},
2040
1839
{
2041
"bufferView": 7,
2042
"byteOffset": 1176,
1840
"bufferView": 128,
2043
1841
"componentType": 5126,
2044
1842
"count": 1,
2045
1843
"max": [
@@ -2055,8 +1853,7 @@
2055
1853
"type": "VEC3"
2056
1854
},
2057
1855
{
2058
"bufferView": 6,
2059
"byteOffset": 5776,
1856
"bufferView": 129,
2060
1857
"componentType": 5126,
2061
1858
"count": 43,
2062
1859
"max": [
@@ -2068,8 +1865,7 @@
2068
1865
"type": "SCALAR"
2069
1866
},
2070
1867
{
2071
"bufferView": 8,
2072
"byteOffset": 21520,
1868
"bufferView": 130,
2073
1869
"componentType": 5126,
2074
1870
"count": 43,
2075
1871
"max": [
@@ -2087,8 +1883,7 @@
2087
1883
"type": "VEC4"
2088
1884
},
2089
1885
{
2090
"bufferView": 6,
2091
"byteOffset": 5948,
1886
"bufferView": 131,
2092
1887
"componentType": 5126,
2093
1888
"count": 48,
2094
1889
"max": [
@@ -2100,8 +1895,7 @@
2100
1895
"type": "SCALAR"
2101
1896
},
2102
1897
{
2103
"bufferView": 8,
2104
"byteOffset": 22208,
1898
"bufferView": 132,
2105
1899
"componentType": 5126,
2106
1900
"count": 48,
2107
1901
"max": [
@@ -2119,8 +1913,7 @@
2119
1913
"type": "VEC4"
2120
1914
},
2121
1915
{
2122
"bufferView": 6,
2123
"byteOffset": 6140,
1916
"bufferView": 133,
2124
1917
"componentType": 5126,
2125
1918
"count": 48,
2126
1919
"max": [
@@ -2132,8 +1925,7 @@
2132
1925
"type": "SCALAR"
2133
1926
},
2134
1927
{
2135
"bufferView": 8,
2136
"byteOffset": 22976,
1928
"bufferView": 134,
2137
1929
"componentType": 5126,
2138
1930
"count": 48,
2139
1931
"max": [
@@ -2151,8 +1943,7 @@
2151
1943
"type": "VEC4"
2152
1944
},
2153
1945
{
2154
"bufferView": 6,
2155
"byteOffset": 6332,
1946
"bufferView": 135,
2156
1947
"componentType": 5126,
2157
1948
"count": 48,
2158
1949
"max": [
@@ -2164,8 +1955,7 @@
2164
1955
"type": "SCALAR"
2165
1956
},
2166
1957
{
2167
"bufferView": 8,
2168
"byteOffset": 23744,
1958
"bufferView": 136,
2169
1959
"componentType": 5126,
2170
1960
"count": 48,
2171
1961
"max": [
@@ -2183,8 +1973,7 @@
2183
1973
"type": "VEC4"
2184
1974
},
2185
1975
{
2186
"bufferView": 6,
2187
"byteOffset": 6524,
1976
"bufferView": 137,
2188
1977
"componentType": 5126,
2189
1978
"count": 48,
2190
1979
"max": [
@@ -2196,8 +1985,7 @@
2196
1985
"type": "SCALAR"
2197
1986
},
2198
1987
{
2199
"bufferView": 7,
2200
"byteOffset": 1188,
1988
"bufferView": 138,
2201
1989
"componentType": 5126,
2202
1990
"count": 48,
2203
1991
"max": [
@@ -2213,8 +2001,7 @@
2213
2001
"type": "VEC3"
2214
2002
},
2215
2003
{
2216
"bufferView": 6,
2217
"byteOffset": 6716,
2004
"bufferView": 139,
2218
2005
"componentType": 5126,
2219
2006
"count": 48,
2220
2007
"max": [
@@ -2226,8 +2013,7 @@
2226
2013
"type": "SCALAR"
2227
2014
},
2228
2015
{
2229
"bufferView": 8,
2230
"byteOffset": 24512,
2016
"bufferView": 140,
2231
2017
"componentType": 5126,
2232
2018
"count": 48,
2233
2019
"max": [
@@ -2245,8 +2031,7 @@
2245
2031
"type": "VEC4"
2246
2032
},
2247
2033
{
2248
"bufferView": 6,
2249
"byteOffset": 6908,
2034
"bufferView": 141,
2250
2035
"componentType": 5126,
2251
2036
"count": 29,
2252
2037
"max": [
@@ -2258,8 +2043,7 @@
2258
2043
"type": "SCALAR"
2259
2044
},
2260
2045
{
2261
"bufferView": 8,
2262
"byteOffset": 25280,
2046
"bufferView": 142,
2263
2047
"componentType": 5126,
2264
2048
"count": 29,
2265
2049
"max": [
@@ -2277,8 +2061,7 @@
2277
2061
"type": "VEC4"
2278
2062
},
2279
2063
{
2280
"bufferView": 6,
2281
"byteOffset": 7024,
2064
"bufferView": 143,
2282
2065
"componentType": 5126,
2283
2066
"count": 48,
2284
2067
"max": [
@@ -2290,8 +2073,7 @@
2290
2073
"type": "SCALAR"
2291
2074
},
2292
2075
{
2293
"bufferView": 8,
2294
"byteOffset": 25744,
2076
"bufferView": 144,
2295
2077
"componentType": 5126,
2296
2078
"count": 48,
2297
2079
"max": [
@@ -2309,8 +2091,7 @@
2309
2091
"type": "VEC4"
2310
2092
},
2311
2093
{
2312
"bufferView": 6,
2313
"byteOffset": 7216,
2094
"bufferView": 145,
2314
2095
"componentType": 5126,
2315
2096
"count": 1,
2316
2097
"max": [
@@ -2322,8 +2103,7 @@
2322
2103
"type": "SCALAR"
2323
2104
},
2324
2105
{
2325
"bufferView": 7,
2326
"byteOffset": 1764,
2106
"bufferView": 146,
2327
2107
"componentType": 5126,
2328
2108
"count": 1,
2329
2109
"max": [
@@ -2339,8 +2119,7 @@
2339
2119
"type": "VEC3"
2340
2120
},
2341
2121
{
2342
"bufferView": 6,
2343
"byteOffset": 7220,
2122
"bufferView": 147,
2344
2123
"componentType": 5126,
2345
2124
"count": 29,
2346
2125
"max": [
@@ -2352,8 +2131,7 @@
2352
2131
"type": "SCALAR"
2353
2132
},
2354
2133
{
2355
"bufferView": 8,
2356
"byteOffset": 26512,
2134
"bufferView": 148,
2357
2135
"componentType": 5126,
2358
2136
"count": 29,
2359
2137
"max": [
@@ -2371,8 +2149,7 @@
2371
2149
"type": "VEC4"
2372
2150
},
2373
2151
{
2374
"bufferView": 6,
2375
"byteOffset": 7336,
2152
"bufferView": 149,
2376
2153
"componentType": 5126,
2377
2154
"count": 21,
2378
2155
"max": [
@@ -2384,8 +2161,7 @@
2384
2161
"type": "SCALAR"
2385
2162
},
2386
2163
{
2387
"bufferView": 7,
2388
"byteOffset": 1776,
2164
"bufferView": 150,
2389
2165
"componentType": 5126,
2390
2166
"count": 21,
2391
2167
"max": [
@@ -2401,8 +2177,7 @@
2401
2177
"type": "VEC3"
2402
2178
},
2403
2179
{
2404
"bufferView": 6,
2405
"byteOffset": 7420,
2180
"bufferView": 151,
2406
2181
"componentType": 5126,
2407
2182
"count": 29,
2408
2183
"max": [
@@ -2414,8 +2189,7 @@
2414
2189
"type": "SCALAR"
2415
2190
},
2416
2191
{
2417
"bufferView": 8,
2418
"byteOffset": 26976,
2192
"bufferView": 152,
2419
2193
"componentType": 5126,
2420
2194
"count": 29,
2421
2195
"max": [
@@ -2433,8 +2207,7 @@
2433
2207
"type": "VEC4"
2434
2208
},
2435
2209
{
2436
"bufferView": 6,
2437
"byteOffset": 7536,
2210
"bufferView": 153,
2438
2211
"componentType": 5126,
2439
2212
"count": 48,
2440
2213
"max": [
@@ -2446,8 +2219,7 @@
2446
2219
"type": "SCALAR"
2447
2220
},
2448
2221
{
2449
"bufferView": 8,
2450
"byteOffset": 27440,
2222
"bufferView": 154,
2451
2223
"componentType": 5126,
2452
2224
"count": 48,
2453
2225
"max": [
@@ -2465,8 +2237,7 @@
2465
2237
"type": "VEC4"
2466
2238
},
2467
2239
{
2468
"bufferView": 6,
2469
"byteOffset": 7728,
2240
"bufferView": 155,
2470
2241
"componentType": 5126,
2471
2242
"count": 48,
2472
2243
"max": [
@@ -2478,8 +2249,7 @@
2478
2249
"type": "SCALAR"
2479
2250
},
2480
2251
{
2481
"bufferView": 8,
2482
"byteOffset": 28208,
2252
"bufferView": 156,
2483
2253
"componentType": 5126,
2484
2254
"count": 48,
2485
2255
"max": [
@@ -2497,8 +2267,7 @@
2497
2267
"type": "VEC4"
2498
2268
},
2499
2269
{
2500
"bufferView": 6,
2501
"byteOffset": 7920,
2270
"bufferView": 157,
2502
2271
"componentType": 5126,
2503
2272
"count": 48,
2504
2273
"max": [
@@ -2510,8 +2279,7 @@
2510
2279
"type": "SCALAR"
2511
2280
},
2512
2281
{
2513
"bufferView": 8,
2514
"byteOffset": 28976,
2282
"bufferView": 158,
2515
2283
"componentType": 5126,
2516
2284
"count": 48,
2517
2285
"max": [
@@ -2529,8 +2297,7 @@
2529
2297
"type": "VEC4"
2530
2298
},
2531
2299
{
2532
"bufferView": 6,
2533
"byteOffset": 8112,
2300
"bufferView": 159,
2534
2301
"componentType": 5126,
2535
2302
"count": 48,
2536
2303
"max": [
@@ -2542,8 +2309,7 @@
2542
2309
"type": "SCALAR"
2543
2310
},
2544
2311
{
2545
"bufferView": 8,
2546
"byteOffset": 29744,
2312
"bufferView": 160,
2547
2313
"componentType": 5126,
2548
2314
"count": 48,
2549
2315
"max": [
@@ -2561,8 +2327,7 @@
2561
2327
"type": "VEC4"
2562
2328
},
2563
2329
{
2564
"bufferView": 6,
2565
"byteOffset": 8304,
2330
"bufferView": 161,
2566
2331
"componentType": 5126,
2567
2332
"count": 48,
2568
2333
"max": [
@@ -2574,8 +2339,7 @@
2574
2339
"type": "SCALAR"
2575
2340
},
2576
2341
{
2577
"bufferView": 7,
2578
"byteOffset": 2028,
2342
"bufferView": 162,
2579
2343
"componentType": 5126,
2580
2344
"count": 48,
2581
2345
"max": [
@@ -2591,8 +2355,7 @@
2591
2355
"type": "VEC3"
2592
2356
},
2593
2357
{
2594
"bufferView": 6,
2595
"byteOffset": 8496,
2358
"bufferView": 163,
2596
2359
"componentType": 5126,
2597
2360
"count": 48,
2598
2361
"max": [
@@ -2604,8 +2367,7 @@
2604
2367
"type": "SCALAR"
2605
2368
},
2606
2369
{
2607
"bufferView": 8,
2608
"byteOffset": 30512,
2370
"bufferView": 164,
2609
2371
"componentType": 5126,
2610
2372
"count": 48,
2611
2373
"max": [
@@ -2623,8 +2385,7 @@
2623
2385
"type": "VEC4"
2624
2386
},
2625
2387
{
2626
"bufferView": 6,
2627
"byteOffset": 8688,
2388
"bufferView": 165,
2628
2389
"componentType": 5126,
2629
2390
"count": 48,
2630
2391
"max": [
@@ -2636,8 +2397,7 @@
2636
2397
"type": "SCALAR"
2637
2398
},
2638
2399
{
2639
"bufferView": 8,
2640
"byteOffset": 31280,
2400
"bufferView": 166,
2641
2401
"componentType": 5126,
2642
2402
"count": 48,
2643
2403
"max": [
@@ -2655,8 +2415,7 @@
2655
2415
"type": "VEC4"
2656
2416
},
2657
2417
{
2658
"bufferView": 6,
2659
"byteOffset": 8880,
2418
"bufferView": 167,
2660
2419
"componentType": 5126,
2661
2420
"count": 48,
2662
2421
"max": [
@@ -2668,8 +2427,7 @@
2668
2427
"type": "SCALAR"
2669
2428
},
2670
2429
{
2671
"bufferView": 8,
2672
"byteOffset": 32048,
2430
"bufferView": 168,
2673
2431
"componentType": 5126,
2674
2432
"count": 48,
2675
2433
"max": [
@@ -2687,8 +2445,7 @@
2687
2445
"type": "VEC4"
2688
2446
},
2689
2447
{
2690
"bufferView": 6,
2691
"byteOffset": 9072,
2448
"bufferView": 169,
2692
2449
"componentType": 5126,
2693
2450
"count": 48,
2694
2451
"max": [
@@ -2700,8 +2457,7 @@
2700
2457
"type": "SCALAR"
2701
2458
},
2702
2459
{
2703
"bufferView": 8,
2704
"byteOffset": 32816,
2460
"bufferView": 170,
2705
2461
"componentType": 5126,
2706
2462
"count": 48,
2707
2463
"max": [
@@ -2719,8 +2475,7 @@
2719
2475
"type": "VEC4"
2720
2476
},
2721
2477
{
2722
"bufferView": 6,
2723
"byteOffset": 9264,
2478
"bufferView": 171,
2724
2479
"componentType": 5126,
2725
2480
"count": 48,
2726
2481
"max": [
@@ -2732,8 +2487,7 @@
2732
2487
"type": "SCALAR"
2733
2488
},
2734
2489
{
2735
"bufferView": 7,
2736
"byteOffset": 2604,
2490
"bufferView": 172,
2737
2491
"componentType": 5126,
2738
2492
"count": 48,
2739
2493
"max": [
@@ -2749,8 +2503,7 @@
2749
2503
"type": "VEC3"
2750
2504
},
2751
2505
{
2752
"bufferView": 6,
2753
"byteOffset": 9456,
2506
"bufferView": 173,
2754
2507
"componentType": 5126,
2755
2508
"count": 48,
2756
2509
"max": [
@@ -2762,8 +2515,7 @@
2762
2515
"type": "SCALAR"
2763
2516
},
2764
2517
{
2765
"bufferView": 8,
2766
"byteOffset": 33584,
2518
"bufferView": 174,
2767
2519
"componentType": 5126,
2768
2520
"count": 48,
2769
2521
"max": [
@@ -2781,8 +2533,7 @@
2781
2533
"type": "VEC4"
2782
2534
},
2783
2535
{
2784
"bufferView": 6,
2785
"byteOffset": 9648,
2536
"bufferView": 175,
2786
2537
"componentType": 5126,
2787
2538
"count": 48,
2788
2539
"max": [
@@ -2794,8 +2545,7 @@
2794
2545
"type": "SCALAR"
2795
2546
},
2796
2547
{
2797
"bufferView": 7,
2798
"byteOffset": 3180,
2548
"bufferView": 176,
2799
2549
"componentType": 5126,
2800
2550
"count": 48,
2801
2551
"max": [
@@ -2809,41 +2559,9 @@
2809
2559
7.7604146003723145
2810
2560
],
2811
2561
"type": "VEC3"
2812
},
2813
{
2814
"bufferView": 6,
2815
"byteOffset": 9840,
2816
"componentType": 5126,
2817
"count": 1,
2818
"max": [
2819
0.0
2820
],
2821
"min": [
2822
0.0
2823
],
2824
"type": "SCALAR"
2825
},
2826
{
2827
"bufferView": 8,
2828
"byteOffset": 34352,
2829
"componentType": 5126,
2830
"count": 1,
2831
"max": [
2832
2.1855694143368964e-08,
2833
0.0,
2834
0.0,
2835
1.0
2836
],
2837
"min": [
2838
2.1855694143368964e-08,
2839
0.0,
2840
0.0,
2841
1.0
2842
],
2843
"type": "VEC4"
2844
}
2845
],
2846
"animations": [
2562
}
2563
],
2564
"animations": [
2847
2565
{
2848
2566
"channels": [
2849
2567
{
@@ -3339,6 +3057,21 @@
3339
3057
],
3340
3058
"name": "FemaleArmature|ArmatureAction1",
3341
3059
"samplers": [
3060
{
3061
"input": 37,
3062
"interpolation": "LINEAR",
3063
"output": 38
3064
},
3065
{
3066
"input": 39,
3067
"interpolation": "LINEAR",
3068
"output": 40
3069
},
3070
{
3071
"input": 41,
3072
"interpolation": "LINEAR",
3073
"output": 42
3074
},
3342
3075
{
3343
3076
"input": 43,
3344
3077
"interpolation": "LINEAR",
@@ -3673,123 +3406,946 @@
3673
3406
"input": 175,
3674
3407
"interpolation": "LINEAR",
3675
3408
"output": 176
3676
},
3677
{
3678
"input": 177,
3679
"interpolation": "LINEAR",
3680
"output": 178
3681
},
3682
{
3683
"input": 179,
3684
"interpolation": "LINEAR",
3685
"output": 180
3686
},
3687
{
3688
"input": 181,
3689
"interpolation": "LINEAR",
3690
"output": 182
3691
3409
}
3692
3410
]
3411
}
3412
],
3413
"asset": {
3414
"extras": {
3415
"author": "assetfactory (https://sketchfab.com/assetfactory)",
3416
"license": "SKETCHFAB Standard (https://sketchfab.com/licenses)",
3417
"source": "https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec",
3418
"title": "Animated Female Base Mesh"
3419
},
3420
"generator": "Sketchfab-16.33.0",
3421
"version": "2.0"
3422
},
3423
"bufferViews": [
3424
{
3425
"buffer": 0,
3426
"byteOffset": 0,
3427
"byteLength": 1488,
3428
"target": 34962
3429
},
3430
{
3431
"buffer": 0,
3432
"byteOffset": 1488,
3433
"byteLength": 1488,
3434
"target": 34962
3435
},
3436
{
3437
"buffer": 0,
3438
"byteOffset": 2976,
3439
"byteLength": 992,
3440
"target": 34962
3441
},
3442
{
3443
"buffer": 0,
3444
"byteOffset": 3968,
3445
"byteLength": 2304,
3446
"target": 34963
3447
},
3448
{
3449
"buffer": 0,
3450
"byteOffset": 6272,
3451
"byteLength": 6288,
3452
"target": 34962
3453
},
3454
{
3455
"buffer": 0,
3456
"byteOffset": 12560,
3457
"byteLength": 6288,
3458
"target": 34962
3459
},
3460
{
3461
"buffer": 0,
3462
"byteOffset": 18848,
3463
"byteLength": 4192,
3464
"target": 34962
3465
},
3466
{
3467
"buffer": 0,
3468
"byteOffset": 23040,
3469
"byteLength": 11760,
3470
"target": 34963
3471
},
3472
{
3473
"buffer": 0,
3474
"byteOffset": 34800,
3475
"byteLength": 6624,
3476
"target": 34962
3477
},
3478
{
3479
"buffer": 0,
3480
"byteOffset": 41424,
3481
"byteLength": 6624,
3482
"target": 34962
3483
},
3484
{
3485
"buffer": 0,
3486
"byteOffset": 48048,
3487
"byteLength": 4416,
3488
"target": 34962
3489
},
3490
{
3491
"buffer": 0,
3492
"byteOffset": 52464,
3493
"byteLength": 12720,
3494
"target": 34963
3495
},
3496
{
3497
"buffer": 0,
3498
"byteOffset": 65184,
3499
"byteLength": 786384,
3500
"target": 34962
3501
},
3502
{
3503
"buffer": 0,
3504
"byteOffset": 851568,
3505
"byteLength": 786384,
3506
"target": 34962
3507
},
3508
{
3509
"buffer": 0,
3510
"byteOffset": 1637952,
3511
"byteLength": 524256,
3512
"target": 34962
3513
},
3514
{
3515
"buffer": 0,
3516
"byteOffset": 2162208,
3517
"byteLength": 1150704,
3518
"target": 34963
3519
},
3520
{
3521
"buffer": 0,
3522
"byteOffset": 3312912,
3523
"byteLength": 109788,
3524
"target": 34962
3525
},
3526
{
3527
"buffer": 0,
3528
"byteOffset": 3422700,
3529
"byteLength": 109788,
3530
"target": 34962
3531
},
3532
{
3533
"buffer": 0,
3534
"byteOffset": 3532488,
3535
"byteLength": 73192,
3536
"target": 34962
3537
},
3538
{
3539
"buffer": 0,
3540
"byteOffset": 3605680,
3541
"byteLength": 133584,
3542
"target": 34963
3543
},
3544
{
3545
"buffer": 0,
3546
"byteOffset": 3739264,
3547
"byteLength": 3000,
3548
"target": 34962
3549
},
3550
{
3551
"buffer": 0,
3552
"byteOffset": 3742264,
3553
"byteLength": 3000,
3554
"target": 34962
3555
},
3556
{
3557
"buffer": 0,
3558
"byteOffset": 3745264,
3559
"byteLength": 2000,
3560
"target": 34962
3561
},
3562
{
3563
"buffer": 0,
3564
"byteOffset": 3747264,
3565
"byteLength": 4416,
3566
"target": 34963
3567
},
3568
{
3569
"buffer": 0,
3570
"byteOffset": 3751680,
3571
"byteLength": 3456
3572
},
3573
{
3574
"buffer": 0,
3575
"byteOffset": 3755136,
3576
"byteLength": 992,
3577
"target": 34962
3578
},
3579
{
3580
"buffer": 0,
3581
"byteOffset": 3756128,
3582
"byteLength": 1984,
3583
"target": 34962
3584
},
3585
{
3586
"buffer": 0,
3587
"byteOffset": 3758112,
3588
"byteLength": 4192,
3589
"target": 34962
3590
},
3591
{
3592
"buffer": 0,
3593
"byteOffset": 3762304,
3594
"byteLength": 8384,
3595
"target": 34962
3596
},
3597
{
3598
"buffer": 0,
3599
"byteOffset": 3770688,
3600
"byteLength": 4416,
3601
"target": 34962
3602
},
3603
{
3604
"buffer": 0,
3605
"byteOffset": 3775104,
3606
"byteLength": 8832,
3607
"target": 34962
3608
},
3609
{
3610
"buffer": 0,
3611
"byteOffset": 3783936,
3612
"byteLength": 524256,
3613
"target": 34962
3614
},
3615
{
3616
"buffer": 0,
3617
"byteOffset": 4308192,
3618
"byteLength": 1048512,
3619
"target": 34962
3620
},
3621
{
3622
"buffer": 0,
3623
"byteOffset": 5356704,
3624
"byteLength": 73192,
3625
"target": 34962
3626
},
3627
{
3628
"buffer": 0,
3629
"byteOffset": 5429896,
3630
"byteLength": 146384,
3631
"target": 34962
3632
},
3633
{
3634
"buffer": 0,
3635
"byteOffset": 5576280,
3636
"byteLength": 2000,
3637
"target": 34962
3638
},
3639
{
3640
"buffer": 0,
3641
"byteOffset": 5578280,
3642
"byteLength": 4000,
3643
"target": 34962
3644
},
3645
{
3646
"buffer": 0,
3647
"byteOffset": 5582280,
3648
"byteLength": 116
3649
},
3650
{
3651
"buffer": 0,
3652
"byteOffset": 5582396,
3653
"byteLength": 464
3654
},
3655
{
3656
"buffer": 0,
3657
"byteOffset": 5582860,
3658
"byteLength": 192
3659
},
3660
{
3661
"buffer": 0,
3662
"byteOffset": 5583052,
3663
"byteLength": 768
3664
},
3665
{
3666
"buffer": 0,
3667
"byteOffset": 5583820,
3668
"byteLength": 192
3669
},
3670
{
3671
"buffer": 0,
3672
"byteOffset": 5584012,
3673
"byteLength": 768
3674
},
3675
{
3676
"buffer": 0,
3677
"byteOffset": 5584780,
3678
"byteLength": 116
3679
},
3680
{
3681
"buffer": 0,
3682
"byteOffset": 5584896,
3683
"byteLength": 464
3684
},
3685
{
3686
"buffer": 0,
3687
"byteOffset": 5585360,
3688
"byteLength": 192
3689
},
3690
{
3691
"buffer": 0,
3692
"byteOffset": 5585552,
3693
"byteLength": 768
3694
},
3695
{
3696
"buffer": 0,
3697
"byteOffset": 5586320,
3698
"byteLength": 4
3699
},
3700
{
3701
"buffer": 0,
3702
"byteOffset": 5586324,
3703
"byteLength": 12
3704
},
3705
{
3706
"buffer": 0,
3707
"byteOffset": 5586336,
3708
"byteLength": 192
3709
},
3710
{
3711
"buffer": 0,
3712
"byteOffset": 5586528,
3713
"byteLength": 768
3714
},
3715
{
3716
"buffer": 0,
3717
"byteOffset": 5587296,
3718
"byteLength": 4
3719
},
3720
{
3721
"buffer": 0,
3722
"byteOffset": 5587300,
3723
"byteLength": 12
3724
},
3725
{
3726
"buffer": 0,
3727
"byteOffset": 5587312,
3728
"byteLength": 116
3729
},
3730
{
3731
"buffer": 0,
3732
"byteOffset": 5587428,
3733
"byteLength": 464
3734
},
3735
{
3736
"buffer": 0,
3737
"byteOffset": 5587892,
3738
"byteLength": 192
3739
},
3740
{
3741
"buffer": 0,
3742
"byteOffset": 5588084,
3743
"byteLength": 768
3744
},
3745
{
3746
"buffer": 0,
3747
"byteOffset": 5588852,
3748
"byteLength": 192
3749
},
3750
{
3751
"buffer": 0,
3752
"byteOffset": 5589044,
3753
"byteLength": 768
3754
},
3755
{
3756
"buffer": 0,
3757
"byteOffset": 5589812,
3758
"byteLength": 116
3759
},
3760
{
3761
"buffer": 0,
3762
"byteOffset": 5589928,
3763
"byteLength": 464
3764
},
3765
{
3766
"buffer": 0,
3767
"byteOffset": 5590392,
3768
"byteLength": 192
3769
},
3770
{
3771
"buffer": 0,
3772
"byteOffset": 5590584,
3773
"byteLength": 768
3774
},
3775
{
3776
"buffer": 0,
3777
"byteOffset": 5591352,
3778
"byteLength": 192
3779
},
3780
{
3781
"buffer": 0,
3782
"byteOffset": 5591544,
3783
"byteLength": 768
3784
},
3785
{
3786
"buffer": 0,
3787
"byteOffset": 5592312,
3788
"byteLength": 116
3789
},
3790
{
3791
"buffer": 0,
3792
"byteOffset": 5592428,
3793
"byteLength": 464
3794
},
3795
{
3796
"buffer": 0,
3797
"byteOffset": 5592892,
3798
"byteLength": 4
3799
},
3800
{
3801
"buffer": 0,
3802
"byteOffset": 5592896,
3803
"byteLength": 12
3804
},
3805
{
3806
"buffer": 0,
3807
"byteOffset": 5592908,
3808
"byteLength": 116
3809
},
3810
{
3811
"buffer": 0,
3812
"byteOffset": 5593024,
3813
"byteLength": 464
3814
},
3815
{
3816
"buffer": 0,
3817
"byteOffset": 5593488,
3818
"byteLength": 4
3819
},
3820
{
3821
"buffer": 0,
3822
"byteOffset": 5593492,
3823
"byteLength": 12
3824
},
3825
{
3826
"buffer": 0,
3827
"byteOffset": 5593504,
3828
"byteLength": 112
3829
},
3830
{
3831
"buffer": 0,
3832
"byteOffset": 5593616,
3833
"byteLength": 448
3834
},
3835
{
3836
"buffer": 0,
3837
"byteOffset": 5594064,
3838
"byteLength": 160
3839
},
3840
{
3841
"buffer": 0,
3842
"byteOffset": 5594224,
3843
"byteLength": 480
3844
},
3845
{
3846
"buffer": 0,
3847
"byteOffset": 5594704,
3848
"byteLength": 192
3849
},
3850
{
3851
"buffer": 0,
3852
"byteOffset": 5594896,
3853
"byteLength": 768
3854
},
3855
{
3856
"buffer": 0,
3857
"byteOffset": 5595664,
3858
"byteLength": 192
3859
},
3860
{
3861
"buffer": 0,
3862
"byteOffset": 5595856,
3863
"byteLength": 768
3864
},
3865
{
3866
"buffer": 0,
3867
"byteOffset": 5596624,
3868
"byteLength": 4
3869
},
3870
{
3871
"buffer": 0,
3872
"byteOffset": 5596628,
3873
"byteLength": 12
3874
},
3875
{
3876
"buffer": 0,
3877
"byteOffset": 5596640,
3878
"byteLength": 192
3879
},
3880
{
3881
"buffer": 0,
3882
"byteOffset": 5596832,
3883
"byteLength": 768
3884
},
3885
{
3886
"buffer": 0,
3887
"byteOffset": 5597600,
3888
"byteLength": 192
3889
},
3890
{
3891
"buffer": 0,
3892
"byteOffset": 5597792,
3893
"byteLength": 576
3894
},
3895
{
3896
"buffer": 0,
3897
"byteOffset": 5598368,
3898
"byteLength": 192
3899
},
3900
{
3901
"buffer": 0,
3902
"byteOffset": 5598560,
3903
"byteLength": 768
3904
},
3905
{
3906
"buffer": 0,
3907
"byteOffset": 5599328,
3908
"byteLength": 116
3909
},
3910
{
3911
"buffer": 0,
3912
"byteOffset": 5599444,
3913
"byteLength": 464
3914
},
3915
{
3916
"buffer": 0,
3917
"byteOffset": 5599908,
3918
"byteLength": 152
3919
},
3920
{
3921
"buffer": 0,
3922
"byteOffset": 5600060,
3923
"byteLength": 608
3924
},
3925
{
3926
"buffer": 0,
3927
"byteOffset": 5600668,
3928
"byteLength": 4
3929
},
3930
{
3931
"buffer": 0,
3932
"byteOffset": 5600672,
3933
"byteLength": 12
3934
},
3935
{
3936
"buffer": 0,
3937
"byteOffset": 5600684,
3938
"byteLength": 192
3939
},
3940
{
3941
"buffer": 0,
3942
"byteOffset": 5600876,
3943
"byteLength": 768
3944
},
3945
{
3946
"buffer": 0,
3947
"byteOffset": 5601644,
3948
"byteLength": 116
3949
},
3950
{
3951
"buffer": 0,
3952
"byteOffset": 5601760,
3953
"byteLength": 464
3954
},
3955
{
3956
"buffer": 0,
3957
"byteOffset": 5602224,
3958
"byteLength": 192
3959
},
3960
{
3961
"buffer": 0,
3962
"byteOffset": 5602416,
3963
"byteLength": 768
3964
},
3965
{
3966
"buffer": 0,
3967
"byteOffset": 5603184,
3968
"byteLength": 4
3969
},
3970
{
3971
"buffer": 0,
3972
"byteOffset": 5603188,
3973
"byteLength": 12
3974
},
3975
{
3976
"buffer": 0,
3977
"byteOffset": 5603200,
3978
"byteLength": 192
3979
},
3980
{
3981
"buffer": 0,
3982
"byteOffset": 5603392,
3983
"byteLength": 768
3984
},
3985
{
3986
"buffer": 0,
3987
"byteOffset": 5604160,
3988
"byteLength": 4
3693
3989
},
3694
3990
{
3695
"channels": [
3696
{
3697
"sampler": 0,
3698
"target": {
3699
"node": 8,
3700
"path": "rotation"
3701
}
3702
}
3703
],
3704
"name": "FemaleArmature|ponytail01MeshAction.001",
3705
"samplers": [
3706
{
3707
"input": 183,
3708
"interpolation": "LINEAR",
3709
"output": 184
3710
}
3711
]
3712
}
3713
],
3714
"asset": {
3715
"extras": {
3716
"author": "assetfactory (https://sketchfab.com/assetfactory)",
3717
"license": "SKETCHFAB Standard (https://sketchfab.com/licenses)",
3718
"source": "https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec",
3719
"title": "Animated Female Base Mesh"
3991
"buffer": 0,
3992
"byteOffset": 5604164,
3993
"byteLength": 12
3720
3994
},
3721
"generator": "Sketchfab-16.33.0",
3722
"version": "2.0"
3723
},
3724
"bufferViews": [
3725
3995
{
3726
3996
"buffer": 0,
3727
"byteLength": 640264,
3728
"byteStride": 8,
3729
"name": "shortBufferViews",
3730
"target": 34962
3997
"byteOffset": 5604176,
3998
"byteLength": 116
3731
3999
},
3732
4000
{
3733
4001
"buffer": 0,
3734
"byteLength": 1379712,
3735
"byteOffset": 640264,
3736
"name": "floatBufferViews",
3737
"target": 34963
4002
"byteOffset": 5604292,
4003
"byteLength": 464
3738
4004
},
3739
4005
{
3740
4006
"buffer": 0,
3741
"byteLength": 640264,
3742
"byteOffset": 2019976,
3743
"byteStride": 8,
3744
"name": "floatBufferViews",
3745
"target": 34962
4007
"byteOffset": 5604756,
4008
"byteLength": 192
3746
4009
},
3747
4010
{
3748
4011
"buffer": 0,
3749
"byteLength": 1920792,
3750
"byteOffset": 2660240,
3751
"byteStride": 12,
3752
"name": "floatBufferViews",
3753
"target": 34962
4012
"byteOffset": 5604948,
4013
"byteLength": 768
3754
4014
},
3755
4015
{
3756
4016
"buffer": 0,
3757
"byteLength": 1280528,
3758
"byteOffset": 4581032,
3759
"byteStride": 16,
3760
"name": "floatBufferViews",
3761
"target": 34962
4017
"byteOffset": 5605716,
4018
"byteLength": 4
4019
},
4020
{
4021
"buffer": 0,
4022
"byteOffset": 5605720,
4023
"byteLength": 12
4024
},
4025
{
4026
"buffer": 0,
4027
"byteOffset": 5605732,
4028
"byteLength": 192
4029
},
4030
{
4031
"buffer": 0,
4032
"byteOffset": 5605924,
4033
"byteLength": 768
4034
},
4035
{
4036
"buffer": 0,
4037
"byteOffset": 5606692,
4038
"byteLength": 116
4039
},
4040
{
4041
"buffer": 0,
4042
"byteOffset": 5606808,
4043
"byteLength": 464
4044
},
4045
{
4046
"buffer": 0,
4047
"byteOffset": 5607272,
4048
"byteLength": 192
4049
},
4050
{
4051
"buffer": 0,
4052
"byteOffset": 5607464,
4053
"byteLength": 768
4054
},
4055
{
4056
"buffer": 0,
4057
"byteOffset": 5608232,
4058
"byteLength": 4
4059
},
4060
{
4061
"buffer": 0,
4062
"byteOffset": 5608236,
4063
"byteLength": 12
4064
},
4065
{
4066
"buffer": 0,
4067
"byteOffset": 5608248,
4068
"byteLength": 192
4069
},
4070
{
4071
"buffer": 0,
4072
"byteOffset": 5608440,
4073
"byteLength": 768
4074
},
4075
{
4076
"buffer": 0,
4077
"byteOffset": 5609208,
4078
"byteLength": 116
4079
},
4080
{
4081
"buffer": 0,
4082
"byteOffset": 5609324,
4083
"byteLength": 464
4084
},
4085
{
4086
"buffer": 0,
4087
"byteOffset": 5609788,
4088
"byteLength": 192
4089
},
4090
{
4091
"buffer": 0,
4092
"byteOffset": 5609980,
4093
"byteLength": 768
4094
},
4095
{
4096
"buffer": 0,
4097
"byteOffset": 5610748,
4098
"byteLength": 4
4099
},
4100
{
4101
"buffer": 0,
4102
"byteOffset": 5610752,
4103
"byteLength": 12
4104
},
4105
{
4106
"buffer": 0,
4107
"byteOffset": 5610764,
4108
"byteLength": 172
4109
},
4110
{
4111
"buffer": 0,
4112
"byteOffset": 5610936,
4113
"byteLength": 688
4114
},
4115
{
4116
"buffer": 0,
4117
"byteOffset": 5611624,
4118
"byteLength": 192
4119
},
4120
{
4121
"buffer": 0,
4122
"byteOffset": 5611816,
4123
"byteLength": 768
4124
},
4125
{
4126
"buffer": 0,
4127
"byteOffset": 5612584,
4128
"byteLength": 192
4129
},
4130
{
4131
"buffer": 0,
4132
"byteOffset": 5612776,
4133
"byteLength": 768
4134
},
4135
{
4136
"buffer": 0,
4137
"byteOffset": 5613544,
4138
"byteLength": 192
4139
},
4140
{
4141
"buffer": 0,
4142
"byteOffset": 5613736,
4143
"byteLength": 768
4144
},
4145
{
4146
"buffer": 0,
4147
"byteOffset": 5614504,
4148
"byteLength": 192
4149
},
4150
{
4151
"buffer": 0,
4152
"byteOffset": 5614696,
4153
"byteLength": 576
4154
},
4155
{
4156
"buffer": 0,
4157
"byteOffset": 5615272,
4158
"byteLength": 192
4159
},
4160
{
4161
"buffer": 0,
4162
"byteOffset": 5615464,
4163
"byteLength": 768
4164
},
4165
{
4166
"buffer": 0,
4167
"byteOffset": 5616232,
4168
"byteLength": 116
4169
},
4170
{
4171
"buffer": 0,
4172
"byteOffset": 5616348,
4173
"byteLength": 464
4174
},
4175
{
4176
"buffer": 0,
4177
"byteOffset": 5616812,
4178
"byteLength": 192
4179
},
4180
{
4181
"buffer": 0,
4182
"byteOffset": 5617004,
4183
"byteLength": 768
4184
},
4185
{
4186
"buffer": 0,
4187
"byteOffset": 5617772,
4188
"byteLength": 4
4189
},
4190
{
4191
"buffer": 0,
4192
"byteOffset": 5617776,
4193
"byteLength": 12
4194
},
4195
{
4196
"buffer": 0,
4197
"byteOffset": 5617788,
4198
"byteLength": 116
4199
},
4200
{
4201
"buffer": 0,
4202
"byteOffset": 5617904,
4203
"byteLength": 464
4204
},
4205
{
4206
"buffer": 0,
4207
"byteOffset": 5618368,
4208
"byteLength": 84
4209
},
4210
{
4211
"buffer": 0,
4212
"byteOffset": 5618452,
4213
"byteLength": 252
4214
},
4215
{
4216
"buffer": 0,
4217
"byteOffset": 5618704,
4218
"byteLength": 116
4219
},
4220
{
4221
"buffer": 0,
4222
"byteOffset": 5618820,
4223
"byteLength": 464
4224
},
4225
{
4226
"buffer": 0,
4227
"byteOffset": 5619284,
4228
"byteLength": 192
4229
},
4230
{
4231
"buffer": 0,
4232
"byteOffset": 5619476,
4233
"byteLength": 768
4234
},
4235
{
4236
"buffer": 0,
4237
"byteOffset": 5620244,
4238
"byteLength": 192
4239
},
4240
{
4241
"buffer": 0,
4242
"byteOffset": 5620436,
4243
"byteLength": 768
4244
},
4245
{
4246
"buffer": 0,
4247
"byteOffset": 5621204,
4248
"byteLength": 192
4249
},
4250
{
4251
"buffer": 0,
4252
"byteOffset": 5621396,
4253
"byteLength": 768
4254
},
4255
{
4256
"buffer": 0,
4257
"byteOffset": 5622164,
4258
"byteLength": 192
4259
},
4260
{
4261
"buffer": 0,
4262
"byteOffset": 5622356,
4263
"byteLength": 768
4264
},
4265
{
4266
"buffer": 0,
4267
"byteOffset": 5623124,
4268
"byteLength": 192
4269
},
4270
{
4271
"buffer": 0,
4272
"byteOffset": 5623316,
4273
"byteLength": 576
4274
},
4275
{
4276
"buffer": 0,
4277
"byteOffset": 5623892,
4278
"byteLength": 192
4279
},
4280
{
4281
"buffer": 0,
4282
"byteOffset": 5624084,
4283
"byteLength": 768
3762
4284
},
3763
4285
{
3764
4286
"buffer": 0,
3765
"byteLength": 3456,
3766
"byteOffset": 5861560,
3767
"name": "floatBufferViews"
4287
"byteOffset": 5624852,
4288
"byteLength": 192
3768
4289
},
3769
4290
{
3770
4291
"buffer": 0,
3771
"byteLength": 9844,
3772
"byteOffset": 5865016,
3773
"name": "floatBufferViews"
4292
"byteOffset": 5625044,
4293
"byteLength": 768
3774
4294
},
3775
4295
{
3776
4296
"buffer": 0,
3777
"byteLength": 3756,
3778
"byteOffset": 5874860,
3779
"byteStride": 12,
3780
"name": "floatBufferViews"
4297
"byteOffset": 5625812,
4298
"byteLength": 192
3781
4299
},
3782
4300
{
3783
4301
"buffer": 0,
3784
"byteLength": 34368,
3785
"byteOffset": 5878616,
3786
"byteStride": 16,
3787
"name": "floatBufferViews"
4302
"byteOffset": 5626004,
4303
"byteLength": 768
4304
},
4305
{
4306
"buffer": 0,
4307
"byteOffset": 5626772,
4308
"byteLength": 192
4309
},
4310
{
4311
"buffer": 0,
4312
"byteOffset": 5626964,
4313
"byteLength": 768
4314
},
4315
{
4316
"buffer": 0,
4317
"byteOffset": 5627732,
4318
"byteLength": 192
4319
},
4320
{
4321
"buffer": 0,
4322
"byteOffset": 5627924,
4323
"byteLength": 576
4324
},
4325
{
4326
"buffer": 0,
4327
"byteOffset": 5628500,
4328
"byteLength": 192
4329
},
4330
{
4331
"buffer": 0,
4332
"byteOffset": 5628692,
4333
"byteLength": 768
4334
},
4335
{
4336
"buffer": 0,
4337
"byteOffset": 5629460,
4338
"byteLength": 192
4339
},
4340
{
4341
"buffer": 0,
4342
"byteOffset": 5629652,
4343
"byteLength": 576
3788
4344
}
3789
4345
],
3790
4346
"buffers": [
3791
4347
{
3792
"byteLength": 5912984,
4348
"byteLength": 5630228,
3793
4349
"uri": "female.bin"
3794
4350
}
3795
4351
],
@@ -3805,9 +4361,6 @@
3805
4361
},
3806
4362
{
3807
4363
"uri": "textures/eyelashes03.002_baseColor.png"
3808
},
3809
{
3810
"uri": "textures/ponytail01_baseColor.png"
3811
4364
}
3812
4365
],
3813
4366
"materials": [
@@ -3870,18 +4423,6 @@
3870
4423
"metallicFactor": 0.0,
3871
4424
"roughnessFactor": 0.9159103585
3872
4425
}
3873
},
3874
{
3875
"alphaMode": "BLEND",
3876
"doubleSided": true,
3877
"name": "ponytail01",
3878
"pbrMetallicRoughness": {
3879
"baseColorTexture": {
3880
"index": 4
3881
},
3882
"metallicFactor": 0.0,
3883
"roughnessFactor": 0.6361339584
3884
}
3885
4426
}
3886
4427
],
3887
4428
"meshes": [
@@ -3890,11 +4431,11 @@
3890
4431
"primitives": [
3891
4432
{
3892
4433
"attributes": {
3893
"JOINTS_0": 29,
4434
"JOINTS_0": 25,
3894
4435
"NORMAL": 1,
3895
4436
"POSITION": 0,
3896
4437
"TEXCOORD_0": 2,
3897
"WEIGHTS_0": 30
4438
"WEIGHTS_0": 26
3898
4439
},
3899
4440
"indices": 3,
3900
4441
"material": 0,
@@ -3907,11 +4448,11 @@
3907
4448
"primitives": [
3908
4449
{
3909
4450
"attributes": {
3910
"JOINTS_0": 31,
4451
"JOINTS_0": 27,
3911
4452
"NORMAL": 5,
3912
4453
"POSITION": 4,
3913
4454
"TEXCOORD_0": 6,
3914
"WEIGHTS_0": 32
4455
"WEIGHTS_0": 28
3915
4456
},
3916
4457
"indices": 7,
3917
4458
"material": 1,
@@ -3924,11 +4465,11 @@
3924
4465
"primitives": [
3925
4466
{
3926
4467
"attributes": {
3927
"JOINTS_0": 33,
4468
"JOINTS_0": 29,
3928
4469
"NORMAL": 9,
3929
4470
"POSITION": 8,
3930
4471
"TEXCOORD_0": 10,
3931
"WEIGHTS_0": 34
4472
"WEIGHTS_0": 30
3932
4473
},
3933
4474
"indices": 11,
3934
4475
"material": 2,
@@ -3941,11 +4482,11 @@
3941
4482
"primitives": [
3942
4483
{
3943
4484
"attributes": {
3944
"JOINTS_0": 35,
4485
"JOINTS_0": 31,
3945
4486
"NORMAL": 13,
3946
4487
"POSITION": 12,
3947
4488
"TEXCOORD_0": 14,
3948
"WEIGHTS_0": 36
4489
"WEIGHTS_0": 32
3949
4490
},
3950
4491
"indices": 15,
3951
4492
"material": 3,
@@ -3958,11 +4499,11 @@
3958
4499
"primitives": [
3959
4500
{
3960
4501
"attributes": {
3961
"JOINTS_0": 37,
4502
"JOINTS_0": 33,
3962
4503
"NORMAL": 17,
3963
4504
"POSITION": 16,
3964
4505
"TEXCOORD_0": 18,
3965
"WEIGHTS_0": 38
4506
"WEIGHTS_0": 34
3966
4507
},
3967
4508
"indices": 19,
3968
4509
"material": 3,
@@ -3975,34 +4516,17 @@
3975
4516
"primitives": [
3976
4517
{
3977
4518
"attributes": {
3978
"JOINTS_0": 39,
4519
"JOINTS_0": 35,
3979
4520
"NORMAL": 21,
3980
4521
"POSITION": 20,
3981
4522
"TEXCOORD_0": 22,
3982
"WEIGHTS_0": 40
4523
"WEIGHTS_0": 36
3983
4524
},
3984
4525
"indices": 23,
3985
4526
"material": 4,
3986
4527
"mode": 4
3987
4528
}
3988
4529
]
3989
},
3990
{
3991
"name": "ponytail01Mesh_ponytail01_0",
3992
"primitives": [
3993
{
3994
"attributes": {
3995
"JOINTS_0": 41,
3996
"NORMAL": 25,
3997
"POSITION": 24,
3998
"TEXCOORD_0": 26,
3999
"WEIGHTS_0": 42
4000
},
4001
"indices": 27,
4002
"material": 5,
4003
"mode": 4
4004
}
4005
]
4006
4530
}
4007
4531
],
4008
4532
"nodes": [
@@ -4668,7 +5192,7 @@
4668
5192
],
4669
5193
"translation": [
4670
5194
-4.172325134277344e-07,
4671
0.13778707385063171,
5195
0.1377870738506317,
4672
5196
-6.854534149169922e-07
4673
5197
]
4674
5198
},
@@ -5127,7 +5651,7 @@
5127
5651
1.0
5128
5652
],
5129
5653
"translation": [
5130
2.9802322387695313e-08,
5654
2.9802322387695312e-08,
5131
5655
0.21817153692245483,
5132
5656
4.470348358154297e-08
5133
5657
]
@@ -5192,7 +5716,7 @@
5192
5716
"translation": [
5193
5717
8.940696716308594e-08,
5194
5718
0.32236427068710327,
5195
2.9802322387695313e-08
5719
2.9802322387695312e-08
5196
5720
]
5197
5721
},
5198
5722
{
@@ -5423,9 +5947,7 @@
5423
5947
"name": "Object_74"
5424
5948
},
5425
5949
{
5426
"mesh": 6,
5427
"name": "Object_75",
5428
"skin": 0
5950
"name": "Object_75"
5429
5951
},
5430
5952
{
5431
5953
"name": "ponytail01Mesh",
@@ -5461,7 +5983,7 @@
5461
5983
],
5462
5984
"skins": [
5463
5985
{
5464
"inverseBindMatrices": 28,
5986
"inverseBindMatrices": 24,
5465
5987
"joints": [
5466
5988
10,
5467
5989
21,
@@ -5537,10 +6059,6 @@
5537
6059
{
5538
6060
"sampler": 0,
5539
6061
"source": 3
5540
},
5541
{
5542
"sampler": 0,
5543
"source": 4
5544
6062
}
5545
6063
]
5546
}
6064
}
@@ -1,7 +1,7 @@1
{1
{2
"accessors": [2
"accessors": [3
{3
{4
"bufferView": 3,4
"bufferView": 0,5
"componentType": 5126,5
"componentType": 5126,6
"count": 124,6
"count": 124,7
"max": [7
"max": [@@ -17,8 +17,7 @@17
"type": "VEC3"17
"type": "VEC3"18
},18
},19
{19
{20
"bufferView": 3,20
"bufferView": 1,21
"byteOffset": 1488,22
"componentType": 5126,21
"componentType": 5126,23
"count": 124,22
"count": 124,24
"max": [23
"max": [@@ -48,14 +47,13 @@48
"type": "VEC2"47
"type": "VEC2"49
},48
},50
{49
{51
"bufferView": 1,50
"bufferView": 3,52
"componentType": 5125,51
"componentType": 5125,53
"count": 576,52
"count": 576,54
"type": "SCALAR"53
"type": "SCALAR"55
},54
},56
{55
{57
"bufferView": 3,56
"bufferView": 4,58
"byteOffset": 2976,59
"componentType": 5126,57
"componentType": 5126,60
"count": 524,58
"count": 524,61
"max": [59
"max": [@@ -71,8 +69,7 @@71
"type": "VEC3"69
"type": "VEC3"72
},70
},73
{71
{74
"bufferView": 3,72
"bufferView": 5,75
"byteOffset": 9264,76
"componentType": 5126,73
"componentType": 5126,77
"count": 524,74
"count": 524,78
"max": [75
"max": [@@ -88,8 +85,7 @@88
"type": "VEC3"85
"type": "VEC3"89
},86
},90
{87
{91
"bufferView": 2,88
"bufferView": 6,92
"byteOffset": 992,93
"componentType": 5126,89
"componentType": 5126,94
"count": 524,90
"count": 524,95
"max": [91
"max": [@@ -103,15 +99,13 @@103
"type": "VEC2"99
"type": "VEC2"104
},100
},105
{101
{106
"bufferView": 1,102
"bufferView": 7,107
"byteOffset": 2304,108
"componentType": 5125,103
"componentType": 5125,109
"count": 2940,104
"count": 2940,110
"type": "SCALAR"105
"type": "SCALAR"111
},106
},112
{107
{113
"bufferView": 3,108
"bufferView": 8,114
"byteOffset": 15552,115
"componentType": 5126,109
"componentType": 5126,116
"count": 552,110
"count": 552,117
"max": [111
"max": [@@ -127,8 +121,7 @@127
"type": "VEC3"121
"type": "VEC3"128
},122
},129
{123
{130
"bufferView": 3,124
"bufferView": 9,131
"byteOffset": 22176,132
"componentType": 5126,125
"componentType": 5126,133
"count": 552,126
"count": 552,134
"max": [127
"max": [@@ -144,8 +137,7 @@144
"type": "VEC3"137
"type": "VEC3"145
},138
},146
{139
{147
"bufferView": 2,140
"bufferView": 10,148
"byteOffset": 5184,149
"componentType": 5126,141
"componentType": 5126,150
"count": 552,142
"count": 552,151
"max": [143
"max": [@@ -159,15 +151,13 @@159
"type": "VEC2"151
"type": "VEC2"160
},152
},161
{153
{162
"bufferView": 1,154
"bufferView": 11,163
"byteOffset": 14064,164
"componentType": 5125,155
"componentType": 5125,165
"count": 3180,156
"count": 3180,166
"type": "SCALAR"157
"type": "SCALAR"167
},158
},168
{159
{169
"bufferView": 3,160
"bufferView": 12,170
"byteOffset": 28800,171
"componentType": 5126,161
"componentType": 5126,172
"count": 65532,162
"count": 65532,173
"max": [163
"max": [@@ -183,8 +173,7 @@183
"type": "VEC3"173
"type": "VEC3"184
},174
},185
{175
{186
"bufferView": 3,176
"bufferView": 13,187
"byteOffset": 815184,188
"componentType": 5126,177
"componentType": 5126,189
"count": 65532,178
"count": 65532,190
"max": [179
"max": [@@ -200,8 +189,7 @@200
"type": "VEC3"189
"type": "VEC3"201
},190
},202
{191
{203
"bufferView": 2,192
"bufferView": 14,204
"byteOffset": 9600,205
"componentType": 5126,193
"componentType": 5126,206
"count": 65532,194
"count": 65532,207
"max": [195
"max": [@@ -215,15 +203,13 @@215
"type": "VEC2"203
"type": "VEC2"216
},204
},217
{205
{218
"bufferView": 1,206
"bufferView": 15,219
"byteOffset": 26784,220
"componentType": 5125,207
"componentType": 5125,221
"count": 287676,208
"count": 287676,222
"type": "SCALAR"209
"type": "SCALAR"223
},210
},224
{211
{225
"bufferView": 3,212
"bufferView": 16,226
"byteOffset": 1601568,227
"componentType": 5126,213
"componentType": 5126,228
"count": 9149,214
"count": 9149,229
"max": [215
"max": [@@ -239,8 +225,7 @@239
"type": "VEC3"225
"type": "VEC3"240
},226
},241
{227
{242
"bufferView": 3,228
"bufferView": 17,243
"byteOffset": 1711356,244
"componentType": 5126,229
"componentType": 5126,245
"count": 9149,230
"count": 9149,246
"max": [231
"max": [@@ -256,8 +241,7 @@256
"type": "VEC3"241
"type": "VEC3"257
},242
},258
{243
{259
"bufferView": 2,244
"bufferView": 18,260
"byteOffset": 533856,261
"componentType": 5126,245
"componentType": 5126,262
"count": 9149,246
"count": 9149,263
"max": [247
"max": [@@ -271,15 +255,13 @@271
"type": "VEC2"255
"type": "VEC2"272
},256
},273
{257
{274
"bufferView": 1,258
"bufferView": 19,275
"byteOffset": 1177488,276
"componentType": 5125,259
"componentType": 5125,277
"count": 33396,260
"count": 33396,278
"type": "SCALAR"261
"type": "SCALAR"279
},262
},280
{263
{281
"bufferView": 3,264
"bufferView": 20,282
"byteOffset": 1821144,283
"componentType": 5126,265
"componentType": 5126,284
"count": 250,266
"count": 250,285
"max": [267
"max": [@@ -295,8 +277,7 @@295
"type": "VEC3"277
"type": "VEC3"296
},278
},297
{279
{298
"bufferView": 3,280
"bufferView": 21,299
"byteOffset": 1824144,300
"componentType": 5126,281
"componentType": 5126,301
"count": 250,282
"count": 250,302
"max": [283
"max": [@@ -312,8 +293,7 @@312
"type": "VEC3"293
"type": "VEC3"313
},294
},314
{295
{315
"bufferView": 2,296
"bufferView": 22,316
"byteOffset": 607048,317
"componentType": 5126,297
"componentType": 5126,318
"count": 250,298
"count": 250,319
"max": [299
"max": [@@ -327,70 +307,13 @@327
"type": "VEC2"307
"type": "VEC2"328
},308
},329
{309
{330
"bufferView": 1,310
"bufferView": 23,331
"byteOffset": 1311072,332
"componentType": 5125,311
"componentType": 5125,333
"count": 1104,312
"count": 1104,334
"type": "SCALAR"313
"type": "SCALAR"335
},314
},336
{315
{337
"bufferView": 3,316
"bufferView": 24,338
"byteOffset": 1827144,339
"componentType": 5126,340
"count": 3902,341
"max": [342
0.7412804365158081,343
16.114208221435547,344
1.2630138397216797345
],346
"min": [347
-0.761985182762146,348
12.552064895629883,349
-1.1836838722229004350
],351
"type": "VEC3"352
},353
{354
"bufferView": 3,355
"byteOffset": 1873968,356
"componentType": 5126,357
"count": 3902,358
"max": [359
0.9999988675117493,360
0.9993376731872559,361
0.9998865127563477362
],363
"min": [364
-0.9994397759437561,365
-0.89373379945755,366
-0.9994388818740845367
],368
"type": "VEC3"369
},370
{371
"bufferView": 2,372
"byteOffset": 609048,373
"componentType": 5126,374
"count": 3902,375
"max": [376
0.9869999885559082,377
0.9937000274658203378
],379
"min": [380
0.013399999588727951,381
0.010400000028312206382
],383
"type": "VEC2"384
},385
{386
"bufferView": 1,387
"byteOffset": 1315488,388
"componentType": 5125,389
"count": 16056,390
"type": "SCALAR"391
},392
{393
"bufferView": 5,394
"componentType": 5126,317
"componentType": 5126,395
"count": 54,318
"count": 54,396
"max": [319
"max": [@@ -432,13 +355,13 @@432
"type": "MAT4"355
"type": "MAT4"433
},356
},434
{357
{435
"bufferView": 0,358
"bufferView": 25,436
"componentType": 5123,359
"componentType": 5123,437
"count": 124,360
"count": 124,438
"type": "VEC4"361
"type": "VEC4"439
},362
},440
{363
{441
"bufferView": 4,364
"bufferView": 26,442
"componentType": 5126,365
"componentType": 5126,443
"count": 124,366
"count": 124,444
"max": [367
"max": [@@ -456,15 +379,13 @@456
"type": "VEC4"379
"type": "VEC4"457
},380
},458
{381
{459
"bufferView": 0,382
"bufferView": 27,460
"byteOffset": 992,461
"componentType": 5123,383
"componentType": 5123,462
"count": 524,384
"count": 524,463
"type": "VEC4"385
"type": "VEC4"464
},386
},465
{387
{466
"bufferView": 4,388
"bufferView": 28,467
"byteOffset": 1984,468
"componentType": 5126,389
"componentType": 5126,469
"count": 524,390
"count": 524,470
"max": [391
"max": [@@ -482,15 +403,13 @@482
"type": "VEC4"403
"type": "VEC4"483
},404
},484
{405
{485
"bufferView": 0,406
"bufferView": 29,486
"byteOffset": 5184,487
"componentType": 5123,407
"componentType": 5123,488
"count": 552,408
"count": 552,489
"type": "VEC4"409
"type": "VEC4"490
},410
},491
{411
{492
"bufferView": 4,412
"bufferView": 30,493
"byteOffset": 10368,494
"componentType": 5126,413
"componentType": 5126,495
"count": 552,414
"count": 552,496
"max": [415
"max": [@@ -508,15 +427,13 @@508
"type": "VEC4"427
"type": "VEC4"509
},428
},510
{429
{511
"bufferView": 0,430
"bufferView": 31,512
"byteOffset": 9600,513
"componentType": 5123,431
"componentType": 5123,514
"count": 65532,432
"count": 65532,515
"type": "VEC4"433
"type": "VEC4"516
},434
},517
{435
{518
"bufferView": 4,436
"bufferView": 32,519
"byteOffset": 19200,520
"componentType": 5126,437
"componentType": 5126,521
"count": 65532,438
"count": 65532,522
"max": [439
"max": [@@ -534,15 +451,13 @@534
"type": "VEC4"451
"type": "VEC4"535
},452
},536
{453
{537
"bufferView": 0,454
"bufferView": 33,538
"byteOffset": 533856,539
"componentType": 5123,455
"componentType": 5123,540
"count": 9149,456
"count": 9149,541
"type": "VEC4"457
"type": "VEC4"542
},458
},543
{459
{544
"bufferView": 4,460
"bufferView": 34,545
"byteOffset": 1067712,546
"componentType": 5126,461
"componentType": 5126,547
"count": 9149,462
"count": 9149,548
"max": [463
"max": [@@ -560,15 +475,13 @@560
"type": "VEC4"475
"type": "VEC4"561
},476
},562
{477
{563
"bufferView": 0,478
"bufferView": 35,564
"byteOffset": 607048,565
"componentType": 5123,479
"componentType": 5123,566
"count": 250,480
"count": 250,567
"type": "VEC4"481
"type": "VEC4"568
},482
},569
{483
{570
"bufferView": 4,484
"bufferView": 36,571
"byteOffset": 1214096,572
"componentType": 5126,485
"componentType": 5126,573
"count": 250,486
"count": 250,574
"max": [487
"max": [@@ -586,33 +499,7 @@586
"type": "VEC4"499
"type": "VEC4"587
},500
},588
{501
{589
"bufferView": 0,502
"bufferView": 37,590
"byteOffset": 609048,591
"componentType": 5123,592
"count": 3902,593
"type": "VEC4"594
},595
{596
"bufferView": 4,597
"byteOffset": 1218096,598
"componentType": 5126,599
"count": 3902,600
"max": [601
1.0,602
0.4871094226837158,603
0.33214032649993896,604
0.0605
],606
"min": [607
0.3354552686214447,608
0.0,609
0.0,610
0.0611
],612
"type": "VEC4"613
},614
{615
"bufferView": 6,616
"componentType": 5126,503
"componentType": 5126,617
"count": 29,504
"count": 29,618
"max": [505
"max": [@@ -624,7 +511,7 @@624
"type": "SCALAR"511
"type": "SCALAR"625
},512
},626
{513
{627
"bufferView": 8,514
"bufferView": 38,628
"componentType": 5126,515
"componentType": 5126,629
"count": 29,516
"count": 29,630
"max": [517
"max": [@@ -642,8 +529,7 @@642
"type": "VEC4"529
"type": "VEC4"643
},530
},644
{531
{645
"bufferView": 6,532
"bufferView": 39,646
"byteOffset": 116,647
"componentType": 5126,533
"componentType": 5126,648
"count": 48,534
"count": 48,649
"max": [535
"max": [@@ -655,8 +541,7 @@655
"type": "SCALAR"541
"type": "SCALAR"656
},542
},657
{543
{658
"bufferView": 8,544
"bufferView": 40,659
"byteOffset": 464,660
"componentType": 5126,545
"componentType": 5126,661
"count": 48,546
"count": 48,662
"max": [547
"max": [@@ -674,8 +559,7 @@674
"type": "VEC4"559
"type": "VEC4"675
},560
},676
{561
{677
"bufferView": 6,562
"bufferView": 41,678
"byteOffset": 308,679
"componentType": 5126,563
"componentType": 5126,680
"count": 48,564
"count": 48,681
"max": [565
"max": [@@ -687,8 +571,7 @@687
"type": "SCALAR"571
"type": "SCALAR"688
},572
},689
{573
{690
"bufferView": 8,574
"bufferView": 42,691
"byteOffset": 1232,692
"componentType": 5126,575
"componentType": 5126,693
"count": 48,576
"count": 48,694
"max": [577
"max": [@@ -706,8 +589,7 @@706
"type": "VEC4"589
"type": "VEC4"707
},590
},708
{591
{709
"bufferView": 6,592
"bufferView": 43,710
"byteOffset": 500,711
"componentType": 5126,593
"componentType": 5126,712
"count": 29,594
"count": 29,713
"max": [595
"max": [@@ -719,8 +601,7 @@719
"type": "SCALAR"601
"type": "SCALAR"720
},602
},721
{603
{722
"bufferView": 8,604
"bufferView": 44,723
"byteOffset": 2000,724
"componentType": 5126,605
"componentType": 5126,725
"count": 29,606
"count": 29,726
"max": [607
"max": [@@ -738,8 +619,7 @@738
"type": "VEC4"619
"type": "VEC4"739
},620
},740
{621
{741
"bufferView": 6,622
"bufferView": 45,742
"byteOffset": 616,743
"componentType": 5126,623
"componentType": 5126,744
"count": 48,624
"count": 48,745
"max": [625
"max": [@@ -751,8 +631,7 @@751
"type": "SCALAR"631
"type": "SCALAR"752
},632
},753
{633
{754
"bufferView": 8,634
"bufferView": 46,755
"byteOffset": 2464,756
"componentType": 5126,635
"componentType": 5126,757
"count": 48,636
"count": 48,758
"max": [637
"max": [@@ -770,8 +649,7 @@770
"type": "VEC4"649
"type": "VEC4"771
},650
},772
{651
{773
"bufferView": 6,652
"bufferView": 47,774
"byteOffset": 808,775
"componentType": 5126,653
"componentType": 5126,776
"count": 1,654
"count": 1,777
"max": [655
"max": [@@ -783,7 +661,7 @@783
"type": "SCALAR"661
"type": "SCALAR"784
},662
},785
{663
{786
"bufferView": 7,664
"bufferView": 48,787
"componentType": 5126,665
"componentType": 5126,788
"count": 1,666
"count": 1,789
"max": [667
"max": [@@ -799,8 +677,7 @@799
"type": "VEC3"677
"type": "VEC3"800
},678
},801
{679
{802
"bufferView": 6,680
"bufferView": 49,803
"byteOffset": 812,804
"componentType": 5126,681
"componentType": 5126,805
"count": 48,682
"count": 48,806
"max": [683
"max": [@@ -812,8 +689,7 @@812
"type": "SCALAR"689
"type": "SCALAR"813
},690
},814
{691
{815
"bufferView": 8,692
"bufferView": 50,816
"byteOffset": 3232,817
"componentType": 5126,693
"componentType": 5126,818
"count": 48,694
"count": 48,819
"max": [695
"max": [@@ -831,8 +707,7 @@831
"type": "VEC4"707
"type": "VEC4"832
},708
},833
{709
{834
"bufferView": 6,710
"bufferView": 51,835
"byteOffset": 1004,836
"componentType": 5126,711
"componentType": 5126,837
"count": 1,712
"count": 1,838
"max": [713
"max": [@@ -844,25 +719,23 @@844
"type": "SCALAR"719
"type": "SCALAR"845
},720
},846
{721
{847
"bufferView": 7,722
"bufferView": 52,848
"byteOffset": 12,849
"componentType": 5126,723
"componentType": 5126,850
"count": 1,724
"count": 1,851
"max": [725
"max": [852
2.384185791015625e-07,726
2.384185791015625e-07,853
0.13778603076934814,727
0.13778603076934814,854
-2.9802322387695313e-08728
-2.9802322387695312e-08855
],729
],856
"min": [730
"min": [857
2.384185791015625e-07,731
2.384185791015625e-07,858
0.13778603076934814,732
0.13778603076934814,859
-2.9802322387695313e-08733
-2.9802322387695312e-08860
],734
],861
"type": "VEC3"735
"type": "VEC3"862
},736
},863
{737
{864
"bufferView": 6,738
"bufferView": 53,865
"byteOffset": 1008,866
"componentType": 5126,739
"componentType": 5126,867
"count": 29,740
"count": 29,868
"max": [741
"max": [@@ -874,8 +747,7 @@874
"type": "SCALAR"747
"type": "SCALAR"875
},748
},876
{749
{877
"bufferView": 8,750
"bufferView": 54,878
"byteOffset": 4000,879
"componentType": 5126,751
"componentType": 5126,880
"count": 29,752
"count": 29,881
"max": [753
"max": [@@ -893,8 +765,7 @@893
"type": "VEC4"765
"type": "VEC4"894
},766
},895
{767
{896
"bufferView": 6,768
"bufferView": 55,897
"byteOffset": 1124,898
"componentType": 5126,769
"componentType": 5126,899
"count": 48,770
"count": 48,900
"max": [771
"max": [@@ -906,8 +777,7 @@906
"type": "SCALAR"777
"type": "SCALAR"907
},778
},908
{779
{909
"bufferView": 8,780
"bufferView": 56,910
"byteOffset": 4464,911
"componentType": 5126,781
"componentType": 5126,912
"count": 48,782
"count": 48,913
"max": [783
"max": [@@ -925,8 +795,7 @@925
"type": "VEC4"795
"type": "VEC4"926
},796
},927
{797
{928
"bufferView": 6,798
"bufferView": 57,929
"byteOffset": 1316,930
"componentType": 5126,799
"componentType": 5126,931
"count": 48,800
"count": 48,932
"max": [801
"max": [@@ -938,8 +807,7 @@938
"type": "SCALAR"807
"type": "SCALAR"939
},808
},940
{809
{941
"bufferView": 8,810
"bufferView": 58,942
"byteOffset": 5232,943
"componentType": 5126,811
"componentType": 5126,944
"count": 48,812
"count": 48,945
"max": [813
"max": [@@ -957,8 +825,7 @@957
"type": "VEC4"825
"type": "VEC4"958
},826
},959
{827
{960
"bufferView": 6,828
"bufferView": 59,961
"byteOffset": 1508,962
"componentType": 5126,829
"componentType": 5126,963
"count": 29,830
"count": 29,964
"max": [831
"max": [@@ -970,8 +837,7 @@970
"type": "SCALAR"837
"type": "SCALAR"971
},838
},972
{839
{973
"bufferView": 8,840
"bufferView": 60,974
"byteOffset": 6000,975
"componentType": 5126,841
"componentType": 5126,976
"count": 29,842
"count": 29,977
"max": [843
"max": [@@ -989,8 +855,7 @@989
"type": "VEC4"855
"type": "VEC4"990
},856
},991
{857
{992
"bufferView": 6,858
"bufferView": 61,993
"byteOffset": 1624,994
"componentType": 5126,859
"componentType": 5126,995
"count": 48,860
"count": 48,996
"max": [861
"max": [@@ -1002,8 +867,7 @@1002
"type": "SCALAR"867
"type": "SCALAR"1003
},868
},1004
{869
{1005
"bufferView": 8,870
"bufferView": 62,1006
"byteOffset": 6464,1007
"componentType": 5126,871
"componentType": 5126,1008
"count": 48,872
"count": 48,1009
"max": [873
"max": [@@ -1021,8 +885,7 @@1021
"type": "VEC4"885
"type": "VEC4"1022
},886
},1023
{887
{1024
"bufferView": 6,888
"bufferView": 63,1025
"byteOffset": 1816,1026
"componentType": 5126,889
"componentType": 5126,1027
"count": 48,890
"count": 48,1028
"max": [891
"max": [@@ -1034,8 +897,7 @@1034
"type": "SCALAR"897
"type": "SCALAR"1035
},898
},1036
{899
{1037
"bufferView": 8,900
"bufferView": 64,1038
"byteOffset": 7232,1039
"componentType": 5126,901
"componentType": 5126,1040
"count": 48,902
"count": 48,1041
"max": [903
"max": [@@ -1053,8 +915,7 @@1053
"type": "VEC4"915
"type": "VEC4"1054
},916
},1055
{917
{1056
"bufferView": 6,918
"bufferView": 65,1057
"byteOffset": 2008,1058
"componentType": 5126,919
"componentType": 5126,1059
"count": 29,920
"count": 29,1060
"max": [921
"max": [@@ -1066,8 +927,7 @@1066
"type": "SCALAR"927
"type": "SCALAR"1067
},928
},1068
{929
{1069
"bufferView": 8,930
"bufferView": 66,1070
"byteOffset": 8000,1071
"componentType": 5126,931
"componentType": 5126,1072
"count": 29,932
"count": 29,1073
"max": [933
"max": [@@ -1085,8 +945,7 @@1085
"type": "VEC4"945
"type": "VEC4"1086
},946
},1087
{947
{1088
"bufferView": 6,948
"bufferView": 67,1089
"byteOffset": 2124,1090
"componentType": 5126,949
"componentType": 5126,1091
"count": 1,950
"count": 1,1092
"max": [951
"max": [@@ -1098,25 +957,23 @@1098
"type": "SCALAR"957
"type": "SCALAR"1099
},958
},1100
{959
{1101
"bufferView": 7,960
"bufferView": 68,1102
"byteOffset": 24,1103
"componentType": 5126,961
"componentType": 5126,1104
"count": 1,962
"count": 1,1105
"max": [963
"max": [1106
8.046627044677734e-07,964
8.046627044677734e-07,1107
0.27365753054618835,965
0.27365753054618835,1108
2.9802322387695313e-08966
2.9802322387695312e-081109
],967
],1110
"min": [968
"min": [1111
8.046627044677734e-07,969
8.046627044677734e-07,1112
0.27365753054618835,970
0.27365753054618835,1113
2.9802322387695313e-08971
2.9802322387695312e-081114
],972
],1115
"type": "VEC3"973
"type": "VEC3"1116
},974
},1117
{975
{1118
"bufferView": 6,976
"bufferView": 69,1119
"byteOffset": 2128,1120
"componentType": 5126,977
"componentType": 5126,1121
"count": 29,978
"count": 29,1122
"max": [979
"max": [@@ -1128,8 +985,7 @@1128
"type": "SCALAR"985
"type": "SCALAR"1129
},986
},1130
{987
{1131
"bufferView": 8,988
"bufferView": 70,1132
"byteOffset": 8464,1133
"componentType": 5126,989
"componentType": 5126,1134
"count": 29,990
"count": 29,1135
"max": [991
"max": [@@ -1147,8 +1003,7 @@1147
"type": "VEC4"1003
"type": "VEC4"1148
},1004
},1149
{1005
{1150
"bufferView": 6,1006
"bufferView": 71,1151
"byteOffset": 2244,1152
"componentType": 5126,1007
"componentType": 5126,1153
"count": 1,1008
"count": 1,1154
"max": [1009
"max": [@@ -1160,8 +1015,7 @@1160
"type": "SCALAR"1015
"type": "SCALAR"1161
},1016
},1162
{1017
{1163
"bufferView": 7,1018
"bufferView": 72,1164
"byteOffset": 36,1165
"componentType": 5126,1019
"componentType": 5126,1166
"count": 1,1020
"count": 1,1167
"max": [1021
"max": [@@ -1177,8 +1031,7 @@1177
"type": "VEC3"1031
"type": "VEC3"1178
},1032
},1179
{1033
{1180
"bufferView": 6,1034
"bufferView": 73,1181
"byteOffset": 2248,1182
"componentType": 5126,1035
"componentType": 5126,1183
"count": 28,1036
"count": 28,1184
"max": [1037
"max": [@@ -1190,8 +1043,7 @@1190
"type": "SCALAR"1043
"type": "SCALAR"1191
},1044
},1192
{1045
{1193
"bufferView": 8,1046
"bufferView": 74,1194
"byteOffset": 8928,1195
"componentType": 5126,1047
"componentType": 5126,1196
"count": 28,1048
"count": 28,1197
"max": [1049
"max": [@@ -1209,8 +1061,7 @@1209
"type": "VEC4"1061
"type": "VEC4"1210
},1062
},1211
{1063
{1212
"bufferView": 6,1064
"bufferView": 75,1213
"byteOffset": 2360,1214
"componentType": 5126,1065
"componentType": 5126,1215
"count": 40,1066
"count": 40,1216
"max": [1067
"max": [@@ -1222,8 +1073,7 @@1222
"type": "SCALAR"1073
"type": "SCALAR"1223
},1074
},1224
{1075
{1225
"bufferView": 7,1076
"bufferView": 76,1226
"byteOffset": 48,1227
"componentType": 5126,1077
"componentType": 5126,1228
"count": 40,1078
"count": 40,1229
"max": [1079
"max": [@@ -1239,8 +1089,7 @@1239
"type": "VEC3"1089
"type": "VEC3"1240
},1090
},1241
{1091
{1242
"bufferView": 6,1092
"bufferView": 77,1243
"byteOffset": 2520,1244
"componentType": 5126,1093
"componentType": 5126,1245
"count": 48,1094
"count": 48,1246
"max": [1095
"max": [@@ -1252,8 +1101,7 @@1252
"type": "SCALAR"1101
"type": "SCALAR"1253
},1102
},1254
{1103
{1255
"bufferView": 8,1104
"bufferView": 78,1256
"byteOffset": 9376,1257
"componentType": 5126,1105
"componentType": 5126,1258
"count": 48,1106
"count": 48,1259
"max": [1107
"max": [@@ -1271,8 +1119,7 @@1271
"type": "VEC4"1119
"type": "VEC4"1272
},1120
},1273
{1121
{1274
"bufferView": 6,1122
"bufferView": 79,1275
"byteOffset": 2712,1276
"componentType": 5126,1123
"componentType": 5126,1277
"count": 48,1124
"count": 48,1278
"max": [1125
"max": [@@ -1284,8 +1131,7 @@1284
"type": "SCALAR"1131
"type": "SCALAR"1285
},1132
},1286
{1133
{1287
"bufferView": 8,1134
"bufferView": 80,1288
"byteOffset": 10144,1289
"componentType": 5126,1135
"componentType": 5126,1290
"count": 48,1136
"count": 48,1291
"max": [1137
"max": [@@ -1303,8 +1149,7 @@1303
"type": "VEC4"1149
"type": "VEC4"1304
},1150
},1305
{1151
{1306
"bufferView": 6,1152
"bufferView": 81,1307
"byteOffset": 2904,1308
"componentType": 5126,1153
"componentType": 5126,1309
"count": 1,1154
"count": 1,1310
"max": [1155
"max": [@@ -1316,8 +1161,7 @@1316
"type": "SCALAR"1161
"type": "SCALAR"1317
},1162
},1318
{1163
{1319
"bufferView": 7,1164
"bufferView": 82,1320
"byteOffset": 528,1321
"componentType": 5126,1165
"componentType": 5126,1322
"count": 1,1166
"count": 1,1323
"max": [1167
"max": [@@ -1333,8 +1177,7 @@1333
"type": "VEC3"1177
"type": "VEC3"1334
},1178
},1335
{1179
{1336
"bufferView": 6,1180
"bufferView": 83,1337
"byteOffset": 2908,1338
"componentType": 5126,1181
"componentType": 5126,1339
"count": 48,1182
"count": 48,1340
"max": [1183
"max": [@@ -1346,8 +1189,7 @@1346
"type": "SCALAR"1189
"type": "SCALAR"1347
},1190
},1348
{1191
{1349
"bufferView": 8,1192
"bufferView": 84,1350
"byteOffset": 10912,1351
"componentType": 5126,1193
"componentType": 5126,1352
"count": 48,1194
"count": 48,1353
"max": [1195
"max": [@@ -1365,8 +1207,7 @@1365
"type": "VEC4"1207
"type": "VEC4"1366
},1208
},1367
{1209
{1368
"bufferView": 6,1210
"bufferView": 85,1369
"byteOffset": 3100,1370
"componentType": 5126,1211
"componentType": 5126,1371
"count": 48,1212
"count": 48,1372
"max": [1213
"max": [@@ -1378,8 +1219,7 @@1378
"type": "SCALAR"1219
"type": "SCALAR"1379
},1220
},1380
{1221
{1381
"bufferView": 7,1222
"bufferView": 86,1382
"byteOffset": 540,1383
"componentType": 5126,1223
"componentType": 5126,1384
"count": 48,1224
"count": 48,1385
"max": [1225
"max": [@@ -1395,8 +1235,7 @@1395
"type": "VEC3"1235
"type": "VEC3"1396
},1236
},1397
{1237
{1398
"bufferView": 6,1238
"bufferView": 87,1399
"byteOffset": 3292,1400
"componentType": 5126,1239
"componentType": 5126,1401
"count": 48,1240
"count": 48,1402
"max": [1241
"max": [@@ -1408,8 +1247,7 @@1408
"type": "SCALAR"1247
"type": "SCALAR"1409
},1248
},1410
{1249
{1411
"bufferView": 8,1250
"bufferView": 88,1412
"byteOffset": 11680,1413
"componentType": 5126,1251
"componentType": 5126,1414
"count": 48,1252
"count": 48,1415
"max": [1253
"max": [@@ -1427,8 +1265,7 @@1427
"type": "VEC4"1265
"type": "VEC4"1428
},1266
},1429
{1267
{1430
"bufferView": 6,1268
"bufferView": 89,1431
"byteOffset": 3484,1432
"componentType": 5126,1269
"componentType": 5126,1433
"count": 29,1270
"count": 29,1434
"max": [1271
"max": [@@ -1440,8 +1277,7 @@1440
"type": "SCALAR"1277
"type": "SCALAR"1441
},1278
},1442
{1279
{1443
"bufferView": 8,1280
"bufferView": 90,1444
"byteOffset": 12448,1445
"componentType": 5126,1281
"componentType": 5126,1446
"count": 29,1282
"count": 29,1447
"max": [1283
"max": [@@ -1459,8 +1295,7 @@1459
"type": "VEC4"1295
"type": "VEC4"1460
},1296
},1461
{1297
{1462
"bufferView": 6,1298
"bufferView": 91,1463
"byteOffset": 3600,1464
"componentType": 5126,1299
"componentType": 5126,1465
"count": 38,1300
"count": 38,1466
"max": [1301
"max": [@@ -1472,8 +1307,7 @@1472
"type": "SCALAR"1307
"type": "SCALAR"1473
},1308
},1474
{1309
{1475
"bufferView": 8,1310
"bufferView": 92,1476
"byteOffset": 12912,1477
"componentType": 5126,1311
"componentType": 5126,1478
"count": 38,1312
"count": 38,1479
"max": [1313
"max": [@@ -1491,8 +1325,7 @@1491
"type": "VEC4"1325
"type": "VEC4"1492
},1326
},1493
{1327
{1494
"bufferView": 6,1328
"bufferView": 93,1495
"byteOffset": 3752,1496
"componentType": 5126,1329
"componentType": 5126,1497
"count": 1,1330
"count": 1,1498
"max": [1331
"max": [@@ -1504,8 +1337,7 @@1504
"type": "SCALAR"1337
"type": "SCALAR"1505
},1338
},1506
{1339
{1507
"bufferView": 7,1340
"bufferView": 94,1508
"byteOffset": 1116,1509
"componentType": 5126,1341
"componentType": 5126,1510
"count": 1,1342
"count": 1,1511
"max": [1343
"max": [@@ -1521,8 +1353,7 @@1521
"type": "VEC3"1353
"type": "VEC3"1522
},1354
},1523
{1355
{1524
"bufferView": 6,1356
"bufferView": 95,1525
"byteOffset": 3756,1526
"componentType": 5126,1357
"componentType": 5126,1527
"count": 48,1358
"count": 48,1528
"max": [1359
"max": [@@ -1534,8 +1365,7 @@1534
"type": "SCALAR"1365
"type": "SCALAR"1535
},1366
},1536
{1367
{1537
"bufferView": 8,1368
"bufferView": 96,1538
"byteOffset": 13520,1539
"componentType": 5126,1369
"componentType": 5126,1540
"count": 48,1370
"count": 48,1541
"max": [1371
"max": [@@ -1553,8 +1383,7 @@1553
"type": "VEC4"1383
"type": "VEC4"1554
},1384
},1555
{1385
{1556
"bufferView": 6,1386
"bufferView": 97,1557
"byteOffset": 3948,1558
"componentType": 5126,1387
"componentType": 5126,1559
"count": 29,1388
"count": 29,1560
"max": [1389
"max": [@@ -1566,8 +1395,7 @@1566
"type": "SCALAR"1395
"type": "SCALAR"1567
},1396
},1568
{1397
{1569
"bufferView": 8,1398
"bufferView": 98,1570
"byteOffset": 14288,1571
"componentType": 5126,1399
"componentType": 5126,1572
"count": 29,1400
"count": 29,1573
"max": [1401
"max": [@@ -1585,8 +1413,7 @@1585
"type": "VEC4"1413
"type": "VEC4"1586
},1414
},1587
{1415
{1588
"bufferView": 6,1416
"bufferView": 99,1589
"byteOffset": 4064,1590
"componentType": 5126,1417
"componentType": 5126,1591
"count": 48,1418
"count": 48,1592
"max": [1419
"max": [@@ -1598,8 +1425,7 @@1598
"type": "SCALAR"1425
"type": "SCALAR"1599
},1426
},1600
{1427
{1601
"bufferView": 8,1428
"bufferView": 100,1602
"byteOffset": 14752,1603
"componentType": 5126,1429
"componentType": 5126,1604
"count": 48,1430
"count": 48,1605
"max": [1431
"max": [@@ -1617,8 +1443,7 @@1617
"type": "VEC4"1443
"type": "VEC4"1618
},1444
},1619
{1445
{1620
"bufferView": 6,1446
"bufferView": 101,1621
"byteOffset": 4256,1622
"componentType": 5126,1447
"componentType": 5126,1623
"count": 1,1448
"count": 1,1624
"max": [1449
"max": [@@ -1630,8 +1455,7 @@1630
"type": "SCALAR"1455
"type": "SCALAR"1631
},1456
},1632
{1457
{1633
"bufferView": 7,1458
"bufferView": 102,1634
"byteOffset": 1128,1635
"componentType": 5126,1459
"componentType": 5126,1636
"count": 1,1460
"count": 1,1637
"max": [1461
"max": [@@ -1647,8 +1471,7 @@1647
"type": "VEC3"1471
"type": "VEC3"1648
},1472
},1649
{1473
{1650
"bufferView": 6,1474
"bufferView": 103,1651
"byteOffset": 4260,1652
"componentType": 5126,1475
"componentType": 5126,1653
"count": 48,1476
"count": 48,1654
"max": [1477
"max": [@@ -1660,8 +1483,7 @@1660
"type": "SCALAR"1483
"type": "SCALAR"1661
},1484
},1662
{1485
{1663
"bufferView": 8,1486
"bufferView": 104,1664
"byteOffset": 15520,1665
"componentType": 5126,1487
"componentType": 5126,1666
"count": 48,1488
"count": 48,1667
"max": [1489
"max": [@@ -1679,8 +1501,7 @@1679
"type": "VEC4"1501
"type": "VEC4"1680
},1502
},1681
{1503
{1682
"bufferView": 6,1504
"bufferView": 105,1683
"byteOffset": 4452,1684
"componentType": 5126,1505
"componentType": 5126,1685
"count": 1,1506
"count": 1,1686
"max": [1507
"max": [@@ -1692,8 +1513,7 @@1692
"type": "SCALAR"1513
"type": "SCALAR"1693
},1514
},1694
{1515
{1695
"bufferView": 7,1516
"bufferView": 106,1696
"byteOffset": 1140,1697
"componentType": 5126,1517
"componentType": 5126,1698
"count": 1,1518
"count": 1,1699
"max": [1519
"max": [@@ -1709,8 +1529,7 @@1709
"type": "VEC3"1529
"type": "VEC3"1710
},1530
},1711
{1531
{1712
"bufferView": 6,1532
"bufferView": 107,1713
"byteOffset": 4456,1714
"componentType": 5126,1533
"componentType": 5126,1715
"count": 29,1534
"count": 29,1716
"max": [1535
"max": [@@ -1722,8 +1541,7 @@1722
"type": "SCALAR"1541
"type": "SCALAR"1723
},1542
},1724
{1543
{1725
"bufferView": 8,1544
"bufferView": 108,1726
"byteOffset": 16288,1727
"componentType": 5126,1545
"componentType": 5126,1728
"count": 29,1546
"count": 29,1729
"max": [1547
"max": [@@ -1741,8 +1559,7 @@1741
"type": "VEC4"1559
"type": "VEC4"1742
},1560
},1743
{1561
{1744
"bufferView": 6,1562
"bufferView": 109,1745
"byteOffset": 4572,1746
"componentType": 5126,1563
"componentType": 5126,1747
"count": 48,1564
"count": 48,1748
"max": [1565
"max": [@@ -1754,8 +1571,7 @@1754
"type": "SCALAR"1571
"type": "SCALAR"1755
},1572
},1756
{1573
{1757
"bufferView": 8,1574
"bufferView": 110,1758
"byteOffset": 16752,1759
"componentType": 5126,1575
"componentType": 5126,1760
"count": 48,1576
"count": 48,1761
"max": [1577
"max": [@@ -1773,8 +1589,7 @@1773
"type": "VEC4"1589
"type": "VEC4"1774
},1590
},1775
{1591
{1776
"bufferView": 6,1592
"bufferView": 111,1777
"byteOffset": 4764,1778
"componentType": 5126,1593
"componentType": 5126,1779
"count": 1,1594
"count": 1,1780
"max": [1595
"max": [@@ -1786,8 +1601,7 @@1786
"type": "SCALAR"1601
"type": "SCALAR"1787
},1602
},1788
{1603
{1789
"bufferView": 7,1604
"bufferView": 112,1790
"byteOffset": 1152,1791
"componentType": 5126,1605
"componentType": 5126,1792
"count": 1,1606
"count": 1,1793
"max": [1607
"max": [@@ -1803,8 +1617,7 @@1803
"type": "VEC3"1617
"type": "VEC3"1804
},1618
},1805
{1619
{1806
"bufferView": 6,1620
"bufferView": 113,1807
"byteOffset": 4768,1808
"componentType": 5126,1621
"componentType": 5126,1809
"count": 48,1622
"count": 48,1810
"max": [1623
"max": [@@ -1816,8 +1629,7 @@1816
"type": "SCALAR"1629
"type": "SCALAR"1817
},1630
},1818
{1631
{1819
"bufferView": 8,1632
"bufferView": 114,1820
"byteOffset": 17520,1821
"componentType": 5126,1633
"componentType": 5126,1822
"count": 48,1634
"count": 48,1823
"max": [1635
"max": [@@ -1835,8 +1647,7 @@1835
"type": "VEC4"1647
"type": "VEC4"1836
},1648
},1837
{1649
{1838
"bufferView": 6,1650
"bufferView": 115,1839
"byteOffset": 4960,1840
"componentType": 5126,1651
"componentType": 5126,1841
"count": 29,1652
"count": 29,1842
"max": [1653
"max": [@@ -1848,8 +1659,7 @@1848
"type": "SCALAR"1659
"type": "SCALAR"1849
},1660
},1850
{1661
{1851
"bufferView": 8,1662
"bufferView": 116,1852
"byteOffset": 18288,1853
"componentType": 5126,1663
"componentType": 5126,1854
"count": 29,1664
"count": 29,1855
"max": [1665
"max": [@@ -1867,8 +1677,7 @@1867
"type": "VEC4"1677
"type": "VEC4"1868
},1678
},1869
{1679
{1870
"bufferView": 6,1680
"bufferView": 117,1871
"byteOffset": 5076,1872
"componentType": 5126,1681
"componentType": 5126,1873
"count": 48,1682
"count": 48,1874
"max": [1683
"max": [@@ -1880,8 +1689,7 @@1880
"type": "SCALAR"1689
"type": "SCALAR"1881
},1690
},1882
{1691
{1883
"bufferView": 8,1692
"bufferView": 118,1884
"byteOffset": 18752,1885
"componentType": 5126,1693
"componentType": 5126,1886
"count": 48,1694
"count": 48,1887
"max": [1695
"max": [@@ -1899,8 +1707,7 @@1899
"type": "VEC4"1707
"type": "VEC4"1900
},1708
},1901
{1709
{1902
"bufferView": 6,1710
"bufferView": 119,1903
"byteOffset": 5268,1904
"componentType": 5126,1711
"componentType": 5126,1905
"count": 1,1712
"count": 1,1906
"max": [1713
"max": [@@ -1912,8 +1719,7 @@1912
"type": "SCALAR"1719
"type": "SCALAR"1913
},1720
},1914
{1721
{1915
"bufferView": 7,1722
"bufferView": 120,1916
"byteOffset": 1164,1917
"componentType": 5126,1723
"componentType": 5126,1918
"count": 1,1724
"count": 1,1919
"max": [1725
"max": [@@ -1929,8 +1735,7 @@1929
"type": "VEC3"1735
"type": "VEC3"1930
},1736
},1931
{1737
{1932
"bufferView": 6,1738
"bufferView": 121,1933
"byteOffset": 5272,1934
"componentType": 5126,1739
"componentType": 5126,1935
"count": 48,1740
"count": 48,1936
"max": [1741
"max": [@@ -1942,8 +1747,7 @@1942
"type": "SCALAR"1747
"type": "SCALAR"1943
},1748
},1944
{1749
{1945
"bufferView": 8,1750
"bufferView": 122,1946
"byteOffset": 19520,1947
"componentType": 5126,1751
"componentType": 5126,1948
"count": 48,1752
"count": 48,1949
"max": [1753
"max": [@@ -1961,8 +1765,7 @@1961
"type": "VEC4"1765
"type": "VEC4"1962
},1766
},1963
{1767
{1964
"bufferView": 6,1768
"bufferView": 123,1965
"byteOffset": 5464,1966
"componentType": 5126,1769
"componentType": 5126,1967
"count": 29,1770
"count": 29,1968
"max": [1771
"max": [@@ -1974,8 +1777,7 @@1974
"type": "SCALAR"1777
"type": "SCALAR"1975
},1778
},1976
{1779
{1977
"bufferView": 8,1780
"bufferView": 124,1978
"byteOffset": 20288,1979
"componentType": 5126,1781
"componentType": 5126,1980
"count": 29,1782
"count": 29,1981
"max": [1783
"max": [@@ -1993,8 +1795,7 @@1993
"type": "VEC4"1795
"type": "VEC4"1994
},1796
},1995
{1797
{1996
"bufferView": 6,1798
"bufferView": 125,1997
"byteOffset": 5580,1998
"componentType": 5126,1799
"componentType": 5126,1999
"count": 48,1800
"count": 48,2000
"max": [1801
"max": [@@ -2006,12 +1807,11 @@2006
"type": "SCALAR"1807
"type": "SCALAR"2007
},1808
},2008
{1809
{2009
"bufferView": 8,1810
"bufferView": 126,2010
"byteOffset": 20752,2011
"componentType": 5126,1811
"componentType": 5126,2012
"count": 48,1812
"count": 48,2013
"max": [1813
"max": [2014
0.13546773791313171,1814
0.1354677379131317,2015
0.03768495097756386,1815
0.03768495097756386,2016
0.25654536485671997,1816
0.25654536485671997,2017
0.97967189550399781817
0.9796718955039978@@ -2025,8 +1825,7 @@2025
"type": "VEC4"1825
"type": "VEC4"2026
},1826
},2027
{1827
{2028
"bufferView": 6,1828
"bufferView": 127,2029
"byteOffset": 5772,2030
"componentType": 5126,1829
"componentType": 5126,2031
"count": 1,1830
"count": 1,2032
"max": [1831
"max": [@@ -2038,8 +1837,7 @@2038
"type": "SCALAR"1837
"type": "SCALAR"2039
},1838
},2040
{1839
{2041
"bufferView": 7,1840
"bufferView": 128,2042
"byteOffset": 1176,2043
"componentType": 5126,1841
"componentType": 5126,2044
"count": 1,1842
"count": 1,2045
"max": [1843
"max": [@@ -2055,8 +1853,7 @@2055
"type": "VEC3"1853
"type": "VEC3"2056
},1854
},2057
{1855
{2058
"bufferView": 6,1856
"bufferView": 129,2059
"byteOffset": 5776,2060
"componentType": 5126,1857
"componentType": 5126,2061
"count": 43,1858
"count": 43,2062
"max": [1859
"max": [@@ -2068,8 +1865,7 @@2068
"type": "SCALAR"1865
"type": "SCALAR"2069
},1866
},2070
{1867
{2071
"bufferView": 8,1868
"bufferView": 130,2072
"byteOffset": 21520,2073
"componentType": 5126,1869
"componentType": 5126,2074
"count": 43,1870
"count": 43,2075
"max": [1871
"max": [@@ -2087,8 +1883,7 @@2087
"type": "VEC4"1883
"type": "VEC4"2088
},1884
},2089
{1885
{2090
"bufferView": 6,1886
"bufferView": 131,2091
"byteOffset": 5948,2092
"componentType": 5126,1887
"componentType": 5126,2093
"count": 48,1888
"count": 48,2094
"max": [1889
"max": [@@ -2100,8 +1895,7 @@2100
"type": "SCALAR"1895
"type": "SCALAR"2101
},1896
},2102
{1897
{2103
"bufferView": 8,1898
"bufferView": 132,2104
"byteOffset": 22208,2105
"componentType": 5126,1899
"componentType": 5126,2106
"count": 48,1900
"count": 48,2107
"max": [1901
"max": [@@ -2119,8 +1913,7 @@2119
"type": "VEC4"1913
"type": "VEC4"2120
},1914
},2121
{1915
{2122
"bufferView": 6,1916
"bufferView": 133,2123
"byteOffset": 6140,2124
"componentType": 5126,1917
"componentType": 5126,2125
"count": 48,1918
"count": 48,2126
"max": [1919
"max": [@@ -2132,8 +1925,7 @@2132
"type": "SCALAR"1925
"type": "SCALAR"2133
},1926
},2134
{1927
{2135
"bufferView": 8,1928
"bufferView": 134,2136
"byteOffset": 22976,2137
"componentType": 5126,1929
"componentType": 5126,2138
"count": 48,1930
"count": 48,2139
"max": [1931
"max": [@@ -2151,8 +1943,7 @@2151
"type": "VEC4"1943
"type": "VEC4"2152
},1944
},2153
{1945
{2154
"bufferView": 6,1946
"bufferView": 135,2155
"byteOffset": 6332,2156
"componentType": 5126,1947
"componentType": 5126,2157
"count": 48,1948
"count": 48,2158
"max": [1949
"max": [@@ -2164,8 +1955,7 @@2164
"type": "SCALAR"1955
"type": "SCALAR"2165
},1956
},2166
{1957
{2167
"bufferView": 8,1958
"bufferView": 136,2168
"byteOffset": 23744,2169
"componentType": 5126,1959
"componentType": 5126,2170
"count": 48,1960
"count": 48,2171
"max": [1961
"max": [@@ -2183,8 +1973,7 @@2183
"type": "VEC4"1973
"type": "VEC4"2184
},1974
},2185
{1975
{2186
"bufferView": 6,1976
"bufferView": 137,2187
"byteOffset": 6524,2188
"componentType": 5126,1977
"componentType": 5126,2189
"count": 48,1978
"count": 48,2190
"max": [1979
"max": [@@ -2196,8 +1985,7 @@2196
"type": "SCALAR"1985
"type": "SCALAR"2197
},1986
},2198
{1987
{2199
"bufferView": 7,1988
"bufferView": 138,2200
"byteOffset": 1188,2201
"componentType": 5126,1989
"componentType": 5126,2202
"count": 48,1990
"count": 48,2203
"max": [1991
"max": [@@ -2213,8 +2001,7 @@2213
"type": "VEC3"2001
"type": "VEC3"2214
},2002
},2215
{2003
{2216
"bufferView": 6,2004
"bufferView": 139,2217
"byteOffset": 6716,2218
"componentType": 5126,2005
"componentType": 5126,2219
"count": 48,2006
"count": 48,2220
"max": [2007
"max": [@@ -2226,8 +2013,7 @@2226
"type": "SCALAR"2013
"type": "SCALAR"2227
},2014
},2228
{2015
{2229
"bufferView": 8,2016
"bufferView": 140,2230
"byteOffset": 24512,2231
"componentType": 5126,2017
"componentType": 5126,2232
"count": 48,2018
"count": 48,2233
"max": [2019
"max": [@@ -2245,8 +2031,7 @@2245
"type": "VEC4"2031
"type": "VEC4"2246
},2032
},2247
{2033
{2248
"bufferView": 6,2034
"bufferView": 141,2249
"byteOffset": 6908,2250
"componentType": 5126,2035
"componentType": 5126,2251
"count": 29,2036
"count": 29,2252
"max": [2037
"max": [@@ -2258,8 +2043,7 @@2258
"type": "SCALAR"2043
"type": "SCALAR"2259
},2044
},2260
{2045
{2261
"bufferView": 8,2046
"bufferView": 142,2262
"byteOffset": 25280,2263
"componentType": 5126,2047
"componentType": 5126,2264
"count": 29,2048
"count": 29,2265
"max": [2049
"max": [@@ -2277,8 +2061,7 @@2277
"type": "VEC4"2061
"type": "VEC4"2278
},2062
},2279
{2063
{2280
"bufferView": 6,2064
"bufferView": 143,2281
"byteOffset": 7024,2282
"componentType": 5126,2065
"componentType": 5126,2283
"count": 48,2066
"count": 48,2284
"max": [2067
"max": [@@ -2290,8 +2073,7 @@2290
"type": "SCALAR"2073
"type": "SCALAR"2291
},2074
},2292
{2075
{2293
"bufferView": 8,2076
"bufferView": 144,2294
"byteOffset": 25744,2295
"componentType": 5126,2077
"componentType": 5126,2296
"count": 48,2078
"count": 48,2297
"max": [2079
"max": [@@ -2309,8 +2091,7 @@2309
"type": "VEC4"2091
"type": "VEC4"2310
},2092
},2311
{2093
{2312
"bufferView": 6,2094
"bufferView": 145,2313
"byteOffset": 7216,2314
"componentType": 5126,2095
"componentType": 5126,2315
"count": 1,2096
"count": 1,2316
"max": [2097
"max": [@@ -2322,8 +2103,7 @@2322
"type": "SCALAR"2103
"type": "SCALAR"2323
},2104
},2324
{2105
{2325
"bufferView": 7,2106
"bufferView": 146,2326
"byteOffset": 1764,2327
"componentType": 5126,2107
"componentType": 5126,2328
"count": 1,2108
"count": 1,2329
"max": [2109
"max": [@@ -2339,8 +2119,7 @@2339
"type": "VEC3"2119
"type": "VEC3"2340
},2120
},2341
{2121
{2342
"bufferView": 6,2122
"bufferView": 147,2343
"byteOffset": 7220,2344
"componentType": 5126,2123
"componentType": 5126,2345
"count": 29,2124
"count": 29,2346
"max": [2125
"max": [@@ -2352,8 +2131,7 @@2352
"type": "SCALAR"2131
"type": "SCALAR"2353
},2132
},2354
{2133
{2355
"bufferView": 8,2134
"bufferView": 148,2356
"byteOffset": 26512,2357
"componentType": 5126,2135
"componentType": 5126,2358
"count": 29,2136
"count": 29,2359
"max": [2137
"max": [@@ -2371,8 +2149,7 @@2371
"type": "VEC4"2149
"type": "VEC4"2372
},2150
},2373
{2151
{2374
"bufferView": 6,2152
"bufferView": 149,2375
"byteOffset": 7336,2376
"componentType": 5126,2153
"componentType": 5126,2377
"count": 21,2154
"count": 21,2378
"max": [2155
"max": [@@ -2384,8 +2161,7 @@2384
"type": "SCALAR"2161
"type": "SCALAR"2385
},2162
},2386
{2163
{2387
"bufferView": 7,2164
"bufferView": 150,2388
"byteOffset": 1776,2389
"componentType": 5126,2165
"componentType": 5126,2390
"count": 21,2166
"count": 21,2391
"max": [2167
"max": [@@ -2401,8 +2177,7 @@2401
"type": "VEC3"2177
"type": "VEC3"2402
},2178
},2403
{2179
{2404
"bufferView": 6,2180
"bufferView": 151,2405
"byteOffset": 7420,2406
"componentType": 5126,2181
"componentType": 5126,2407
"count": 29,2182
"count": 29,2408
"max": [2183
"max": [@@ -2414,8 +2189,7 @@2414
"type": "SCALAR"2189
"type": "SCALAR"2415
},2190
},2416
{2191
{2417
"bufferView": 8,2192
"bufferView": 152,2418
"byteOffset": 26976,2419
"componentType": 5126,2193
"componentType": 5126,2420
"count": 29,2194
"count": 29,2421
"max": [2195
"max": [@@ -2433,8 +2207,7 @@2433
"type": "VEC4"2207
"type": "VEC4"2434
},2208
},2435
{2209
{2436
"bufferView": 6,2210
"bufferView": 153,2437
"byteOffset": 7536,2438
"componentType": 5126,2211
"componentType": 5126,2439
"count": 48,2212
"count": 48,2440
"max": [2213
"max": [@@ -2446,8 +2219,7 @@2446
"type": "SCALAR"2219
"type": "SCALAR"2447
},2220
},2448
{2221
{2449
"bufferView": 8,2222
"bufferView": 154,2450
"byteOffset": 27440,2451
"componentType": 5126,2223
"componentType": 5126,2452
"count": 48,2224
"count": 48,2453
"max": [2225
"max": [@@ -2465,8 +2237,7 @@2465
"type": "VEC4"2237
"type": "VEC4"2466
},2238
},2467
{2239
{2468
"bufferView": 6,2240
"bufferView": 155,2469
"byteOffset": 7728,2470
"componentType": 5126,2241
"componentType": 5126,2471
"count": 48,2242
"count": 48,2472
"max": [2243
"max": [@@ -2478,8 +2249,7 @@2478
"type": "SCALAR"2249
"type": "SCALAR"2479
},2250
},2480
{2251
{2481
"bufferView": 8,2252
"bufferView": 156,2482
"byteOffset": 28208,2483
"componentType": 5126,2253
"componentType": 5126,2484
"count": 48,2254
"count": 48,2485
"max": [2255
"max": [@@ -2497,8 +2267,7 @@2497
"type": "VEC4"2267
"type": "VEC4"2498
},2268
},2499
{2269
{2500
"bufferView": 6,2270
"bufferView": 157,2501
"byteOffset": 7920,2502
"componentType": 5126,2271
"componentType": 5126,2503
"count": 48,2272
"count": 48,2504
"max": [2273
"max": [@@ -2510,8 +2279,7 @@2510
"type": "SCALAR"2279
"type": "SCALAR"2511
},2280
},2512
{2281
{2513
"bufferView": 8,2282
"bufferView": 158,2514
"byteOffset": 28976,2515
"componentType": 5126,2283
"componentType": 5126,2516
"count": 48,2284
"count": 48,2517
"max": [2285
"max": [@@ -2529,8 +2297,7 @@2529
"type": "VEC4"2297
"type": "VEC4"2530
},2298
},2531
{2299
{2532
"bufferView": 6,2300
"bufferView": 159,2533
"byteOffset": 8112,2534
"componentType": 5126,2301
"componentType": 5126,2535
"count": 48,2302
"count": 48,2536
"max": [2303
"max": [@@ -2542,8 +2309,7 @@2542
"type": "SCALAR"2309
"type": "SCALAR"2543
},2310
},2544
{2311
{2545
"bufferView": 8,2312
"bufferView": 160,2546
"byteOffset": 29744,2547
"componentType": 5126,2313
"componentType": 5126,2548
"count": 48,2314
"count": 48,2549
"max": [2315
"max": [@@ -2561,8 +2327,7 @@2561
"type": "VEC4"2327
"type": "VEC4"2562
},2328
},2563
{2329
{2564
"bufferView": 6,2330
"bufferView": 161,2565
"byteOffset": 8304,2566
"componentType": 5126,2331
"componentType": 5126,2567
"count": 48,2332
"count": 48,2568
"max": [2333
"max": [@@ -2574,8 +2339,7 @@2574
"type": "SCALAR"2339
"type": "SCALAR"2575
},2340
},2576
{2341
{2577
"bufferView": 7,2342
"bufferView": 162,2578
"byteOffset": 2028,2579
"componentType": 5126,2343
"componentType": 5126,2580
"count": 48,2344
"count": 48,2581
"max": [2345
"max": [@@ -2591,8 +2355,7 @@2591
"type": "VEC3"2355
"type": "VEC3"2592
},2356
},2593
{2357
{2594
"bufferView": 6,2358
"bufferView": 163,2595
"byteOffset": 8496,2596
"componentType": 5126,2359
"componentType": 5126,2597
"count": 48,2360
"count": 48,2598
"max": [2361
"max": [@@ -2604,8 +2367,7 @@2604
"type": "SCALAR"2367
"type": "SCALAR"2605
},2368
},2606
{2369
{2607
"bufferView": 8,2370
"bufferView": 164,2608
"byteOffset": 30512,2609
"componentType": 5126,2371
"componentType": 5126,2610
"count": 48,2372
"count": 48,2611
"max": [2373
"max": [@@ -2623,8 +2385,7 @@2623
"type": "VEC4"2385
"type": "VEC4"2624
},2386
},2625
{2387
{2626
"bufferView": 6,2388
"bufferView": 165,2627
"byteOffset": 8688,2628
"componentType": 5126,2389
"componentType": 5126,2629
"count": 48,2390
"count": 48,2630
"max": [2391
"max": [@@ -2636,8 +2397,7 @@2636
"type": "SCALAR"2397
"type": "SCALAR"2637
},2398
},2638
{2399
{2639
"bufferView": 8,2400
"bufferView": 166,2640
"byteOffset": 31280,2641
"componentType": 5126,2401
"componentType": 5126,2642
"count": 48,2402
"count": 48,2643
"max": [2403
"max": [@@ -2655,8 +2415,7 @@2655
"type": "VEC4"2415
"type": "VEC4"2656
},2416
},2657
{2417
{2658
"bufferView": 6,2418
"bufferView": 167,2659
"byteOffset": 8880,2660
"componentType": 5126,2419
"componentType": 5126,2661
"count": 48,2420
"count": 48,2662
"max": [2421
"max": [@@ -2668,8 +2427,7 @@2668
"type": "SCALAR"2427
"type": "SCALAR"2669
},2428
},2670
{2429
{2671
"bufferView": 8,2430
"bufferView": 168,2672
"byteOffset": 32048,2673
"componentType": 5126,2431
"componentType": 5126,2674
"count": 48,2432
"count": 48,2675
"max": [2433
"max": [@@ -2687,8 +2445,7 @@2687
"type": "VEC4"2445
"type": "VEC4"2688
},2446
},2689
{2447
{2690
"bufferView": 6,2448
"bufferView": 169,2691
"byteOffset": 9072,2692
"componentType": 5126,2449
"componentType": 5126,2693
"count": 48,2450
"count": 48,2694
"max": [2451
"max": [@@ -2700,8 +2457,7 @@2700
"type": "SCALAR"2457
"type": "SCALAR"2701
},2458
},2702
{2459
{2703
"bufferView": 8,2460
"bufferView": 170,2704
"byteOffset": 32816,2705
"componentType": 5126,2461
"componentType": 5126,2706
"count": 48,2462
"count": 48,2707
"max": [2463
"max": [@@ -2719,8 +2475,7 @@2719
"type": "VEC4"2475
"type": "VEC4"2720
},2476
},2721
{2477
{2722
"bufferView": 6,2478
"bufferView": 171,2723
"byteOffset": 9264,2724
"componentType": 5126,2479
"componentType": 5126,2725
"count": 48,2480
"count": 48,2726
"max": [2481
"max": [@@ -2732,8 +2487,7 @@2732
"type": "SCALAR"2487
"type": "SCALAR"2733
},2488
},2734
{2489
{2735
"bufferView": 7,2490
"bufferView": 172,2736
"byteOffset": 2604,2737
"componentType": 5126,2491
"componentType": 5126,2738
"count": 48,2492
"count": 48,2739
"max": [2493
"max": [@@ -2749,8 +2503,7 @@2749
"type": "VEC3"2503
"type": "VEC3"2750
},2504
},2751
{2505
{2752
"bufferView": 6,2506
"bufferView": 173,2753
"byteOffset": 9456,2754
"componentType": 5126,2507
"componentType": 5126,2755
"count": 48,2508
"count": 48,2756
"max": [2509
"max": [@@ -2762,8 +2515,7 @@2762
"type": "SCALAR"2515
"type": "SCALAR"2763
},2516
},2764
{2517
{2765
"bufferView": 8,2518
"bufferView": 174,2766
"byteOffset": 33584,2767
"componentType": 5126,2519
"componentType": 5126,2768
"count": 48,2520
"count": 48,2769
"max": [2521
"max": [@@ -2781,8 +2533,7 @@2781
"type": "VEC4"2533
"type": "VEC4"2782
},2534
},2783
{2535
{2784
"bufferView": 6,2536
"bufferView": 175,2785
"byteOffset": 9648,2786
"componentType": 5126,2537
"componentType": 5126,2787
"count": 48,2538
"count": 48,2788
"max": [2539
"max": [@@ -2794,8 +2545,7 @@2794
"type": "SCALAR"2545
"type": "SCALAR"2795
},2546
},2796
{2547
{2797
"bufferView": 7,2548
"bufferView": 176,2798
"byteOffset": 3180,2799
"componentType": 5126,2549
"componentType": 5126,2800
"count": 48,2550
"count": 48,2801
"max": [2551
"max": [@@ -2809,41 +2559,9 @@2809
7.76041460037231452559
7.76041460037231452810
],2560
],2811
"type": "VEC3"2561
"type": "VEC3"2812
},2562
}2813
{2563
],2814
"bufferView": 6,2564
"animations": [2815
"byteOffset": 9840,2816
"componentType": 5126,2817
"count": 1,2818
"max": [2819
0.02820
],2821
"min": [2822
0.02823
],2824
"type": "SCALAR"2825
},2826
{2827
"bufferView": 8,2828
"byteOffset": 34352,2829
"componentType": 5126,2830
"count": 1,2831
"max": [2832
2.1855694143368964e-08,2833
0.0,2834
0.0,2835
1.02836
],2837
"min": [2838
2.1855694143368964e-08,2839
0.0,2840
0.0,2841
1.02842
],2843
"type": "VEC4"2844
}2845
],2846
"animations": [2847
{2565
{2848
"channels": [2566
"channels": [2849
{2567
{@@ -3339,6 +3057,21 @@3339
],3057
],3340
"name": "FemaleArmature|ArmatureAction1",3058
"name": "FemaleArmature|ArmatureAction1",3341
"samplers": [3059
"samplers": [3060
{3061
"input": 37,3062
"interpolation": "LINEAR",3063
"output": 383064
},3065
{3066
"input": 39,3067
"interpolation": "LINEAR",3068
"output": 403069
},3070
{3071
"input": 41,3072
"interpolation": "LINEAR",3073
"output": 423074
},3342
{3075
{3343
"input": 43,3076
"input": 43,3344
"interpolation": "LINEAR",3077
"interpolation": "LINEAR",@@ -3673,123 +3406,946 @@3673
"input": 175,3406
"input": 175,3674
"interpolation": "LINEAR",3407
"interpolation": "LINEAR",3675
"output": 1763408
"output": 1763676
},3677
{3678
"input": 177,3679
"interpolation": "LINEAR",3680
"output": 1783681
},3682
{3683
"input": 179,3684
"interpolation": "LINEAR",3685
"output": 1803686
},3687
{3688
"input": 181,3689
"interpolation": "LINEAR",3690
"output": 1823691
}3409
}3692
]3410
]3411
}3412
],3413
"asset": {3414
"extras": {3415
"author": "assetfactory (https://sketchfab.com/assetfactory)",3416
"license": "SKETCHFAB Standard (https://sketchfab.com/licenses)",3417
"source": "https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec",3418
"title": "Animated Female Base Mesh"3419
},3420
"generator": "Sketchfab-16.33.0",3421
"version": "2.0"3422
},3423
"bufferViews": [3424
{3425
"buffer": 0,3426
"byteOffset": 0,3427
"byteLength": 1488,3428
"target": 349623429
},3430
{3431
"buffer": 0,3432
"byteOffset": 1488,3433
"byteLength": 1488,3434
"target": 349623435
},3436
{3437
"buffer": 0,3438
"byteOffset": 2976,3439
"byteLength": 992,3440
"target": 349623441
},3442
{3443
"buffer": 0,3444
"byteOffset": 3968,3445
"byteLength": 2304,3446
"target": 349633447
},3448
{3449
"buffer": 0,3450
"byteOffset": 6272,3451
"byteLength": 6288,3452
"target": 349623453
},3454
{3455
"buffer": 0,3456
"byteOffset": 12560,3457
"byteLength": 6288,3458
"target": 349623459
},3460
{3461
"buffer": 0,3462
"byteOffset": 18848,3463
"byteLength": 4192,3464
"target": 349623465
},3466
{3467
"buffer": 0,3468
"byteOffset": 23040,3469
"byteLength": 11760,3470
"target": 349633471
},3472
{3473
"buffer": 0,3474
"byteOffset": 34800,3475
"byteLength": 6624,3476
"target": 349623477
},3478
{3479
"buffer": 0,3480
"byteOffset": 41424,3481
"byteLength": 6624,3482
"target": 349623483
},3484
{3485
"buffer": 0,3486
"byteOffset": 48048,3487
"byteLength": 4416,3488
"target": 349623489
},3490
{3491
"buffer": 0,3492
"byteOffset": 52464,3493
"byteLength": 12720,3494
"target": 349633495
},3496
{3497
"buffer": 0,3498
"byteOffset": 65184,3499
"byteLength": 786384,3500
"target": 349623501
},3502
{3503
"buffer": 0,3504
"byteOffset": 851568,3505
"byteLength": 786384,3506
"target": 349623507
},3508
{3509
"buffer": 0,3510
"byteOffset": 1637952,3511
"byteLength": 524256,3512
"target": 349623513
},3514
{3515
"buffer": 0,3516
"byteOffset": 2162208,3517
"byteLength": 1150704,3518
"target": 349633519
},3520
{3521
"buffer": 0,3522
"byteOffset": 3312912,3523
"byteLength": 109788,3524
"target": 349623525
},3526
{3527
"buffer": 0,3528
"byteOffset": 3422700,3529
"byteLength": 109788,3530
"target": 349623531
},3532
{3533
"buffer": 0,3534
"byteOffset": 3532488,3535
"byteLength": 73192,3536
"target": 349623537
},3538
{3539
"buffer": 0,3540
"byteOffset": 3605680,3541
"byteLength": 133584,3542
"target": 349633543
},3544
{3545
"buffer": 0,3546
"byteOffset": 3739264,3547
"byteLength": 3000,3548
"target": 349623549
},3550
{3551
"buffer": 0,3552
"byteOffset": 3742264,3553
"byteLength": 3000,3554
"target": 349623555
},3556
{3557
"buffer": 0,3558
"byteOffset": 3745264,3559
"byteLength": 2000,3560
"target": 349623561
},3562
{3563
"buffer": 0,3564
"byteOffset": 3747264,3565
"byteLength": 4416,3566
"target": 349633567
},3568
{3569
"buffer": 0,3570
"byteOffset": 3751680,3571
"byteLength": 34563572
},3573
{3574
"buffer": 0,3575
"byteOffset": 3755136,3576
"byteLength": 992,3577
"target": 349623578
},3579
{3580
"buffer": 0,3581
"byteOffset": 3756128,3582
"byteLength": 1984,3583
"target": 349623584
},3585
{3586
"buffer": 0,3587
"byteOffset": 3758112,3588
"byteLength": 4192,3589
"target": 349623590
},3591
{3592
"buffer": 0,3593
"byteOffset": 3762304,3594
"byteLength": 8384,3595
"target": 349623596
},3597
{3598
"buffer": 0,3599
"byteOffset": 3770688,3600
"byteLength": 4416,3601
"target": 349623602
},3603
{3604
"buffer": 0,3605
"byteOffset": 3775104,3606
"byteLength": 8832,3607
"target": 349623608
},3609
{3610
"buffer": 0,3611
"byteOffset": 3783936,3612
"byteLength": 524256,3613
"target": 349623614
},3615
{3616
"buffer": 0,3617
"byteOffset": 4308192,3618
"byteLength": 1048512,3619
"target": 349623620
},3621
{3622
"buffer": 0,3623
"byteOffset": 5356704,3624
"byteLength": 73192,3625
"target": 349623626
},3627
{3628
"buffer": 0,3629
"byteOffset": 5429896,3630
"byteLength": 146384,3631
"target": 349623632
},3633
{3634
"buffer": 0,3635
"byteOffset": 5576280,3636
"byteLength": 2000,3637
"target": 349623638
},3639
{3640
"buffer": 0,3641
"byteOffset": 5578280,3642
"byteLength": 4000,3643
"target": 349623644
},3645
{3646
"buffer": 0,3647
"byteOffset": 5582280,3648
"byteLength": 1163649
},3650
{3651
"buffer": 0,3652
"byteOffset": 5582396,3653
"byteLength": 4643654
},3655
{3656
"buffer": 0,3657
"byteOffset": 5582860,3658
"byteLength": 1923659
},3660
{3661
"buffer": 0,3662
"byteOffset": 5583052,3663
"byteLength": 7683664
},3665
{3666
"buffer": 0,3667
"byteOffset": 5583820,3668
"byteLength": 1923669
},3670
{3671
"buffer": 0,3672
"byteOffset": 5584012,3673
"byteLength": 7683674
},3675
{3676
"buffer": 0,3677
"byteOffset": 5584780,3678
"byteLength": 1163679
},3680
{3681
"buffer": 0,3682
"byteOffset": 5584896,3683
"byteLength": 4643684
},3685
{3686
"buffer": 0,3687
"byteOffset": 5585360,3688
"byteLength": 1923689
},3690
{3691
"buffer": 0,3692
"byteOffset": 5585552,3693
"byteLength": 7683694
},3695
{3696
"buffer": 0,3697
"byteOffset": 5586320,3698
"byteLength": 43699
},3700
{3701
"buffer": 0,3702
"byteOffset": 5586324,3703
"byteLength": 123704
},3705
{3706
"buffer": 0,3707
"byteOffset": 5586336,3708
"byteLength": 1923709
},3710
{3711
"buffer": 0,3712
"byteOffset": 5586528,3713
"byteLength": 7683714
},3715
{3716
"buffer": 0,3717
"byteOffset": 5587296,3718
"byteLength": 43719
},3720
{3721
"buffer": 0,3722
"byteOffset": 5587300,3723
"byteLength": 123724
},3725
{3726
"buffer": 0,3727
"byteOffset": 5587312,3728
"byteLength": 1163729
},3730
{3731
"buffer": 0,3732
"byteOffset": 5587428,3733
"byteLength": 4643734
},3735
{3736
"buffer": 0,3737
"byteOffset": 5587892,3738
"byteLength": 1923739
},3740
{3741
"buffer": 0,3742
"byteOffset": 5588084,3743
"byteLength": 7683744
},3745
{3746
"buffer": 0,3747
"byteOffset": 5588852,3748
"byteLength": 1923749
},3750
{3751
"buffer": 0,3752
"byteOffset": 5589044,3753
"byteLength": 7683754
},3755
{3756
"buffer": 0,3757
"byteOffset": 5589812,3758
"byteLength": 1163759
},3760
{3761
"buffer": 0,3762
"byteOffset": 5589928,3763
"byteLength": 4643764
},3765
{3766
"buffer": 0,3767
"byteOffset": 5590392,3768
"byteLength": 1923769
},3770
{3771
"buffer": 0,3772
"byteOffset": 5590584,3773
"byteLength": 7683774
},3775
{3776
"buffer": 0,3777
"byteOffset": 5591352,3778
"byteLength": 1923779
},3780
{3781
"buffer": 0,3782
"byteOffset": 5591544,3783
"byteLength": 7683784
},3785
{3786
"buffer": 0,3787
"byteOffset": 5592312,3788
"byteLength": 1163789
},3790
{3791
"buffer": 0,3792
"byteOffset": 5592428,3793
"byteLength": 4643794
},3795
{3796
"buffer": 0,3797
"byteOffset": 5592892,3798
"byteLength": 43799
},3800
{3801
"buffer": 0,3802
"byteOffset": 5592896,3803
"byteLength": 123804
},3805
{3806
"buffer": 0,3807
"byteOffset": 5592908,3808
"byteLength": 1163809
},3810
{3811
"buffer": 0,3812
"byteOffset": 5593024,3813
"byteLength": 4643814
},3815
{3816
"buffer": 0,3817
"byteOffset": 5593488,3818
"byteLength": 43819
},3820
{3821
"buffer": 0,3822
"byteOffset": 5593492,3823
"byteLength": 123824
},3825
{3826
"buffer": 0,3827
"byteOffset": 5593504,3828
"byteLength": 1123829
},3830
{3831
"buffer": 0,3832
"byteOffset": 5593616,3833
"byteLength": 4483834
},3835
{3836
"buffer": 0,3837
"byteOffset": 5594064,3838
"byteLength": 1603839
},3840
{3841
"buffer": 0,3842
"byteOffset": 5594224,3843
"byteLength": 4803844
},3845
{3846
"buffer": 0,3847
"byteOffset": 5594704,3848
"byteLength": 1923849
},3850
{3851
"buffer": 0,3852
"byteOffset": 5594896,3853
"byteLength": 7683854
},3855
{3856
"buffer": 0,3857
"byteOffset": 5595664,3858
"byteLength": 1923859
},3860
{3861
"buffer": 0,3862
"byteOffset": 5595856,3863
"byteLength": 7683864
},3865
{3866
"buffer": 0,3867
"byteOffset": 5596624,3868
"byteLength": 43869
},3870
{3871
"buffer": 0,3872
"byteOffset": 5596628,3873
"byteLength": 123874
},3875
{3876
"buffer": 0,3877
"byteOffset": 5596640,3878
"byteLength": 1923879
},3880
{3881
"buffer": 0,3882
"byteOffset": 5596832,3883
"byteLength": 7683884
},3885
{3886
"buffer": 0,3887
"byteOffset": 5597600,3888
"byteLength": 1923889
},3890
{3891
"buffer": 0,3892
"byteOffset": 5597792,3893
"byteLength": 5763894
},3895
{3896
"buffer": 0,3897
"byteOffset": 5598368,3898
"byteLength": 1923899
},3900
{3901
"buffer": 0,3902
"byteOffset": 5598560,3903
"byteLength": 7683904
},3905
{3906
"buffer": 0,3907
"byteOffset": 5599328,3908
"byteLength": 1163909
},3910
{3911
"buffer": 0,3912
"byteOffset": 5599444,3913
"byteLength": 4643914
},3915
{3916
"buffer": 0,3917
"byteOffset": 5599908,3918
"byteLength": 1523919
},3920
{3921
"buffer": 0,3922
"byteOffset": 5600060,3923
"byteLength": 6083924
},3925
{3926
"buffer": 0,3927
"byteOffset": 5600668,3928
"byteLength": 43929
},3930
{3931
"buffer": 0,3932
"byteOffset": 5600672,3933
"byteLength": 123934
},3935
{3936
"buffer": 0,3937
"byteOffset": 5600684,3938
"byteLength": 1923939
},3940
{3941
"buffer": 0,3942
"byteOffset": 5600876,3943
"byteLength": 7683944
},3945
{3946
"buffer": 0,3947
"byteOffset": 5601644,3948
"byteLength": 1163949
},3950
{3951
"buffer": 0,3952
"byteOffset": 5601760,3953
"byteLength": 4643954
},3955
{3956
"buffer": 0,3957
"byteOffset": 5602224,3958
"byteLength": 1923959
},3960
{3961
"buffer": 0,3962
"byteOffset": 5602416,3963
"byteLength": 7683964
},3965
{3966
"buffer": 0,3967
"byteOffset": 5603184,3968
"byteLength": 43969
},3970
{3971
"buffer": 0,3972
"byteOffset": 5603188,3973
"byteLength": 123974
},3975
{3976
"buffer": 0,3977
"byteOffset": 5603200,3978
"byteLength": 1923979
},3980
{3981
"buffer": 0,3982
"byteOffset": 5603392,3983
"byteLength": 7683984
},3985
{3986
"buffer": 0,3987
"byteOffset": 5604160,3988
"byteLength": 43693
},3989
},3694
{3990
{3695
"channels": [3991
"buffer": 0,3696
{3992
"byteOffset": 5604164,3697
"sampler": 0,3993
"byteLength": 123698
"target": {3699
"node": 8,3700
"path": "rotation"3701
}3702
}3703
],3704
"name": "FemaleArmature|ponytail01MeshAction.001",3705
"samplers": [3706
{3707
"input": 183,3708
"interpolation": "LINEAR",3709
"output": 1843710
}3711
]3712
}3713
],3714
"asset": {3715
"extras": {3716
"author": "assetfactory (https://sketchfab.com/assetfactory)",3717
"license": "SKETCHFAB Standard (https://sketchfab.com/licenses)",3718
"source": "https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec",3719
"title": "Animated Female Base Mesh"3720
},3994
},3721
"generator": "Sketchfab-16.33.0",3722
"version": "2.0"3723
},3724
"bufferViews": [3725
{3995
{3726
"buffer": 0,3996
"buffer": 0,3727
"byteLength": 640264,3997
"byteOffset": 5604176,3728
"byteStride": 8,3998
"byteLength": 1163729
"name": "shortBufferViews",3730
"target": 349623731
},3999
},3732
{4000
{3733
"buffer": 0,4001
"buffer": 0,3734
"byteLength": 1379712,4002
"byteOffset": 5604292,3735
"byteOffset": 640264,4003
"byteLength": 4643736
"name": "floatBufferViews",3737
"target": 349633738
},4004
},3739
{4005
{3740
"buffer": 0,4006
"buffer": 0,3741
"byteLength": 640264,4007
"byteOffset": 5604756,3742
"byteOffset": 2019976,4008
"byteLength": 1923743
"byteStride": 8,3744
"name": "floatBufferViews",3745
"target": 349623746
},4009
},3747
{4010
{3748
"buffer": 0,4011
"buffer": 0,3749
"byteLength": 1920792,4012
"byteOffset": 5604948,3750
"byteOffset": 2660240,4013
"byteLength": 7683751
"byteStride": 12,3752
"name": "floatBufferViews",3753
"target": 349623754
},4014
},3755
{4015
{3756
"buffer": 0,4016
"buffer": 0,3757
"byteLength": 1280528,4017
"byteOffset": 5605716,3758
"byteOffset": 4581032,4018
"byteLength": 43759
"byteStride": 16,4019
},3760
"name": "floatBufferViews",4020
{3761
"target": 349624021
"buffer": 0,4022
"byteOffset": 5605720,4023
"byteLength": 124024
},4025
{4026
"buffer": 0,4027
"byteOffset": 5605732,4028
"byteLength": 1924029
},4030
{4031
"buffer": 0,4032
"byteOffset": 5605924,4033
"byteLength": 7684034
},4035
{4036
"buffer": 0,4037
"byteOffset": 5606692,4038
"byteLength": 1164039
},4040
{4041
"buffer": 0,4042
"byteOffset": 5606808,4043
"byteLength": 4644044
},4045
{4046
"buffer": 0,4047
"byteOffset": 5607272,4048
"byteLength": 1924049
},4050
{4051
"buffer": 0,4052
"byteOffset": 5607464,4053
"byteLength": 7684054
},4055
{4056
"buffer": 0,4057
"byteOffset": 5608232,4058
"byteLength": 44059
},4060
{4061
"buffer": 0,4062
"byteOffset": 5608236,4063
"byteLength": 124064
},4065
{4066
"buffer": 0,4067
"byteOffset": 5608248,4068
"byteLength": 1924069
},4070
{4071
"buffer": 0,4072
"byteOffset": 5608440,4073
"byteLength": 7684074
},4075
{4076
"buffer": 0,4077
"byteOffset": 5609208,4078
"byteLength": 1164079
},4080
{4081
"buffer": 0,4082
"byteOffset": 5609324,4083
"byteLength": 4644084
},4085
{4086
"buffer": 0,4087
"byteOffset": 5609788,4088
"byteLength": 1924089
},4090
{4091
"buffer": 0,4092
"byteOffset": 5609980,4093
"byteLength": 7684094
},4095
{4096
"buffer": 0,4097
"byteOffset": 5610748,4098
"byteLength": 44099
},4100
{4101
"buffer": 0,4102
"byteOffset": 5610752,4103
"byteLength": 124104
},4105
{4106
"buffer": 0,4107
"byteOffset": 5610764,4108
"byteLength": 1724109
},4110
{4111
"buffer": 0,4112
"byteOffset": 5610936,4113
"byteLength": 6884114
},4115
{4116
"buffer": 0,4117
"byteOffset": 5611624,4118
"byteLength": 1924119
},4120
{4121
"buffer": 0,4122
"byteOffset": 5611816,4123
"byteLength": 7684124
},4125
{4126
"buffer": 0,4127
"byteOffset": 5612584,4128
"byteLength": 1924129
},4130
{4131
"buffer": 0,4132
"byteOffset": 5612776,4133
"byteLength": 7684134
},4135
{4136
"buffer": 0,4137
"byteOffset": 5613544,4138
"byteLength": 1924139
},4140
{4141
"buffer": 0,4142
"byteOffset": 5613736,4143
"byteLength": 7684144
},4145
{4146
"buffer": 0,4147
"byteOffset": 5614504,4148
"byteLength": 1924149
},4150
{4151
"buffer": 0,4152
"byteOffset": 5614696,4153
"byteLength": 5764154
},4155
{4156
"buffer": 0,4157
"byteOffset": 5615272,4158
"byteLength": 1924159
},4160
{4161
"buffer": 0,4162
"byteOffset": 5615464,4163
"byteLength": 7684164
},4165
{4166
"buffer": 0,4167
"byteOffset": 5616232,4168
"byteLength": 1164169
},4170
{4171
"buffer": 0,4172
"byteOffset": 5616348,4173
"byteLength": 4644174
},4175
{4176
"buffer": 0,4177
"byteOffset": 5616812,4178
"byteLength": 1924179
},4180
{4181
"buffer": 0,4182
"byteOffset": 5617004,4183
"byteLength": 7684184
},4185
{4186
"buffer": 0,4187
"byteOffset": 5617772,4188
"byteLength": 44189
},4190
{4191
"buffer": 0,4192
"byteOffset": 5617776,4193
"byteLength": 124194
},4195
{4196
"buffer": 0,4197
"byteOffset": 5617788,4198
"byteLength": 1164199
},4200
{4201
"buffer": 0,4202
"byteOffset": 5617904,4203
"byteLength": 4644204
},4205
{4206
"buffer": 0,4207
"byteOffset": 5618368,4208
"byteLength": 844209
},4210
{4211
"buffer": 0,4212
"byteOffset": 5618452,4213
"byteLength": 2524214
},4215
{4216
"buffer": 0,4217
"byteOffset": 5618704,4218
"byteLength": 1164219
},4220
{4221
"buffer": 0,4222
"byteOffset": 5618820,4223
"byteLength": 4644224
},4225
{4226
"buffer": 0,4227
"byteOffset": 5619284,4228
"byteLength": 1924229
},4230
{4231
"buffer": 0,4232
"byteOffset": 5619476,4233
"byteLength": 7684234
},4235
{4236
"buffer": 0,4237
"byteOffset": 5620244,4238
"byteLength": 1924239
},4240
{4241
"buffer": 0,4242
"byteOffset": 5620436,4243
"byteLength": 7684244
},4245
{4246
"buffer": 0,4247
"byteOffset": 5621204,4248
"byteLength": 1924249
},4250
{4251
"buffer": 0,4252
"byteOffset": 5621396,4253
"byteLength": 7684254
},4255
{4256
"buffer": 0,4257
"byteOffset": 5622164,4258
"byteLength": 1924259
},4260
{4261
"buffer": 0,4262
"byteOffset": 5622356,4263
"byteLength": 7684264
},4265
{4266
"buffer": 0,4267
"byteOffset": 5623124,4268
"byteLength": 1924269
},4270
{4271
"buffer": 0,4272
"byteOffset": 5623316,4273
"byteLength": 5764274
},4275
{4276
"buffer": 0,4277
"byteOffset": 5623892,4278
"byteLength": 1924279
},4280
{4281
"buffer": 0,4282
"byteOffset": 5624084,4283
"byteLength": 7683762
},4284
},3763
{4285
{3764
"buffer": 0,4286
"buffer": 0,3765
"byteLength": 3456,4287
"byteOffset": 5624852,3766
"byteOffset": 5861560,4288
"byteLength": 1923767
"name": "floatBufferViews"3768
},4289
},3769
{4290
{3770
"buffer": 0,4291
"buffer": 0,3771
"byteLength": 9844,4292
"byteOffset": 5625044,3772
"byteOffset": 5865016,4293
"byteLength": 7683773
"name": "floatBufferViews"3774
},4294
},3775
{4295
{3776
"buffer": 0,4296
"buffer": 0,3777
"byteLength": 3756,4297
"byteOffset": 5625812,3778
"byteOffset": 5874860,4298
"byteLength": 1923779
"byteStride": 12,3780
"name": "floatBufferViews"3781
},4299
},3782
{4300
{3783
"buffer": 0,4301
"buffer": 0,3784
"byteLength": 34368,4302
"byteOffset": 5626004,3785
"byteOffset": 5878616,4303
"byteLength": 7683786
"byteStride": 16,4304
},3787
"name": "floatBufferViews"4305
{4306
"buffer": 0,4307
"byteOffset": 5626772,4308
"byteLength": 1924309
},4310
{4311
"buffer": 0,4312
"byteOffset": 5626964,4313
"byteLength": 7684314
},4315
{4316
"buffer": 0,4317
"byteOffset": 5627732,4318
"byteLength": 1924319
},4320
{4321
"buffer": 0,4322
"byteOffset": 5627924,4323
"byteLength": 5764324
},4325
{4326
"buffer": 0,4327
"byteOffset": 5628500,4328
"byteLength": 1924329
},4330
{4331
"buffer": 0,4332
"byteOffset": 5628692,4333
"byteLength": 7684334
},4335
{4336
"buffer": 0,4337
"byteOffset": 5629460,4338
"byteLength": 1924339
},4340
{4341
"buffer": 0,4342
"byteOffset": 5629652,4343
"byteLength": 5763788
}4344
}3789
],4345
],3790
"buffers": [4346
"buffers": [3791
{4347
{3792
"byteLength": 5912984,4348
"byteLength": 5630228,3793
"uri": "female.bin"4349
"uri": "female.bin"3794
}4350
}3795
],4351
],@@ -3805,9 +4361,6 @@3805
},4361
},3806
{4362
{3807
"uri": "textures/eyelashes03.002_baseColor.png"4363
"uri": "textures/eyelashes03.002_baseColor.png"3808
},3809
{3810
"uri": "textures/ponytail01_baseColor.png"3811
}4364
}3812
],4365
],3813
"materials": [4366
"materials": [@@ -3870,18 +4423,6 @@3870
"metallicFactor": 0.0,4423
"metallicFactor": 0.0,3871
"roughnessFactor": 0.91591035854424
"roughnessFactor": 0.91591035853872
}4425
}3873
},3874
{3875
"alphaMode": "BLEND",3876
"doubleSided": true,3877
"name": "ponytail01",3878
"pbrMetallicRoughness": {3879
"baseColorTexture": {3880
"index": 43881
},3882
"metallicFactor": 0.0,3883
"roughnessFactor": 0.63613395843884
}3885
}4426
}3886
],4427
],3887
"meshes": [4428
"meshes": [@@ -3890,11 +4431,11 @@3890
"primitives": [4431
"primitives": [3891
{4432
{3892
"attributes": {4433
"attributes": {3893
"JOINTS_0": 29,4434
"JOINTS_0": 25,3894
"NORMAL": 1,4435
"NORMAL": 1,3895
"POSITION": 0,4436
"POSITION": 0,3896
"TEXCOORD_0": 2,4437
"TEXCOORD_0": 2,3897
"WEIGHTS_0": 304438
"WEIGHTS_0": 263898
},4439
},3899
"indices": 3,4440
"indices": 3,3900
"material": 0,4441
"material": 0,@@ -3907,11 +4448,11 @@3907
"primitives": [4448
"primitives": [3908
{4449
{3909
"attributes": {4450
"attributes": {3910
"JOINTS_0": 31,4451
"JOINTS_0": 27,3911
"NORMAL": 5,4452
"NORMAL": 5,3912
"POSITION": 4,4453
"POSITION": 4,3913
"TEXCOORD_0": 6,4454
"TEXCOORD_0": 6,3914
"WEIGHTS_0": 324455
"WEIGHTS_0": 283915
},4456
},3916
"indices": 7,4457
"indices": 7,3917
"material": 1,4458
"material": 1,@@ -3924,11 +4465,11 @@3924
"primitives": [4465
"primitives": [3925
{4466
{3926
"attributes": {4467
"attributes": {3927
"JOINTS_0": 33,4468
"JOINTS_0": 29,3928
"NORMAL": 9,4469
"NORMAL": 9,3929
"POSITION": 8,4470
"POSITION": 8,3930
"TEXCOORD_0": 10,4471
"TEXCOORD_0": 10,3931
"WEIGHTS_0": 344472
"WEIGHTS_0": 303932
},4473
},3933
"indices": 11,4474
"indices": 11,3934
"material": 2,4475
"material": 2,@@ -3941,11 +4482,11 @@3941
"primitives": [4482
"primitives": [3942
{4483
{3943
"attributes": {4484
"attributes": {3944
"JOINTS_0": 35,4485
"JOINTS_0": 31,3945
"NORMAL": 13,4486
"NORMAL": 13,3946
"POSITION": 12,4487
"POSITION": 12,3947
"TEXCOORD_0": 14,4488
"TEXCOORD_0": 14,3948
"WEIGHTS_0": 364489
"WEIGHTS_0": 323949
},4490
},3950
"indices": 15,4491
"indices": 15,3951
"material": 3,4492
"material": 3,@@ -3958,11 +4499,11 @@3958
"primitives": [4499
"primitives": [3959
{4500
{3960
"attributes": {4501
"attributes": {3961
"JOINTS_0": 37,4502
"JOINTS_0": 33,3962
"NORMAL": 17,4503
"NORMAL": 17,3963
"POSITION": 16,4504
"POSITION": 16,3964
"TEXCOORD_0": 18,4505
"TEXCOORD_0": 18,3965
"WEIGHTS_0": 384506
"WEIGHTS_0": 343966
},4507
},3967
"indices": 19,4508
"indices": 19,3968
"material": 3,4509
"material": 3,@@ -3975,34 +4516,17 @@3975
"primitives": [4516
"primitives": [3976
{4517
{3977
"attributes": {4518
"attributes": {3978
"JOINTS_0": 39,4519
"JOINTS_0": 35,3979
"NORMAL": 21,4520
"NORMAL": 21,3980
"POSITION": 20,4521
"POSITION": 20,3981
"TEXCOORD_0": 22,4522
"TEXCOORD_0": 22,3982
"WEIGHTS_0": 404523
"WEIGHTS_0": 363983
},4524
},3984
"indices": 23,4525
"indices": 23,3985
"material": 4,4526
"material": 4,3986
"mode": 44527
"mode": 43987
}4528
}3988
]4529
]3989
},3990
{3991
"name": "ponytail01Mesh_ponytail01_0",3992
"primitives": [3993
{3994
"attributes": {3995
"JOINTS_0": 41,3996
"NORMAL": 25,3997
"POSITION": 24,3998
"TEXCOORD_0": 26,3999
"WEIGHTS_0": 424000
},4001
"indices": 27,4002
"material": 5,4003
"mode": 44004
}4005
]4006
}4530
}4007
],4531
],4008
"nodes": [4532
"nodes": [@@ -4668,7 +5192,7 @@4668
],5192
],4669
"translation": [5193
"translation": [4670
-4.172325134277344e-07,5194
-4.172325134277344e-07,4671
0.13778707385063171,5195
0.1377870738506317,4672
-6.854534149169922e-075196
-6.854534149169922e-074673
]5197
]4674
},5198
},@@ -5127,7 +5651,7 @@5127
1.05651
1.05128
],5652
],5129
"translation": [5653
"translation": [5130
2.9802322387695313e-08,5654
2.9802322387695312e-08,5131
0.21817153692245483,5655
0.21817153692245483,5132
4.470348358154297e-085656
4.470348358154297e-085133
]5657
]@@ -5192,7 +5716,7 @@5192
"translation": [5716
"translation": [5193
8.940696716308594e-08,5717
8.940696716308594e-08,5194
0.32236427068710327,5718
0.32236427068710327,5195
2.9802322387695313e-085719
2.9802322387695312e-085196
]5720
]5197
},5721
},5198
{5722
{@@ -5423,9 +5947,7 @@5423
"name": "Object_74"5947
"name": "Object_74"5424
},5948
},5425
{5949
{5426
"mesh": 6,5950
"name": "Object_75"5427
"name": "Object_75",5428
"skin": 05429
},5951
},5430
{5952
{5431
"name": "ponytail01Mesh",5953
"name": "ponytail01Mesh",@@ -5461,7 +5983,7 @@5461
],5983
],5462
"skins": [5984
"skins": [5463
{5985
{5464
"inverseBindMatrices": 28,5986
"inverseBindMatrices": 24,5465
"joints": [5987
"joints": [5466
10,5988
10,5467
21,5989
21,@@ -5537,10 +6059,6 @@5537
{6059
{5538
"sampler": 0,6060
"sampler": 0,5539
"source": 36061
"source": 35540
},5541
{5542
"sampler": 0,5543
"source": 45544
}6062
}5545
]6063
]5546
}6064
}The contents of this binary file are not shown.
@@ -549,3 +549,15 @@ Rechecked 7 November 2026 against the live `GET /api/v1/openapi.json` and BlueGi
549
549
Release tags are annotated `vX.Y.Z` tags pushed by hand on a green master; `v*` is a protected tag pattern, so the protected CI variables are available to the tag pipeline only.
550
550
551
551
A `publish:aur` job after `release` (allow_failure, resource_group aur, Arch image) copies the approach of timfa/legacy-cycles (`aur-ssh-setup.sh` + `publish-aur.sh`): AUR package `paperdoll-renderer-bin` (`packaging/aur/paperdoll-renderer-bin/PKGBUILD`), source = the release's `.deb` asset, sha256 of exactly that downloaded asset, pkgver from the tag, `.SRCINFO` via `makepkg --printsrcinfo`, pushed to `ssh://aur@aur.archlinux.org/paperdoll-renderer-bin.git`. It uses exactly the protected variables `AUR_SSH_PRIVATE_KEY_B64`, `AUR_GIT_AUTHOR_NAME` and `AUR_GIT_AUTHOR_EMAIL`. The PKGBUILD installs the binary, the `.desktop` file, the hicolor icons, the `.ppd` MIME package (`paperdoll-project.xml`), metainfo, LICENSE and THIRD_PARTY_NOTICES; it conflicts with/provides `paperdoll-renderer`.
552
553
## Decision 2026-11-07 (Tim t1016u/t1017u): glTF alphaMode BLEND is blended, not a winning surface
554
555
Per the glTF spec, a `BLEND` material is composited over what is behind it with its alpha (base colour factor alpha × texture alpha × vertex colour alpha). Until now BLEND was treated like an opaque surface with a 0.001 cutoff, so a nearly transparent layer in front (the "Crystal" cornea of Tim's default bodies, alpha 0.08/0.17; also eyebrow, eyelash and hair cards) won the pixel and the eye behind it vanished. Production and the live preview now draw in two groups: all `OPAQUE`/`MASK` surfaces first (depth test + write, cutoff as before), then the `BLEND` surfaces in file order with depth test on, depth write off and straight-alpha "over" blending (`src·a + dst·(1−a)` for colour, `a + dst·(1−a)` for coverage) into diffuse, normal and specular; a final depth-only pass of the BLEND surfaces (alpha > 0.001) writes their depth, so covered pixels still carry the nearest surface depth. The 2D depth compositor and resolve are unchanged. Blending is order-dependent within the BLEND group (no sorting, no OIT); that limitation is accepted.
556
557
## Decision 2026-11-07 (Tim t1015u/t1018u/t1019u/t1020u): bundled female edits and the female hair preset
558
559
Findings in Tim's `female.gltf` (the renderer follows the glTF spec, no renderer change): the file has a second animation `FemaleArmature|ponytail01MeshAction.001` (duration 0, one channel) that sets the `FemaleArmature` node rotation to identity, removing its −90° X rest rotation, so in that clip the whole body lies on its back (rest Y 0.007…1.621 m becomes Y −0.241…0.151, Z 0.007…1.621). It is the lying figure in the extra female atlas row and it inflates "Fit animations" (envelope 4.652 m vs 1.855 m with the walk clip only).
560
561
The bundled default female (asset only, models still load as-is) is edited: that stray animation is removed, and the hair mesh (`Object_75`, material `ponytail01`, 3902 vertices, BLEND) with its material, texture, image and buffer data is removed; the `.bin` is compacted. All other bytes' meaning is unchanged; the edit is listed in THIRD_PARTY_NOTICES/README.
562
563
The removed hair becomes a bundled equipment preset `female-hair` (`.ppe`, female only, its texture embedded). Equipment is rigid: the hair, skinned to several head/neck bones in the source, is baked once at the rest pose and expressed in the rest-pose space of the `head` joint, bound to that joint with zero offset, so at rest it sits exactly where it was and follows the head rigidly (acceptable for hair). Its texture alpha is used with the equipment alpha cutout (0.5), not blended. **Nieuw project** writes it to `presets/female-hair.ppe` and lists it in the project's equipment presets. A generator (`examples/bake_female_hair.rs`) reproduces the edit and the preset from Tim's original files.
@@ -549,3 +549,15 @@ Rechecked 7 November 2026 against the live `GET /api/v1/openapi.json` and BlueGi549
Release tags are annotated `vX.Y.Z` tags pushed by hand on a green master; `v*` is a protected tag pattern, so the protected CI variables are available to the tag pipeline only.549
Release tags are annotated `vX.Y.Z` tags pushed by hand on a green master; `v*` is a protected tag pattern, so the protected CI variables are available to the tag pipeline only.550
550
551
A `publish:aur` job after `release` (allow_failure, resource_group aur, Arch image) copies the approach of timfa/legacy-cycles (`aur-ssh-setup.sh` + `publish-aur.sh`): AUR package `paperdoll-renderer-bin` (`packaging/aur/paperdoll-renderer-bin/PKGBUILD`), source = the release's `.deb` asset, sha256 of exactly that downloaded asset, pkgver from the tag, `.SRCINFO` via `makepkg --printsrcinfo`, pushed to `ssh://aur@aur.archlinux.org/paperdoll-renderer-bin.git`. It uses exactly the protected variables `AUR_SSH_PRIVATE_KEY_B64`, `AUR_GIT_AUTHOR_NAME` and `AUR_GIT_AUTHOR_EMAIL`. The PKGBUILD installs the binary, the `.desktop` file, the hicolor icons, the `.ppd` MIME package (`paperdoll-project.xml`), metainfo, LICENSE and THIRD_PARTY_NOTICES; it conflicts with/provides `paperdoll-renderer`.551
A `publish:aur` job after `release` (allow_failure, resource_group aur, Arch image) copies the approach of timfa/legacy-cycles (`aur-ssh-setup.sh` + `publish-aur.sh`): AUR package `paperdoll-renderer-bin` (`packaging/aur/paperdoll-renderer-bin/PKGBUILD`), source = the release's `.deb` asset, sha256 of exactly that downloaded asset, pkgver from the tag, `.SRCINFO` via `makepkg --printsrcinfo`, pushed to `ssh://aur@aur.archlinux.org/paperdoll-renderer-bin.git`. It uses exactly the protected variables `AUR_SSH_PRIVATE_KEY_B64`, `AUR_GIT_AUTHOR_NAME` and `AUR_GIT_AUTHOR_EMAIL`. The PKGBUILD installs the binary, the `.desktop` file, the hicolor icons, the `.ppd` MIME package (`paperdoll-project.xml`), metainfo, LICENSE and THIRD_PARTY_NOTICES; it conflicts with/provides `paperdoll-renderer`.552
553
## Decision 2026-11-07 (Tim t1016u/t1017u): glTF alphaMode BLEND is blended, not a winning surface554
555
Per the glTF spec, a `BLEND` material is composited over what is behind it with its alpha (base colour factor alpha × texture alpha × vertex colour alpha). Until now BLEND was treated like an opaque surface with a 0.001 cutoff, so a nearly transparent layer in front (the "Crystal" cornea of Tim's default bodies, alpha 0.08/0.17; also eyebrow, eyelash and hair cards) won the pixel and the eye behind it vanished. Production and the live preview now draw in two groups: all `OPAQUE`/`MASK` surfaces first (depth test + write, cutoff as before), then the `BLEND` surfaces in file order with depth test on, depth write off and straight-alpha "over" blending (`src·a + dst·(1−a)` for colour, `a + dst·(1−a)` for coverage) into diffuse, normal and specular; a final depth-only pass of the BLEND surfaces (alpha > 0.001) writes their depth, so covered pixels still carry the nearest surface depth. The 2D depth compositor and resolve are unchanged. Blending is order-dependent within the BLEND group (no sorting, no OIT); that limitation is accepted.556
557
## Decision 2026-11-07 (Tim t1015u/t1018u/t1019u/t1020u): bundled female edits and the female hair preset558
559
Findings in Tim's `female.gltf` (the renderer follows the glTF spec, no renderer change): the file has a second animation `FemaleArmature|ponytail01MeshAction.001` (duration 0, one channel) that sets the `FemaleArmature` node rotation to identity, removing its −90° X rest rotation, so in that clip the whole body lies on its back (rest Y 0.007…1.621 m becomes Y −0.241…0.151, Z 0.007…1.621). It is the lying figure in the extra female atlas row and it inflates "Fit animations" (envelope 4.652 m vs 1.855 m with the walk clip only).560
561
The bundled default female (asset only, models still load as-is) is edited: that stray animation is removed, and the hair mesh (`Object_75`, material `ponytail01`, 3902 vertices, BLEND) with its material, texture, image and buffer data is removed; the `.bin` is compacted. All other bytes' meaning is unchanged; the edit is listed in THIRD_PARTY_NOTICES/README.562
563
The removed hair becomes a bundled equipment preset `female-hair` (`.ppe`, female only, its texture embedded). Equipment is rigid: the hair, skinned to several head/neck bones in the source, is baked once at the rest pose and expressed in the rest-pose space of the `head` joint, bound to that joint with zero offset, so at rest it sits exactly where it was and follows the head rigidly (acceptable for hair). Its texture alpha is used with the equipment alpha cutout (0.5), not blended. **Nieuw project** writes it to `presets/female-hair.ppe` and lists it in the project's equipment presets. A generator (`examples/bake_female_hair.rs`) reproduces the edit and the preset from Tim's original files.@@ -0,0 +1,133 @@
1
#![allow(clippy::needless_range_loop)]
2
//! Bakes the hair of Tim's original "Animated Female Base Mesh" into the
3
//! bundled rigid equipment preset `female-hair` (design.md, t1019u): the hair
4
//! primitive (material ponytail01, last primitive) is skinned once at the rest
5
//! pose, expressed in the rest-pose space of the `head` joint, written as
6
//! OBJ + MTL + PNG, imported with the normal OBJ importer and bound to `head`
7
//! of the edited default female with zero offset.
8
//! Usage: bake_female_hair ORIGINAL_FEMALE.gltf HAIR_TEXTURE.png EDITED_FEMALE.gltf OUT.ppe
9
use paperdoll_renderer::{equipment, preview};
10
use std::io::Write;
11
12
fn inverse(m: [f32; 16]) -> [f32; 16] {
13
let mut a = [[0f64; 8]; 4];
14
for r in 0..4 {
15
for c in 0..4 {
16
a[r][c] = m[c * 4 + r] as f64;
17
}
18
a[r][4 + r] = 1.;
19
}
20
for c in 0..4 {
21
let p = (c..4)
22
.max_by(|&x, &y| a[x][c].abs().total_cmp(&a[y][c].abs()))
23
.unwrap();
24
a.swap(c, p);
25
let d = a[c][c];
26
for k in 0..8 {
27
a[c][k] /= d;
28
}
29
for r in 0..4 {
30
if r != c {
31
let f = a[r][c];
32
for k in 0..8 {
33
a[r][k] -= f * a[c][k];
34
}
35
}
36
}
37
}
38
let mut out = [0f32; 16];
39
for r in 0..4 {
40
for c in 0..4 {
41
out[c * 4 + r] = a[r][4 + c] as f32;
42
}
43
}
44
out
45
}
46
fn apply(m: &[f32; 16], p: [f32; 3], w: f32) -> [f32; 3] {
47
[0, 1, 2].map(|i| m[i] * p[0] + m[4 + i] * p[1] + m[8 + i] * p[2] + m[12 + i] * w)
48
}
49
50
fn main() -> Result<(), Box<dyn std::error::Error>> {
51
let a: Vec<String> = std::env::args().skip(1).collect();
52
let body = preview::load_body_file(std::path::Path::new(&a[0]))?;
53
let hair = body.surfaces.last().ok_or("no surfaces")?;
54
let bones: Vec<[f32; 16]> = (0..body.joint_nodes.len())
55
.map(|j| {
56
preview::mul(
57
preview::rest_joint_world(&body, j).unwrap(),
58
body.inverse_binds[j],
59
)
60
})
61
.collect();
62
let head = body
63
.joint_names
64
.iter()
65
.position(|n| n.to_ascii_lowercase().starts_with("head"))
66
.ok_or("no head joint")?;
67
let head_world = preview::animated_joint_world(&body, "", 0.0, head).ok_or("head")?;
68
let to_head = inverse(head_world);
69
let idx = &body.indices[hair.first..hair.first + hair.count];
70
let mut used: Vec<u32> = idx.to_vec();
71
used.sort_unstable();
72
used.dedup();
73
let map: std::collections::HashMap<u32, usize> =
74
used.iter().enumerate().map(|(i, v)| (*v, i + 1)).collect();
75
let dir = tempdir();
76
let mut obj = std::fs::File::create(dir.join("female-hair.obj"))?;
77
writeln!(obj, "# Hair of \"Animated Female Base Mesh\" by assetfactory (Sketchfab Standard), baked rigid to {}", body.joint_names[head])?;
78
writeln!(obj, "mtllib female-hair.mtl\nusemtl hair")?;
79
for v in &used {
80
let i = *v as usize;
81
let mut m = [0f32; 16];
82
for (j, w) in body.joints[i].iter().zip(body.weights[i]) {
83
for k in 0..16 {
84
m[k] += bones[*j as usize][k] * w;
85
}
86
}
87
let p = apply(&to_head, apply(&m, body.positions[i], 1.), 1.);
88
let n = apply(&to_head, apply(&m, body.normals[i], 0.), 0.);
89
let l = (n[0] * n[0] + n[1] * n[1] + n[2] * n[2]).sqrt().max(1e-9);
90
let uv = body.uvs[i];
91
writeln!(obj, "v {} {} {}", p[0], p[1], p[2])?;
92
writeln!(obj, "vt {} {}", uv[0], 1. - uv[1])?;
93
writeln!(obj, "vn {} {} {}", n[0] / l, n[1] / l, n[2] / l)?;
94
}
95
for t in idx.chunks_exact(3) {
96
let f = [map[&t[0]], map[&t[1]], map[&t[2]]];
97
writeln!(
98
obj,
99
"f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}",
100
f[0], f[1], f[2]
101
)?;
102
}
103
drop(obj);
104
std::fs::write(
105
dir.join("female-hair.mtl"),
106
"newmtl hair\nKd 1 1 1\nmap_Kd female-hair.png\n",
107
)?;
108
std::fs::copy(&a[1], dir.join("female-hair.png"))?;
109
let edited = preview::load_body_file(std::path::Path::new(&a[2]))?;
110
let mut preset = equipment::Preset::new("female-hair".into());
111
preset.applies = [false, true];
112
preset.provenance = "Hair of \"Animated Female Base Mesh\" by assetfactory, https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec, Sketchfab Standard licence. Baked rigid to the head joint at the rest pose (was skinned to several bones).".into();
113
let part = equipment::import_obj(&mut preset, &dir.join("female-hair.obj"))?;
114
let head_edited = edited
115
.joint_names
116
.iter()
117
.position(|n| n == &body.joint_names[head])
118
.ok_or("head missing in edited body")?;
119
preset.bind(1, &edited, part, head_edited)?;
120
std::fs::write(&a[3], preset.encode()?)?;
121
println!(
122
"hair: {} vertices, {} triangles, bound to {}",
123
used.len(),
124
idx.len() / 3,
125
body.joint_names[head]
126
);
127
Ok(())
128
}
129
fn tempdir() -> std::path::PathBuf {
130
let d = std::env::temp_dir().join(format!("bake-hair-{}", std::process::id()));
131
std::fs::create_dir_all(&d).unwrap();
132
d
133
}
@@ -0,0 +1,133 @@1
#![allow(clippy::needless_range_loop)]2
//! Bakes the hair of Tim's original "Animated Female Base Mesh" into the3
//! bundled rigid equipment preset `female-hair` (design.md, t1019u): the hair4
//! primitive (material ponytail01, last primitive) is skinned once at the rest5
//! pose, expressed in the rest-pose space of the `head` joint, written as6
//! OBJ + MTL + PNG, imported with the normal OBJ importer and bound to `head`7
//! of the edited default female with zero offset.8
//! Usage: bake_female_hair ORIGINAL_FEMALE.gltf HAIR_TEXTURE.png EDITED_FEMALE.gltf OUT.ppe9
use paperdoll_renderer::{equipment, preview};10
use std::io::Write;11
12
fn inverse(m: [f32; 16]) -> [f32; 16] {13
let mut a = [[0f64; 8]; 4];14
for r in 0..4 {15
for c in 0..4 {16
a[r][c] = m[c * 4 + r] as f64;17
}18
a[r][4 + r] = 1.;19
}20
for c in 0..4 {21
let p = (c..4)22
.max_by(|&x, &y| a[x][c].abs().total_cmp(&a[y][c].abs()))23
.unwrap();24
a.swap(c, p);25
let d = a[c][c];26
for k in 0..8 {27
a[c][k] /= d;28
}29
for r in 0..4 {30
if r != c {31
let f = a[r][c];32
for k in 0..8 {33
a[r][k] -= f * a[c][k];34
}35
}36
}37
}38
let mut out = [0f32; 16];39
for r in 0..4 {40
for c in 0..4 {41
out[c * 4 + r] = a[r][4 + c] as f32;42
}43
}44
out45
}46
fn apply(m: &[f32; 16], p: [f32; 3], w: f32) -> [f32; 3] {47
[0, 1, 2].map(|i| m[i] * p[0] + m[4 + i] * p[1] + m[8 + i] * p[2] + m[12 + i] * w)48
}49
50
fn main() -> Result<(), Box<dyn std::error::Error>> {51
let a: Vec<String> = std::env::args().skip(1).collect();52
let body = preview::load_body_file(std::path::Path::new(&a[0]))?;53
let hair = body.surfaces.last().ok_or("no surfaces")?;54
let bones: Vec<[f32; 16]> = (0..body.joint_nodes.len())55
.map(|j| {56
preview::mul(57
preview::rest_joint_world(&body, j).unwrap(),58
body.inverse_binds[j],59
)60
})61
.collect();62
let head = body63
.joint_names64
.iter()65
.position(|n| n.to_ascii_lowercase().starts_with("head"))66
.ok_or("no head joint")?;67
let head_world = preview::animated_joint_world(&body, "", 0.0, head).ok_or("head")?;68
let to_head = inverse(head_world);69
let idx = &body.indices[hair.first..hair.first + hair.count];70
let mut used: Vec<u32> = idx.to_vec();71
used.sort_unstable();72
used.dedup();73
let map: std::collections::HashMap<u32, usize> =74
used.iter().enumerate().map(|(i, v)| (*v, i + 1)).collect();75
let dir = tempdir();76
let mut obj = std::fs::File::create(dir.join("female-hair.obj"))?;77
writeln!(obj, "# Hair of \"Animated Female Base Mesh\" by assetfactory (Sketchfab Standard), baked rigid to {}", body.joint_names[head])?;78
writeln!(obj, "mtllib female-hair.mtl\nusemtl hair")?;79
for v in &used {80
let i = *v as usize;81
let mut m = [0f32; 16];82
for (j, w) in body.joints[i].iter().zip(body.weights[i]) {83
for k in 0..16 {84
m[k] += bones[*j as usize][k] * w;85
}86
}87
let p = apply(&to_head, apply(&m, body.positions[i], 1.), 1.);88
let n = apply(&to_head, apply(&m, body.normals[i], 0.), 0.);89
let l = (n[0] * n[0] + n[1] * n[1] + n[2] * n[2]).sqrt().max(1e-9);90
let uv = body.uvs[i];91
writeln!(obj, "v {} {} {}", p[0], p[1], p[2])?;92
writeln!(obj, "vt {} {}", uv[0], 1. - uv[1])?;93
writeln!(obj, "vn {} {} {}", n[0] / l, n[1] / l, n[2] / l)?;94
}95
for t in idx.chunks_exact(3) {96
let f = [map[&t[0]], map[&t[1]], map[&t[2]]];97
writeln!(98
obj,99
"f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}",100
f[0], f[1], f[2]101
)?;102
}103
drop(obj);104
std::fs::write(105
dir.join("female-hair.mtl"),106
"newmtl hair\nKd 1 1 1\nmap_Kd female-hair.png\n",107
)?;108
std::fs::copy(&a[1], dir.join("female-hair.png"))?;109
let edited = preview::load_body_file(std::path::Path::new(&a[2]))?;110
let mut preset = equipment::Preset::new("female-hair".into());111
preset.applies = [false, true];112
preset.provenance = "Hair of \"Animated Female Base Mesh\" by assetfactory, https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec, Sketchfab Standard licence. Baked rigid to the head joint at the rest pose (was skinned to several bones).".into();113
let part = equipment::import_obj(&mut preset, &dir.join("female-hair.obj"))?;114
let head_edited = edited115
.joint_names116
.iter()117
.position(|n| n == &body.joint_names[head])118
.ok_or("head missing in edited body")?;119
preset.bind(1, &edited, part, head_edited)?;120
std::fs::write(&a[3], preset.encode()?)?;121
println!(122
"hair: {} vertices, {} triangles, bound to {}",123
used.len(),124
idx.len() / 3,125
body.joint_names[head]126
);127
Ok(())128
}129
fn tempdir() -> std::path::PathBuf {130
let d = std::env::temp_dir().join(format!("bake-hair-{}", std::process::id()));131
std::fs::create_dir_all(&d).unwrap();132
d133
}@@ -1,5 +1,5 @@
1
1
//! Actual native end-to-end batch smoke; no GUI input automation or preview delays.
2
//! Usage: production_fixture ROOT MALE.(glb|fbx) FEMALE.(glb|fbx) male|female WIDTH HEIGHT FPS [equipment] [--height-milli=N] [--center-milli=N]
2
//! Usage: production_fixture ROOT MALE.(glb|fbx) FEMALE.(glb|fbx) male|female WIDTH HEIGHT FPS [equipment|default-hair|default-body] [--height-milli=N] [--center-milli=N]
3
3
use eframe::App;
4
4
use paperdoll_renderer::{
5
5
editor::EditorApp,
@@ -48,15 +48,25 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
48
48
let a = std::env::args().skip(1).collect::<Vec<_>>();
49
49
if a.len() < 7 {
50
50
return Err(
51
"ROOT MALE FEMALE male|female WIDTH HEIGHT FPS [equipment] [--height-milli=N] [--center-milli=N]".into(),
51
"ROOT MALE FEMALE male|female WIDTH HEIGHT FPS [equipment|default-hair|default-body] [--height-milli=N] [--center-milli=N]".into(),
52
52
);
53
53
}
54
let root = PathBuf::from(&a[0]);
54
let mut root = PathBuf::from(&a[0]);
55
55
let mut s = Session::new();
56
s.install_new_project(&root)?;
57
for (sex, index) in [(Sex::Male, 1), (Sex::Female, 2)] {
58
let path = adopt_file(&root, &PathBuf::from(&a[index]), "assets/body")?;
59
s.set_body_path(sex, path);
56
// `default-hair`: a real "Nieuw project" (bundled bodies + female-hair
57
// preset, t1019u) in ROOT/Starter; MALE/FEMALE are ignored.
58
let default_hair = a.get(7).is_some_and(|v| v == "default-hair");
59
let default_project = default_hair || a.get(7).is_some_and(|v| v == "default-body");
60
if default_project {
61
std::fs::create_dir_all(&root)?;
62
s.install_named_project(&root, "Starter")?;
63
root = root.join("Starter");
64
} else {
65
s.install_new_project(&root)?;
66
for (sex, index) in [(Sex::Male, 1), (Sex::Female, 2)] {
67
let path = adopt_file(&root, &PathBuf::from(&a[index]), "assets/body")?;
68
s.set_body_path(sex, path);
69
}
60
70
}
61
71
s.set_render(a[4].parse()?, a[5].parse()?, a[6].parse()?);
62
72
let sex = match a[3].as_str() {
@@ -65,6 +75,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
65
75
_ => return Err("invalid sex".into()),
66
76
};
67
77
let equipment = a.get(7).is_some_and(|v| v == "equipment");
78
let open_equipment = equipment || default_hair;
68
79
if let Some(value) = a.iter().find_map(|v| v.strip_prefix("--height-milli=")) {
69
80
s.opened.as_mut().unwrap().document.render.framing[usize::from(sex == Sex::Female)]
70
81
.height_milli = value.parse()?;
@@ -111,7 +122,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
111
122
Box::new(move |_| {
112
123
let mut editor = EditorApp::default();
113
124
editor.open_path(root2.join("character.ppd"));
114
if equipment {
125
if open_equipment {
115
126
editor.open_equipment_configuration(0, sex);
116
127
} else {
117
128
editor.open_body_configuration(sex);
@@ -1,5 +1,5 @@1
//! Actual native end-to-end batch smoke; no GUI input automation or preview delays.1
//! Actual native end-to-end batch smoke; no GUI input automation or preview delays.2
//! Usage: production_fixture ROOT MALE.(glb|fbx) FEMALE.(glb|fbx) male|female WIDTH HEIGHT FPS [equipment] [--height-milli=N] [--center-milli=N]2
//! Usage: production_fixture ROOT MALE.(glb|fbx) FEMALE.(glb|fbx) male|female WIDTH HEIGHT FPS [equipment|default-hair|default-body] [--height-milli=N] [--center-milli=N]3
use eframe::App;3
use eframe::App;4
use paperdoll_renderer::{4
use paperdoll_renderer::{5
editor::EditorApp,5
editor::EditorApp,@@ -48,15 +48,25 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {48
let a = std::env::args().skip(1).collect::<Vec<_>>();48
let a = std::env::args().skip(1).collect::<Vec<_>>();49
if a.len() < 7 {49
if a.len() < 7 {50
return Err(50
return Err(51
"ROOT MALE FEMALE male|female WIDTH HEIGHT FPS [equipment] [--height-milli=N] [--center-milli=N]".into(),51
"ROOT MALE FEMALE male|female WIDTH HEIGHT FPS [equipment|default-hair|default-body] [--height-milli=N] [--center-milli=N]".into(),52
);52
);53
}53
}54
let root = PathBuf::from(&a[0]);54
let mut root = PathBuf::from(&a[0]);55
let mut s = Session::new();55
let mut s = Session::new();56
s.install_new_project(&root)?;56
// `default-hair`: a real "Nieuw project" (bundled bodies + female-hair57
for (sex, index) in [(Sex::Male, 1), (Sex::Female, 2)] {57
// preset, t1019u) in ROOT/Starter; MALE/FEMALE are ignored.58
let path = adopt_file(&root, &PathBuf::from(&a[index]), "assets/body")?;58
let default_hair = a.get(7).is_some_and(|v| v == "default-hair");59
s.set_body_path(sex, path);59
let default_project = default_hair || a.get(7).is_some_and(|v| v == "default-body");60
if default_project {61
std::fs::create_dir_all(&root)?;62
s.install_named_project(&root, "Starter")?;63
root = root.join("Starter");64
} else {65
s.install_new_project(&root)?;66
for (sex, index) in [(Sex::Male, 1), (Sex::Female, 2)] {67
let path = adopt_file(&root, &PathBuf::from(&a[index]), "assets/body")?;68
s.set_body_path(sex, path);69
}60
}70
}61
s.set_render(a[4].parse()?, a[5].parse()?, a[6].parse()?);71
s.set_render(a[4].parse()?, a[5].parse()?, a[6].parse()?);62
let sex = match a[3].as_str() {72
let sex = match a[3].as_str() {@@ -65,6 +75,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {65
_ => return Err("invalid sex".into()),75
_ => return Err("invalid sex".into()),66
};76
};67
let equipment = a.get(7).is_some_and(|v| v == "equipment");77
let equipment = a.get(7).is_some_and(|v| v == "equipment");78
let open_equipment = equipment || default_hair;68
if let Some(value) = a.iter().find_map(|v| v.strip_prefix("--height-milli=")) {79
if let Some(value) = a.iter().find_map(|v| v.strip_prefix("--height-milli=")) {69
s.opened.as_mut().unwrap().document.render.framing[usize::from(sex == Sex::Female)]80
s.opened.as_mut().unwrap().document.render.framing[usize::from(sex == Sex::Female)]70
.height_milli = value.parse()?;81
.height_milli = value.parse()?;@@ -111,7 +122,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {111
Box::new(move |_| {122
Box::new(move |_| {112
let mut editor = EditorApp::default();123
let mut editor = EditorApp::default();113
editor.open_path(root2.join("character.ppd"));124
editor.open_path(root2.join("character.ppd"));114
if equipment {125
if open_equipment {115
editor.open_equipment_configuration(0, sex);126
editor.open_equipment_configuration(0, sex);116
} else {127
} else {117
editor.open_body_configuration(sex);128
editor.open_body_configuration(sex);@@ -0,0 +1,105 @@
1
#!/usr/bin/env python3
2
"""Asset edit of Tim's "Animated Female Base Mesh" for the bundled default
3
female (design.md, t1018u/t1020u): drop the stray animation that resets the
4
armature rotation and the hair mesh (material ponytail01) with its material,
5
texture, image and data, then compact the .bin. Usage: SRC_DIR DST_DIR"""
6
import json, os, shutil, sys
7
8
src, dst = sys.argv[1], sys.argv[2]
9
g = json.load(open(os.path.join(src, "female.gltf")))
10
blob = open(os.path.join(src, g["buffers"][0]["uri"]), "rb").read()
11
12
g["animations"] = [a for a in g["animations"] if "ponytail" not in a["name"]]
13
hair_mat = next(i for i, m in enumerate(g["materials"]) if m.get("name") == "ponytail01")
14
hair_meshes = {i for i, m in enumerate(g["meshes"]) if any(p.get("material") == hair_mat for p in m["primitives"])}
15
assert len(hair_meshes) == 1 and all(p.get("material") == hair_mat for p in g["meshes"][next(iter(hair_meshes))]["primitives"])
16
for n in g["nodes"]:
17
if n.get("mesh") in hair_meshes:
18
del n["mesh"]
19
n.pop("skin", None)
20
21
def remap(items, keep):
22
new = {old: i for i, old in enumerate(keep)}
23
return [items[i] for i in keep], new
24
25
# meshes
26
keep = [i for i in range(len(g["meshes"])) if i not in hair_meshes]
27
g["meshes"], m_map = remap(g["meshes"], keep)
28
for n in g["nodes"]:
29
if "mesh" in n: n["mesh"] = m_map[n["mesh"]]
30
# materials / textures / images
31
keep = [i for i in range(len(g["materials"])) if i != hair_mat]
32
used_tex = set()
33
def textures_of(m):
34
out = []
35
def walk(o):
36
if isinstance(o, dict):
37
if "index" in o and set(o) & {"index"} and ("texCoord" in o or len(o) <= 3): out.append(o)
38
for v in o.values(): walk(v)
39
elif isinstance(o, list):
40
for v in o: walk(v)
41
walk(m); return out
42
g["materials"], mat_map = remap(g["materials"], keep)
43
for m in g["meshes"]:
44
for p in m["primitives"]:
45
if "material" in p: p["material"] = mat_map[p["material"]]
46
refs = [r for m in g["materials"] for r in textures_of(m)]
47
tkeep = sorted({r["index"] for r in refs})
48
g["textures"], t_map = remap(g["textures"], tkeep)
49
for r in refs: r["index"] = t_map[r["index"]]
50
ikeep = sorted({t["source"] for t in g["textures"]})
51
dropped_images = [g["images"][i]["uri"] for i in range(len(g["images"])) if i not in ikeep]
52
g["images"], i_map = remap(g["images"], ikeep)
53
for t in g["textures"]: t["source"] = i_map[t["source"]]
54
# accessors still referenced
55
used_acc = set()
56
for m in g["meshes"]:
57
for p in m["primitives"]:
58
used_acc |= set(p["attributes"].values())
59
if "indices" in p: used_acc.add(p["indices"])
60
for t in p.get("targets", []): used_acc |= set(t.values())
61
for s in g.get("skins", []):
62
if "inverseBindMatrices" in s: used_acc.add(s["inverseBindMatrices"])
63
for a in g["animations"]:
64
for s in a["samplers"]: used_acc |= {s["input"], s["output"]}
65
akeep = sorted(used_acc)
66
g["accessors"], a_map = remap(g["accessors"], akeep)
67
for m in g["meshes"]:
68
for p in m["primitives"]:
69
p["attributes"] = {k: a_map[v] for k, v in p["attributes"].items()}
70
if "indices" in p: p["indices"] = a_map[p["indices"]]
71
for s in g.get("skins", []):
72
if "inverseBindMatrices" in s: s["inverseBindMatrices"] = a_map[s["inverseBindMatrices"]]
73
for a in g["animations"]:
74
for s in a["samplers"]: s["input"], s["output"] = a_map[s["input"]], a_map[s["output"]]
75
# compact bin: every kept accessor gets its own tightly packed buffer view
76
# (the source packs all meshes into a few shared views).
77
comp = {5120: 1, 5121: 1, 5122: 2, 5123: 2, 5125: 4, 5126: 4}
78
ncomp = {"SCALAR": 1, "VEC2": 2, "VEC3": 3, "VEC4": 4, "MAT4": 16}
79
assert not any("bufferView" in im for im in g["images"])
80
out = bytearray(); views = []
81
for a in g["accessors"]:
82
if "bufferView" not in a: continue
83
v = g["bufferViews"][a["bufferView"]]
84
size = comp[a["componentType"]] * ncomp[a["type"]]
85
stride = v.get("byteStride", size)
86
base = v.get("byteOffset", 0) + a.get("byteOffset", 0)
87
data = b"".join(blob[base + k * stride: base + k * stride + size] for k in range(a["count"]))
88
while len(out) % 4: out.append(0)
89
nv = {"buffer": 0, "byteOffset": len(out), "byteLength": len(data)}
90
if "target" in v: nv["target"] = v["target"]
91
views.append(nv); out += data
92
a["bufferView"] = len(views) - 1; a.pop("byteOffset", None)
93
g["bufferViews"] = views
94
g["buffers"][0]["byteLength"] = len(out)
95
g["buffers"][0]["uri"] = "female.bin"
96
os.makedirs(os.path.join(dst, "textures"), exist_ok=True)
97
json.dump(g, open(os.path.join(dst, "female.gltf"), "w"), indent=2)
98
open(os.path.join(dst, "female.bin"), "wb").write(out)
99
for im in g["images"]:
100
shutil.copyfile(os.path.join(src, im["uri"]), os.path.join(dst, im["uri"]))
101
for im in dropped_images:
102
p = os.path.join(dst, im)
103
if os.path.exists(p): os.remove(p)
104
shutil.copyfile(os.path.join(src, "license.txt"), os.path.join(dst, "license.txt"))
105
print("bin", len(blob), "->", len(out), "dropped images", dropped_images)
@@ -0,0 +1,105 @@1
#!/usr/bin/env python32
"""Asset edit of Tim's "Animated Female Base Mesh" for the bundled default3
female (design.md, t1018u/t1020u): drop the stray animation that resets the4
armature rotation and the hair mesh (material ponytail01) with its material,5
texture, image and data, then compact the .bin. Usage: SRC_DIR DST_DIR"""6
import json, os, shutil, sys7
8
src, dst = sys.argv[1], sys.argv[2]9
g = json.load(open(os.path.join(src, "female.gltf")))10
blob = open(os.path.join(src, g["buffers"][0]["uri"]), "rb").read()11
12
g["animations"] = [a for a in g["animations"] if "ponytail" not in a["name"]]13
hair_mat = next(i for i, m in enumerate(g["materials"]) if m.get("name") == "ponytail01")14
hair_meshes = {i for i, m in enumerate(g["meshes"]) if any(p.get("material") == hair_mat for p in m["primitives"])}15
assert len(hair_meshes) == 1 and all(p.get("material") == hair_mat for p in g["meshes"][next(iter(hair_meshes))]["primitives"])16
for n in g["nodes"]:17
if n.get("mesh") in hair_meshes:18
del n["mesh"]19
n.pop("skin", None)20
21
def remap(items, keep):22
new = {old: i for i, old in enumerate(keep)}23
return [items[i] for i in keep], new24
25
# meshes26
keep = [i for i in range(len(g["meshes"])) if i not in hair_meshes]27
g["meshes"], m_map = remap(g["meshes"], keep)28
for n in g["nodes"]:29
if "mesh" in n: n["mesh"] = m_map[n["mesh"]]30
# materials / textures / images31
keep = [i for i in range(len(g["materials"])) if i != hair_mat]32
used_tex = set()33
def textures_of(m):34
out = []35
def walk(o):36
if isinstance(o, dict):37
if "index" in o and set(o) & {"index"} and ("texCoord" in o or len(o) <= 3): out.append(o)38
for v in o.values(): walk(v)39
elif isinstance(o, list):40
for v in o: walk(v)41
walk(m); return out42
g["materials"], mat_map = remap(g["materials"], keep)43
for m in g["meshes"]:44
for p in m["primitives"]:45
if "material" in p: p["material"] = mat_map[p["material"]]46
refs = [r for m in g["materials"] for r in textures_of(m)]47
tkeep = sorted({r["index"] for r in refs})48
g["textures"], t_map = remap(g["textures"], tkeep)49
for r in refs: r["index"] = t_map[r["index"]]50
ikeep = sorted({t["source"] for t in g["textures"]})51
dropped_images = [g["images"][i]["uri"] for i in range(len(g["images"])) if i not in ikeep]52
g["images"], i_map = remap(g["images"], ikeep)53
for t in g["textures"]: t["source"] = i_map[t["source"]]54
# accessors still referenced55
used_acc = set()56
for m in g["meshes"]:57
for p in m["primitives"]:58
used_acc |= set(p["attributes"].values())59
if "indices" in p: used_acc.add(p["indices"])60
for t in p.get("targets", []): used_acc |= set(t.values())61
for s in g.get("skins", []):62
if "inverseBindMatrices" in s: used_acc.add(s["inverseBindMatrices"])63
for a in g["animations"]:64
for s in a["samplers"]: used_acc |= {s["input"], s["output"]}65
akeep = sorted(used_acc)66
g["accessors"], a_map = remap(g["accessors"], akeep)67
for m in g["meshes"]:68
for p in m["primitives"]:69
p["attributes"] = {k: a_map[v] for k, v in p["attributes"].items()}70
if "indices" in p: p["indices"] = a_map[p["indices"]]71
for s in g.get("skins", []):72
if "inverseBindMatrices" in s: s["inverseBindMatrices"] = a_map[s["inverseBindMatrices"]]73
for a in g["animations"]:74
for s in a["samplers"]: s["input"], s["output"] = a_map[s["input"]], a_map[s["output"]]75
# compact bin: every kept accessor gets its own tightly packed buffer view76
# (the source packs all meshes into a few shared views).77
comp = {5120: 1, 5121: 1, 5122: 2, 5123: 2, 5125: 4, 5126: 4}78
ncomp = {"SCALAR": 1, "VEC2": 2, "VEC3": 3, "VEC4": 4, "MAT4": 16}79
assert not any("bufferView" in im for im in g["images"])80
out = bytearray(); views = []81
for a in g["accessors"]:82
if "bufferView" not in a: continue83
v = g["bufferViews"][a["bufferView"]]84
size = comp[a["componentType"]] * ncomp[a["type"]]85
stride = v.get("byteStride", size)86
base = v.get("byteOffset", 0) + a.get("byteOffset", 0)87
data = b"".join(blob[base + k * stride: base + k * stride + size] for k in range(a["count"]))88
while len(out) % 4: out.append(0)89
nv = {"buffer": 0, "byteOffset": len(out), "byteLength": len(data)}90
if "target" in v: nv["target"] = v["target"]91
views.append(nv); out += data92
a["bufferView"] = len(views) - 1; a.pop("byteOffset", None)93
g["bufferViews"] = views94
g["buffers"][0]["byteLength"] = len(out)95
g["buffers"][0]["uri"] = "female.bin"96
os.makedirs(os.path.join(dst, "textures"), exist_ok=True)97
json.dump(g, open(os.path.join(dst, "female.gltf"), "w"), indent=2)98
open(os.path.join(dst, "female.bin"), "wb").write(out)99
for im in g["images"]:100
shutil.copyfile(os.path.join(src, im["uri"]), os.path.join(dst, im["uri"]))101
for im in dropped_images:102
p = os.path.join(dst, im)103
if os.path.exists(p): os.remove(p)104
shutil.copyfile(os.path.join(src, "license.txt"), os.path.join(dst, "license.txt"))105
print("bin", len(blob), "->", len(out), "dropped images", dropped_images)@@ -32,10 +32,6 @@ pub const FILES: &[(&str, &[u8])] = &[
32
32
"female/textures/material_baseColor.png",
33
33
include_bytes!("../assets/default-bodies/female/textures/material_baseColor.png"),
34
34
),
35
(
36
"female/textures/ponytail01_baseColor.png",
37
include_bytes!("../assets/default-bodies/female/textures/ponytail01_baseColor.png"),
38
),
39
35
(
40
36
"male/license.txt",
41
37
include_bytes!("../assets/default-bodies/male/license.txt"),
@@ -60,3 +56,8 @@ pub const FILES: &[(&str, &[u8])] = &[
60
56
61
57
pub const MALE_MODEL: &str = "assets/body/male/male.gltf";
62
58
pub const FEMALE_MODEL: &str = "assets/body/female/female.gltf";
59
60
/// Bundled female hair equipment preset (t1019u), baked by
61
/// `examples/bake_female_hair.rs`; written into every new project.
62
pub const FEMALE_HAIR_PRESET: &str = "presets/female-hair.ppe";
63
pub const FEMALE_HAIR_PPE: &[u8] = include_bytes!("../assets/default-equipment/female-hair.ppe");
@@ -32,10 +32,6 @@ pub const FILES: &[(&str, &[u8])] = &[32
"female/textures/material_baseColor.png",32
"female/textures/material_baseColor.png",33
include_bytes!("../assets/default-bodies/female/textures/material_baseColor.png"),33
include_bytes!("../assets/default-bodies/female/textures/material_baseColor.png"),34
),34
),35
(36
"female/textures/ponytail01_baseColor.png",37
include_bytes!("../assets/default-bodies/female/textures/ponytail01_baseColor.png"),38
),39
(35
(40
"male/license.txt",36
"male/license.txt",41
include_bytes!("../assets/default-bodies/male/license.txt"),37
include_bytes!("../assets/default-bodies/male/license.txt"),@@ -60,3 +56,8 @@ pub const FILES: &[(&str, &[u8])] = &[60
56
61
pub const MALE_MODEL: &str = "assets/body/male/male.gltf";57
pub const MALE_MODEL: &str = "assets/body/male/male.gltf";62
pub const FEMALE_MODEL: &str = "assets/body/female/female.gltf";58
pub const FEMALE_MODEL: &str = "assets/body/female/female.gltf";59
60
/// Bundled female hair equipment preset (t1019u), baked by61
/// `examples/bake_female_hair.rs`; written into every new project.62
pub const FEMALE_HAIR_PRESET: &str = "presets/female-hair.ppe";63
pub const FEMALE_HAIR_PPE: &[u8] = include_bytes!("../assets/default-equipment/female-hair.ppe");@@ -548,6 +548,10 @@ impl EditorApp {
548
548
self.session.active_body = Some(sex);
549
549
self.session.show_equipment(index);
550
550
self.equipment_part = 0;
551
self.controls.sex = match sex {
552
Sex::Male => PreviewSex::Male,
553
Sex::Female => PreviewSex::Female,
554
};
551
555
}
552
556
553
557
fn begin(&mut self, intent: Intent) {
@@ -548,6 +548,10 @@ impl EditorApp {548
self.session.active_body = Some(sex);548
self.session.active_body = Some(sex);549
self.session.show_equipment(index);549
self.session.show_equipment(index);550
self.equipment_part = 0;550
self.equipment_part = 0;551
self.controls.sex = match sex {552
Sex::Male => PreviewSex::Male,553
Sex::Female => PreviewSex::Female,554
};551
}555
}552
556
553
fn begin(&mut self, intent: Intent) {557
fn begin(&mut self, intent: Intent) {@@ -683,6 +683,7 @@ fn extract_mesh(
683
683
flat_normals: !mesh.vertex_normal.exists,
684
684
specular: 0.,
685
685
shiny: None,
686
blend: false,
686
687
});
687
688
}
688
689
}
@@ -683,6 +683,7 @@ fn extract_mesh(683
flat_normals: !mesh.vertex_normal.exists,683
flat_normals: !mesh.vertex_normal.exists,684
specular: 0.,684
specular: 0.,685
shiny: None,685
shiny: None,686
blend: false,686
});687
});687
}688
}688
}689
}@@ -825,4 +825,6 @@ pub const TABLE: &[(&str, &str)] = &[
825
825
("voorste materiaal niet als texture × factor getekend: {surface_front:?}", "front material not drawn as texture × factor: {surface_front:?}"),
826
826
("materiaal per primitive verwisseld: {surface_swap:?}", "material per primitive swapped: {surface_swap:?}"),
827
827
("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}", "GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}"),
828
("BLEND-laag niet over het ondoorzichtige oppervlak gemengd: {blend_over:?}", "BLEND layer not blended over the opaque surface: {blend_over:?}"),
829
("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}, blend-over={blend_over:?}", "GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}, blend-over={blend_over:?}"),
828
830
];
@@ -825,4 +825,6 @@ pub const TABLE: &[(&str, &str)] = &[825
("voorste materiaal niet als texture × factor getekend: {surface_front:?}", "front material not drawn as texture × factor: {surface_front:?}"),825
("voorste materiaal niet als texture × factor getekend: {surface_front:?}", "front material not drawn as texture × factor: {surface_front:?}"),826
("materiaal per primitive verwisseld: {surface_swap:?}", "material per primitive swapped: {surface_swap:?}"),826
("materiaal per primitive verwisseld: {surface_swap:?}", "material per primitive swapped: {surface_swap:?}"),827
("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}", "GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}"),827
("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}", "GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}"),828
("BLEND-laag niet over het ondoorzichtige oppervlak gemengd: {blend_over:?}", "BLEND layer not blended over the opaque surface: {blend_over:?}"),829
("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}, blend-over={blend_over:?}", "GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}, blend-over={blend_over:?}"),828
];830
];@@ -159,6 +159,8 @@ pub struct BodySurface {
159
159
/// the extension) and its strength texture (alpha copied into RGB).
160
160
pub specular: f32,
161
161
pub shiny: Option<std::sync::Arc<crate::equipment::Texture>>,
162
/// glTF alphaMode BLEND: composited over the opaque surfaces (t1016u).
163
pub blend: bool,
162
164
}
163
165
164
166
#[derive(Debug, Clone)]
@@ -468,6 +470,7 @@ impl StaticAcc {
468
470
flat_normals,
469
471
specular: 0.,
470
472
shiny: None,
473
blend: false,
471
474
});
472
475
Ok(())
473
476
}
@@ -693,6 +696,7 @@ fn load_gltf_file_unguarded(path: &Path) -> Result<PreviewCharacter, String> {
693
696
cutoff: prim.cutoff,
694
697
specular: prim.specular,
695
698
shiny: prim.shiny,
699
blend: prim.blend,
696
700
});
697
701
}
698
702
}
@@ -809,6 +813,7 @@ struct GltfPrimitive {
809
813
cutoff: f32,
810
814
specular: f32,
811
815
shiny: Option<std::sync::Arc<crate::equipment::Texture>>,
816
blend: bool,
812
817
flat_normals: bool,
813
818
}
814
819
@@ -915,6 +920,7 @@ fn read_gltf_primitive(
915
920
},
916
921
specular,
917
922
shiny,
923
blend: material.alpha_mode() == gltf::material::AlphaMode::Blend,
918
924
})
919
925
}
920
926
@@ -159,6 +159,8 @@ pub struct BodySurface {159
/// the extension) and its strength texture (alpha copied into RGB).159
/// the extension) and its strength texture (alpha copied into RGB).160
pub specular: f32,160
pub specular: f32,161
pub shiny: Option<std::sync::Arc<crate::equipment::Texture>>,161
pub shiny: Option<std::sync::Arc<crate::equipment::Texture>>,162
/// glTF alphaMode BLEND: composited over the opaque surfaces (t1016u).163
pub blend: bool,162
}164
}163
165
164
#[derive(Debug, Clone)]166
#[derive(Debug, Clone)]@@ -468,6 +470,7 @@ impl StaticAcc {468
flat_normals,470
flat_normals,469
specular: 0.,471
specular: 0.,470
shiny: None,472
shiny: None,473
blend: false,471
});474
});472
Ok(())475
Ok(())473
}476
}@@ -693,6 +696,7 @@ fn load_gltf_file_unguarded(path: &Path) -> Result<PreviewCharacter, String> {693
cutoff: prim.cutoff,696
cutoff: prim.cutoff,694
specular: prim.specular,697
specular: prim.specular,695
shiny: prim.shiny,698
shiny: prim.shiny,699
blend: prim.blend,696
});700
});697
}701
}698
}702
}@@ -809,6 +813,7 @@ struct GltfPrimitive {809
cutoff: f32,813
cutoff: f32,810
specular: f32,814
specular: f32,811
shiny: Option<std::sync::Arc<crate::equipment::Texture>>,815
shiny: Option<std::sync::Arc<crate::equipment::Texture>>,816
blend: bool,812
flat_normals: bool,817
flat_normals: bool,813
}818
}814
819
@@ -915,6 +920,7 @@ fn read_gltf_primitive(915
},920
},916
specular,921
specular,917
shiny,922
shiny,923
blend: material.alpha_mode() == gltf::material::AlphaMode::Blend,918
})924
})919
}925
}920
926
@@ -319,6 +319,7 @@ fn body_frame(
319
319
cutoff: s.cutoff,
320
320
specular: s.specular,
321
321
shiny: s.shiny.clone(),
322
blend: s.blend,
322
323
})
323
324
.collect();
324
325
PendingFrame {
@@ -407,6 +408,8 @@ struct SurfaceDraw {
407
408
cutoff: f32,
408
409
specular: f32,
409
410
shiny: Option<std::sync::Arc<crate::equipment::Texture>>,
411
/// glTF BLEND: drawn after the opaque ranges, blended, no depth write.
412
blend: bool,
410
413
}
411
414
412
415
impl PendingFrame {
@@ -582,7 +585,46 @@ impl GpuCache {
582
585
let albedo_enabled = gl.get_uniform_location(program, "u_albedo_enabled");
583
586
let shiny_enabled = gl.get_uniform_location(program, "u_shiny_enabled");
584
587
let specular = gl.get_uniform_location(program, "u_specular");
585
for (index, surface) in frame.surfaces.iter().enumerate() {
588
// glTF BLEND (design.md t1016u): opaque first, then BLEND blended
589
// without depth writes, then BLEND depth only.
590
let order: Vec<(usize, &SurfaceDraw, u8)> = (0..3u8)
591
.flat_map(|pass| {
592
frame
593
.surfaces
594
.iter()
595
.enumerate()
596
.filter(move |(_, s)| s.blend == (pass > 0))
597
.map(move |(i, s)| (i, s, pass))
598
})
599
.collect();
600
for (index, surface, pass) in order {
601
match pass {
602
0 => {
603
gl.disable(glow::BLEND);
604
gl.depth_mask(true);
605
gl.color_mask(true, true, true, true);
606
}
607
1 => {
608
gl.enable(glow::BLEND);
609
gl.blend_func_separate(
610
glow::SRC_ALPHA,
611
glow::ONE_MINUS_SRC_ALPHA,
612
glow::ZERO,
613
glow::ONE,
614
);
615
gl.depth_mask(false);
616
gl.color_mask(true, true, true, true);
617
}
618
_ => {
619
gl.disable(glow::BLEND);
620
gl.depth_mask(true);
621
gl.color_mask(false, false, false, false);
622
}
623
}
624
gl.uniform_1_i32(
625
gl.get_uniform_location(program, "u_blend").as_ref(),
626
i32::from(pass == 1),
627
);
586
628
let end = (surface.first + surface.count).min(self.index_count as usize);
587
629
if surface.first >= end {
588
630
continue;
@@ -612,6 +654,10 @@ impl GpuCache {
612
654
(surface.first * 4) as i32,
613
655
);
614
656
}
657
gl.disable(glow::BLEND);
658
gl.depth_mask(true);
659
gl.color_mask(true, true, true, true);
660
gl.uniform_1_i32(gl.get_uniform_location(program, "u_blend").as_ref(), 0);
615
661
}
616
662
gl.bind_vertex_array(None);
617
663
while self.layers.len() > frame.equipment.len() {
@@ -865,6 +911,7 @@ uniform vec3 u_eye;
865
911
in vec2 v_uv;
866
912
in vec3 v_world;
867
913
out vec4 frag;
914
uniform bool u_blend;
868
915
void main() {
869
916
vec3 n = normalize(v_normal);
870
917
vec3 light = normalize(vec3(0.35, 0.85, 0.4));
@@ -875,7 +922,7 @@ void main() {
875
922
float strength=u_specular;
876
923
if(u_shiny_enabled) strength*=dot(texture(u_shiny,v_uv).rgb,vec3(0.2126,0.7152,0.0722));
877
924
float highlight=pow(max(dot(reflect(-light,n),normalize(u_eye-v_world)),0.0),32.0)*strength;
878
frag = vec4(clamp(color.rgb * shade + highlight,0.0,1.0), 1.0);
925
frag = vec4(clamp(color.rgb * shade + highlight,0.0,1.0), u_blend ? color.a : 1.0);
879
926
}
880
927
"#;
881
928
@@ -1108,6 +1155,7 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {
1108
1155
cutoff: 0.001,
1109
1156
specular: 0.,
1110
1157
shiny: None,
1158
blend: false,
1111
1159
},
1112
1160
SurfaceDraw {
1113
1161
first: 3,
@@ -1117,6 +1165,7 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {
1117
1165
cutoff: 0.001,
1118
1166
specular: 0.,
1119
1167
shiny: None,
1168
blend: false,
1120
1169
},
1121
1170
];
1122
1171
cache.pending = Some(body.clone());
@@ -1165,6 +1214,7 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {
1165
1214
cutoff: 0.001,
1166
1215
specular: 0.,
1167
1216
shiny: None,
1217
blend: false,
1168
1218
}];
1169
1219
cache.pending = Some(body);
1170
1220
cache.paint(gl, &info, true);
@@ -1187,7 +1237,32 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {
1187
1237
"equipment-UV verkeerd georiënteerd: {equipment_uv:?}"
1188
1238
));
1189
1239
}
1190
println!("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}");
1240
// glTF BLEND (Tim t1016u): a nearly transparent front layer listed
1241
// first (the cornea) must not hide the opaque surface behind it.
1242
let mut body = make_frame(vec![0, 1, 2, 3, 4, 5], 17);
1243
let plain = |first, color: [f32; 4], blend| SurfaceDraw {
1244
first,
1245
count: 3,
1246
color,
1247
albedo: None,
1248
cutoff: 0.001,
1249
specular: 0.,
1250
shiny: None,
1251
blend,
1252
};
1253
body.surfaces = vec![
1254
plain(0, [1., 1., 1., 0.1], true),
1255
plain(3, [1., 0., 0., 1.], false),
1256
];
1257
cache.pending = Some(body);
1258
cache.paint(gl, &info, true);
1259
let blend_over = read();
1260
if blend_over[1] < 5 || blend_over[1] > 60 || blend_over[0] < 2 * blend_over[1] {
1261
return Err(format!(
1262
"BLEND-laag niet over het ondoorzichtige oppervlak gemengd: {blend_over:?}"
1263
));
1264
}
1265
println!("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}, blend-over={blend_over:?}");
1191
1266
Ok(())
1192
1267
})();
1193
1268
cache.destroy(gl);
@@ -319,6 +319,7 @@ fn body_frame(319
cutoff: s.cutoff,319
cutoff: s.cutoff,320
specular: s.specular,320
specular: s.specular,321
shiny: s.shiny.clone(),321
shiny: s.shiny.clone(),322
blend: s.blend,322
})323
})323
.collect();324
.collect();324
PendingFrame {325
PendingFrame {@@ -407,6 +408,8 @@ struct SurfaceDraw {407
cutoff: f32,408
cutoff: f32,408
specular: f32,409
specular: f32,409
shiny: Option<std::sync::Arc<crate::equipment::Texture>>,410
shiny: Option<std::sync::Arc<crate::equipment::Texture>>,411
/// glTF BLEND: drawn after the opaque ranges, blended, no depth write.412
blend: bool,410
}413
}411
414
412
impl PendingFrame {415
impl PendingFrame {@@ -582,7 +585,46 @@ impl GpuCache {582
let albedo_enabled = gl.get_uniform_location(program, "u_albedo_enabled");585
let albedo_enabled = gl.get_uniform_location(program, "u_albedo_enabled");583
let shiny_enabled = gl.get_uniform_location(program, "u_shiny_enabled");586
let shiny_enabled = gl.get_uniform_location(program, "u_shiny_enabled");584
let specular = gl.get_uniform_location(program, "u_specular");587
let specular = gl.get_uniform_location(program, "u_specular");585
for (index, surface) in frame.surfaces.iter().enumerate() {588
// glTF BLEND (design.md t1016u): opaque first, then BLEND blended589
// without depth writes, then BLEND depth only.590
let order: Vec<(usize, &SurfaceDraw, u8)> = (0..3u8)591
.flat_map(|pass| {592
frame593
.surfaces594
.iter()595
.enumerate()596
.filter(move |(_, s)| s.blend == (pass > 0))597
.map(move |(i, s)| (i, s, pass))598
})599
.collect();600
for (index, surface, pass) in order {601
match pass {602
0 => {603
gl.disable(glow::BLEND);604
gl.depth_mask(true);605
gl.color_mask(true, true, true, true);606
}607
1 => {608
gl.enable(glow::BLEND);609
gl.blend_func_separate(610
glow::SRC_ALPHA,611
glow::ONE_MINUS_SRC_ALPHA,612
glow::ZERO,613
glow::ONE,614
);615
gl.depth_mask(false);616
gl.color_mask(true, true, true, true);617
}618
_ => {619
gl.disable(glow::BLEND);620
gl.depth_mask(true);621
gl.color_mask(false, false, false, false);622
}623
}624
gl.uniform_1_i32(625
gl.get_uniform_location(program, "u_blend").as_ref(),626
i32::from(pass == 1),627
);586
let end = (surface.first + surface.count).min(self.index_count as usize);628
let end = (surface.first + surface.count).min(self.index_count as usize);587
if surface.first >= end {629
if surface.first >= end {588
continue;630
continue;@@ -612,6 +654,10 @@ impl GpuCache {612
(surface.first * 4) as i32,654
(surface.first * 4) as i32,613
);655
);614
}656
}657
gl.disable(glow::BLEND);658
gl.depth_mask(true);659
gl.color_mask(true, true, true, true);660
gl.uniform_1_i32(gl.get_uniform_location(program, "u_blend").as_ref(), 0);615
}661
}616
gl.bind_vertex_array(None);662
gl.bind_vertex_array(None);617
while self.layers.len() > frame.equipment.len() {663
while self.layers.len() > frame.equipment.len() {@@ -865,6 +911,7 @@ uniform vec3 u_eye;865
in vec2 v_uv;911
in vec2 v_uv;866
in vec3 v_world;912
in vec3 v_world;867
out vec4 frag;913
out vec4 frag;914
uniform bool u_blend;868
void main() {915
void main() {869
vec3 n = normalize(v_normal);916
vec3 n = normalize(v_normal);870
vec3 light = normalize(vec3(0.35, 0.85, 0.4));917
vec3 light = normalize(vec3(0.35, 0.85, 0.4));@@ -875,7 +922,7 @@ void main() {875
float strength=u_specular;922
float strength=u_specular;876
if(u_shiny_enabled) strength*=dot(texture(u_shiny,v_uv).rgb,vec3(0.2126,0.7152,0.0722));923
if(u_shiny_enabled) strength*=dot(texture(u_shiny,v_uv).rgb,vec3(0.2126,0.7152,0.0722));877
float highlight=pow(max(dot(reflect(-light,n),normalize(u_eye-v_world)),0.0),32.0)*strength;924
float highlight=pow(max(dot(reflect(-light,n),normalize(u_eye-v_world)),0.0),32.0)*strength;878
frag = vec4(clamp(color.rgb * shade + highlight,0.0,1.0), 1.0);925
frag = vec4(clamp(color.rgb * shade + highlight,0.0,1.0), u_blend ? color.a : 1.0);879
}926
}880
"#;927
"#;881
928
@@ -1108,6 +1155,7 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {1108
cutoff: 0.001,1155
cutoff: 0.001,1109
specular: 0.,1156
specular: 0.,1110
shiny: None,1157
shiny: None,1158
blend: false,1111
},1159
},1112
SurfaceDraw {1160
SurfaceDraw {1113
first: 3,1161
first: 3,@@ -1117,6 +1165,7 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {1117
cutoff: 0.001,1165
cutoff: 0.001,1118
specular: 0.,1166
specular: 0.,1119
shiny: None,1167
shiny: None,1168
blend: false,1120
},1169
},1121
];1170
];1122
cache.pending = Some(body.clone());1171
cache.pending = Some(body.clone());@@ -1165,6 +1214,7 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {1165
cutoff: 0.001,1214
cutoff: 0.001,1166
specular: 0.,1215
specular: 0.,1167
shiny: None,1216
shiny: None,1217
blend: false,1168
}];1218
}];1169
cache.pending = Some(body);1219
cache.pending = Some(body);1170
cache.paint(gl, &info, true);1220
cache.paint(gl, &info, true);@@ -1187,7 +1237,32 @@ pub unsafe fn depth_regression_probe(gl: &glow::Context) -> Result<(), String> {1187
"equipment-UV verkeerd georiënteerd: {equipment_uv:?}"1237
"equipment-UV verkeerd georiënteerd: {equipment_uv:?}"1188
));1238
));1189
}1239
}1190
println!("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}");1240
// glTF BLEND (Tim t1016u): a nearly transparent front layer listed1241
// first (the cornea) must not hide the opaque surface behind it.1242
let mut body = make_frame(vec![0, 1, 2, 3, 4, 5], 17);1243
let plain = |first, color: [f32; 4], blend| SurfaceDraw {1244
first,1245
count: 3,1246
color,1247
albedo: None,1248
cutoff: 0.001,1249
specular: 0.,1250
shiny: None,1251
blend,1252
};1253
body.surfaces = vec![1254
plain(0, [1., 1., 1., 0.1], true),1255
plain(3, [1., 0., 0., 1.], false),1256
];1257
cache.pending = Some(body);1258
cache.paint(gl, &info, true);1259
let blend_over = read();1260
if blend_over[1] < 5 || blend_over[1] > 60 || blend_over[0] < 2 * blend_over[1] {1261
return Err(format!(1262
"BLEND-laag niet over het ondoorzichtige oppervlak gemengd: {blend_over:?}"1263
));1264
}1265
println!("GPU depth PASS: native {native_bits}-bit, front={near:?}, next-frame={next:?}, reversed={reverse:?}, behind-layer={hidden:?}, textured-front={textured:?}, alpha-cutout={cutout:?}, shiny={shiny:?}, matte={matte:?}, body-surface texture×factor={surface_front:?}, body-surface factor-only={surface_swap:?}, body-uv-top={body_uv:?}, equipment-uv-bottom={equipment_uv:?}, blend-over={blend_over:?}");1191
Ok(())1266
Ok(())1192
})();1267
})();1193
cache.destroy(gl);1268
cache.destroy(gl);@@ -40,6 +40,8 @@ pub struct Draw {
40
40
pub specular: f32,
41
41
pub cutoff: f32,
42
42
pub flat_normals: bool,
43
/// glTF BLEND: drawn after the opaque draws, blended (design.md t1016u).
44
pub blend: bool,
43
45
}
44
46
#[derive(Clone)]
45
47
pub struct Scene {
@@ -312,6 +314,7 @@ pub fn scene(
312
314
specular: layer.specular,
313
315
cutoff: 0.5,
314
316
flat_normals: false,
317
blend: false,
315
318
});
316
319
}
317
320
} else {
@@ -353,6 +356,7 @@ pub fn scene(
353
356
specular: 0.,
354
357
cutoff: 0.001,
355
358
flat_normals: !body.source_normals_complete,
359
blend: false,
356
360
});
357
361
} else {
358
362
for surface in &body.surfaces {
@@ -368,6 +372,7 @@ pub fn scene(
368
372
specular: surface.specular,
369
373
cutoff: surface.cutoff,
370
374
flat_normals: surface.flat_normals,
375
blend: surface.blend,
371
376
});
372
377
}
373
378
}
@@ -645,7 +650,40 @@ impl GpuRenderer {
645
650
gl.enable_vertex_attrib_array(slot);
646
651
gl.vertex_attrib_pointer_f32(slot, size, glow::FLOAT, false, 12 * 4, offset * 4);
647
652
}
648
for draw in &scene.draws {
653
// glTF BLEND (design.md t1016u): opaque/mask first, then the
654
// BLEND draws blended without depth writes, then their depth only.
655
let order: Vec<(&Draw, u8)> = scene
656
.draws
657
.iter()
658
.filter(|d| !d.blend)
659
.map(|d| (d, 0))
660
.chain(scene.draws.iter().filter(|d| d.blend).map(|d| (d, 1)))
661
.chain(scene.draws.iter().filter(|d| d.blend).map(|d| (d, 2)))
662
.collect();
663
for (draw, pass) in order {
664
match pass {
665
0 => {
666
gl.disable(glow::BLEND);
667
gl.depth_mask(true);
668
gl.color_mask(true, true, true, true);
669
}
670
1 => {
671
gl.enable(glow::BLEND);
672
gl.blend_func_separate(
673
glow::SRC_ALPHA,
674
glow::ONE_MINUS_SRC_ALPHA,
675
glow::ONE,
676
glow::ONE_MINUS_SRC_ALPHA,
677
);
678
gl.depth_mask(false);
679
gl.color_mask(true, true, true, true);
680
}
681
_ => {
682
gl.disable(glow::BLEND);
683
gl.depth_mask(true);
684
gl.color_mask(false, false, false, false);
685
}
686
}
649
687
if draw.positions.len() != draw.normals.len()
650
688
|| draw
651
689
.indices
@@ -756,6 +794,9 @@ impl GpuRenderer {
756
794
gl.delete_texture(t);
757
795
}
758
796
}
797
gl.disable(glow::BLEND);
798
gl.depth_mask(true);
799
gl.color_mask(true, true, true, true);
759
800
let pixels = scene.width as usize * scene.height as usize;
760
801
let mut maps = Vec::new();
761
802
gl.pixel_store_i32(glow::PACK_ALIGNMENT, 1);
@@ -1936,6 +1977,7 @@ pub unsafe fn map_regression_probe(gl: &glow::Context) -> Result<(), String> {
1936
1977
specular,
1937
1978
cutoff: 0.001,
1938
1979
flat_normals: false,
1980
blend: false,
1939
1981
};
1940
1982
let mut renderer = GpuRenderer::default();
1941
1983
let mut scene = Scene {
@@ -40,6 +40,8 @@ pub struct Draw {40
pub specular: f32,40
pub specular: f32,41
pub cutoff: f32,41
pub cutoff: f32,42
pub flat_normals: bool,42
pub flat_normals: bool,43
/// glTF BLEND: drawn after the opaque draws, blended (design.md t1016u).44
pub blend: bool,43
}45
}44
#[derive(Clone)]46
#[derive(Clone)]45
pub struct Scene {47
pub struct Scene {@@ -312,6 +314,7 @@ pub fn scene(312
specular: layer.specular,314
specular: layer.specular,313
cutoff: 0.5,315
cutoff: 0.5,314
flat_normals: false,316
flat_normals: false,317
blend: false,315
});318
});316
}319
}317
} else {320
} else {@@ -353,6 +356,7 @@ pub fn scene(353
specular: 0.,356
specular: 0.,354
cutoff: 0.001,357
cutoff: 0.001,355
flat_normals: !body.source_normals_complete,358
flat_normals: !body.source_normals_complete,359
blend: false,356
});360
});357
} else {361
} else {358
for surface in &body.surfaces {362
for surface in &body.surfaces {@@ -368,6 +372,7 @@ pub fn scene(368
specular: surface.specular,372
specular: surface.specular,369
cutoff: surface.cutoff,373
cutoff: surface.cutoff,370
flat_normals: surface.flat_normals,374
flat_normals: surface.flat_normals,375
blend: surface.blend,371
});376
});372
}377
}373
}378
}@@ -645,7 +650,40 @@ impl GpuRenderer {645
gl.enable_vertex_attrib_array(slot);650
gl.enable_vertex_attrib_array(slot);646
gl.vertex_attrib_pointer_f32(slot, size, glow::FLOAT, false, 12 * 4, offset * 4);651
gl.vertex_attrib_pointer_f32(slot, size, glow::FLOAT, false, 12 * 4, offset * 4);647
}652
}648
for draw in &scene.draws {653
// glTF BLEND (design.md t1016u): opaque/mask first, then the654
// BLEND draws blended without depth writes, then their depth only.655
let order: Vec<(&Draw, u8)> = scene656
.draws657
.iter()658
.filter(|d| !d.blend)659
.map(|d| (d, 0))660
.chain(scene.draws.iter().filter(|d| d.blend).map(|d| (d, 1)))661
.chain(scene.draws.iter().filter(|d| d.blend).map(|d| (d, 2)))662
.collect();663
for (draw, pass) in order {664
match pass {665
0 => {666
gl.disable(glow::BLEND);667
gl.depth_mask(true);668
gl.color_mask(true, true, true, true);669
}670
1 => {671
gl.enable(glow::BLEND);672
gl.blend_func_separate(673
glow::SRC_ALPHA,674
glow::ONE_MINUS_SRC_ALPHA,675
glow::ONE,676
glow::ONE_MINUS_SRC_ALPHA,677
);678
gl.depth_mask(false);679
gl.color_mask(true, true, true, true);680
}681
_ => {682
gl.disable(glow::BLEND);683
gl.depth_mask(true);684
gl.color_mask(false, false, false, false);685
}686
}649
if draw.positions.len() != draw.normals.len()687
if draw.positions.len() != draw.normals.len()650
|| draw688
|| draw651
.indices689
.indices@@ -756,6 +794,9 @@ impl GpuRenderer {756
gl.delete_texture(t);794
gl.delete_texture(t);757
}795
}758
}796
}797
gl.disable(glow::BLEND);798
gl.depth_mask(true);799
gl.color_mask(true, true, true, true);759
let pixels = scene.width as usize * scene.height as usize;800
let pixels = scene.width as usize * scene.height as usize;760
let mut maps = Vec::new();801
let mut maps = Vec::new();761
gl.pixel_store_i32(glow::PACK_ALIGNMENT, 1);802
gl.pixel_store_i32(glow::PACK_ALIGNMENT, 1);@@ -1936,6 +1977,7 @@ pub unsafe fn map_regression_probe(gl: &glow::Context) -> Result<(), String> {1936
specular,1977
specular,1937
cutoff: 0.001,1978
cutoff: 0.001,1938
flat_normals: false,1979
flat_normals: false,1980
blend: false,1939
};1981
};1940
let mut renderer = GpuRenderer::default();1982
let mut renderer = GpuRenderer::default();1941
let mut scene = Scene {1983
let mut scene = Scene {@@ -325,7 +325,8 @@ impl Session {
325
325
pub fn install_named_project(&mut self, parent: &Path, name: &str) -> Result<(), String> {
326
326
let dir = crate::project::new_project_dir(parent, name)?;
327
327
let opened = create_default_project_named(&dir, name.trim()).map_err(|e| e.to_string())?;
328
self.install_opened(opened);
328
// install_loaded also reads the bundled equipment preset(s).
329
self.install_loaded(opened);
329
330
self.ok("Project aangemaakt, met de standaardlichamen in assets/body/male en female.");
330
331
Ok(())
331
332
}
@@ -467,6 +468,16 @@ pub fn create_default_project_named(
467
468
}
468
469
opened.document.male_model = Some(crate::default_bodies::MALE_MODEL.to_string());
469
470
opened.document.female_model = Some(crate::default_bodies::FEMALE_MODEL.to_string());
471
// Bundled female hair preset (t1019u), listed in the equipment presets.
472
let path = checked_project_path(root, crate::default_bodies::FEMALE_HAIR_PRESET)
473
.map_err(|error| ProjectError::Validation(vec![error]))?;
474
if !path.exists() {
475
write_bytes(&path, crate::default_bodies::FEMALE_HAIR_PPE)?;
476
}
477
opened
478
.document
479
.equipment_presets
480
.push(crate::default_bodies::FEMALE_HAIR_PRESET.to_string());
470
481
save_project(&opened)?;
471
482
Ok(opened)
472
483
}
@@ -867,6 +878,40 @@ mod tests {
867
878
"{model} textures"
868
879
);
869
880
}
881
// The bundled female hair preset is listed, female-only, and at rest
882
// sits on the head of the default female (t1019u).
883
assert_eq!(
884
fs::read(root.join(crate::default_bodies::FEMALE_HAIR_PRESET)).unwrap(),
885
crate::default_bodies::FEMALE_HAIR_PPE
886
);
887
let hair = session
888
.equipment
889
.iter()
890
.find_map(|item| item.preset.as_ref().filter(|p| p.name == "female-hair"))
891
.expect("female-hair preset in the equipment list");
892
assert_eq!(hair.applies, [false, true]);
893
let female =
894
crate::preview::load_body_file(&root.join(crate::default_bodies::FEMALE_MODEL))
895
.unwrap();
896
let controls = crate::preview::PreviewControls {
897
clip_name: String::new(),
898
..Default::default()
899
};
900
let layers = crate::equipment::layers(hair, 1, &female, &controls).unwrap();
901
assert_eq!(layers.len(), 1);
902
let (mut lo, mut hi) = (f32::MAX, f32::MIN);
903
for p in &layers[0].mesh.positions {
904
let m = &layers[0].model;
905
let y = m[1] * p[0] + m[5] * p[1] + m[9] * p[2] + m[13];
906
lo = lo.min(y);
907
hi = hi.max(y);
908
}
909
// Tim's original female with hair has rest top Y 1.621 m (the hair);
910
// the baked rigid hair must reach exactly that, the ponytail ~1.27 m.
911
assert!(
912
(hi - 1.621).abs() < 0.002 && (1.2..1.35).contains(&lo),
913
"hair Y {lo}..{hi}"
914
);
870
915
// The saved manifest reopens with the same bodies.
871
916
let reopened = crate::project::open_project(&root.join("character.ppd")).unwrap();
872
917
assert_eq!(
@@ -325,7 +325,8 @@ impl Session {325
pub fn install_named_project(&mut self, parent: &Path, name: &str) -> Result<(), String> {325
pub fn install_named_project(&mut self, parent: &Path, name: &str) -> Result<(), String> {326
let dir = crate::project::new_project_dir(parent, name)?;326
let dir = crate::project::new_project_dir(parent, name)?;327
let opened = create_default_project_named(&dir, name.trim()).map_err(|e| e.to_string())?;327
let opened = create_default_project_named(&dir, name.trim()).map_err(|e| e.to_string())?;328
self.install_opened(opened);328
// install_loaded also reads the bundled equipment preset(s).329
self.install_loaded(opened);329
self.ok("Project aangemaakt, met de standaardlichamen in assets/body/male en female.");330
self.ok("Project aangemaakt, met de standaardlichamen in assets/body/male en female.");330
Ok(())331
Ok(())331
}332
}@@ -467,6 +468,16 @@ pub fn create_default_project_named(467
}468
}468
opened.document.male_model = Some(crate::default_bodies::MALE_MODEL.to_string());469
opened.document.male_model = Some(crate::default_bodies::MALE_MODEL.to_string());469
opened.document.female_model = Some(crate::default_bodies::FEMALE_MODEL.to_string());470
opened.document.female_model = Some(crate::default_bodies::FEMALE_MODEL.to_string());471
// Bundled female hair preset (t1019u), listed in the equipment presets.472
let path = checked_project_path(root, crate::default_bodies::FEMALE_HAIR_PRESET)473
.map_err(|error| ProjectError::Validation(vec![error]))?;474
if !path.exists() {475
write_bytes(&path, crate::default_bodies::FEMALE_HAIR_PPE)?;476
}477
opened478
.document479
.equipment_presets480
.push(crate::default_bodies::FEMALE_HAIR_PRESET.to_string());470
save_project(&opened)?;481
save_project(&opened)?;471
Ok(opened)482
Ok(opened)472
}483
}@@ -867,6 +878,40 @@ mod tests {867
"{model} textures"878
"{model} textures"868
);879
);869
}880
}881
// The bundled female hair preset is listed, female-only, and at rest882
// sits on the head of the default female (t1019u).883
assert_eq!(884
fs::read(root.join(crate::default_bodies::FEMALE_HAIR_PRESET)).unwrap(),885
crate::default_bodies::FEMALE_HAIR_PPE886
);887
let hair = session888
.equipment889
.iter()890
.find_map(|item| item.preset.as_ref().filter(|p| p.name == "female-hair"))891
.expect("female-hair preset in the equipment list");892
assert_eq!(hair.applies, [false, true]);893
let female =894
crate::preview::load_body_file(&root.join(crate::default_bodies::FEMALE_MODEL))895
.unwrap();896
let controls = crate::preview::PreviewControls {897
clip_name: String::new(),898
..Default::default()899
};900
let layers = crate::equipment::layers(hair, 1, &female, &controls).unwrap();901
assert_eq!(layers.len(), 1);902
let (mut lo, mut hi) = (f32::MAX, f32::MIN);903
for p in &layers[0].mesh.positions {904
let m = &layers[0].model;905
let y = m[1] * p[0] + m[5] * p[1] + m[9] * p[2] + m[13];906
lo = lo.min(y);907
hi = hi.max(y);908
}909
// Tim's original female with hair has rest top Y 1.621 m (the hair);910
// the baked rigid hair must reach exactly that, the ponytail ~1.27 m.911
assert!(912
(hi - 1.621).abs() < 0.002 && (1.2..1.35).contains(&lo),913
"hair Y {lo}..{hi}"914
);870
// The saved manifest reopens with the same bodies.915
// The saved manifest reopens with the same bodies.871
let reopened = crate::project::open_project(&root.join("character.ppd")).unwrap();916
let reopened = crate::project::open_project(&root.join("character.ppd")).unwrap();872
assert_eq!(917
assert_eq!(