@woosh/meep-engine 3.0.0 → 3.0.1

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 (122) hide show
  1. package/editor/particles/rebuildParticleEmitter.js +8 -26
  2. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  3. package/editor/tools/SelectionTool.js +1 -2
  4. package/editor/tools/TransformToolV2.js +2 -3
  5. package/editor/tools/v2/BlenderCameraOrientationGizmo.js +501 -501
  6. package/editor/tools/v2/TransformControls.js +1 -1
  7. package/package.json +95 -96
  8. package/src/core/geom/3d/mat4/m4_look_at.d.ts +25 -0
  9. package/src/core/geom/3d/mat4/m4_look_at.d.ts.map +1 -0
  10. package/src/core/geom/3d/mat4/m4_look_at.js +96 -0
  11. package/src/core/geom/3d/mat4/m4_make_rotation_x.d.ts +18 -0
  12. package/src/core/geom/3d/mat4/m4_make_rotation_x.d.ts.map +1 -0
  13. package/src/core/geom/3d/mat4/m4_make_rotation_x.js +47 -0
  14. package/src/core/geom/3d/mat4/m4_make_rotation_y.d.ts +18 -0
  15. package/src/core/geom/3d/mat4/m4_make_rotation_y.d.ts.map +1 -0
  16. package/src/core/geom/3d/mat4/m4_make_rotation_y.js +47 -0
  17. package/src/core/geom/3d/mat4/m4_make_rotation_z.d.ts +18 -0
  18. package/src/core/geom/3d/mat4/m4_make_rotation_z.d.ts.map +1 -0
  19. package/src/core/geom/3d/mat4/m4_make_rotation_z.js +47 -0
  20. package/src/core/geom/3d/mat4/m4_perspective.d.ts +25 -0
  21. package/src/core/geom/3d/mat4/m4_perspective.d.ts.map +1 -0
  22. package/src/core/geom/3d/mat4/m4_perspective.js +66 -0
  23. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  24. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2045 -2052
  25. package/src/engine/ecs/gui/hud/testHudEdgeStick.js +2 -2
  26. package/src/engine/ecs/terrain/ecs/TerrainSystem.d.ts.map +1 -1
  27. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +14 -27
  28. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.d.ts.map +1 -1
  29. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -126
  30. package/src/engine/graphics/ecs/camera/Camera.d.ts +36 -48
  31. package/src/engine/graphics/ecs/camera/Camera.d.ts.map +1 -1
  32. package/src/engine/graphics/ecs/camera/Camera.js +165 -303
  33. package/src/engine/graphics/ecs/camera/camera_active_frustum.d.ts +14 -0
  34. package/src/engine/graphics/ecs/camera/camera_active_frustum.d.ts.map +1 -0
  35. package/src/engine/graphics/ecs/camera/camera_active_frustum.js +25 -0
  36. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +16 -0
  37. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts.map +1 -0
  38. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -0
  39. package/src/engine/graphics/ecs/camera/camera_traverse_active.d.ts +12 -0
  40. package/src/engine/graphics/ecs/camera/camera_traverse_active.d.ts.map +1 -0
  41. package/src/engine/graphics/ecs/camera/camera_traverse_active.js +18 -0
  42. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +170 -170
  43. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +5 -1
  44. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  45. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +296 -281
  46. package/src/engine/graphics/ecs/render_layers_compute_depth_range.d.ts +1 -1
  47. package/src/engine/graphics/ecs/render_layers_compute_depth_range.js +1 -1
  48. package/src/engine/graphics/geometry/AttributeData.d.ts +52 -0
  49. package/src/engine/graphics/geometry/AttributeData.d.ts.map +1 -0
  50. package/src/engine/graphics/geometry/AttributeData.js +84 -0
  51. package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts +1 -14
  52. package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts.map +1 -1
  53. package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +229 -253
  54. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +25 -12
  55. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  56. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1149 -1194
  57. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +4 -8
  58. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
  59. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +472 -540
  60. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts +19 -90
  61. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts.map +1 -1
  62. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +135 -514
  63. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  64. package/src/engine/graphics3/CameraSystem3.js +10 -1
  65. package/src/engine/graphics3/GraphicsEngine3.d.ts +3 -3
  66. package/src/engine/graphics3/GraphicsEngine3.js +3 -3
  67. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +11 -0
  68. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  69. package/src/engine/graphics3/ParticleEmitterSystem3.js +289 -265
  70. package/src/engine/graphics3/ShadeCameraAdapter.d.ts +3 -3
  71. package/src/engine/graphics3/ShadeCameraAdapter.js +3 -3
  72. package/src/engine/graphics3/camera_sync_from_transform.d.ts +2 -2
  73. package/src/engine/graphics3/camera_sync_from_transform.js +2 -2
  74. package/src/engine/graphics3/shade_camera_projection_ray.js +2 -2
  75. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  76. package/src/shade/renderer/camera/Camera.d.ts +3 -5
  77. package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
  78. package/src/shade/renderer/camera/Camera.js +281 -280
  79. package/src/shade/renderer/camera/GPUCameraContext.js +233 -233
  80. package/src/shade/renderer/loader/usd/parse_usda.js +1 -1
  81. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
  82. package/src/shade/renderer/loader/usd/usd_build_scene.js +658 -652
  83. package/src/shade/renderer/loader/usd/usd_compose_transform.d.ts.map +1 -1
  84. package/src/shade/renderer/loader/usd/usd_compose_transform.js +58 -23
  85. package/src/shade/renderer/particles/prototypeParticleSystem.js +450 -443
  86. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  87. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +7 -3
  88. package/src/view/minimap/dom/MinimapCameraView.d.ts +2 -2
  89. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  90. package/src/engine/graphics/ecs/camera/CameraSystem.d.ts +0 -74
  91. package/src/engine/graphics/ecs/camera/CameraSystem.d.ts.map +0 -1
  92. package/src/engine/graphics/ecs/camera/CameraSystem.js +0 -331
  93. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.d.ts +0 -10
  94. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.d.ts.map +0 -1
  95. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.js +0 -105
  96. package/src/engine/graphics/ecs/camera/build_three_camera_object.d.ts +0 -7
  97. package/src/engine/graphics/ecs/camera/build_three_camera_object.d.ts.map +0 -1
  98. package/src/engine/graphics/ecs/camera/build_three_camera_object.js +0 -29
  99. package/src/engine/graphics/ecs/camera/frustum_from_camera.d.ts +0 -8
  100. package/src/engine/graphics/ecs/camera/frustum_from_camera.d.ts.map +0 -1
  101. package/src/engine/graphics/ecs/camera/frustum_from_camera.js +0 -20
  102. package/src/engine/graphics/ecs/camera/set_camera_aspect_ratio.d.ts +0 -9
  103. package/src/engine/graphics/ecs/camera/set_camera_aspect_ratio.d.ts.map +0 -1
  104. package/src/engine/graphics/ecs/camera/set_camera_aspect_ratio.js +0 -46
  105. package/src/engine/graphics/ecs/camera/unprojectPoint.d.ts +0 -9
  106. package/src/engine/graphics/ecs/camera/unprojectPoint.d.ts.map +0 -1
  107. package/src/engine/graphics/ecs/camera/unprojectPoint.js +0 -14
  108. package/src/engine/graphics/ecs/camera/update_camera_transform.d.ts +0 -6
  109. package/src/engine/graphics/ecs/camera/update_camera_transform.d.ts.map +0 -1
  110. package/src/engine/graphics/ecs/camera/update_camera_transform.js +0 -17
  111. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts +0 -67
  112. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts.map +0 -1
  113. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.js +0 -291
  114. package/src/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.d.ts +0 -11
  115. package/src/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.d.ts.map +0 -1
  116. package/src/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +0 -497
  117. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts +0 -40
  118. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts.map +0 -1
  119. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.js +0 -47
  120. package/src/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.d.ts +0 -7
  121. package/src/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.d.ts.map +0 -1
  122. package/src/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.js +0 -40
@@ -1,281 +1,282 @@
1
- import { assert } from "../../../core/assert.js";
2
- import { combine_hash } from "../../../core/collection/array/combine_hash.js";
3
- import { plane3_normalize } from "../../../core/geom/3d/plane/plane3_normalize.js";
4
- import { v3_dot } from "../../../core/geom/vec3/v3_dot.js";
5
- import { computeHashFloat } from "../../../core/primitives/numbers/computeHashFloat.js";
6
- import { Transform } from "../../../engine/ecs/transform/Transform.js";
7
- import { mat4 } from "gl-matrix";
8
-
9
- let id_counter = 0;
10
-
11
- /**
12
- * ref: Gribb-Hartmann
13
- * Updates frustum planes from a View-Projection matrix.
14
- * Geared for Reverse-Z (WebGPU/DirectX range [0,1]).
15
- * @param {Float32Array} planes
16
- * @param {Float32Array} vp ViewProjection matrix
17
- */
18
- function construct_frustum_planes(planes, vp) {
19
- // Left Plane (w + x)
20
- // Row 3 + Row 0
21
- plane3_normalize(
22
- planes, 0,
23
- vp[3] + vp[0],
24
- vp[7] + vp[4],
25
- vp[11] + vp[8],
26
- vp[15] + vp[12]
27
- );
28
-
29
- // Right Plane (w - x)
30
- // Row 3 - Row 0
31
- plane3_normalize(
32
- planes, 4,
33
- vp[3] - vp[0],
34
- vp[7] - vp[4],
35
- vp[11] - vp[8],
36
- vp[15] - vp[12]
37
- );
38
-
39
- // Bottom Plane (w + y)
40
- // Row 3 + Row 1
41
- plane3_normalize(
42
- planes, 8,
43
- vp[3] + vp[1],
44
- vp[7] + vp[5],
45
- vp[11] + vp[9],
46
- vp[15] + vp[13]
47
- );
48
-
49
- // Top Plane (w - y)
50
- // Row 3 - Row 1
51
- plane3_normalize(
52
- planes, 12,
53
- vp[3] - vp[1],
54
- vp[7] - vp[5],
55
- vp[11] - vp[9],
56
- vp[15] - vp[13]
57
- );
58
-
59
- // Near Plane (Reverse-Z: z <= w -> w - z >= 0)
60
- // Row 3 - Row 2
61
- plane3_normalize(
62
- planes, 16,
63
- vp[3] - vp[2],
64
- vp[7] - vp[6],
65
- vp[11] - vp[10],
66
- vp[15] - vp[14]
67
- );
68
-
69
- // Far Plane (Reverse-Z: z >= 0)
70
- // Row 2 ONLY (Not Row 3 + Row 2)
71
- plane3_normalize(
72
- planes, 20,
73
- vp[2], // x
74
- vp[6], // y
75
- vp[10], // z
76
- vp[14] // w
77
- );
78
- }
79
-
80
- export class Camera {
81
- /**
82
- * @readonly
83
- */
84
- #id = id_counter++;
85
-
86
- transform = new Transform();
87
-
88
- view_matrix = mat4.create();
89
- projection_matrix = mat4.create();
90
- view_projection_matrix = mat4.create();
91
-
92
- /**
93
- * World-space view frustum.
94
- * @type {Float32Array}
95
- */
96
- frustum = new Float32Array(24);
97
-
98
- /**
99
- * Near clipping plane
100
- * @type {number}
101
- */
102
- #near = 0.1;
103
-
104
- /**
105
- * NOTE: For perspective, we use infinite Z projection, so this value only controls culling and not clipping
106
- * @type {number}
107
- */
108
- #far = 2000;
109
-
110
- /**
111
- * Width / Height
112
- * @type {number}
113
- */
114
- #aspect = 1;
115
-
116
- set near(v) {
117
- this.#near = v;
118
- }
119
-
120
- get near() {
121
- return this.#near;
122
- }
123
-
124
- set far(v) {
125
- this.#far = v;
126
- }
127
-
128
- get far() {
129
- return this.#far;
130
- }
131
-
132
- set aspect(v) {
133
- assert.isNumber(v, "aspect");
134
- assert.notNaN(v, "aspect");
135
-
136
- this.#aspect = v;
137
- }
138
-
139
- get aspect() {
140
- return this.#aspect
141
- }
142
-
143
- get isReverseZ() {
144
- return true;
145
- }
146
-
147
- get isInfiniteFar() {
148
- return false;
149
- }
150
-
151
- /**
152
- *
153
- * @param {Camera} other
154
- */
155
- copy(other) {
156
-
157
- this.#near = other.#near;
158
- this.#far = other.#far;
159
-
160
- this.#aspect = other.#aspect;
161
-
162
- this.frustum.set(other.frustum);
163
- this.transform.copy(other.transform);
164
- this.view_matrix.set(other.view_matrix);
165
- this.projection_matrix.set(other.projection_matrix);
166
- this.view_projection_matrix.set(other.view_projection_matrix);
167
- }
168
-
169
- clone() {
170
- const r = new this.constructor();
171
-
172
- r.copy(this);
173
-
174
- assert.ok(r.equals(this), 'implementation of .copy is faulty');
175
-
176
- return r;
177
- }
178
-
179
- get id() {
180
- return this.#id
181
- }
182
-
183
- hash() {
184
- return combine_hash(
185
- computeHashFloat(this.#near),
186
- computeHashFloat(this.#far),
187
- computeHashFloat(this.#aspect),
188
- );
189
- }
190
-
191
- /**
192
- *
193
- * @param {Camera} other
194
- */
195
- equals(other) {
196
- return this.near === other.near
197
- && this.far === other.far
198
- && this.aspect === other.aspect
199
- && this.transform.equals(other.transform)
200
- ;
201
- }
202
-
203
- update_matrices() {
204
-
205
- this.update_projection();
206
-
207
- this.update_view_matrix();
208
- }
209
-
210
- update_projection() {
211
-
212
- }
213
-
214
- update_view_matrix() {
215
- // Direct access to the Float32Array buffer
216
- const m = this.transform.matrix;
217
- const out = this.view_matrix;
218
-
219
- // 1. Extract Camera Position
220
- const px = m[12];
221
- const py = m[13];
222
- const pz = m[14];
223
-
224
- // 2. Extract Basis Vectors from World Matrix
225
- // Column 0 = Right (X)
226
- const rx = m[0];
227
- const ry = m[1];
228
- const rz = m[2];
229
-
230
- // Column 1 = Up (Y)
231
- const ux = m[4];
232
- const uy = m[5];
233
- const uz = m[6];
234
-
235
- // Column 2 = Forward (Z)
236
- const fx = m[8];
237
- const fy = m[9];
238
- const fz = m[10];
239
-
240
- // 3. Construct View Matrix (Inverse Rotation * Negative Translation)
241
- // rotating around UP (Y) axis 180 degrees
242
- out[0] = -rx;
243
- out[4] = -ry;
244
- out[8] = -rz;
245
-
246
- out[1] = ux;
247
- out[5] = uy;
248
- out[9] = uz;
249
-
250
- out[2] = -fx;
251
- out[6] = -fy;
252
- out[10] = -fz;
253
-
254
- // Row 3: Translation
255
- out[12] = v3_dot(px, py, pz, rx, ry, rz);
256
- out[13] = -v3_dot(px, py, pz, ux, uy, uz);
257
- out[14] = v3_dot(px, py, pz, fx, fy, fz);
258
-
259
- // Homogeneous Identity
260
- out[3] = 0;
261
- out[7] = 0;
262
- out[11] = 0;
263
- out[15] = 1;
264
- }
265
-
266
- update_frustum() {
267
-
268
- construct_frustum_planes(this.frustum, this.view_projection_matrix);
269
-
270
- }
271
-
272
- update() {
273
-
274
- this.update_matrices();
275
-
276
- mat4.multiply(this.view_projection_matrix, this.projection_matrix, this.view_matrix);
277
-
278
- this.update_frustum();
279
-
280
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import { combine_hash } from "../../../core/collection/array/combine_hash.js";
3
+ import { m4_allocate } from "../../../core/geom/3d/mat4/m4_allocate.js";
4
+ import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
5
+ import { plane3_normalize } from "../../../core/geom/3d/plane/plane3_normalize.js";
6
+ import { v3_dot } from "../../../core/geom/vec3/v3_dot.js";
7
+ import { computeHashFloat } from "../../../core/primitives/numbers/computeHashFloat.js";
8
+ import { Transform } from "../../../engine/ecs/transform/Transform.js";
9
+
10
+ let id_counter = 0;
11
+
12
+ /**
13
+ * ref: Gribb-Hartmann
14
+ * Updates frustum planes from a View-Projection matrix.
15
+ * Geared for Reverse-Z (WebGPU/DirectX range [0,1]).
16
+ * @param {Float32Array} planes
17
+ * @param {Float32Array} vp ViewProjection matrix
18
+ */
19
+ function construct_frustum_planes(planes, vp) {
20
+ // Left Plane (w + x)
21
+ // Row 3 + Row 0
22
+ plane3_normalize(
23
+ planes, 0,
24
+ vp[3] + vp[0],
25
+ vp[7] + vp[4],
26
+ vp[11] + vp[8],
27
+ vp[15] + vp[12]
28
+ );
29
+
30
+ // Right Plane (w - x)
31
+ // Row 3 - Row 0
32
+ plane3_normalize(
33
+ planes, 4,
34
+ vp[3] - vp[0],
35
+ vp[7] - vp[4],
36
+ vp[11] - vp[8],
37
+ vp[15] - vp[12]
38
+ );
39
+
40
+ // Bottom Plane (w + y)
41
+ // Row 3 + Row 1
42
+ plane3_normalize(
43
+ planes, 8,
44
+ vp[3] + vp[1],
45
+ vp[7] + vp[5],
46
+ vp[11] + vp[9],
47
+ vp[15] + vp[13]
48
+ );
49
+
50
+ // Top Plane (w - y)
51
+ // Row 3 - Row 1
52
+ plane3_normalize(
53
+ planes, 12,
54
+ vp[3] - vp[1],
55
+ vp[7] - vp[5],
56
+ vp[11] - vp[9],
57
+ vp[15] - vp[13]
58
+ );
59
+
60
+ // Near Plane (Reverse-Z: z <= w -> w - z >= 0)
61
+ // Row 3 - Row 2
62
+ plane3_normalize(
63
+ planes, 16,
64
+ vp[3] - vp[2],
65
+ vp[7] - vp[6],
66
+ vp[11] - vp[10],
67
+ vp[15] - vp[14]
68
+ );
69
+
70
+ // Far Plane (Reverse-Z: z >= 0)
71
+ // Row 2 ONLY (Not Row 3 + Row 2)
72
+ plane3_normalize(
73
+ planes, 20,
74
+ vp[2], // x
75
+ vp[6], // y
76
+ vp[10], // z
77
+ vp[14] // w
78
+ );
79
+ }
80
+
81
+ export class Camera {
82
+ /**
83
+ * @readonly
84
+ */
85
+ #id = id_counter++;
86
+
87
+ transform = new Transform();
88
+
89
+ view_matrix = m4_allocate();
90
+ projection_matrix = m4_allocate();
91
+ view_projection_matrix = m4_allocate();
92
+
93
+ /**
94
+ * World-space view frustum.
95
+ * @type {Float32Array}
96
+ */
97
+ frustum = new Float32Array(24);
98
+
99
+ /**
100
+ * Near clipping plane
101
+ * @type {number}
102
+ */
103
+ #near = 0.1;
104
+
105
+ /**
106
+ * NOTE: For perspective, we use infinite Z projection, so this value only controls culling and not clipping
107
+ * @type {number}
108
+ */
109
+ #far = 2000;
110
+
111
+ /**
112
+ * Width / Height
113
+ * @type {number}
114
+ */
115
+ #aspect = 1;
116
+
117
+ set near(v) {
118
+ this.#near = v;
119
+ }
120
+
121
+ get near() {
122
+ return this.#near;
123
+ }
124
+
125
+ set far(v) {
126
+ this.#far = v;
127
+ }
128
+
129
+ get far() {
130
+ return this.#far;
131
+ }
132
+
133
+ set aspect(v) {
134
+ assert.isNumber(v, "aspect");
135
+ assert.notNaN(v, "aspect");
136
+
137
+ this.#aspect = v;
138
+ }
139
+
140
+ get aspect() {
141
+ return this.#aspect
142
+ }
143
+
144
+ get isReverseZ() {
145
+ return true;
146
+ }
147
+
148
+ get isInfiniteFar() {
149
+ return false;
150
+ }
151
+
152
+ /**
153
+ *
154
+ * @param {Camera} other
155
+ */
156
+ copy(other) {
157
+
158
+ this.#near = other.#near;
159
+ this.#far = other.#far;
160
+
161
+ this.#aspect = other.#aspect;
162
+
163
+ this.frustum.set(other.frustum);
164
+ this.transform.copy(other.transform);
165
+ this.view_matrix.set(other.view_matrix);
166
+ this.projection_matrix.set(other.projection_matrix);
167
+ this.view_projection_matrix.set(other.view_projection_matrix);
168
+ }
169
+
170
+ clone() {
171
+ const r = new this.constructor();
172
+
173
+ r.copy(this);
174
+
175
+ assert.ok(r.equals(this), 'implementation of .copy is faulty');
176
+
177
+ return r;
178
+ }
179
+
180
+ get id() {
181
+ return this.#id
182
+ }
183
+
184
+ hash() {
185
+ return combine_hash(
186
+ computeHashFloat(this.#near),
187
+ computeHashFloat(this.#far),
188
+ computeHashFloat(this.#aspect),
189
+ );
190
+ }
191
+
192
+ /**
193
+ *
194
+ * @param {Camera} other
195
+ */
196
+ equals(other) {
197
+ return this.near === other.near
198
+ && this.far === other.far
199
+ && this.aspect === other.aspect
200
+ && this.transform.equals(other.transform)
201
+ ;
202
+ }
203
+
204
+ update_matrices() {
205
+
206
+ this.update_projection();
207
+
208
+ this.update_view_matrix();
209
+ }
210
+
211
+ update_projection() {
212
+
213
+ }
214
+
215
+ update_view_matrix() {
216
+ // Direct access to the Float32Array buffer
217
+ const m = this.transform.matrix;
218
+ const out = this.view_matrix;
219
+
220
+ // 1. Extract Camera Position
221
+ const px = m[12];
222
+ const py = m[13];
223
+ const pz = m[14];
224
+
225
+ // 2. Extract Basis Vectors from World Matrix
226
+ // Column 0 = Right (X)
227
+ const rx = m[0];
228
+ const ry = m[1];
229
+ const rz = m[2];
230
+
231
+ // Column 1 = Up (Y)
232
+ const ux = m[4];
233
+ const uy = m[5];
234
+ const uz = m[6];
235
+
236
+ // Column 2 = Forward (Z)
237
+ const fx = m[8];
238
+ const fy = m[9];
239
+ const fz = m[10];
240
+
241
+ // 3. Construct View Matrix (Inverse Rotation * Negative Translation)
242
+ // rotating around UP (Y) axis 180 degrees
243
+ out[0] = -rx;
244
+ out[4] = -ry;
245
+ out[8] = -rz;
246
+
247
+ out[1] = ux;
248
+ out[5] = uy;
249
+ out[9] = uz;
250
+
251
+ out[2] = -fx;
252
+ out[6] = -fy;
253
+ out[10] = -fz;
254
+
255
+ // Row 3: Translation
256
+ out[12] = v3_dot(px, py, pz, rx, ry, rz);
257
+ out[13] = -v3_dot(px, py, pz, ux, uy, uz);
258
+ out[14] = v3_dot(px, py, pz, fx, fy, fz);
259
+
260
+ // Homogeneous Identity
261
+ out[3] = 0;
262
+ out[7] = 0;
263
+ out[11] = 0;
264
+ out[15] = 1;
265
+ }
266
+
267
+ update_frustum() {
268
+
269
+ construct_frustum_planes(this.frustum, this.view_projection_matrix);
270
+
271
+ }
272
+
273
+ update() {
274
+
275
+ this.update_matrices();
276
+
277
+ m4_multiply(this.view_projection_matrix, this.projection_matrix, this.view_matrix);
278
+
279
+ this.update_frustum();
280
+
281
+ }
281
282
  }