@woosh/meep-engine 2.165.7 → 2.167.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/build/bundle-worker-image-decoder.js +1 -1
  2. package/package.json +1 -1
  3. package/src/CORRECTNESS_HUNT_2026_07_24.md +142 -0
  4. package/src/core/binary/BinaryBuffer.js +1 -1
  5. package/src/core/binary/EncodingBinaryBuffer.d.ts.map +1 -1
  6. package/src/core/binary/EncodingBinaryBuffer.js +3 -1
  7. package/src/core/cache/Cache.d.ts.map +1 -1
  8. package/src/core/cache/Cache.js +0 -4
  9. package/src/core/cache/CacheElement.d.ts.map +1 -1
  10. package/src/core/cache/CacheElement.js +4 -0
  11. package/src/core/cache/FrequencySketch.d.ts +0 -21
  12. package/src/core/cache/FrequencySketch.d.ts.map +1 -1
  13. package/src/core/cache/FrequencySketch.js +66 -65
  14. package/src/core/cache/wtinylfu/CacheElementWTinylfu.d.ts +17 -0
  15. package/src/core/cache/wtinylfu/CacheElementWTinylfu.d.ts.map +1 -0
  16. package/src/core/cache/wtinylfu/CacheElementWTinylfu.js +18 -0
  17. package/src/core/cache/wtinylfu/CacheRegionType.d.ts +10 -0
  18. package/src/core/cache/wtinylfu/CacheRegionType.d.ts.map +1 -0
  19. package/src/core/cache/wtinylfu/CacheRegionType.js +10 -0
  20. package/src/core/cache/wtinylfu/CacheRegionWTinylfu.d.ts +66 -0
  21. package/src/core/cache/wtinylfu/CacheRegionWTinylfu.d.ts.map +1 -0
  22. package/src/core/cache/wtinylfu/CacheRegionWTinylfu.js +183 -0
  23. package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts +279 -0
  24. package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts.map +1 -0
  25. package/src/core/cache/wtinylfu/CacheWTinylfu.js +807 -0
  26. package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +243 -0
  27. package/src/core/cache/wtinylfu/wtinylfuDecisions.d.ts +80 -0
  28. package/src/core/cache/wtinylfu/wtinylfuDecisions.d.ts.map +1 -0
  29. package/src/core/cache/wtinylfu/wtinylfuDecisions.js +102 -0
  30. package/src/core/collection/RingBuffer.d.ts.map +1 -1
  31. package/src/core/collection/RingBuffer.js +15 -3
  32. package/src/core/collection/map/HashMap.d.ts +1 -1
  33. package/src/core/collection/map/HashMap.d.ts.map +1 -1
  34. package/src/core/collection/map/HashMap.js +5 -17
  35. package/src/core/geom/2d/line/line2_compute_segment_point_distance_sqr.d.ts.map +1 -1
  36. package/src/core/geom/2d/line/line2_compute_segment_point_distance_sqr.js +5 -0
  37. package/src/core/geom/ConicRay.d.ts.map +1 -1
  38. package/src/core/geom/ConicRay.js +9 -2
  39. package/src/core/geom/Quaternion.d.ts.map +1 -1
  40. package/src/core/geom/Quaternion.js +7 -3
  41. package/src/core/math/build_gaussian_kernel_1d.d.ts +2 -2
  42. package/src/core/math/build_gaussian_kernel_1d.d.ts.map +1 -1
  43. package/src/core/math/build_gaussian_kernel_1d.js +4 -2
  44. package/src/core/math/build_gaussian_kernel_2d.d.ts +2 -2
  45. package/src/core/math/build_gaussian_kernel_2d.d.ts.map +1 -1
  46. package/src/core/math/build_gaussian_kernel_2d.js +4 -2
  47. package/src/core/math/gaussian.d.ts +2 -2
  48. package/src/core/math/gaussian.js +2 -2
  49. package/src/core/math/spline/spline3_bezier_bounds.d.ts.map +1 -1
  50. package/src/core/math/spline/spline3_bezier_bounds.js +10 -3
  51. package/src/core/math/spline/spline3_bezier_to_hermite.d.ts +8 -7
  52. package/src/core/math/spline/spline3_bezier_to_hermite.d.ts.map +1 -1
  53. package/src/core/math/spline/spline3_bezier_to_hermite.js +13 -12
  54. package/src/core/math/spline/spline3_hermite_bounds.d.ts.map +1 -1
  55. package/src/core/math/spline/spline3_hermite_bounds.js +10 -3
  56. package/src/core/math/spline/spline3_hermite_bounds_t.d.ts.map +1 -1
  57. package/src/core/math/spline/spline3_hermite_bounds_t.js +115 -109
  58. package/src/core/math/spline/spline3_hermite_to_bezier.d.ts +2 -0
  59. package/src/core/math/spline/spline3_hermite_to_bezier.d.ts.map +1 -1
  60. package/src/core/math/spline/spline3_hermite_to_bezier.js +2 -0
  61. package/src/core/math/statistics/computeStatisticalMean.js +1 -1
  62. package/src/core/math/statistics/gaussian_amplitude.d.ts.map +1 -1
  63. package/src/core/math/statistics/gaussian_amplitude.js +3 -1
  64. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
  65. package/src/engine/animation/clip/ecd_bind_animation_curve.js +10 -1
  66. package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts +20 -0
  67. package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts.map +1 -0
  68. package/src/engine/animation/clip/hemisphere_align_quaternion_values.js +37 -0
  69. package/src/engine/animation/keyed2/AnimationTrackPlayback.d.ts.map +1 -1
  70. package/src/engine/animation/keyed2/AnimationTrackPlayback.js +5 -1
  71. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  72. package/src/engine/ecs/EntityComponentDataset.js +5 -21
  73. package/src/engine/ecs/fow/FogOfWar.d.ts +22 -0
  74. package/src/engine/ecs/fow/FogOfWar.d.ts.map +1 -1
  75. package/src/engine/ecs/fow/FogOfWar.js +202 -54
  76. package/src/engine/ecs/fow/FogOfWarEdgeMode.d.ts +16 -0
  77. package/src/engine/ecs/fow/FogOfWarEdgeMode.d.ts.map +1 -0
  78. package/src/engine/ecs/fow/FogOfWarEdgeMode.js +39 -0
  79. package/src/engine/ecs/fow/FogOfWarSystem.d.ts.map +1 -1
  80. package/src/engine/ecs/fow/FogOfWarSystem.js +1 -0
  81. package/src/engine/ecs/fow/serialization/FogOfWarSerializationAdapter.d.ts.map +1 -1
  82. package/src/engine/ecs/fow/serialization/FogOfWarSerializationAdapter.js +3 -0
  83. package/src/engine/ecs/fow/shader/FogOfWarRenderer.d.ts +7 -0
  84. package/src/engine/ecs/fow/shader/FogOfWarRenderer.d.ts.map +1 -1
  85. package/src/engine/ecs/fow/shader/FogOfWarRenderer.js +155 -145
  86. package/src/engine/ecs/fow/shader/screenSpaceFogOfWarShader.d.ts.map +1 -1
  87. package/src/engine/ecs/fow/shader/screenSpaceFogOfWarShader.js +33 -8
  88. package/src/engine/ecs/storage/binary/collection/BinaryCollectionDeSerializer.d.ts.map +1 -1
  89. package/src/engine/ecs/storage/binary/collection/BinaryCollectionDeSerializer.js +3 -1
  90. package/src/engine/graphics/GraphicsEngine.d.ts +5 -1
  91. package/src/engine/graphics/GraphicsEngine.d.ts.map +1 -1
  92. package/src/engine/graphics/GraphicsEngine.js +14 -3
  93. package/src/engine/graphics/composit/CompositLayer.d.ts.map +1 -1
  94. package/src/engine/graphics/composit/CompositLayer.js +258 -255
  95. package/src/engine/graphics/composit/LayerCompositer.d.ts +12 -0
  96. package/src/engine/graphics/composit/LayerCompositer.d.ts.map +1 -1
  97. package/src/engine/graphics/composit/LayerCompositer.js +19 -10
  98. package/src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.d.ts +1 -1
  99. package/src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.d.ts.map +1 -1
  100. package/src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +10 -4
  101. package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.d.ts +6 -0
  102. package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.d.ts.map +1 -1
  103. package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +21 -0
  104. package/src/engine/graphics/ecs/path/ribbon/RibbonPathBuilder.d.ts.map +1 -1
  105. package/src/engine/graphics/ecs/path/ribbon/RibbonPathBuilder.js +5 -23
  106. package/src/engine/graphics/ecs/path/tube/build/estimatePathViaIterativeIntegral.d.ts.map +1 -1
  107. package/src/engine/graphics/ecs/path/tube/build/estimatePathViaIterativeIntegral.js +6 -4
  108. package/src/engine/graphics/ecs/water/WaterSystem.d.ts.map +1 -1
  109. package/src/engine/graphics/ecs/water/WaterSystem.js +9 -3
  110. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts +12 -0
  111. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts.map +1 -1
  112. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.js +46 -9
  113. package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts +5 -0
  114. package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts.map +1 -1
  115. package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -0
  116. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts +7 -0
  117. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts.map +1 -1
  118. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.js +8 -0
  119. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts +10 -2
  120. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts.map +1 -1
  121. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +42 -10
  122. package/src/engine/graphics/render/buffer/FrameBuffer.d.ts.map +1 -1
  123. package/src/engine/graphics/render/buffer/FrameBuffer.js +5 -2
  124. package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.d.ts +13 -1
  125. package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.d.ts.map +1 -1
  126. package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +40 -7
  127. package/src/engine/graphics/render/buffer/simple-fx/taa/TemporalSupersamplingRenderPlugin.d.ts.map +1 -1
  128. package/src/engine/graphics/render/buffer/simple-fx/taa/TemporalSupersamplingRenderPlugin.js +10 -4
  129. package/src/engine/graphics/render/forward_plus/LightManager.d.ts.map +1 -1
  130. package/src/engine/graphics/render/forward_plus/LightManager.js +1235 -1232
  131. package/src/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.d.ts +5 -0
  132. package/src/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.d.ts.map +1 -1
  133. package/src/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +11 -10
  134. package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
  135. package/src/engine/graphics/trail/tube/TubeX.js +557 -555
  136. package/src/engine/graphics/trail/x/RibbonXPlugin.d.ts +12 -1
  137. package/src/engine/graphics/trail/x/RibbonXPlugin.d.ts.map +1 -1
  138. package/src/engine/graphics/trail/x/RibbonXPlugin.js +15 -8
  139. package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
  140. package/src/engine/input/ecs/systems/InputControllerSystem.js +9 -6
  141. package/src/engine/navigation/ecs/components/Path.d.ts +5 -2
  142. package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
  143. package/src/engine/navigation/ecs/components/Path.js +10 -4
  144. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +1 -1
  145. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  146. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
@@ -1,255 +1,258 @@
1
- import {
2
- AddEquation,
3
- CustomBlending,
4
- Mesh,
5
- OneFactor,
6
- OneMinusSrcAlphaFactor,
7
- RedFormat,
8
- RGBAFormat,
9
- ShaderMaterial
10
- } from "three";
11
- import { assert } from "../../../core/assert.js";
12
- import Signal from "../../../core/events/signal/Signal.js";
13
- import Vector2 from "../../../core/geom/Vector2.js";
14
- import { FULL_SCREEN_TRIANGLE_GEOMETRY } from "../geometry/FULL_SCREEN_TRIANGLE_GEOMETRY.js";
15
- import { ScreenSpaceQuadShader } from "../shaders/ScreenSpaceQuadShader.js";
16
- import { BlendingType } from "../texture/sampler/BlendingType.js";
17
- import { blendingType2three } from "../texture/sampler/blendingType2Three.js";
18
-
19
- /**
20
- *
21
- * @param {Material} material
22
- * @param {BlendingType} blending
23
- */
24
- function assignMaterialBlending(material, blending) {
25
-
26
- if (blending === BlendingType.MultiplyAdd) {
27
- material.blending = CustomBlending;
28
- material.blendEquation = AddEquation;
29
- material.blendSrc = OneFactor;
30
- material.blendDst = OneMinusSrcAlphaFactor;
31
- } else {
32
- const threeBlending = blendingType2three(blending);
33
-
34
- material.blending = threeBlending;
35
- }
36
-
37
- }
38
-
39
- export class CompositLayer {
40
- /**
41
- *
42
- * @param {THREE.WebGLRenderTarget} renderTarget
43
- * @param {BlendingType} blending
44
- * @param {number} renderTargetScale
45
- */
46
- constructor({
47
- renderTarget,
48
- blending,
49
- renderTargetScale = 1
50
- }) {
51
- /**
52
- * Human-readable name, useful for debugging
53
- * @type {string}
54
- */
55
- this.name = "";
56
-
57
- /**
58
- *
59
- * @type {BlendingType}
60
- */
61
- this.__blending = blending;
62
- /**
63
- *
64
- * @type {WebGLRenderTarget}
65
- */
66
- this.renderTarget = renderTarget;
67
-
68
- /**
69
- *
70
- * @type {number}
71
- */
72
- this.renderTargetScale = renderTargetScale;
73
-
74
- this.object = new Mesh(FULL_SCREEN_TRIANGLE_GEOMETRY, this.buildMaterial());
75
-
76
- /**
77
- * Which compositing stage this layer belongs to, stages are rendered independently
78
- * @type {number}
79
- */
80
- this.stage = 0;
81
-
82
- this.size = new Vector2();
83
-
84
- /**
85
- *
86
- * @type {boolean}
87
- */
88
- this.__enabled = true;
89
-
90
- /**
91
- * Layers are composited in order from lowest to highest
92
- * @type {number}
93
- */
94
- this.__order = 0;
95
-
96
- this.on = {
97
- preRender: new Signal()
98
- };
99
- }
100
-
101
- get blending() {
102
- return this.__blending;
103
- }
104
-
105
- set blending(v) {
106
- if (v === this.__blending) {
107
- return;
108
- }
109
-
110
- this.__blending = v;
111
-
112
- assignMaterialBlending(this.object.material, v);
113
- }
114
-
115
- /**
116
- *
117
- * @param {number} v
118
- */
119
- set order(v) {
120
- this.__order = v;
121
-
122
- this.object.renderOrder = v;
123
- }
124
-
125
- /**
126
- *
127
- * @return {number}
128
- */
129
- get order() {
130
- return this.__order;
131
- }
132
-
133
- /**
134
- *
135
- * @param {number} v
136
- */
137
- set enabled(v) {
138
- if (!this.__enabled && v) {
139
- this.enable();
140
- } else if (this.__enabled && !v) {
141
- this.disable();
142
- }
143
- }
144
-
145
- /**
146
- *
147
- * @returns {boolean}
148
- */
149
- get enabled() {
150
- return this.__enabled;
151
- }
152
-
153
- enable() {
154
- if (!this.__enabled) {
155
- this.__enabled = true;
156
- this.object.visible = true;
157
- }
158
- }
159
-
160
- disable() {
161
- if (this.__enabled) {
162
- this.__enabled = false;
163
- this.object.visible = false;
164
- }
165
- }
166
-
167
- /**
168
- *
169
- * @param {number} x
170
- * @param {number} y
171
- */
172
- setSize(x, y) {
173
- this.size.set(x, y);
174
- this.updateRenderTargetSize();
175
- }
176
-
177
- updateRenderTargetSize() {
178
-
179
- if (this.renderTarget !== null) {
180
- const scale = this.renderTargetScale;
181
-
182
- const size = this.size;
183
-
184
- // clamp to 1: a 0-sized attachment trips GL_INVALID_FRAMEBUFFER_OPERATION on clear/draw
185
- const width = Math.max(1, size.x * scale);
186
- const height = Math.max(1, size.y * scale);
187
-
188
- this.renderTarget.setSize(width, height);
189
- }
190
- }
191
-
192
- /**
193
- *
194
- * @param {number} scale
195
- */
196
- setRenderTargetScale(scale) {
197
- assert.isNumber(scale, 'v');
198
- assert.isFinite(scale, 'v');
199
-
200
- this.renderTargetScale = scale;
201
-
202
- this.updateRenderTargetSize();
203
- }
204
-
205
- /**
206
- * Override screen-space material of the layer. This allows you to render directly into the output buffer, bypassing the need to create an intermediate buffer
207
- * NOTE: Please make sure you know what you're doing if you use this method
208
- * @param {Material} material
209
- */
210
- setCustomMaterial(material) {
211
- assignMaterialBlending(material, this.blending);
212
-
213
- // override material
214
- this.object.material = material;
215
- }
216
-
217
-
218
- buildMaterial() {
219
-
220
-
221
- const uniforms = {
222
- tTexture: {
223
- type: 't',
224
- value: this.renderTarget.texture
225
- }
226
- };
227
-
228
- // determine swizzle for the material
229
- let swizzle;
230
- const texture_format = this.renderTarget.texture.format;
231
- if (texture_format === RedFormat) {
232
- swizzle = ['r', 'r', 'r', 1];
233
- } else if (texture_format === RGBAFormat) {
234
- swizzle = ['r', 'g', 'b', 'a'];
235
- } else {
236
- throw new Error('Unsupported format');
237
- }
238
-
239
- const material = new ShaderMaterial({
240
- uniforms,
241
- vertexShader: ScreenSpaceQuadShader.vertexShader(),
242
- fragmentShader: ScreenSpaceQuadShader.fragmentShader(swizzle),
243
- lights: false,
244
- fog: false,
245
- depthTest: false,
246
- depthWrite: false,
247
- transparent: true,
248
- vertexColors: false
249
- });
250
-
251
- assignMaterialBlending(material, this.blending);
252
-
253
- return material;
254
- }
255
- }
1
+ import {
2
+ AddEquation,
3
+ CustomBlending,
4
+ Mesh,
5
+ OneFactor,
6
+ OneMinusSrcAlphaFactor,
7
+ RedFormat,
8
+ RGBAFormat,
9
+ ShaderMaterial
10
+ } from "three";
11
+ import { assert } from "../../../core/assert.js";
12
+ import Signal from "../../../core/events/signal/Signal.js";
13
+ import Vector2 from "../../../core/geom/Vector2.js";
14
+ import { FULL_SCREEN_TRIANGLE_GEOMETRY } from "../geometry/FULL_SCREEN_TRIANGLE_GEOMETRY.js";
15
+ import { ScreenSpaceQuadShader } from "../shaders/ScreenSpaceQuadShader.js";
16
+ import { BlendingType } from "../texture/sampler/BlendingType.js";
17
+ import { blendingType2three } from "../texture/sampler/blendingType2Three.js";
18
+
19
+ /**
20
+ *
21
+ * @param {Material} material
22
+ * @param {BlendingType} blending
23
+ */
24
+ function assignMaterialBlending(material, blending) {
25
+
26
+ if (blending === BlendingType.MultiplyAdd) {
27
+ material.blending = CustomBlending;
28
+ material.blendEquation = AddEquation;
29
+ material.blendSrc = OneFactor;
30
+ material.blendDst = OneMinusSrcAlphaFactor;
31
+ } else {
32
+ const threeBlending = blendingType2three(blending);
33
+
34
+ material.blending = threeBlending;
35
+ }
36
+
37
+ }
38
+
39
+ export class CompositLayer {
40
+ /**
41
+ *
42
+ * @param {THREE.WebGLRenderTarget} renderTarget
43
+ * @param {BlendingType} blending
44
+ * @param {number} renderTargetScale
45
+ */
46
+ constructor({
47
+ renderTarget,
48
+ blending,
49
+ renderTargetScale = 1
50
+ }) {
51
+ /**
52
+ * Human-readable name, useful for debugging
53
+ * @type {string}
54
+ */
55
+ this.name = "";
56
+
57
+ /**
58
+ *
59
+ * @type {BlendingType}
60
+ */
61
+ this.__blending = blending;
62
+ /**
63
+ *
64
+ * @type {WebGLRenderTarget}
65
+ */
66
+ this.renderTarget = renderTarget;
67
+
68
+ /**
69
+ *
70
+ * @type {number}
71
+ */
72
+ this.renderTargetScale = renderTargetScale;
73
+
74
+ this.object = new Mesh(FULL_SCREEN_TRIANGLE_GEOMETRY, this.buildMaterial());
75
+
76
+ /**
77
+ * Which compositing stage this layer belongs to, stages are rendered independently
78
+ * @type {number}
79
+ */
80
+ this.stage = 0;
81
+
82
+ this.size = new Vector2();
83
+
84
+ /**
85
+ *
86
+ * @type {boolean}
87
+ */
88
+ this.__enabled = true;
89
+
90
+ /**
91
+ * Layers are composited in order from lowest to highest
92
+ * @type {number}
93
+ */
94
+ this.__order = 0;
95
+
96
+ this.on = {
97
+ preRender: new Signal()
98
+ };
99
+ }
100
+
101
+ get blending() {
102
+ return this.__blending;
103
+ }
104
+
105
+ set blending(v) {
106
+ if (v === this.__blending) {
107
+ return;
108
+ }
109
+
110
+ this.__blending = v;
111
+
112
+ assignMaterialBlending(this.object.material, v);
113
+ }
114
+
115
+ /**
116
+ *
117
+ * @param {number} v
118
+ */
119
+ set order(v) {
120
+ this.__order = v;
121
+
122
+ this.object.renderOrder = v;
123
+ }
124
+
125
+ /**
126
+ *
127
+ * @return {number}
128
+ */
129
+ get order() {
130
+ return this.__order;
131
+ }
132
+
133
+ /**
134
+ *
135
+ * @param {number} v
136
+ */
137
+ set enabled(v) {
138
+ if (!this.__enabled && v) {
139
+ this.enable();
140
+ } else if (this.__enabled && !v) {
141
+ this.disable();
142
+ }
143
+ }
144
+
145
+ /**
146
+ *
147
+ * @returns {boolean}
148
+ */
149
+ get enabled() {
150
+ return this.__enabled;
151
+ }
152
+
153
+ enable() {
154
+ if (!this.__enabled) {
155
+ this.__enabled = true;
156
+ this.object.visible = true;
157
+ }
158
+ }
159
+
160
+ disable() {
161
+ if (this.__enabled) {
162
+ this.__enabled = false;
163
+ this.object.visible = false;
164
+ }
165
+ }
166
+
167
+ /**
168
+ *
169
+ * @param {number} x
170
+ * @param {number} y
171
+ */
172
+ setSize(x, y) {
173
+ this.size.set(x, y);
174
+ this.updateRenderTargetSize();
175
+ }
176
+
177
+ updateRenderTargetSize() {
178
+
179
+ if (this.renderTarget !== null) {
180
+ const scale = this.renderTargetScale;
181
+
182
+ const size = this.size;
183
+
184
+ // a render target is a whole number of texels; WebGL truncates fractional dimensions when
185
+ // it allocates, so round here too, otherwise `renderTarget.width` reports a size the
186
+ // texture does not have and any texel math built from it is off by up to a texel
187
+ // clamp to 1: a 0-sized attachment trips GL_INVALID_FRAMEBUFFER_OPERATION on clear/draw
188
+ const width = Math.max(1, Math.floor(size.x * scale));
189
+ const height = Math.max(1, Math.floor(size.y * scale));
190
+
191
+ this.renderTarget.setSize(width, height);
192
+ }
193
+ }
194
+
195
+ /**
196
+ *
197
+ * @param {number} scale
198
+ */
199
+ setRenderTargetScale(scale) {
200
+ assert.isNumber(scale, 'v');
201
+ assert.isFinite(scale, 'v');
202
+
203
+ this.renderTargetScale = scale;
204
+
205
+ this.updateRenderTargetSize();
206
+ }
207
+
208
+ /**
209
+ * Override screen-space material of the layer. This allows you to render directly into the output buffer, bypassing the need to create an intermediate buffer
210
+ * NOTE: Please make sure you know what you're doing if you use this method
211
+ * @param {Material} material
212
+ */
213
+ setCustomMaterial(material) {
214
+ assignMaterialBlending(material, this.blending);
215
+
216
+ // override material
217
+ this.object.material = material;
218
+ }
219
+
220
+
221
+ buildMaterial() {
222
+
223
+
224
+ const uniforms = {
225
+ tTexture: {
226
+ type: 't',
227
+ value: this.renderTarget.texture
228
+ }
229
+ };
230
+
231
+ // determine swizzle for the material
232
+ let swizzle;
233
+ const texture_format = this.renderTarget.texture.format;
234
+ if (texture_format === RedFormat) {
235
+ swizzle = ['r', 'r', 'r', 1];
236
+ } else if (texture_format === RGBAFormat) {
237
+ swizzle = ['r', 'g', 'b', 'a'];
238
+ } else {
239
+ throw new Error('Unsupported format');
240
+ }
241
+
242
+ const material = new ShaderMaterial({
243
+ uniforms,
244
+ vertexShader: ScreenSpaceQuadShader.vertexShader(),
245
+ fragmentShader: ScreenSpaceQuadShader.fragmentShader(swizzle),
246
+ lights: false,
247
+ fog: false,
248
+ depthTest: false,
249
+ depthWrite: false,
250
+ transparent: true,
251
+ vertexColors: false
252
+ });
253
+
254
+ assignMaterialBlending(material, this.blending);
255
+
256
+ return material;
257
+ }
258
+ }
@@ -58,6 +58,18 @@ declare class LayerCompositer {
58
58
  * @returns {number}
59
59
  */
60
60
  getPixelRatio(): number;
61
+ /**
62
+ * Size a single layer to the current output resolution, in device pixels.
63
+ *
64
+ * Every layer resolution goes through here -- on add as well as on resize -- so a layer created
65
+ * after the compositer has already been sized (plugins create their layers during startup, long
66
+ * after the first {@link LayerCompositer#setSize}) lands on exactly the same grid as the layers
67
+ * already registered, rather than on the unscaled size.
68
+ *
69
+ * @param {CompositLayer} layer
70
+ * @private
71
+ */
72
+ private __apply_resolution;
61
73
  __updateResolution(): void;
62
74
  /**
63
75
  *
@@ -1 +1 @@
1
- {"version":3,"file":"LayerCompositer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/composit/LayerCompositer.js"],"names":[],"mappings":";AAaA;IAEQ;;;OAGG;IACH,cAFU,aAAa,EAAE,CAEH;IAGtB,2BAAwD;IACxD,aAAwB;IAExB,cAA6B;IAE7B;;;OAGG;IACH,qBAAqB;IAGzB;;;;OAIG;IACH,cAHW,aAAa,GACX,OAAO,CAgBnB;IAED;;;;;OAKG;IACH,mCAHW,YAAY,GACX,aAAa,CAmCxB;IAED;;;;OAIG;IACH,gBAHW,aAAa,GACX,OAAO,CAanB;IAED;;OAEG;IACH,mBAFa,OAAO,CAenB;IAED;;;;OAIG;IACH,kCAqBC;IAED;;;;OAIG;IACH,oBAHW,MAAM,aAAa,SACnB,MAAM,QAgBhB;IAED;;;OAGG;IACH,qBAFW,MAAM,QAahB;IAED;;;OAGG;IACH,iBAFa,MAAM,CAIlB;IAED,2BAgBC;IAED;;;;OAIG;IACH,WAHW,MAAM,KACN,MAAM,QAMhB;CACJ;8BA/N6B,oBAAoB;mCAJ3C,OAAO;sBAAP,OAAO;oBAEM,+BAA+B;6BACtB,oCAAoC"}
1
+ {"version":3,"file":"LayerCompositer.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/composit/LayerCompositer.js"],"names":[],"mappings":";AAaA;IAEQ;;;OAGG;IACH,cAFU,aAAa,EAAE,CAEH;IAGtB,2BAAwD;IACxD,aAAwB;IAExB,cAA6B;IAE7B;;;OAGG;IACH,qBAAqB;IAGzB;;;;OAIG;IACH,cAHW,aAAa,GACX,OAAO,CAgBnB;IAED;;;;;OAKG;IACH,mCAHW,YAAY,GACX,aAAa,CAmCxB;IAED;;;;OAIG;IACH,gBAHW,aAAa,GACX,OAAO,CAanB;IAED;;OAEG;IACH,mBAFa,OAAO,CAenB;IAED;;;;OAIG;IACH,kCAqBC;IAED;;;;OAIG;IACH,oBAHW,MAAM,aAAa,SACnB,MAAM,QAgBhB;IAED;;;OAGG;IACH,qBAFW,MAAM,QAahB;IAED;;;OAGG;IACH,iBAFa,MAAM,CAIlB;IAED;;;;;;;;;;OAUG;IACH,2BAIC;IAED,2BAQC;IAED;;;;OAIG;IACH,WAHW,MAAM,KACN,MAAM,QAMhB;CACJ;8BAxO6B,oBAAoB;mCAJ3C,OAAO;sBAAP,OAAO;oBAEM,+BAA+B;6BACtB,oCAAoC"}
@@ -105,7 +105,7 @@ class LayerCompositer {
105
105
  return false;
106
106
  }
107
107
 
108
- layer.setSize(this.size.x, this.size.y);
108
+ this.__apply_resolution(layer);
109
109
 
110
110
  this.layerTargets.push(layer);
111
111
 
@@ -204,20 +204,29 @@ class LayerCompositer {
204
204
  return this.__pixelRatio;
205
205
  }
206
206
 
207
- __updateResolution() {
208
- const x = this.size.x;
209
- const y = this.size.y;
207
+ /**
208
+ * Size a single layer to the current output resolution, in device pixels.
209
+ *
210
+ * Every layer resolution goes through here -- on add as well as on resize -- so a layer created
211
+ * after the compositer has already been sized (plugins create their layers during startup, long
212
+ * after the first {@link LayerCompositer#setSize}) lands on exactly the same grid as the layers
213
+ * already registered, rather than on the unscaled size.
214
+ *
215
+ * @param {CompositLayer} layer
216
+ * @private
217
+ */
218
+ __apply_resolution(layer) {
219
+ const pixelRatio = this.__pixelRatio;
210
220
 
211
- const h = y * this.__pixelRatio;
212
- const w = x * this.__pixelRatio;
221
+ layer.setSize(this.size.x * pixelRatio, this.size.y * pixelRatio);
222
+ }
213
223
 
224
+ __updateResolution() {
214
225
  const layerTargets = this.layerTargets;
215
226
 
216
227
  for (let i = 0; i < layerTargets.length; i++) {
217
228
 
218
- const layerTarget = layerTargets[i];
219
-
220
- layerTarget.setSize(w, h);
229
+ this.__apply_resolution(layerTargets[i]);
221
230
 
222
231
  }
223
232
  }
@@ -230,7 +239,7 @@ class LayerCompositer {
230
239
  setSize(x, y) {
231
240
  this.size.set(x, y);
232
241
 
233
- this.__updateResolution(x, y);
242
+ this.__updateResolution();
234
243
  }
235
244
  }
236
245
 
@@ -43,7 +43,7 @@ export class OutlineRenderPlugin extends EnginePlugin {
43
43
  * @param {number} y
44
44
  * @private
45
45
  */
46
- private __set_viewport_size;
46
+ private __set_render_resolution;
47
47
  /**
48
48
  *
49
49
  * @private
@@ -1 +1 @@
1
- {"version":3,"file":"OutlineRenderPlugin.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js"],"names":[],"mappings":"AAYA;IAMQ,4BAAuC;IAEvC,oBAA+B;IAE/B;;;;OAIG;IACH,4BAA+B;IAE/B;;;;OAIG;IACH,iCAA0D;IAE1D;;;;OAIG;IACH,kBAAmB;IAEnB;;;;OAIG;IACH,uBASC;IAGL;;;;OAIG;IACH,iDAFa,OAAO,CAMnB;IAED;;;;OAIG;IACH,oDAFa,OAAO,CAYnB;IAED;;;;;OAKG;IACH,4BAMC;IAED;;;OAGG;IACH,iBAgCC;IAED,yBAwBC;IAED,0BAWC;IAED,uCAaC;CACJ;6BA5L4B,oCAAoC;gCAKjC,gCAAgC;oCAV5B,OAAO"}
1
+ {"version":3,"file":"OutlineRenderPlugin.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js"],"names":[],"mappings":"AAYA;IAMQ,4BAAuC;IAEvC,oBAA+B;IAE/B;;;;OAIG;IACH,4BAA+B;IAE/B;;;;OAIG;IACH,iCAA0D;IAE1D;;;;OAIG;IACH,kBAAmB;IAEnB;;;;OAIG;IACH,uBASC;IAGL;;;;OAIG;IACH,iDAFa,OAAO,CAMnB;IAED;;;;OAIG;IACH,oDAFa,OAAO,CAYnB;IAED;;;;;OAKG;IACH,gCAMC;IAED;;;OAGG;IACH,iBAgCC;IAED,yBA0BC;IAED,0BAeC;IAED,uCAaC;CACJ;6BAlM4B,oCAAoC;gCAKjC,gCAAgC;oCAV5B,OAAO"}
@@ -92,7 +92,7 @@ export class OutlineRenderPlugin extends EnginePlugin {
92
92
  * @param {number} y
93
93
  * @private
94
94
  */
95
- __set_viewport_size(x, y) {
95
+ __set_render_resolution(x, y) {
96
96
  // clamp to 1: 0 cascades to several render targets whose clear() then trips GL_INVALID_FRAMEBUFFER_OPERATION
97
97
  const width = max2(1, x);
98
98
  const height = max2(1, y);
@@ -146,9 +146,11 @@ export class OutlineRenderPlugin extends EnginePlugin {
146
146
  }
147
147
 
148
148
  const graphics = this.engine.graphics;
149
- const viewport_size = graphics.viewport.size;
150
149
 
151
- viewport_size.process(this.__set_viewport_size, this);
150
+ // device pixels, not CSS pixels: the final target is handed to the compositer below, which
151
+ // sizes every layer in device pixels. Two owners on one render target have to agree, or each
152
+ // resize hands it back and forth between the two resolutions
153
+ graphics.output_resolution.process(this.__set_render_resolution, this);
152
154
 
153
155
  // create compositing layer
154
156
  this.__compositing_layer = graphics.layerComposer.createLayer(this.__renderer.__renderTargetFinal, BlendingType.MultiplyAdd);
@@ -170,10 +172,14 @@ export class OutlineRenderPlugin extends EnginePlugin {
170
172
 
171
173
  graphics.on.preRender.remove(this.__render, this);
172
174
 
173
- graphics.viewport.size.onChanged.remove(this.__set_viewport_size, this);
175
+ graphics.output_resolution.onChanged.remove(this.__set_render_resolution, this);
174
176
 
177
+ // this also disposes `__renderTargetFinal`, which the layer was created from
175
178
  graphics.layerComposer.remove(this.__compositing_layer);
176
179
 
180
+ // release memory
181
+ this.__renderer.dispose();
182
+
177
183
  await super.shutdown();
178
184
  }
179
185
 
@@ -122,6 +122,12 @@ export class OutlineRenderer {
122
122
  */
123
123
  render(group: HighlightRenderGroup): void;
124
124
  clearRenderTarget(): void;
125
+ /**
126
+ * Release every GPU resource owned by this renderer. The objects themselves stay usable: three.js
127
+ * re-uploads a disposed texture/target/program on next use, so the renderer can be resized and
128
+ * rendered again afterwards.
129
+ */
130
+ dispose(): void;
125
131
  }
126
132
  import { Scene } from "three";
127
133
  import { OrthographicCamera } from "three";