@woosh/meep-engine 2.33.24 → 2.33.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/core/binary/BitSet.js +151 -167
- package/core/binary/BitSet.spec.js +99 -1
- package/core/binary/ValidatingBitSetWrapper.js +81 -0
- package/core/bvh2/aabb3/AABB3.js +3 -10
- package/core/bvh2/binary/IndexedBinaryBVH.js +1 -1
- package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
- package/core/bvh2/traversal/__detailed_box_volume_intersection.js +22 -5
- package/core/cache/Cache.d.ts +4 -2
- package/core/cache/Cache.js +5 -2
- package/core/collection/HashMap.d.ts +9 -2
- package/core/collection/HashSet.d.ts +7 -2
- package/core/collection/HashSet.js +7 -2
- package/core/collection/array/binarySearchHighIndex.js +1 -1
- package/core/collection/array/copyArray.js +2 -2
- package/core/collection/array/typed/typed_array_copy.js +1 -1
- package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +3 -3
- package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
- package/core/geom/3d/shape/AbstractShape3D.js +37 -1
- package/core/geom/3d/shape/TransformedShape3D.js +121 -10
- package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
- package/core/geom/3d/shape/UnionShape3D.js +255 -0
- package/core/geom/3d/shape/UnitCubeShape3D.js +88 -0
- package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
- package/core/geom/3d/shape/UnitSphereShape3D.js +39 -0
- package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
- package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
- package/core/geom/random/randomPointInSphere.js +3 -2
- package/core/json/resolvePathByArray.js +2 -2
- package/core/model/ObservedBoolean.d.ts +2 -0
- package/core/parser/simple/Token.d.ts +13 -0
- package/core/parser/simple/Token.js +61 -27
- package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
- package/core/primitives/strings/insert_after_or_replace.js +27 -0
- package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
- package/editor/tools/FoliagePaintTool.js +4 -4
- package/editor/view/ecs/EntityEditor.js +2 -2
- package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
- package/engine/EngineHarness.js +1 -0
- package/engine/animation/AnimationUtils.js +5 -5
- package/engine/asset/loaders/GLTFAssetLoader.js +52 -1
- package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
- package/engine/asset/loaders/image/ImageRGBADataAsset.js +3 -2
- package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
- package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
- package/engine/asset/loaders/image/png/PNG.js +113 -6
- package/engine/asset/loaders/image/png/PNGReader.js +5 -0
- package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
- package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
- package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
- package/engine/ecs/EntityBuilder.js +25 -5
- package/engine/ecs/EntityComponentDataset.js +1 -1
- package/engine/ecs/attachment/AttachmentBinding.js +8 -0
- package/engine/ecs/attachment/AttachmentSystem.js +4 -0
- package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
- package/engine/ecs/components/Tag.js +27 -6
- package/engine/ecs/foliage/InstancedFoliage.js +277 -266
- package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
- package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
- package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
- package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
- package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
- package/engine/ecs/fow/FogOfWar.js +4 -0
- package/engine/ecs/fow/FogOfWarSystem.js +2 -0
- package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
- package/engine/ecs/storage/binary/BinarySerializationRegistry.js +1 -1
- package/engine/ecs/system/AbstractContextSystem.js +1 -1
- package/engine/ecs/systems/TagSystem.js +17 -0
- package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +12 -16
- package/engine/ecs/transform/Transform.js +19 -6
- package/engine/graphics/GraphicsEngine.js +11 -6
- package/engine/graphics/composit/CompositLayer.js +17 -4
- package/engine/graphics/composit/CompositingStages.js +8 -0
- package/engine/graphics/composit/LayerCompositer.js +35 -6
- package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
- package/engine/graphics/ecs/light/Light.js +2 -0
- package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
- package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
- package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
- package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
- package/engine/graphics/material/manager/MaterialManager.js +2 -1
- package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +6 -4
- package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
- package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
- package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
- package/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -2
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +14 -25
- package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +90 -2
- package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +7 -7
- package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +15 -12
- package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -51
- package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +81 -48
- package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
- package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
- package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +148 -54
- package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
- package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +544 -164
- package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +15 -10
- package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
- package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
- package/engine/graphics/render/forward_plus/materials/FPlusDebugMaterial.js +3 -3
- package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
- package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
- package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
- package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
- package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +588 -53
- package/engine/graphics/render/forward_plus/prototypeLightManager.js +31 -6
- package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +10 -9
- package/engine/graphics/shaders/TerrainShader.js +4 -5
- package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
- package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -1
- package/engine/graphics/texture/sampler/Sampler2D.js +3 -1
- package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
- package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
- package/engine/graphics/util/composeMatrix4.js +33 -23
- package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
- package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
- package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
- package/engine/navigation/ecs/components/Path.js +0 -5
- package/package.json +1 -1
- package/view/minimap/gl/MinimapWorldGL.js +12 -5
- package/core/geom/3d/shape/CompositeShape.js +0 -60
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { System } from "../../System.js";
|
|
2
2
|
import { InstancedFoliage } from "../InstancedFoliage.js";
|
|
3
3
|
import { Cache } from "../../../../core/cache/Cache.js";
|
|
4
|
-
import {
|
|
4
|
+
import { InstancedMeshComponent } from "./InstancedMeshComponent.js";
|
|
5
5
|
import { guessAssetType } from "../../../asset/guessAssetType.js";
|
|
6
6
|
|
|
7
7
|
|
|
@@ -19,7 +19,7 @@ function cleanupLayer(layerData, renderLayer) {
|
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
*
|
|
22
|
-
* @param {
|
|
22
|
+
* @param {InstancedMeshLayer} layer
|
|
23
23
|
* @param {AssetManager} assetManager
|
|
24
24
|
* @returns {Promise<InstancedFoliage>}
|
|
25
25
|
*/
|
|
@@ -60,7 +60,7 @@ export function loadFoliageLayer(layer, assetManager) {
|
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
62
|
*
|
|
63
|
-
* @param {
|
|
63
|
+
* @param {InstancedMeshLayer} layer
|
|
64
64
|
* @param {Cache<string, Promise<InstancedFoliage>>} cache
|
|
65
65
|
* @param {AssetManager} assetManager
|
|
66
66
|
* @returns {Promise<InstancedFoliage>}
|
|
@@ -83,7 +83,7 @@ export class Foliage2System extends System {
|
|
|
83
83
|
* @param {AssetManager} assetManager
|
|
84
84
|
* @param {GraphicsEngine} graphicsEngine
|
|
85
85
|
* @constructor
|
|
86
|
-
* @extends {System.<
|
|
86
|
+
* @extends {System.<InstancedMeshComponent>}
|
|
87
87
|
*/
|
|
88
88
|
constructor(assetManager, graphicsEngine) {
|
|
89
89
|
super();
|
|
@@ -96,7 +96,7 @@ export class Foliage2System extends System {
|
|
|
96
96
|
*/
|
|
97
97
|
this.renderLayer = null;
|
|
98
98
|
|
|
99
|
-
this.dependencies = [
|
|
99
|
+
this.dependencies = [InstancedMeshComponent];
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
102
|
*
|
|
@@ -166,7 +166,7 @@ export class Foliage2System extends System {
|
|
|
166
166
|
|
|
167
167
|
/**
|
|
168
168
|
*
|
|
169
|
-
* @param {
|
|
169
|
+
* @param {InstancedMeshComponent} foliage
|
|
170
170
|
* @param entity
|
|
171
171
|
*/
|
|
172
172
|
link(foliage, entity) {
|
|
@@ -181,7 +181,7 @@ export class Foliage2System extends System {
|
|
|
181
181
|
for (let i = 0; i < layer_count; i++) {
|
|
182
182
|
/**
|
|
183
183
|
*
|
|
184
|
-
* @type {
|
|
184
|
+
* @type {InstancedMeshLayer}
|
|
185
185
|
*/
|
|
186
186
|
const foliage_layer = layerList.get(i);
|
|
187
187
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import List from "../../../../core/collection/list/List.js";
|
|
2
|
+
import { InstancedMeshLayer } from "./InstancedMeshLayer.js";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
export class InstancedMeshComponent {
|
|
6
|
+
constructor() {
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @type {List<InstancedMeshLayer>}
|
|
10
|
+
* @readonly
|
|
11
|
+
*/
|
|
12
|
+
this.layers = new List();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
toJSON() {
|
|
16
|
+
return this.layers.toJSON();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
fromJSON(data) {
|
|
20
|
+
this.layers.fromJSON(data, InstancedMeshLayer);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
dispose() {
|
|
24
|
+
|
|
25
|
+
const layers = this.layers;
|
|
26
|
+
const n = layers.length;
|
|
27
|
+
|
|
28
|
+
for (let i = 0; i < n; i++) {
|
|
29
|
+
const layer = layers.get(i);
|
|
30
|
+
|
|
31
|
+
layer.dispose();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
InstancedMeshComponent.typeName = "InstancedMeshComponent";
|
|
37
|
+
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
+
import { InstancedFoliage } from "../InstancedFoliage.js";
|
|
1
2
|
import ObservedString from "../../../../core/model/ObservedString.js";
|
|
2
|
-
import List from "../../../../core/collection/list/List.js";
|
|
3
3
|
import ObservedBoolean from "../../../../core/model/ObservedBoolean.js";
|
|
4
|
-
import {
|
|
4
|
+
import { computeHashIntegerArray } from "../../../../core/collection/array/computeHashIntegerArray.js";
|
|
5
5
|
import { Base64 } from "../../../../core/binary/Base64.js";
|
|
6
6
|
import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
|
|
7
|
-
import { computeHashIntegerArray } from "../../../../core/collection/array/computeHashIntegerArray.js";
|
|
8
7
|
|
|
9
|
-
export class
|
|
8
|
+
export class InstancedMeshLayer {
|
|
10
9
|
constructor() {
|
|
11
10
|
/**
|
|
12
11
|
*
|
|
@@ -22,12 +21,6 @@ export class FoliageLayer {
|
|
|
22
21
|
*/
|
|
23
22
|
this.modelURL = new ObservedString("");
|
|
24
23
|
|
|
25
|
-
/**
|
|
26
|
-
* @deprecated
|
|
27
|
-
* @type {ObservedString}
|
|
28
|
-
*/
|
|
29
|
-
this.dataURL = new ObservedString("");
|
|
30
|
-
|
|
31
24
|
/**
|
|
32
25
|
*
|
|
33
26
|
* @type {ObservedBoolean}
|
|
@@ -123,38 +116,3 @@ export class FoliageLayer {
|
|
|
123
116
|
this.data.deserialize(buffer);
|
|
124
117
|
}
|
|
125
118
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
export class Foliage2 {
|
|
129
|
-
constructor() {
|
|
130
|
-
/**
|
|
131
|
-
*
|
|
132
|
-
* @type {List<FoliageLayer>}
|
|
133
|
-
* @readonly
|
|
134
|
-
*/
|
|
135
|
-
this.layers = new List();
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
toJSON() {
|
|
139
|
-
return this.layers.toJSON();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
fromJSON(data) {
|
|
143
|
-
this.layers.fromJSON(data, FoliageLayer);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
dispose() {
|
|
147
|
-
|
|
148
|
-
const layers = this.layers;
|
|
149
|
-
const n = layers.length;
|
|
150
|
-
|
|
151
|
-
for (let i = 0; i < n; i++) {
|
|
152
|
-
const layer = layers.get(i);
|
|
153
|
-
|
|
154
|
-
layer.dispose();
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
Foliage2.typeName = "Foliage2";
|
|
160
|
-
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { BinaryClassSerializationAdapter } from "../../storage/binary/BinaryClassSerializationAdapter.js";
|
|
2
|
-
import {
|
|
2
|
+
import { InstancedMeshComponent } from "./InstancedMeshComponent.js";
|
|
3
|
+
import { InstancedMeshLayer } from "./InstancedMeshLayer.js";
|
|
3
4
|
|
|
4
5
|
export class InstancedMeshSerializationAdapter extends BinaryClassSerializationAdapter {
|
|
5
6
|
constructor() {
|
|
6
7
|
super();
|
|
7
8
|
|
|
8
|
-
this.klass =
|
|
9
|
+
this.klass = InstancedMeshComponent;
|
|
9
10
|
this.version = 0;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
*
|
|
14
15
|
* @param {BinaryBuffer} buffer
|
|
15
|
-
* @param {
|
|
16
|
+
* @param {InstancedMeshComponent} value
|
|
16
17
|
*/
|
|
17
18
|
serialize(buffer, value) {
|
|
18
19
|
value.layers.toBinaryBuffer(buffer);
|
|
@@ -21,10 +22,10 @@ export class InstancedMeshSerializationAdapter extends BinaryClassSerializationA
|
|
|
21
22
|
/**
|
|
22
23
|
*
|
|
23
24
|
* @param {BinaryBuffer} buffer
|
|
24
|
-
* @param {
|
|
25
|
+
* @param {InstancedMeshComponent} value
|
|
25
26
|
*/
|
|
26
27
|
deserialize(buffer, value) {
|
|
27
28
|
|
|
28
|
-
value.layers.fromBinaryBuffer(buffer,
|
|
29
|
+
value.layers.fromBinaryBuffer(buffer, InstancedMeshLayer);
|
|
29
30
|
}
|
|
30
31
|
}
|
|
@@ -2,13 +2,14 @@ import EntityBuilder from "../../EntityBuilder.js";
|
|
|
2
2
|
import { loadFoliageLayer } from "./Foliage2System.js";
|
|
3
3
|
import Mesh, { MeshFlags } from "../../../graphics/ecs/mesh/Mesh.js";
|
|
4
4
|
import { Transform } from "../../transform/Transform.js";
|
|
5
|
-
import {
|
|
5
|
+
import { InstancedMeshComponent } from "./InstancedMeshComponent.js";
|
|
6
6
|
import { InstancedFoliage } from "../InstancedFoliage.js";
|
|
7
7
|
import { buildTreeOptimizationTask } from "../../../../core/bvh2/BVHTasks.js";
|
|
8
8
|
import Task from "../../../../core/process/task/Task.js";
|
|
9
9
|
import TaskSignal from "../../../../core/process/task/TaskSignal.js";
|
|
10
10
|
import { countTask, promiseTask } from "../../../../core/process/task/TaskUtils.js";
|
|
11
11
|
import { assert } from "../../../../core/assert.js";
|
|
12
|
+
import { InstancedMeshLayer } from "./InstancedMeshLayer.js";
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Convert all existing instanced mesh components to individual Transform+Mesh pairs
|
|
@@ -23,7 +24,7 @@ export function convertInstancedMeshComponents2Entities(dataset, assetManager) {
|
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
*
|
|
26
|
-
* @param {
|
|
27
|
+
* @param {InstancedMeshComponent} foliage2
|
|
27
28
|
* @param entity
|
|
28
29
|
*/
|
|
29
30
|
function visitFoliageEntities(foliage2, entity) {
|
|
@@ -59,11 +60,11 @@ export function convertInstancedMeshComponents2Entities(dataset, assetManager) {
|
|
|
59
60
|
entitiesToStrip.push(entity);
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
dataset.traverseEntities([
|
|
63
|
+
dataset.traverseEntities([InstancedMeshComponent], visitFoliageEntities);
|
|
63
64
|
|
|
64
65
|
//remove converted foliage components
|
|
65
66
|
entitiesToStrip.forEach(function (entity) {
|
|
66
|
-
dataset.removeComponentFromEntity(entity,
|
|
67
|
+
dataset.removeComponentFromEntity(entity, InstancedMeshComponent);
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
70
|
|
|
@@ -125,7 +126,7 @@ export function optimizeIndividualMeshesEntitiesToInstances(dataset, threshold =
|
|
|
125
126
|
|
|
126
127
|
const tasks = [];
|
|
127
128
|
|
|
128
|
-
const foliage2 = new
|
|
129
|
+
const foliage2 = new InstancedMeshComponent();
|
|
129
130
|
|
|
130
131
|
const tBuild = new Task({
|
|
131
132
|
name: "Build Meshes",
|
|
@@ -213,7 +214,7 @@ export function optimizeIndividualMeshesEntitiesToInstances(dataset, threshold =
|
|
|
213
214
|
cycleFunction: function () {
|
|
214
215
|
|
|
215
216
|
//create foliage layer
|
|
216
|
-
const layer = new
|
|
217
|
+
const layer = new InstancedMeshLayer();
|
|
217
218
|
|
|
218
219
|
layer.data = instancedFoliage;
|
|
219
220
|
layer.modelURL.set(modelURL);
|
|
@@ -12,6 +12,7 @@ import { BlendingType } from "../../graphics/texture/sampler/BlendingType.js";
|
|
|
12
12
|
import { FogOfWarRenderer } from "./shader/FogOfWarRenderer.js";
|
|
13
13
|
import { StandardFrameBuffers } from "../../graphics/StandardFrameBuffers.js";
|
|
14
14
|
import { CompositLayer } from "../../graphics/composit/CompositLayer.js";
|
|
15
|
+
import { CompositingStages } from "../../graphics/composit/CompositingStages.js";
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
const frustum = new Frustum();
|
|
@@ -133,6 +134,7 @@ export class FogOfWarSystem extends System {
|
|
|
133
134
|
|
|
134
135
|
const compositerLayer = graphics.layerComposer.createLayer({}, BlendingType.Normal);
|
|
135
136
|
compositerLayer.name = 'Fog of War';
|
|
137
|
+
compositerLayer.stage = CompositingStages.POST_TRANSPARENT;
|
|
136
138
|
|
|
137
139
|
// Fog of war should be drawn last typically, over everything else, so we set order to a large number
|
|
138
140
|
compositerLayer.order = 1000;
|
|
@@ -144,7 +144,9 @@ class HeadsUpDisplaySystem extends System {
|
|
|
144
144
|
up.set(worldPositionX, worldPositionY + 1, worldPositionZ, 1);
|
|
145
145
|
up.threeApplyMatrix4(projectionMatrix);
|
|
146
146
|
|
|
147
|
+
// compute perspective divide
|
|
147
148
|
const d = 1 / Math.abs(up.w);
|
|
149
|
+
|
|
148
150
|
up.x *= d;
|
|
149
151
|
up.y *= d;
|
|
150
152
|
up.z *= d;
|
|
@@ -37,7 +37,7 @@ export class BinarySerializationRegistry {
|
|
|
37
37
|
* @returns {boolean}
|
|
38
38
|
*/
|
|
39
39
|
registerAdapter(adapter, className) {
|
|
40
|
-
assert.
|
|
40
|
+
assert.defined(adapter, 'adapter');
|
|
41
41
|
assert.ok(adapter.isBinaryClassSerializationAdapter, 'adapter is not a BinaryClassSerializationAdapter');
|
|
42
42
|
|
|
43
43
|
if (className === undefined) {
|
|
@@ -13,6 +13,23 @@ class TagSystem extends System {
|
|
|
13
13
|
|
|
14
14
|
this.entityManager = null;
|
|
15
15
|
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @param {string} tag
|
|
20
|
+
* @param {EntityComponentDataset} ecd
|
|
21
|
+
* @returns {number[]}
|
|
22
|
+
*/
|
|
23
|
+
static find_entities_with_tag(tag, ecd) {
|
|
24
|
+
const r = [];
|
|
25
|
+
ecd.traverseComponents(Tag, (t, e) => {
|
|
26
|
+
if (t.contains(tag)) {
|
|
27
|
+
r.push(e);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
return r;
|
|
32
|
+
}
|
|
16
33
|
}
|
|
17
34
|
|
|
18
35
|
|
|
@@ -5,6 +5,7 @@ import { Cache } from "../../../../../core/cache/Cache.js";
|
|
|
5
5
|
import { computeUTF8StringByteSize } from "../../../../../core/primitives/strings/StringUtils.js";
|
|
6
6
|
import Signal from "../../../../../core/events/signal/Signal.js";
|
|
7
7
|
import { computeStringHash } from "../../../../../core/primitives/strings/computeStringHash.js";
|
|
8
|
+
import { copy_Sampler2D_channel_data } from "../../../../graphics/texture/sampler/copy_Sampler2D_channel_data.js";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
*
|
|
@@ -107,33 +108,28 @@ export class TerrainLayer {
|
|
|
107
108
|
.then(assert => {
|
|
108
109
|
const image = assert.create();
|
|
109
110
|
|
|
110
|
-
const
|
|
111
|
+
const source_item_size = image.itemSize;
|
|
111
112
|
|
|
112
|
-
const
|
|
113
|
+
const source_data = image.data;
|
|
114
|
+
|
|
115
|
+
// RGB
|
|
116
|
+
const destination_item_size = 3;
|
|
113
117
|
|
|
114
118
|
if (this.diffuse === null || this.diffuse.width !== image.width || this.diffuse.height !== image.height) {
|
|
115
119
|
// loaded image does not match the side of the layer
|
|
116
|
-
this.diffuse = Sampler2D.uint8(
|
|
120
|
+
this.diffuse = Sampler2D.uint8(destination_item_size, image.width, image.height);
|
|
117
121
|
}
|
|
118
122
|
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
// copy RGBA image data into the layer's RGB data
|
|
123
|
+
const source = new Sampler2D(source_data,source_item_size,image.width, image.height);
|
|
122
124
|
|
|
123
|
-
|
|
124
|
-
const a4 = i * 4;
|
|
125
|
-
const a3 = i * 3;
|
|
126
|
-
|
|
127
|
-
layerData[a3] = data[a4];
|
|
128
|
-
layerData[a3 + 1] = data[a4 + 1];
|
|
129
|
-
layerData[a3 + 2] = data[a4 + 2];
|
|
130
|
-
}
|
|
125
|
+
copy_Sampler2D_channel_data(source,this.diffuse);
|
|
131
126
|
|
|
132
127
|
this.onChanged.send0();
|
|
133
128
|
|
|
134
|
-
|
|
129
|
+
// write to cache
|
|
130
|
+
const cacheCopy = Sampler2D.uint8(destination_item_size, image.width, image.height);
|
|
135
131
|
|
|
136
|
-
cacheCopy.data.set(
|
|
132
|
+
cacheCopy.data.set(this.diffuse.data);
|
|
137
133
|
|
|
138
134
|
cache.put(path, cacheCopy);
|
|
139
135
|
|
|
@@ -5,14 +5,13 @@
|
|
|
5
5
|
import Vector3 from "../../../core/geom/Vector3.js";
|
|
6
6
|
import Quaternion from "../../../core/geom/Quaternion.js";
|
|
7
7
|
import { Matrix4 } from "../../../core/geom/Matrix4.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { compose_matrix4_array } from "../../graphics/util/composeMatrix4.js";
|
|
9
|
+
import { decompose_matrix_4_array } from "../../graphics/util/decompose_matrix_4_array.js";
|
|
10
10
|
|
|
11
11
|
const delta = new Vector3();
|
|
12
12
|
|
|
13
13
|
const m4_0 = new Matrix4();
|
|
14
14
|
const m4_1 = new Matrix4();
|
|
15
|
-
const threeQuaternion = new ThreeQuaternion();
|
|
16
15
|
|
|
17
16
|
export class Transform {
|
|
18
17
|
/**
|
|
@@ -166,9 +165,15 @@ export class Transform {
|
|
|
166
165
|
* @param {Matrix4} matrix
|
|
167
166
|
*/
|
|
168
167
|
fromThreeMatrix4(matrix) {
|
|
169
|
-
|
|
168
|
+
this.fromMatrix4(matrix.elements);
|
|
169
|
+
}
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
/**
|
|
172
|
+
*
|
|
173
|
+
* @param {mat4|number[]|Float32Array} m
|
|
174
|
+
*/
|
|
175
|
+
fromMatrix4(m) {
|
|
176
|
+
decompose_matrix_4_array(m, this.position, this.rotation, this.scale);
|
|
172
177
|
}
|
|
173
178
|
|
|
174
179
|
/**
|
|
@@ -176,7 +181,15 @@ export class Transform {
|
|
|
176
181
|
* @param {Matrix4} matrix
|
|
177
182
|
*/
|
|
178
183
|
toThreeMatrix(matrix) {
|
|
179
|
-
|
|
184
|
+
this.toMatrix4(matrix.elements);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
*
|
|
189
|
+
* @param {number[]|Float32Array} result
|
|
190
|
+
*/
|
|
191
|
+
toMatrix4(result) {
|
|
192
|
+
compose_matrix4_array(result, this.position, this.rotation, this.scale);
|
|
180
193
|
}
|
|
181
194
|
}
|
|
182
195
|
|
|
@@ -40,6 +40,7 @@ import { ShadowMapRenderer } from "./shadows/ShadowMapRenderer.js";
|
|
|
40
40
|
import { CameraViewManager } from "./render/view/CameraViewManager.js";
|
|
41
41
|
import { StandardFrameBuffers } from "./StandardFrameBuffers.js";
|
|
42
42
|
import { load_environment_map } from "./texture/cubemap/load_environment_map.js";
|
|
43
|
+
import { CompositingStages } from "./composit/CompositingStages.js";
|
|
43
44
|
|
|
44
45
|
/**
|
|
45
46
|
*
|
|
@@ -96,7 +97,13 @@ function GraphicsEngine(camera, entityManger) {
|
|
|
96
97
|
preRender: new Signal(),
|
|
97
98
|
postRender: new Signal(),
|
|
98
99
|
|
|
100
|
+
/**
|
|
101
|
+
* @deprecated
|
|
102
|
+
*/
|
|
99
103
|
preComposite: new Signal(),
|
|
104
|
+
/**
|
|
105
|
+
* @deprecated
|
|
106
|
+
*/
|
|
100
107
|
postComposite: new Signal(),
|
|
101
108
|
|
|
102
109
|
buffersRendered: new Signal(),
|
|
@@ -370,7 +377,7 @@ GraphicsEngine.prototype.start = function () {
|
|
|
370
377
|
const domElement = this.domElement = webGLRenderer.domElement;
|
|
371
378
|
//disable selection
|
|
372
379
|
const style = domElement.style;
|
|
373
|
-
domElement.classList.add("
|
|
380
|
+
domElement.classList.add("graphics-engine-render-canvas");
|
|
374
381
|
style.userSelect = style.webkitUserSelect = style.mozUserSelect = "none";
|
|
375
382
|
// see : https://www.w3.org/TR/pointerevents/#the-touch-action-css-property
|
|
376
383
|
style.touchAction = "none";
|
|
@@ -628,16 +635,14 @@ GraphicsEngine.prototype.render = function (renderTarget) {
|
|
|
628
635
|
//do the opaque pass
|
|
629
636
|
this.renderOpaque();
|
|
630
637
|
|
|
638
|
+
this.layerComposer.composite(renderer, CompositingStages.POST_OPAQUE);
|
|
639
|
+
|
|
631
640
|
this.on.buffersRendered.send3(renderer, camera, scene);
|
|
632
641
|
|
|
633
642
|
// transparent pass
|
|
634
643
|
this.renderTransparent();
|
|
635
644
|
|
|
636
|
-
this.
|
|
637
|
-
|
|
638
|
-
this.layerComposer.composite(renderer);
|
|
639
|
-
|
|
640
|
-
this.on.postComposite.send3(renderer, camera, scene);
|
|
645
|
+
this.layerComposer.composite(renderer, CompositingStages.POST_TRANSPARENT);
|
|
641
646
|
|
|
642
647
|
|
|
643
648
|
//dispatch post-render event
|
|
@@ -5,6 +5,7 @@ import { blendingType2three } from "../texture/sampler/blendingType2Three.js";
|
|
|
5
5
|
import { ScreenSpaceQuadShader } from "../shaders/ScreenSpaceQuadShader.js";
|
|
6
6
|
import { BlendingType } from "../texture/sampler/BlendingType.js";
|
|
7
7
|
import { FULL_SCREEN_TRIANGLE_GEOMETRY } from "../geometry/FULL_SCREEN_TRIANGLE_GEOMETRY.js";
|
|
8
|
+
import Signal from "../../../core/events/signal/Signal.js";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
*
|
|
@@ -29,11 +30,15 @@ function assignMaterialBlending(material, blending) {
|
|
|
29
30
|
export class CompositLayer {
|
|
30
31
|
/**
|
|
31
32
|
*
|
|
32
|
-
* @param {WebGLRenderTarget} renderTarget
|
|
33
|
+
* @param {THREE.WebGLRenderTarget} renderTarget
|
|
33
34
|
* @param {BlendingType} blending
|
|
34
35
|
* @param {number} renderTargetScale
|
|
35
36
|
*/
|
|
36
|
-
constructor({
|
|
37
|
+
constructor({
|
|
38
|
+
renderTarget,
|
|
39
|
+
blending,
|
|
40
|
+
renderTargetScale = 1
|
|
41
|
+
}) {
|
|
37
42
|
/**
|
|
38
43
|
* Human-readable name, useful for debugging
|
|
39
44
|
* @type {string}
|
|
@@ -57,9 +62,13 @@ export class CompositLayer {
|
|
|
57
62
|
*/
|
|
58
63
|
this.renderTargetScale = renderTargetScale;
|
|
59
64
|
|
|
60
|
-
|
|
65
|
+
this.object = new Mesh(FULL_SCREEN_TRIANGLE_GEOMETRY, this.buildMaterial());
|
|
61
66
|
|
|
62
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Which compositing stage this layer belongs to, stages are rendered independently
|
|
69
|
+
* @type {number}
|
|
70
|
+
*/
|
|
71
|
+
this.stage = 0;
|
|
63
72
|
|
|
64
73
|
this.size = new Vector2();
|
|
65
74
|
|
|
@@ -74,6 +83,10 @@ export class CompositLayer {
|
|
|
74
83
|
* @type {number}
|
|
75
84
|
*/
|
|
76
85
|
this.__order = 0;
|
|
86
|
+
|
|
87
|
+
this.on = {
|
|
88
|
+
preRender: new Signal()
|
|
89
|
+
};
|
|
77
90
|
}
|
|
78
91
|
|
|
79
92
|
/**
|
|
@@ -52,8 +52,6 @@ class LayerCompositer {
|
|
|
52
52
|
|
|
53
53
|
layer.renderTarget.dispose();
|
|
54
54
|
|
|
55
|
-
this.scene.remove(layer.object);
|
|
56
|
-
|
|
57
55
|
return true;
|
|
58
56
|
}
|
|
59
57
|
|
|
@@ -113,8 +111,6 @@ class LayerCompositer {
|
|
|
113
111
|
|
|
114
112
|
this.layerTargets.push(layer);
|
|
115
113
|
|
|
116
|
-
this.scene.add(layer.object);
|
|
117
|
-
|
|
118
114
|
return true;
|
|
119
115
|
}
|
|
120
116
|
|
|
@@ -138,13 +134,46 @@ class LayerCompositer {
|
|
|
138
134
|
|
|
139
135
|
/**
|
|
140
136
|
*
|
|
141
|
-
* @param {
|
|
137
|
+
* @param {number} stage
|
|
138
|
+
* @private
|
|
142
139
|
*/
|
|
143
|
-
|
|
140
|
+
__prepare_scene_for_stage(stage) {
|
|
141
|
+
const layers = this.layerTargets;
|
|
142
|
+
const layer_count = layers.length;
|
|
143
|
+
|
|
144
|
+
const scene = this.scene;
|
|
145
|
+
|
|
146
|
+
let child_count = 0;
|
|
147
|
+
|
|
148
|
+
for (let i = 0; i < layer_count; i++) {
|
|
149
|
+
const layer = layers[i];
|
|
150
|
+
|
|
151
|
+
if (layer.stage !== stage) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
scene.children[child_count++] = layer.object;
|
|
156
|
+
|
|
157
|
+
layer.on.preRender.send0();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
scene.children.length = child_count;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
*
|
|
165
|
+
* @param {THREE.WebGLRenderer} renderer
|
|
166
|
+
* @param {number} stage
|
|
167
|
+
*/
|
|
168
|
+
composite(renderer, stage) {
|
|
169
|
+
assert.isNonNegativeInteger(stage, 'stage');
|
|
170
|
+
|
|
144
171
|
if (!this.hasActiveLayers()) {
|
|
145
172
|
return;
|
|
146
173
|
}
|
|
147
174
|
|
|
175
|
+
this.__prepare_scene_for_stage(stage);
|
|
176
|
+
|
|
148
177
|
const camera = this.camera;
|
|
149
178
|
const scene = this.scene;
|
|
150
179
|
|
|
@@ -7,6 +7,7 @@ import { HighlightRenderGroup } from "../renderer/HighlightRenderGroup.js";
|
|
|
7
7
|
import { ObjectPoolFactory } from "../../../../../core/model/object/ObjectPoolFactory.js";
|
|
8
8
|
import { HighlightRenderElement } from "../renderer/HighlightRenderElement.js";
|
|
9
9
|
import { noop } from "../../../../../core/function/Functions.js";
|
|
10
|
+
import { CompositingStages } from "../../../composit/CompositingStages.js";
|
|
10
11
|
|
|
11
12
|
export class OutlineRenderPlugin extends EnginePlugin {
|
|
12
13
|
constructor() {
|
|
@@ -99,12 +100,14 @@ export class OutlineRenderPlugin extends EnginePlugin {
|
|
|
99
100
|
|
|
100
101
|
/**
|
|
101
102
|
*
|
|
102
|
-
* @param {WebGLRenderer} renderer
|
|
103
|
-
* @param {Camera} camera
|
|
104
|
-
* @param {ThreeScene} scene
|
|
105
103
|
* @private
|
|
106
104
|
*/
|
|
107
|
-
__render(
|
|
105
|
+
__render() {
|
|
106
|
+
const engine = this.engine;
|
|
107
|
+
const graphics = engine.graphics;
|
|
108
|
+
|
|
109
|
+
const camera = graphics.camera;
|
|
110
|
+
|
|
108
111
|
// collect elements
|
|
109
112
|
const source_count = this.__sources.length;
|
|
110
113
|
|
|
@@ -139,11 +142,12 @@ export class OutlineRenderPlugin extends EnginePlugin {
|
|
|
139
142
|
|
|
140
143
|
viewport_size.process(this.__set_viewport_size, this);
|
|
141
144
|
|
|
142
|
-
graphics.on.preComposite.add(this.__render, this);
|
|
143
|
-
|
|
144
145
|
// create compositing layer
|
|
145
146
|
this.__compositing_layer = graphics.layerComposer.createLayer(this.__renderer.__renderTargetFinal, BlendingType.MultiplyAdd);
|
|
146
147
|
this.__compositing_layer.name = "Silhouette Outline";
|
|
148
|
+
this.__compositing_layer.stage = CompositingStages.POST_TRANSPARENT;
|
|
149
|
+
|
|
150
|
+
graphics.on.preRender.add(this.__render, this);
|
|
147
151
|
|
|
148
152
|
|
|
149
153
|
// set rendering resolution
|
|
@@ -156,7 +160,7 @@ export class OutlineRenderPlugin extends EnginePlugin {
|
|
|
156
160
|
|
|
157
161
|
const graphics = this.engine.graphics;
|
|
158
162
|
|
|
159
|
-
graphics.on.
|
|
163
|
+
graphics.on.preRender.remove(this.__render, this);
|
|
160
164
|
|
|
161
165
|
graphics.viewport.size.onChanged.remove(this.__set_viewport_size, this);
|
|
162
166
|
|