@woosh/meep-engine 2.36.25 → 2.36.28

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.
@@ -82,8 +82,6 @@ function makeIdMaterialStatic() {
82
82
  });
83
83
  }
84
84
 
85
- const material_id_unskinned = makeIdMaterialStatic();
86
-
87
85
  /**
88
86
  *
89
87
  * @type {WeakMap<Object3D, Object3D>}
@@ -185,13 +183,6 @@ export class OutlineRenderer {
185
183
  */
186
184
  this.scene = null;
187
185
 
188
- /**
189
- *
190
- * @type {HighlightRenderGroup}
191
- * @private
192
- */
193
- this.__current_group = null;
194
-
195
186
  /**
196
187
  *
197
188
  * @type {HashMap<HighlightDefinition>}
@@ -585,10 +576,10 @@ export class OutlineRenderer {
585
576
 
586
577
  const color = definition.color;
587
578
 
588
- data[offset + 0] = color.r * 255;
589
- data[offset + 1] = color.g * 255;
590
- data[offset + 2] = color.b * 255;
591
- data[offset + 3] = definition.opacity * 255;
579
+ data[offset + 0] = Math.round(color.r * 255);
580
+ data[offset + 1] = Math.round(color.g * 255);
581
+ data[offset + 2] = Math.round(color.b * 255);
582
+ data[offset + 3] = Math.round(definition.opacity * 255);
592
583
 
593
584
  texture.needsUpdate = true;
594
585
  }
@@ -183,11 +183,10 @@ class LightSystem extends AbstractContextSystem {
183
183
  /**
184
184
  *
185
185
  * @param {Light} light
186
- * @param {Transform} transform
187
186
  * @param {number} lightEntity
188
187
  * @private
189
188
  */
190
- __visit_entity_to_update_shadow(light, transform, lightEntity) {
189
+ __visit_entity_to_update_shadow(light, lightEntity) {
191
190
  /**
192
191
  *
193
192
  1) Calculate the 8 corners of the view frustum in world space. This can be done by using the inverse view-projection matrix to transform the 8 corners of the NDC cube (which in OpenGL is [‒1, 1] along each axis).
@@ -250,7 +249,7 @@ class LightSystem extends AbstractContextSystem {
250
249
  return false;
251
250
  }
252
251
 
253
- dataset.traverseEntities([Light, Transform], this.__visit_entity_to_update_shadow, this);
252
+ dataset.traverseComponents(Light, this.__visit_entity_to_update_shadow, this);
254
253
 
255
254
  //stop further traversal
256
255
  return false;
@@ -92,7 +92,6 @@ export class ShadedGeometrySystem extends System {
92
92
  name: 'ShadedGeometry Draw Method optimizer',
93
93
  initializer: () => {
94
94
  optimizer.__system = this;
95
- optimizer.__ecd = this.entityManager.dataset
96
95
  },
97
96
  cycleFunction() {
98
97
  if (optimizer.step()) {
@@ -27,6 +27,15 @@ export class AbstractRenderAdapter {
27
27
  return 0;
28
28
  }
29
29
 
30
+ /**
31
+ * Express intent to draw
32
+ * @param {ShadedGeometry} sg
33
+ * @returns {boolean} true if able to draw immediately, false otherwise
34
+ */
35
+ intend_draw(sg) {
36
+ return true;
37
+ }
38
+
30
39
  /**
31
40
  *
32
41
  * @param {ShadedGeometry} sg
@@ -70,7 +70,7 @@ export class InstancedRendererAdapter extends AbstractRenderAdapter {
70
70
  }
71
71
 
72
72
  score(geometry, material, instance_count) {
73
- if (instance_count > 64) {
73
+ if (instance_count > 16) {
74
74
  return 1;
75
75
  } else if (instance_count < 4) {
76
76
  return -1;
@@ -2,12 +2,6 @@ import { ShadedGeometry } from "../../ShadedGeometry.js";
2
2
 
3
3
  export class RuntimeDrawMethodOptimizer {
4
4
  constructor() {
5
- /**
6
- *
7
- * @type {EntityComponentDataset|null}
8
- * @private
9
- */
10
- this.__ecd = null;
11
5
 
12
6
  /**
13
7
  *
@@ -29,7 +23,13 @@ export class RuntimeDrawMethodOptimizer {
29
23
  * @returns {boolean} true if a change was made, false otherwise
30
24
  */
31
25
  step() {
32
- const ecd = this.__ecd;
26
+ const system = this.__system;
27
+
28
+ if (system === null) {
29
+ return false;
30
+ }
31
+
32
+ const ecd = system.entityManager.dataset;
33
33
 
34
34
  if (ecd === null) {
35
35
  // no dataset attached
@@ -64,13 +64,13 @@ export class RuntimeDrawMethodOptimizer {
64
64
  return false;
65
65
  }
66
66
 
67
- const use_count = this.__system.getGeometryUsageCounters().get(sg.geometry.id);
67
+ const use_count = system.getGeometryUsageCounters().get(sg.geometry.id);
68
68
 
69
69
  /**
70
70
  *
71
71
  * @type {ShadedGeometryRendererContext|undefined}
72
72
  */
73
- const first_context = this.__system.__view_contexts.values().next().value;
73
+ const first_context = system.__view_contexts.values().next().value;
74
74
 
75
75
  if (first_context === undefined) {
76
76
  return false;
@@ -102,6 +102,11 @@ export class RuntimeDrawMethodOptimizer {
102
102
  return false;
103
103
  }
104
104
 
105
+ if (!adapters[best_adapter].intend_draw(sg)) {
106
+ // unable to draw, don't do anything
107
+ return false;
108
+ }
109
+
105
110
  sg.draw_method = best_adapter;
106
111
 
107
112
  return true;
@@ -7,6 +7,7 @@ import { three_object_to_entity_composition } from "../three_object_to_entity_co
7
7
  import { AttachmentSystem } from "../../../../ecs/attachment/AttachmentSystem.js";
8
8
  import { TransformAttachmentSystem } from "../../../../ecs/transform-attachment/TransformAttachmentSystem.js";
9
9
  import { Camera } from "../../camera/Camera.js";
10
+ import { MicronRenderPlugin } from "../../../micron/plugin/MicronRenderPlugin.js";
10
11
 
11
12
  const eh = new EngineHarness();
12
13
 
@@ -25,6 +26,8 @@ async function init(harness) {
25
26
  config.addSystem(new TransformAttachmentSystem());
26
27
  config.addLoader(GameAssetType.ModelGLTF_JSON, new GLTFAssetLoader());
27
28
 
29
+ config.addPlugin( MicronRenderPlugin);
30
+
28
31
  await config.apply(engine);
29
32
 
30
33
  eh.initialize().then(main);
@@ -37,13 +37,6 @@ export class MicronRenderPlugin extends EnginePlugin {
37
37
  layer.managed = true;
38
38
  layer.renderPass = RenderPassType.Opaque;
39
39
 
40
- /**
41
- *
42
- * @type {RenderLayer|null}
43
- * @private
44
- */
45
- this.__micron_render_layer = layer;
46
-
47
40
  this.__vgtr.on.contextAdded.add(ctx => {
48
41
  const visibleSet = layer.visibleSet;
49
42
 
@@ -54,8 +47,6 @@ export class MicronRenderPlugin extends EnginePlugin {
54
47
 
55
48
  });
56
49
 
57
- this.__view_observers = new Map();
58
-
59
50
  /**
60
51
  *
61
52
  * @type {AsyncRemoteHashMap}
@@ -97,55 +88,6 @@ export class MicronRenderPlugin extends EnginePlugin {
97
88
  this.__sg_system = null;
98
89
  }
99
90
 
100
- /**
101
- *
102
- * @param {THREE.WebGLRenderer} renderer
103
- * @param {THREE.Camera} camera
104
- * @param {THREE.Object3D[]} elements
105
- * @param element_count
106
- */
107
- render(renderer, camera, elements, element_count = elements.length) {
108
- const vgtr = this.__vgtr;
109
-
110
- vgtr.clear();
111
-
112
- vgtr.attachMany(elements, element_count);
113
-
114
- vgtr.update(renderer, camera);
115
- vgtr.render();
116
- }
117
-
118
- /**
119
- *
120
- * @param {CameraView} view
121
- * @private
122
- */
123
- __handle_view_added(view) {
124
- const observer = () => {
125
- const ge = this.engine.graphics;
126
-
127
- this.render(ge.renderer, view.camera, view.visible_objects.elements, view.visible_objects.size);
128
- };
129
-
130
- this.__view_observers.set(view, observer);
131
-
132
-
133
- view.on.preRender.add(observer);
134
- }
135
-
136
- /**
137
- *
138
- * @param {CameraView} view
139
- * @private
140
- */
141
- __handle_view_removed(view) {
142
- const observer = this.__view_observers.get(view);
143
-
144
- this.__view_observers.delete(view);
145
-
146
- view.on.preRender.remove(observer);
147
- }
148
-
149
91
  /**
150
92
  *
151
93
  * @param {System} system
@@ -214,20 +156,6 @@ export class MicronRenderPlugin extends EnginePlugin {
214
156
  am.registerTransformer("model/gltf", this.__asset_transformer);
215
157
  am.registerTransformer("model/gltf+json", this.__asset_transformer);
216
158
 
217
- /**
218
- *
219
- * @type {GraphicsEngine}
220
- */
221
- const ge = engine.graphics;
222
-
223
- ge.layers.add(this.__micron_render_layer);
224
-
225
- ge.views.elements.on.added.add(this.__handle_view_added, this);
226
- ge.views.elements.on.removed.add(this.__handle_view_removed, this);
227
-
228
- // link all views
229
- ge.views.elements.forEach(this.__handle_view_added, this);
230
-
231
159
  this.__persisted_geometry.attach_storage(engine.storage);
232
160
 
233
161
  engine.entityManager.on.systemAdded.add(this.__handle_system_added, this);
@@ -250,16 +178,6 @@ export class MicronRenderPlugin extends EnginePlugin {
250
178
 
251
179
  this.__asset_transformer.assetManager = null;
252
180
 
253
- const ge = engine.graphics;
254
-
255
- ge.layers.remove(this.__micron_render_layer);
256
-
257
- ge.views.elements.on.added.remove(this.__handle_view_added, this);
258
- ge.views.elements.on.removed.remove(this.__handle_view_removed, this);
259
-
260
- // clear all observer
261
- ge.views.elements.forEach(this.__handle_view_removed, this);
262
-
263
181
  engine.entityManager.on.systemAdded.remove(this.__handle_system_added, this);
264
182
  engine.entityManager.on.systemRemoved.remove(this.__handle_system_removed, this);
265
183
 
@@ -56,13 +56,22 @@ export class MicronShadedGeometryRenderAdapter extends AbstractRenderAdapter {
56
56
  return inverseLerp(MICRON_POLYCOUNT_THRESHOLD_MIN, MICRON_POLYCOUNT_THRESHOLD_MAX, polycount);
57
57
  }
58
58
 
59
- add(sg) {
60
-
59
+ /**
60
+ *
61
+ * @param {ShadedGeometry} sg
62
+ * @returns {MicronGeometry}
63
+ * @private
64
+ */
65
+ __obtain_micron_geometry(sg) {
61
66
  const geometry_id = sg.geometry.id;
62
67
 
63
68
  const micron_geometry = this.__geometry_map.get(geometry_id);
64
69
 
65
- if (micron_geometry === undefined) {
70
+ if (micron_geometry !== undefined) {
71
+
72
+ return micron_geometry;
73
+
74
+ } else {
66
75
  // no micron geometry
67
76
  if (!this.__geometry_building_promises.has(geometry_id)) {
68
77
  const p = buildMicronGeometryFromBufferGeometry(sg.geometry);
@@ -71,6 +80,20 @@ export class MicronShadedGeometryRenderAdapter extends AbstractRenderAdapter {
71
80
 
72
81
  p.then(mg => this.__geometry_map.set(geometry_id, mg));
73
82
  }
83
+ return undefined;
84
+ }
85
+
86
+ }
87
+
88
+ intend_draw(sg) {
89
+ return this.__obtain_micron_geometry(sg) !== undefined;
90
+ }
91
+
92
+ add(sg) {
93
+ const micron_geometry = this.__obtain_micron_geometry(sg);
94
+
95
+ if (micron_geometry === undefined) {
96
+ // no micron geometry
74
97
  return;
75
98
  }
76
99
 
@@ -94,6 +117,8 @@ export class MicronShadedGeometryRenderAdapter extends AbstractRenderAdapter {
94
117
  * @param {CameraView} view
95
118
  */
96
119
  build_start(renderer, view) {
120
+ this.__object_count = 0;
121
+
97
122
  const resolution = new Vector2();
98
123
  let pixelRatio = 1;
99
124
 
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.36.25",
8
+ "version": "2.36.28",
9
9
  "dependencies": {
10
10
  "gl-matrix": "3.4.3",
11
11
  "fast-levenshtein": "2.0.6",