@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.
- package/dist/curves/CjsGrannyCurves.js +12 -13
- package/dist/curves/CjsGrannyCurves.js.map +1 -1
- package/dist/eve/EveBannerSet.js +20 -1
- package/dist/eve/EveBannerSet.js.map +1 -1
- package/dist/eve/EveBoosterSet2.js +19 -1
- package/dist/eve/EveBoosterSet2.js.map +1 -1
- package/dist/eve/EveComponentTypes.js +116 -0
- package/dist/eve/EveComponentTypes.js.map +1 -0
- package/dist/eve/EveHazeSet.js +18 -1
- package/dist/eve/EveHazeSet.js.map +1 -1
- package/dist/eve/EvePlaneSet.js +19 -1
- package/dist/eve/EvePlaneSet.js.map +1 -1
- package/dist/eve/EveSpotlightSet.js +18 -1
- package/dist/eve/EveSpotlightSet.js.map +1 -1
- package/dist/eve/EveSpriteLineSet.js +18 -1
- package/dist/eve/EveSpriteLineSet.js.map +1 -1
- package/dist/eve/EveSpriteSet.js +18 -1
- package/dist/eve/EveSpriteSet.js.map +1 -1
- package/dist/eve/EveUpdateContext.js +195 -31
- package/dist/eve/EveUpdateContext.js.map +1 -1
- package/dist/eve/attachment/turrets/EveTurretFiringFX.js +23 -1
- package/dist/eve/attachment/turrets/EveTurretFiringFX.js.map +1 -1
- package/dist/eve/attachment/turrets/EveTurretSet.js +43 -1
- package/dist/eve/attachment/turrets/EveTurretSet.js.map +1 -1
- package/dist/eve/child/EveChildContainer.js +95 -60
- package/dist/eve/child/EveChildContainer.js.map +1 -1
- package/dist/eve/child/EveChildFogVolume.js +14 -1
- package/dist/eve/child/EveChildFogVolume.js.map +1 -1
- package/dist/eve/child/EveChildInstancedMeshes.js +43 -1
- package/dist/eve/child/EveChildInstancedMeshes.js.map +1 -1
- package/dist/eve/child/EveChildLightingOverride.js +14 -1
- package/dist/eve/child/EveChildLightingOverride.js.map +1 -1
- package/dist/eve/child/EveChildMesh.js +121 -80
- package/dist/eve/child/EveChildMesh.js.map +1 -1
- package/dist/eve/child/EveChildTransform.js +27 -17
- package/dist/eve/child/EveChildTransform.js.map +1 -1
- package/dist/eve/index.js +2 -0
- package/dist/eve/index.js.map +1 -1
- package/dist/eve/renderable/stretch/EveFiringEffectElementContainer.js +14 -1
- package/dist/eve/renderable/stretch/EveFiringEffectElementContainer.js.map +1 -1
- package/dist/eve/renderable/stretch/EveStretch.js +11 -1
- package/dist/eve/renderable/stretch/EveStretch.js.map +1 -1
- package/dist/eve/renderable/stretch/EveStretch2.js +14 -1
- package/dist/eve/renderable/stretch/EveStretch2.js.map +1 -1
- package/dist/eve/renderable/stretch/EveStretch3.js +24 -1
- package/dist/eve/renderable/stretch/EveStretch3.js.map +1 -1
- package/dist/eve/scene/EveSpaceScene.js +443 -16
- package/dist/eve/scene/EveSpaceScene.js.map +1 -1
- package/dist/eve/spaceObject/EveEffectRoot2.js +28 -1
- package/dist/eve/spaceObject/EveEffectRoot2.js.map +1 -1
- package/dist/eve/spaceObject/EveMobile.js +25 -1
- package/dist/eve/spaceObject/EveMobile.js.map +1 -1
- package/dist/eve/spaceObject/EveSpaceObject2.js +59 -1
- package/dist/eve/spaceObject/EveSpaceObject2.js.map +1 -1
- package/dist/generated/eve/child/EveChildCloud2.js +88 -5
- package/dist/generated/eve/child/EveChildCloud2.js.map +1 -1
- package/dist/generated/eve/child/EveChildExplosion.js +17 -1
- package/dist/generated/eve/child/EveChildExplosion.js.map +1 -1
- package/dist/generated/eve/child/EveChildInstanceContainer.js +29 -1
- package/dist/generated/eve/child/EveChildInstanceContainer.js.map +1 -1
- package/dist/generated/eve/child/EveChildParticleSystem.js +32 -24
- package/dist/generated/eve/child/EveChildParticleSystem.js.map +1 -1
- package/dist/generated/eve/child/EveChildPlug.js +23 -1
- package/dist/generated/eve/child/EveChildPlug.js.map +1 -1
- package/dist/generated/eve/child/EveChildPostProcessVolume.js +27 -14
- package/dist/generated/eve/child/EveChildPostProcessVolume.js.map +1 -1
- package/dist/generated/eve/child/EveChildRef.js +17 -1
- package/dist/generated/eve/child/EveChildRef.js.map +1 -1
- package/dist/generated/eve/child/EveChildSocket.js +17 -1
- package/dist/generated/eve/child/EveChildSocket.js.map +1 -1
- package/dist/generated/eve/child/behaviors/BehaviorGroup.js +43 -40
- package/dist/generated/eve/child/behaviors/BehaviorGroup.js.map +1 -1
- package/dist/generated/eve/child/procedural/EveChildProceduralContainer.js +53 -49
- package/dist/generated/eve/child/procedural/EveChildProceduralContainer.js.map +1 -1
- package/dist/generated/eve/scene/EveComponentRegistry.js +11 -0
- package/dist/generated/eve/scene/EveComponentRegistry.js.map +1 -1
- package/dist/generated/eve/scene/TriShadowFrustum.js +74 -22
- package/dist/generated/eve/scene/TriShadowFrustum.js.map +1 -1
- package/dist/generated/eve/scene/TriShadowOrthoFrustum.js +128 -26
- package/dist/generated/eve/scene/TriShadowOrthoFrustum.js.map +1 -1
- package/dist/generated/eve/smartLights/EveChildSmartLightSet.js +37 -24
- package/dist/generated/eve/smartLights/EveChildSmartLightSet.js.map +1 -1
- package/dist/generated/eve/smartLights/EveSmartLightPointLight.js +29 -28
- package/dist/generated/eve/smartLights/EveSmartLightPointLight.js.map +1 -1
- package/dist/generated/eve/spaceObject/EveShip2.js +39 -19
- package/dist/generated/eve/spaceObject/EveShip2.js.map +1 -1
- package/dist/generated/eve/spaceObject/swarm/EveSwarm.js +28 -1
- package/dist/generated/eve/spaceObject/swarm/EveSwarm.js.map +1 -1
- package/dist/generated/eve/spaceObject/swarm/EveSwarmRenderable.js +28 -1
- package/dist/generated/eve/spaceObject/swarm/EveSwarmRenderable.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/trinityCore/TriFrustum.js +374 -0
- package/dist/trinityCore/TriFrustum.js.map +1 -0
- package/dist/trinityCore/TriFrustumOrtho.js +158 -0
- package/dist/trinityCore/TriFrustumOrtho.js.map +1 -0
- package/dist/trinityCore/index.js +2 -0
- package/dist/trinityCore/index.js.map +1 -1
- 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.
|
|
27
|
+
"version": "0.5.0",
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@carbonenginejs/core-math": "^0.1.5",
|
|
30
|
-
"@carbonenginejs/core-types": "^0.
|
|
30
|
+
"@carbonenginejs/core-types": "^0.13.0",
|
|
31
31
|
"@carbonenginejs/runtime-const": "^0.1.0"
|
|
32
32
|
},
|
|
33
33
|
"type": "module",
|