@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.
- package/build/meep.cjs +1061 -1058
- package/build/meep.min.js +1 -1
- package/build/meep.module.js +1061 -1058
- package/package.json +1 -1
- package/src/core/binary/EncodingBinaryBuffer.js +7 -43
- package/src/core/binary/EncodingBinaryBuffer.spec.js +16 -0
- package/src/core/binary/UINT16_MAX.js +5 -0
- package/src/core/bvh2/bvh3/EBBVHLeafProxy.js +4 -2
- package/src/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +5 -5
- package/src/core/bvh2/bvh3/query/BVHQueryIntersectsFrustum.js +8 -10
- package/src/core/bvh2/bvh3/query/BVHQueryIntersectsRay.js +7 -7
- package/src/core/bvh2/bvh3/query/BVHQueryIntersectsSphere.js +37 -0
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +12 -4
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.spec.js +29 -0
- package/src/core/cache/LoadingCache.js +4 -1
- package/src/core/collection/list/List.js +9 -3
- package/src/core/collection/map/BiMap.js +49 -0
- package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +11 -4
- package/src/core/geom/Vector2.js +6 -4
- package/src/engine/ecs/components/Tag.d.ts +2 -0
- package/src/engine/ecs/components/Tag.js +19 -28
- package/src/engine/ecs/components/Tag.spec.js +47 -0
- package/src/engine/ecs/fow/FogOfWar.js +4 -0
- package/src/engine/ecs/fow/FogOfWarEditor.js +3 -0
- package/src/engine/ecs/terrain/TerrainPreview.js +45 -44
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrain.js +22 -4
- package/src/engine/ecs/terrain/tiles/TerrainTile.js +17 -12
- package/src/engine/graphics/ecs/mesh/Mesh.d.ts +0 -4
- package/src/engine/graphics/ecs/mesh/Mesh.js +0 -11
- package/src/engine/graphics/ecs/mesh/MeshSystem.js +57 -67
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +49 -86
- package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +41 -72
- package/src/engine/graphics/particles/particular/engine/emitter/write_particle_patch_uv.js +28 -0
- package/src/engine/grid/ORTHOGONAL_NEIGHBOURHOOD_MASK.js +11 -0
- package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +17 -17
- package/src/core/binary/stringToByteArray.js +0 -24
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_sphere.js +0 -81
- package/src/engine/ecs/foliage/Foliage.js +0 -151
- package/src/engine/ecs/foliage/FoliageLoader.js +0 -39
- package/src/engine/ecs/foliage/FoliageVisibilitySetBuilder.js +0 -27
- package/src/engine/ecs/foliage/ImpostorFoliage.js +0 -106
- package/src/engine/ecs/foliage/InstancedFoliage.js +0 -395
- package/src/engine/ecs/foliage/ViewState.js +0 -181
- package/src/engine/ecs/foliage/ecs/Foliage2System.js +0 -333
- package/src/engine/ecs/foliage/ecs/InstancedMeshComponent.js +0 -70
- package/src/engine/ecs/foliage/ecs/InstancedMeshLayer.js +0 -138
- package/src/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +0 -28
- package/src/engine/ecs/foliage/ecs/convertInstancedMeshComponents2Entities.js +0 -64
- package/src/engine/ecs/foliage/ecs/optimizeIndividualMeshesEntitiesToInstances.js +0 -233
- package/src/engine/save/storage/GooglePlayStorage.js +0 -47
- package/src/engine/save/storage/JsonStringCodec.js +0 -24
- package/src/engine/save/storage/LocalStorage.js +0 -148
- package/src/engine/save/storage/MsgPackCodec.js +0 -22
- /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
|
-
|