@carbonenginejs/runtime-resource 0.14.0 → 0.15.0

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.
@@ -12,13 +12,13 @@ import { assertResourcePayloadObject, assertResourcePayloadArray, resourcePayloa
12
12
  // Source: trinity/trinity/Resources/TriGeometryRes.cpp
13
13
  // Source: trinity/trinity/Resources/TriGeometryRes_Blue.cpp
14
14
 
15
- /**
16
- * Resource record that owns geometry payload facts (meshes, optional
17
- * skeletons and animations) and LOD-force metadata, while engine packages
18
- * decide device buffers, vertex declarations, and draw-time state.
19
- *
20
- * Geometry inspection composes the generic math supplied by runtime-utils
21
- * with resource-specific payload traversal.
15
+ /**
16
+ * Resource record that owns geometry payload facts (meshes, optional
17
+ * skeletons and animations) and LOD-force metadata, while engine packages
18
+ * decide device buffers, vertex declarations, and draw-time state.
19
+ *
20
+ * Geometry inspection composes the generic math supplied by runtime-utils
21
+ * with resource-specific payload traversal.
22
22
  */
23
23
  class TriGeometryRes extends CjsResource {
24
24
  forceLod = false;
@@ -35,12 +35,12 @@ class TriGeometryRes extends CjsResource {
35
35
  });
36
36
  }
37
37
 
38
- /**
39
- * Attach a plain geometry payload.
40
- *
41
- * @param {object|null} payload
42
- * @param {object|null} options
43
- * @returns {TriGeometryRes}
38
+ /**
39
+ * Attach a plain geometry payload.
40
+ *
41
+ * @param {object|null} payload
42
+ * @param {object|null} options
43
+ * @returns {TriGeometryRes}
44
44
  */
45
45
  SetPayload(payload = null, options = null) {
46
46
  if (payload === null) {
@@ -59,38 +59,38 @@ class TriGeometryRes extends CjsResource {
59
59
  return this;
60
60
  }
61
61
 
62
- /**
63
- * Get mesh count from the CPU geometry payload.
64
- *
65
- * @returns {number}
62
+ /**
63
+ * Get mesh count from the CPU geometry payload.
64
+ *
65
+ * @returns {number}
66
66
  */
67
67
  GetMeshCount() {
68
68
  return this.GetPayload()?.meshes?.length || 0;
69
69
  }
70
70
 
71
- /**
72
- * Get animation count from the CPU geometry payload.
73
- *
74
- * @returns {number}
71
+ /**
72
+ * Get animation count from the CPU geometry payload.
73
+ *
74
+ * @returns {number}
75
75
  */
76
76
  GetAnimationCount() {
77
77
  return this.GetPayload()?.animations?.length || 0;
78
78
  }
79
79
 
80
- /**
81
- * Get skeleton count from the CPU geometry payload.
82
- *
83
- * @returns {number}
80
+ /**
81
+ * Get skeleton count from the CPU geometry payload.
82
+ *
83
+ * @returns {number}
84
84
  */
85
85
  GetSkeletonCount() {
86
86
  return this.GetPayload()?.skeletons?.length || 0;
87
87
  }
88
88
 
89
- /**
90
- * Get one resource-owned skeleton from the CPU geometry payload.
91
- *
92
- * @param {number} skeletonIndex
93
- * @returns {*}
89
+ /**
90
+ * Get one resource-owned skeleton from the CPU geometry payload.
91
+ *
92
+ * @param {number} skeletonIndex
93
+ * @returns {*}
94
94
  */
95
95
  GetSkeletonData(skeletonIndex = 0) {
96
96
  const index = Number(skeletonIndex);
@@ -100,46 +100,113 @@ class TriGeometryRes extends CjsResource {
100
100
  return this.GetPayload()?.skeletons?.[index] || null;
101
101
  }
102
102
 
103
- /**
104
- * Get mesh area count from a CPU geometry payload mesh.
105
- *
106
- * @param {number} meshIndex
107
- * @returns {number}
103
+ /**
104
+ * Get mesh area count from a CPU geometry payload mesh.
105
+ *
106
+ * @param {number} meshIndex
107
+ * @returns {number}
108
108
  */
109
109
  GetMeshAreaCount(meshIndex = 0) {
110
110
  const mesh = this.GetPayload()?.meshes?.[meshIndex];
111
111
  return mesh?.areas?.length || 0;
112
112
  }
113
113
 
114
- /**
115
- * Get mesh name from a CPU geometry payload.
116
- *
117
- * @param {number} meshIndex
118
- * @returns {string}
114
+ // Carbon TriGeometryRes.cpp:294-319. Walks LODs from the LOWEST quality up
115
+ // and takes the first whose authored maxScreenSize still covers the requested
116
+ // size; a request larger than the best LOD falls back to LOD 0, which Carbon
117
+ // comments explicitly. forceLod pins the index instead, clamped to the last
118
+ // LOD.
119
+
120
+ /**
121
+ * The LOD index this mesh should be drawn at for a screen size, or -1 when the
122
+ * mesh does not exist.
123
+ *
124
+ * @param {number} meshIndex
125
+ * @param {number} screenSize
126
+ * @returns {number}
127
+ */
128
+ GetLodIndexForScreenSize(meshIndex = 0, screenSize = Infinity) {
129
+ const mesh = this.GetPayload()?.meshes?.[meshIndex];
130
+ if (!mesh) return -1;
131
+
132
+ // A decoder may flatten a single-LOD mesh, putting the areas on the mesh
133
+ // itself; that mesh IS its own only LOD (see getMeshAreas).
134
+ const lods = mesh.lods?.length ? mesh.lods : null;
135
+ const lastLod = lods ? lods.length - 1 : 0;
136
+ if (this.forceLod && this.forcedLodIndex >= 0) {
137
+ return Math.min(this.forcedLodIndex, lastLod);
138
+ }
139
+ for (let index = lastLod; index >= 0; index--) {
140
+ const maxScreenSize = (lods ? lods[index]?.maxScreenSize : mesh.maxScreenSize) ?? 0;
141
+ if (maxScreenSize >= screenSize) return index;
142
+ }
143
+ return 0;
144
+ }
145
+
146
+ // Carbon TriGeometryRes.cpp:268-279. Carbon overloads this on float
147
+ // screenSize versus int lodIndex; JavaScript cannot, so the index form is
148
+ // GetMeshLodByIndex. Carbon indexes m_lods with the result unguarded, so a
149
+ // mesh with an EMPTY lod list reads out of bounds there; this port returns
150
+ // null (docs/research/carbon-known-defects.md).
151
+
152
+ /**
153
+ * The LOD data this mesh should be drawn at for a screen size, or null when
154
+ * the mesh has no LODs.
155
+ *
156
+ * @param {number} meshIndex
157
+ * @param {number} screenSize
158
+ * @returns {object|null}
159
+ */
160
+ GetMeshLod(meshIndex = 0, screenSize = Infinity) {
161
+ return this.GetMeshLodByIndex(meshIndex, this.GetLodIndexForScreenSize(meshIndex, screenSize));
162
+ }
163
+
164
+ /**
165
+ * The LOD data at an explicit index, or null when the mesh or index does not
166
+ * exist (Carbon TriGeometryRes.cpp:281-292).
167
+ *
168
+ * @param {number} meshIndex
169
+ * @param {number} lodIndex
170
+ * @returns {object|null}
171
+ */
172
+ GetMeshLodByIndex(meshIndex = 0, lodIndex = 0) {
173
+ const mesh = this.GetPayload()?.meshes?.[meshIndex];
174
+ if (!mesh || lodIndex < 0) return null;
175
+ if (mesh.lods?.length) {
176
+ return lodIndex < mesh.lods.length ? mesh.lods[lodIndex] : null;
177
+ }
178
+ return lodIndex === 0 && mesh.areas ? mesh : null;
179
+ }
180
+
181
+ /**
182
+ * Get mesh name from a CPU geometry payload.
183
+ *
184
+ * @param {number} meshIndex
185
+ * @returns {string}
119
186
  */
120
187
  GetMeshName(meshIndex = 0) {
121
188
  return this.GetPayload()?.meshes?.[meshIndex]?.name || "";
122
189
  }
123
190
 
124
- /**
125
- * Get mesh area name from a CPU geometry payload.
126
- *
127
- * @param {number} meshIndex
128
- * @param {number} areaIndex
129
- * @returns {string}
191
+ /**
192
+ * Get mesh area name from a CPU geometry payload.
193
+ *
194
+ * @param {number} meshIndex
195
+ * @param {number} areaIndex
196
+ * @returns {string}
130
197
  */
131
198
  GetMeshAreaName(meshIndex = 0, areaIndex = 0) {
132
199
  return this.GetPayload()?.meshes?.[meshIndex]?.areas?.[areaIndex]?.name || "";
133
200
  }
134
201
 
135
- /**
136
- * Get area bounding box from geometry payload data.
137
- *
138
- * @param {number} meshIndex
139
- * @param {number} areaIndex
140
- * @param {ArrayLike<number>|null} outMin
141
- * @param {ArrayLike<number>|null} outMax
142
- * @returns {*|boolean}
202
+ /**
203
+ * Get area bounding box from geometry payload data.
204
+ *
205
+ * @param {number} meshIndex
206
+ * @param {number} areaIndex
207
+ * @param {ArrayLike<number>|null} outMin
208
+ * @param {ArrayLike<number>|null} outMax
209
+ * @returns {*|boolean}
143
210
  */
144
211
  GetAreaBoundingBox(meshIndex = 0, areaIndex = 0, outMin = null, outMax = null) {
145
212
  const area = TriGeometryRes.getMeshAreas(this.GetPayload()?.meshes?.[meshIndex])?.[areaIndex];
@@ -147,12 +214,12 @@ class TriGeometryRes extends CjsResource {
147
214
  return TriGeometryRes.copyBounds(bounds, outMin, outMax);
148
215
  }
149
216
 
150
- /**
151
- * Get mesh bounding box from geometry payload data.
152
- * @param {number} meshIndex
153
- * @param {ArrayLike<number>|null} outMin
154
- * @param {ArrayLike<number>|null} outMax
155
- * @returns {*|boolean}
217
+ /**
218
+ * Get mesh bounding box from geometry payload data.
219
+ * @param {number} meshIndex
220
+ * @param {ArrayLike<number>|null} outMin
221
+ * @param {ArrayLike<number>|null} outMax
222
+ * @returns {*|boolean}
156
223
  */
157
224
  GetBoundingBox(meshIndex = 0, outMin = null, outMax = null) {
158
225
  const payload = this.GetPayload();
@@ -160,11 +227,11 @@ class TriGeometryRes extends CjsResource {
160
227
  return TriGeometryRes.copyBounds(bounds, outMin, outMax);
161
228
  }
162
229
 
163
- /**
164
- * Get mesh bounding sphere from geometry payload data.
165
- * @param {number} meshIndex
166
- * @param {ArrayLike<number>|null} out
167
- * @returns {*|boolean}
230
+ /**
231
+ * Get mesh bounding sphere from geometry payload data.
232
+ * @param {number} meshIndex
233
+ * @param {ArrayLike<number>|null} out
234
+ * @returns {*|boolean}
168
235
  */
169
236
  GetBoundingSphere(meshIndex = 0, out = null) {
170
237
  const payload = this.GetPayload();
@@ -175,15 +242,15 @@ class TriGeometryRes extends CjsResource {
175
242
  return true;
176
243
  }
177
244
 
178
- /**
179
- * Calculate a transformed bounding box from canonical CPU vertex data.
180
- *
181
- * Carbon stores the same matrix bytes as gl-matrix; transforming one point
182
- * therefore uses the ordinary column-vector index layout.
183
- *
184
- * @param {number} meshIndex
185
- * @param {ArrayLike<number>} transform
186
- * @returns {{min: number[], max: number[]}|null}
245
+ /**
246
+ * Calculate a transformed bounding box from canonical CPU vertex data.
247
+ *
248
+ * Carbon stores the same matrix bytes as gl-matrix; transforming one point
249
+ * therefore uses the ordinary column-vector index layout.
250
+ *
251
+ * @param {number} meshIndex
252
+ * @param {ArrayLike<number>} transform
253
+ * @returns {{min: number[], max: number[]}|null}
187
254
  */
188
255
  CalculateBoundingBoxFromTransform(meshIndex = 0, transform = null) {
189
256
  if (!transform || transform.length < 16) {
@@ -212,10 +279,10 @@ class TriGeometryRes extends CjsResource {
212
279
  }
213
280
  }
214
281
 
215
- /**
216
- * Recalculate bounding sphere data from canonical CPU vertex positions.
217
- *
218
- * @returns {boolean}
282
+ /**
283
+ * Recalculate bounding sphere data from canonical CPU vertex positions.
284
+ *
285
+ * @returns {boolean}
219
286
  */
220
287
  RecalculateBoundingSphere() {
221
288
  let updated = false;
@@ -234,34 +301,34 @@ class TriGeometryRes extends CjsResource {
234
301
  }
235
302
  }
236
303
 
237
- /**
238
- * Reloading belongs to the resource manager because it owns source and
239
- * canonical replacement policy.
240
- *
241
- * @throws {Error}
304
+ /**
305
+ * Reloading belongs to the resource manager because it owns source and
306
+ * canonical replacement policy.
307
+ *
308
+ * @throws {Error}
242
309
  */
243
310
  Reload() {
244
311
  throw resourceBoundaryError("TriGeometryRes", "Reload", "Request a reload through CjsResMan so source reads and canonical replacement remain manager-owned.");
245
312
  }
246
313
 
247
- /**
248
- * Intersect a ray with canonical CPU triangle data.
249
- *
250
- * @param {ArrayLike<number>} position
251
- * @param {ArrayLike<number>} direction
252
- * @returns {object}
314
+ /**
315
+ * Intersect a ray with canonical CPU triangle data.
316
+ *
317
+ * @param {ArrayLike<number>} position
318
+ * @param {ArrayLike<number>} direction
319
+ * @returns {object}
253
320
  */
254
321
  GetIntersectionPointNormalBone(position, direction) {
255
322
  return TriGeometryRes.intersectGeometry(this.GetPayload()?.meshes, position, direction, -1);
256
323
  }
257
324
 
258
- /**
259
- * Intersect a ray with one area index across canonical CPU meshes.
260
- *
261
- * @param {ArrayLike<number>} position
262
- * @param {ArrayLike<number>} direction
263
- * @param {number} areaIndex
264
- * @returns {object}
325
+ /**
326
+ * Intersect a ray with one area index across canonical CPU meshes.
327
+ *
328
+ * @param {ArrayLike<number>} position
329
+ * @param {ArrayLike<number>} direction
330
+ * @param {number} areaIndex
331
+ * @returns {object}
265
332
  */
266
333
  GetAreaIntersectionPointNormalBone(position, direction, areaIndex = -1) {
267
334
  if (!Number.isInteger(areaIndex) || areaIndex < -1) {
@@ -270,41 +337,74 @@ class TriGeometryRes extends CjsResource {
270
337
  return TriGeometryRes.intersectGeometry(this.GetPayload()?.meshes, position, direction, areaIndex);
271
338
  }
272
339
 
273
- /**
274
- * Get vertex element descriptors for a mesh.
275
- *
276
- * @param {number} meshIndex
277
- * @returns {Array<*>}
340
+ /**
341
+ * Get vertex element descriptors for a mesh.
342
+ *
343
+ * @param {number} meshIndex
344
+ * @returns {Array<*>}
278
345
  */
279
346
  GetMeshVertexElements(meshIndex = 0) {
280
- return this.GetPayload()?.meshes?.[meshIndex]?.vertexElements || [];
347
+ // The CMF reader emits the element list as `decl`, matching the CMF struct
348
+ // field; this accessor read only `vertexElements`, which no reader in this
349
+ // package populates, so it returned an empty list for every real decoded
350
+ // payload. Both names are accepted because the name is the producer's.
351
+ const mesh = this.GetPayload()?.meshes?.[meshIndex];
352
+ return mesh?.decl || mesh?.vertexElements || [];
281
353
  }
282
354
 
283
- /**
284
- * Saving belongs to the selected geometry format writer and destination.
285
- *
286
- * @throws {Error}
355
+ /**
356
+ * Saving belongs to the selected geometry format writer and destination.
357
+ *
358
+ * @throws {Error}
287
359
  */
288
360
  SaveMesh() {
289
361
  throw resourceBoundaryError("TriGeometryRes", "SaveMesh", "Use a geometry format writer with the resource payload and a caller-owned destination.");
290
362
  }
291
363
  static payload = "geometry";
292
364
 
293
- /**
294
- * Gets the canonical area list from a mesh or its first LOD.
295
- *
296
- * @param {object|null} mesh
297
- * @returns {Array<*>|null}
365
+ // Carbon TriGeometryRes.cpp:158-178, declared beside the class
366
+ // (TriGeometryRes.h:202) because it reads LOD data rather than resource
367
+ // state - which is why it is static here. It returns a PLAIN SUM and does not
368
+ // multiply by three: the *3 belongs to the caller, so triangles-only is a
369
+ // property of the mesh draw path rather than of the geometry layer.
370
+
371
+ /**
372
+ * The summed primitive count over `count` areas of a LOD starting at `index`,
373
+ * with the run clamped to the area list as Carbon clamps it; zero when the
374
+ * index is out of range, which callers treat as "emit no draw".
375
+ *
376
+ * @param {object|null} lod
377
+ * @param {number} index
378
+ * @param {number} count
379
+ * @returns {number}
380
+ */
381
+ static getPrimitiveCount(lod, index, count) {
382
+ const areas = lod?.areas ?? null;
383
+ const areaCount = areas?.length ?? 0;
384
+ if (!areaCount || index >= areaCount) return 0;
385
+ const run = index + count > areaCount ? areaCount - index : count;
386
+ let primitiveCount = 0;
387
+ for (let offset = 0; offset < run; offset++) {
388
+ primitiveCount += areas[index + offset]?.primitiveCount ?? 0;
389
+ }
390
+ return primitiveCount;
391
+ }
392
+
393
+ /**
394
+ * Gets the canonical area list from a mesh or its first LOD.
395
+ *
396
+ * @param {object|null} mesh
397
+ * @returns {Array<*>|null}
298
398
  */
299
399
  static getMeshAreas(mesh) {
300
400
  return mesh?.areas || mesh?.lods?.[0]?.areas || null;
301
401
  }
302
402
 
303
- /**
304
- * Gets canonical bounds from a geometry payload object.
305
- *
306
- * @param {object|null} value
307
- * @returns {{min: ArrayLike<number>, max: ArrayLike<number>}|null}
403
+ /**
404
+ * Gets canonical bounds from a geometry payload object.
405
+ *
406
+ * @param {object|null} value
407
+ * @returns {{min: ArrayLike<number>, max: ArrayLike<number>}|null}
308
408
  */
309
409
  static getBounds(value) {
310
410
  if (!value || typeof value !== "object") return null;
@@ -318,24 +418,24 @@ class TriGeometryRes extends CjsResource {
318
418
  return null;
319
419
  }
320
420
 
321
- /**
322
- * Gets the canonical bounding sphere from a geometry payload object.
323
- *
324
- * @param {object|null} value
325
- * @returns {ArrayLike<number>|null}
421
+ /**
422
+ * Gets the canonical bounding sphere from a geometry payload object.
423
+ *
424
+ * @param {object|null} value
425
+ * @returns {ArrayLike<number>|null}
326
426
  */
327
427
  static getSphere(value) {
328
428
  if (!value || typeof value !== "object") return null;
329
429
  return value.sphere || value.boundingSphere || null;
330
430
  }
331
431
 
332
- /**
333
- * Copies bounds into caller-owned outputs, or returns the source object.
334
- *
335
- * @param {{min: ArrayLike<number>, max: ArrayLike<number>}|null} bounds
336
- * @param {ArrayLike<number>|null} outMin
337
- * @param {ArrayLike<number>|null} outMax
338
- * @returns {*|boolean}
432
+ /**
433
+ * Copies bounds into caller-owned outputs, or returns the source object.
434
+ *
435
+ * @param {{min: ArrayLike<number>, max: ArrayLike<number>}|null} bounds
436
+ * @param {ArrayLike<number>|null} outMin
437
+ * @param {ArrayLike<number>|null} outMax
438
+ * @returns {*|boolean}
339
439
  */
340
440
  static copyBounds(bounds, outMin, outMax) {
341
441
  if (!outMin && !outMax) return bounds;
@@ -345,34 +445,34 @@ class TriGeometryRes extends CjsResource {
345
445
  return true;
346
446
  }
347
447
 
348
- /**
349
- * Gets canonical positions from a mesh or its first LOD.
350
- *
351
- * @param {object|null} mesh
352
- * @returns {ArrayLike<number>|Array<ArrayLike<number>>|null}
448
+ /**
449
+ * Gets canonical positions from a mesh or its first LOD.
450
+ *
451
+ * @param {object|null} mesh
452
+ * @returns {ArrayLike<number>|Array<ArrayLike<number>>|null}
353
453
  */
354
454
  static getMeshPositions(mesh) {
355
455
  return mesh?.vertex?.position || mesh?.positions || mesh?.lods?.[0]?.vertex?.position || mesh?.lods?.[0]?.positions || null;
356
456
  }
357
457
 
358
- /**
359
- * Gets the number of vertices represented by flat or nested positions.
360
- *
361
- * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions
362
- * @returns {number}
458
+ /**
459
+ * Gets the number of vertices represented by flat or nested positions.
460
+ *
461
+ * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions
462
+ * @returns {number}
363
463
  */
364
464
  static getPositionCount(positions) {
365
465
  if (!positions) return 0;
366
466
  return typeof positions[0] === "number" ? Math.floor(positions.length / 3) : positions.length;
367
467
  }
368
468
 
369
- /**
370
- * Calculates bounds from canonical positions using caller-owned scratch.
371
- *
372
- * @param {ArrayLike<number>} out
373
- * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions
374
- * @param {ArrayLike<number>} point
375
- * @returns {boolean}
469
+ /**
470
+ * Calculates bounds from canonical positions using caller-owned scratch.
471
+ *
472
+ * @param {ArrayLike<number>} out
473
+ * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions
474
+ * @param {ArrayLike<number>} point
475
+ * @returns {boolean}
376
476
  */
377
477
  static setBoundsFromPositions(out, positions, point) {
378
478
  const count = this.getPositionCount(positions);
@@ -396,13 +496,13 @@ class TriGeometryRes extends CjsResource {
396
496
  return found;
397
497
  }
398
498
 
399
- /**
400
- * Calculates a bounding sphere from positions using caller-owned scratch.
401
- *
402
- * @param {ArrayLike<number>} out
403
- * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions
404
- * @param {ArrayLike<number>} point
405
- * @returns {boolean}
499
+ /**
500
+ * Calculates a bounding sphere from positions using caller-owned scratch.
501
+ *
502
+ * @param {ArrayLike<number>} out
503
+ * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions
504
+ * @param {ArrayLike<number>} point
505
+ * @returns {boolean}
406
506
  */
407
507
  static setSphereFromPositions(out, positions, point) {
408
508
  const count = this.getPositionCount(positions);
@@ -439,13 +539,13 @@ class TriGeometryRes extends CjsResource {
439
539
  return true;
440
540
  }
441
541
 
442
- /**
443
- * Calculates a mesh sphere from positions or existing bounds.
444
- *
445
- * @param {ArrayLike<number>} out
446
- * @param {object} mesh
447
- * @param {ArrayLike<number>} point
448
- * @returns {boolean}
542
+ /**
543
+ * Calculates a mesh sphere from positions or existing bounds.
544
+ *
545
+ * @param {ArrayLike<number>} out
546
+ * @param {object} mesh
547
+ * @param {ArrayLike<number>} point
548
+ * @returns {boolean}
449
549
  */
450
550
  static calculateMeshSphere(out, mesh, point) {
451
551
  if (this.setSphereFromPositions(out, this.getMeshPositions(mesh), point)) return true;
@@ -455,12 +555,12 @@ class TriGeometryRes extends CjsResource {
455
555
  return true;
456
556
  }
457
557
 
458
- /**
459
- * Stores a calculated sphere in the mesh's canonical sphere fields.
460
- *
461
- * @param {object} mesh
462
- * @param {ArrayLike<number>} sphere
463
- * @returns {void}
558
+ /**
559
+ * Stores a calculated sphere in the mesh's canonical sphere fields.
560
+ *
561
+ * @param {object} mesh
562
+ * @param {ArrayLike<number>} sphere
563
+ * @returns {void}
464
564
  */
465
565
  static setMeshSphere(mesh, sphere) {
466
566
  if (mesh.sphere && typeof mesh.sphere.set === "function") mesh.sphere.set(sphere);else mesh.sphere = [...sphere];
@@ -471,14 +571,14 @@ class TriGeometryRes extends CjsResource {
471
571
  }
472
572
  }
473
573
 
474
- /**
475
- * Intersects a ray with canonical CPU geometry.
476
- *
477
- * @param {Array<object>|null} meshes
478
- * @param {ArrayLike<number>} position
479
- * @param {ArrayLike<number>} direction
480
- * @param {number} areaIndex
481
- * @returns {object}
574
+ /**
575
+ * Intersects a ray with canonical CPU geometry.
576
+ *
577
+ * @param {Array<object>|null} meshes
578
+ * @param {ArrayLike<number>} position
579
+ * @param {ArrayLike<number>} direction
580
+ * @param {number} areaIndex
581
+ * @returns {object}
482
582
  */
483
583
  static intersectGeometry(meshes, position, direction, areaIndex) {
484
584
  this.validateRayVector(position, "position");
@@ -532,12 +632,12 @@ class TriGeometryRes extends CjsResource {
532
632
  }
533
633
  }
534
634
 
535
- /**
536
- * Validates a caller-provided ray vector.
537
- *
538
- * @param {ArrayLike<number>} value
539
- * @param {string} name
540
- * @returns {void}
635
+ /**
636
+ * Validates a caller-provided ray vector.
637
+ *
638
+ * @param {ArrayLike<number>} value
639
+ * @param {string} name
640
+ * @returns {void}
541
641
  */
542
642
  static validateRayVector(value, name) {
543
643
  if (!value || value.length < 3 || !Number.isFinite(value[0]) || !Number.isFinite(value[1]) || !Number.isFinite(value[2])) {
@@ -545,23 +645,23 @@ class TriGeometryRes extends CjsResource {
545
645
  }
546
646
  }
547
647
 
548
- /**
549
- * Intersects a ray with one flat face list.
550
- *
551
- * @param {object|null} nearest
552
- * @param {ArrayLike<number>|null} faces
553
- * @param {number} areaIndex
554
- * @param {object} mesh
555
- * @param {number} meshIndex
556
- * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions
557
- * @param {ArrayLike<number>} rayOrigin
558
- * @param {ArrayLike<number>} ray
559
- * @param {ArrayLike<number>} point
560
- * @param {ArrayLike<number>} vertexA
561
- * @param {ArrayLike<number>} vertexB
562
- * @param {ArrayLike<number>} vertexC
563
- * @param {ArrayLike<number>} normal
564
- * @returns {object|null}
648
+ /**
649
+ * Intersects a ray with one flat face list.
650
+ *
651
+ * @param {object|null} nearest
652
+ * @param {ArrayLike<number>|null} faces
653
+ * @param {number} areaIndex
654
+ * @param {object} mesh
655
+ * @param {number} meshIndex
656
+ * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions
657
+ * @param {ArrayLike<number>} rayOrigin
658
+ * @param {ArrayLike<number>} ray
659
+ * @param {ArrayLike<number>} point
660
+ * @param {ArrayLike<number>} vertexA
661
+ * @param {ArrayLike<number>} vertexB
662
+ * @param {ArrayLike<number>} vertexC
663
+ * @param {ArrayLike<number>} normal
664
+ * @returns {object|null}
565
665
  */
566
666
  static intersectFaces(nearest, faces, areaIndex, mesh, meshIndex, positions, rayOrigin, ray, point, vertexA, vertexB, vertexC, normal) {
567
667
  const count = faces?.length ?? this.getPositionCount(positions);
@@ -596,13 +696,13 @@ class TriGeometryRes extends CjsResource {
596
696
  return nearest;
597
697
  }
598
698
 
599
- /**
600
- * Copies one flat or nested position into caller-owned output.
601
- *
602
- * @param {ArrayLike<number>} out
603
- * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions
604
- * @param {number} index
605
- * @returns {boolean}
699
+ /**
700
+ * Copies one flat or nested position into caller-owned output.
701
+ *
702
+ * @param {ArrayLike<number>} out
703
+ * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions
704
+ * @param {number} index
705
+ * @returns {boolean}
606
706
  */
607
707
  static copyPosition(out, positions, index) {
608
708
  if (!Number.isInteger(index) || index < 0) return false;
@@ -622,12 +722,12 @@ class TriGeometryRes extends CjsResource {
622
722
  return true;
623
723
  }
624
724
 
625
- /**
626
- * Gets the first blend index for a mesh vertex.
627
- *
628
- * @param {object} mesh
629
- * @param {number} vertexIndex
630
- * @returns {number}
725
+ /**
726
+ * Gets the first blend index for a mesh vertex.
727
+ *
728
+ * @param {object} mesh
729
+ * @param {number} vertexIndex
730
+ * @returns {number}
631
731
  */
632
732
  static getMeshBoneIndex(mesh, vertexIndex) {
633
733
  const indices = mesh?.vertex?.blendIndices || mesh?.blendIndices;
@@ -656,6 +756,9 @@ CjsSchema.define(TriGeometryRes, {
656
756
  GetSkeletonCount: [carbon.method, impl.adapted],
657
757
  GetSkeletonData: [carbon.method, impl.adapted],
658
758
  GetMeshAreaCount: [carbon.method, impl.adapted],
759
+ GetLodIndexForScreenSize: [carbon.method, impl.adapted],
760
+ GetMeshLod: [carbon.method, impl.adapted],
761
+ GetMeshLodByIndex: [carbon.method, impl.adapted],
659
762
  GetMeshName: [carbon.method, impl.adapted],
660
763
  GetMeshAreaName: [carbon.method, impl.adapted],
661
764
  GetAreaBoundingBox: [carbon.method, impl.adapted],
@@ -1 +1 @@
1
- {"version":3,"file":"TriGeometryRes.js","sources":["../../../../src/resource/geometry/TriGeometryRes.js"],"sourcesContent":["// Source: trinity/trinity/Resources/TriGeometryRes.h\n// Source: trinity/trinity/Resources/TriGeometryRes.cpp\n// Source: trinity/trinity/Resources/TriGeometryRes_Blue.cpp\nimport { CjsSchema, carbon, impl, io, type } from \"@carbonenginejs/runtime-utils/schema\";\nimport { box3 } from \"@carbonenginejs/runtime-utils/box3\";\nimport { triangleNormalTo } from \"@carbonenginejs/runtime-utils/mesh\";\nimport { ray3 } from \"@carbonenginejs/runtime-utils/ray3\";\nimport { sph3 } from \"@carbonenginejs/runtime-utils/sph3\";\nimport { vec3 } from \"@carbonenginejs/runtime-utils/vec3\";\nimport { vec4 } from \"@carbonenginejs/runtime-utils/vec4\";\nimport { CjsResource } from \"../CjsResource.js\";\nimport {\n assertResourcePayloadArray,\n assertResourcePayloadObject,\n resourceBoundaryError,\n resourcePayloadError\n} from \"../resourceBoundary.js\";\n\n/**\n * Resource record that owns geometry payload facts (meshes, optional\n * skeletons and animations) and LOD-force metadata, while engine packages\n * decide device buffers, vertex declarations, and draw-time state.\n *\n * Geometry inspection composes the generic math supplied by runtime-utils\n * with resource-specific payload traversal.\n */\nexport class TriGeometryRes extends CjsResource\n{\n forceLod = false;\n forcedLodIndex = -1;\n name = \"\";\n\n /** Creates a TriGeometryRes with caller-provided initial state. */\n constructor(values = null)\n {\n super();\n this.SetValues(values || {}, {\n markDirty: false,\n skipUpdate: true,\n skipEvents: true\n });\n }\n\n /**\n * Attach a plain geometry payload.\n *\n * @param {object|null} payload\n * @param {object|null} options\n * @returns {TriGeometryRes}\n */\n SetPayload(payload = null, options = null)\n {\n if (payload === null)\n {\n super.SetPayload(null);\n return this;\n }\n assertResourcePayloadObject(\"TriGeometryRes\", payload);\n assertResourcePayloadArray(\"TriGeometryRes\", payload, \"meshes\");\n for (const field of [ \"skeletons\", \"animations\" ])\n {\n if (payload[field] !== undefined && !Array.isArray(payload[field]))\n {\n throw resourcePayloadError(\"TriGeometryRes\", \"Expected an array when provided.\", field);\n }\n }\n super.SetPayload(payload);\n this.SetValues(options || {});\n return this;\n }\n\n /**\n * Get mesh count from the CPU geometry payload.\n *\n * @returns {number}\n */\n GetMeshCount()\n {\n return this.GetPayload()?.meshes?.length || 0;\n }\n\n /**\n * Get animation count from the CPU geometry payload.\n *\n * @returns {number}\n */\n GetAnimationCount()\n {\n return this.GetPayload()?.animations?.length || 0;\n }\n\n /**\n * Get skeleton count from the CPU geometry payload.\n *\n * @returns {number}\n */\n GetSkeletonCount()\n {\n return this.GetPayload()?.skeletons?.length || 0;\n }\n\n /**\n * Get one resource-owned skeleton from the CPU geometry payload.\n *\n * @param {number} skeletonIndex\n * @returns {*}\n */\n GetSkeletonData(skeletonIndex = 0)\n {\n const index = Number(skeletonIndex);\n\n if (!Number.isInteger(index) || index < 0)\n {\n return null;\n }\n\n return this.GetPayload()?.skeletons?.[index] || null;\n }\n\n /**\n * Get mesh area count from a CPU geometry payload mesh.\n *\n * @param {number} meshIndex\n * @returns {number}\n */\n GetMeshAreaCount(meshIndex = 0)\n {\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\n return mesh?.areas?.length || 0;\n }\n\n /**\n * Get mesh name from a CPU geometry payload.\n *\n * @param {number} meshIndex\n * @returns {string}\n */\n GetMeshName(meshIndex = 0)\n {\n return this.GetPayload()?.meshes?.[meshIndex]?.name || \"\";\n }\n\n /**\n * Get mesh area name from a CPU geometry payload.\n *\n * @param {number} meshIndex\n * @param {number} areaIndex\n * @returns {string}\n */\n GetMeshAreaName(meshIndex = 0, areaIndex = 0)\n {\n return this.GetPayload()?.meshes?.[meshIndex]?.areas?.[areaIndex]?.name || \"\";\n }\n\n /**\n * Get area bounding box from geometry payload data.\n *\n * @param {number} meshIndex\n * @param {number} areaIndex\n * @param {ArrayLike<number>|null} outMin\n * @param {ArrayLike<number>|null} outMax\n * @returns {*|boolean}\n */\n GetAreaBoundingBox(meshIndex = 0, areaIndex = 0, outMin = null, outMax = null)\n {\n const area = TriGeometryRes.getMeshAreas(this.GetPayload()?.meshes?.[meshIndex])?.[areaIndex];\n const bounds = TriGeometryRes.getBounds(area);\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\n }\n\n /**\n * Get mesh bounding box from geometry payload data.\n * @param {number} meshIndex\n * @param {ArrayLike<number>|null} outMin\n * @param {ArrayLike<number>|null} outMax\n * @returns {*|boolean}\n */\n GetBoundingBox(meshIndex = 0, outMin = null, outMax = null)\n {\n const payload = this.GetPayload();\n const bounds = TriGeometryRes.getBounds(payload?.meshes?.[meshIndex])\n || TriGeometryRes.getBounds(payload);\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\n }\n\n /**\n * Get mesh bounding sphere from geometry payload data.\n * @param {number} meshIndex\n * @param {ArrayLike<number>|null} out\n * @returns {*|boolean}\n */\n GetBoundingSphere(meshIndex = 0, out = null)\n {\n const payload = this.GetPayload();\n const sphere = TriGeometryRes.getSphere(payload?.meshes?.[meshIndex])\n || TriGeometryRes.getSphere(payload);\n if (!out) return sphere;\n if (!sphere) return false;\n vec4.copy(out, sphere);\n return true;\n }\n\n /**\n * Calculate a transformed bounding box from canonical CPU vertex data.\n *\n * Carbon stores the same matrix bytes as gl-matrix; transforming one point\n * therefore uses the ordinary column-vector index layout.\n *\n * @param {number} meshIndex\n * @param {ArrayLike<number>} transform\n * @returns {{min: number[], max: number[]}|null}\n */\n CalculateBoundingBoxFromTransform(meshIndex = 0, transform = null)\n {\n if (!transform || transform.length < 16)\n {\n throw new TypeError(\"TriGeometryRes transform must contain 16 matrix elements.\");\n }\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\n if (!mesh) return null;\n const positions = TriGeometryRes.getMeshPositions(mesh);\n const sourceBounds = TriGeometryRes.getBounds(mesh);\n if (!positions && !sourceBounds) return null;\n\n const\n bounds = box3.alloc(),\n point = vec3.alloc();\n try\n {\n if (!TriGeometryRes.setBoundsFromPositions(bounds, positions, point))\n {\n if (!sourceBounds) return null;\n box3.fromBounds(bounds, sourceBounds.min, sourceBounds.max);\n }\n box3.transformMat4(bounds, bounds, transform);\n return {\n min: [ bounds[0], bounds[1], bounds[2] ],\n max: [ bounds[3], bounds[4], bounds[5] ]\n };\n }\n finally\n {\n vec3.unalloc(point);\n box3.unalloc(bounds);\n }\n }\n\n /**\n * Recalculate bounding sphere data from canonical CPU vertex positions.\n *\n * @returns {boolean}\n */\n RecalculateBoundingSphere()\n {\n let updated = false;\n const\n sphere = sph3.alloc(),\n point = vec3.alloc();\n try\n {\n for (const mesh of this.GetPayload()?.meshes || [])\n {\n if (!TriGeometryRes.calculateMeshSphere(sphere, mesh, point)) continue;\n TriGeometryRes.setMeshSphere(mesh, sphere);\n updated = true;\n }\n return updated;\n }\n finally\n {\n vec3.unalloc(point);\n sph3.unalloc(sphere);\n }\n }\n\n /**\n * Reloading belongs to the resource manager because it owns source and\n * canonical replacement policy.\n *\n * @throws {Error}\n */\n Reload() {\n throw resourceBoundaryError(\n \"TriGeometryRes\",\n \"Reload\",\n \"Request a reload through CjsResMan so source reads and canonical replacement remain manager-owned.\"\n );\n }\n\n /**\n * Intersect a ray with canonical CPU triangle data.\n *\n * @param {ArrayLike<number>} position\n * @param {ArrayLike<number>} direction\n * @returns {object}\n */\n GetIntersectionPointNormalBone(position, direction)\n {\n return TriGeometryRes.intersectGeometry(\n this.GetPayload()?.meshes,\n position,\n direction,\n -1\n );\n }\n\n /**\n * Intersect a ray with one area index across canonical CPU meshes.\n *\n * @param {ArrayLike<number>} position\n * @param {ArrayLike<number>} direction\n * @param {number} areaIndex\n * @returns {object}\n */\n GetAreaIntersectionPointNormalBone(position, direction, areaIndex = -1)\n {\n if (!Number.isInteger(areaIndex) || areaIndex < -1)\n {\n throw new RangeError(\"TriGeometryRes area index must be -1 or a non-negative integer.\");\n }\n return TriGeometryRes.intersectGeometry(\n this.GetPayload()?.meshes,\n position,\n direction,\n areaIndex\n );\n }\n\n /**\n * Get vertex element descriptors for a mesh.\n *\n * @param {number} meshIndex\n * @returns {Array<*>}\n */\n GetMeshVertexElements(meshIndex = 0)\n {\n return this.GetPayload()?.meshes?.[meshIndex]?.vertexElements || [];\n }\n\n /**\n * Saving belongs to the selected geometry format writer and destination.\n *\n * @throws {Error}\n */\n SaveMesh()\n {\n throw resourceBoundaryError(\n \"TriGeometryRes\",\n \"SaveMesh\",\n \"Use a geometry format writer with the resource payload and a caller-owned destination.\"\n );\n }\n\n static payload = \"geometry\";\n\n /**\n * Gets the canonical area list from a mesh or its first LOD.\n *\n * @param {object|null} mesh\n * @returns {Array<*>|null}\n */\n static getMeshAreas(mesh)\n {\n return mesh?.areas || mesh?.lods?.[0]?.areas || null;\n }\n\n /**\n * Gets canonical bounds from a geometry payload object.\n *\n * @param {object|null} value\n * @returns {{min: ArrayLike<number>, max: ArrayLike<number>}|null}\n */\n static getBounds(value)\n {\n if (!value || typeof value !== \"object\") return null;\n if (value.bounds?.min && value.bounds?.max) return value.bounds;\n if (value.minBounds && value.maxBounds)\n {\n return { min: value.minBounds, max: value.maxBounds };\n }\n return null;\n }\n\n /**\n * Gets the canonical bounding sphere from a geometry payload object.\n *\n * @param {object|null} value\n * @returns {ArrayLike<number>|null}\n */\n static getSphere(value)\n {\n if (!value || typeof value !== \"object\") return null;\n return value.sphere || value.boundingSphere || null;\n }\n\n /**\n * Copies bounds into caller-owned outputs, or returns the source object.\n *\n * @param {{min: ArrayLike<number>, max: ArrayLike<number>}|null} bounds\n * @param {ArrayLike<number>|null} outMin\n * @param {ArrayLike<number>|null} outMax\n * @returns {*|boolean}\n */\n static copyBounds(bounds, outMin, outMax)\n {\n if (!outMin && !outMax) return bounds;\n if (!bounds || !outMin || !outMax) return false;\n vec3.copy(outMin, bounds.min);\n vec3.copy(outMax, bounds.max);\n return true;\n }\n\n /**\n * Gets canonical positions from a mesh or its first LOD.\n *\n * @param {object|null} mesh\n * @returns {ArrayLike<number>|Array<ArrayLike<number>>|null}\n */\n static getMeshPositions(mesh)\n {\n return mesh?.vertex?.position\n || mesh?.positions\n || mesh?.lods?.[0]?.vertex?.position\n || mesh?.lods?.[0]?.positions\n || null;\n }\n\n /**\n * Gets the number of vertices represented by flat or nested positions.\n *\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\n * @returns {number}\n */\n static getPositionCount(positions)\n {\n if (!positions) return 0;\n return typeof positions[0] === \"number\"\n ? Math.floor(positions.length / 3)\n : positions.length;\n }\n\n /**\n * Calculates bounds from canonical positions using caller-owned scratch.\n *\n * @param {ArrayLike<number>} out\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\n * @param {ArrayLike<number>} point\n * @returns {boolean}\n */\n static setBoundsFromPositions(out, positions, point)\n {\n const count = this.getPositionCount(positions);\n let found = false;\n for (let index = 0; index < count; index++)\n {\n if (!this.copyPosition(point, positions, index)) continue;\n if (!found)\n {\n out[0] = out[3] = point[0];\n out[1] = out[4] = point[1];\n out[2] = out[5] = point[2];\n found = true;\n continue;\n }\n out[0] = Math.min(out[0], point[0]);\n out[1] = Math.min(out[1], point[1]);\n out[2] = Math.min(out[2], point[2]);\n out[3] = Math.max(out[3], point[0]);\n out[4] = Math.max(out[4], point[1]);\n out[5] = Math.max(out[5], point[2]);\n }\n return found;\n }\n\n /**\n * Calculates a bounding sphere from positions using caller-owned scratch.\n *\n * @param {ArrayLike<number>} out\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\n * @param {ArrayLike<number>} point\n * @returns {boolean}\n */\n static setSphereFromPositions(out, positions, point)\n {\n const count = this.getPositionCount(positions);\n let\n found = false,\n minX = Infinity,\n minY = Infinity,\n minZ = Infinity,\n maxX = -Infinity,\n maxY = -Infinity,\n maxZ = -Infinity;\n\n for (let index = 0; index < count; index++)\n {\n if (!this.copyPosition(point, positions, index)) continue;\n minX = Math.min(minX, point[0]);\n minY = Math.min(minY, point[1]);\n minZ = Math.min(minZ, point[2]);\n maxX = Math.max(maxX, point[0]);\n maxY = Math.max(maxY, point[1]);\n maxZ = Math.max(maxZ, point[2]);\n found = true;\n }\n if (!found) return false;\n\n out[0] = (minX + maxX) * 0.5;\n out[1] = (minY + maxY) * 0.5;\n out[2] = (minZ + maxZ) * 0.5;\n let maxSquaredRadius = 0;\n for (let index = 0; index < count; index++)\n {\n if (!this.copyPosition(point, positions, index)) continue;\n const\n x = out[0] - point[0],\n y = out[1] - point[1],\n z = out[2] - point[2];\n maxSquaredRadius = Math.max(maxSquaredRadius, x * x + y * y + z * z);\n }\n out[3] = Math.sqrt(maxSquaredRadius);\n return true;\n }\n\n /**\n * Calculates a mesh sphere from positions or existing bounds.\n *\n * @param {ArrayLike<number>} out\n * @param {object} mesh\n * @param {ArrayLike<number>} point\n * @returns {boolean}\n */\n static calculateMeshSphere(out, mesh, point)\n {\n if (this.setSphereFromPositions(out, this.getMeshPositions(mesh), point)) return true;\n const bounds = this.getBounds(mesh);\n if (!bounds) return false;\n sph3.fromBounds(out, bounds.min, bounds.max);\n return true;\n }\n\n /**\n * Stores a calculated sphere in the mesh's canonical sphere fields.\n *\n * @param {object} mesh\n * @param {ArrayLike<number>} sphere\n * @returns {void}\n */\n static setMeshSphere(mesh, sphere)\n {\n if (mesh.sphere && typeof mesh.sphere.set === \"function\") mesh.sphere.set(sphere);\n else mesh.sphere = [ ...sphere ];\n if (mesh.boundingSphere && typeof mesh.boundingSphere.set === \"function\")\n {\n mesh.boundingSphere.set(sphere);\n }\n else if (\"boundingSphere\" in mesh)\n {\n mesh.boundingSphere = [ ...sphere ];\n }\n }\n\n /**\n * Intersects a ray with canonical CPU geometry.\n *\n * @param {Array<object>|null} meshes\n * @param {ArrayLike<number>} position\n * @param {ArrayLike<number>} direction\n * @param {number} areaIndex\n * @returns {object}\n */\n static intersectGeometry(meshes, position, direction, areaIndex)\n {\n this.validateRayVector(position, \"position\");\n this.validateRayVector(direction, \"direction\");\n const\n ray = ray3.from(ray3.alloc(), position, direction),\n point = vec3.alloc(),\n vertexA = vec3.alloc(),\n vertexB = vec3.alloc(),\n vertexC = vec3.alloc(),\n normal = vec3.alloc();\n let nearest = null;\n try\n {\n for (let meshIndex = 0; meshIndex < (meshes?.length || 0); meshIndex++)\n {\n const mesh = meshes[meshIndex];\n const positions = this.getMeshPositions(mesh);\n if (!positions) continue;\n const groups = mesh?.indices || mesh?.lods?.[0]?.indices || null;\n if (ArrayBuffer.isView(groups)\n || (Array.isArray(groups) && typeof groups[0] === \"number\"))\n {\n if (areaIndex !== -1 && areaIndex !== 0) continue;\n nearest = this.intersectFaces(\n nearest,\n groups,\n 0,\n mesh,\n meshIndex,\n positions,\n position,\n ray,\n point,\n vertexA,\n vertexB,\n vertexC,\n normal\n );\n continue;\n }\n if (Array.isArray(groups))\n {\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++)\n {\n if (areaIndex !== -1 && areaIndex !== groupIndex) continue;\n const faces = groups[groupIndex]?.faces || groups[groupIndex]?.indices || [];\n nearest = this.intersectFaces(\n nearest,\n faces,\n groupIndex,\n mesh,\n meshIndex,\n positions,\n position,\n ray,\n point,\n vertexA,\n vertexB,\n vertexC,\n normal\n );\n }\n continue;\n }\n if (areaIndex === -1 || areaIndex === 0)\n {\n nearest = this.intersectFaces(\n nearest,\n null,\n 0,\n mesh,\n meshIndex,\n positions,\n position,\n ray,\n point,\n vertexA,\n vertexB,\n vertexC,\n normal\n );\n }\n }\n return nearest || {\n hit: false,\n boneIndex: -1,\n point: [ 0, 0, 0 ],\n normal: [ 0, 0, 0 ],\n distance: Infinity,\n meshIndex: -1,\n areaIndex\n };\n }\n finally\n {\n vec3.unalloc(normal);\n vec3.unalloc(vertexC);\n vec3.unalloc(vertexB);\n vec3.unalloc(vertexA);\n vec3.unalloc(point);\n ray3.unalloc(ray);\n }\n }\n\n /**\n * Validates a caller-provided ray vector.\n *\n * @param {ArrayLike<number>} value\n * @param {string} name\n * @returns {void}\n */\n static validateRayVector(value, name)\n {\n if (!value\n || value.length < 3\n || !Number.isFinite(value[0])\n || !Number.isFinite(value[1])\n || !Number.isFinite(value[2]))\n {\n throw new TypeError(`TriGeometryRes ray ${name} must contain three finite numbers.`);\n }\n }\n\n /**\n * Intersects a ray with one flat face list.\n *\n * @param {object|null} nearest\n * @param {ArrayLike<number>|null} faces\n * @param {number} areaIndex\n * @param {object} mesh\n * @param {number} meshIndex\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\n * @param {ArrayLike<number>} rayOrigin\n * @param {ArrayLike<number>} ray\n * @param {ArrayLike<number>} point\n * @param {ArrayLike<number>} vertexA\n * @param {ArrayLike<number>} vertexB\n * @param {ArrayLike<number>} vertexC\n * @param {ArrayLike<number>} normal\n * @returns {object|null}\n */\n static intersectFaces(\n nearest,\n faces,\n areaIndex,\n mesh,\n meshIndex,\n positions,\n rayOrigin,\n ray,\n point,\n vertexA,\n vertexB,\n vertexC,\n normal\n )\n {\n const count = faces?.length ?? this.getPositionCount(positions);\n for (let index = 0; index + 2 < count; index += 3)\n {\n const\n vertexIndexA = faces ? faces[index] : index,\n vertexIndexB = faces ? faces[index + 1] : index + 1,\n vertexIndexC = faces ? faces[index + 2] : index + 2;\n if (!this.copyPosition(vertexA, positions, vertexIndexA)\n || !this.copyPosition(vertexB, positions, vertexIndexB)\n || !this.copyPosition(vertexC, positions, vertexIndexC)\n || !ray3.getIntersectVertices(\n point,\n ray,\n vertexA,\n vertexB,\n vertexC,\n false\n ))\n {\n continue;\n }\n const distance = vec3.distance(rayOrigin, point);\n if (nearest && nearest.distance <= distance) continue;\n if (!nearest)\n {\n nearest = {\n hit: true,\n boneIndex: -1,\n point: [ 0, 0, 0 ],\n normal: [ 0, 0, 0 ],\n distance,\n meshIndex,\n areaIndex\n };\n }\n nearest.boneIndex = this.getMeshBoneIndex(mesh, vertexIndexA);\n vec3.copy(nearest.point, point);\n triangleNormalTo(normal, vertexA, vertexB, vertexC);\n vec3.copy(nearest.normal, normal);\n nearest.distance = distance;\n nearest.meshIndex = meshIndex;\n nearest.areaIndex = areaIndex;\n }\n return nearest;\n }\n\n /**\n * Copies one flat or nested position into caller-owned output.\n *\n * @param {ArrayLike<number>} out\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\n * @param {number} index\n * @returns {boolean}\n */\n static copyPosition(out, positions, index)\n {\n if (!Number.isInteger(index) || index < 0) return false;\n if (typeof positions[0] === \"number\")\n {\n const offset = index * 3;\n if (offset + 2 >= positions.length) return false;\n out[0] = positions[offset];\n out[1] = positions[offset + 1];\n out[2] = positions[offset + 2];\n return true;\n }\n const point = positions[index];\n if (!point || point.length < 3) return false;\n out[0] = point[0];\n out[1] = point[1];\n out[2] = point[2];\n return true;\n }\n\n /**\n * Gets the first blend index for a mesh vertex.\n *\n * @param {object} mesh\n * @param {number} vertexIndex\n * @returns {number}\n */\n static getMeshBoneIndex(mesh, vertexIndex)\n {\n const indices = mesh?.vertex?.blendIndices || mesh?.blendIndices;\n if (!indices) return -1;\n if (typeof indices[0] === \"number\")\n {\n return Number(indices[vertexIndex * 4] ?? indices[vertexIndex] ?? -1);\n }\n return Number(indices[vertexIndex]?.[0] ?? -1);\n }\n\n}\n\n// Declared as data rather than with decorators, so the resource tree loads from\n// source without a transform. Field order is key order, and GetValues() exports\n// in that order.\nCjsSchema.define(TriGeometryRes, {\n className: \"TriGeometryRes\",\n family: \"resources\",\n fields: {\n forceLod: [ type.boolean, io.readwrite ],\n forcedLodIndex: [ type.int32, io.readwrite ],\n name: [ type.string, io.readwrite ]\n },\n methods: {\n GetMeshCount: [ carbon.method, impl.adapted ],\n GetAnimationCount: [ carbon.method, impl.adapted ],\n GetSkeletonCount: [ carbon.method, impl.adapted ],\n GetSkeletonData: [ carbon.method, impl.adapted ],\n GetMeshAreaCount: [ carbon.method, impl.adapted ],\n GetMeshName: [ carbon.method, impl.adapted ],\n GetMeshAreaName: [ carbon.method, impl.adapted ],\n GetAreaBoundingBox: [ carbon.method, impl.adapted ],\n GetBoundingBox: [ carbon.method, impl.adapted ],\n GetBoundingSphere: [ carbon.method, impl.adapted ],\n CalculateBoundingBoxFromTransform: [ carbon.method, impl.adapted ],\n RecalculateBoundingSphere: [ carbon.method, impl.adapted ],\n Reload: [ carbon.method, impl.notSupported ],\n GetIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\n GetAreaIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\n GetMeshVertexElements: [ carbon.method, impl.adapted ],\n SaveMesh: [ carbon.method, impl.notSupported ]\n }\n});\n"],"names":["TriGeometryRes","CjsResource","forceLod","forcedLodIndex","name","constructor","values","SetValues","markDirty","skipUpdate","skipEvents","SetPayload","payload","options","assertResourcePayloadObject","assertResourcePayloadArray","field","undefined","Array","isArray","resourcePayloadError","GetMeshCount","GetPayload","meshes","length","GetAnimationCount","animations","GetSkeletonCount","skeletons","GetSkeletonData","skeletonIndex","index","Number","isInteger","GetMeshAreaCount","meshIndex","mesh","areas","GetMeshName","GetMeshAreaName","areaIndex","GetAreaBoundingBox","outMin","outMax","area","getMeshAreas","bounds","getBounds","copyBounds","GetBoundingBox","GetBoundingSphere","out","sphere","getSphere","vec4","copy","CalculateBoundingBoxFromTransform","transform","TypeError","positions","getMeshPositions","sourceBounds","box3","alloc","point","vec3","setBoundsFromPositions","fromBounds","min","max","transformMat4","unalloc","RecalculateBoundingSphere","updated","sph3","calculateMeshSphere","setMeshSphere","Reload","resourceBoundaryError","GetIntersectionPointNormalBone","position","direction","intersectGeometry","GetAreaIntersectionPointNormalBone","RangeError","GetMeshVertexElements","vertexElements","SaveMesh","lods","value","minBounds","maxBounds","boundingSphere","vertex","getPositionCount","Math","floor","count","found","copyPosition","setSphereFromPositions","minX","Infinity","minY","minZ","maxX","maxY","maxZ","maxSquaredRadius","x","y","z","sqrt","set","validateRayVector","ray","ray3","from","vertexA","vertexB","vertexC","normal","nearest","groups","indices","ArrayBuffer","isView","intersectFaces","groupIndex","faces","hit","boneIndex","distance","isFinite","rayOrigin","vertexIndexA","vertexIndexB","vertexIndexC","getIntersectVertices","getMeshBoneIndex","triangleNormalTo","offset","vertexIndex","blendIndices","CjsSchema","define","className","family","fields","type","boolean","io","readwrite","int32","string","methods","carbon","method","impl","adapted","notSupported"],"mappings":"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"}
1
+ {"version":3,"file":"TriGeometryRes.js","sources":["../../../../src/resource/geometry/TriGeometryRes.js"],"sourcesContent":["// Source: trinity/trinity/Resources/TriGeometryRes.h\r\n// Source: trinity/trinity/Resources/TriGeometryRes.cpp\r\n// Source: trinity/trinity/Resources/TriGeometryRes_Blue.cpp\r\nimport { CjsSchema, carbon, impl, io, type } from \"@carbonenginejs/runtime-utils/schema\";\r\nimport { box3 } from \"@carbonenginejs/runtime-utils/box3\";\r\nimport { triangleNormalTo } from \"@carbonenginejs/runtime-utils/mesh\";\r\nimport { ray3 } from \"@carbonenginejs/runtime-utils/ray3\";\r\nimport { sph3 } from \"@carbonenginejs/runtime-utils/sph3\";\r\nimport { vec3 } from \"@carbonenginejs/runtime-utils/vec3\";\r\nimport { vec4 } from \"@carbonenginejs/runtime-utils/vec4\";\r\nimport { CjsResource } from \"../CjsResource.js\";\r\nimport {\r\n assertResourcePayloadArray,\r\n assertResourcePayloadObject,\r\n resourceBoundaryError,\r\n resourcePayloadError\r\n} from \"../resourceBoundary.js\";\r\n\r\n/**\r\n * Resource record that owns geometry payload facts (meshes, optional\r\n * skeletons and animations) and LOD-force metadata, while engine packages\r\n * decide device buffers, vertex declarations, and draw-time state.\r\n *\r\n * Geometry inspection composes the generic math supplied by runtime-utils\r\n * with resource-specific payload traversal.\r\n */\r\nexport class TriGeometryRes extends CjsResource\r\n{\r\n forceLod = false;\r\n forcedLodIndex = -1;\r\n name = \"\";\r\n\r\n /** Creates a TriGeometryRes with caller-provided initial state. */\r\n constructor(values = null)\r\n {\r\n super();\r\n this.SetValues(values || {}, {\r\n markDirty: false,\r\n skipUpdate: true,\r\n skipEvents: true\r\n });\r\n }\r\n\r\n /**\r\n * Attach a plain geometry payload.\r\n *\r\n * @param {object|null} payload\r\n * @param {object|null} options\r\n * @returns {TriGeometryRes}\r\n */\r\n SetPayload(payload = null, options = null)\r\n {\r\n if (payload === null)\r\n {\r\n super.SetPayload(null);\r\n return this;\r\n }\r\n assertResourcePayloadObject(\"TriGeometryRes\", payload);\r\n assertResourcePayloadArray(\"TriGeometryRes\", payload, \"meshes\");\r\n for (const field of [ \"skeletons\", \"animations\" ])\r\n {\r\n if (payload[field] !== undefined && !Array.isArray(payload[field]))\r\n {\r\n throw resourcePayloadError(\"TriGeometryRes\", \"Expected an array when provided.\", field);\r\n }\r\n }\r\n super.SetPayload(payload);\r\n this.SetValues(options || {});\r\n return this;\r\n }\r\n\r\n /**\r\n * Get mesh count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetMeshCount()\r\n {\r\n return this.GetPayload()?.meshes?.length || 0;\r\n }\r\n\r\n /**\r\n * Get animation count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetAnimationCount()\r\n {\r\n return this.GetPayload()?.animations?.length || 0;\r\n }\r\n\r\n /**\r\n * Get skeleton count from the CPU geometry payload.\r\n *\r\n * @returns {number}\r\n */\r\n GetSkeletonCount()\r\n {\r\n return this.GetPayload()?.skeletons?.length || 0;\r\n }\r\n\r\n /**\r\n * Get one resource-owned skeleton from the CPU geometry payload.\r\n *\r\n * @param {number} skeletonIndex\r\n * @returns {*}\r\n */\r\n GetSkeletonData(skeletonIndex = 0)\r\n {\r\n const index = Number(skeletonIndex);\r\n\r\n if (!Number.isInteger(index) || index < 0)\r\n {\r\n return null;\r\n }\r\n\r\n return this.GetPayload()?.skeletons?.[index] || null;\r\n }\r\n\r\n /**\r\n * Get mesh area count from a CPU geometry payload mesh.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {number}\r\n */\r\n GetMeshAreaCount(meshIndex = 0)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n return mesh?.areas?.length || 0;\r\n }\r\n\r\n // Carbon TriGeometryRes.cpp:294-319. Walks LODs from the LOWEST quality up\r\n // and takes the first whose authored maxScreenSize still covers the requested\r\n // size; a request larger than the best LOD falls back to LOD 0, which Carbon\r\n // comments explicitly. forceLod pins the index instead, clamped to the last\r\n // LOD.\r\n\r\n /**\r\n * The LOD index this mesh should be drawn at for a screen size, or -1 when the\r\n * mesh does not exist.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} screenSize\r\n * @returns {number}\r\n */\r\n GetLodIndexForScreenSize(meshIndex = 0, screenSize = Infinity)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n if (!mesh) return -1;\r\n\r\n // A decoder may flatten a single-LOD mesh, putting the areas on the mesh\r\n // itself; that mesh IS its own only LOD (see getMeshAreas).\r\n const lods = mesh.lods?.length ? mesh.lods : null;\r\n const lastLod = lods ? lods.length - 1 : 0;\r\n\r\n if (this.forceLod && this.forcedLodIndex >= 0)\r\n {\r\n return Math.min(this.forcedLodIndex, lastLod);\r\n }\r\n\r\n for (let index = lastLod; index >= 0; index--)\r\n {\r\n const maxScreenSize = (lods ? lods[index]?.maxScreenSize : mesh.maxScreenSize) ?? 0;\r\n if (maxScreenSize >= screenSize) return index;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n // Carbon TriGeometryRes.cpp:268-279. Carbon overloads this on float\r\n // screenSize versus int lodIndex; JavaScript cannot, so the index form is\r\n // GetMeshLodByIndex. Carbon indexes m_lods with the result unguarded, so a\r\n // mesh with an EMPTY lod list reads out of bounds there; this port returns\r\n // null (docs/research/carbon-known-defects.md).\r\n\r\n /**\r\n * The LOD data this mesh should be drawn at for a screen size, or null when\r\n * the mesh has no LODs.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} screenSize\r\n * @returns {object|null}\r\n */\r\n GetMeshLod(meshIndex = 0, screenSize = Infinity)\r\n {\r\n return this.GetMeshLodByIndex(meshIndex, this.GetLodIndexForScreenSize(meshIndex, screenSize));\r\n }\r\n\r\n /**\r\n * The LOD data at an explicit index, or null when the mesh or index does not\r\n * exist (Carbon TriGeometryRes.cpp:281-292).\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} lodIndex\r\n * @returns {object|null}\r\n */\r\n GetMeshLodByIndex(meshIndex = 0, lodIndex = 0)\r\n {\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n if (!mesh || lodIndex < 0) return null;\r\n\r\n if (mesh.lods?.length)\r\n {\r\n return lodIndex < mesh.lods.length ? mesh.lods[lodIndex] : null;\r\n }\r\n\r\n return lodIndex === 0 && mesh.areas ? mesh : null;\r\n }\r\n\r\n /**\r\n * Get mesh name from a CPU geometry payload.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {string}\r\n */\r\n GetMeshName(meshIndex = 0)\r\n {\r\n return this.GetPayload()?.meshes?.[meshIndex]?.name || \"\";\r\n }\r\n\r\n /**\r\n * Get mesh area name from a CPU geometry payload.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} areaIndex\r\n * @returns {string}\r\n */\r\n GetMeshAreaName(meshIndex = 0, areaIndex = 0)\r\n {\r\n return this.GetPayload()?.meshes?.[meshIndex]?.areas?.[areaIndex]?.name || \"\";\r\n }\r\n\r\n /**\r\n * Get area bounding box from geometry payload data.\r\n *\r\n * @param {number} meshIndex\r\n * @param {number} areaIndex\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n GetAreaBoundingBox(meshIndex = 0, areaIndex = 0, outMin = null, outMax = null)\r\n {\r\n const area = TriGeometryRes.getMeshAreas(this.GetPayload()?.meshes?.[meshIndex])?.[areaIndex];\r\n const bounds = TriGeometryRes.getBounds(area);\r\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\r\n }\r\n\r\n /**\r\n * Get mesh bounding box from geometry payload data.\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n GetBoundingBox(meshIndex = 0, outMin = null, outMax = null)\r\n {\r\n const payload = this.GetPayload();\r\n const bounds = TriGeometryRes.getBounds(payload?.meshes?.[meshIndex])\r\n || TriGeometryRes.getBounds(payload);\r\n return TriGeometryRes.copyBounds(bounds, outMin, outMax);\r\n }\r\n\r\n /**\r\n * Get mesh bounding sphere from geometry payload data.\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|null} out\r\n * @returns {*|boolean}\r\n */\r\n GetBoundingSphere(meshIndex = 0, out = null)\r\n {\r\n const payload = this.GetPayload();\r\n const sphere = TriGeometryRes.getSphere(payload?.meshes?.[meshIndex])\r\n || TriGeometryRes.getSphere(payload);\r\n if (!out) return sphere;\r\n if (!sphere) return false;\r\n vec4.copy(out, sphere);\r\n return true;\r\n }\r\n\r\n /**\r\n * Calculate a transformed bounding box from canonical CPU vertex data.\r\n *\r\n * Carbon stores the same matrix bytes as gl-matrix; transforming one point\r\n * therefore uses the ordinary column-vector index layout.\r\n *\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>} transform\r\n * @returns {{min: number[], max: number[]}|null}\r\n */\r\n CalculateBoundingBoxFromTransform(meshIndex = 0, transform = null)\r\n {\r\n if (!transform || transform.length < 16)\r\n {\r\n throw new TypeError(\"TriGeometryRes transform must contain 16 matrix elements.\");\r\n }\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n if (!mesh) return null;\r\n const positions = TriGeometryRes.getMeshPositions(mesh);\r\n const sourceBounds = TriGeometryRes.getBounds(mesh);\r\n if (!positions && !sourceBounds) return null;\r\n\r\n const\r\n bounds = box3.alloc(),\r\n point = vec3.alloc();\r\n try\r\n {\r\n if (!TriGeometryRes.setBoundsFromPositions(bounds, positions, point))\r\n {\r\n if (!sourceBounds) return null;\r\n box3.fromBounds(bounds, sourceBounds.min, sourceBounds.max);\r\n }\r\n box3.transformMat4(bounds, bounds, transform);\r\n return {\r\n min: [ bounds[0], bounds[1], bounds[2] ],\r\n max: [ bounds[3], bounds[4], bounds[5] ]\r\n };\r\n }\r\n finally\r\n {\r\n vec3.unalloc(point);\r\n box3.unalloc(bounds);\r\n }\r\n }\r\n\r\n /**\r\n * Recalculate bounding sphere data from canonical CPU vertex positions.\r\n *\r\n * @returns {boolean}\r\n */\r\n RecalculateBoundingSphere()\r\n {\r\n let updated = false;\r\n const\r\n sphere = sph3.alloc(),\r\n point = vec3.alloc();\r\n try\r\n {\r\n for (const mesh of this.GetPayload()?.meshes || [])\r\n {\r\n if (!TriGeometryRes.calculateMeshSphere(sphere, mesh, point)) continue;\r\n TriGeometryRes.setMeshSphere(mesh, sphere);\r\n updated = true;\r\n }\r\n return updated;\r\n }\r\n finally\r\n {\r\n vec3.unalloc(point);\r\n sph3.unalloc(sphere);\r\n }\r\n }\r\n\r\n /**\r\n * Reloading belongs to the resource manager because it owns source and\r\n * canonical replacement policy.\r\n *\r\n * @throws {Error}\r\n */\r\n Reload() {\r\n throw resourceBoundaryError(\r\n \"TriGeometryRes\",\r\n \"Reload\",\r\n \"Request a reload through CjsResMan so source reads and canonical replacement remain manager-owned.\"\r\n );\r\n }\r\n\r\n /**\r\n * Intersect a ray with canonical CPU triangle data.\r\n *\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @returns {object}\r\n */\r\n GetIntersectionPointNormalBone(position, direction)\r\n {\r\n return TriGeometryRes.intersectGeometry(\r\n this.GetPayload()?.meshes,\r\n position,\r\n direction,\r\n -1\r\n );\r\n }\r\n\r\n /**\r\n * Intersect a ray with one area index across canonical CPU meshes.\r\n *\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @param {number} areaIndex\r\n * @returns {object}\r\n */\r\n GetAreaIntersectionPointNormalBone(position, direction, areaIndex = -1)\r\n {\r\n if (!Number.isInteger(areaIndex) || areaIndex < -1)\r\n {\r\n throw new RangeError(\"TriGeometryRes area index must be -1 or a non-negative integer.\");\r\n }\r\n return TriGeometryRes.intersectGeometry(\r\n this.GetPayload()?.meshes,\r\n position,\r\n direction,\r\n areaIndex\r\n );\r\n }\r\n\r\n /**\r\n * Get vertex element descriptors for a mesh.\r\n *\r\n * @param {number} meshIndex\r\n * @returns {Array<*>}\r\n */\r\n GetMeshVertexElements(meshIndex = 0)\r\n {\r\n // The CMF reader emits the element list as `decl`, matching the CMF struct\r\n // field; this accessor read only `vertexElements`, which no reader in this\r\n // package populates, so it returned an empty list for every real decoded\r\n // payload. Both names are accepted because the name is the producer's.\r\n const mesh = this.GetPayload()?.meshes?.[meshIndex];\r\n\r\n return mesh?.decl || mesh?.vertexElements || [];\r\n }\r\n\r\n /**\r\n * Saving belongs to the selected geometry format writer and destination.\r\n *\r\n * @throws {Error}\r\n */\r\n SaveMesh()\r\n {\r\n throw resourceBoundaryError(\r\n \"TriGeometryRes\",\r\n \"SaveMesh\",\r\n \"Use a geometry format writer with the resource payload and a caller-owned destination.\"\r\n );\r\n }\r\n\r\n static payload = \"geometry\";\r\n\r\n // Carbon TriGeometryRes.cpp:158-178, declared beside the class\r\n // (TriGeometryRes.h:202) because it reads LOD data rather than resource\r\n // state - which is why it is static here. It returns a PLAIN SUM and does not\r\n // multiply by three: the *3 belongs to the caller, so triangles-only is a\r\n // property of the mesh draw path rather than of the geometry layer.\r\n\r\n /**\r\n * The summed primitive count over `count` areas of a LOD starting at `index`,\r\n * with the run clamped to the area list as Carbon clamps it; zero when the\r\n * index is out of range, which callers treat as \"emit no draw\".\r\n *\r\n * @param {object|null} lod\r\n * @param {number} index\r\n * @param {number} count\r\n * @returns {number}\r\n */\r\n static getPrimitiveCount(lod, index, count)\r\n {\r\n const areas = lod?.areas ?? null;\r\n const areaCount = areas?.length ?? 0;\r\n\r\n if (!areaCount || index >= areaCount) return 0;\r\n\r\n const run = index + count > areaCount ? areaCount - index : count;\r\n\r\n let primitiveCount = 0;\r\n\r\n for (let offset = 0; offset < run; offset++)\r\n {\r\n primitiveCount += areas[index + offset]?.primitiveCount ?? 0;\r\n }\r\n\r\n return primitiveCount;\r\n }\r\n\r\n /**\r\n * Gets the canonical area list from a mesh or its first LOD.\r\n *\r\n * @param {object|null} mesh\r\n * @returns {Array<*>|null}\r\n */\r\n static getMeshAreas(mesh)\r\n {\r\n return mesh?.areas || mesh?.lods?.[0]?.areas || null;\r\n }\r\n\r\n /**\r\n * Gets canonical bounds from a geometry payload object.\r\n *\r\n * @param {object|null} value\r\n * @returns {{min: ArrayLike<number>, max: ArrayLike<number>}|null}\r\n */\r\n static getBounds(value)\r\n {\r\n if (!value || typeof value !== \"object\") return null;\r\n if (value.bounds?.min && value.bounds?.max) return value.bounds;\r\n if (value.minBounds && value.maxBounds)\r\n {\r\n return { min: value.minBounds, max: value.maxBounds };\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the canonical bounding sphere from a geometry payload object.\r\n *\r\n * @param {object|null} value\r\n * @returns {ArrayLike<number>|null}\r\n */\r\n static getSphere(value)\r\n {\r\n if (!value || typeof value !== \"object\") return null;\r\n return value.sphere || value.boundingSphere || null;\r\n }\r\n\r\n /**\r\n * Copies bounds into caller-owned outputs, or returns the source object.\r\n *\r\n * @param {{min: ArrayLike<number>, max: ArrayLike<number>}|null} bounds\r\n * @param {ArrayLike<number>|null} outMin\r\n * @param {ArrayLike<number>|null} outMax\r\n * @returns {*|boolean}\r\n */\r\n static copyBounds(bounds, outMin, outMax)\r\n {\r\n if (!outMin && !outMax) return bounds;\r\n if (!bounds || !outMin || !outMax) return false;\r\n vec3.copy(outMin, bounds.min);\r\n vec3.copy(outMax, bounds.max);\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets canonical positions from a mesh or its first LOD.\r\n *\r\n * @param {object|null} mesh\r\n * @returns {ArrayLike<number>|Array<ArrayLike<number>>|null}\r\n */\r\n static getMeshPositions(mesh)\r\n {\r\n return mesh?.vertex?.position\r\n || mesh?.positions\r\n || mesh?.lods?.[0]?.vertex?.position\r\n || mesh?.lods?.[0]?.positions\r\n || null;\r\n }\r\n\r\n /**\r\n * Gets the number of vertices represented by flat or nested positions.\r\n *\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @returns {number}\r\n */\r\n static getPositionCount(positions)\r\n {\r\n if (!positions) return 0;\r\n return typeof positions[0] === \"number\"\r\n ? Math.floor(positions.length / 3)\r\n : positions.length;\r\n }\r\n\r\n /**\r\n * Calculates bounds from canonical positions using caller-owned scratch.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static setBoundsFromPositions(out, positions, point)\r\n {\r\n const count = this.getPositionCount(positions);\r\n let found = false;\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n if (!found)\r\n {\r\n out[0] = out[3] = point[0];\r\n out[1] = out[4] = point[1];\r\n out[2] = out[5] = point[2];\r\n found = true;\r\n continue;\r\n }\r\n out[0] = Math.min(out[0], point[0]);\r\n out[1] = Math.min(out[1], point[1]);\r\n out[2] = Math.min(out[2], point[2]);\r\n out[3] = Math.max(out[3], point[0]);\r\n out[4] = Math.max(out[4], point[1]);\r\n out[5] = Math.max(out[5], point[2]);\r\n }\r\n return found;\r\n }\r\n\r\n /**\r\n * Calculates a bounding sphere from positions using caller-owned scratch.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>|null} positions\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static setSphereFromPositions(out, positions, point)\r\n {\r\n const count = this.getPositionCount(positions);\r\n let\r\n found = false,\r\n minX = Infinity,\r\n minY = Infinity,\r\n minZ = Infinity,\r\n maxX = -Infinity,\r\n maxY = -Infinity,\r\n maxZ = -Infinity;\r\n\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n minX = Math.min(minX, point[0]);\r\n minY = Math.min(minY, point[1]);\r\n minZ = Math.min(minZ, point[2]);\r\n maxX = Math.max(maxX, point[0]);\r\n maxY = Math.max(maxY, point[1]);\r\n maxZ = Math.max(maxZ, point[2]);\r\n found = true;\r\n }\r\n if (!found) return false;\r\n\r\n out[0] = (minX + maxX) * 0.5;\r\n out[1] = (minY + maxY) * 0.5;\r\n out[2] = (minZ + maxZ) * 0.5;\r\n let maxSquaredRadius = 0;\r\n for (let index = 0; index < count; index++)\r\n {\r\n if (!this.copyPosition(point, positions, index)) continue;\r\n const\r\n x = out[0] - point[0],\r\n y = out[1] - point[1],\r\n z = out[2] - point[2];\r\n maxSquaredRadius = Math.max(maxSquaredRadius, x * x + y * y + z * z);\r\n }\r\n out[3] = Math.sqrt(maxSquaredRadius);\r\n return true;\r\n }\r\n\r\n /**\r\n * Calculates a mesh sphere from positions or existing bounds.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {object} mesh\r\n * @param {ArrayLike<number>} point\r\n * @returns {boolean}\r\n */\r\n static calculateMeshSphere(out, mesh, point)\r\n {\r\n if (this.setSphereFromPositions(out, this.getMeshPositions(mesh), point)) return true;\r\n const bounds = this.getBounds(mesh);\r\n if (!bounds) return false;\r\n sph3.fromBounds(out, bounds.min, bounds.max);\r\n return true;\r\n }\r\n\r\n /**\r\n * Stores a calculated sphere in the mesh's canonical sphere fields.\r\n *\r\n * @param {object} mesh\r\n * @param {ArrayLike<number>} sphere\r\n * @returns {void}\r\n */\r\n static setMeshSphere(mesh, sphere)\r\n {\r\n if (mesh.sphere && typeof mesh.sphere.set === \"function\") mesh.sphere.set(sphere);\r\n else mesh.sphere = [ ...sphere ];\r\n if (mesh.boundingSphere && typeof mesh.boundingSphere.set === \"function\")\r\n {\r\n mesh.boundingSphere.set(sphere);\r\n }\r\n else if (\"boundingSphere\" in mesh)\r\n {\r\n mesh.boundingSphere = [ ...sphere ];\r\n }\r\n }\r\n\r\n /**\r\n * Intersects a ray with canonical CPU geometry.\r\n *\r\n * @param {Array<object>|null} meshes\r\n * @param {ArrayLike<number>} position\r\n * @param {ArrayLike<number>} direction\r\n * @param {number} areaIndex\r\n * @returns {object}\r\n */\r\n static intersectGeometry(meshes, position, direction, areaIndex)\r\n {\r\n this.validateRayVector(position, \"position\");\r\n this.validateRayVector(direction, \"direction\");\r\n const\r\n ray = ray3.from(ray3.alloc(), position, direction),\r\n point = vec3.alloc(),\r\n vertexA = vec3.alloc(),\r\n vertexB = vec3.alloc(),\r\n vertexC = vec3.alloc(),\r\n normal = vec3.alloc();\r\n let nearest = null;\r\n try\r\n {\r\n for (let meshIndex = 0; meshIndex < (meshes?.length || 0); meshIndex++)\r\n {\r\n const mesh = meshes[meshIndex];\r\n const positions = this.getMeshPositions(mesh);\r\n if (!positions) continue;\r\n const groups = mesh?.indices || mesh?.lods?.[0]?.indices || null;\r\n if (ArrayBuffer.isView(groups)\r\n || (Array.isArray(groups) && typeof groups[0] === \"number\"))\r\n {\r\n if (areaIndex !== -1 && areaIndex !== 0) continue;\r\n nearest = this.intersectFaces(\r\n nearest,\r\n groups,\r\n 0,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n continue;\r\n }\r\n if (Array.isArray(groups))\r\n {\r\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++)\r\n {\r\n if (areaIndex !== -1 && areaIndex !== groupIndex) continue;\r\n const faces = groups[groupIndex]?.faces || groups[groupIndex]?.indices || [];\r\n nearest = this.intersectFaces(\r\n nearest,\r\n faces,\r\n groupIndex,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n }\r\n continue;\r\n }\r\n if (areaIndex === -1 || areaIndex === 0)\r\n {\r\n nearest = this.intersectFaces(\r\n nearest,\r\n null,\r\n 0,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n position,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n );\r\n }\r\n }\r\n return nearest || {\r\n hit: false,\r\n boneIndex: -1,\r\n point: [ 0, 0, 0 ],\r\n normal: [ 0, 0, 0 ],\r\n distance: Infinity,\r\n meshIndex: -1,\r\n areaIndex\r\n };\r\n }\r\n finally\r\n {\r\n vec3.unalloc(normal);\r\n vec3.unalloc(vertexC);\r\n vec3.unalloc(vertexB);\r\n vec3.unalloc(vertexA);\r\n vec3.unalloc(point);\r\n ray3.unalloc(ray);\r\n }\r\n }\r\n\r\n /**\r\n * Validates a caller-provided ray vector.\r\n *\r\n * @param {ArrayLike<number>} value\r\n * @param {string} name\r\n * @returns {void}\r\n */\r\n static validateRayVector(value, name)\r\n {\r\n if (!value\r\n || value.length < 3\r\n || !Number.isFinite(value[0])\r\n || !Number.isFinite(value[1])\r\n || !Number.isFinite(value[2]))\r\n {\r\n throw new TypeError(`TriGeometryRes ray ${name} must contain three finite numbers.`);\r\n }\r\n }\r\n\r\n /**\r\n * Intersects a ray with one flat face list.\r\n *\r\n * @param {object|null} nearest\r\n * @param {ArrayLike<number>|null} faces\r\n * @param {number} areaIndex\r\n * @param {object} mesh\r\n * @param {number} meshIndex\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\r\n * @param {ArrayLike<number>} rayOrigin\r\n * @param {ArrayLike<number>} ray\r\n * @param {ArrayLike<number>} point\r\n * @param {ArrayLike<number>} vertexA\r\n * @param {ArrayLike<number>} vertexB\r\n * @param {ArrayLike<number>} vertexC\r\n * @param {ArrayLike<number>} normal\r\n * @returns {object|null}\r\n */\r\n static intersectFaces(\r\n nearest,\r\n faces,\r\n areaIndex,\r\n mesh,\r\n meshIndex,\r\n positions,\r\n rayOrigin,\r\n ray,\r\n point,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n normal\r\n )\r\n {\r\n const count = faces?.length ?? this.getPositionCount(positions);\r\n for (let index = 0; index + 2 < count; index += 3)\r\n {\r\n const\r\n vertexIndexA = faces ? faces[index] : index,\r\n vertexIndexB = faces ? faces[index + 1] : index + 1,\r\n vertexIndexC = faces ? faces[index + 2] : index + 2;\r\n if (!this.copyPosition(vertexA, positions, vertexIndexA)\r\n || !this.copyPosition(vertexB, positions, vertexIndexB)\r\n || !this.copyPosition(vertexC, positions, vertexIndexC)\r\n || !ray3.getIntersectVertices(\r\n point,\r\n ray,\r\n vertexA,\r\n vertexB,\r\n vertexC,\r\n false\r\n ))\r\n {\r\n continue;\r\n }\r\n const distance = vec3.distance(rayOrigin, point);\r\n if (nearest && nearest.distance <= distance) continue;\r\n if (!nearest)\r\n {\r\n nearest = {\r\n hit: true,\r\n boneIndex: -1,\r\n point: [ 0, 0, 0 ],\r\n normal: [ 0, 0, 0 ],\r\n distance,\r\n meshIndex,\r\n areaIndex\r\n };\r\n }\r\n nearest.boneIndex = this.getMeshBoneIndex(mesh, vertexIndexA);\r\n vec3.copy(nearest.point, point);\r\n triangleNormalTo(normal, vertexA, vertexB, vertexC);\r\n vec3.copy(nearest.normal, normal);\r\n nearest.distance = distance;\r\n nearest.meshIndex = meshIndex;\r\n nearest.areaIndex = areaIndex;\r\n }\r\n return nearest;\r\n }\r\n\r\n /**\r\n * Copies one flat or nested position into caller-owned output.\r\n *\r\n * @param {ArrayLike<number>} out\r\n * @param {ArrayLike<number>|Array<ArrayLike<number>>} positions\r\n * @param {number} index\r\n * @returns {boolean}\r\n */\r\n static copyPosition(out, positions, index)\r\n {\r\n if (!Number.isInteger(index) || index < 0) return false;\r\n if (typeof positions[0] === \"number\")\r\n {\r\n const offset = index * 3;\r\n if (offset + 2 >= positions.length) return false;\r\n out[0] = positions[offset];\r\n out[1] = positions[offset + 1];\r\n out[2] = positions[offset + 2];\r\n return true;\r\n }\r\n const point = positions[index];\r\n if (!point || point.length < 3) return false;\r\n out[0] = point[0];\r\n out[1] = point[1];\r\n out[2] = point[2];\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the first blend index for a mesh vertex.\r\n *\r\n * @param {object} mesh\r\n * @param {number} vertexIndex\r\n * @returns {number}\r\n */\r\n static getMeshBoneIndex(mesh, vertexIndex)\r\n {\r\n const indices = mesh?.vertex?.blendIndices || mesh?.blendIndices;\r\n if (!indices) return -1;\r\n if (typeof indices[0] === \"number\")\r\n {\r\n return Number(indices[vertexIndex * 4] ?? indices[vertexIndex] ?? -1);\r\n }\r\n return Number(indices[vertexIndex]?.[0] ?? -1);\r\n }\r\n\r\n}\r\n\r\n// Declared as data rather than with decorators, so the resource tree loads from\r\n// source without a transform. Field order is key order, and GetValues() exports\r\n// in that order.\r\nCjsSchema.define(TriGeometryRes, {\r\n className: \"TriGeometryRes\",\r\n family: \"resources\",\r\n fields: {\r\n forceLod: [ type.boolean, io.readwrite ],\r\n forcedLodIndex: [ type.int32, io.readwrite ],\r\n name: [ type.string, io.readwrite ]\r\n },\r\n methods: {\r\n GetMeshCount: [ carbon.method, impl.adapted ],\r\n GetAnimationCount: [ carbon.method, impl.adapted ],\r\n GetSkeletonCount: [ carbon.method, impl.adapted ],\r\n GetSkeletonData: [ carbon.method, impl.adapted ],\r\n GetMeshAreaCount: [ carbon.method, impl.adapted ],\r\n GetLodIndexForScreenSize: [ carbon.method, impl.adapted ],\r\n GetMeshLod: [ carbon.method, impl.adapted ],\r\n GetMeshLodByIndex: [ carbon.method, impl.adapted ],\r\n GetMeshName: [ carbon.method, impl.adapted ],\r\n GetMeshAreaName: [ carbon.method, impl.adapted ],\r\n GetAreaBoundingBox: [ carbon.method, impl.adapted ],\r\n GetBoundingBox: [ carbon.method, impl.adapted ],\r\n GetBoundingSphere: [ carbon.method, impl.adapted ],\r\n CalculateBoundingBoxFromTransform: [ carbon.method, impl.adapted ],\r\n RecalculateBoundingSphere: [ carbon.method, impl.adapted ],\r\n Reload: [ carbon.method, impl.notSupported ],\r\n GetIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\r\n GetAreaIntersectionPointNormalBone: [ carbon.method, impl.adapted ],\r\n GetMeshVertexElements: [ carbon.method, impl.adapted ],\r\n SaveMesh: [ carbon.method, impl.notSupported ]\r\n }\r\n});\r\n"],"names":["TriGeometryRes","CjsResource","forceLod","forcedLodIndex","name","constructor","values","SetValues","markDirty","skipUpdate","skipEvents","SetPayload","payload","options","assertResourcePayloadObject","assertResourcePayloadArray","field","undefined","Array","isArray","resourcePayloadError","GetMeshCount","GetPayload","meshes","length","GetAnimationCount","animations","GetSkeletonCount","skeletons","GetSkeletonData","skeletonIndex","index","Number","isInteger","GetMeshAreaCount","meshIndex","mesh","areas","GetLodIndexForScreenSize","screenSize","Infinity","lods","lastLod","Math","min","maxScreenSize","GetMeshLod","GetMeshLodByIndex","lodIndex","GetMeshName","GetMeshAreaName","areaIndex","GetAreaBoundingBox","outMin","outMax","area","getMeshAreas","bounds","getBounds","copyBounds","GetBoundingBox","GetBoundingSphere","out","sphere","getSphere","vec4","copy","CalculateBoundingBoxFromTransform","transform","TypeError","positions","getMeshPositions","sourceBounds","box3","alloc","point","vec3","setBoundsFromPositions","fromBounds","max","transformMat4","unalloc","RecalculateBoundingSphere","updated","sph3","calculateMeshSphere","setMeshSphere","Reload","resourceBoundaryError","GetIntersectionPointNormalBone","position","direction","intersectGeometry","GetAreaIntersectionPointNormalBone","RangeError","GetMeshVertexElements","decl","vertexElements","SaveMesh","getPrimitiveCount","lod","count","areaCount","run","primitiveCount","offset","value","minBounds","maxBounds","boundingSphere","vertex","getPositionCount","floor","found","copyPosition","setSphereFromPositions","minX","minY","minZ","maxX","maxY","maxZ","maxSquaredRadius","x","y","z","sqrt","set","validateRayVector","ray","ray3","from","vertexA","vertexB","vertexC","normal","nearest","groups","indices","ArrayBuffer","isView","intersectFaces","groupIndex","faces","hit","boneIndex","distance","isFinite","rayOrigin","vertexIndexA","vertexIndexB","vertexIndexC","getIntersectVertices","getMeshBoneIndex","triangleNormalTo","vertexIndex","blendIndices","CjsSchema","define","className","family","fields","type","boolean","io","readwrite","int32","string","methods","carbon","method","impl","adapted","notSupported"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carbonenginejs/runtime-resource",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "CarbonEngineJS resource lifecycle, cache, source, and object loading contracts.",
5
5
  "type": "module",
6
6
  "exports": {