@woosh/meep-engine 2.63.0 → 2.65.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 +5357 -5350
- package/build/meep.min.js +1 -1
- package/build/meep.module.js +5357 -5350
- package/package.json +1 -1
- package/src/core/binary/UINT16_MAX.js +5 -0
- package/src/core/bvh2/BinaryNode.js +14 -14
- package/src/core/bvh2/LeafNode.js +4 -4
- package/src/core/bvh2/bvh3/{ExplicitBinaryBoundingVolumeHierarchy.d.ts → BVH.d.ts} +1 -1
- package/src/core/bvh2/bvh3/{ExplicitBinaryBoundingVolumeHierarchy.js → BVH.js} +7 -7
- package/src/core/bvh2/bvh3/{ExplicitBinaryBoundingVolumeHierarchy.spec.js → BVH.spec.js} +20 -20
- package/src/core/bvh2/bvh3/{EBBVHLeafProxy.js → BvhClient.js} +3 -3
- package/src/core/bvh2/bvh3/BvhClient.spec.js +51 -0
- package/src/core/bvh2/bvh3/ebvh_build_for_geometry_incremental.js +2 -2
- package/src/core/bvh2/bvh3/ebvh_build_for_geometry_morton.js +4 -4
- package/src/core/bvh2/bvh3/ebvh_build_for_geometry_morton.spec.js +3 -3
- package/src/core/bvh2/bvh3/ebvh_sort_for_traversal_depth_first.js +2 -8
- package/src/core/bvh2/bvh3/query/BVHQuery.js +1 -1
- 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_collect_user_data.js +2 -2
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.js +2 -2
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.spec.js +2 -2
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.js +3 -8
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.spec.js +2 -2
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +13 -5
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.spec.js +29 -0
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_nearest_to_point.js +3 -3
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_nearest_to_point.spec.js +3 -3
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_overlaps_frustum.js +3 -3
- package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +4 -4
- package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.spec.js +3 -3
- package/src/core/collection/list/List.js +9 -3
- package/src/core/geom/3d/aabb/aabb3_from_v3_array.js +11 -4
- package/src/core/geom/Vector2.js +6 -4
- package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +22 -24
- package/src/engine/graphics/ecs/mesh/Mesh.js +8 -8
- package/src/engine/graphics/ecs/mesh/MeshSystem.js +3 -5
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +6 -6
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts +3 -3
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +16 -18
- package/src/engine/graphics/ecs/mesh-v2/render/ShadedGeometryRendererContext.js +5 -5
- package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +9 -11
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +51 -88
- 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/graphics/render/forward_plus/LightManager.js +30 -32
- package/src/engine/graphics/render/forward_plus/LightRenderMetadata.js +3 -3
- package/src/engine/graphics/sh3/LightProbeVolume.js +19 -19
- package/src/engine/graphics/sh3/path_tracer/GeometryBVHBatched.js +4 -6
- package/src/engine/graphics/sh3/path_tracer/PathTracer.js +17 -19
- package/src/engine/sound/ecs/emitter/SoundEmitter.js +18 -16
- package/src/engine/sound/ecs/emitter/SoundEmitterSystem.js +20 -22
- 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/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
|
-
|