@woosh/meep-engine 2.119.33 → 2.119.35

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.
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "description": "Fully featured ECS game engine written in JavaScript",
6
6
  "type": "module",
7
7
  "author": "Alexander Goldring",
8
- "version": "2.119.33",
8
+ "version": "2.119.35",
9
9
  "main": "build/meep.module.js",
10
10
  "module": "build/meep.module.js",
11
11
  "exports": {
@@ -0,0 +1,8 @@
1
+ /**
2
+ *
3
+ * @param {number[]|Float32Array} out
4
+ * @param {number} out_offset
5
+ * @param {number[]|Float32Array} mat4
6
+ */
7
+ export function m4_extract_scale(out: number[] | Float32Array, out_offset: number, mat4: number[] | Float32Array): void;
8
+ //# sourceMappingURL=m4_extract_scale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"m4_extract_scale.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/3d/m4_extract_scale.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,sCAJW,MAAM,EAAE,GAAC,YAAY,cACrB,MAAM,QACN,MAAM,EAAE,GAAC,YAAY,QA6B/B"}
@@ -0,0 +1,36 @@
1
+ import { v3_length } from "../vec3/v3_length.js";
2
+
3
+ /**
4
+ *
5
+ * @param {number[]|Float32Array} out
6
+ * @param {number} out_offset
7
+ * @param {number[]|Float32Array} mat4
8
+ */
9
+ export function m4_extract_scale(
10
+ out, out_offset,
11
+ mat4
12
+ ){
13
+
14
+ const m11 = mat4[0];
15
+ const m12 = mat4[1];
16
+ const m13 = mat4[2];
17
+
18
+ const scale_x = v3_length(m11, m12, m13);
19
+
20
+ const m21 = mat4[4];
21
+ const m22 = mat4[5];
22
+ const m23 = mat4[6];
23
+
24
+ const scale_y = v3_length(m21, m22, m23);
25
+
26
+ const m31 = mat4[8];
27
+ const m32 = mat4[9];
28
+ const m33 = mat4[10];
29
+
30
+ const scale_z = v3_length(m31, m32, m33);
31
+
32
+ out[out_offset] = scale_x;
33
+ out[out_offset+1] = scale_y;
34
+ out[out_offset+2] = scale_z;
35
+
36
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ *
3
+ * @param {SurfacePoint3} result
4
+ * @param {BVH} bvh
5
+ * @param {number[]|Float32Array} positions
6
+ * @param {number[]|Uint32Array|Uint16Array} indices
7
+ * @param {number} x
8
+ * @param {number} y
9
+ * @param {number} z
10
+ * @param {number} max_distance
11
+ * @return {boolean}
12
+ */
13
+ export function query_bvh_geometry_nearest(result: SurfacePoint3, bvh: BVH, positions: number[] | Float32Array, indices: number[] | Uint32Array | Uint16Array, x: number, y: number, z: number, max_distance: number): boolean;
14
+ //# sourceMappingURL=query_bvh_geometry_nearest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query_bvh_geometry_nearest.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/geometry/buffered/query/query_bvh_geometry_nearest.js"],"names":[],"mappings":"AAuBA;;;;;;;;;;;GAWG;AACH,uFARW,MAAM,EAAE,GAAC,YAAY,WACrB,MAAM,EAAE,GAAC,WAAW,GAAC,WAAW,KAChC,MAAM,KACN,MAAM,KACN,MAAM,gBACN,MAAM,GACL,OAAO,CAuKlB"}
@@ -0,0 +1,202 @@
1
+ import {
2
+ COLUMN_CHILD_1,
3
+ COLUMN_CHILD_2,
4
+ COLUMN_USER_DATA,
5
+ ELEMENT_WORD_COUNT,
6
+ NULL_NODE
7
+ } from "../../../../../core/bvh2/bvh3/BVH.js";
8
+ import { SCRATCH_UINT32_TRAVERSAL_STACK } from "../../../../../core/collection/SCRATCH_UINT32_TRAVERSAL_STACK.js";
9
+ import {
10
+ aabb3_unsigned_distance_sqr_to_point
11
+ } from "../../../../../core/geom/3d/aabb/aabb3_unsigned_distance_sqr_to_point.js";
12
+ import {
13
+ computeTriangleClosestPointToPointBarycentric
14
+ } from "../../../../../core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js";
15
+ import { v3_compute_triangle_normal } from "../../../../../core/geom/3d/triangle/v3_compute_triangle_normal.js";
16
+ import { v3_distance_sqr } from "../../../../../core/geom/vec3/v3_distance_sqr.js";
17
+
18
+ /**
19
+ *
20
+ * @type {number[]}
21
+ */
22
+ const v3_scratch_0 = [];
23
+ const stack = SCRATCH_UINT32_TRAVERSAL_STACK;
24
+
25
+ /**
26
+ *
27
+ * @param {SurfacePoint3} result
28
+ * @param {BVH} bvh
29
+ * @param {number[]|Float32Array} positions
30
+ * @param {number[]|Uint32Array|Uint16Array} indices
31
+ * @param {number} x
32
+ * @param {number} y
33
+ * @param {number} z
34
+ * @param {number} max_distance
35
+ * @return {boolean}
36
+ */
37
+ export function query_bvh_geometry_nearest(
38
+ result,
39
+ bvh,
40
+ positions,
41
+ indices,
42
+ x, y, z,
43
+ max_distance
44
+ ) {
45
+
46
+ const root = bvh.root;
47
+
48
+ if (root === NULL_NODE) {
49
+ return false;
50
+ }
51
+
52
+
53
+ /**
54
+ * Move stack pointer to local variable scope to avoid de-referencing inside the loop
55
+ * @type {number}
56
+ */
57
+ let pointer = stack.pointer;
58
+
59
+ /**
60
+ *
61
+ * @type {number}
62
+ */
63
+ const stack_top = pointer;
64
+
65
+ stack[pointer++] = root;
66
+
67
+ /*
68
+ For performance, we bind data directly to avoid extra copies required to read out AABB
69
+ */
70
+ const float32 = bvh.__data_float32;
71
+ const uint32 = bvh.__data_uint32;
72
+
73
+ let nearest_distance_sqr = max_distance * max_distance;
74
+
75
+
76
+ do {
77
+ --pointer;
78
+
79
+ /**
80
+ *
81
+ * @type {number}
82
+ */
83
+ const node = stack[pointer];
84
+
85
+ const address = node * ELEMENT_WORD_COUNT;
86
+
87
+ // test node against the ray
88
+
89
+
90
+ // get fist child to check if this is a leaf node or not
91
+ const child_1 = uint32[address + COLUMN_CHILD_1];
92
+
93
+ if (child_1 !== NULL_NODE) {
94
+
95
+ // this is not a leaf node, push children onto traversal stack
96
+ const child_2 = uint32[address + COLUMN_CHILD_2];
97
+
98
+ // to achieve faster convergence, we sort children before adding them to the stack by their proximity to the reference point
99
+ const child_1_address = child_1 * ELEMENT_WORD_COUNT;
100
+
101
+ const distance_sqr_to_child1 = aabb3_unsigned_distance_sqr_to_point(
102
+ float32[child_1_address], float32[child_1_address + 1], float32[child_1_address + 2],
103
+ float32[child_1_address + 3], float32[child_1_address + 4], float32[child_1_address + 5],
104
+ x, y, z
105
+ );
106
+
107
+ const child_2_address = child_2 * ELEMENT_WORD_COUNT;
108
+
109
+ const distance_sqr_to_child2 = aabb3_unsigned_distance_sqr_to_point(
110
+ float32[child_2_address], float32[child_2_address + 1], float32[child_2_address + 2],
111
+ float32[child_2_address + 3], float32[child_2_address + 4], float32[child_2_address + 5],
112
+ x, y, z
113
+ );
114
+
115
+ if (distance_sqr_to_child1 < distance_sqr_to_child2) {
116
+
117
+ if (distance_sqr_to_child2 < nearest_distance_sqr) {
118
+ stack[pointer++] = child_2;
119
+ }
120
+
121
+ if (distance_sqr_to_child1 < nearest_distance_sqr) {
122
+ stack[pointer++] = child_1;
123
+ }
124
+
125
+ } else {
126
+
127
+ if (distance_sqr_to_child1 < nearest_distance_sqr) {
128
+ stack[pointer++] = child_1;
129
+ }
130
+
131
+ if (distance_sqr_to_child2 < nearest_distance_sqr) {
132
+ stack[pointer++] = child_2;
133
+ }
134
+
135
+ }
136
+
137
+
138
+ } else {
139
+ // leaf node
140
+ // read triangle data
141
+ const triangle_index = uint32[address + COLUMN_USER_DATA];
142
+
143
+ const a = indices[triangle_index];
144
+ const b = indices[triangle_index + 1];
145
+ const c = indices[triangle_index + 2];
146
+
147
+
148
+ const a_address = a * 3;
149
+ const b_address = b * 3;
150
+ const c_address = c * 3;
151
+
152
+ const ax = positions[a_address];
153
+ const ay = positions[a_address + 1];
154
+ const az = positions[a_address + 2];
155
+
156
+ const bx = positions[b_address];
157
+ const by = positions[b_address + 1];
158
+ const bz = positions[b_address + 2];
159
+
160
+ const cx = positions[c_address];
161
+ const cy = positions[c_address + 1];
162
+ const cz = positions[c_address + 2];
163
+
164
+ computeTriangleClosestPointToPointBarycentric(
165
+ v3_scratch_0, 0,
166
+ x, y, z,
167
+ ax, ay, az,
168
+ bx, by, bz,
169
+ cx, cy, cz
170
+ );
171
+
172
+ const u = v3_scratch_0[0];
173
+ const v = v3_scratch_0[1];
174
+
175
+ // construct edge
176
+
177
+ const contact_x = (bx - ax) * u + (cx - ax) * v + ax;
178
+ const contact_y = (by - ay) * u + (cy - ay) * v + ay;
179
+ const contact_z = (bz - az) * u + (cz - az) * v + az;
180
+
181
+ const distance_to_triangle_sqr = v3_distance_sqr(contact_x, contact_y, contact_z, x, y, z);
182
+
183
+ if (distance_to_triangle_sqr >= nearest_distance_sqr) {
184
+ continue;
185
+ }
186
+
187
+ nearest_distance_sqr = distance_to_triangle_sqr;
188
+
189
+ result.position.set(contact_x, contact_y, contact_z);
190
+
191
+ v3_compute_triangle_normal(result.normal, 0,
192
+ ax, ay, az,
193
+ bx, by, bz,
194
+ cx, cy, cz
195
+ );
196
+
197
+ result.index = triangle_index;
198
+ }
199
+ } while (pointer > stack_top);
200
+
201
+ return true;
202
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"BufferedGeometryBVH.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/path_tracer/BufferedGeometryBVH.js"],"names":[],"mappings":"AA8CA;IAkBI;;;OAGG;IACH,eAFW,KAAK,GAAC,MAAM,EAAE,QAIxB;IAIG;;;;OAIG;IACH,mBAAsB;IAEtB;;;;OAIG;IACH,yBAA4B;IAE5B;;;;OAIG;IACH,6BAAgC;IAGhC;;;;OAIG;IACH,yBAAyB;IAG7B;;;OAGG;IACH,WAFW,MAAM,cAAc,QA2C9B;IAED;;;;;OAKG;IACH,qBAFa,OAAO,CAmHnB;IAED;;;;;;;OAOG;IACH,4BANW,aAAa,KACb,MAAM,KACN,MAAM,KACN,MAAM,GACJ,OAAO,CAqKnB;IAGD;;;;;;OAMG;IACH,iBAJW,MAAM,EAAE,OACR,MAAM,EAAE,OAAK,GACX,MAAM,CAoIlB;IAED;;;;;OAKG;IACH,gBAJW,MAAM,EAAE,OACR,MAAM,EAAE,OAAK,GACX,MAAM,CA2ElB;;CACJ;sBA7oBqB,wCAAwC;8BAMhC,2CAA2C"}
1
+ {"version":3,"file":"BufferedGeometryBVH.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/sh3/path_tracer/BufferedGeometryBVH.js"],"names":[],"mappings":"AAuCA;IAkBI;;;OAGG;IACH,eAFW,KAAK,GAAC,MAAM,EAAE,QAIxB;IAIG;;;;OAIG;IACH,mBAAsB;IAEtB;;;;OAIG;IACH,yBAA4B;IAE5B;;;;OAIG;IACH,6BAAgC;IAGhC;;;;OAIG;IACH,yBAAyB;IAG7B;;;OAGG;IACH,WAFW,MAAM,cAAc,QA2C9B;IAED;;;;;OAKG;IACH,qBAFa,OAAO,CAmHnB;IAED;;;;;;;OAOG;IACH,4BANW,aAAa,KACb,MAAM,KACN,MAAM,KACN,MAAM,GACJ,OAAO,CAUnB;IAGD;;;;;;OAMG;IACH,iBAJW,MAAM,EAAE,OACR,MAAM,EAAE,OAAK,GACX,MAAM,CAoIlB;IAED;;;;;OAKG;IACH,gBAJW,MAAM,EAAE,OACR,MAAM,EAAE,OAAK,GACX,MAAM,CA2ElB;;CACJ;sBA3eqB,wCAAwC;8BAGhC,2CAA2C"}
@@ -13,21 +13,14 @@ import { SCRATCH_UINT32_TRAVERSAL_STACK } from "../../../../core/collection/SCRA
13
13
  import { AABB3 } from "../../../../core/geom/3d/aabb/AABB3.js";
14
14
  import { aabb3_from_v3_array } from "../../../../core/geom/3d/aabb/aabb3_from_v3_array.js";
15
15
  import { aabb3_intersects_ray_segment } from "../../../../core/geom/3d/aabb/aabb3_intersects_ray_segment.js";
16
- import {
17
- aabb3_unsigned_distance_sqr_to_point
18
- } from "../../../../core/geom/3d/aabb/aabb3_unsigned_distance_sqr_to_point.js";
19
16
  import { SurfacePoint3 } from "../../../../core/geom/3d/SurfacePoint3.js";
20
- import {
21
- computeTriangleClosestPointToPointBarycentric
22
- } from "../../../../core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js";
23
17
 
24
18
  import {
25
19
  computeTriangleRayIntersectionBarycentricGeometry
26
20
  } from "../../../../core/geom/3d/triangle/computeTriangleRayIntersectionBarycentricGeometry.js";
27
- import { v3_compute_triangle_normal } from "../../../../core/geom/3d/triangle/v3_compute_triangle_normal.js";
28
- import { v3_distance_sqr } from "../../../../core/geom/vec3/v3_distance_sqr.js";
29
21
  import Vector4 from "../../../../core/geom/Vector4.js";
30
22
  import { makeGeometryIndexed } from "../../geometry/buffered/makeGeometryIndexed.js";
23
+ import { query_bvh_geometry_nearest } from "../../geometry/buffered/query/query_bvh_geometry_nearest.js";
31
24
  import { computeBoundingSphereFromVertexData } from "../../geometry/computeBoundingSphereFromVertexData.js";
32
25
  import { construct_ray_hit_from_geometry } from "./geometry/construct_ray_hit_from_geometry.js";
33
26
 
@@ -127,7 +120,7 @@ export class BufferedGeometryBVH {
127
120
 
128
121
  const bvh = this.#bvh;
129
122
 
130
- aabb3_from_v3_array( this.#bounds, array_positions, array_positions.length);
123
+ aabb3_from_v3_array(this.#bounds, array_positions, array_positions.length);
131
124
 
132
125
  ebvh_build_for_geometry_morton(
133
126
  bvh,
@@ -285,162 +278,7 @@ export class BufferedGeometryBVH {
285
278
 
286
279
  const bvh = this.#bvh;
287
280
 
288
- const root = bvh.root;
289
-
290
- if (root === NULL_NODE) {
291
- return false;
292
- }
293
-
294
- /**
295
- * Move stack pointer to local variable scope to avoid de-referencing inside the loop
296
- * @type {number}
297
- */
298
- let pointer = stack.pointer;
299
-
300
- /**
301
- *
302
- * @type {number}
303
- */
304
- const stack_top = pointer;
305
-
306
- stack[pointer++] = root;
307
-
308
- /*
309
- For performance, we bind data directly to avoid extra copies required to read out AABB
310
- */
311
- const float32 = bvh.__data_float32;
312
- const uint32 = bvh.__data_uint32;
313
-
314
- let nearest_distance_sqr = Infinity;
315
-
316
-
317
- do {
318
- --pointer;
319
-
320
- /**
321
- *
322
- * @type {number}
323
- */
324
- const node = stack[pointer];
325
-
326
- const address = node * ELEMENT_WORD_COUNT;
327
-
328
- // test node against the ray
329
-
330
-
331
- // get fist child to check if this is a leaf node or not
332
- const child_1 = uint32[address + COLUMN_CHILD_1];
333
-
334
- if (child_1 !== NULL_NODE) {
335
-
336
- // this is not a leaf node, push children onto traversal stack
337
- const child_2 = uint32[address + COLUMN_CHILD_2];
338
-
339
- // to achieve faster convergence, we sort children before adding them to the stack by their proximity to the reference point
340
- const child_1_address = child_1 * ELEMENT_WORD_COUNT;
341
-
342
- const distance_sqr_to_child1 = aabb3_unsigned_distance_sqr_to_point(
343
- float32[child_1_address], float32[child_1_address + 1], float32[child_1_address + 2],
344
- float32[child_1_address + 3], float32[child_1_address + 4], float32[child_1_address + 5],
345
- x, y, z
346
- );
347
-
348
- const child_2_address = child_2 * ELEMENT_WORD_COUNT;
349
-
350
- const distance_sqr_to_child2 = aabb3_unsigned_distance_sqr_to_point(
351
- float32[child_2_address], float32[child_2_address + 1], float32[child_2_address + 2],
352
- float32[child_2_address + 3], float32[child_2_address + 4], float32[child_2_address + 5],
353
- x, y, z
354
- );
355
-
356
- if (distance_sqr_to_child1 < distance_sqr_to_child2) {
357
-
358
- if (distance_sqr_to_child2 < nearest_distance_sqr) {
359
- stack[pointer++] = child_2;
360
- }
361
-
362
- if (distance_sqr_to_child1 < nearest_distance_sqr) {
363
- stack[pointer++] = child_1;
364
- }
365
-
366
- } else {
367
-
368
- if (distance_sqr_to_child1 < nearest_distance_sqr) {
369
- stack[pointer++] = child_1;
370
- }
371
-
372
- if (distance_sqr_to_child2 < nearest_distance_sqr) {
373
- stack[pointer++] = child_2;
374
- }
375
-
376
- }
377
-
378
-
379
- } else {
380
- // leaf node
381
- // read triangle data
382
- const triangle_index = uint32[address + COLUMN_USER_DATA];
383
-
384
- const a = indices[triangle_index];
385
- const b = indices[triangle_index + 1];
386
- const c = indices[triangle_index + 2];
387
-
388
-
389
- const a_address = a * 3;
390
- const b_address = b * 3;
391
- const c_address = c * 3;
392
-
393
- const ax = positions[a_address];
394
- const ay = positions[a_address + 1];
395
- const az = positions[a_address + 2];
396
-
397
- const bx = positions[b_address];
398
- const by = positions[b_address + 1];
399
- const bz = positions[b_address + 2];
400
-
401
- const cx = positions[c_address];
402
- const cy = positions[c_address + 1];
403
- const cz = positions[c_address + 2];
404
-
405
- computeTriangleClosestPointToPointBarycentric(
406
- v3_scratch_0, 0,
407
- x, y, z,
408
- ax, ay, az,
409
- bx, by, bz,
410
- cx, cy, cz
411
- );
412
-
413
- const u = v3_scratch_0[0];
414
- const v = v3_scratch_0[1];
415
-
416
- // construct edge
417
-
418
- const contact_x = (bx - ax) * u + (cx - ax) * v + ax;
419
- const contact_y = (by - ay) * u + (cy - ay) * v + ay;
420
- const contact_z = (bz - az) * u + (cz - az) * v + az;
421
-
422
- const distance_to_triangle_sqr = v3_distance_sqr(contact_x, contact_y, contact_z, x, y, z);
423
-
424
- if (distance_to_triangle_sqr >= nearest_distance_sqr) {
425
- continue;
426
- }
427
-
428
- nearest_distance_sqr = distance_to_triangle_sqr;
429
-
430
- result.position.set(contact_x, contact_y, contact_z);
431
-
432
- v3_compute_triangle_normal(result.normal, 0,
433
- ax, ay, az,
434
- bx, by, bz,
435
- cx, cy, cz
436
- );
437
-
438
- result.index = triangle_index;
439
- }
440
- } while (pointer > stack_top);
441
-
442
-
443
- return true;
281
+ return query_bvh_geometry_nearest(result, bvh, positions, indices, x, y, z, Infinity);
444
282
  }
445
283
 
446
284