@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.
- package/build/bundle-worker-image-decoder.js +1 -1
- package/package.json +1 -1
- package/src/CORRECTNESS_HUNT_2026_07_24.md +142 -0
- package/src/core/binary/BinaryBuffer.js +1 -1
- package/src/core/binary/EncodingBinaryBuffer.d.ts.map +1 -1
- package/src/core/binary/EncodingBinaryBuffer.js +3 -1
- package/src/core/cache/Cache.d.ts.map +1 -1
- package/src/core/cache/Cache.js +0 -4
- package/src/core/cache/CacheElement.d.ts.map +1 -1
- package/src/core/cache/CacheElement.js +4 -0
- package/src/core/cache/FrequencySketch.d.ts +0 -21
- package/src/core/cache/FrequencySketch.d.ts.map +1 -1
- package/src/core/cache/FrequencySketch.js +66 -65
- package/src/core/cache/wtinylfu/CacheElementWTinylfu.d.ts +17 -0
- package/src/core/cache/wtinylfu/CacheElementWTinylfu.d.ts.map +1 -0
- package/src/core/cache/wtinylfu/CacheElementWTinylfu.js +18 -0
- package/src/core/cache/wtinylfu/CacheRegionType.d.ts +10 -0
- package/src/core/cache/wtinylfu/CacheRegionType.d.ts.map +1 -0
- package/src/core/cache/wtinylfu/CacheRegionType.js +10 -0
- package/src/core/cache/wtinylfu/CacheRegionWTinylfu.d.ts +66 -0
- package/src/core/cache/wtinylfu/CacheRegionWTinylfu.d.ts.map +1 -0
- package/src/core/cache/wtinylfu/CacheRegionWTinylfu.js +183 -0
- package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts +279 -0
- package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts.map +1 -0
- package/src/core/cache/wtinylfu/CacheWTinylfu.js +807 -0
- package/src/core/cache/wtinylfu/benchmark/CacheWTinylfu.bench.md +243 -0
- package/src/core/cache/wtinylfu/wtinylfuDecisions.d.ts +80 -0
- package/src/core/cache/wtinylfu/wtinylfuDecisions.d.ts.map +1 -0
- package/src/core/cache/wtinylfu/wtinylfuDecisions.js +102 -0
- package/src/core/collection/RingBuffer.d.ts.map +1 -1
- package/src/core/collection/RingBuffer.js +15 -3
- package/src/core/collection/map/HashMap.d.ts +1 -1
- package/src/core/collection/map/HashMap.d.ts.map +1 -1
- package/src/core/collection/map/HashMap.js +5 -17
- package/src/core/geom/2d/line/line2_compute_segment_point_distance_sqr.d.ts.map +1 -1
- package/src/core/geom/2d/line/line2_compute_segment_point_distance_sqr.js +5 -0
- package/src/core/geom/ConicRay.d.ts.map +1 -1
- package/src/core/geom/ConicRay.js +9 -2
- package/src/core/geom/Quaternion.d.ts.map +1 -1
- package/src/core/geom/Quaternion.js +7 -3
- package/src/core/math/build_gaussian_kernel_1d.d.ts +2 -2
- package/src/core/math/build_gaussian_kernel_1d.d.ts.map +1 -1
- package/src/core/math/build_gaussian_kernel_1d.js +4 -2
- package/src/core/math/build_gaussian_kernel_2d.d.ts +2 -2
- package/src/core/math/build_gaussian_kernel_2d.d.ts.map +1 -1
- package/src/core/math/build_gaussian_kernel_2d.js +4 -2
- package/src/core/math/gaussian.d.ts +2 -2
- package/src/core/math/gaussian.js +2 -2
- package/src/core/math/spline/spline3_bezier_bounds.d.ts.map +1 -1
- package/src/core/math/spline/spline3_bezier_bounds.js +10 -3
- package/src/core/math/spline/spline3_bezier_to_hermite.d.ts +8 -7
- package/src/core/math/spline/spline3_bezier_to_hermite.d.ts.map +1 -1
- package/src/core/math/spline/spline3_bezier_to_hermite.js +13 -12
- package/src/core/math/spline/spline3_hermite_bounds.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_bounds.js +10 -3
- package/src/core/math/spline/spline3_hermite_bounds_t.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_bounds_t.js +115 -109
- package/src/core/math/spline/spline3_hermite_to_bezier.d.ts +2 -0
- package/src/core/math/spline/spline3_hermite_to_bezier.d.ts.map +1 -1
- package/src/core/math/spline/spline3_hermite_to_bezier.js +2 -0
- package/src/core/math/statistics/computeStatisticalMean.js +1 -1
- package/src/core/math/statistics/gaussian_amplitude.d.ts.map +1 -1
- package/src/core/math/statistics/gaussian_amplitude.js +3 -1
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
- package/src/engine/animation/clip/ecd_bind_animation_curve.js +10 -1
- package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts +20 -0
- package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts.map +1 -0
- package/src/engine/animation/clip/hemisphere_align_quaternion_values.js +37 -0
- package/src/engine/animation/keyed2/AnimationTrackPlayback.d.ts.map +1 -1
- package/src/engine/animation/keyed2/AnimationTrackPlayback.js +5 -1
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +5 -21
- package/src/engine/ecs/fow/FogOfWar.d.ts +22 -0
- package/src/engine/ecs/fow/FogOfWar.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWar.js +202 -54
- package/src/engine/ecs/fow/FogOfWarEdgeMode.d.ts +16 -0
- package/src/engine/ecs/fow/FogOfWarEdgeMode.d.ts.map +1 -0
- package/src/engine/ecs/fow/FogOfWarEdgeMode.js +39 -0
- package/src/engine/ecs/fow/FogOfWarSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarSystem.js +1 -0
- package/src/engine/ecs/fow/serialization/FogOfWarSerializationAdapter.d.ts.map +1 -1
- package/src/engine/ecs/fow/serialization/FogOfWarSerializationAdapter.js +3 -0
- package/src/engine/ecs/fow/shader/FogOfWarRenderer.d.ts +7 -0
- package/src/engine/ecs/fow/shader/FogOfWarRenderer.d.ts.map +1 -1
- package/src/engine/ecs/fow/shader/FogOfWarRenderer.js +155 -145
- package/src/engine/ecs/fow/shader/screenSpaceFogOfWarShader.d.ts.map +1 -1
- package/src/engine/ecs/fow/shader/screenSpaceFogOfWarShader.js +33 -8
- package/src/engine/ecs/storage/binary/collection/BinaryCollectionDeSerializer.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/collection/BinaryCollectionDeSerializer.js +3 -1
- package/src/engine/graphics/GraphicsEngine.d.ts +5 -1
- package/src/engine/graphics/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics/GraphicsEngine.js +14 -3
- package/src/engine/graphics/composit/CompositLayer.d.ts.map +1 -1
- package/src/engine/graphics/composit/CompositLayer.js +258 -255
- package/src/engine/graphics/composit/LayerCompositer.d.ts +12 -0
- package/src/engine/graphics/composit/LayerCompositer.d.ts.map +1 -1
- package/src/engine/graphics/composit/LayerCompositer.js +19 -10
- package/src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.d.ts +1 -1
- package/src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +10 -4
- package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.d.ts +6 -0
- package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +21 -0
- package/src/engine/graphics/ecs/path/ribbon/RibbonPathBuilder.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/ribbon/RibbonPathBuilder.js +5 -23
- package/src/engine/graphics/ecs/path/tube/build/estimatePathViaIterativeIntegral.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/tube/build/estimatePathViaIterativeIntegral.js +6 -4
- package/src/engine/graphics/ecs/water/WaterSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/water/WaterSystem.js +9 -3
- package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts +12 -0
- package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.js +46 -9
- package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts +5 -0
- package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +8 -0
- package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts +7 -0
- package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.js +8 -0
- package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts +10 -2
- package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +42 -10
- package/src/engine/graphics/render/buffer/FrameBuffer.d.ts.map +1 -1
- package/src/engine/graphics/render/buffer/FrameBuffer.js +5 -2
- package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.d.ts +13 -1
- package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.d.ts.map +1 -1
- package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +40 -7
- package/src/engine/graphics/render/buffer/simple-fx/taa/TemporalSupersamplingRenderPlugin.d.ts.map +1 -1
- package/src/engine/graphics/render/buffer/simple-fx/taa/TemporalSupersamplingRenderPlugin.js +10 -4
- package/src/engine/graphics/render/forward_plus/LightManager.d.ts.map +1 -1
- package/src/engine/graphics/render/forward_plus/LightManager.js +1235 -1232
- package/src/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.d.ts +5 -0
- package/src/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.d.ts.map +1 -1
- package/src/engine/graphics/render/forward_plus/plugin/ForwardPlusRenderingPlugin.js +11 -10
- package/src/engine/graphics/trail/tube/TubeX.d.ts.map +1 -1
- package/src/engine/graphics/trail/tube/TubeX.js +557 -555
- package/src/engine/graphics/trail/x/RibbonXPlugin.d.ts +12 -1
- package/src/engine/graphics/trail/x/RibbonXPlugin.d.ts.map +1 -1
- package/src/engine/graphics/trail/x/RibbonXPlugin.js +15 -8
- package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
- package/src/engine/input/ecs/systems/InputControllerSystem.js +9 -6
- package/src/engine/navigation/ecs/components/Path.d.ts +5 -2
- package/src/engine/navigation/ecs/components/Path.d.ts.map +1 -1
- package/src/engine/navigation/ecs/components/Path.js +10 -4
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- 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
|
-
//
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
this.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
212
|
-
|
|
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
|
-
|
|
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(
|
|
242
|
+
this.__updateResolution();
|
|
234
243
|
}
|
|
235
244
|
}
|
|
236
245
|
|
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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";
|