@carbonenginejs/runtime-trinity 0.4.3 → 0.5.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.
Files changed (99) hide show
  1. package/dist/curves/CjsGrannyCurves.js +12 -13
  2. package/dist/curves/CjsGrannyCurves.js.map +1 -1
  3. package/dist/eve/EveBannerSet.js +20 -1
  4. package/dist/eve/EveBannerSet.js.map +1 -1
  5. package/dist/eve/EveBoosterSet2.js +19 -1
  6. package/dist/eve/EveBoosterSet2.js.map +1 -1
  7. package/dist/eve/EveComponentTypes.js +116 -0
  8. package/dist/eve/EveComponentTypes.js.map +1 -0
  9. package/dist/eve/EveHazeSet.js +18 -1
  10. package/dist/eve/EveHazeSet.js.map +1 -1
  11. package/dist/eve/EvePlaneSet.js +19 -1
  12. package/dist/eve/EvePlaneSet.js.map +1 -1
  13. package/dist/eve/EveSpotlightSet.js +18 -1
  14. package/dist/eve/EveSpotlightSet.js.map +1 -1
  15. package/dist/eve/EveSpriteLineSet.js +18 -1
  16. package/dist/eve/EveSpriteLineSet.js.map +1 -1
  17. package/dist/eve/EveSpriteSet.js +18 -1
  18. package/dist/eve/EveSpriteSet.js.map +1 -1
  19. package/dist/eve/EveUpdateContext.js +195 -31
  20. package/dist/eve/EveUpdateContext.js.map +1 -1
  21. package/dist/eve/attachment/turrets/EveTurretFiringFX.js +23 -1
  22. package/dist/eve/attachment/turrets/EveTurretFiringFX.js.map +1 -1
  23. package/dist/eve/attachment/turrets/EveTurretSet.js +43 -1
  24. package/dist/eve/attachment/turrets/EveTurretSet.js.map +1 -1
  25. package/dist/eve/child/EveChildContainer.js +95 -60
  26. package/dist/eve/child/EveChildContainer.js.map +1 -1
  27. package/dist/eve/child/EveChildFogVolume.js +14 -1
  28. package/dist/eve/child/EveChildFogVolume.js.map +1 -1
  29. package/dist/eve/child/EveChildInstancedMeshes.js +43 -1
  30. package/dist/eve/child/EveChildInstancedMeshes.js.map +1 -1
  31. package/dist/eve/child/EveChildLightingOverride.js +14 -1
  32. package/dist/eve/child/EveChildLightingOverride.js.map +1 -1
  33. package/dist/eve/child/EveChildMesh.js +121 -80
  34. package/dist/eve/child/EveChildMesh.js.map +1 -1
  35. package/dist/eve/child/EveChildTransform.js +27 -17
  36. package/dist/eve/child/EveChildTransform.js.map +1 -1
  37. package/dist/eve/index.js +2 -0
  38. package/dist/eve/index.js.map +1 -1
  39. package/dist/eve/renderable/stretch/EveFiringEffectElementContainer.js +14 -1
  40. package/dist/eve/renderable/stretch/EveFiringEffectElementContainer.js.map +1 -1
  41. package/dist/eve/renderable/stretch/EveStretch.js +11 -1
  42. package/dist/eve/renderable/stretch/EveStretch.js.map +1 -1
  43. package/dist/eve/renderable/stretch/EveStretch2.js +14 -1
  44. package/dist/eve/renderable/stretch/EveStretch2.js.map +1 -1
  45. package/dist/eve/renderable/stretch/EveStretch3.js +24 -1
  46. package/dist/eve/renderable/stretch/EveStretch3.js.map +1 -1
  47. package/dist/eve/scene/EveSpaceScene.js +443 -16
  48. package/dist/eve/scene/EveSpaceScene.js.map +1 -1
  49. package/dist/eve/spaceObject/EveEffectRoot2.js +28 -1
  50. package/dist/eve/spaceObject/EveEffectRoot2.js.map +1 -1
  51. package/dist/eve/spaceObject/EveMobile.js +25 -1
  52. package/dist/eve/spaceObject/EveMobile.js.map +1 -1
  53. package/dist/eve/spaceObject/EveSpaceObject2.js +59 -1
  54. package/dist/eve/spaceObject/EveSpaceObject2.js.map +1 -1
  55. package/dist/generated/eve/child/EveChildCloud2.js +88 -5
  56. package/dist/generated/eve/child/EveChildCloud2.js.map +1 -1
  57. package/dist/generated/eve/child/EveChildExplosion.js +17 -1
  58. package/dist/generated/eve/child/EveChildExplosion.js.map +1 -1
  59. package/dist/generated/eve/child/EveChildInstanceContainer.js +29 -1
  60. package/dist/generated/eve/child/EveChildInstanceContainer.js.map +1 -1
  61. package/dist/generated/eve/child/EveChildParticleSystem.js +32 -24
  62. package/dist/generated/eve/child/EveChildParticleSystem.js.map +1 -1
  63. package/dist/generated/eve/child/EveChildPlug.js +23 -1
  64. package/dist/generated/eve/child/EveChildPlug.js.map +1 -1
  65. package/dist/generated/eve/child/EveChildPostProcessVolume.js +27 -14
  66. package/dist/generated/eve/child/EveChildPostProcessVolume.js.map +1 -1
  67. package/dist/generated/eve/child/EveChildRef.js +17 -1
  68. package/dist/generated/eve/child/EveChildRef.js.map +1 -1
  69. package/dist/generated/eve/child/EveChildSocket.js +17 -1
  70. package/dist/generated/eve/child/EveChildSocket.js.map +1 -1
  71. package/dist/generated/eve/child/behaviors/BehaviorGroup.js +43 -40
  72. package/dist/generated/eve/child/behaviors/BehaviorGroup.js.map +1 -1
  73. package/dist/generated/eve/child/procedural/EveChildProceduralContainer.js +53 -49
  74. package/dist/generated/eve/child/procedural/EveChildProceduralContainer.js.map +1 -1
  75. package/dist/generated/eve/scene/EveComponentRegistry.js +11 -0
  76. package/dist/generated/eve/scene/EveComponentRegistry.js.map +1 -1
  77. package/dist/generated/eve/scene/TriShadowFrustum.js +74 -22
  78. package/dist/generated/eve/scene/TriShadowFrustum.js.map +1 -1
  79. package/dist/generated/eve/scene/TriShadowOrthoFrustum.js +128 -26
  80. package/dist/generated/eve/scene/TriShadowOrthoFrustum.js.map +1 -1
  81. package/dist/generated/eve/smartLights/EveChildSmartLightSet.js +37 -24
  82. package/dist/generated/eve/smartLights/EveChildSmartLightSet.js.map +1 -1
  83. package/dist/generated/eve/smartLights/EveSmartLightPointLight.js +29 -28
  84. package/dist/generated/eve/smartLights/EveSmartLightPointLight.js.map +1 -1
  85. package/dist/generated/eve/spaceObject/EveShip2.js +39 -19
  86. package/dist/generated/eve/spaceObject/EveShip2.js.map +1 -1
  87. package/dist/generated/eve/spaceObject/swarm/EveSwarm.js +28 -1
  88. package/dist/generated/eve/spaceObject/swarm/EveSwarm.js.map +1 -1
  89. package/dist/generated/eve/spaceObject/swarm/EveSwarmRenderable.js +28 -1
  90. package/dist/generated/eve/spaceObject/swarm/EveSwarmRenderable.js.map +1 -1
  91. package/dist/index.js +3 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/trinityCore/TriFrustum.js +374 -0
  94. package/dist/trinityCore/TriFrustum.js.map +1 -0
  95. package/dist/trinityCore/TriFrustumOrtho.js +158 -0
  96. package/dist/trinityCore/TriFrustumOrtho.js.map +1 -0
  97. package/dist/trinityCore/index.js +2 -0
  98. package/dist/trinityCore/index.js.map +1 -1
  99. package/package.json +2 -2
@@ -0,0 +1,374 @@
1
+ import { mat4 } from '@carbonenginejs/core-math/mat4';
2
+ import { vec3 } from '@carbonenginejs/core-math/vec3';
3
+ import { vec4 } from '@carbonenginejs/core-math/vec4';
4
+ import { TriFrustumTestResult } from '../generated/trinityCore/enums.js';
5
+
6
+ // Source: E:\carbonengine\trinity\trinity\TriFrustum.h
7
+ // Source: E:\carbonengine\trinity\trinity\TriFrustum.cpp
8
+ // Source: E:\carbonengine\math\include\Plane_inline.h (Normalize/DotCoord/DotNormal)
9
+ // Source: E:\carbonengine\trinity\trinity\Utilities\MatrixUtils.cpp:28-42 (DeconstructProjectionMatrix)
10
+ //
11
+ // Native CPU helper (not Blue-exposed in Carbon - no TriFrustum_Blue.cpp
12
+ // exists), so no schema registration; plain class per the EveLODHelper /
13
+ // CjsBatchManager precedent. Carbon's TRINITYDEV-only test/rejection counters
14
+ // are omitted. Matrix element mapping: Carbon row-major _rc lands at flat
15
+ // index (r-1)*4+(c-1), which is the SAME flat index in the shared gl-matrix
16
+ // byte layout, so every _rc below is ported as m[(r-1)*4+(c-1)] unchanged.
17
+
18
+ /** std::numeric_limits<float>::max() - Carbon's "camera inside sphere" result. */
19
+ const FLOAT_MAX = 3.4028234663852886e38;
20
+ const DERIVE_SCRATCH = mat4.create();
21
+
22
+ /**
23
+ * Carbon DotCoord (Plane_inline.h:123-126), prefixed to keep the flat package
24
+ * namespace unambiguous: plane.a*v.x + plane.b*v.y + plane.c*v.z + plane.d.
25
+ * @param {Float32Array} plane - (a, b, c, d)
26
+ * @param {Float32Array|Array} point
27
+ * @returns {Number}
28
+ */
29
+ function PlaneDotCoord(plane, point) {
30
+ return plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3];
31
+ }
32
+
33
+ /**
34
+ * Carbon DotNormal (Plane_inline.h:129-132): plane.a*v.x + plane.b*v.y + plane.c*v.z.
35
+ * @param {Float32Array} plane - (a, b, c, d)
36
+ * @param {Float32Array|Array} v
37
+ * @returns {Number}
38
+ */
39
+ function PlaneDotNormal(plane, v) {
40
+ return plane[0] * v[0] + plane[1] * v[1] + plane[2] * v[2];
41
+ }
42
+
43
+ /**
44
+ * Carbon TriFrustum (TriFrustum.h:16-77): world-space frustum planes extracted
45
+ * from a composed view*projection matrix, plus the cached projection data used
46
+ * for on-screen pixel-coverage estimates.
47
+ */
48
+ class TriFrustum {
49
+ /** m_planes[PLANE_COUNT] - normalized world-space planes (a, b, c, d). */
50
+ planes = [vec4.create(), vec4.create(), vec4.create(), vec4.create(), vec4.create(), vec4.create()];
51
+
52
+ /** m_projectionMatrix */
53
+ projectionMatrix = mat4.create();
54
+
55
+ /** m_viewPos - camera world position supplied to DeriveFrustum. */
56
+ viewPos = vec3.create();
57
+
58
+ /** m_viewDir - third column of the view matrix (view->_13/_23/_33). */
59
+ viewDir = vec3.create();
60
+
61
+ /** m_halfWidthProjection = projection._11 * viewport.width * 0.5 */
62
+ halfWidthProjection = 0;
63
+
64
+ /** m_zNear */
65
+ zNear = 0;
66
+
67
+ /** m_zFar */
68
+ zFar = 0;
69
+
70
+ /** m_aspectRatio */
71
+ aspectRatio = 1;
72
+
73
+ /** m_fov */
74
+ fov = 1;
75
+
76
+ /**
77
+ * Carbon TriFrustum::DeriveFrustum (cpp:26-36) - extracts the frustum planes
78
+ * from the view and projection matrix in world coordinates.
79
+ * @param {Float32Array} view
80
+ * @param {Float32Array} viewPos - camera world position
81
+ * @param {Float32Array} projection
82
+ * @param {Object} viewport - TriViewport duck ({ width })
83
+ */
84
+ DeriveFrustum(view, viewPos, projection, viewport) {
85
+ this.#CacheTransformationData(view, viewPos, projection, viewport);
86
+
87
+ // Carbon (row-vector): worldMat = view * projection - view applied first,
88
+ // then projection, so gl-matrix swaps the operands.
89
+ mat4.multiply(DERIVE_SCRATCH, projection, view);
90
+ this.ExtractFrustum(DERIVE_SCRATCH);
91
+ }
92
+
93
+ /**
94
+ * Carbon TriFrustum::ExtractFrustum (cpp:38-119) - Gribb/Hartmann plane
95
+ * extraction by adding/subtracting matrix columns, then normalizing.
96
+ * Carbon _rc flat indices: col1 = (0, 4, 8, 12), col2 = (1, 5, 9, 13),
97
+ * col3 = (2, 6, 10, 14), col4 = (3, 7, 11, 15).
98
+ * @param {Float32Array} proj - composed view*projection (or projection alone)
99
+ */
100
+ ExtractFrustum(proj) {
101
+ const planes = this.planes;
102
+
103
+ // front: the near-plane normal is column 3 (proj->_13/_23/_33/_43)
104
+ vec4.set(planes[TriFrustum.PLANE_FRONT], proj[2], proj[6], proj[10], proj[14]);
105
+ // left: col4 + col1
106
+ vec4.set(planes[TriFrustum.PLANE_LEFT], proj[3] + proj[0], proj[7] + proj[4], proj[11] + proj[8], proj[15] + proj[12]);
107
+ // top: col4 - col2
108
+ vec4.set(planes[TriFrustum.PLANE_TOP], proj[3] - proj[1], proj[7] - proj[5], proj[11] - proj[9], proj[15] - proj[13]);
109
+ // right: col4 - col1
110
+ vec4.set(planes[TriFrustum.PLANE_RIGHT], proj[3] - proj[0], proj[7] - proj[4], proj[11] - proj[8], proj[15] - proj[12]);
111
+ // bottom: col4 + col2
112
+ vec4.set(planes[TriFrustum.PLANE_BOTTOM], proj[3] + proj[1], proj[7] + proj[5], proj[11] + proj[9], proj[15] + proj[13]);
113
+ // back: col4 - col3
114
+ vec4.set(planes[TriFrustum.PLANE_BACK], proj[3] - proj[2], proj[7] - proj[6], proj[11] - proj[10], proj[15] - proj[14]);
115
+ for (let i = 0; i < TriFrustum.PLANE_COUNT; i++) {
116
+ // Plane Normalize (Plane_inline.h:112-120): scale by 1/|normal|.
117
+ const plane = planes[i];
118
+ const scale = 1 / Math.hypot(plane[0], plane[1], plane[2]);
119
+ plane[0] *= scale;
120
+ plane[1] *= scale;
121
+ plane[2] *= scale;
122
+ plane[3] *= scale;
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Carbon's two IsSphereVisible overloads (cpp:121-148), dispatched on the
128
+ * second argument: a number selects the (center, radius) overload, anything
129
+ * else treats the first argument as a packed vec4 sphere with the second as
130
+ * cullBackPlane. Returns true if any part of the sphere is inside the
131
+ * frustum. Carbon deliberately skips the back plane unless cullBackPlane
132
+ * ("For some reason the old code ignored the back plane").
133
+ * @param {Float32Array} sphereOrCenter - packed (x, y, z, radius) or center
134
+ * @param {Number|Boolean} [radiusOrCullBackPlane]
135
+ * @param {Boolean} [cullBackPlane]
136
+ * @returns {Boolean}
137
+ */
138
+ IsSphereVisible(sphereOrCenter, radiusOrCullBackPlane = false, cullBackPlane = false) {
139
+ let radius;
140
+ let cullBack;
141
+ if (typeof radiusOrCullBackPlane === "number") {
142
+ radius = radiusOrCullBackPlane;
143
+ cullBack = !!cullBackPlane;
144
+ } else {
145
+ radius = sphereOrCenter[3];
146
+ cullBack = !!radiusOrCullBackPlane;
147
+ }
148
+ if (TriFrustum.frustumCullingDisabled) {
149
+ return true;
150
+ }
151
+ const planeCount = TriFrustum.PLANE_COUNT - 1 + (cullBack ? 1 : 0);
152
+ for (let i = 0; i < planeCount; i++) {
153
+ if (PlaneDotCoord(this.planes[i], sphereOrCenter) < -radius) {
154
+ return false;
155
+ }
156
+ }
157
+ return true;
158
+ }
159
+
160
+ /**
161
+ * Carbon TriFrustum::SphereTest (cpp:150-166) - full six-plane classification.
162
+ * @param {Object|Float32Array} sphere - { center, radius } or packed vec4
163
+ * @returns {Number} TriFrustumTestResult
164
+ */
165
+ SphereTest(sphere) {
166
+ const packed = typeof sphere?.length === "number" && sphere.length >= 4;
167
+ const center = packed ? sphere : sphere.center;
168
+ const radius = packed ? sphere[3] : sphere.radius;
169
+ let result = TriFrustumTestResult.Inside;
170
+ for (let i = 0; i < TriFrustum.PLANE_COUNT; i++) {
171
+ const d = PlaneDotCoord(this.planes[i], center);
172
+ if (d < -radius) {
173
+ return TriFrustumTestResult.Outside;
174
+ }
175
+ if (d < radius) {
176
+ result = TriFrustumTestResult.Intersect;
177
+ }
178
+ }
179
+ return result;
180
+ }
181
+
182
+ /**
183
+ * Carbon TriFrustum::IsPointVisible (cpp:168-174) - wraps the sphere test
184
+ * with a radius of zero.
185
+ * @param {Float32Array} point
186
+ * @returns {Boolean}
187
+ */
188
+ IsPointVisible(point) {
189
+ return this.IsSphereVisible(point, 0);
190
+ }
191
+
192
+ /**
193
+ * Carbon's two IsBoxVisible overloads (cpp:187-232): (boundsMin, boundsMax)
194
+ * or a single AABB duck ({ min, max }; a missing/uninitialized box is not
195
+ * visible). Frustum-AABB test via the positive vertex; may return false
196
+ * positives, never false negatives.
197
+ * @param {Float32Array|Object} boundsMinOrBox
198
+ * @param {Float32Array} [boundsMax]
199
+ * @returns {Boolean}
200
+ */
201
+ IsBoxVisible(boundsMinOrBox, boundsMax = null) {
202
+ let min = boundsMinOrBox;
203
+ let max = boundsMax;
204
+ if (!boundsMax) {
205
+ const box = boundsMinOrBox;
206
+ if (!box?.min || !box?.max) {
207
+ return false;
208
+ }
209
+ min = box.min;
210
+ max = box.max;
211
+ }
212
+ for (let i = 0; i < TriFrustum.PLANE_COUNT; i++) {
213
+ const plane = this.planes[i];
214
+ const vmaxX = plane[0] > 0 ? max[0] : min[0];
215
+ const vmaxY = plane[1] > 0 ? max[1] : min[1];
216
+ const vmaxZ = plane[2] > 0 ? max[2] : min[2];
217
+ if (plane[0] * vmaxX + plane[1] * vmaxY + plane[2] * vmaxZ + plane[3] < 0) {
218
+ return false;
219
+ }
220
+ }
221
+ return true;
222
+ }
223
+
224
+ /**
225
+ * Carbon's GetPixelSizeAccross overload family (cpp:234-307): the pixel
226
+ * coverage of a bounding sphere on screen. Dispatch: (center, radius) when
227
+ * the second argument is a number; packed vec4 (x, y, z, radius); a
228
+ * { center, radius } sphere duck (Carbon's CcpMath::Sphere overload, which
229
+ * delegates to GetPixelSizeAccrossEst); or an AABB duck ({ min, max },
230
+ * bounding-sphere'd first, 0 when missing).
231
+ * @param {Float32Array|Object} sphereOrCenter
232
+ * @param {Number} [radius]
233
+ * @returns {Number}
234
+ */
235
+ GetPixelSizeAccross(sphereOrCenter, radius = undefined) {
236
+ if (typeof radius === "number") {
237
+ return this.#GetPixelSizeAccrossCenterRadius(sphereOrCenter, radius);
238
+ }
239
+ const value = sphereOrCenter;
240
+ if (typeof value?.length === "number" && value.length >= 4) {
241
+ return this.#GetPixelSizeAccrossCenterRadius(value, value[3]);
242
+ }
243
+ if (typeof value?.radius === "number") {
244
+ // Carbon (cpp:295-298): the Sphere overload calls GetPixelSizeAccrossEst.
245
+ return this.#GetPixelSizeAccrossEstCenterRadius(value.center, value.radius);
246
+ }
247
+ if (value?.min && value?.max) {
248
+ // Carbon (cpp:300-307): Sphere(box) - center of the box, half-diagonal radius.
249
+ const min = value.min;
250
+ const max = value.max;
251
+ TriFrustum.#boxCenterScratch[0] = (min[0] + max[0]) * 0.5;
252
+ TriFrustum.#boxCenterScratch[1] = (min[1] + max[1]) * 0.5;
253
+ TriFrustum.#boxCenterScratch[2] = (min[2] + max[2]) * 0.5;
254
+ const boxRadius = Math.hypot(max[0] - min[0], max[1] - min[1], max[2] - min[2]) * 0.5;
255
+ return this.#GetPixelSizeAccrossEstCenterRadius(TriFrustum.#boxCenterScratch, boxRadius);
256
+ }
257
+ return 0;
258
+ }
259
+
260
+ /**
261
+ * Carbon's GetPixelSizeAccrossEst overloads (cpp:239-242, 274-293) - cheaper
262
+ * distance-based estimate that properly goes to infinity as the camera
263
+ * enters the sphere. Same vec4 / (center, radius) dispatch as
264
+ * GetPixelSizeAccross.
265
+ * @param {Float32Array} sphereOrCenter
266
+ * @param {Number} [radius]
267
+ * @returns {Number}
268
+ */
269
+ GetPixelSizeAccrossEst(sphereOrCenter, radius = undefined) {
270
+ if (typeof radius === "number") {
271
+ return this.#GetPixelSizeAccrossEstCenterRadius(sphereOrCenter, radius);
272
+ }
273
+ return this.#GetPixelSizeAccrossEstCenterRadius(sphereOrCenter, sphereOrCenter[3]);
274
+ }
275
+
276
+ /**
277
+ * Carbon TriFrustum::GetPixelSizeAccross(center, radius) (cpp:245-272).
278
+ * @param {Float32Array} center
279
+ * @param {Number} radius
280
+ * @returns {Number}
281
+ */
282
+ #GetPixelSizeAccrossCenterRadius(center, radius) {
283
+ // Carbon: Vector3 d(center - m_viewPos); d = -d; => d = viewPos - center.
284
+ const dx = this.viewPos[0] - center[0];
285
+ const dy = this.viewPos[1] - center[1];
286
+ const dz = this.viewPos[2] - center[2];
287
+ if (dx * dx + dy * dy + dz * dz < radius * radius) {
288
+ return FLOAT_MAX;
289
+ }
290
+ let depth = this.viewDir[0] * dx + this.viewDir[1] * dy + this.viewDir[2] * dz;
291
+ // clamp values close to zero and below
292
+ const epsilon = 1e-5;
293
+ if (depth < epsilon) {
294
+ depth = epsilon;
295
+ }
296
+ if (radius < epsilon) {
297
+ return 0;
298
+ }
299
+ return radius / depth * this.halfWidthProjection * 2;
300
+ }
301
+
302
+ /**
303
+ * Carbon TriFrustum::GetPixelSizeAccrossEst(center, radius) (cpp:274-293).
304
+ * @param {Float32Array} center
305
+ * @param {Number} radius
306
+ * @returns {Number}
307
+ */
308
+ #GetPixelSizeAccrossEstCenterRadius(center, radius) {
309
+ if (radius <= 0) {
310
+ return 0;
311
+ }
312
+ const dx = center[0] - this.viewPos[0];
313
+ const dy = center[1] - this.viewPos[1];
314
+ const dz = center[2] - this.viewPos[2];
315
+ const lengthSqrd = dx * dx + dy * dy + dz * dz;
316
+ const radiusSqrd = radius * radius;
317
+ if (lengthSqrd < radiusSqrd) {
318
+ // The camera is inside the object, it essentially has infinite screen size.
319
+ return FLOAT_MAX;
320
+ }
321
+
322
+ // adjusted distance based on the visible part of the sphere
323
+ const distance = Math.sqrt(lengthSqrd - radiusSqrd);
324
+ return radius / distance * this.halfWidthProjection * 2;
325
+ }
326
+
327
+ /**
328
+ * Carbon TriFrustum::CacheTransformationData (cpp:309-325, private) - stores
329
+ * the view/projection data needed for pixel-diameter extraction, then
330
+ * DeconstructProjectionMatrix (MatrixUtils.cpp:28-42) recovers aspect, fov
331
+ * and the clip planes from the projection matrix.
332
+ * @param {Float32Array} view
333
+ * @param {Float32Array} viewPos
334
+ * @param {Float32Array} projection
335
+ * @param {Object} viewport
336
+ */
337
+ #CacheTransformationData(view, viewPos, projection, viewport) {
338
+ mat4.copy(this.projectionMatrix, projection);
339
+ vec3.copy(this.viewPos, viewPos);
340
+
341
+ // m_viewDir = view->_13/_23/_33 (flat 2/6/10) - third column of the
342
+ // row-vector view matrix; single-matrix data, no composition involved.
343
+ this.viewDir[0] = view[2];
344
+ this.viewDir[1] = view[6];
345
+ this.viewDir[2] = view[10];
346
+
347
+ // m_halfWidthProjection = projection->_11 (flat 0) * viewport.width * 0.5
348
+ this.halfWidthProjection = projection[0] * viewport.width * 0.5;
349
+
350
+ // DeconstructProjectionMatrix: asp = _22/_11, fov = 2*atan(1/_22),
351
+ // frontClip = _43/_33, backClip = frontClip*_33/(_33+1).
352
+ this.aspectRatio = projection[0] ? projection[5] / projection[0] : 0;
353
+ this.fov = projection[5] ? 2 * Math.atan(1 / projection[5]) : 0;
354
+ this.zNear = projection[10] ? projection[14] / projection[10] : 0;
355
+ this.zFar = this.zNear * projection[10] / (projection[10] + 1);
356
+ }
357
+
358
+ /** Carbon TriFrustum plane-index enum (TriFrustum.h:19-28). */
359
+ static PLANE_FRONT = 0;
360
+ static PLANE_LEFT = 1;
361
+ static PLANE_TOP = 2;
362
+ static PLANE_RIGHT = 3;
363
+ static PLANE_BOTTOM = 4;
364
+ static PLANE_BACK = 5;
365
+ static PLANE_COUNT = 6;
366
+
367
+ /** g_frustumCullingDisabled (TRI_REGISTER_SETTING "frustumCullingDisabled",
368
+ * cpp:9-10) - debug escape hatch that forces every sphere test to pass. */
369
+ static frustumCullingDisabled = false;
370
+ static #boxCenterScratch = vec3.create();
371
+ }
372
+
373
+ export { FLOAT_MAX, PlaneDotCoord, PlaneDotNormal, TriFrustum };
374
+ //# sourceMappingURL=TriFrustum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriFrustum.js","sources":["../../../src/trinityCore/TriFrustum.js"],"sourcesContent":["// Source: E:\\carbonengine\\trinity\\trinity\\TriFrustum.h\r\n// Source: E:\\carbonengine\\trinity\\trinity\\TriFrustum.cpp\r\n// Source: E:\\carbonengine\\math\\include\\Plane_inline.h (Normalize/DotCoord/DotNormal)\r\n// Source: E:\\carbonengine\\trinity\\trinity\\Utilities\\MatrixUtils.cpp:28-42 (DeconstructProjectionMatrix)\r\n//\r\n// Native CPU helper (not Blue-exposed in Carbon - no TriFrustum_Blue.cpp\r\n// exists), so no schema registration; plain class per the EveLODHelper /\r\n// CjsBatchManager precedent. Carbon's TRINITYDEV-only test/rejection counters\r\n// are omitted. Matrix element mapping: Carbon row-major _rc lands at flat\r\n// index (r-1)*4+(c-1), which is the SAME flat index in the shared gl-matrix\r\n// byte layout, so every _rc below is ported as m[(r-1)*4+(c-1)] unchanged.\r\nimport { mat4 } from \"@carbonenginejs/core-math/mat4\";\r\nimport { vec3 } from \"@carbonenginejs/core-math/vec3\";\r\nimport { vec4 } from \"@carbonenginejs/core-math/vec4\";\r\nimport { TriFrustumTestResult } from \"../generated/trinityCore/enums.js\";\r\n\r\n/** std::numeric_limits<float>::max() - Carbon's \"camera inside sphere\" result. */\r\nexport const FLOAT_MAX = 3.4028234663852886e38;\r\n\r\nconst DERIVE_SCRATCH = mat4.create();\r\n\r\n/**\r\n * Carbon DotCoord (Plane_inline.h:123-126), prefixed to keep the flat package\r\n * namespace unambiguous: plane.a*v.x + plane.b*v.y + plane.c*v.z + plane.d.\r\n * @param {Float32Array} plane - (a, b, c, d)\r\n * @param {Float32Array|Array} point\r\n * @returns {Number}\r\n */\r\nexport function PlaneDotCoord(plane, point)\r\n{\r\n return plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3];\r\n}\r\n\r\n/**\r\n * Carbon DotNormal (Plane_inline.h:129-132): plane.a*v.x + plane.b*v.y + plane.c*v.z.\r\n * @param {Float32Array} plane - (a, b, c, d)\r\n * @param {Float32Array|Array} v\r\n * @returns {Number}\r\n */\r\nexport function PlaneDotNormal(plane, v)\r\n{\r\n return plane[0] * v[0] + plane[1] * v[1] + plane[2] * v[2];\r\n}\r\n\r\n/**\r\n * Carbon TriFrustum (TriFrustum.h:16-77): world-space frustum planes extracted\r\n * from a composed view*projection matrix, plus the cached projection data used\r\n * for on-screen pixel-coverage estimates.\r\n */\r\nexport class TriFrustum\r\n{\r\n /** m_planes[PLANE_COUNT] - normalized world-space planes (a, b, c, d). */\r\n planes = [\r\n vec4.create(),\r\n vec4.create(),\r\n vec4.create(),\r\n vec4.create(),\r\n vec4.create(),\r\n vec4.create()\r\n ];\r\n\r\n /** m_projectionMatrix */\r\n projectionMatrix = mat4.create();\r\n\r\n /** m_viewPos - camera world position supplied to DeriveFrustum. */\r\n viewPos = vec3.create();\r\n\r\n /** m_viewDir - third column of the view matrix (view->_13/_23/_33). */\r\n viewDir = vec3.create();\r\n\r\n /** m_halfWidthProjection = projection._11 * viewport.width * 0.5 */\r\n halfWidthProjection = 0;\r\n\r\n /** m_zNear */\r\n zNear = 0;\r\n\r\n /** m_zFar */\r\n zFar = 0;\r\n\r\n /** m_aspectRatio */\r\n aspectRatio = 1;\r\n\r\n /** m_fov */\r\n fov = 1;\r\n\r\n /**\r\n * Carbon TriFrustum::DeriveFrustum (cpp:26-36) - extracts the frustum planes\r\n * from the view and projection matrix in world coordinates.\r\n * @param {Float32Array} view\r\n * @param {Float32Array} viewPos - camera world position\r\n * @param {Float32Array} projection\r\n * @param {Object} viewport - TriViewport duck ({ width })\r\n */\r\n DeriveFrustum(view, viewPos, projection, viewport)\r\n {\r\n this.#CacheTransformationData(view, viewPos, projection, viewport);\r\n\r\n // Carbon (row-vector): worldMat = view * projection - view applied first,\r\n // then projection, so gl-matrix swaps the operands.\r\n mat4.multiply(DERIVE_SCRATCH, projection, view);\r\n\r\n this.ExtractFrustum(DERIVE_SCRATCH);\r\n }\r\n\r\n /**\r\n * Carbon TriFrustum::ExtractFrustum (cpp:38-119) - Gribb/Hartmann plane\r\n * extraction by adding/subtracting matrix columns, then normalizing.\r\n * Carbon _rc flat indices: col1 = (0, 4, 8, 12), col2 = (1, 5, 9, 13),\r\n * col3 = (2, 6, 10, 14), col4 = (3, 7, 11, 15).\r\n * @param {Float32Array} proj - composed view*projection (or projection alone)\r\n */\r\n ExtractFrustum(proj)\r\n {\r\n const planes = this.planes;\r\n\r\n // front: the near-plane normal is column 3 (proj->_13/_23/_33/_43)\r\n vec4.set(planes[TriFrustum.PLANE_FRONT], proj[2], proj[6], proj[10], proj[14]);\r\n // left: col4 + col1\r\n vec4.set(planes[TriFrustum.PLANE_LEFT], proj[3] + proj[0], proj[7] + proj[4], proj[11] + proj[8], proj[15] + proj[12]);\r\n // top: col4 - col2\r\n vec4.set(planes[TriFrustum.PLANE_TOP], proj[3] - proj[1], proj[7] - proj[5], proj[11] - proj[9], proj[15] - proj[13]);\r\n // right: col4 - col1\r\n vec4.set(planes[TriFrustum.PLANE_RIGHT], proj[3] - proj[0], proj[7] - proj[4], proj[11] - proj[8], proj[15] - proj[12]);\r\n // bottom: col4 + col2\r\n vec4.set(planes[TriFrustum.PLANE_BOTTOM], proj[3] + proj[1], proj[7] + proj[5], proj[11] + proj[9], proj[15] + proj[13]);\r\n // back: col4 - col3\r\n vec4.set(planes[TriFrustum.PLANE_BACK], proj[3] - proj[2], proj[7] - proj[6], proj[11] - proj[10], proj[15] - proj[14]);\r\n\r\n for (let i = 0; i < TriFrustum.PLANE_COUNT; i++)\r\n {\r\n // Plane Normalize (Plane_inline.h:112-120): scale by 1/|normal|.\r\n const plane = planes[i];\r\n const scale = 1 / Math.hypot(plane[0], plane[1], plane[2]);\r\n plane[0] *= scale;\r\n plane[1] *= scale;\r\n plane[2] *= scale;\r\n plane[3] *= scale;\r\n }\r\n }\r\n\r\n /**\r\n * Carbon's two IsSphereVisible overloads (cpp:121-148), dispatched on the\r\n * second argument: a number selects the (center, radius) overload, anything\r\n * else treats the first argument as a packed vec4 sphere with the second as\r\n * cullBackPlane. Returns true if any part of the sphere is inside the\r\n * frustum. Carbon deliberately skips the back plane unless cullBackPlane\r\n * (\"For some reason the old code ignored the back plane\").\r\n * @param {Float32Array} sphereOrCenter - packed (x, y, z, radius) or center\r\n * @param {Number|Boolean} [radiusOrCullBackPlane]\r\n * @param {Boolean} [cullBackPlane]\r\n * @returns {Boolean}\r\n */\r\n IsSphereVisible(sphereOrCenter, radiusOrCullBackPlane = false, cullBackPlane = false)\r\n {\r\n let radius;\r\n let cullBack;\r\n if (typeof radiusOrCullBackPlane === \"number\")\r\n {\r\n radius = radiusOrCullBackPlane;\r\n cullBack = !!cullBackPlane;\r\n }\r\n else\r\n {\r\n radius = sphereOrCenter[3];\r\n cullBack = !!radiusOrCullBackPlane;\r\n }\r\n\r\n if (TriFrustum.frustumCullingDisabled)\r\n {\r\n return true;\r\n }\r\n\r\n const planeCount = (TriFrustum.PLANE_COUNT - 1) + (cullBack ? 1 : 0);\r\n for (let i = 0; i < planeCount; i++)\r\n {\r\n if (PlaneDotCoord(this.planes[i], sphereOrCenter) < -radius)\r\n {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustum::SphereTest (cpp:150-166) - full six-plane classification.\r\n * @param {Object|Float32Array} sphere - { center, radius } or packed vec4\r\n * @returns {Number} TriFrustumTestResult\r\n */\r\n SphereTest(sphere)\r\n {\r\n const packed = typeof sphere?.length === \"number\" && sphere.length >= 4;\r\n const center = packed ? sphere : sphere.center;\r\n const radius = packed ? sphere[3] : sphere.radius;\r\n\r\n let result = TriFrustumTestResult.Inside;\r\n for (let i = 0; i < TriFrustum.PLANE_COUNT; i++)\r\n {\r\n const d = PlaneDotCoord(this.planes[i], center);\r\n if (d < -radius)\r\n {\r\n return TriFrustumTestResult.Outside;\r\n }\r\n if (d < radius)\r\n {\r\n result = TriFrustumTestResult.Intersect;\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustum::IsPointVisible (cpp:168-174) - wraps the sphere test\r\n * with a radius of zero.\r\n * @param {Float32Array} point\r\n * @returns {Boolean}\r\n */\r\n IsPointVisible(point)\r\n {\r\n return this.IsSphereVisible(point, 0);\r\n }\r\n\r\n /**\r\n * Carbon's two IsBoxVisible overloads (cpp:187-232): (boundsMin, boundsMax)\r\n * or a single AABB duck ({ min, max }; a missing/uninitialized box is not\r\n * visible). Frustum-AABB test via the positive vertex; may return false\r\n * positives, never false negatives.\r\n * @param {Float32Array|Object} boundsMinOrBox\r\n * @param {Float32Array} [boundsMax]\r\n * @returns {Boolean}\r\n */\r\n IsBoxVisible(boundsMinOrBox, boundsMax = null)\r\n {\r\n let min = boundsMinOrBox;\r\n let max = boundsMax;\r\n if (!boundsMax)\r\n {\r\n const box = boundsMinOrBox;\r\n if (!box?.min || !box?.max)\r\n {\r\n return false;\r\n }\r\n min = box.min;\r\n max = box.max;\r\n }\r\n\r\n for (let i = 0; i < TriFrustum.PLANE_COUNT; i++)\r\n {\r\n const plane = this.planes[i];\r\n const vmaxX = plane[0] > 0 ? max[0] : min[0];\r\n const vmaxY = plane[1] > 0 ? max[1] : min[1];\r\n const vmaxZ = plane[2] > 0 ? max[2] : min[2];\r\n if (plane[0] * vmaxX + plane[1] * vmaxY + plane[2] * vmaxZ + plane[3] < 0)\r\n {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Carbon's GetPixelSizeAccross overload family (cpp:234-307): the pixel\r\n * coverage of a bounding sphere on screen. Dispatch: (center, radius) when\r\n * the second argument is a number; packed vec4 (x, y, z, radius); a\r\n * { center, radius } sphere duck (Carbon's CcpMath::Sphere overload, which\r\n * delegates to GetPixelSizeAccrossEst); or an AABB duck ({ min, max },\r\n * bounding-sphere'd first, 0 when missing).\r\n * @param {Float32Array|Object} sphereOrCenter\r\n * @param {Number} [radius]\r\n * @returns {Number}\r\n */\r\n GetPixelSizeAccross(sphereOrCenter, radius = undefined)\r\n {\r\n if (typeof radius === \"number\")\r\n {\r\n return this.#GetPixelSizeAccrossCenterRadius(sphereOrCenter, radius);\r\n }\r\n\r\n const value = sphereOrCenter;\r\n if (typeof value?.length === \"number\" && value.length >= 4)\r\n {\r\n return this.#GetPixelSizeAccrossCenterRadius(value, value[3]);\r\n }\r\n if (typeof value?.radius === \"number\")\r\n {\r\n // Carbon (cpp:295-298): the Sphere overload calls GetPixelSizeAccrossEst.\r\n return this.#GetPixelSizeAccrossEstCenterRadius(value.center, value.radius);\r\n }\r\n if (value?.min && value?.max)\r\n {\r\n // Carbon (cpp:300-307): Sphere(box) - center of the box, half-diagonal radius.\r\n const min = value.min;\r\n const max = value.max;\r\n TriFrustum.#boxCenterScratch[0] = (min[0] + max[0]) * 0.5;\r\n TriFrustum.#boxCenterScratch[1] = (min[1] + max[1]) * 0.5;\r\n TriFrustum.#boxCenterScratch[2] = (min[2] + max[2]) * 0.5;\r\n const boxRadius = Math.hypot(max[0] - min[0], max[1] - min[1], max[2] - min[2]) * 0.5;\r\n return this.#GetPixelSizeAccrossEstCenterRadius(TriFrustum.#boxCenterScratch, boxRadius);\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Carbon's GetPixelSizeAccrossEst overloads (cpp:239-242, 274-293) - cheaper\r\n * distance-based estimate that properly goes to infinity as the camera\r\n * enters the sphere. Same vec4 / (center, radius) dispatch as\r\n * GetPixelSizeAccross.\r\n * @param {Float32Array} sphereOrCenter\r\n * @param {Number} [radius]\r\n * @returns {Number}\r\n */\r\n GetPixelSizeAccrossEst(sphereOrCenter, radius = undefined)\r\n {\r\n if (typeof radius === \"number\")\r\n {\r\n return this.#GetPixelSizeAccrossEstCenterRadius(sphereOrCenter, radius);\r\n }\r\n return this.#GetPixelSizeAccrossEstCenterRadius(sphereOrCenter, sphereOrCenter[3]);\r\n }\r\n\r\n /**\r\n * Carbon TriFrustum::GetPixelSizeAccross(center, radius) (cpp:245-272).\r\n * @param {Float32Array} center\r\n * @param {Number} radius\r\n * @returns {Number}\r\n */\r\n #GetPixelSizeAccrossCenterRadius(center, radius)\r\n {\r\n // Carbon: Vector3 d(center - m_viewPos); d = -d; => d = viewPos - center.\r\n const dx = this.viewPos[0] - center[0];\r\n const dy = this.viewPos[1] - center[1];\r\n const dz = this.viewPos[2] - center[2];\r\n\r\n if (dx * dx + dy * dy + dz * dz < radius * radius)\r\n {\r\n return FLOAT_MAX;\r\n }\r\n\r\n let depth = this.viewDir[0] * dx + this.viewDir[1] * dy + this.viewDir[2] * dz;\r\n // clamp values close to zero and below\r\n const epsilon = 1e-5;\r\n if (depth < epsilon)\r\n {\r\n depth = epsilon;\r\n }\r\n\r\n if (radius < epsilon)\r\n {\r\n return 0;\r\n }\r\n\r\n return (radius / depth) * this.halfWidthProjection * 2;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustum::GetPixelSizeAccrossEst(center, radius) (cpp:274-293).\r\n * @param {Float32Array} center\r\n * @param {Number} radius\r\n * @returns {Number}\r\n */\r\n #GetPixelSizeAccrossEstCenterRadius(center, radius)\r\n {\r\n if (radius <= 0)\r\n {\r\n return 0;\r\n }\r\n\r\n const dx = center[0] - this.viewPos[0];\r\n const dy = center[1] - this.viewPos[1];\r\n const dz = center[2] - this.viewPos[2];\r\n const lengthSqrd = dx * dx + dy * dy + dz * dz;\r\n const radiusSqrd = radius * radius;\r\n if (lengthSqrd < radiusSqrd)\r\n {\r\n // The camera is inside the object, it essentially has infinite screen size.\r\n return FLOAT_MAX;\r\n }\r\n\r\n // adjusted distance based on the visible part of the sphere\r\n const distance = Math.sqrt(lengthSqrd - radiusSqrd);\r\n return (radius / distance) * this.halfWidthProjection * 2;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustum::CacheTransformationData (cpp:309-325, private) - stores\r\n * the view/projection data needed for pixel-diameter extraction, then\r\n * DeconstructProjectionMatrix (MatrixUtils.cpp:28-42) recovers aspect, fov\r\n * and the clip planes from the projection matrix.\r\n * @param {Float32Array} view\r\n * @param {Float32Array} viewPos\r\n * @param {Float32Array} projection\r\n * @param {Object} viewport\r\n */\r\n #CacheTransformationData(view, viewPos, projection, viewport)\r\n {\r\n mat4.copy(this.projectionMatrix, projection);\r\n vec3.copy(this.viewPos, viewPos);\r\n\r\n // m_viewDir = view->_13/_23/_33 (flat 2/6/10) - third column of the\r\n // row-vector view matrix; single-matrix data, no composition involved.\r\n this.viewDir[0] = view[2];\r\n this.viewDir[1] = view[6];\r\n this.viewDir[2] = view[10];\r\n\r\n // m_halfWidthProjection = projection->_11 (flat 0) * viewport.width * 0.5\r\n this.halfWidthProjection = projection[0] * viewport.width * 0.5;\r\n\r\n // DeconstructProjectionMatrix: asp = _22/_11, fov = 2*atan(1/_22),\r\n // frontClip = _43/_33, backClip = frontClip*_33/(_33+1).\r\n this.aspectRatio = projection[0] ? projection[5] / projection[0] : 0;\r\n this.fov = projection[5] ? 2 * Math.atan(1 / projection[5]) : 0;\r\n this.zNear = projection[10] ? projection[14] / projection[10] : 0;\r\n this.zFar = this.zNear * projection[10] / (projection[10] + 1);\r\n }\r\n\r\n /** Carbon TriFrustum plane-index enum (TriFrustum.h:19-28). */\r\n static PLANE_FRONT = 0;\r\n\r\n static PLANE_LEFT = 1;\r\n\r\n static PLANE_TOP = 2;\r\n\r\n static PLANE_RIGHT = 3;\r\n\r\n static PLANE_BOTTOM = 4;\r\n\r\n static PLANE_BACK = 5;\r\n\r\n static PLANE_COUNT = 6;\r\n\r\n /** g_frustumCullingDisabled (TRI_REGISTER_SETTING \"frustumCullingDisabled\",\r\n * cpp:9-10) - debug escape hatch that forces every sphere test to pass. */\r\n static frustumCullingDisabled = false;\r\n\r\n static #boxCenterScratch = vec3.create();\r\n}\r\n"],"names":["FLOAT_MAX","DERIVE_SCRATCH","mat4","create","PlaneDotCoord","plane","point","PlaneDotNormal","v","TriFrustum","planes","vec4","projectionMatrix","viewPos","vec3","viewDir","halfWidthProjection","zNear","zFar","aspectRatio","fov","DeriveFrustum","view","projection","viewport","multiply","ExtractFrustum","proj","set","PLANE_FRONT","PLANE_LEFT","PLANE_TOP","PLANE_RIGHT","PLANE_BOTTOM","PLANE_BACK","i","PLANE_COUNT","scale","Math","hypot","IsSphereVisible","sphereOrCenter","radiusOrCullBackPlane","cullBackPlane","radius","cullBack","frustumCullingDisabled","planeCount","SphereTest","sphere","packed","length","center","result","TriFrustumTestResult","Inside","d","Outside","Intersect","IsPointVisible","IsBoxVisible","boundsMinOrBox","boundsMax","min","max","box","vmaxX","vmaxY","vmaxZ","GetPixelSizeAccross","undefined","value","boxRadius","GetPixelSizeAccrossEst","#GetPixelSizeAccrossCenterRadius","dx","dy","dz","depth","epsilon","#GetPixelSizeAccrossEstCenterRadius","lengthSqrd","radiusSqrd","distance","sqrt","#CacheTransformationData","copy","width","atan"],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ import { mat4 } from '@carbonenginejs/core-math/mat4';
2
+ import { vec3 } from '@carbonenginejs/core-math/vec3';
3
+ import { TriFrustumTestResult } from '../generated/trinityCore/enums.js';
4
+
5
+ // Source: E:\carbonengine\trinity\trinity\TriFrustumOrtho.h
6
+ // Source: E:\carbonengine\trinity\trinity\TriFrustumOrtho.cpp
7
+ //
8
+ // Native CPU helper (not Blue-exposed in Carbon), plain class like TriFrustum.
9
+ // The orthographic frustum is a view-space AABB: DeriveFrustum captures the
10
+ // (shadow) view matrix and the bounds, and every test transforms the query
11
+ // center into view space with a single-matrix TransformCoord (which is
12
+ // vec3.transformMat4 on the shared byte layout - no composition, no operand
13
+ // order to swap).
14
+ const CENTER_SCRATCH = vec3.create();
15
+
16
+ /**
17
+ * Carbon TriFrustumOrtho (TriFrustumOrtho.h:9-27): orthographic shadow frustum
18
+ * as view matrix + view-space bounds.
19
+ */
20
+ class TriFrustumOrtho {
21
+ /** m_view - identity until DeriveFrustum. */
22
+ view = mat4.create();
23
+
24
+ /** m_boundsMin (view space) */
25
+ boundsMin = vec3.create();
26
+
27
+ /** m_boundsMax (view space) */
28
+ boundsMax = vec3.create();
29
+ #eyePos = vec3.create();
30
+
31
+ /**
32
+ * Carbon TriFrustumOrtho::DeriveFrustum (cpp:13-18) - copies the view matrix
33
+ * and view-space bounds.
34
+ * @param {Float32Array} view
35
+ * @param {Float32Array} minBounds
36
+ * @param {Float32Array} maxBounds
37
+ */
38
+ DeriveFrustum(view, minBounds, maxBounds) {
39
+ mat4.copy(this.view, view);
40
+ vec3.copy(this.boundsMin, minBounds);
41
+ vec3.copy(this.boundsMax, maxBounds);
42
+ }
43
+
44
+ /**
45
+ * Carbon's two IsSphereVisibleAndInsideNearPlane overloads (cpp:20-61),
46
+ * dispatched on the second argument like TriFrustum.IsSphereVisible: sphere
47
+ * fully beyond the far bound (z - radius > boundsMax.z) is rejected, then a
48
+ * squared-distance sphere-vs-AABB test in view space.
49
+ * @param {Float32Array} sphereOrCenter - packed (x, y, z, radius) or center
50
+ * @param {Number} [radius]
51
+ * @returns {Boolean}
52
+ */
53
+ IsSphereVisibleAndInsideNearPlane(sphereOrCenter, radius = undefined) {
54
+ const r = typeof radius === "number" ? radius : sphereOrCenter[3];
55
+ const center = vec3.transformMat4(CENTER_SCRATCH, sphereOrCenter, this.view);
56
+ if (center[2] - r > this.boundsMax[2]) {
57
+ return false;
58
+ }
59
+ let d = 0;
60
+ for (let i = 0; i < 3; ++i) {
61
+ if (center[i] < this.boundsMin[i]) {
62
+ const a = center[i] - this.boundsMin[i];
63
+ d += a * a;
64
+ } else if (center[i] > this.boundsMax[i]) {
65
+ const a = center[i] - this.boundsMax[i];
66
+ d += a * a;
67
+ }
68
+ }
69
+ return d <= r * r;
70
+ }
71
+
72
+ /**
73
+ * Carbon TriFrustumOrtho::IsSphereVisibleIgnoreFarPlane (cpp:63-93) - same
74
+ * squared-distance test but the +z (far) bound never rejects.
75
+ * @param {Float32Array} sphereOrCenter - packed (x, y, z, radius) or center
76
+ * @param {Number} [radius]
77
+ * @returns {Boolean}
78
+ */
79
+ IsSphereVisibleIgnoreFarPlane(sphereOrCenter, radius = undefined) {
80
+ const r = typeof radius === "number" ? radius : sphereOrCenter[3];
81
+ const center = vec3.transformMat4(CENTER_SCRATCH, sphereOrCenter, this.view);
82
+ let d = 0;
83
+ for (let i = 0; i < 3; ++i) {
84
+ if (center[i] < this.boundsMin[i]) {
85
+ const a = center[i] - this.boundsMin[i];
86
+ d += a * a;
87
+ } else if (i !== 2 && center[i] > this.boundsMax[i]) {
88
+ const a = center[i] - this.boundsMax[i];
89
+ d += a * a;
90
+ }
91
+ }
92
+ return d <= r * r;
93
+ }
94
+
95
+ /**
96
+ * Carbon TriFrustumOrtho::SphereTestIgnoreFarPlane (cpp:95-135), the
97
+ * XMVector lane math ported scalar-wise: Outside when the clamped
98
+ * squared distance (far bound ignored) exceeds radius^2; Inside when the
99
+ * sphere clears every bound by at least the radius (the far-bound lane is
100
+ * substituted with the radius, so it always passes); Intersect otherwise.
101
+ * @param {Object|Float32Array} sphere - { center, radius } or packed vec4
102
+ * @returns {Number} TriFrustumTestResult
103
+ */
104
+ SphereTestIgnoreFarPlane(sphere) {
105
+ const packed = typeof sphere?.length === "number" && sphere.length >= 4;
106
+ const radius = packed ? sphere[3] : sphere.radius;
107
+ const center = vec3.transformMat4(CENTER_SCRATCH, packed ? sphere : sphere.center, this.view);
108
+ const fromMinX = center[0] - this.boundsMin[0];
109
+ const fromMinY = center[1] - this.boundsMin[1];
110
+ const fromMinZ = center[2] - this.boundsMin[2];
111
+ const fromMaxX = this.boundsMax[0] - center[0];
112
+ const fromMaxY = this.boundsMax[1] - center[1];
113
+ const outsideMinX = Math.min(fromMinX, 0);
114
+ const outsideMinY = Math.min(fromMinY, 0);
115
+ const outsideMinZ = Math.min(fromMinZ, 0);
116
+ const outsideMaxX = Math.min(fromMaxX, 0);
117
+ const outsideMaxY = Math.min(fromMaxY, 0);
118
+ // because we are ignoring far plane, zero out the Z component
119
+
120
+ const d = outsideMinX * outsideMinX + outsideMinY * outsideMinY + outsideMinZ * outsideMinZ + outsideMaxX * outsideMaxX + outsideMaxY * outsideMaxY;
121
+ if (d > radius * radius) {
122
+ return TriFrustumTestResult.Outside;
123
+ }
124
+ const inside = fromMinX >= radius && fromMinY >= radius && fromMinZ >= radius && fromMaxX >= radius && fromMaxY >= radius;
125
+ return inside ? TriFrustumTestResult.Inside : TriFrustumTestResult.Intersect;
126
+ }
127
+
128
+ /**
129
+ * Carbon TriFrustumOrtho::GetPixelSize (cpp:137-150) - shadow-map pixel
130
+ * coverage of a packed sphere: diameter over the larger relative frustum
131
+ * extent, scaled by the texture size.
132
+ * @param {Float32Array} sphere - packed (x, y, z, radius)
133
+ * @param {Number} textureSize
134
+ * @returns {Number}
135
+ */
136
+ GetPixelSize(sphere, textureSize) {
137
+ const frustumWidth = this.boundsMax[0] - this.boundsMin[0];
138
+ const frustumHeight = this.boundsMax[1] - this.boundsMin[1];
139
+ const dx = sphere[3] * 2 / frustumWidth;
140
+ const dy = sphere[3] * 2 / frustumHeight;
141
+ return Math.max(dx, dy) * textureSize;
142
+ }
143
+
144
+ /**
145
+ * Carbon TriFrustumOrtho::GetEyePos (cpp:152-155) - the view matrix
146
+ * translation (m_view.GetTranslation(), flat 12..14).
147
+ * @returns {Float32Array}
148
+ */
149
+ GetEyePos() {
150
+ this.#eyePos[0] = this.view[12];
151
+ this.#eyePos[1] = this.view[13];
152
+ this.#eyePos[2] = this.view[14];
153
+ return this.#eyePos;
154
+ }
155
+ }
156
+
157
+ export { TriFrustumOrtho };
158
+ //# sourceMappingURL=TriFrustumOrtho.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriFrustumOrtho.js","sources":["../../../src/trinityCore/TriFrustumOrtho.js"],"sourcesContent":["// Source: E:\\carbonengine\\trinity\\trinity\\TriFrustumOrtho.h\r\n// Source: E:\\carbonengine\\trinity\\trinity\\TriFrustumOrtho.cpp\r\n//\r\n// Native CPU helper (not Blue-exposed in Carbon), plain class like TriFrustum.\r\n// The orthographic frustum is a view-space AABB: DeriveFrustum captures the\r\n// (shadow) view matrix and the bounds, and every test transforms the query\r\n// center into view space with a single-matrix TransformCoord (which is\r\n// vec3.transformMat4 on the shared byte layout - no composition, no operand\r\n// order to swap).\r\nimport { mat4 } from \"@carbonenginejs/core-math/mat4\";\r\nimport { vec3 } from \"@carbonenginejs/core-math/vec3\";\r\nimport { TriFrustumTestResult } from \"../generated/trinityCore/enums.js\";\r\n\r\nconst CENTER_SCRATCH = vec3.create();\r\n\r\n/**\r\n * Carbon TriFrustumOrtho (TriFrustumOrtho.h:9-27): orthographic shadow frustum\r\n * as view matrix + view-space bounds.\r\n */\r\nexport class TriFrustumOrtho\r\n{\r\n /** m_view - identity until DeriveFrustum. */\r\n view = mat4.create();\r\n\r\n /** m_boundsMin (view space) */\r\n boundsMin = vec3.create();\r\n\r\n /** m_boundsMax (view space) */\r\n boundsMax = vec3.create();\r\n\r\n #eyePos = vec3.create();\r\n\r\n /**\r\n * Carbon TriFrustumOrtho::DeriveFrustum (cpp:13-18) - copies the view matrix\r\n * and view-space bounds.\r\n * @param {Float32Array} view\r\n * @param {Float32Array} minBounds\r\n * @param {Float32Array} maxBounds\r\n */\r\n DeriveFrustum(view, minBounds, maxBounds)\r\n {\r\n mat4.copy(this.view, view);\r\n vec3.copy(this.boundsMin, minBounds);\r\n vec3.copy(this.boundsMax, maxBounds);\r\n }\r\n\r\n /**\r\n * Carbon's two IsSphereVisibleAndInsideNearPlane overloads (cpp:20-61),\r\n * dispatched on the second argument like TriFrustum.IsSphereVisible: sphere\r\n * fully beyond the far bound (z - radius > boundsMax.z) is rejected, then a\r\n * squared-distance sphere-vs-AABB test in view space.\r\n * @param {Float32Array} sphereOrCenter - packed (x, y, z, radius) or center\r\n * @param {Number} [radius]\r\n * @returns {Boolean}\r\n */\r\n IsSphereVisibleAndInsideNearPlane(sphereOrCenter, radius = undefined)\r\n {\r\n const r = typeof radius === \"number\" ? radius : sphereOrCenter[3];\r\n const center = vec3.transformMat4(CENTER_SCRATCH, sphereOrCenter, this.view);\r\n\r\n if (center[2] - r > this.boundsMax[2])\r\n {\r\n return false;\r\n }\r\n\r\n let d = 0;\r\n for (let i = 0; i < 3; ++i)\r\n {\r\n if (center[i] < this.boundsMin[i])\r\n {\r\n const a = center[i] - this.boundsMin[i];\r\n d += a * a;\r\n }\r\n else if (center[i] > this.boundsMax[i])\r\n {\r\n const a = center[i] - this.boundsMax[i];\r\n d += a * a;\r\n }\r\n }\r\n\r\n return d <= r * r;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustumOrtho::IsSphereVisibleIgnoreFarPlane (cpp:63-93) - same\r\n * squared-distance test but the +z (far) bound never rejects.\r\n * @param {Float32Array} sphereOrCenter - packed (x, y, z, radius) or center\r\n * @param {Number} [radius]\r\n * @returns {Boolean}\r\n */\r\n IsSphereVisibleIgnoreFarPlane(sphereOrCenter, radius = undefined)\r\n {\r\n const r = typeof radius === \"number\" ? radius : sphereOrCenter[3];\r\n const center = vec3.transformMat4(CENTER_SCRATCH, sphereOrCenter, this.view);\r\n\r\n let d = 0;\r\n for (let i = 0; i < 3; ++i)\r\n {\r\n if (center[i] < this.boundsMin[i])\r\n {\r\n const a = center[i] - this.boundsMin[i];\r\n d += a * a;\r\n }\r\n else if (i !== 2 && center[i] > this.boundsMax[i])\r\n {\r\n const a = center[i] - this.boundsMax[i];\r\n d += a * a;\r\n }\r\n }\r\n\r\n return d <= r * r;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustumOrtho::SphereTestIgnoreFarPlane (cpp:95-135), the\r\n * XMVector lane math ported scalar-wise: Outside when the clamped\r\n * squared distance (far bound ignored) exceeds radius^2; Inside when the\r\n * sphere clears every bound by at least the radius (the far-bound lane is\r\n * substituted with the radius, so it always passes); Intersect otherwise.\r\n * @param {Object|Float32Array} sphere - { center, radius } or packed vec4\r\n * @returns {Number} TriFrustumTestResult\r\n */\r\n SphereTestIgnoreFarPlane(sphere)\r\n {\r\n const packed = typeof sphere?.length === \"number\" && sphere.length >= 4;\r\n const radius = packed ? sphere[3] : sphere.radius;\r\n const center = vec3.transformMat4(CENTER_SCRATCH, packed ? sphere : sphere.center, this.view);\r\n\r\n const fromMinX = center[0] - this.boundsMin[0];\r\n const fromMinY = center[1] - this.boundsMin[1];\r\n const fromMinZ = center[2] - this.boundsMin[2];\r\n const fromMaxX = this.boundsMax[0] - center[0];\r\n const fromMaxY = this.boundsMax[1] - center[1];\r\n\r\n const outsideMinX = Math.min(fromMinX, 0);\r\n const outsideMinY = Math.min(fromMinY, 0);\r\n const outsideMinZ = Math.min(fromMinZ, 0);\r\n const outsideMaxX = Math.min(fromMaxX, 0);\r\n const outsideMaxY = Math.min(fromMaxY, 0);\r\n // because we are ignoring far plane, zero out the Z component\r\n\r\n const d = outsideMinX * outsideMinX + outsideMinY * outsideMinY + outsideMinZ * outsideMinZ +\r\n outsideMaxX * outsideMaxX + outsideMaxY * outsideMaxY;\r\n\r\n if (d > radius * radius)\r\n {\r\n return TriFrustumTestResult.Outside;\r\n }\r\n\r\n const inside = fromMinX >= radius && fromMinY >= radius && fromMinZ >= radius &&\r\n fromMaxX >= radius && fromMaxY >= radius;\r\n return inside ? TriFrustumTestResult.Inside : TriFrustumTestResult.Intersect;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustumOrtho::GetPixelSize (cpp:137-150) - shadow-map pixel\r\n * coverage of a packed sphere: diameter over the larger relative frustum\r\n * extent, scaled by the texture size.\r\n * @param {Float32Array} sphere - packed (x, y, z, radius)\r\n * @param {Number} textureSize\r\n * @returns {Number}\r\n */\r\n GetPixelSize(sphere, textureSize)\r\n {\r\n const frustumWidth = this.boundsMax[0] - this.boundsMin[0];\r\n const frustumHeight = this.boundsMax[1] - this.boundsMin[1];\r\n\r\n const dx = (sphere[3] * 2) / frustumWidth;\r\n const dy = (sphere[3] * 2) / frustumHeight;\r\n\r\n return Math.max(dx, dy) * textureSize;\r\n }\r\n\r\n /**\r\n * Carbon TriFrustumOrtho::GetEyePos (cpp:152-155) - the view matrix\r\n * translation (m_view.GetTranslation(), flat 12..14).\r\n * @returns {Float32Array}\r\n */\r\n GetEyePos()\r\n {\r\n this.#eyePos[0] = this.view[12];\r\n this.#eyePos[1] = this.view[13];\r\n this.#eyePos[2] = this.view[14];\r\n return this.#eyePos;\r\n }\r\n}\r\n"],"names":["CENTER_SCRATCH","vec3","create","TriFrustumOrtho","view","mat4","boundsMin","boundsMax","DeriveFrustum","minBounds","maxBounds","copy","IsSphereVisibleAndInsideNearPlane","sphereOrCenter","radius","undefined","r","center","transformMat4","d","i","a","IsSphereVisibleIgnoreFarPlane","SphereTestIgnoreFarPlane","sphere","packed","length","fromMinX","fromMinY","fromMinZ","fromMaxX","fromMaxY","outsideMinX","Math","min","outsideMinY","outsideMinZ","outsideMaxX","outsideMaxY","TriFrustumTestResult","Outside","inside","Inside","Intersect","GetPixelSize","textureSize","frustumWidth","frustumHeight","dx","dy","max","GetEyePos"],"mappings":"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"}
@@ -25,6 +25,8 @@ export { Tr2VariableStore } from './Tr2VariableStore.js';
25
25
  export { Tr2VisibilityEvent, Tr2VisibilityResults } from './Tr2VisibilityResults.js';
26
26
  export { TriDevice } from './TriDevice.js';
27
27
  export { TriFloat } from './TriFloat.js';
28
+ export { FLOAT_MAX, PlaneDotCoord, PlaneDotNormal, TriFrustum } from './TriFrustum.js';
29
+ export { TriFrustumOrtho } from './TriFrustumOrtho.js';
28
30
  export { SendEventToAudEmitter, TriObserverLocal } from './TriObserverLocal.js';
29
31
  export { TriProjection } from './TriProjection.js';
30
32
  export { TriRect } from './TriRect.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -24,10 +24,10 @@
24
24
  "publishConfig": {
25
25
  "access": "public"
26
26
  },
27
- "version": "0.4.3",
27
+ "version": "0.5.0",
28
28
  "dependencies": {
29
29
  "@carbonenginejs/core-math": "^0.1.5",
30
- "@carbonenginejs/core-types": "^0.12.0",
30
+ "@carbonenginejs/core-types": "^0.13.0",
31
31
  "@carbonenginejs/runtime-const": "^0.1.0"
32
32
  },
33
33
  "type": "module",