@woosh/meep-engine 2.33.57 → 2.33.61

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 (95) hide show
  1. package/core/bvh2/aabb3/AABB3.js +4 -1
  2. package/core/bvh2/traversal/traverseBinaryNodeUsingVisitor.js +6 -6
  3. package/core/cache/Cache.js +7 -0
  4. package/core/collection/array/fastArrayEquals.js +17 -0
  5. package/core/collection/array/typed/is_typed_array_equals.js +58 -0
  6. package/core/collection/map/AbstractAsyncMap.js +30 -0
  7. package/core/collection/map/AsyncMapWrapper.js +16 -0
  8. package/core/collection/map/AsyncRemoteHashMap.js +358 -0
  9. package/core/collection/map/CachedAsyncMap.js +34 -0
  10. package/core/geom/3d/SurfacePoint3.js +44 -5
  11. package/core/geom/Vector2.d.ts +2 -0
  12. package/core/geom/Vector4.js +5 -5
  13. package/core/geom/packing/MaxRectangles.js +13 -4
  14. package/core/math/hash/murmur3_32.js +3 -3
  15. package/engine/animation/removeEntityGenericEffect.js +22 -31
  16. package/engine/asset/Asset.js +0 -45
  17. package/engine/asset/AssetDescription.js +51 -0
  18. package/engine/asset/AssetManager.d.ts +7 -0
  19. package/engine/asset/AssetManager.js +98 -2
  20. package/engine/asset/AssetTransformer.d.ts +5 -0
  21. package/engine/asset/AssetTransformer.js +15 -0
  22. package/engine/asset/loaders/GLTFAssetLoader.js +27 -25
  23. package/engine/asset/loaders/material/computeImageBitmapEquality.js +2 -2
  24. package/engine/asset/loaders/material/computeTextureEquality.js +2 -2
  25. package/engine/asset/loaders/material/computeTextureHash.js +7 -13
  26. package/engine/ecs/attachment/AttachmentSystem.js +18 -17
  27. package/engine/ecs/grid/HeightMap2NormalMap.js +1 -1
  28. package/engine/ecs/grid/NormalMap2AOMap.js +1 -1
  29. package/engine/ecs/gui/GUIElement.js +0 -106
  30. package/engine/ecs/gui/GUIElementSerializationAdapter.js +108 -0
  31. package/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +60 -45
  32. package/engine/ecs/gui/position/ViewportPositionSystem.js +5 -5
  33. package/engine/ecs/parent/EntityNode.d.ts +20 -0
  34. package/engine/ecs/parent/EntityNode.js +284 -0
  35. package/engine/ecs/parent/FaceEditor.js +137 -0
  36. package/engine/ecs/parent/testCompositionEntityNode.js +153 -0
  37. package/engine/ecs/parent/testHuDPerf.js +123 -0
  38. package/engine/ecs/storage/binary/BinaryClassUpgrader.js +1 -0
  39. package/engine/ecs/terrain/ecs/Terrain.js +14 -5
  40. package/engine/ecs/util/removeComponentsExcept.js +3 -3
  41. package/engine/graphics/GraphicsEngine.js +4 -5
  42. package/engine/graphics/camera/testClippingPlaneComputation.js +0 -4
  43. package/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +0 -1
  44. package/engine/graphics/ecs/camera/topdown/TopDownCameraController.spec.js +8 -0
  45. package/engine/graphics/ecs/light/LightSystem.js +1 -1
  46. package/engine/graphics/ecs/mesh/Mesh.js +5 -5
  47. package/engine/graphics/ecs/mesh/MeshSystem.js +12 -20
  48. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +29 -0
  49. package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +158 -1
  50. package/engine/graphics/ecs/path/PathDisplaySystem.d.ts +3 -1
  51. package/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
  52. package/engine/graphics/ecs/trail2d/Trail2D.js +35 -1
  53. package/engine/graphics/ecs/trail2d/Trail2DSystem.js +26 -19
  54. package/engine/graphics/ecs/trail2d/makeGradientTrail.js +68 -0
  55. package/engine/graphics/geometry/buffered/query/GeometrySpatialQueryAccelerator.js +55 -11
  56. package/engine/graphics/micron/convert_three_object_to_micron.js +24 -7
  57. package/engine/graphics/micron/plugin/MicronRenderPlugin.js +107 -4
  58. package/engine/graphics/micron/plugin/serialization/BufferGeometrySerializationAdapter.js +176 -0
  59. package/engine/graphics/micron/render/v1/MaterialContext.js +1 -0
  60. package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +19 -3
  61. package/engine/graphics/particles/particular/engine/utils/volume/ParticleVolume.d.ts +2 -0
  62. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +1 -4
  63. package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
  64. package/engine/graphics/render/buffer/simple-fx/DepthLimitedBlur.js +2 -2
  65. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +0 -2
  66. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +3 -1
  67. package/engine/graphics/render/frame_graph/FrameGraphBuilder.js +36 -0
  68. package/engine/graphics/render/frame_graph/IRenderContext.js +8 -0
  69. package/engine/graphics/render/frame_graph/RenderPass.js +32 -0
  70. package/engine/graphics/render/frame_graph/RenderPassFlags.js +6 -0
  71. package/engine/graphics/render/frame_graph/RenderPassResources.js +15 -0
  72. package/engine/graphics/render/frame_graph/Resource.js +21 -0
  73. package/engine/graphics/render/frame_graph/ResourceReference.js +14 -0
  74. package/engine/graphics/render/frame_graph/TextureDescriptor.js +30 -0
  75. package/engine/graphics/render/frame_graph/UsageModeType.js +5 -0
  76. package/engine/graphics/render/frame_graph/sample/deferred/GBufferDrawPass.js +27 -0
  77. package/engine/graphics/render/frame_graph/sample/deferred/PresentPass.js +17 -0
  78. package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
  79. package/engine/graphics/render/webgpu/sample/_main.ts +650 -0
  80. package/engine/graphics/render/webgpu/sample/fragmentDeferredRendering.wgsl +67 -0
  81. package/engine/graphics/render/webgpu/sample/fragmentGBuffersDebugView.wgsl +38 -0
  82. package/engine/graphics/render/webgpu/sample/fragmentWriteGBuffers.wgsl +21 -0
  83. package/engine/graphics/render/webgpu/sample/lightUpdate.wgsl +34 -0
  84. package/engine/graphics/render/webgpu/sample/main.js +566 -0
  85. package/engine/graphics/render/webgpu/sample/vertexTextureQuad.wgsl +9 -0
  86. package/engine/graphics/render/webgpu/sample/vertexWriteGBuffers.wgsl +28 -0
  87. package/engine/graphics/shadows/ShadowMapRenderer.js +10 -4
  88. package/engine/graphics/shadows/testShadowMapRendering.js +0 -2
  89. package/engine/graphics/texture/sampler/Sampler2D.js +24 -45
  90. package/engine/{ecs/grid → graphics/texture/sampler}/sampler2DToFloat32Texture.js +1 -1
  91. package/engine/intelligence/behavior/ecs/WaitForEventBehavior.js +3 -0
  92. package/engine/save/storage/IndexedDBStorage.js +8 -1
  93. package/package.json +1 -1
  94. package/samples/terrain/main.js +117 -0
  95. package/engine/ecs/sockets/AttachmentSocketsSystem.js +0 -10
@@ -0,0 +1,68 @@
1
+ import Trail2D, { Trail2DFlags } from "./Trail2D.js";
2
+ import {
3
+ RIBBON_ATTRIBUTE_ADDRESS_AGE,
4
+ RIBBON_ATTRIBUTE_ADDRESS_COLOR,
5
+ RIBBON_ATTRIBUTE_ADDRESS_THICKNESS,
6
+ RIBBON_ATTRIBUTE_ADDRESS_UV_OFFSET
7
+ } from "../../trail/x/ribbon_attributes_spec.js";
8
+ import { assert } from "../../../../core/assert.js";
9
+
10
+ /**
11
+ *
12
+ * @param {number[]} color
13
+ * @param {number[]} thickness
14
+ * @param {number} [duration]
15
+ * @param {number} [scale]
16
+ * @param {number[]} position
17
+ * @param {number[]} ages
18
+ * @param {string} texture
19
+ * @returns {Trail2D}
20
+ */
21
+ export function makeGradientTrail({
22
+ color,
23
+ thickness,
24
+ position,
25
+ duration = 1,
26
+ scale = 1,
27
+ ages,
28
+ texture
29
+ }) {
30
+
31
+ const trail2D = new Trail2D();
32
+ trail2D.maxAge = duration;
33
+ trail2D.width = 1;
34
+ trail2D.textureURL = texture;
35
+
36
+ const point_count = thickness.length;
37
+
38
+ trail2D.build(point_count);
39
+
40
+ const ribbon = trail2D.ribbon;
41
+
42
+ for (let i = 0; i < point_count; i++) {
43
+
44
+ const f = i / (point_count - 1);
45
+ const i3 = i * 3;
46
+
47
+ ribbon.setPointAlpha(i, 0);
48
+ ribbon.setPointPosition(i, position[i3], position[i3 + 1], position[i3 + 2]);
49
+
50
+ ribbon.setPointAttribute_Scalar(i, RIBBON_ATTRIBUTE_ADDRESS_AGE, ages[i] * duration);
51
+ ribbon.setPointAttribute_Scalar(i, RIBBON_ATTRIBUTE_ADDRESS_UV_OFFSET, f);
52
+ ribbon.setPointAttribute_Scalar(i, RIBBON_ATTRIBUTE_ADDRESS_THICKNESS, thickness[i]);
53
+
54
+ const c_0 = color[i];
55
+
56
+ assert.isNumber(c_0, `color[i]`);
57
+
58
+ ribbon.setPointAttribute_Vector3(i, RIBBON_ATTRIBUTE_ADDRESS_COLOR, c_0 >> 16, c_0 >> 8, c_0);
59
+ }
60
+
61
+ // don't spawn more trail segments
62
+ trail2D.clearFlag(Trail2DFlags.Spawning);
63
+ trail2D.setFlag(Trail2DFlags.Built);
64
+
65
+ ribbon.computeBoundingBox(trail2D.bvhLeaf);
66
+
67
+ return trail2D;
68
+ }
@@ -2,6 +2,7 @@ import { Cache } from "../../../../../core/cache/Cache.js";
2
2
  import { buildUnsorted } from "../../bvh/buffered/BinaryBVHFromBufferGeometry.js";
3
3
  import { ClippingPlaneContainmentComputingVisitor } from "./ClippingPlaneContainmentComputingVisitor.js";
4
4
  import { RaycastNearestHitComputingVisitor } from "./RaycastNearestHitComputingVisitor.js";
5
+ import { assert } from "../../../../../core/assert.js";
5
6
 
6
7
  export class GeometrySpatialQueryAccelerator {
7
8
  constructor(cache_size = 100 * 1024 * 1024) {
@@ -38,6 +39,8 @@ export class GeometrySpatialQueryAccelerator {
38
39
  * @returns {number} -1,0,1. -1 means fully outside, 0 means partially inside, 1 means fully inside
39
40
  */
40
41
  queryContainmentViaClippingPlanes(geometry, planes) {
42
+ assert.notNull(geometry, 'geometry');
43
+ assert.defined(geometry, 'geometry');
41
44
 
42
45
  const bvh = this.__acquireBVH(geometry);
43
46
 
@@ -53,14 +56,25 @@ export class GeometrySpatialQueryAccelerator {
53
56
  }
54
57
 
55
58
  /**
56
- * Get the nearest ray intersection
59
+ *
57
60
  * @param {SurfacePoint3} destination
58
61
  * @param {THREE.BufferGeometry} geometry
59
- * @param {Vector3} ray_origin
60
- * @param {Vector3} ray_direction
61
- * @returns {boolean} true if hit detected, false otherwise
62
+ * @param {number} ray_origin_x
63
+ * @param {number} ray_origin_y
64
+ * @param {number} ray_origin_z
65
+ * @param {number} ray_direction_x
66
+ * @param {number} ray_direction_y
67
+ * @param {number} ray_direction_z
68
+ * @return {boolean}
62
69
  */
63
- queryRaycastNearest(destination, geometry, ray_origin, ray_direction) {
70
+ queryRaycastNearest_primitive(
71
+ destination,
72
+ geometry,
73
+ ray_origin_x, ray_origin_y, ray_origin_z,
74
+ ray_direction_x, ray_direction_y, ray_direction_z
75
+ ) {
76
+ assert.notNull(geometry, 'geometry');
77
+ assert.defined(geometry, 'geometry');
64
78
 
65
79
  const bvh = this.__acquireBVH(geometry);
66
80
 
@@ -69,12 +83,12 @@ export class GeometrySpatialQueryAccelerator {
69
83
  this.__visitor_raycast.setGeometry(geometry);
70
84
  this.__visitor_raycast.setRoot(bvh);
71
85
  this.__visitor_raycast.setRay(
72
- ray_origin.x,
73
- ray_origin.y,
74
- ray_origin.z,
75
- ray_direction.x,
76
- ray_direction.y,
77
- ray_direction.z
86
+ ray_origin_x,
87
+ ray_origin_y,
88
+ ray_origin_z,
89
+ ray_direction_x,
90
+ ray_direction_y,
91
+ ray_direction_z
78
92
  );
79
93
 
80
94
  bvh.traversePreOrderStack(this.__visitor_raycast, 0);
@@ -87,6 +101,27 @@ export class GeometrySpatialQueryAccelerator {
87
101
  } else {
88
102
  return false;
89
103
  }
104
+ }
105
+
106
+ /**
107
+ * Get the nearest ray intersection
108
+ * @param {SurfacePoint3} destination
109
+ * @param {THREE.BufferGeometry} geometry
110
+ * @param {Vector3} ray_origin
111
+ * @param {Vector3} ray_direction
112
+ * @returns {boolean} true if hit detected, false otherwise
113
+ */
114
+ queryRaycastNearest(destination, geometry, ray_origin, ray_direction) {
115
+
116
+ return this.queryRaycastNearest_primitive(
117
+ destination, geometry,
118
+ ray_origin.x,
119
+ ray_origin.y,
120
+ ray_origin.z,
121
+ ray_direction.x,
122
+ ray_direction.y,
123
+ ray_direction.z
124
+ );
90
125
 
91
126
  }
92
127
 
@@ -96,6 +131,9 @@ export class GeometrySpatialQueryAccelerator {
96
131
  * @returns {IndexedBinaryBVH}
97
132
  */
98
133
  __acquireBVH(geometry) {
134
+ assert.notNull(geometry, 'geometry');
135
+ assert.defined(geometry, 'geometry');
136
+
99
137
  const existing = this.cache.get(geometry);
100
138
 
101
139
  if (existing !== null) {
@@ -122,3 +160,9 @@ export class GeometrySpatialQueryAccelerator {
122
160
  }
123
161
 
124
162
  }
163
+
164
+ /**
165
+ * @readonly
166
+ * @type {GeometrySpatialQueryAccelerator}
167
+ */
168
+ GeometrySpatialQueryAccelerator.INSTANCE = new GeometrySpatialQueryAccelerator();
@@ -3,12 +3,18 @@ import { computeGeometryHash } from "../../asset/loaders/geometry/geometry/compu
3
3
  import { computeGeometryEquality } from "../../asset/loaders/geometry/geometry/computeGeometryEquality.js";
4
4
  import { buildMicronGeometryFromBufferGeometry } from "./build/buildMicronGeometryFromBufferGeometry.js";
5
5
  import { ThreeMicronMesh } from "./format/ThreeMicronMesh.js";
6
+ import { AsyncMapWrapper } from "../../../core/collection/map/AsyncMapWrapper.js";
6
7
 
7
8
  /**
8
9
  *
9
10
  * @type {HashMap<THREE.BufferGeometry, MicronGeometry>}
10
11
  */
11
- const micron_cache = new HashMap({
12
+ const default_micron_cache = new AsyncMapWrapper(new HashMap({
13
+ keyHashFunction: computeGeometryHash,
14
+ keyEqualityFunction: computeGeometryEquality
15
+ }));
16
+
17
+ const pending_cache = new HashMap({
12
18
  keyHashFunction: computeGeometryHash,
13
19
  keyEqualityFunction: computeGeometryEquality
14
20
  });
@@ -17,9 +23,10 @@ const micron_cache = new HashMap({
17
23
  /**
18
24
  *
19
25
  * @param {THREE.Object3D} object
26
+ * @param {AbstractAsyncMap<THREE.BufferGeometry, MicronGeometry>} micron_cache
20
27
  * @returns {THREE.Object3D}
21
28
  */
22
- export async function convert_three_object_to_micron(object) {
29
+ export async function convert_three_object_to_micron(object, micron_cache = default_micron_cache) {
23
30
 
24
31
  const promises = [];
25
32
 
@@ -29,19 +36,29 @@ export async function convert_three_object_to_micron(object) {
29
36
  * @returns {MicronGeometry}
30
37
  */
31
38
  async function obtain_geometry(g) {
32
- const existing = micron_cache.get(g);
39
+ const existing = await micron_cache.get(g);
40
+
41
+ if (existing !== undefined && existing !== null) {
42
+ return existing;
43
+ }
44
+
45
+ const pending = pending_cache.get(g);
33
46
 
34
- if (existing !== undefined) {
35
- return await existing;
47
+ if (pending !== undefined) {
48
+ return await pending;
36
49
  }
37
50
 
38
51
  const micron_geometry_promise = buildMicronGeometryFromBufferGeometry(g);
39
52
 
40
- micron_cache.set(g, micron_geometry_promise);
53
+ pending_cache.set(g, micron_geometry_promise);
41
54
 
42
55
  promises.push(micron_geometry_promise);
43
56
 
44
- return await micron_geometry_promise;
57
+ const micron_geometry = await micron_geometry_promise;
58
+
59
+ await micron_cache.set(g, micron_geometry);
60
+
61
+ return micron_geometry;
45
62
  }
46
63
 
47
64
 
@@ -3,6 +3,57 @@ import { VGThreeRenderer } from "../render/v1/VGThreeRenderer.js";
3
3
  import { RenderLayer } from "../../render/layers/RenderLayer.js";
4
4
  import { RenderPassType } from "../../render/RenderPassType.js";
5
5
  import { SOURCE_RENDER_LAYER_PROPERTY } from "../../render/visibility/VisibilityComputer.js";
6
+ import { AssetTransformer } from "../../../asset/AssetTransformer.js";
7
+ import { convert_three_object_to_micron } from "../convert_three_object_to_micron.js";
8
+ import { Cache } from "../../../../core/cache/Cache.js";
9
+ import { computeGeometryHash } from "../../../asset/loaders/geometry/geometry/computeGeometryHash.js";
10
+ import { computeGeometryEquality } from "../../../asset/loaders/geometry/geometry/computeGeometryEquality.js";
11
+ import { CachedAsyncMap } from "../../../../core/collection/map/CachedAsyncMap.js";
12
+ import { AsyncRemoteHashMap } from "../../../../core/collection/map/AsyncRemoteHashMap.js";
13
+ import { BufferGeometrySerializationAdapter } from "./serialization/BufferGeometrySerializationAdapter.js";
14
+ import { MicronGeometryBinarySerializationAdapter } from "../format/serialization/MicronGeometryBinarySerializationAdapter.js";
15
+ import { AsyncMapWrapper } from "../../../../core/collection/map/AsyncMapWrapper.js";
16
+
17
+ /**
18
+ *
19
+ * @type {string}
20
+ */
21
+ const STORAGE_KEY = '@plugin/virtual-geometry-micron/geometry-cache';
22
+
23
+
24
+ class GLTFAssetTransformer extends AssetTransformer {
25
+ /**
26
+ *
27
+ * @param {AbstractAsyncMap<THREE.BufferGeometry, MicronGeometry>} cache
28
+ */
29
+ constructor(cache) {
30
+ super();
31
+
32
+ /**
33
+ *
34
+ * @type {AbstractAsyncMap<THREE.BufferGeometry, MicronGeometry>}
35
+ * @private
36
+ */
37
+ this.__cache = cache;
38
+ }
39
+
40
+ async transform(source) {
41
+ const animationClips = source.animations;
42
+ if (animationClips !== undefined && animationClips.length > 0) {
43
+ // not suitable
44
+ return source;
45
+ }
46
+
47
+ const root = source.create();
48
+
49
+ const micron_root = await convert_three_object_to_micron(root.clone(), this.__cache);
50
+ micron_root.boundingSphere = root.boundingSphere;
51
+
52
+ source.override_mesh = micron_root;
53
+
54
+ return source;
55
+ }
56
+ }
6
57
 
7
58
  export class MicronRenderPlugin extends EnginePlugin {
8
59
  constructor() {
@@ -37,6 +88,40 @@ export class MicronRenderPlugin extends EnginePlugin {
37
88
  });
38
89
 
39
90
  this.__view_observers = new Map();
91
+
92
+ /**
93
+ *
94
+ * @type {AsyncRemoteHashMap}
95
+ * @private
96
+ */
97
+ this.__persisted_geometry = new AsyncRemoteHashMap({
98
+ keyHashFunction: computeGeometryHash,
99
+ keyEqualityFunction: computeGeometryEquality,
100
+ keySerializationAdapter: new BufferGeometrySerializationAdapter(),
101
+ valueSerializationAdapter: new MicronGeometryBinarySerializationAdapter(),
102
+ storageKeyPrefix: STORAGE_KEY,
103
+
104
+ });
105
+ /**
106
+ *
107
+ * @type {AbstractAsyncMap<THREE.BufferGeometry, MicronGeometry>}
108
+ * @private
109
+ */
110
+ this.__cache = new CachedAsyncMap(
111
+ new AsyncMapWrapper(new Cache({
112
+ keyHashFunction: computeGeometryHash,
113
+ keyEqualityFunction: computeGeometryEquality
114
+ })),
115
+ this.__persisted_geometry
116
+ );
117
+
118
+ /**
119
+ *
120
+ * @type {AssetTransformer}
121
+ * @private
122
+ */
123
+ this.__asset_transformer = new GLTFAssetTransformer(this.__cache);
124
+
40
125
  }
41
126
 
42
127
  /**
@@ -87,13 +172,22 @@ export class MicronRenderPlugin extends EnginePlugin {
87
172
  view.on.preRender.remove(observer);
88
173
  }
89
174
 
175
+ __ingest_cache() {
176
+ this.engine.storage.lo
177
+ }
178
+
90
179
  async startup() {
91
180
 
181
+ const engine = this.engine;
182
+
183
+ engine.assetManager.registerTransformer("model/gltf", this.__asset_transformer);
184
+ engine.assetManager.registerTransformer("model/gltf+json", this.__asset_transformer);
185
+
92
186
  /**
93
187
  *
94
188
  * @type {GraphicsEngine}
95
189
  */
96
- const ge = this.engine.graphics;
190
+ const ge = engine.graphics;
97
191
 
98
192
  ge.layers.add(this.__micron_render_layer);
99
193
 
@@ -101,13 +195,22 @@ export class MicronRenderPlugin extends EnginePlugin {
101
195
  ge.views.elements.on.removed.add(this.__handle_view_removed, this);
102
196
 
103
197
  // link all views
104
- ge.views.elements.forEach(this.__handle_view_added,this);
198
+ ge.views.elements.forEach(this.__handle_view_added, this);
199
+
200
+ this.__persisted_geometry.attach_storage(engine.storage);
105
201
 
106
202
  await super.startup();
107
203
  }
108
204
 
109
205
  async shutdown() {
110
- const ge = this.engine.graphics;
206
+ const engine = this.engine;
207
+
208
+ this.__persisted_geometry.detach_storage();
209
+
210
+ engine.assetManager.unregisterTransformer("model/gltf", this.__asset_transformer);
211
+ engine.assetManager.unregisterTransformer("model/gltf+json", this.__asset_transformer);
212
+
213
+ const ge = engine.graphics;
111
214
 
112
215
  ge.layers.remove(this.__micron_render_layer);
113
216
 
@@ -115,7 +218,7 @@ export class MicronRenderPlugin extends EnginePlugin {
115
218
  ge.views.elements.on.removed.remove(this.__handle_view_removed, this);
116
219
 
117
220
  // clear all observer
118
- ge.views.elements.forEach(this.__handle_view_removed,this);
221
+ ge.views.elements.forEach(this.__handle_view_removed, this);
119
222
 
120
223
  await super.shutdown();
121
224
  }
@@ -0,0 +1,176 @@
1
+ import { BinaryClassSerializationAdapter } from "../../../../ecs/storage/binary/BinaryClassSerializationAdapter.js";
2
+ import { BufferAttribute, BufferGeometry } from "three";
3
+
4
+ function typed_array_to_enum(array) {
5
+ if (array instanceof Uint8Array) {
6
+ return 0;
7
+ } else if (array instanceof Uint16Array) {
8
+ return 1;
9
+ } else if (array instanceof Uint32Array) {
10
+ return 2;
11
+ } else if (array instanceof Uint8Array) {
12
+ return 3;
13
+ } else if (array instanceof Uint16Array) {
14
+ return 4;
15
+ } else if (array instanceof Uint32Array) {
16
+ return 5;
17
+ } else if (array instanceof Float32Array) {
18
+ return 6;
19
+ } else if (array instanceof Float64Array) {
20
+ return 7;
21
+ } else {
22
+ throw new Error('Unsupported array type');
23
+ }
24
+ }
25
+
26
+ function marker_to_typed_array_constructor(marker) {
27
+ switch (marker) {
28
+ case 0:
29
+ return Uint8Array;
30
+ case 1:
31
+ return Uint16Array;
32
+ case 2:
33
+ return Uint32Array;
34
+ case 3:
35
+ return Int8Array;
36
+ case 4:
37
+ return Int16Array;
38
+ case 5:
39
+ return Int32Array;
40
+ case 6:
41
+ return Float32Array;
42
+ case 7:
43
+ return Float64Array;
44
+ default:
45
+ throw new Error('Unsupported marker');
46
+ }
47
+ }
48
+
49
+ /**
50
+ *
51
+ * @param {BinaryBuffer} buffer
52
+ * @param {Uint8Array|Float32Array|ArrayLike<number>} value
53
+ */
54
+ function write_typed_array(buffer, value) {
55
+
56
+ buffer.writeUint8(typed_array_to_enum(value));
57
+ buffer.writeUintVar(value.byteLength);
58
+
59
+ const data = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
60
+ buffer.writeBytes(data, 0, value.byteLength);
61
+ }
62
+
63
+ function read_typed_array(buffer) {
64
+ const type_marker = buffer.readUint8();
65
+ const byte_length = buffer.readUintVar();
66
+
67
+ const array = new Uint8Array(byte_length);
68
+
69
+ buffer.readBytes(array, 0, byte_length);
70
+
71
+ // re-interpret bytes
72
+ const TypedArray = marker_to_typed_array_constructor(type_marker);
73
+
74
+ return new TypedArray(array.buffer, 0);
75
+ }
76
+
77
+ /**
78
+ *
79
+ * @param {BinaryBuffer} buffer
80
+ * @param {BufferAttribute} value
81
+ */
82
+ function write_attribute(buffer, value) {
83
+ buffer.writeUTF8String(value.name);
84
+ buffer.writeUintVar(value.itemSize);
85
+ buffer.writeUint8(value.normalized ? 1 : 0);
86
+ buffer.writeUint32(value.usage);
87
+
88
+ write_typed_array(buffer, value.array);
89
+ }
90
+
91
+ /**
92
+ *
93
+ * @param {BinaryBuffer} buffer
94
+ * @returns {BufferAttribute}
95
+ */
96
+ function read_attribute(buffer) {
97
+ const name = buffer.readUTF8String();
98
+ const itemSize = buffer.readUintVar();
99
+ const normalized = buffer.readUint8() !== 0;
100
+ const usage = buffer.readUint32();
101
+
102
+ const array = read_typed_array(buffer);
103
+
104
+ const attribute = new BufferAttribute(array, itemSize, normalized);
105
+
106
+ attribute.usage = usage;
107
+ attribute.name = name;
108
+
109
+ return attribute;
110
+ }
111
+
112
+ export class BufferGeometrySerializationAdapter extends BinaryClassSerializationAdapter {
113
+ constructor() {
114
+ super();
115
+
116
+ this.klass = BufferGeometry;
117
+ }
118
+
119
+ /**
120
+ *
121
+ * @param {BinaryBuffer} buffer
122
+ * @param {BufferGeometry} value
123
+ */
124
+ serialize(buffer, value) {
125
+ // write index if one exists
126
+ const index = value.getIndex();
127
+ if (index === null) {
128
+ buffer.writeUint8(0);
129
+ } else {
130
+ buffer.writeUint8(1);
131
+
132
+ write_attribute(buffer, index);
133
+ }
134
+
135
+ const attributes = value.attributes;
136
+ const attribute_keys = Object.keys(attributes);
137
+
138
+ const attribute_count = attribute_keys.length;
139
+ buffer.writeUintVar(attribute_count);
140
+
141
+ for (let i = 0; i < attribute_count; i++) {
142
+ const attribute_key = attribute_keys[i];
143
+
144
+ buffer.writeUTF8String(attribute_key);
145
+
146
+ const attribute = attributes[attribute_key];
147
+
148
+ write_attribute(buffer, attribute);
149
+ }
150
+ }
151
+
152
+ /**
153
+ *
154
+ * @param {BinaryBuffer} buffer
155
+ * @param {BufferGeometry} value
156
+ */
157
+ deserialize(buffer, value) {
158
+ const index_flag = buffer.readUint8();
159
+
160
+ if (index_flag !== 0) {
161
+ value.setIndex(read_attribute(buffer));
162
+ } else {
163
+ value.setIndex(null);
164
+ }
165
+
166
+ const attribute_count = buffer.readUintVar();
167
+
168
+ for (let i = 0; i < attribute_count; i++) {
169
+ const attribute_key = buffer.readUTF8String();
170
+
171
+ const attribute = read_attribute(buffer);
172
+
173
+ value.setAttribute(attribute_key, attribute);
174
+ }
175
+ }
176
+ }
@@ -82,6 +82,7 @@ export class MaterialContext {
82
82
 
83
83
  if (material[MATERIAL_FLAG] === undefined) {
84
84
  material.onBeforeCompile = composeCompile(this.material.onBeforeCompile, rewrite_material);
85
+ material.needsUpdate = true;
85
86
 
86
87
  material[MATERIAL_FLAG] = true;
87
88
  material[MATERIAL_VERTEX_DISPLACED] = true;
@@ -10,11 +10,26 @@ import {
10
10
  } from "../emitter/PARTICLE_ATTRIBUTES.js";
11
11
  import { update_parameters } from "./update_parameters.js";
12
12
 
13
- const velocity = [];
14
- const position = [];
13
+ /**
14
+ * Common buffer for better memory layout
15
+ * @type {ArrayBuffer}
16
+ */
17
+ const scratch_common_buffer = new ArrayBuffer(4 * 3 * 2);
18
+ /**
19
+ *
20
+ * @type {Float32Array|number[]|vec3}
21
+ */
22
+ const velocity = new Float32Array(scratch_common_buffer, 0, 3);
23
+
24
+ /**
25
+ *
26
+ * @type {Float32Array|number[]|vec3}
27
+ */
28
+ const position = new Float32Array(scratch_common_buffer, 3 * 4, 3);
15
29
 
16
30
  export class SimulationStepFixedPhysics extends AbstractSimulationStep {
17
31
  execute() {
32
+ let i = 0;
18
33
  const particles = this.particles;
19
34
  const timeDelta = this.timeDelta;
20
35
 
@@ -31,7 +46,7 @@ export class SimulationStepFixedPhysics extends AbstractSimulationStep {
31
46
  */
32
47
  const layers = emitter.layers.asArray();
33
48
 
34
- for (let i = 0; i < liveParticleCount; i++) {
49
+ for (; i < liveParticleCount; i++) {
35
50
 
36
51
  const layer_position = particles.readAttributeScalar(i, PARTICLE_ATTRIBUTE_LAYER_POSITION);
37
52
 
@@ -70,6 +85,7 @@ export class SimulationStepFixedPhysics extends AbstractSimulationStep {
70
85
 
71
86
  particles.readAttributeVector3(i, PARTICLE_ATTRIBUTE_POSITION, position);
72
87
 
88
+ // Verlet integration
73
89
  const p_x = position[0] + velocity[0] * timeDelta;
74
90
  const p_y = position[1] + velocity[1] * timeDelta;
75
91
  const p_z = position[2] + velocity[2] * timeDelta;
@@ -19,6 +19,8 @@ export class ParticleVolume {
19
19
 
20
20
  from(args?: Args): void
21
21
 
22
+ fromJSON(json: any): void
23
+
22
24
  build(): void
23
25
 
24
26
  readonly attributes: Attributes
@@ -3,7 +3,6 @@ import { EngineConfiguration } from "../../../../../../EngineConfiguration.js";
3
3
  import GUIElementSystem from "../../../../../../ecs/gui/GUIElementSystem.js";
4
4
  import HeadsUpDisplaySystem from "../../../../../../ecs/gui/hud/HeadsUpDisplaySystem.js";
5
5
  import TagSystem from "../../../../../../ecs/systems/TagSystem.js";
6
- import { AttachmentSocketsSystem } from "../../../../../../ecs/sockets/AttachmentSocketsSystem.js";
7
6
  import { AttachmentSystem } from "../../../../../../ecs/attachment/AttachmentSystem.js";
8
7
  import { SoundEmitterSystem } from "../../../../../../sound/ecs/emitter/SoundEmitterSystem.js";
9
8
  import SoundControllerSystem from "../../../../../../sound/ecs/SoundControllerSystem.js";
@@ -99,7 +98,6 @@ function makeConfig(engine) {
99
98
 
100
99
  config.systems.push(
101
100
  new TagSystem(),
102
- new AttachmentSocketsSystem(),
103
101
  new AttachmentSystem(),
104
102
  new SoundEmitterSystem(assetManager, sound.destination, sound.context),
105
103
  new SoundControllerSystem(),
@@ -132,6 +130,7 @@ function makeConfig(engine) {
132
130
 
133
131
  // Plugins
134
132
  config.addPlugin(MicronRenderPlugin);
133
+ config.addPlugin(AmbientOcclusionPostProcessEffect);
135
134
 
136
135
 
137
136
  // Knowledge
@@ -159,8 +158,6 @@ async function init(harness) {
159
158
  await engine.graphics.loadEnvironmentMap(buildCubeURLs('data/textures/cubemaps/hip_miramar/32/', '.png'));
160
159
 
161
160
 
162
- await engine.plugins.acquire(AmbientOcclusionPostProcessEffect);
163
-
164
161
  await harness.initialize();
165
162
 
166
163
  main(engine);
@@ -8,7 +8,6 @@ import PathFollowingSystem from "../../../../navigation/ecs/path_following/PathF
8
8
  import SteeringSystem from "../../../../ecs/systems/SteeringSystem.js";
9
9
  import MotionSystem from "../../../../ecs/systems/MotionSystem.js";
10
10
  import TagSystem from "../../../../ecs/systems/TagSystem.js";
11
- import { AttachmentSocketsSystem } from "../../../../ecs/sockets/AttachmentSocketsSystem.js";
12
11
  import { AttachmentSystem } from "../../../../ecs/attachment/AttachmentSystem.js";
13
12
  import { SoundEmitterSystem } from "../../../../sound/ecs/emitter/SoundEmitterSystem.js";
14
13
  import SoundControllerSystem from "../../../../sound/ecs/SoundControllerSystem.js";
@@ -93,7 +92,6 @@ function makeConfig(engine) {
93
92
  new SteeringSystem(),
94
93
  new MotionSystem(),
95
94
  new TagSystem(),
96
- new AttachmentSocketsSystem(),
97
95
  new AttachmentSystem(),
98
96
  new SoundEmitterSystem(assetManager, sound.destination, sound.context),
99
97
  new SoundControllerSystem(),