BlueGit

golden-age paperdoll-renderer

Bundled female: stray clip and hair removed (asset edit); female-hair equipment preset seeded into new projects; editor equipment config sets preview sex; NOTICE/README (Tim t1015u-t1021u)

timfa Grok Bot · pushed by timfa

Authored 2026-11-07 · 6 days ago

Hash
a94b061f05c04408ed3b2f5085aca89235ff1681
Parent
4e52d7b0
11 files changed +1442 −622
README.md +3 −3
@@ -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 st
19
19
20## Project and bodies
20## Project and bodies
21
21
22The 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.
22The 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
24The 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.
24The 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### Multiple meshes and skins (glTF/GLB)
37### Multiple meshes and skins (glTF/GLB)
38
38
39A 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).
39A 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-bo
208- **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
211Details are in `THIRD_PARTY_NOTICES.md`, which every package ships next to the licence. The synthetic test bodies in `tests/fixtures/bodies/` are CC0.
211The 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## Tests
213## Tests
214
214
THIRD_PARTY_NOTICES.md +5 −2
@@ -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-52fc9c15cf3e49d2a5a9cee6444964ec
19- Source: https://sketchfab.com/3d-models/animated-female-base-mesh-52fc9c15cf3e49d2a5a9cee6444964ec
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.
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
22The only change from the downloaded files is the buffer `uri` in each `.gltf`
22Changes 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
25The synthetic test bodies in `tests/fixtures/bodies/` are CC0 (see that folder's `LICENSE`).
28The synthetic test bodies in `tests/fixtures/bodies/` are CC0 (see that folder's `LICENSE`).
assets/default-bodies/female/female.bin Binary file +0 −0

The contents of this binary file are not shown.

assets/default-bodies/female/female.gltf +1122 −604
@@ -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.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,
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.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,
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-08
728 -2.9802322387695312e-08
855 ],
729 ],
856 "min": [
730 "min": [
857 2.384185791015625e-07,
731 2.384185791015625e-07,
858 0.13778603076934814,
732 0.13778603076934814,
859 -2.9802322387695313e-08
733 -2.9802322387695312e-08
860 ],
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-08
966 2.9802322387695312e-08
1109 ],
967 ],
1110 "min": [
968 "min": [
1111 8.046627044677734e-07,
969 8.046627044677734e-07,
1112 0.27365753054618835,
970 0.27365753054618835,
1113 2.9802322387695313e-08
971 2.9802322387695312e-08
1114 ],
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.9796718955039978
1817 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.7604146003723145
2559 7.7604146003723145
2810 ],
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.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": [
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": 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 "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": 176
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": [
3991 "buffer": 0,
3696 {
3992 "byteOffset": 5604164,
3697 "sampler": 0,
3993 "byteLength": 12
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"
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": 116
3729 "name": "shortBufferViews",
3730 "target": 34962
3731 },
3999 },
3732 {
4000 {
3733 "buffer": 0,
4001 "buffer": 0,
3734 "byteLength": 1379712,
4002 "byteOffset": 5604292,
3735 "byteOffset": 640264,
4003 "byteLength": 464
3736 "name": "floatBufferViews",
3737 "target": 34963
3738 },
4004 },
3739 {
4005 {
3740 "buffer": 0,
4006 "buffer": 0,
3741 "byteLength": 640264,
4007 "byteOffset": 5604756,
3742 "byteOffset": 2019976,
4008 "byteLength": 192
3743 "byteStride": 8,
3744 "name": "floatBufferViews",
3745 "target": 34962
3746 },
4009 },
3747 {
4010 {
3748 "buffer": 0,
4011 "buffer": 0,
3749 "byteLength": 1920792,
4012 "byteOffset": 5604948,
3750 "byteOffset": 2660240,
4013 "byteLength": 768
3751 "byteStride": 12,
3752 "name": "floatBufferViews",
3753 "target": 34962
3754 },
4014 },
3755 {
4015 {
3756 "buffer": 0,
4016 "buffer": 0,
3757 "byteLength": 1280528,
4017 "byteOffset": 5605716,
3758 "byteOffset": 4581032,
4018 "byteLength": 4
3759 "byteStride": 16,
4019 },
3760 "name": "floatBufferViews",
4020 {
3761 "target": 34962
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 "buffer": 0,
4286 "buffer": 0,
3765 "byteLength": 3456,
4287 "byteOffset": 5624852,
3766 "byteOffset": 5861560,
4288 "byteLength": 192
3767 "name": "floatBufferViews"
3768 },
4289 },
3769 {
4290 {
3770 "buffer": 0,
4291 "buffer": 0,
3771 "byteLength": 9844,
4292 "byteOffset": 5625044,
3772 "byteOffset": 5865016,
4293 "byteLength": 768
3773 "name": "floatBufferViews"
3774 },
4294 },
3775 {
4295 {
3776 "buffer": 0,
4296 "buffer": 0,
3777 "byteLength": 3756,
4297 "byteOffset": 5625812,
3778 "byteOffset": 5874860,
4298 "byteLength": 192
3779 "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": 768
3786 "byteStride": 16,
4304 },
3787 "name": "floatBufferViews"
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 "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.9159103585
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 "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": 30
4438 "WEIGHTS_0": 26
3898 },
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": 32
4455 "WEIGHTS_0": 28
3915 },
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": 34
4472 "WEIGHTS_0": 30
3932 },
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": 36
4489 "WEIGHTS_0": 32
3949 },
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": 38
4506 "WEIGHTS_0": 34
3966 },
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": 40
4523 "WEIGHTS_0": 36
3983 },
4524 },
3984 "indices": 23,
4525 "indices": 23,
3985 "material": 4,
4526 "material": 4,
3986 "mode": 4
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 "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-07
5196 -6.854534149169922e-07
4673 ]
5197 ]
4674 },
5198 },
@@ -5127,7 +5651,7 @@
5127 1.0
5651 1.0
5128 ],
5652 ],
5129 "translation": [
5653 "translation": [
5130 2.9802322387695313e-08,
5654 2.9802322387695312e-08,
5131 0.21817153692245483,
5655 0.21817153692245483,
5132 4.470348358154297e-08
5656 4.470348358154297e-08
5133 ]
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-08
5719 2.9802322387695312e-08
5196 ]
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": 0
5429 },
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": 3
6061 "source": 3
5540 },
5541 {
5542 "sampler": 0,
5543 "source": 4
5544 }
6062 }
5545 ]
6063 ]
5546}
6064}
assets/default-bodies/female/textures/ponytail01_baseColor.png assets/default-equipment/female-hair.ppe renamed Binary file +0 −0

The contents of this binary file are not shown.

examples/bake_female_hair.rs added +133 −0
@@ -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 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
9use paperdoll_renderer::{equipment, preview};
10use std::io::Write;
11
12fn 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}
46fn 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
50fn 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}
129fn 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}
examples/production_fixture.rs +19 −8
@@ -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]
3use eframe::App;
3use eframe::App;
4use paperdoll_renderer::{
4use 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-hair
57 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);
scripts/edit_default_female.py added +105 −0
@@ -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 python3
2"""Asset edit of Tim's "Animated Female Base Mesh" for the bundled default
3female (design.md, t1018u/t1020u): drop the stray animation that resets the
4armature rotation and the hair mesh (material ponytail01) with its material,
5texture, image and data, then compact the .bin. Usage: SRC_DIR DST_DIR"""
6import json, os, shutil, sys
7
8src, dst = sys.argv[1], sys.argv[2]
9g = json.load(open(os.path.join(src, "female.gltf")))
10blob = open(os.path.join(src, g["buffers"][0]["uri"]), "rb").read()
11
12g["animations"] = [a for a in g["animations"] if "ponytail" not in a["name"]]
13hair_mat = next(i for i, m in enumerate(g["materials"]) if m.get("name") == "ponytail01")
14hair_meshes = {i for i, m in enumerate(g["meshes"]) if any(p.get("material") == hair_mat for p in m["primitives"])}
15assert len(hair_meshes) == 1 and all(p.get("material") == hair_mat for p in g["meshes"][next(iter(hair_meshes))]["primitives"])
16for n in g["nodes"]:
17 if n.get("mesh") in hair_meshes:
18 del n["mesh"]
19 n.pop("skin", None)
20
21def 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
26keep = [i for i in range(len(g["meshes"])) if i not in hair_meshes]
27g["meshes"], m_map = remap(g["meshes"], keep)
28for n in g["nodes"]:
29 if "mesh" in n: n["mesh"] = m_map[n["mesh"]]
30# materials / textures / images
31keep = [i for i in range(len(g["materials"])) if i != hair_mat]
32used_tex = set()
33def 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
42g["materials"], mat_map = remap(g["materials"], keep)
43for m in g["meshes"]:
44 for p in m["primitives"]:
45 if "material" in p: p["material"] = mat_map[p["material"]]
46refs = [r for m in g["materials"] for r in textures_of(m)]
47tkeep = sorted({r["index"] for r in refs})
48g["textures"], t_map = remap(g["textures"], tkeep)
49for r in refs: r["index"] = t_map[r["index"]]
50ikeep = sorted({t["source"] for t in g["textures"]})
51dropped_images = [g["images"][i]["uri"] for i in range(len(g["images"])) if i not in ikeep]
52g["images"], i_map = remap(g["images"], ikeep)
53for t in g["textures"]: t["source"] = i_map[t["source"]]
54# accessors still referenced
55used_acc = set()
56for 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())
61for s in g.get("skins", []):
62 if "inverseBindMatrices" in s: used_acc.add(s["inverseBindMatrices"])
63for a in g["animations"]:
64 for s in a["samplers"]: used_acc |= {s["input"], s["output"]}
65akeep = sorted(used_acc)
66g["accessors"], a_map = remap(g["accessors"], akeep)
67for 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"]]
71for s in g.get("skins", []):
72 if "inverseBindMatrices" in s: s["inverseBindMatrices"] = a_map[s["inverseBindMatrices"]]
73for 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).
77comp = {5120: 1, 5121: 1, 5122: 2, 5123: 2, 5125: 4, 5126: 4}
78ncomp = {"SCALAR": 1, "VEC2": 2, "VEC3": 3, "VEC4": 4, "MAT4": 16}
79assert not any("bufferView" in im for im in g["images"])
80out = bytearray(); views = []
81for 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)
93g["bufferViews"] = views
94g["buffers"][0]["byteLength"] = len(out)
95g["buffers"][0]["uri"] = "female.bin"
96os.makedirs(os.path.join(dst, "textures"), exist_ok=True)
97json.dump(g, open(os.path.join(dst, "female.gltf"), "w"), indent=2)
98open(os.path.join(dst, "female.bin"), "wb").write(out)
99for im in g["images"]:
100 shutil.copyfile(os.path.join(src, im["uri"]), os.path.join(dst, im["uri"]))
101for im in dropped_images:
102 p = os.path.join(dst, im)
103 if os.path.exists(p): os.remove(p)
104shutil.copyfile(os.path.join(src, "license.txt"), os.path.join(dst, "license.txt"))
105print("bin", len(blob), "->", len(out), "dropped images", dropped_images)
src/default_bodies.rs +5 −4
@@ -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
61pub const MALE_MODEL: &str = "assets/body/male/male.gltf";
57pub const MALE_MODEL: &str = "assets/body/male/male.gltf";
62pub const FEMALE_MODEL: &str = "assets/body/female/female.gltf";
58pub 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.
62pub const FEMALE_HAIR_PRESET: &str = "presets/female-hair.ppe";
63pub const FEMALE_HAIR_PPE: &[u8] = include_bytes!("../assets/default-equipment/female-hair.ppe");
src/editor.rs +4 −0
@@ -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) {
src/session.rs +46 −1
@@ -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 opened
478 .document
479 .equipment_presets
480 .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 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 // 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!(