@woosh/meep-engine 2.39.35 → 2.39.38

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 (78) hide show
  1. package/LICENSE +13 -0
  2. package/core/assert.js +14 -5
  3. package/core/bvh2/aabb3/AABB3.js +2 -2
  4. package/core/bvh2/aabb3/aabb3_detailed_volume_intersection.js +3 -2
  5. package/core/bvh2/aabb3/aabb3_intersects_frustum_array.js +2 -2
  6. package/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +7 -0
  7. package/core/bvh2/bvh3/bvh_query_user_data_overlaps_frustum.js +12 -11
  8. package/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +149 -6
  9. package/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.spec.js +41 -0
  10. package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +2 -2
  11. package/core/bvh2/traversal/__process_point_if_within_planes.js +2 -2
  12. package/core/bvh2/traversal/aabb3_detailed_volume_intersection_callback_based.js +3 -0
  13. package/core/collection/array/computeHashArray.d.ts +1 -0
  14. package/core/collection/array/computeHashIntegerArray.d.ts +1 -0
  15. package/core/collection/array/computeHashIntegerArray.js +4 -9
  16. package/core/geom/3d/aabb/aabb3_computeDistanceAbovePlane_max.spec.js +8 -0
  17. package/core/geom/3d/aabb/{aabb3_computeDistanceAbovePlane.js → aabb3_compute_distance_above_plane_max.js} +3 -2
  18. package/core/geom/3d/aabb/computeAABB3PlaneSide.js +3 -3
  19. package/core/geom/3d/frustum/frustum3_computeNearestPointToPoint.js +3 -2
  20. package/core/geom/3d/plane/is_point_within_planes.js +2 -2
  21. package/core/geom/3d/plane/plane3_projectPoint.js +2 -2
  22. package/core/geom/3d/plane/plane3_projectPoint.spec.js +54 -0
  23. package/core/geom/Plane.js +0 -19
  24. package/core/geom/v3_distance_above_plane.js +20 -0
  25. package/core/geom/v3_distance_above_plane.spec.js +40 -0
  26. package/core/math/statistics/halton_sequence.js +26 -0
  27. package/core/primitives/array/computeIntegerArrayHash.js +1 -1
  28. package/engine/asset/loaders/ArrayBufferLoader.js +76 -16
  29. package/engine/ecs/EntityComponentDataset.js +18 -28
  30. package/engine/graphics/GraphicsEngine.d.ts +2 -2
  31. package/engine/graphics/GraphicsEngine.js +11 -15
  32. package/engine/graphics/composit/LayerCompositer.js +1 -0
  33. package/engine/graphics/ecs/animation/animator/AnimationGraphSystem.js +5 -0
  34. package/engine/graphics/ecs/animation/animator/graph/AnimationGraph.js +8 -2
  35. package/engine/graphics/ecs/camera/Camera.js +2 -2
  36. package/engine/graphics/ecs/camera/CameraSystem.js +6 -0
  37. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +1 -1
  38. package/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +17 -20
  39. package/engine/graphics/filter/FlipArrayInPlace.js +11 -6
  40. package/engine/graphics/geometry/clipping/ClippedGeometry.js +4 -4
  41. package/engine/graphics/micron/prototypeVirtualGeometry.js +3 -1
  42. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +2 -0
  43. package/engine/graphics/render/buffer/simple-fx/taa/TemporalSupersamplingRenderPlugin.js +95 -0
  44. package/engine/graphics/render/buffer/simple-fx/taa/prototypeTAA.js +61 -0
  45. package/engine/graphics/render/forward_plus/LightManager.js +4 -4
  46. package/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +6 -7
  47. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +6 -2
  48. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_objects.js +4 -2
  49. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +4 -2
  50. package/engine/graphics/render/frame_graph/GraphNode.js +22 -0
  51. package/engine/graphics/render/frame_graph/RenderGraph.js +405 -0
  52. package/engine/graphics/render/frame_graph/RenderGraphBuilder.js +77 -0
  53. package/engine/graphics/render/frame_graph/RenderPass.js +30 -12
  54. package/engine/graphics/render/frame_graph/RenderPassNode.js +103 -0
  55. package/engine/graphics/render/frame_graph/RenderPassResources.js +54 -4
  56. package/engine/graphics/render/frame_graph/ResourceEntry.js +77 -0
  57. package/engine/graphics/render/frame_graph/ResourceNode.js +23 -0
  58. package/engine/graphics/render/frame_graph/TextureDescriptor.js +38 -4
  59. package/engine/graphics/render/frame_graph/sample/deferred/GBufferDrawPass.js +11 -5
  60. package/engine/graphics/render/frame_graph/sample/deferred/LightingPass.js +24 -0
  61. package/engine/graphics/render/frame_graph/sample/deferred/run.js +31 -0
  62. package/engine/graphics/render/frame_graph/sample/meep-v1/ColorDepthPass.js +38 -0
  63. package/engine/graphics/render/frame_graph/sample/meep-v1/OutlinePass.js +9 -0
  64. package/engine/graphics/render/frame_graph/sample/meep-v1/SSAOPass.js +5 -0
  65. package/engine/graphics/render/frame_graph/sample/meep-v1/render.js +7 -0
  66. package/engine/graphics/render/frame_graph/webgl/WebGLRenderContext.js +5 -0
  67. package/engine/graphics/render/layers/RenderLayerUtils.js +5 -3
  68. package/engine/graphics/render/view/CameraView.js +38 -0
  69. package/engine/knowledge/database/DATABASE_SERIALIZATION_IGNORE_PROPERTY.js +1 -0
  70. package/engine/knowledge/database/StaticKnowledgeDataTable.js +28 -5
  71. package/engine/plugin/EnginePluginManager.js +1 -2
  72. package/package.json +1 -1
  73. package/core/geom/Plane.spec.js +0 -12
  74. package/engine/graphics/render/frame_graph/FrameGraphBuilder.js +0 -36
  75. package/engine/graphics/render/frame_graph/Resource.js +0 -21
  76. package/engine/graphics/render/frame_graph/ResourceReference.js +0 -14
  77. package/engine/graphics/render/frame_graph/UsageModeType.js +0 -5
  78. package/engine/graphics/render/frame_graph/sample/deferred/PresentPass.js +0 -17
@@ -6,6 +6,8 @@ import { read_frustum_planes_to_array } from "../../../../core/geom/3d/frustum/r
6
6
  import Signal from "../../../../core/events/signal/Signal.js";
7
7
  import { compare_three_objects } from "../../three/compare_three_objects.js";
8
8
  import { frustum_from_camera } from "../../ecs/camera/frustum_from_camera.js";
9
+ import { array_copy } from "../../../../core/collection/array/copyArray.js";
10
+ import { array_remove_first } from "../../../../core/collection/array/array_remove_first.js";
9
11
 
10
12
  const DEFAULT_FLAGS = CameraViewFlags.Active
11
13
  | CameraViewFlags.AdaptivePlaneNear
@@ -13,6 +15,8 @@ const DEFAULT_FLAGS = CameraViewFlags.Active
13
15
 
14
16
  const scratch_frustum = new Frustum();
15
17
 
18
+ const scratch_mat4 = new Float32Array(16);
19
+
16
20
  export class CameraView {
17
21
  constructor() {
18
22
 
@@ -66,6 +70,20 @@ export class CameraView {
66
70
  postVisibilityBuild: new Signal(),
67
71
  preRender: new Signal()
68
72
  };
73
+
74
+ /**
75
+ *
76
+ * @type {{transform:(Float32Array, Float32Array)=>void, context:*}[]}
77
+ */
78
+ this.projection_modifiers = [];
79
+ }
80
+
81
+ addProjectionModifier(mod) {
82
+ this.projection_modifiers.push(mod);
83
+ }
84
+
85
+ removeProjectionModifier(mod) {
86
+ return array_remove_first(this.projection_modifiers, mod);
69
87
  }
70
88
 
71
89
  /**
@@ -83,6 +101,26 @@ export class CameraView {
83
101
 
84
102
  // read projection matrix
85
103
  // TODO
104
+
105
+ array_copy(camera.projectionMatrix.elements, 0, this.projection_matrix, 0, 16);
106
+ let ts = this.projection_matrix;
107
+ let td = scratch_mat4;
108
+ for (let i = 0; i < this.projection_modifiers.length; i++) {
109
+ const modifier = this.projection_modifiers[i];
110
+
111
+ modifier.transform.call(modifier.context, ts, td);
112
+
113
+ const swap = ts;
114
+
115
+ ts = td;
116
+ td = swap;
117
+ }
118
+
119
+ if (ts !== this.projection_matrix) {
120
+ array_copy(ts, 0, this.projection_matrix, 0, 16);
121
+ }
122
+
123
+ array_copy(this.projection_matrix, 0, this.__camera.projectionMatrix.elements, 0, 16);
86
124
  }
87
125
 
88
126
  /**
@@ -0,0 +1 @@
1
+ export const DATABASE_SERIALIZATION_IGNORE_PROPERTY = '@ignore';
@@ -3,6 +3,7 @@ import { countTask } from "../../../core/process/task/TaskUtils.js";
3
3
  import Task from "../../../core/process/task/Task.js";
4
4
  import { assert } from "../../../core/assert.js";
5
5
  import { TaskSignal } from "../../../core/process/task/TaskSignal.js";
6
+ import { DATABASE_SERIALIZATION_IGNORE_PROPERTY } from "./DATABASE_SERIALIZATION_IGNORE_PROPERTY.js";
6
7
 
7
8
  let id_seed = 0;
8
9
 
@@ -64,6 +65,13 @@ export class StaticKnowledgeDataTable {
64
65
  */
65
66
  __automatic_ids = false;
66
67
 
68
+ /**
69
+ *
70
+ * @type {string}
71
+ * @protected
72
+ */
73
+ __element_type_name = 'element';
74
+
67
75
  reset() {
68
76
  Object.keys(this.elements).forEach(id => {
69
77
  delete this.elements[id];
@@ -134,7 +142,7 @@ export class StaticKnowledgeDataTable {
134
142
  const element = this.get(id);
135
143
 
136
144
  if (element === null) {
137
- throw new Error(`Failed to get element '${id}' from the database'`);
145
+ throw new Error(`Failed to get ${this.__element_type_name} '${id}' from the database'`);
138
146
  }
139
147
 
140
148
  result.push(element);
@@ -248,6 +256,17 @@ export class StaticKnowledgeDataTable {
248
256
 
249
257
  }
250
258
 
259
+ const flag_ignore = datum[DATABASE_SERIALIZATION_IGNORE_PROPERTY];
260
+ if (flag_ignore !== undefined) {
261
+ if (typeof flag_ignore !== "boolean") {
262
+ console.warn(`${DATABASE_SERIALIZATION_IGNORE_PROPERTY} flag is present on ${this.__element_type_name} '${id}'. ${DATABASE_SERIALIZATION_IGNORE_PROPERTY} must be a boolean (true/false), instead was '${typeof flag_ignore}'(=${flag_ignore})`);
263
+ } else if (flag_ignore) {
264
+ console.warn(`[${this.__element_type_name}:${id}] ${DATABASE_SERIALIZATION_IGNORE_PROPERTY} flag is set to true, skipping`);
265
+ } else {
266
+ console.warn(`[${this.__element_type_name}:${id}] ${DATABASE_SERIALIZATION_IGNORE_PROPERTY} flag is set to false and has no effect, please remove this field from JSON`);
267
+ }
268
+ }
269
+
251
270
  let element;
252
271
 
253
272
  try {
@@ -262,7 +281,7 @@ export class StaticKnowledgeDataTable {
262
281
  _id = 'ERROR';
263
282
  }
264
283
 
265
- console.error(`Failed to parse element (id=${_id})`, e, datum);
284
+ console.error(`Failed to parse ${this.__element_type_name} (id=${_id})`, e, datum);
266
285
  return;
267
286
  }
268
287
 
@@ -291,7 +310,7 @@ export class StaticKnowledgeDataTable {
291
310
  const added = this.add(element);
292
311
 
293
312
  if (!added) {
294
- console.error(`Failed to add element '${id}', most likely this a duplicate key`);
313
+ console.error(`Failed to add ${this.__element_type_name} '${id}', most likely this a duplicate key`);
295
314
  }
296
315
  });
297
316
 
@@ -344,10 +363,14 @@ export class StaticKnowledgeDataTable {
344
363
  try {
345
364
  promise = this.linkOne(element, json, database, assetManager);
346
365
  } catch (e) {
347
- console.error(`.linkOne(#id=${id}) threw unexpectedly:`, e);
366
+ const wrap = new Error(`.linkOne(#id=${id}) threw unexpectedly: ${e.message}`);
367
+
368
+ if (e.stack !== undefined) {
369
+ wrap.stack = e.stack;
370
+ }
348
371
 
349
372
  //re-throw to fail
350
- throw e;
373
+ throw wrap;
351
374
  }
352
375
 
353
376
  if (promise === undefined) {
@@ -153,7 +153,6 @@ export class EnginePluginManager extends BaseProcess {
153
153
  const removed = this.__plugins.delete(PluginClass);
154
154
 
155
155
  if (!removed) {
156
- console.error('Plugin was not found', PluginClass);
157
156
  return;
158
157
  }
159
158
 
@@ -259,7 +258,7 @@ export class EnginePluginManager extends BaseProcess {
259
258
 
260
259
  const engine = this.engine;
261
260
 
262
- await ctx.transition(manager_state_value,engine);
261
+ await ctx.transition(manager_state_value, engine);
263
262
 
264
263
  return reference;
265
264
 
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "productName": "Meep",
6
6
  "description": "production-ready JavaScript game engine based on Entity Component System Architecture",
7
7
  "author": "Alexander Goldring",
8
- "version": "2.39.35",
8
+ "version": "2.39.38",
9
9
  "dependencies": {
10
10
  "gl-matrix": "3.4.3",
11
11
  "fast-levenshtein": "2.0.6",
@@ -1,12 +0,0 @@
1
- import { computePointDistanceToPlane } from "./Plane.js";
2
-
3
- test('computePointDistanceToPlane', () => {
4
- expect(computePointDistanceToPlane(1, 0, 0, 1, 0, 0, 0)).toBe(1);
5
- expect(computePointDistanceToPlane(-1, 0, 0, 1, 0, 0, 0)).toBe(-1);
6
-
7
- expect(computePointDistanceToPlane(0, 1, 0, 0, 1, 0, 0)).toBe(1);
8
- expect(computePointDistanceToPlane(0, -1, 0, 0, 1, 0, 0)).toBe(-1);
9
-
10
- expect(computePointDistanceToPlane(0, 0, 1, 0, 0, 1, 0)).toBe(1);
11
- expect(computePointDistanceToPlane(0, 0, -1, 0, 0, 1, 0)).toBe(-1);
12
- });
@@ -1,36 +0,0 @@
1
- import { assert } from "../../../../core/assert.js";
2
-
3
- export class FrameGraphBuilder {
4
- /**
5
- *
6
- * @param {TextureDescriptor} descriptor
7
- * @returns {Resource}
8
- */
9
- createTexture(descriptor) {
10
- throw new Error('Not Implemented');
11
- }
12
-
13
- /**
14
- *
15
- * @param {Resource} resource
16
- * @param {number} flags
17
- * @returns {ResourceReference}
18
- */
19
- read(resource, flags) {
20
- assert.equal(resource.isResource, true, 'resource.isResource !== true');
21
-
22
- throw new Error('Not Implemented');
23
- }
24
-
25
- /**
26
- *
27
- * @param {Resource} resource
28
- * @param {number} flags
29
- * @returns {ResourceReference}
30
- */
31
- write(resource, flags) {
32
- assert.equal(resource.isResource, true, 'resource.isResource !== true');
33
-
34
- throw new Error('Not Implemented');
35
- }
36
- }
@@ -1,21 +0,0 @@
1
- export class Resource {
2
- constructor() {
3
- /**
4
- *
5
- * @type {number}
6
- */
7
- this.ref_count = 0;
8
-
9
- /**
10
- *
11
- * @type {TextureDescriptor}
12
- */
13
- this.descriptor = null;
14
- }
15
- }
16
-
17
- /**
18
- * @readonly
19
- * @type {boolean}
20
- */
21
- Resource.prototype.isResource = true;
@@ -1,14 +0,0 @@
1
- export class ResourceReference {
2
- constructor() {
3
- /**
4
- *
5
- * @type {Resource|null}
6
- */
7
- this.resource = null;
8
- /**
9
- *
10
- * @type {number|UsageModeType}
11
- */
12
- this.usage = 0;
13
- }
14
- }
@@ -1,5 +0,0 @@
1
- export const UsageModeType = {
2
- Read: 1,
3
- Write: 2,
4
- Create: 4
5
- }
@@ -1,17 +0,0 @@
1
- import { RenderPass } from "../../RenderPass.js";
2
-
3
- export class PresentPass extends RenderPass {
4
- /**
5
- *
6
- * @param builder
7
- * @param {Resource} data
8
- * @return {{data: ResourceReference}}
9
- */
10
- setup(builder, { data }) {
11
- const input_ref = builder.read(data, 0);
12
-
13
- return {
14
- data: input_ref
15
- };
16
- }
17
- }