@woosh/meep-engine 2.109.7 → 2.109.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/build/meep.cjs +1 -1
  2. package/build/meep.min.js +1 -1
  3. package/build/meep.module.js +1 -1
  4. package/package.json +1 -1
  5. package/src/core/collection/array/arrayQuickSort.d.ts +1 -1
  6. package/src/core/collection/array/arrayQuickSort.d.ts.map +1 -1
  7. package/src/core/collection/array/arrayQuickSort.js +1 -1
  8. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts +3 -3
  9. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.d.ts.map +1 -1
  10. package/src/core/geom/3d/tetrahedra/TetrahedralMesh.js +10 -5
  11. package/src/core/model/node-graph/DataType.d.ts.map +1 -1
  12. package/src/core/model/node-graph/DataType.js +16 -10
  13. package/src/core/model/node-graph/ParametricDataType.d.ts +34 -0
  14. package/src/core/model/node-graph/ParametricDataType.d.ts.map +1 -0
  15. package/src/core/model/node-graph/ParametricDataType.js +63 -0
  16. package/src/engine/graphics/sh3/gi/material/MaterialTransformer.d.ts.map +1 -1
  17. package/src/engine/graphics/sh3/gi/material/MaterialTransformer.js +11 -4
  18. package/src/engine/graphics/sh3/gi/material/common.glsl +117 -67
  19. package/src/engine/graphics/sh3/gi/material/space_fragment/build_fragment_shader.d.ts.map +1 -1
  20. package/src/engine/graphics/sh3/gi/material/space_fragment/build_fragment_shader.js +2 -4
  21. package/src/engine/graphics/sh3/lpv/LightProbeVolume.js +1 -1
  22. package/src/engine/graphics/sh3/lpv/LightProbeVolumeBaker.d.ts.map +1 -1
  23. package/src/engine/graphics/sh3/lpv/LightProbeVolumeBaker.js +5 -47
  24. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.d.ts +1 -1
  25. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.d.ts.map +1 -1
  26. package/src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.js +4 -24
  27. package/src/engine/graphics/sh3/lpv/build_probes_for_scene.d.ts.map +1 -1
  28. package/src/engine/graphics/sh3/lpv/build_probes_for_scene.js +8 -6
  29. package/src/engine/graphics/sh3/lpv/depth/octahedral/bake_octahedral_depth_map.d.ts.map +1 -1
  30. package/src/engine/graphics/sh3/lpv/depth/octahedral/bake_octahedral_depth_map.js +4 -4
  31. package/src/engine/graphics/sh3/lpv/depth/octahedral/v2/VLPDepthMapVisualisation.d.ts.map +1 -1
  32. package/src/engine/graphics/sh3/lpv/depth/octahedral/v2/VLPDepthMapVisualisation.js +3 -0
  33. package/src/engine/graphics/sh3/lpv/depth/octahedral/v2/visualise.frag.glsl +4 -2
  34. package/src/engine/graphics/sh3/lpv/find_max_depth_radius_for_point.d.ts +8 -0
  35. package/src/engine/graphics/sh3/lpv/find_max_depth_radius_for_point.d.ts.map +1 -0
  36. package/src/engine/graphics/sh3/lpv/find_max_depth_radius_for_point.js +50 -0
  37. package/src/engine/graphics/sh3/prototypeSH3Probe.js +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"LightProbeVolumeBaker.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/lpv/LightProbeVolumeBaker.js"],"names":[],"mappings":"AAmDA;IAGI,8BAAqC;IAGrC;;;;;OAKG;IACH,0DAJa,SAAS,CA6DrB;CACJ;wCAhHuC,8BAA8B;sBAJhD,4CAA4C"}
1
+ {"version":3,"file":"LightProbeVolumeBaker.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/lpv/LightProbeVolumeBaker.js"],"names":[],"mappings":"AAOA;IAEI,8BAAqC;IAGrC;;;;;OAKG;IACH,0DAJa,SAAS,CAgErB;CACJ;wCA1EuC,8BAA8B;sBALhD,4CAA4C"}
@@ -1,57 +1,12 @@
1
- import { v3_distance_sqr } from "../../../../core/geom/vec3/v3_distance_sqr.js";
2
- import {
3
- tetrahedral_mesh_find_tets_attached_to_vertex
4
- } from "../../../../core/geometry/3d/tetrahedra/tetrahedral_mesh_find_tets_attached_to_vertex.js";
5
- import { max2 } from "../../../../core/math/max2.js";
6
1
  import TaskGroup from "../../../../core/process/task/TaskGroup.js";
7
2
  import { actionTask } from "../../../../core/process/task/util/actionTask.js";
8
3
  import { countTask } from "../../../../core/process/task/util/countTask.js";
9
4
  import { promiseTask } from "../../../../core/process/task/util/promiseTask.js";
5
+ import { find_max_depth_radius_for_point } from "./find_max_depth_radius_for_point.js";
10
6
  import { PathTracerProbeRenderer } from "./PathTracerProbeRenderer.js";
11
7
 
12
- /**
13
- *
14
- * @param {number} vertex_index
15
- * @param {TetrahedralMesh} mesh
16
- * @param {number[]} points
17
- */
18
- function find_max_depth_radius_for_point(vertex_index, mesh, points) {
19
- const tets = [];
20
-
21
- const count = tetrahedral_mesh_find_tets_attached_to_vertex(
22
- tets, 0,
23
- mesh,
24
- vertex_index
25
- );
26
-
27
- const ref_x = points[vertex_index * 3];
28
- const ref_y = points[vertex_index * 3 + 1];
29
- const ref_z = points[vertex_index * 3 + 2];
30
-
31
- let radius_sqr = 0;
32
-
33
- for (let i = 0; i < count; i++) {
34
- const tet = tets[i];
35
-
36
- for (let j = 0; j < 4; j++) {
37
- const v = mesh.getVertexIndex(tet, j);
38
-
39
- const x = points[v * 3];
40
- const y = points[v * 3 + 1];
41
- const z = points[v * 3 + 2];
42
-
43
- const r2 = v3_distance_sqr(ref_x, ref_y, ref_z, x, y, z);
44
-
45
- radius_sqr = max2(r2, radius_sqr);
46
- }
47
- }
48
-
49
- return Math.sqrt(radius_sqr);
50
- }
51
-
52
8
  export class LightProbeVolumeBaker {
53
9
 
54
- // this._ren = new WebGLCubeProbeRenderer();
55
10
  _ren = new PathTracerProbeRenderer();
56
11
 
57
12
 
@@ -86,11 +41,14 @@ export class LightProbeVolumeBaker {
86
41
  // Bake depth
87
42
  const max_distance = find_max_depth_radius_for_point(i, lpv.mesh, lpv.points);
88
43
 
44
+ // bias a little to ensure we capture everything
45
+ const max_depth = max_distance * 1.01 + 0.00001;
46
+
89
47
  const depth_resolution = lpv.depth_map_resolution;
90
48
 
91
49
  renderer.bake_depth_octahedral(
92
50
  depth_resolution,
93
- max_distance*1.05 + 0.00001,
51
+ max_depth,
94
52
  lpv.points, i * 3,
95
53
  lpv.depth, i * depth_resolution * depth_resolution
96
54
  );
@@ -1,9 +1,9 @@
1
1
  export class PathTracerProbeRenderer extends ProbeRenderer {
2
2
  tracer: PathTracer;
3
+ max_bounce_count: number;
3
4
  sample_count: number;
4
5
  random: () => number;
5
6
  scene: PathTracedScene;
6
- bake_depth(position: any, position_offset: any, output: any, output_offset: any): void;
7
7
  /**
8
8
  *
9
9
  * @param {number} resolution
@@ -1 +1 @@
1
- {"version":3,"file":"PathTracerProbeRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.js"],"names":[],"mappings":"AAwBA;IACI,mBAA0B;IAC1B,qBAAmB;IACnB,qBAAyB;IAEzB,uBAA6B;IAE7B,uFAoBC;IAED;;;;;;;;OAQG;IACH,kCAPW,MAAM,aACN,MAAM,YACN,MAAM,EAAE,mBACR,MAAM,UACN,MAAM,EAAE,iBACR,MAAM,QAahB;IAED,iFAqCC;IAKD,mBACC;IAED,4BAKC;CACJ;8BA/G6B,oBAAoB;2BAJvB,8BAA8B;gCADzB,mCAAmC"}
1
+ {"version":3,"file":"PathTracerProbeRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/lpv/PathTracerProbeRenderer.js"],"names":[],"mappings":"AAuBA;IACI,mBAA0B;IAC1B,yBAAqB;IACrB,qBAAmB;IACnB,qBAAyB;IAEzB,uBAA6B;IAE7B;;;;;;;;OAQG;IACH,kCAPW,MAAM,aACN,MAAM,YACN,MAAM,EAAE,mBACR,MAAM,UACN,MAAM,EAAE,iBACR,MAAM,QAahB;IAED,iFAuCC;IAKD,mBACC;IAED,4BAKC;CACJ;8BA5F6B,oBAAoB;2BAHvB,8BAA8B;gCADzB,mCAAmC"}
@@ -12,7 +12,6 @@ import { PathTracedScene } from "../path_tracer/PathTracedScene.js";
12
12
  import { PathTracer } from "../path_tracer/PathTracer.js";
13
13
  import { populate_path_traced_scene_from_ecd } from "../path_tracer/populate_path_traced_scene_from_ecd.js";
14
14
  import { bake_octahedral_depth_map } from "./depth/octahedral/bake_octahedral_depth_map.js";
15
- import { sh3_bake_depth } from "./depth/sh3_bake_depth.js";
16
15
  import { ProbeRenderer } from "./ProbeRenderer.js";
17
16
 
18
17
  const __shared_buffer = new ArrayBuffer((27 + 9) * 8);
@@ -24,33 +23,12 @@ const sampled_irradiance = new Float32Array(3);
24
23
 
25
24
  export class PathTracerProbeRenderer extends ProbeRenderer {
26
25
  tracer = new PathTracer();
26
+ max_bounce_count = 7;
27
27
  sample_count = 192;
28
28
  random = seededRandom(0);
29
29
 
30
30
  scene = new PathTracedScene()
31
31
 
32
- bake_depth(position, position_offset, output, output_offset) {
33
-
34
- sh3_bake_depth(
35
- coefficients, 0, this.scene,
36
- position[position_offset],
37
- position[position_offset + 1],
38
- position[position_offset + 2],
39
- 1.5
40
- );
41
-
42
- sh3_dering_optimize_positive(coefficients, 0, coefficients, 0, 1);
43
-
44
- for (let i = 0; i < 9; i++) {
45
- const coefficient = coefficients[i];
46
-
47
- for (let j = 0; j < 3; j++) {
48
- output[output_offset + i * 3 + j] = coefficient;
49
- }
50
- }
51
-
52
- }
53
-
54
32
  /**
55
33
  *
56
34
  * @param {number} resolution
@@ -84,13 +62,15 @@ export class PathTracerProbeRenderer extends ProbeRenderer {
84
62
 
85
63
  coefficients.fill(0);
86
64
 
65
+ const max_bounce = this.max_bounce_count;
66
+
87
67
  for (let i = 0; i < this.sample_count; i++) {
88
68
 
89
69
  randomPointOnSphere(this.random, ray, 3);
90
70
  ray.tMax = Infinity;
91
71
  ray.tMin = 0;
92
72
 
93
- tracer.path_trace(sampled_irradiance, ray, 1, 7, this.random, this.scene);
73
+ tracer.path_trace(sampled_irradiance, ray, 1, max_bounce, this.random, this.scene);
94
74
 
95
75
  sh3_basis_at(ray[3], ray[4], ray[5], sh_basis);
96
76
 
@@ -1 +1 @@
1
- {"version":3,"file":"build_probes_for_scene.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/lpv/build_probes_for_scene.js"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,iFAPW,gBAAgB,GAKd,QAAQ,gBAAgB,CAAC,CAmFrC;iCA7FgC,uBAAuB"}
1
+ {"version":3,"file":"build_probes_for_scene.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/lpv/build_probes_for_scene.js"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,iFAPW,gBAAgB,GAKd,QAAQ,gBAAgB,CAAC,CAoFrC;iCA9FgC,uBAAuB"}
@@ -1,6 +1,7 @@
1
1
  import { AABB3 } from "../../../../core/geom/3d/aabb/AABB3.js";
2
2
  import { make_justified_point_grid } from "../../../../core/geom/3d/util/make_justified_point_grid.js";
3
3
  import Vector2 from "../../../../core/geom/Vector2.js";
4
+ import { seededRandom } from "../../../../core/math/random/seededRandom.js";
4
5
  import { delay } from "../../../../core/process/delay.js";
5
6
  import Entity from "../../../ecs/Entity.js";
6
7
  import GUIElement from "../../../ecs/gui/GUIElement.js";
@@ -49,12 +50,13 @@ export async function build_probes_for_scene(
49
50
 
50
51
 
51
52
  // sg_hierarchy_compute_bounding_box_via_parent_entity(light_volume_bounds, composition.entity.entity, ecd);
53
+ const random = seededRandom(1);
52
54
 
53
- // for (let i = 0; i < 100; i++) {
54
- // lpv.add_point(
55
- // randomFloatBetween(random, light_volume_bounds.x0, light_volume_bounds.x1),
56
- // randomFloatBetween(random, light_volume_bounds.y0, light_volume_bounds.y1),
57
- // randomFloatBetween(random, light_volume_bounds.z0, light_volume_bounds.z1),
55
+ // for (let i = 0; i < 1000; i++) {
56
+ // volume.add_point(
57
+ // randomFloatBetween(random, model_bounds.x0, model_bounds.x1),
58
+ // randomFloatBetween(random, model_bounds.y0, model_bounds.y1),
59
+ // randomFloatBetween(random, model_bounds.z0, model_bounds.z1),
58
60
  // );
59
61
  // }
60
62
 
@@ -64,7 +66,7 @@ export async function build_probes_for_scene(
64
66
 
65
67
  // lpv.add_point(10, 1, -10);
66
68
 
67
- await delay(2000);
69
+ await delay(1);
68
70
 
69
71
  //
70
72
  // console.profile('lpv build');
@@ -1 +1 @@
1
- {"version":3,"file":"bake_octahedral_depth_map.d.ts","sourceRoot":"","sources":["../../../../../../../../src/engine/graphics/sh3/lpv/depth/octahedral/bake_octahedral_depth_map.js"],"names":[],"mappings":"AAQA;;;;;;;;;GASG;AACH,kDARW,MAAM,EAAE,iBACR,MAAM,oCAEN,MAAM,EAAE,UAAQ,mBAChB,MAAM,cACN,MAAM,aACN,MAAM,QAyChB"}
1
+ {"version":3,"file":"bake_octahedral_depth_map.d.ts","sourceRoot":"","sources":["../../../../../../../../src/engine/graphics/sh3/lpv/depth/octahedral/bake_octahedral_depth_map.js"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,kDARW,MAAM,EAAE,iBACR,MAAM,oCAEN,MAAM,EAAE,UAAQ,mBAChB,MAAM,cACN,MAAM,aACN,MAAM,QAuChB"}
@@ -6,6 +6,8 @@ import { Ray3 } from "../../../../../../core/geom/3d/Ray3.js";
6
6
 
7
7
  const scratch_ray = new Ray3();
8
8
 
9
+ const ray_hit = [];
10
+
9
11
  /**
10
12
  *
11
13
  * @param {number[]} result
@@ -29,13 +31,11 @@ export function bake_octahedral_depth_map(
29
31
 
30
32
  const ray_direction = scratch_ray.direction;
31
33
 
32
- const ray_hit = [];
33
-
34
34
  for (let oct_x = 0; oct_x < resolution; oct_x++) {
35
35
  for (let oct_y = 0; oct_y < resolution; oct_y++) {
36
36
 
37
- const u = oct_x / (resolution - 1);
38
- const v = oct_y / (resolution - 1);
37
+ const u = (oct_x) / (resolution - 1);
38
+ const v = (oct_y) / (resolution - 1);
39
39
 
40
40
  decode_octahedron_to_unit(
41
41
  ray_direction, 0,
@@ -1 +1 @@
1
- {"version":3,"file":"VLPDepthMapVisualisation.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/engine/graphics/sh3/lpv/depth/octahedral/v2/VLPDepthMapVisualisation.js"],"names":[],"mappings":"AA0EA;IAYI;;;;OAIG;IACH,oCAFa,wBAAwB,CAQpC;IAfD,qBAEC;IAeD,gBA4CC;;CAEJ;mBAtIkB,iCAAiC"}
1
+ {"version":3,"file":"VLPDepthMapVisualisation.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/engine/graphics/sh3/lpv/depth/octahedral/v2/VLPDepthMapVisualisation.js"],"names":[],"mappings":"AA6EA;IAYI;;;;OAIG;IACH,oCAFa,wBAAwB,CAQpC;IAfD,qBAEC;IAeD,gBA4CC;;CAEJ;mBAzIkB,iCAAiC"}
@@ -49,6 +49,9 @@ function makeMaterial(lpv) {
49
49
  },
50
50
  lpv_t_probe_depth: {
51
51
  value: depth_atlas
52
+ },
53
+ lpv_u_probe_depth_resolution:{
54
+ value: lpv.depth_map_resolution
52
55
  }
53
56
  }
54
57
  });
@@ -12,6 +12,8 @@ precision highp usampler3D;
12
12
  uniform sampler2D lpv_t_probe_positions;
13
13
  uniform sampler2D lpv_t_probe_depth;
14
14
 
15
+ uniform uint lpv_u_probe_depth_resolution;
16
+
15
17
  #define SEARCH_STEP_LIMIT 64u
16
18
  #define INVALID_TET 1073741823u
17
19
 
@@ -84,7 +86,7 @@ float SampleBlended(sampler2D tex, vec2 uv0, vec2 uv1, vec2 uv2, vec4 weights) {
84
86
 
85
87
  float lpv_probe_getDepth(uint probe_index, vec3 direction) {
86
88
  // get offset
87
- uint depth_tile_resolution = 24u;
89
+ uint depth_tile_resolution = lpv_u_probe_depth_resolution;
88
90
  uvec2 atlas_size = uvec2(4096u);
89
91
 
90
92
  uint tiles_per_row = atlas_size.x / depth_tile_resolution;
@@ -152,7 +154,7 @@ void main() {
152
154
  vec3 normal = normalize(vNormal);
153
155
  vec3 worldNormal = normalize(inverseTransformDirection(normal, viewMatrix));
154
156
 
155
- float depth = lpv_probe_getDepth(instance_index , worldNormal) / 10.0;
157
+ float depth = lpv_probe_getDepth(instance_index , worldNormal) / 7.0;
156
158
 
157
159
  gl_FragColor = vec4(vec3(depth), 1.0);
158
160
  // gl_FragColor = vec4( 1.0);
@@ -0,0 +1,8 @@
1
+ /**
2
+ *
3
+ * @param {number} vertex_index
4
+ * @param {TetrahedralMesh} mesh
5
+ * @param {number[]} points
6
+ */
7
+ export function find_max_depth_radius_for_point(vertex_index: number, mesh: TetrahedralMesh, points: number[]): number;
8
+ //# sourceMappingURL=find_max_depth_radius_for_point.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find_max_depth_radius_for_point.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/lpv/find_max_depth_radius_for_point.js"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,8DAJW,MAAM,iCAEN,MAAM,EAAE,UAiClB"}
@@ -0,0 +1,50 @@
1
+ import { v3_distance_sqr } from "../../../../core/geom/vec3/v3_distance_sqr.js";
2
+ import {
3
+ tetrahedral_mesh_find_tets_attached_to_vertex
4
+ } from "../../../../core/geometry/3d/tetrahedra/tetrahedral_mesh_find_tets_attached_to_vertex.js";
5
+ import { max2 } from "../../../../core/math/max2.js";
6
+
7
+ /**
8
+ *
9
+ * @type {number[]}
10
+ */
11
+ const tets = [];
12
+
13
+ /**
14
+ *
15
+ * @param {number} vertex_index
16
+ * @param {TetrahedralMesh} mesh
17
+ * @param {number[]} points
18
+ */
19
+ export function find_max_depth_radius_for_point(vertex_index, mesh, points) {
20
+
21
+ const count = tetrahedral_mesh_find_tets_attached_to_vertex(
22
+ tets, 0,
23
+ mesh,
24
+ vertex_index
25
+ );
26
+
27
+ const ref_x = points[vertex_index * 3];
28
+ const ref_y = points[vertex_index * 3 + 1];
29
+ const ref_z = points[vertex_index * 3 + 2];
30
+
31
+ let radius_sqr = 0;
32
+
33
+ for (let i = 0; i < count; i++) {
34
+ const tet = tets[i];
35
+
36
+ for (let j = 0; j < 4; j++) {
37
+ const v = mesh.getVertexIndex(tet, j);
38
+
39
+ const x = points[v * 3];
40
+ const y = points[v * 3 + 1];
41
+ const z = points[v * 3 + 2];
42
+
43
+ const r2 = v3_distance_sqr(ref_x, ref_y, ref_z, x, y, z);
44
+
45
+ radius_sqr = max2(r2, radius_sqr);
46
+ }
47
+ }
48
+
49
+ return Math.sqrt(radius_sqr);
50
+ }
@@ -364,7 +364,6 @@ async function main(engine) {
364
364
  // const path = 'data/models/samples/sd_macross_city_standoff_diorama/scene.gltf';
365
365
  // const path = 'data/models/sibenik/2/model.gltf';
366
366
  // const path = 'data/models/vokselia_spawn/model.gltf';
367
- // const path = 'data/models/LowPolyTownshipSet/Town_Hall/model.gltf';
368
367
  // const path = 'data/models/samples/just_a_girl/scene.gltf';
369
368
  // const path = 'data/models/samples/slum_house/scene.gltf';
370
369
  // const path = 'data/models/samples/jack_trigger/scene.gltf';
@@ -374,14 +373,15 @@ async function main(engine) {
374
373
  // const path = 'data/models/samples/ancient_bath_house_-_modular_set/scene.gltf';
375
374
  // const path = 'data/models/samples/environment_-_library/scene.gltf';
376
375
  // const path = 'data/models/Scans/green_car_wreck/scene.gltf';
377
- // const path = 'data/models/pica_pica/pica_pica.gltf';
378
- // const path = 'data/models/sibenik/3-window-less/model.gltf';
379
376
  // const path = 'data/models/samples/low_poly_classroom/no-glass/model.gltf';
380
377
  // const path = 'data/models/samples/the_attic_environment/scene1.gltf';
381
378
  // const path = 'data/models/LowPolyTownshipSet/Small_house/Small_house.gltf';
382
379
  // const path = 'data/models/samples/cyberpunk_bike/scene.gltf';
380
+ // const path = 'data/models/LowPolyTownshipSet/Town_Hall/model.gltf';
381
+ // const path = 'data/models/sibenik/3-window-less/model.gltf';
382
+ // const path = 'data/models/samples/gi_box_01/model.glb';
383
383
  // const path = 'data/models/sponza-pbr/gltf/sponza.glb';
384
- const path = 'data/models/samples/gi_box_01/model.glb';
384
+ const path = 'data/models/pica_pica/pica_pica.gltf';
385
385
 
386
386
  const mesh_asset = await engine.assetManager.promise(path, 'model/gltf+json');
387
387
  const gltf = mesh_asset.gltf;