@woosh/meep-engine 2.33.38 → 2.33.42

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 (40) hide show
  1. package/core/bvh2/binary/2/BinaryUint32BVH.js +3 -3
  2. package/core/collection/array/typed/typed_array_copy.js +2 -2
  3. package/core/geom/3d/aabb/aabb3_matrix4_project_by_corners.js +1 -1
  4. package/core/geom/3d/morton/mortonEncode_magicbits.js +7 -6
  5. package/core/geom/3d/morton/v3_morton_encode_transformed.js +15 -11
  6. package/core/geom/3d/tetrahedra/tetrahedra_collection.js +193 -18
  7. package/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +2 -1
  8. package/engine/asset/loaders/GLTFAssetLoader.js +4 -8
  9. package/engine/ecs/System.d.ts +24 -1
  10. package/engine/graphics/ecs/light/binding/fp/FPLightBinding.js +1 -1
  11. package/engine/graphics/particles/particular/engine/parameter/ParameterLookupTable.js +20 -24
  12. package/engine/graphics/particles/particular/engine/shader/ShaderManager.js +1 -1
  13. package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +2 -2
  14. package/engine/graphics/render/buffer/simple-fx/DepthLimitedBlur.js +9 -4
  15. package/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +7 -1
  16. package/engine/graphics/render/forward_plus/LightManager.js +295 -51
  17. package/engine/graphics/render/forward_plus/LightManager.spec.js +1 -1
  18. package/engine/graphics/render/forward_plus/PointLightData.js +9 -13
  19. package/engine/graphics/render/forward_plus/data/TextureBackedMemoryRegion.js +10 -1
  20. package/engine/graphics/render/forward_plus/debug/LightClusterVolumeMaterial.js +1 -1
  21. package/engine/graphics/render/forward_plus/debug/buildLightClusterWidget.js +3 -1
  22. package/engine/graphics/render/forward_plus/materials/FP_SHADER_CHUNK_ACCUMULATION.js +31 -18
  23. package/engine/graphics/render/forward_plus/materials/fp_build_fragment_shader.js +1 -0
  24. package/engine/graphics/render/forward_plus/model/AbstractLight.js +50 -0
  25. package/engine/graphics/render/forward_plus/model/Decal.js +68 -0
  26. package/engine/graphics/render/forward_plus/{PointLight.js → model/PointLight.js} +19 -11
  27. package/engine/graphics/render/forward_plus/{SpotLight.js → model/SpotLight.js} +20 -12
  28. package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +6 -5
  29. package/engine/graphics/render/forward_plus/{prototypeLightManager.js → prototype/prototypeLightManager.js} +100 -25
  30. package/engine/graphics/render/forward_plus/query/query_bvh_frustum_from_texture.js +29 -20
  31. package/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +2 -0
  32. package/engine/graphics/render/visibility/IncrementalDeltaSet.js +1 -0
  33. package/engine/graphics/texture/atlas/AbstractTextureAtlas.js +19 -0
  34. package/engine/graphics/texture/atlas/CachingTextureAtlas.js +99 -0
  35. package/engine/graphics/texture/atlas/ManagedTextureAtlas.js +19 -39
  36. package/engine/graphics/texture/atlas/ReferencedTextureAtlas.js +75 -0
  37. package/engine/graphics/texture/atlas/TextureAtlas.js +22 -2
  38. package/engine/reference/v2/Reference.d.ts +4 -0
  39. package/engine/reference/v2/Reference.js +3 -1
  40. package/package.json +1 -1
@@ -0,0 +1,99 @@
1
+ import { Cache } from "../../../../core/cache/Cache.js";
2
+ import { AbstractTextureAtlas } from "./AbstractTextureAtlas.js";
3
+
4
+ /**
5
+ * 4Mb
6
+ * @type {number}
7
+ */
8
+ const DEFAULT_CACHE_SIZE = 4194304;
9
+
10
+ export class CachingTextureAtlas extends AbstractTextureAtlas {
11
+ /**
12
+ *
13
+ * @param {AbstractTextureAtlas} atlas
14
+ * @param {number} cache_size
15
+ */
16
+ constructor({
17
+ atlas,
18
+ cache_size = DEFAULT_CACHE_SIZE
19
+ }) {
20
+ super();
21
+
22
+ /**
23
+ *
24
+ * @type {Cache<Sampler2D, AtlasPatch>}
25
+ * @private
26
+ */
27
+ this.__cached_patches = new Cache({
28
+ maxWeight: cache_size,
29
+ keyWeigher(sampler) {
30
+ return sampler.computeByteSize();
31
+ }
32
+ });
33
+
34
+ /**
35
+ *
36
+ * @type {TextureAtlas}
37
+ * @private
38
+ */
39
+ this.__atals = atlas;
40
+
41
+ this.__cached_patches.onEvicted.add(this.__handle_cache_eviction, this);
42
+ }
43
+
44
+ /**
45
+ *
46
+ * @returns {AbstractTextureAtlas}
47
+ */
48
+ get atlas() {
49
+ return this.__atals;
50
+ }
51
+
52
+ /**
53
+ *
54
+ * @param {Sampler2D} sampler
55
+ * @param {AtlasPatch} patch
56
+ * @private
57
+ */
58
+ __handle_cache_eviction(sampler, patch) {
59
+ this.__atals.remove(patch);
60
+ }
61
+
62
+ reset() {
63
+ this.__cached_patches.drop();
64
+ this.__atals.reset();
65
+ }
66
+
67
+ /**
68
+ *
69
+ * @param {Sampler2D} sampler
70
+ * @returns {AtlasPatch}
71
+ */
72
+ add(sampler) {
73
+ const existing_patch = this.__cached_patches.get(sampler);
74
+
75
+ if (existing_patch !== null) {
76
+ // cache hit
77
+ return existing_patch;
78
+ }
79
+
80
+ return this.__atals.add(sampler);
81
+ }
82
+
83
+ /**
84
+ *
85
+ * @param {AtlasPatch} patch
86
+ */
87
+ remove(patch) {
88
+
89
+ // validate presence of patch in the atlas
90
+ if (!this.__atals.contains(patch)) {
91
+ return false;
92
+ }
93
+
94
+ // push to cache, let eviction logic handle the rest
95
+ this.__cached_patches.put(patch.sampler, patch);
96
+
97
+ return true;
98
+ }
99
+ }
@@ -1,14 +1,12 @@
1
1
  import { TextureAtlas } from "./TextureAtlas.js";
2
2
  import { ReferenceManager } from "../../../reference/v1/ReferenceManager.js";
3
3
  import { Sampler2D } from "../sampler/Sampler2D.js";
4
- import { Cache } from "../../../../core/cache/Cache.js";
5
4
  import { GameAssetType } from "../../../asset/GameAssetType.js";
6
5
  import { HashMap } from "../../../../core/collection/HashMap.js";
7
6
  import { strictEquals } from "../../../../core/function/Functions.js";
8
7
  import { computeStringHash } from "../../../../core/primitives/strings/computeStringHash.js";
9
8
  import { copy_Sampler2D_channel_data } from "../sampler/copy_Sampler2D_channel_data.js";
10
-
11
- const CACHE_SIZE = 4194304;
9
+ import { CachingTextureAtlas } from "./CachingTextureAtlas.js";
12
10
 
13
11
  export class ManagedAtlas {
14
12
  /**
@@ -26,28 +24,20 @@ export class ManagedAtlas {
26
24
 
27
25
  /**
28
26
  *
29
- * @type {TextureAtlas}
27
+ * @type {WeakMap<string, Sampler2D>}
28
+ * @private
30
29
  */
31
- this.atlas = atlas;
30
+ this.__cached_samplers = new Map();
31
+ const cached_samplers = this.__cached_samplers;
32
32
 
33
+ const cached_atlas = new CachingTextureAtlas({ atlas });
34
+ this.__caching_atlas = cached_atlas;
33
35
 
34
36
  /**
35
37
  *
36
- * @type {Cache<String, AtlasPatch>}
38
+ * @type {TextureAtlas}
37
39
  */
38
- const patchesInactive = new Cache({
39
- maxWeight: CACHE_SIZE,
40
- keyHashFunction: computeStringHash,
41
- keyEqualityFunction: strictEquals,
42
- valueWeigher(patch) {
43
- return patch.sampler.data.length;
44
- }
45
- });
46
-
47
- // watch for patches being removed
48
- patchesInactive.onRemoved.add((key, value) => {
49
- atlas.remove(value);
50
- });
40
+ this.atlas = atlas;
51
41
 
52
42
  /**
53
43
  *
@@ -64,19 +54,12 @@ export class ManagedAtlas {
64
54
  */
65
55
  this.patchesActive = activePatches;
66
56
 
67
- /**
68
- * @private
69
- * @type {Cache<String, AtlasPatch>}
70
- */
71
- this.patchesInactive = patchesInactive;
72
-
73
57
  /**
74
58
  * Automatically update TextureAtlas
75
59
  * @type {boolean}
76
60
  */
77
61
  this.autoUpdate = true;
78
62
 
79
-
80
63
  this.rebuildDelay = 200; //in milliseconds
81
64
 
82
65
  let counterLoadingAssets = 0;
@@ -97,7 +80,7 @@ export class ManagedAtlas {
97
80
 
98
81
  /**
99
82
  *
100
- * @param {String} url
83
+ * @param {string} url
101
84
  * @returns {Promise<AtlasPatch>}
102
85
  */
103
86
  function creator(url) {
@@ -110,14 +93,10 @@ export class ManagedAtlas {
110
93
  return;
111
94
  }
112
95
 
113
- patch = patchesInactive.get(url);
114
-
115
- if (patch !== null) {
116
- //move to active
117
- patchesInactive.silentRemove(url);
118
-
119
- activePatches.set(url, patch);
96
+ const cached_sampler = cached_samplers.get(url);
120
97
 
98
+ if (cached_sampler !== undefined) {
99
+ patch = cached_atlas.add(cached_sampler);
121
100
  resolve(patch);
122
101
  return;
123
102
  }
@@ -154,7 +133,10 @@ export class ManagedAtlas {
154
133
  sampler = source;
155
134
  }
156
135
 
157
- const patch = atlas.add(sampler);
136
+ cached_samplers.set(url, sampler);
137
+
138
+
139
+ const patch = cached_atlas.add(sampler);
158
140
 
159
141
  //record active patch
160
142
  activePatches.set(url, patch);
@@ -197,8 +179,7 @@ export class ManagedAtlas {
197
179
  //remove from active
198
180
  activePatches.delete(url);
199
181
 
200
- //put into inactive set
201
- patchesInactive.put(url, patch);
182
+ self.__caching_atlas.remove(patch);
202
183
  }
203
184
  });
204
185
  }
@@ -218,8 +199,7 @@ export class ManagedAtlas {
218
199
 
219
200
  reset() {
220
201
  this.references.reset();
221
- this.atlas.reset();
222
- this.patchesInactive.drop();
202
+ this.__caching_atlas.reset();
223
203
  this.patchesActive.clear();
224
204
  }
225
205
 
@@ -0,0 +1,75 @@
1
+ import { AbstractTextureAtlas } from "./AbstractTextureAtlas.js";
2
+ import { Reference } from "../../../reference/v2/Reference.js";
3
+
4
+ export class ReferencedTextureAtlas extends AbstractTextureAtlas {
5
+ /**
6
+ *
7
+ * @param {AbstractTextureAtlas} atlas
8
+ */
9
+ constructor(atlas) {
10
+ super();
11
+
12
+ this.__atlas = atlas;
13
+
14
+ /**
15
+ *
16
+ * @type {Map<Sampler2D, AtlasPatch>}
17
+ * @private
18
+ */
19
+ this.__patches = new Map();
20
+ /**
21
+ *
22
+ * @type {Map<AtlasPatch, number>}
23
+ * @private
24
+ */
25
+ this.__ref_counts = new Map();
26
+
27
+ }
28
+
29
+ /**
30
+ *
31
+ * @param {Reference} ref
32
+ * @param {AtlasPatch} patch
33
+ * @private
34
+ */
35
+ __handle_ref_release(ref, patch) {
36
+ const ref_counts = this.__ref_counts;
37
+
38
+ const ref_count = ref_counts.get(patch);
39
+ ref_counts.set(patch, ref_count - 1);
40
+
41
+ if (ref_count === 1) {
42
+ // clear patch
43
+ this.__atlas.remove(patch);
44
+ }
45
+ }
46
+
47
+
48
+ /**
49
+ *
50
+ * @param {Sampler2D} sampler
51
+ * @returns {Reference<AtlasPatch>}
52
+ */
53
+ acquire(sampler) {
54
+
55
+ let patch = this.__patches.get(sampler);
56
+
57
+ const ref_counts = this.__ref_counts;
58
+
59
+ const atlas = this.__atlas;
60
+
61
+ if (patch === undefined) {
62
+ patch = atlas.add(sampler);
63
+ ref_counts.set(patch, 1)
64
+ } else {
65
+ ref_counts.set(patch, ref_counts.get(patch) + 1);
66
+ }
67
+
68
+ const ref = new Reference();
69
+ ref.bind(patch);
70
+
71
+ ref.onReleased.add(this.__handle_ref_release, this);
72
+
73
+ return ref;
74
+ }
75
+ }
@@ -11,8 +11,9 @@ import { assert } from "../../../../core/assert.js";
11
11
  import { DataType } from "../../../../core/collection/table/DataType.js";
12
12
  import { DataType2TypedArrayConstructorMapping } from "../../../../core/collection/table/DataType2TypedArrayConstructorMapping.js";
13
13
  import { invokeObjectClone } from "../../../../core/model/ObjectUtils.js";
14
+ import { AbstractTextureAtlas } from "./AbstractTextureAtlas.js";
14
15
 
15
- export class TextureAtlas {
16
+ export class TextureAtlas extends AbstractTextureAtlas {
16
17
  /**
17
18
  *
18
19
  * @param {number} [size]
@@ -20,6 +21,8 @@ export class TextureAtlas {
20
21
  * @constructor
21
22
  */
22
23
  constructor(size = 16, data_type = DataType.Uint8) {
24
+ super();
25
+
23
26
  /**
24
27
  *
25
28
  * @type {IdPool}
@@ -68,6 +71,23 @@ export class TextureAtlas {
68
71
  this.__needsUpdate = false;
69
72
  }
70
73
 
74
+ /**
75
+ *
76
+ * @param {Sampler2D} sampler
77
+ * @returns {AtlasPatch|undefined}
78
+ */
79
+ getPatch(sampler) {
80
+ const patches = this.patches;
81
+ const patch_count = patches.length;
82
+ for (let i = 0; i < patch_count; i++) {
83
+ const patch = patches[i];
84
+
85
+ if (patch.sampler === sampler) {
86
+ return patch;
87
+ }
88
+ }
89
+ }
90
+
71
91
  /**
72
92
  * Whether or not current state of atlas requires calling {#update}
73
93
  * @returns {boolean}
@@ -222,7 +242,7 @@ export class TextureAtlas {
222
242
  /**
223
243
  *
224
244
  * @param {Sampler2D} sampler
225
- * @param {number} padding
245
+ * @param {number} [padding]
226
246
  * @return {AtlasPatch}
227
247
  */
228
248
  add(sampler, padding = 4) {
@@ -1,4 +1,8 @@
1
+ import Signal from "../../../core/events/signal/Signal";
2
+
1
3
  export class Reference<T> {
4
+ readonly onReleased: Signal<Reference<T>, T>
5
+
2
6
  getValue(): T | null
3
7
 
4
8
  release(): void
@@ -73,12 +73,14 @@ export class Reference {
73
73
  return;
74
74
  }
75
75
 
76
+ const v = this.__value;
77
+
76
78
  // prevent further usage of the reference
77
79
  this.__value = null;
78
80
 
79
81
  this.__is_bound = false;
80
82
 
81
- this.__onReleased.send1(this);
83
+ this.__onReleased.send2(this,v);
82
84
  }
83
85
  }
84
86
 
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "productName": "Meep",
6
6
  "description": "production-ready JavaScript game engine based on Entity Component System Architecture",
7
7
  "author": "Alexander Goldring",
8
- "version": "2.33.38",
8
+ "version": "2.33.42",
9
9
  "dependencies": {
10
10
  "gl-matrix": "3.4.3",
11
11
  "fast-levenshtein": "2.0.6",