@woosh/meep-engine 2.35.2 → 2.35.3

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.
@@ -1,9 +1,6 @@
1
- import Quaternion from "../Quaternion.js";
2
1
  import Vector3 from "../Vector3.js";
3
2
  import { v3_length } from "../v3_length.js";
4
3
 
5
- const q = new Quaternion();
6
-
7
4
  /**
8
5
  * Used for representing points on a 3D surface. Used for raycasting contacts
9
6
  */
@@ -25,9 +22,12 @@ export class SurfacePoint3 {
25
22
  const p_y = p.y;
26
23
  const p_z = p.z;
27
24
 
28
- const result_p_x = m4[0] * p_x + m4[4] * p_y + m4[8] * p_z + m4[12];
29
- const result_p_y = m4[1] * p_x + m4[5] * p_y + m4[9] * p_z + m4[13];
30
- const result_p_z = m4[2] * p_x + m4[6] * p_y + m4[10] * p_z + m4[14];
25
+ // compute perspective projection
26
+ const w = 1 / (m4[3] * p_x + m4[7] * p_y + m4[11] * p_z + m4[15]);
27
+
28
+ const result_p_x = (m4[0] * p_x + m4[4] * p_y + m4[8] * p_z + m4[12]) * w;
29
+ const result_p_y = (m4[1] * p_x + m4[5] * p_y + m4[9] * p_z + m4[13]) * w;
30
+ const result_p_z = (m4[2] * p_x + m4[6] * p_y + m4[10] * p_z + m4[14]) * w;
31
31
 
32
32
  this.position.set(
33
33
  result_p_x,
@@ -9,6 +9,7 @@ import { returnTrue } from "../../../../core/function/Functions.js";
9
9
  import { aabb3_intersects_ray } from "../../../../core/bvh2/aabb3/aabb3_intersects_ray.js";
10
10
  import { ShadedGeometryRendererContext } from "./render/ShadedGeometryRendererContext.js";
11
11
  import { BinaryNode } from "../../../../core/bvh2/BinaryNode.js";
12
+ import { assert } from "../../../../core/assert.js";
12
13
 
13
14
  /**
14
15
  *
@@ -66,6 +67,58 @@ export class ShadedGeometrySystem extends System {
66
67
 
67
68
  this.__bvh = new BinaryNode();
68
69
  this.__bvh.setNegativelyInfiniteBounds();
70
+
71
+ /**
72
+ *
73
+ * @type {Map<number, function():AbstractRenderAdapter>}
74
+ * @private
75
+ */
76
+ this.__adapter_suppliers = new Map();
77
+ }
78
+
79
+ /**
80
+ *
81
+ * @param {number} index
82
+ * @param {function():AbstractRenderAdapter} supplier
83
+ */
84
+ register_render_adapter(index, supplier) {
85
+ assert.isNonNegativeInteger(index, 'index');
86
+
87
+ if (this.__adapter_suppliers.has(index)) {
88
+ // slot is already taken
89
+ console.warn(`Render adapter slot '${index}' is already taken, removing old adapter`);
90
+ this.unregister_render_adapter(index);
91
+ }
92
+
93
+ this.__adapter_suppliers.set(index, supplier);
94
+
95
+ this.__view_contexts.forEach((value, key) => {
96
+ value.setAdapter(index, supplier());
97
+ });
98
+ }
99
+
100
+ /**
101
+ *
102
+ * @param {number} index
103
+ * @return {boolean}
104
+ */
105
+ unregister_render_adapter(index) {
106
+ assert.isNonNegativeInteger(index, 'index');
107
+
108
+ const supplier = this.__adapter_suppliers.get(index);
109
+
110
+ if (supplier === undefined) {
111
+ // not found
112
+ return false;
113
+ }
114
+
115
+ this.__adapter_suppliers.delete(index);
116
+
117
+ this.__view_contexts.forEach((value, key) => {
118
+ value.removeAdapter(index);
119
+ });
120
+
121
+ return true;
69
122
  }
70
123
 
71
124
  /**
@@ -74,7 +127,14 @@ export class ShadedGeometrySystem extends System {
74
127
  * @private
75
128
  */
76
129
  __handle_view_added(view) {
77
- this.__view_contexts.set(view, new ShadedGeometryRendererContext());
130
+ const ctx = new ShadedGeometryRendererContext();
131
+
132
+ // attach adapters
133
+ this.__adapter_suppliers.forEach((value, key) => {
134
+ ctx.setAdapter(key, value());
135
+ });
136
+
137
+ this.__view_contexts.set(view, ctx);
78
138
  }
79
139
 
80
140
  /**
@@ -1,7 +1,8 @@
1
1
  import { queryBinaryNode_FrustumIntersections_Data } from "../../../../../core/bvh2/traversal/queryBinaryNode_FrustumIntersections.js";
2
- import { AbstractRenderAdapter } from "./AbstractRenderAdapter.js";
3
- import { InstancedRendererAdapter } from "./InstancedRendererAdapter.js";
4
- import { GenericRendererAdapter } from "./GenericRendererAdapter.js";
2
+ import { AbstractRenderAdapter } from "./adapters/AbstractRenderAdapter.js";
3
+ import { InstancedRendererAdapter } from "./adapters/InstancedRendererAdapter.js";
4
+ import { GenericRendererAdapter } from "./adapters/GenericRendererAdapter.js";
5
+ import { assert } from "../../../../../core/assert.js";
5
6
 
6
7
  /**
7
8
  * 1 - collect visible meshes
@@ -19,7 +20,16 @@ export class ShadedGeometryRendererContext {
19
20
  ];
20
21
  }
21
22
 
23
+ /**
24
+ *
25
+ * @param {number} index
26
+ * @param {AbstractRenderAdapter} adapter
27
+ */
22
28
  setAdapter(index, adapter) {
29
+ assert.isNonNegativeInteger(index, 'index');
30
+ assert.defined(adapter, 'adapter');
31
+ assert.equal(adapter.isShadedGeometryRenderAdapter, true, 'adapter.isShadedGeometryRenderAdapter !== true');
32
+
23
33
  const existing = this.adapters[index];
24
34
  if (existing !== undefined) {
25
35
  // dispose of existing adapter
@@ -29,14 +39,36 @@ export class ShadedGeometryRendererContext {
29
39
  this.adapters[index] = adapter;
30
40
  }
31
41
 
42
+ /**
43
+ *
44
+ * @param {number} index
45
+ * @returns {boolean}
46
+ */
47
+ removeAdapter(index) {
48
+ assert.isNonNegativeInteger(index, 'index');
49
+
50
+ const adapter = this.adapters[index];
51
+
52
+ if (adapter === undefined) {
53
+ return false;
54
+ }
55
+
56
+ delete this.adapters[index];
57
+
58
+ adapter.dispose();
59
+
60
+ return true;
61
+ }
62
+
32
63
  /**
33
64
  *
34
65
  * @param {THREE.Object3D[]} destination
35
66
  * @param {number} destination_offset
67
+ * @param {THREE.WebGLRenderer} renderer
36
68
  * @param {CameraView} view
37
69
  * @param {BinaryNode<ShadedGeometry>} bvh
38
70
  */
39
- collect(destination, destination_offset, view, bvh) {
71
+ collect(destination, destination_offset, renderer, view, bvh) {
40
72
  const adapters = this.adapters;
41
73
  const adapter_count = adapters.length;
42
74
 
@@ -44,7 +76,7 @@ export class ShadedGeometryRendererContext {
44
76
  for (; i < adapter_count; i++) {
45
77
  const adapter = adapters[i];
46
78
 
47
- adapter.build_start();
79
+ adapter.build_start(renderer);
48
80
  }
49
81
 
50
82
 
@@ -35,7 +35,13 @@ export class AbstractRenderAdapter {
35
35
  throw new Error('Not Implemented');
36
36
  }
37
37
 
38
- build_start() {
38
+
39
+ /**
40
+ *
41
+ * @param {THREE.WebGLRenderer} renderer
42
+ * @param {CameraView} view
43
+ */
44
+ build_start(renderer, view) {
39
45
 
40
46
  }
41
47
 
@@ -65,3 +71,9 @@ export class AbstractRenderAdapter {
65
71
 
66
72
  }
67
73
  }
74
+
75
+ /**
76
+ * @readonly
77
+ * @type {boolean}
78
+ */
79
+ AbstractRenderAdapter.prototype.isShadedGeometryRenderAdapter = true;
@@ -1,6 +1,6 @@
1
1
  import { AbstractRenderAdapter } from "./AbstractRenderAdapter.js";
2
- import { array_copy } from "../../../../../core/collection/array/copyArray.js";
3
- import { build_three_object } from "../build_three_object.js";
2
+ import { array_copy } from "../../../../../../core/collection/array/copyArray.js";
3
+ import { build_three_object } from "../../build_three_object.js";
4
4
 
5
5
  export class GenericRendererAdapter extends AbstractRenderAdapter {
6
6
  constructor() {
@@ -19,7 +19,12 @@ export class GenericRendererAdapter extends AbstractRenderAdapter {
19
19
  return 0;
20
20
  }
21
21
 
22
- build_start() {
22
+ /**
23
+ *
24
+ * @param {THREE.WebGLRenderer} renderer
25
+ * @param {CameraView} view
26
+ */
27
+ build_start(renderer, view) {
23
28
  this.clear();
24
29
  }
25
30
 
@@ -1,8 +1,8 @@
1
1
  import { AbstractRenderAdapter } from "./AbstractRenderAdapter.js";
2
- import { HashMap } from "../../../../../core/collection/HashMap.js";
3
- import { InstancedMeshGroup } from "../../../geometry/instancing/InstancedMeshGroup.js";
4
- import { ShadedGeometryFlags } from "../ShadedGeometryFlags.js";
5
- import { DrawMode } from "../DrawMode.js";
2
+ import { HashMap } from "../../../../../../core/collection/HashMap.js";
3
+ import { InstancedMeshGroup } from "../../../../geometry/instancing/InstancedMeshGroup.js";
4
+ import { ShadedGeometryFlags } from "../../ShadedGeometryFlags.js";
5
+ import { DrawMode } from "../../DrawMode.js";
6
6
 
7
7
  const INSTANCED_EQUALITY_FLAGS = ShadedGeometryFlags.CastShadow
8
8
  | ShadedGeometryFlags.ReceiveShadow
@@ -122,7 +122,12 @@ export class InstancedRendererAdapter extends AbstractRenderAdapter {
122
122
  this.__active_meshes.add(mesh);
123
123
  }
124
124
 
125
- build_start() {
125
+ /**
126
+ *
127
+ * @param {THREE.WebGLRenderer} renderer
128
+ * @param {CameraView} view
129
+ */
130
+ build_start(renderer, view) {
126
131
  this.clear();
127
132
  }
128
133
 
@@ -22,7 +22,6 @@ export function three_object_to_entity_composition(root) {
22
22
  }
23
23
 
24
24
  const sg = ShadedGeometry.from(root.geometry, root.material);
25
- sg.draw_method = 1;
26
25
 
27
26
  entity.add(sg);
28
27
  }
@@ -0,0 +1,150 @@
1
+ import { AbstractRenderAdapter } from "../../../ecs/mesh-v2/render/adapters/AbstractRenderAdapter.js";
2
+ import Vector2 from "../../../../../core/geom/Vector2.js";
3
+ import { MaterialVertexSpec } from "../../render/v1/MaterialVertexSpec.js";
4
+
5
+ /**
6
+ *
7
+ * @type {MaterialVertexSpec}
8
+ */
9
+ const scratch_mvc = new MaterialVertexSpec();
10
+
11
+ class MicronRenderContext {
12
+
13
+ }
14
+
15
+ export class MicronShadedGeometryRenderAdapter extends AbstractRenderAdapter {
16
+ constructor({
17
+ vgtr
18
+ }) {
19
+ super();
20
+
21
+ /**
22
+ * @type {VGThreeRenderer}
23
+ * @private
24
+ */
25
+ this.__vgtr = vgtr;
26
+
27
+ /**
28
+ *
29
+ * @type {VirtualGeometry|null}
30
+ * @private
31
+ */
32
+ this.__vg = null;
33
+
34
+ /**
35
+ *
36
+ * @type {VirtualGeometryBuilder|null}
37
+ * @private
38
+ */
39
+ this.__vgb = null;
40
+
41
+ /**
42
+ *
43
+ * @type {Map<number, MicronGeometry>}
44
+ * @private
45
+ */
46
+ this.__geometry_map = new Map();
47
+
48
+ /**
49
+ *
50
+ * @type {Set<MaterialContext>}
51
+ * @private
52
+ */
53
+ this.__active_contexts = new Set();
54
+ }
55
+
56
+ add(sg) {
57
+
58
+ const micron_geometry = this.__geometry_map.get(sg.geometry.id);
59
+
60
+ // populate virtual geometry for this instance
61
+ this.__vgb.buildForMesh(sg.entity, micron_geometry, sg.transform);
62
+
63
+ }
64
+
65
+ /**
66
+ *
67
+ * @param {THREE.WebGLRenderer} renderer
68
+ * @param {CameraView} view
69
+ */
70
+ build_start(renderer, view) {
71
+ const resolution = new Vector2();
72
+ let pixelRatio = 1;
73
+
74
+ /**
75
+ *
76
+ * @type {THREE.RenderTarget}
77
+ */
78
+ const render_target = renderer.getRenderTarget();
79
+
80
+ if (render_target !== null) {
81
+ resolution.set(render_target.width, render_target.height);
82
+ } else {
83
+ renderer.getSize(resolution);
84
+ pixelRatio = renderer.getPixelRatio();
85
+ }
86
+
87
+ const vg_builder = this.__vgb;
88
+
89
+ vg_builder.resolution.set(resolution.x * pixelRatio, resolution.y * pixelRatio);
90
+ vg_builder.setMatricesFromCamera(view.camera);
91
+ vg_builder.setOutput(this.__vg);
92
+
93
+ vg_builder.build();
94
+ }
95
+
96
+ build_end() {
97
+ const contexts = this.__contexts_array;
98
+ const context_count = contexts.length;
99
+
100
+ /**
101
+ *
102
+ * @type {Map<number, MaterialContext>}
103
+ */
104
+ const instance_to_ctx = new Map();
105
+
106
+ for (let i = 0; i < context_count; i++) {
107
+ const ctx = contexts[i];
108
+ ctx.__patch_count = 0;
109
+
110
+ for (const instance of ctx.instances) {
111
+ instance_to_ctx.set(instance, ctx);
112
+ }
113
+ }
114
+
115
+ // sort patches into relevant contexts
116
+ const geometry = this.geometry;
117
+ const patch_count = geometry.patch_count;
118
+ const patches = geometry.patches;
119
+
120
+ for (let i = 0; i < patch_count; i++) {
121
+ const i3 = i * 3;
122
+
123
+ const instance_id = patches[i3];
124
+ const geometry_id = patches[i3 + 1];
125
+ const patch_id = patches[i3 + 2];
126
+
127
+ const ctx = instance_to_ctx.get(instance_id);
128
+
129
+ const target_address = ctx.__patch_count * 3;
130
+ ctx.__patch_count++;
131
+
132
+ const ctx_patches = ctx.__patches;
133
+
134
+ ctx_patches[target_address] = instance_id;
135
+ ctx_patches[target_address + 1] = geometry_id;
136
+ ctx_patches[target_address + 2] = patch_id;
137
+ }
138
+
139
+ // build each context
140
+ for (let i = 0; i < context_count; i++) {
141
+ const ctx = contexts[i];
142
+
143
+ ctx.build(this.geometry);
144
+ }
145
+ }
146
+
147
+ dispose() {
148
+
149
+ }
150
+ }
@@ -141,13 +141,11 @@ export class VirtualGeometryBuilder {
141
141
  * @param {number} instance_id
142
142
  * @param {MicronGeometry} geometry
143
143
  * @param {number[]} transform world transform matrix of the instance
144
- * @param {ActivePatchList} apl
145
144
  */
146
145
  buildForMesh(
147
146
  instance_id,
148
147
  geometry,
149
- transform,
150
- apl
148
+ transform
151
149
  ) {
152
150
  refinement_spec.build(transform, this.view_projection_matrix);
153
151
 
@@ -42,13 +42,6 @@ export class ThreeInstancedAdapter {
42
42
 
43
43
  this.__uniforms = Object.assign({}, this.__patch_data.genUniforms());
44
44
 
45
- /**
46
- *
47
- * @type {WebGL2RenderingContext|null}
48
- * @private
49
- */
50
- this.__gl_context = null;
51
-
52
45
  /**
53
46
  *
54
47
  * @type {Signal}
@@ -73,8 +73,7 @@ export class MaterialContext {
73
73
  return this.instances.has(occurrence.instance_id);
74
74
  }
75
75
 
76
- init(gl) {
77
- this.adapter.__gl_context = gl;
76
+ init() {
78
77
 
79
78
  const material = this.material.clone();
80
79
 
@@ -19,13 +19,6 @@ export class VGThreeRenderer {
19
19
 
20
20
  this.builder = new VirtualGeometryBuilder();
21
21
 
22
- /**
23
- *
24
- * @type {WebGL2RenderingContext|null}
25
- * @private
26
- */
27
- this.__gl_context = null;
28
-
29
22
  /**
30
23
  *
31
24
  * @type {Map<MaterialVertexSpec, MaterialContext>}
@@ -89,7 +82,7 @@ export class VGThreeRenderer {
89
82
 
90
83
  const ctx = new MaterialContext(spec, m);
91
84
 
92
- ctx.init(this.__gl_context);
85
+ ctx.init();
93
86
 
94
87
  this.material_contexts.set(key, ctx);
95
88
  this.__contexts_array.push(ctx);
@@ -1,6 +1,5 @@
1
1
  import { ParticleEmitterFlag } from "../../emitter/ParticleEmitterFlag.js";
2
2
  import { PARTICLE_ATTRIBUTE_DEATH_AGE, PARTICLE_ATTRIBUTE_POSITION } from "../../emitter/PARTICLE_ATTRIBUTES.js";
3
- import { EmissionShapeType } from "../../emitter/EmissionShapeType.js";
4
3
  import { Matrix4 } from "three";
5
4
  import { composeMatrix4 } from "../../../../../util/composeMatrix4.js";
6
5
  import Quaternion from "../../../../../../../core/geom/Quaternion.js";
@@ -14,55 +13,6 @@ import { SerializationMetadata } from "../../../../../../ecs/components/Serializ
14
13
  import { UnitCubeShape3D } from "../../../../../../../core/geom/3d/shape/UnitCubeShape3D.js";
15
14
  import { shape_from_json } from "../../../../../../../core/geom/3d/shape/json/shape_from_json.js";
16
15
 
17
- /**
18
- *
19
- * @param {ParticleLayer} layer
20
- * @returns {number}
21
- */
22
- function computeLayerVolume(layer) {
23
- let base_volume = 0;
24
-
25
- switch (layer.emissionShape) {
26
- case EmissionShapeType.Box:
27
- base_volume = 1;
28
- break;
29
- case EmissionShapeType.Sphere:
30
- base_volume = 0.5236;
31
- break;
32
- case EmissionShapeType.Point:
33
- base_volume = 0;
34
- break;
35
- }
36
-
37
- const scale_volume = layer.scale.x * layer.scale.y * layer.scale.z;
38
-
39
- return base_volume * scale_volume;
40
- }
41
-
42
- /**
43
- *
44
- * @param {ParticleEmitter} emitter
45
- * @param {Transform} transform
46
- * @returns {number}
47
- */
48
- function computeEmitterVolume(emitter, transform) {
49
-
50
- const layers = emitter.layers;
51
- const n = layers.length;
52
-
53
- let layer_volume_sum = 0;
54
-
55
- for (let i = 0; i < n; i++) {
56
- const particleLayer = layers.get(i);
57
-
58
- layer_volume_sum += computeLayerVolume(particleLayer);
59
- }
60
-
61
- const scale_volume = transform.scale.x * transform.scale.y * transform.scale.z;
62
-
63
- return layer_volume_sum * scale_volume;
64
- }
65
-
66
16
  const DEFAULT_ATTRIBUTE_VALUES = {
67
17
  color: [1, 1, 1, 1],
68
18
  age: [0],
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.35.2",
8
+ "version": "2.35.3",
9
9
  "dependencies": {
10
10
  "gl-matrix": "3.4.3",
11
11
  "fast-levenshtein": "2.0.6",