@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.
Files changed (126) hide show
  1. package/core/binary/BitSet.js +151 -167
  2. package/core/binary/BitSet.spec.js +99 -1
  3. package/core/binary/ValidatingBitSetWrapper.js +81 -0
  4. package/core/bvh2/aabb3/AABB3.js +3 -10
  5. package/core/bvh2/binary/IndexedBinaryBVH.js +1 -1
  6. package/core/bvh2/traversal/ThreeClippingPlaneComputingBVHVisitor.js +5 -1
  7. package/core/bvh2/traversal/__detailed_box_volume_intersection.js +22 -5
  8. package/core/cache/Cache.d.ts +4 -2
  9. package/core/cache/Cache.js +5 -2
  10. package/core/collection/HashMap.d.ts +9 -2
  11. package/core/collection/HashSet.d.ts +7 -2
  12. package/core/collection/HashSet.js +7 -2
  13. package/core/collection/array/binarySearchHighIndex.js +1 -1
  14. package/core/collection/array/copyArray.js +2 -2
  15. package/core/collection/array/typed/typed_array_copy.js +1 -1
  16. package/core/geom/3d/frustum/array_setFromProjectionMatrix.js +3 -3
  17. package/core/geom/3d/normal/hemioct/unit_hemioct.spec.js +1 -1
  18. package/core/geom/3d/shape/AbstractShape3D.js +37 -1
  19. package/core/geom/3d/shape/TransformedShape3D.js +121 -10
  20. package/core/geom/3d/shape/TransformedShape3D.spec.js +33 -0
  21. package/core/geom/3d/shape/UnionShape3D.js +255 -0
  22. package/core/geom/3d/shape/UnitCubeShape3D.js +88 -0
  23. package/core/geom/3d/shape/UnitCubeShape3D.spec.js +42 -0
  24. package/core/geom/3d/shape/UnitSphereShape3D.js +39 -0
  25. package/core/geom/3d/shape/util/compute_signed_distance_gradient_by_sampling.js +48 -0
  26. package/core/geom/3d/shape/util/shape_to_visual_entity.js +159 -0
  27. package/core/geom/random/randomPointInSphere.js +3 -2
  28. package/core/json/resolvePathByArray.js +2 -2
  29. package/core/model/ObservedBoolean.d.ts +2 -0
  30. package/core/parser/simple/Token.d.ts +13 -0
  31. package/core/parser/simple/Token.js +61 -27
  32. package/{engine/graphics/render/forward_plus/materials → core/primitives/strings}/insert_after.js +3 -0
  33. package/core/primitives/strings/insert_after_or_replace.js +27 -0
  34. package/editor/process/symbolic/makeHelperBoxGeometry.js +44 -0
  35. package/editor/tools/FoliagePaintTool.js +4 -4
  36. package/editor/view/ecs/EntityEditor.js +2 -2
  37. package/editor/view/ecs/components/particles/ParticleEmitterController.js +2 -2
  38. package/engine/EngineHarness.js +1 -0
  39. package/engine/animation/AnimationUtils.js +5 -5
  40. package/engine/asset/loaders/GLTFAssetLoader.js +52 -1
  41. package/engine/asset/loaders/image/ImageDecoderWorker.js +4 -3
  42. package/engine/asset/loaders/image/ImageRGBADataAsset.js +3 -2
  43. package/engine/asset/loaders/image/ImageRGBADataLoader.js +3 -3
  44. package/engine/asset/loaders/image/codec/NativeImageDecoder.js +2 -1
  45. package/engine/asset/loaders/image/png/PNG.js +113 -6
  46. package/engine/asset/loaders/image/png/PNGReader.js +5 -0
  47. package/engine/asset/loaders/material/bitmap2sampler_gl.js +1 -1
  48. package/engine/asset/loaders/material/computeImageBitmapEquality.js +6 -1
  49. package/engine/asset/loaders/material/computeTextureEquality.js +40 -49
  50. package/engine/ecs/EntityBuilder.js +25 -5
  51. package/engine/ecs/EntityComponentDataset.js +1 -1
  52. package/engine/ecs/attachment/AttachmentBinding.js +8 -0
  53. package/engine/ecs/attachment/AttachmentSystem.js +4 -0
  54. package/engine/ecs/attachment/TransformAttachmentBinding.js +14 -44
  55. package/engine/ecs/components/Tag.js +27 -6
  56. package/engine/ecs/foliage/InstancedFoliage.js +277 -266
  57. package/engine/ecs/foliage/ecs/Foliage2System.js +7 -7
  58. package/engine/ecs/foliage/ecs/InstancedMeshComponent.js +37 -0
  59. package/engine/ecs/foliage/ecs/{Foliage2.js → InstancedMeshLayer.js} +3 -45
  60. package/engine/ecs/foliage/ecs/InstancedMeshSerializationAdapter.js +6 -5
  61. package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +7 -6
  62. package/engine/ecs/fow/FogOfWar.js +4 -0
  63. package/engine/ecs/fow/FogOfWarSystem.js +2 -0
  64. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +2 -0
  65. package/engine/ecs/storage/binary/BinarySerializationRegistry.js +1 -1
  66. package/engine/ecs/system/AbstractContextSystem.js +1 -1
  67. package/engine/ecs/systems/TagSystem.js +17 -0
  68. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +12 -16
  69. package/engine/ecs/transform/Transform.js +19 -6
  70. package/engine/graphics/GraphicsEngine.js +11 -6
  71. package/engine/graphics/composit/CompositLayer.js +17 -4
  72. package/engine/graphics/composit/CompositingStages.js +8 -0
  73. package/engine/graphics/composit/LayerCompositer.js +35 -6
  74. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +11 -7
  75. package/engine/graphics/ecs/light/Light.js +2 -0
  76. package/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +5 -1
  77. package/engine/graphics/ecs/mesh-v2/DrawMode.js +5 -0
  78. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +32 -18
  79. package/engine/graphics/geometry/instancing/InstancedMeshGroup.js +14 -72
  80. package/engine/graphics/geometry/instancing/rewriteMaterial.js +70 -0
  81. package/engine/graphics/material/manager/MaterialManager.js +2 -1
  82. package/engine/graphics/micron/render/instanced/AttributeDataTexture.js +6 -4
  83. package/engine/graphics/micron/render/instanced/ThreeInstancedAdapter.js +0 -2
  84. package/engine/graphics/particles/ParticleEmitterLibrary.js +3 -0
  85. package/engine/graphics/particles/ecs/{ParticleEmitterSystem2.js → ParticleEmitterSystem.js} +17 -9
  86. package/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -2
  87. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +14 -25
  88. package/engine/graphics/particles/particular/engine/emitter/ParticleEmitterFlag.js +5 -0
  89. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +90 -2
  90. package/engine/graphics/particles/particular/engine/emitter/ParticlePool.spec.js +7 -7
  91. package/engine/graphics/particles/particular/engine/renderers/billboard/BILLBOARD_PARTICLE_SPECIFICATION.js +15 -12
  92. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +262 -51
  93. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +81 -48
  94. package/engine/graphics/particles/particular/engine/shader/debugAtlas.js +14 -0
  95. package/engine/graphics/particles/particular/engine/utils/volume/AttributeValue.js +141 -0
  96. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.js +148 -54
  97. package/engine/graphics/particles/particular/engine/utils/volume/lut_to_sampler.js +27 -0
  98. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +544 -164
  99. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +15 -10
  100. package/engine/graphics/render/forward_plus/materials/FP_INJECTION_POINT_ACCUMULATION.js +1 -0
  101. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +32 -0
  102. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_DECODE_PARS.js +51 -0
  103. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_PREAMBLE.js +25 -0
  104. package/engine/graphics/render/forward_plus/materials/FPlusDebugMaterial.js +3 -3
  105. package/engine/graphics/render/forward_plus/materials/ForwardPlusThreeMaterial.js +1 -1
  106. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +31 -120
  107. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_lighting_shared.js +35 -0
  108. package/engine/graphics/render/forward_plus/materials/fp_build_vertex_shader.js +4 -5
  109. package/engine/graphics/render/forward_plus/plugin/MaterialTransformer.js +10 -3
  110. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +588 -53
  111. package/engine/graphics/render/forward_plus/prototypeLightManager.js +31 -6
  112. package/engine/graphics/render/forward_plus/query/point_light_inside_volume.js +10 -9
  113. package/engine/graphics/shaders/TerrainShader.js +4 -5
  114. package/engine/graphics/shadows/ShadowMapRenderer.js +8 -2
  115. package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +12 -1
  116. package/engine/graphics/texture/sampler/Sampler2D.js +3 -1
  117. package/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +1 -1
  118. package/engine/graphics/texture/sampler/copy_Sampler2D_channel_data.js +66 -0
  119. package/engine/graphics/util/composeMatrix4.js +33 -23
  120. package/engine/graphics/util/decompose_matrix_4_array.js +61 -0
  121. package/engine/intelligence/behavior/ecs/BehaviorComponent.js +30 -14
  122. package/engine/knowledge/database/StaticKnowledgeDataTable.js +6 -1
  123. package/engine/navigation/ecs/components/Path.js +0 -5
  124. package/package.json +1 -1
  125. package/view/minimap/gl/MinimapWorldGL.js +12 -5
  126. 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 { Foliage2 } from "./Foliage2.js";
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 {FoliageLayer} layer
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 {FoliageLayer} layer
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.<Foliage2>}
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 = [Foliage2];
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 {Foliage2} foliage
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 {FoliageLayer}
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 { InstancedFoliage } from "../InstancedFoliage.js";
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 FoliageLayer {
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 { Foliage2, FoliageLayer } from "./Foliage2.js";
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 = Foliage2;
9
+ this.klass = InstancedMeshComponent;
9
10
  this.version = 0;
10
11
  }
11
12
 
12
13
  /**
13
14
  *
14
15
  * @param {BinaryBuffer} buffer
15
- * @param {Foliage2} value
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 {Foliage2} value
25
+ * @param {InstancedMeshComponent} value
25
26
  */
26
27
  deserialize(buffer, value) {
27
28
 
28
- value.layers.fromBinaryBuffer(buffer, FoliageLayer);
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 { Foliage2, FoliageLayer } from "./Foliage2.js";
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 {Foliage2} foliage2
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([Foliage2], visitFoliageEntities);
63
+ dataset.traverseEntities([InstancedMeshComponent], visitFoliageEntities);
63
64
 
64
65
  //remove converted foliage components
65
66
  entitiesToStrip.forEach(function (entity) {
66
- dataset.removeComponentFromEntity(entity, Foliage2);
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 Foliage2();
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 FoliageLayer();
217
+ const layer = new InstancedMeshLayer();
217
218
 
218
219
  layer.data = instancedFoliage;
219
220
  layer.modelURL.set(modelURL);
@@ -75,6 +75,10 @@ export class FogOfWar {
75
75
  */
76
76
  this.texture = null;
77
77
 
78
+ /**
79
+ * Resolution scale of FoW versus terrain resolution, higher number makes FoW more detailed
80
+ * @type {Vector1}
81
+ */
78
82
  this.scale = new Vector1(1);
79
83
 
80
84
  /**
@@ -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.notEqual(adapter, undefined, 'adapter is undefined');
40
+ assert.defined(adapter, 'adapter');
41
41
  assert.ok(adapter.isBinaryClassSerializationAdapter, 'adapter is not a BinaryClassSerializationAdapter');
42
42
 
43
43
  if (className === undefined) {
@@ -38,7 +38,7 @@ export class AbstractContextSystem extends System {
38
38
  // TODO
39
39
  },
40
40
  (ctx) => {
41
- ctx.unlink();
41
+ //ctx.unlink();
42
42
  }
43
43
  );
44
44
 
@@ -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 s = image.width * image.height;
111
+ const source_item_size = image.itemSize;
111
112
 
112
- const data = image.data;
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(3, image.width, image.height);
120
+ this.diffuse = Sampler2D.uint8(destination_item_size, image.width, image.height);
117
121
  }
118
122
 
119
- const layerData = this.diffuse.data;
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
- for (let i = 0; i < s; i++) {
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
- const cacheCopy = Sampler2D.uint8(3, image.width, image.height);
129
+ // write to cache
130
+ const cacheCopy = Sampler2D.uint8(destination_item_size, image.width, image.height);
135
131
 
136
- cacheCopy.data.set(layerData);
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 { Quaternion as ThreeQuaternion } from "three";
9
- import { composeMatrix4 } from "../../graphics/util/composeMatrix4.js";
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
- matrix.decompose(this.position, threeQuaternion, this.scale);
168
+ this.fromMatrix4(matrix.elements);
169
+ }
170
170
 
171
- this.rotation.copy(threeQuaternion);
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
- composeMatrix4(matrix, this.position, this.rotation, this.scale);
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("renderer-engine-render-canvas");
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.on.preComposite.send3(renderer, camera, scene);
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({ renderTarget, blending, renderTargetScale = 1 }) {
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
- const material = this.buildMaterial();
65
+ this.object = new Mesh(FULL_SCREEN_TRIANGLE_GEOMETRY, this.buildMaterial());
61
66
 
62
- this.object = new Mesh(FULL_SCREEN_TRIANGLE_GEOMETRY, material);
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
  /**
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @readonly
3
+ * @enum {number}
4
+ */
5
+ export const CompositingStages = {
6
+ POST_OPAQUE: 1,
7
+ POST_TRANSPARENT: 0
8
+ }
@@ -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 {WebGLRenderer} renderer
137
+ * @param {number} stage
138
+ * @private
142
139
  */
143
- composite(renderer) {
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(renderer, camera, scene) {
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.preComposite.remove(this.__render, this);
163
+ graphics.on.preRender.remove(this.__render, this);
160
164
 
161
165
  graphics.viewport.size.onChanged.remove(this.__set_viewport_size, this);
162
166