@woosh/meep-engine 2.62.0 → 2.64.0

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 (54) hide show
  1. package/build/meep.cjs +1061 -1058
  2. package/build/meep.min.js +1 -1
  3. package/build/meep.module.js +1061 -1058
  4. package/package.json +1 -1
  5. package/src/core/binary/EncodingBinaryBuffer.js +7 -43
  6. package/src/core/binary/EncodingBinaryBuffer.spec.js +16 -0
  7. package/src/core/binary/UINT16_MAX.js +5 -0
  8. package/src/core/bvh2/bvh3/EBBVHLeafProxy.js +4 -2
  9. package/src/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +5 -5
  10. package/src/core/bvh2/bvh3/query/BVHQueryIntersectsFrustum.js +8 -10
  11. package/src/core/bvh2/bvh3/query/BVHQueryIntersectsRay.js +7 -7
  12. package/src/core/bvh2/bvh3/query/BVHQueryIntersectsSphere.js +37 -0
  13. package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +12 -4
  14. package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.spec.js +29 -0
  15. package/src/core/cache/LoadingCache.js +4 -1
  16. package/src/core/collection/list/List.js +9 -3
  17. package/src/core/collection/map/BiMap.js +49 -0
  18. package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +11 -4
  19. package/src/core/geom/Vector2.js +6 -4
  20. package/src/engine/ecs/components/Tag.d.ts +2 -0
  21. package/src/engine/ecs/components/Tag.js +19 -28
  22. package/src/engine/ecs/components/Tag.spec.js +47 -0
  23. package/src/engine/ecs/fow/FogOfWar.js +4 -0
  24. package/src/engine/ecs/fow/FogOfWarEditor.js +3 -0
  25. package/src/engine/ecs/terrain/TerrainPreview.js +45 -44
  26. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrain.js +22 -4
  27. package/src/engine/ecs/terrain/tiles/TerrainTile.js +17 -12
  28. package/src/engine/graphics/ecs/mesh/Mesh.d.ts +0 -4
  29. package/src/engine/graphics/ecs/mesh/Mesh.js +0 -11
  30. package/src/engine/graphics/ecs/mesh/MeshSystem.js +57 -67
  31. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +49 -86
  32. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +41 -72
  33. package/src/engine/graphics/particles/particular/engine/emitter/write_particle_patch_uv.js +28 -0
  34. package/src/engine/grid/ORTHOGONAL_NEIGHBOURHOOD_MASK.js +11 -0
  35. package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +17 -17
  36. package/src/core/binary/stringToByteArray.js +0 -24
  37. package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.js +0 -81
  38. package/src/engine/ecs/foliage/Foliage.js +0 -151
  39. package/src/engine/ecs/foliage/FoliageLoader.js +0 -39
  40. package/src/engine/ecs/foliage/FoliageVisibilitySetBuilder.js +0 -27
  41. package/src/engine/ecs/foliage/ImpostorFoliage.js +0 -106
  42. package/src/engine/ecs/foliage/InstancedFoliage.js +0 -395
  43. package/src/engine/ecs/foliage/ViewState.js +0 -181
  44. package/src/engine/ecs/foliage/ecs/Foliage2System.js +0 -333
  45. package/src/engine/ecs/foliage/ecs/InstancedMeshComponent.js +0 -70
  46. package/src/engine/ecs/foliage/ecs/InstancedMeshLayer.js +0 -138
  47. package/src/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +0 -28
  48. package/src/engine/ecs/foliage/ecs/convertInstancedMeshComponents2Entities.js +0 -64
  49. package/src/engine/ecs/foliage/ecs/optimizeIndividualMeshesEntitiesToInstances.js +0 -233
  50. package/src/engine/save/storage/GooglePlayStorage.js +0 -47
  51. package/src/engine/save/storage/JsonStringCodec.js +0 -24
  52. package/src/engine/save/storage/LocalStorage.js +0 -148
  53. package/src/engine/save/storage/MsgPackCodec.js +0 -22
  54. /package/src/engine/sound/ecs/emitter/{SoundEmitter.spec.js → SoundEmitterSerializationAdapter.spec.js} +0 -0
@@ -1,333 +0,0 @@
1
- import { System } from "../../System.js";
2
- import { InstancedFoliage } from "../InstancedFoliage.js";
3
- import { Cache } from "../../../../core/cache/Cache.js";
4
- import { InstancedMeshComponent } from "./InstancedMeshComponent.js";
5
- import { guessAssetType } from "../../../asset/guessAssetType.js";
6
-
7
-
8
- /**
9
- *
10
- * @param {{state:FoliageLayerState, instances: InstancedFoliage}} layerData
11
- * @param {RenderLayer} renderLayer
12
- */
13
- function cleanupLayer(layerData, renderLayer) {
14
- if (layerData.state === FoliageLayerState.Live) {
15
- layerData.state = FoliageLayerState.Removed;
16
- }
17
- }
18
-
19
-
20
- /**
21
- *
22
- * @param {InstancedMeshLayer} layer
23
- * @param {AssetManager} assetManager
24
- * @returns {Promise<InstancedFoliage>}
25
- */
26
- export function loadFoliageLayer(layer, assetManager) {
27
- const instancedFoliage = layer.data;
28
-
29
- instancedFoliage.castShadow = layer.castShadow.getValue();
30
- instancedFoliage.receiveShadow = layer.receiveShadow.getValue();
31
-
32
- const modelURL = layer.modelURL.getValue();
33
-
34
- const mesh = new Promise(function (resolve, reject) {
35
- const assetType = guessAssetType(modelURL);
36
-
37
- if (assetType === null) {
38
- reject(`Undetermined asset type for url='${modelURL}'`);
39
- }
40
-
41
- assetManager.get({
42
- path: modelURL, type: assetType, callback: function (asset) {
43
- const mesh = asset.create();
44
- instancedFoliage.setInstance(mesh.geometry, mesh.material);
45
-
46
- resolve();
47
- }, failure: reject
48
- });
49
- });
50
-
51
- const result = mesh.then(function () {
52
- return instancedFoliage;
53
- });
54
-
55
- return result;
56
- }
57
-
58
- /**
59
- *
60
- * @param {InstancedMeshLayer} layer
61
- * @param {Cache<string, Promise<InstancedFoliage>>} cache
62
- * @param {AssetManager} assetManager
63
- * @returns {Promise<InstancedFoliage>}
64
- */
65
- function obtainLayer(layer, cache, assetManager) {
66
- const key = JSON.stringify(layer.toJSON());
67
-
68
- if (cache.contains(key)) {
69
- return cache.get(key);
70
- } else {
71
- const result = loadFoliageLayer(layer, assetManager);
72
- cache.put(key, result);
73
- return result;
74
- }
75
- }
76
-
77
- /**
78
- * @deprecated
79
- */
80
- export class Foliage2System extends System {
81
- /**
82
- *
83
- * @param {AssetManager} assetManager
84
- * @param {GraphicsEngine} graphicsEngine
85
- * @constructor
86
- * @extends {System.<InstancedMeshComponent>}
87
- */
88
- constructor(assetManager, graphicsEngine) {
89
- super();
90
-
91
- this.graphics = graphicsEngine;
92
-
93
- /**
94
- *
95
- * @type {RenderLayer|null}
96
- */
97
- this.renderLayer = null;
98
-
99
- this.dependencies = [InstancedMeshComponent];
100
-
101
- /**
102
- *
103
- * @type {AssetManager}
104
- */
105
- this.assetManager = assetManager;
106
- this.data = [];
107
-
108
- this.layerCache = new Cache({ maxWeight: 10 });
109
-
110
- }
111
-
112
- startup(entityManager, readyCallback, errorCallback) {
113
- this.entityManager = entityManager;
114
-
115
- const graphics = this.graphics;
116
-
117
- this.renderLayer = graphics.layers.create('instanced-mesh-system');
118
-
119
- /**
120
- *
121
- * @type {CameraViewManager}
122
- */
123
- const views = graphics.views;
124
-
125
- /**
126
- *
127
- * @type {List<CameraView>}
128
- */
129
- const view_list = views.elements;
130
-
131
- view_list.forEach(this.__handle_view_added, this);
132
-
133
- view_list.on.added.add(this.__handle_view_added, this);
134
- view_list.on.removed.add(this.__handle_view_removed, this);
135
-
136
- this.renderLayer.buildVisibleSet = (destination, destination_offset, view) => {
137
- const data = this.data;
138
- let additions = 0;
139
-
140
- for (let entity in data) {
141
-
142
- const layers = data[entity];
143
- const layer_count = layers.length;
144
-
145
- for (let i = 0; i < layer_count; i++) {
146
- /**
147
- * @type {{instances:InstancedFoliage}}
148
- */
149
- const layerData = layers[i];
150
-
151
- if (layerData.state === FoliageLayerState.Live) {
152
- /**
153
- *
154
- * @type {InstancedFoliage}
155
- */
156
- const instances = layerData.instances;
157
-
158
- const view_state = instances.update(view);
159
-
160
- const group = view_state.instances;
161
-
162
- if (group.getCount() <= 0) {
163
- //no visible instances, skip
164
- continue;
165
- }
166
-
167
- const mesh = group.mesh;
168
-
169
- destination[additions + destination_offset] = mesh;
170
- additions++;
171
- }
172
-
173
- }
174
- }
175
-
176
- return additions;
177
- };
178
-
179
- readyCallback();
180
- }
181
-
182
- /**
183
- *
184
- * @param {CameraView} view
185
- * @private
186
- */
187
- __handle_view_added(view) {
188
- const em = this.entityManager;
189
-
190
- if (em === null) {
191
- return;
192
- }
193
-
194
- const ecd = em.dataset;
195
-
196
- if (ecd === null) {
197
- return;
198
- }
199
-
200
- ecd.traverseComponents(InstancedMeshComponent, im => {
201
- im.add_view(view);
202
- });
203
- }
204
-
205
-
206
- /**
207
- *
208
- * @param {CameraView} view
209
- * @private
210
- */
211
- __handle_view_removed(view) {
212
-
213
- const em = this.entityManager;
214
-
215
- if (em === null) {
216
- return;
217
- }
218
-
219
- const ecd = em.dataset;
220
-
221
- if (ecd === null) {
222
- return;
223
- }
224
-
225
- ecd.traverseComponents(InstancedMeshComponent, im => {
226
- im.remove_view(view);
227
- });
228
- }
229
-
230
- shutdown(entityManager, readyCallback, errorCallback) {
231
- this.graphics.layers.remove(this.renderLayer);
232
-
233
- this.graphics.views.elements.forEach(this.__handle_view_removed, this);
234
- this.graphics.views.elements.on.added.remove(this.__handle_view_added, this);
235
- this.graphics.views.elements.on.removed.remove(this.__handle_view_removed, this);
236
-
237
- readyCallback();
238
- }
239
-
240
- reset() {
241
- //drop data
242
- this.data.length = 0;
243
- }
244
-
245
- /**
246
- *
247
- * @param {InstancedMeshComponent} instances
248
- * @param entity
249
- */
250
- link(instances, entity) {
251
- const layers = [];
252
- const data = this.data;
253
-
254
- data[entity] = layers;
255
-
256
- const layerList = instances.layers;
257
- const layer_count = layerList.length;
258
-
259
- for (let i = 0; i < layer_count; i++) {
260
- /**
261
- *
262
- * @type {InstancedMeshLayer}
263
- */
264
- const foliage_layer = layerList.get(i);
265
-
266
- if (foliage_layer.data.geometry == null) {
267
-
268
- const promise = obtainLayer(foliage_layer, this.layerCache, this.assetManager);
269
-
270
- const layerData = {
271
- instances: null,
272
- state: FoliageLayerState.Loading
273
- };
274
-
275
- layers.push(layerData);
276
-
277
- promise.then(function (instances) {
278
- layerData.instances = instances;
279
-
280
- if (layerData.state !== FoliageLayerState.Removed) {
281
- //add to render layer
282
- layerData.state = FoliageLayerState.Live;
283
- }
284
- });
285
-
286
- } else {
287
-
288
- layers.push({
289
- instances: foliage_layer.data,
290
- state: FoliageLayerState.Live
291
- });
292
-
293
- }
294
- }
295
-
296
- //
297
- this.graphics.views.elements.forEach(instances.add_view, instances);
298
- }
299
-
300
- /**
301
- *
302
- * @param {InstancedMeshComponent} instances
303
- * @param {number} entity
304
- */
305
- unlink(instances, entity) {
306
- const renderLayer = this.renderLayer;
307
- const layers = this.data[entity];
308
-
309
- const layer_count = layers.length;
310
-
311
- for (let i = 0; i < layer_count; i++) {
312
- const layerData = layers[i];
313
- cleanupLayer(layerData, renderLayer);
314
- }
315
-
316
- this.graphics.views.elements.forEach(instances.remove_view, instances);
317
-
318
- instances.dispose();
319
-
320
- delete this.data[entity];
321
- }
322
- }
323
-
324
-
325
- /**
326
- *
327
- * @enum {number}
328
- */
329
- const FoliageLayerState = {
330
- Loading: 0,
331
- Live: 1,
332
- Removed: 2
333
- };
@@ -1,70 +0,0 @@
1
- import List from "../../../../core/collection/list/List.js";
2
- import {InstancedMeshLayer} from "./InstancedMeshLayer.js";
3
-
4
-
5
- /**
6
- * @deprecated use {@link ShadedGeometry} instead with instanced rendering
7
- */
8
- export class InstancedMeshComponent {
9
- constructor() {
10
- /**
11
- *
12
- * @type {List<InstancedMeshLayer>}
13
- * @readonly
14
- */
15
- this.layers = new List();
16
- }
17
-
18
- /**
19
- *
20
- * @param {CameraView} view
21
- */
22
- add_view(view) {
23
- const layers = this.layers;
24
- const layer_count = layers.length;
25
-
26
- for (let i = 0; i < layer_count; i++) {
27
- const layer = layers.get(i);
28
-
29
- layer.add_view(view);
30
- }
31
- }
32
-
33
- /**
34
- *
35
- * @param {CameraView} view
36
- */
37
- remove_view(view) {
38
- const layers = this.layers;
39
- const layer_count = layers.length;
40
-
41
- for (let i = 0; i < layer_count; i++) {
42
- const layer = layers.get(i);
43
-
44
- layer.remove_view(view);
45
- }
46
- }
47
-
48
- toJSON() {
49
- return this.layers.toJSON();
50
- }
51
-
52
- fromJSON(data) {
53
- this.layers.fromJSON(data, InstancedMeshLayer);
54
- }
55
-
56
- dispose() {
57
-
58
- const layers = this.layers;
59
- const n = layers.length;
60
-
61
- for (let i = 0; i < n; i++) {
62
- const layer = layers.get(i);
63
-
64
- layer.dispose();
65
- }
66
- }
67
- }
68
-
69
- InstancedMeshComponent.typeName = "InstancedMeshComponent";
70
-
@@ -1,138 +0,0 @@
1
- import { InstancedFoliage } from "../InstancedFoliage.js";
2
- import ObservedString from "../../../../core/model/ObservedString.js";
3
- import ObservedBoolean from "../../../../core/model/ObservedBoolean.js";
4
- import { computeHashIntegerArray } from "../../../../core/collection/array/computeHashIntegerArray.js";
5
- import { Base64 } from "../../../../core/binary/Base64.js";
6
- import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
7
-
8
- export class InstancedMeshLayer {
9
- constructor() {
10
- /**
11
- *
12
- * @type {InstancedFoliage}
13
- * @readonly
14
- */
15
- this.data = new InstancedFoliage();
16
-
17
- /**
18
- *
19
- * @type {ObservedString}
20
- * @readonly
21
- */
22
- this.modelURL = new ObservedString("");
23
-
24
- /**
25
- *
26
- * @type {ObservedBoolean}
27
- * @readonly
28
- */
29
- this.castShadow = new ObservedBoolean(false);
30
-
31
- /**
32
- *
33
- * @type {ObservedBoolean}
34
- * @readonly
35
- */
36
- this.receiveShadow = new ObservedBoolean(false);
37
- }
38
-
39
- /**
40
- *
41
- * @param {CameraView} view
42
- */
43
- add_view(view) {
44
- this.data.add_view(view);
45
- }
46
-
47
- /**
48
- *
49
- * @param {CameraView} view
50
- */
51
- remove_view(view) {
52
- this.data.remove_view(view);
53
- }
54
-
55
- dispose() {
56
- this.data.dispose();
57
- }
58
-
59
- /**
60
- *
61
- * @returns {number}
62
- */
63
- hash() {
64
-
65
- return computeHashIntegerArray(
66
- this.data.hash(),
67
- this.modelURL.hash(),
68
- this.castShadow.hashCode(),
69
- this.receiveShadow.hashCode()
70
- );
71
-
72
- }
73
-
74
- fromJSON(json) {
75
- this.modelURL.fromJSON(json.modelURL);
76
- this.castShadow.fromJSON(json.castShadow);
77
- this.receiveShadow.fromJSON(json.receiveShadow);
78
-
79
- const data = json.data;
80
-
81
- if (data !== undefined) {
82
- const arrayBuffer = Base64.decode(data);
83
-
84
- const bb = new BinaryBuffer();
85
- bb.fromArrayBuffer(arrayBuffer);
86
-
87
- this.data.deserialize(bb);
88
- } else {
89
-
90
- this.data.clear();
91
-
92
- }
93
- }
94
-
95
- toJSON() {
96
-
97
-
98
- const result = {
99
- modelURL: this.modelURL.toJSON(),
100
- castShadow: this.castShadow.toJSON(),
101
- receiveShadow: this.receiveShadow.toJSON()
102
- };
103
-
104
- const bb = new BinaryBuffer();
105
- this.data.serialize(bb);
106
- bb.trim();
107
-
108
- const data_string = Base64.encode(bb.data);
109
-
110
- result.data = data_string;
111
-
112
- return result;
113
- }
114
-
115
- /**
116
- *
117
- * @param {BinaryBuffer} buffer
118
- */
119
- toBinaryBuffer(buffer) {
120
- this.modelURL.toBinaryBuffer(buffer);
121
- this.castShadow.toBinaryBuffer(buffer);
122
- this.receiveShadow.toBinaryBuffer(buffer);
123
-
124
- this.data.serialize(buffer);
125
- }
126
-
127
- /**
128
- *
129
- * @param {BinaryBuffer} buffer
130
- */
131
- fromBinaryBuffer(buffer) {
132
- this.modelURL.fromBinaryBuffer(buffer);
133
- this.castShadow.fromBinaryBuffer(buffer);
134
- this.receiveShadow.fromBinaryBuffer(buffer);
135
-
136
- this.data.deserialize(buffer);
137
- }
138
- }
@@ -1,28 +0,0 @@
1
- import { BinaryClassSerializationAdapter } from "../../storage/binary/BinaryClassSerializationAdapter.js";
2
- import { InstancedMeshComponent } from "./InstancedMeshComponent.js";
3
- import { InstancedMeshLayer } from "./InstancedMeshLayer.js";
4
-
5
- export class InstancedMeshSerializationAdapter extends BinaryClassSerializationAdapter {
6
-
7
- klass = InstancedMeshComponent;
8
- version = 0;
9
-
10
- /**
11
- *
12
- * @param {BinaryBuffer} buffer
13
- * @param {InstancedMeshComponent} value
14
- */
15
- serialize(buffer, value) {
16
- value.layers.toBinaryBuffer(buffer);
17
- }
18
-
19
- /**
20
- *
21
- * @param {BinaryBuffer} buffer
22
- * @param {InstancedMeshComponent} value
23
- */
24
- deserialize(buffer, value) {
25
-
26
- value.layers.fromBinaryBuffer(buffer, InstancedMeshLayer);
27
- }
28
- }
@@ -1,64 +0,0 @@
1
- import {assert} from "../../../../core/assert.js";
2
- import Mesh from "../../../graphics/ecs/mesh/Mesh.js";
3
- import Entity from "../../Entity.js";
4
- import {Transform} from "../../transform/Transform.js";
5
- import {loadFoliageLayer} from "./Foliage2System.js";
6
- import {InstancedMeshComponent} from "./InstancedMeshComponent.js";
7
-
8
- /**
9
- * Convert all existing instanced mesh components to individual Transform+Mesh pairs
10
- * @param {EntityComponentDataset} dataset
11
- * @param assetManager
12
- */
13
- export function convertInstancedMeshComponents2Entities(dataset, assetManager) {
14
- assert.notEqual(dataset, undefined, 'dataset is undefined');
15
- assert.notEqual(assetManager, undefined, 'assetManager is undefined');
16
-
17
- const entitiesToStrip = [];
18
-
19
- /**
20
- *
21
- * @param {InstancedMeshComponent} foliage2
22
- * @param entity
23
- */
24
- function visitFoliageEntities(foliage2, entity) {
25
- foliage2.layers.forEach(function (layer) {
26
- const modelURL = layer.modelURL.getValue();
27
-
28
- loadFoliageLayer(layer, assetManager)
29
- .then(function (instancedFoliage) {
30
-
31
- const data = instancedFoliage.data;
32
- const numInstances = data.length;
33
-
34
- for (let i = 0; i < numInstances; i++) {
35
- const transform = new Transform();
36
-
37
- instancedFoliage.read(i, transform.position, transform.rotation, transform.scale);
38
-
39
- const mesh = new Mesh();
40
- mesh.url = modelURL;
41
-
42
- mesh.castShadow = layer.castShadow.getValue();
43
- mesh.receiveShadow = layer.receiveShadow.getValue();
44
-
45
- //TODO Consider moving BVH info here also, to make this process faster
46
-
47
- const entityBuilder = new Entity();
48
-
49
- entityBuilder.add(transform).add(mesh).build(dataset);
50
- }
51
- });
52
- });
53
-
54
- entitiesToStrip.push(entity);
55
- }
56
-
57
- dataset.traverseEntities([InstancedMeshComponent], visitFoliageEntities);
58
-
59
- //remove converted foliage components
60
- entitiesToStrip.forEach(function (entity) {
61
- dataset.removeComponentFromEntity(entity, InstancedMeshComponent);
62
- });
63
- }
64
-