@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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
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
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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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"}
|