@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.
- package/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +4 -13
- package/engine/graphics/ecs/light/LightSystem.js +2 -3
- package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +0 -1
- package/engine/graphics/ecs/mesh-v2/render/adapters/AbstractRenderAdapter.js +9 -0
- package/engine/graphics/ecs/mesh-v2/render/adapters/InstancedRendererAdapter.js +1 -1
- package/engine/graphics/ecs/mesh-v2/render/optimization/RuntimeDrawMethodOptimizer.js +14 -9
- package/engine/graphics/ecs/mesh-v2/sample/load_gltf.js +3 -0
- package/engine/graphics/micron/plugin/MicronRenderPlugin.js +0 -82
- package/engine/graphics/micron/plugin/shaded_geometry/MicronShadedGeometryRenderAdapter.js +28 -3
- package/package.json +1 -1
|
@@ -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,
|
|
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.
|
|
252
|
+
dataset.traverseComponents(Light, this.__visit_entity_to_update_shadow, this);
|
|
254
253
|
|
|
255
254
|
//stop further traversal
|
|
256
255
|
return false;
|
|
@@ -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
|
|
@@ -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
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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.
|
|
8
|
+
"version": "2.36.28",
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"gl-matrix": "3.4.3",
|
|
11
11
|
"fast-levenshtein": "2.0.6",
|