@needle-tools/engine 5.0.2 → 5.1.0-canary.87c4c44
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/CHANGELOG.md +24 -0
- package/README.md +6 -7
- package/SKILL.md +39 -21
- package/components.needle.json +1 -1
- package/dist/needle-engine.bundle-BlVD1I5a.min.js +1656 -0
- package/dist/{needle-engine.bundle-BoTyA-Le.js → needle-engine.bundle-CFOipCo_.js} +8519 -7920
- package/dist/needle-engine.bundle-DX2Y-SQF.umd.cjs +1656 -0
- package/dist/needle-engine.d.ts +628 -61
- package/dist/needle-engine.js +575 -565
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{vendor-vHLk8sXu.js → vendor-CAcsI0eU.js} +116 -115
- package/dist/{vendor-CntUvmJu.umd.cjs → vendor-CEM38hLE.umd.cjs} +2 -2
- package/dist/{vendor-DPbfJJ4d.min.js → vendor-HRlxIBga.min.js} +2 -2
- package/lib/engine/api.d.ts +2 -0
- package/lib/engine/api.js +2 -0
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/engine_addressables.js +5 -1
- package/lib/engine/engine_addressables.js.map +1 -1
- package/lib/engine/engine_animation.d.ts +14 -7
- package/lib/engine/engine_animation.js +49 -9
- package/lib/engine/engine_animation.js.map +1 -1
- package/lib/engine/engine_components.js +33 -4
- package/lib/engine/engine_components.js.map +1 -1
- package/lib/engine/engine_context.d.ts +7 -2
- package/lib/engine/engine_context.js +10 -2
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_gameobject.d.ts +4 -0
- package/lib/engine/engine_gameobject.js.map +1 -1
- package/lib/engine/engine_init.js +2 -0
- package/lib/engine/engine_init.js.map +1 -1
- package/lib/engine/engine_input.js +4 -1
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_materialpropertyblock.js +1 -20
- package/lib/engine/engine_materialpropertyblock.js.map +1 -1
- package/lib/engine/engine_networking.d.ts +11 -8
- package/lib/engine/engine_networking.js +43 -26
- package/lib/engine/engine_networking.js.map +1 -1
- package/lib/engine/engine_networking_instantiate.d.ts +100 -5
- package/lib/engine/engine_networking_instantiate.js +150 -16
- package/lib/engine/engine_networking_instantiate.js.map +1 -1
- package/lib/engine/engine_networking_prefabs.d.ts +59 -0
- package/lib/engine/engine_networking_prefabs.js +67 -0
- package/lib/engine/engine_networking_prefabs.js.map +1 -0
- package/lib/engine/postprocessing/api.d.ts +2 -0
- package/lib/engine/postprocessing/api.js +2 -0
- package/lib/engine/postprocessing/api.js.map +1 -0
- package/lib/engine/postprocessing/index.d.ts +2 -0
- package/lib/engine/postprocessing/index.js +2 -0
- package/lib/engine/postprocessing/index.js.map +1 -0
- package/lib/engine/postprocessing/postprocessing.d.ts +83 -0
- package/lib/engine/postprocessing/postprocessing.js +280 -0
- package/lib/engine/postprocessing/postprocessing.js.map +1 -0
- package/lib/engine/postprocessing/types.d.ts +39 -0
- package/lib/engine/postprocessing/types.js +2 -0
- package/lib/engine/postprocessing/types.js.map +1 -0
- package/lib/engine/webcomponents/WebXRButtons.js +17 -3
- package/lib/engine/webcomponents/WebXRButtons.js.map +1 -1
- package/lib/engine/webcomponents/icons.js +3 -1
- package/lib/engine/webcomponents/icons.js.map +1 -1
- package/lib/engine/xr/NeedleXRSession.d.ts +1 -0
- package/lib/engine/xr/NeedleXRSession.js +43 -10
- package/lib/engine/xr/NeedleXRSession.js.map +1 -1
- package/lib/engine/xr/init.d.ts +4 -0
- package/lib/engine/xr/init.js +49 -0
- package/lib/engine/xr/init.js.map +1 -0
- package/lib/engine-components/AnimationUtils.d.ts +4 -1
- package/lib/engine-components/AnimationUtils.js +7 -19
- package/lib/engine-components/AnimationUtils.js.map +1 -1
- package/lib/engine-components/AnimatorController.d.ts +135 -2
- package/lib/engine-components/AnimatorController.js +216 -13
- package/lib/engine-components/AnimatorController.js.map +1 -1
- package/lib/engine-components/OrbitControls.d.ts +4 -0
- package/lib/engine-components/OrbitControls.js +5 -1
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/SeeThrough.d.ts +0 -2
- package/lib/engine-components/SeeThrough.js +0 -89
- package/lib/engine-components/SeeThrough.js.map +1 -1
- package/lib/engine-components/SyncedRoom.d.ts +4 -0
- package/lib/engine-components/SyncedRoom.js +23 -8
- package/lib/engine-components/SyncedRoom.js.map +1 -1
- package/lib/engine-components/SyncedTransform.js +5 -5
- package/lib/engine-components/SyncedTransform.js.map +1 -1
- package/lib/engine-components/Voip.d.ts +46 -0
- package/lib/engine-components/Voip.js +126 -2
- package/lib/engine-components/Voip.js.map +1 -1
- package/lib/engine-components/api.d.ts +1 -0
- package/lib/engine-components/api.js +1 -0
- package/lib/engine-components/api.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +5 -2
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +11 -18
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +3 -4
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +6 -15
- package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +2 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
- package/lib/engine-components/postprocessing/Volume.d.ts +18 -11
- package/lib/engine-components/postprocessing/Volume.js +61 -140
- package/lib/engine-components/postprocessing/Volume.js.map +1 -1
- package/lib/engine-components/postprocessing/index.d.ts +1 -0
- package/lib/engine-components/postprocessing/index.js +1 -0
- package/lib/engine-components/postprocessing/index.js.map +1 -1
- package/lib/engine-components/postprocessing/utils.d.ts +2 -0
- package/lib/engine-components/postprocessing/utils.js +2 -0
- package/lib/engine-components/postprocessing/utils.js.map +1 -1
- package/lib/engine-components/ui/Canvas.js +2 -2
- package/lib/engine-components/ui/Canvas.js.map +1 -1
- package/lib/engine-components/ui/Graphic.d.ts +3 -3
- package/lib/engine-components/ui/Graphic.js +6 -2
- package/lib/engine-components/ui/Graphic.js.map +1 -1
- package/lib/engine-components/ui/Text.d.ts +64 -11
- package/lib/engine-components/ui/Text.js +154 -45
- package/lib/engine-components/ui/Text.js.map +1 -1
- package/lib/engine-components/ui/index.d.ts +1 -0
- package/lib/engine-components/ui/index.js +1 -0
- package/lib/engine-components/ui/index.js.map +1 -1
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +25 -3
- package/lib/engine-components-experimental/networking/PlayerSync.js +60 -11
- package/lib/engine-components-experimental/networking/PlayerSync.js.map +1 -1
- package/package.json +6 -5
- package/plugins/vite/ai.d.ts +11 -10
- package/plugins/vite/ai.js +305 -31
- package/plugins/vite/dependencies.js +5 -0
- package/src/engine/api.ts +3 -0
- package/src/engine/engine_addressables.ts +4 -1
- package/src/engine/engine_animation.ts +47 -9
- package/src/engine/engine_components.ts +36 -7
- package/src/engine/engine_context.ts +11 -2
- package/src/engine/engine_gameobject.ts +5 -0
- package/src/engine/engine_init.ts +2 -0
- package/src/engine/engine_input.ts +2 -1
- package/src/engine/engine_materialpropertyblock.ts +1 -20
- package/src/engine/engine_networking.ts +46 -23
- package/src/engine/engine_networking_instantiate.ts +160 -18
- package/src/engine/engine_networking_prefabs.ts +80 -0
- package/src/engine/postprocessing/api.ts +2 -0
- package/src/engine/postprocessing/index.ts +2 -0
- package/src/engine/postprocessing/postprocessing.ts +322 -0
- package/src/engine/postprocessing/types.ts +43 -0
- package/src/engine/webcomponents/WebXRButtons.ts +21 -4
- package/src/engine/webcomponents/icons.ts +5 -3
- package/src/engine/xr/NeedleXRSession.ts +50 -15
- package/src/engine/xr/init.ts +56 -0
- package/src/engine-components/AnimationUtils.ts +7 -17
- package/src/engine-components/AnimatorController.ts +288 -18
- package/src/engine-components/OrbitControls.ts +5 -1
- package/src/engine-components/SeeThrough.ts +0 -116
- package/src/engine-components/SyncedRoom.ts +28 -9
- package/src/engine-components/SyncedTransform.ts +5 -5
- package/src/engine-components/Voip.ts +129 -2
- package/src/engine-components/api.ts +1 -0
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +16 -24
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +9 -16
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +2 -1
- package/src/engine-components/postprocessing/Volume.ts +72 -163
- package/src/engine-components/postprocessing/index.ts +1 -0
- package/src/engine-components/postprocessing/utils.ts +2 -0
- package/src/engine-components/ui/Canvas.ts +2 -2
- package/src/engine-components/ui/Graphic.ts +7 -3
- package/src/engine-components/ui/Text.ts +170 -52
- package/src/engine-components/ui/index.ts +2 -1
- package/src/engine-components-experimental/networking/PlayerSync.ts +64 -11
- package/dist/needle-engine.bundle-B3ywqx5o.min.js +0 -1654
- package/dist/needle-engine.bundle-CzOPcOui.umd.cjs +0 -1654
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { isDevEnvironment } from "../debug/index.js";
|
|
2
|
+
import { DeviceUtilities, getParam } from "../engine_utils.js";
|
|
3
|
+
const debug = getParam("debugpost");
|
|
4
|
+
/**
|
|
5
|
+
* Core postprocessing stack accessible via `context.postprocessing`.
|
|
6
|
+
* Manages the effect pipeline independently of any specific component.
|
|
7
|
+
*
|
|
8
|
+
* Volumes and individual PostProcessingEffect components add/remove effects
|
|
9
|
+
* to this stack. The stack builds the EffectComposer pipeline when dirty.
|
|
10
|
+
*
|
|
11
|
+
* @example Add an effect directly
|
|
12
|
+
* ```ts
|
|
13
|
+
* const bloom = new BloomEffect({ intensity: 3 });
|
|
14
|
+
* this.context.postprocessing.addEffect(bloom);
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @example Remove an effect
|
|
18
|
+
* ```ts
|
|
19
|
+
* this.context.postprocessing.removeEffect(bloom);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export class PostProcessing {
|
|
23
|
+
_context;
|
|
24
|
+
_handler = null;
|
|
25
|
+
_effects = [];
|
|
26
|
+
_isDirty = false;
|
|
27
|
+
/** Currently active postprocessing effects in the stack */
|
|
28
|
+
get effects() {
|
|
29
|
+
return this._effects;
|
|
30
|
+
}
|
|
31
|
+
get dirty() { return this._isDirty; }
|
|
32
|
+
set dirty(value) { this._isDirty = value; }
|
|
33
|
+
/** The internal PostProcessingHandler that manages the EffectComposer pipeline */
|
|
34
|
+
get handler() { return this._handler; }
|
|
35
|
+
/**
|
|
36
|
+
* The effect composer used to render postprocessing effects.
|
|
37
|
+
* This is set internally by the PostProcessingHandler when effects are applied.
|
|
38
|
+
*/
|
|
39
|
+
get composer() { return this._composer; }
|
|
40
|
+
set composer(value) { this._composer = value; }
|
|
41
|
+
_composer = null;
|
|
42
|
+
/**
|
|
43
|
+
* Set multisampling to "auto" to automatically adjust the multisampling level based on performance.
|
|
44
|
+
* Set to a number to manually set the multisampling level.
|
|
45
|
+
* @default "auto"
|
|
46
|
+
*/
|
|
47
|
+
multisampling = "auto";
|
|
48
|
+
/** When enabled, the device pixel ratio will be gradually reduced when FPS is low
|
|
49
|
+
* and restored when performance recovers.
|
|
50
|
+
* @default true
|
|
51
|
+
*/
|
|
52
|
+
adaptiveResolution = true;
|
|
53
|
+
constructor(context) {
|
|
54
|
+
this._context = context;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Add a post processing effect to the stack.
|
|
58
|
+
* The effect stack will be rebuilt on the next update.
|
|
59
|
+
*/
|
|
60
|
+
addEffect(effect) {
|
|
61
|
+
if (this._effects.includes(effect))
|
|
62
|
+
return;
|
|
63
|
+
this._effects.push(effect);
|
|
64
|
+
this._isDirty = true;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Remove a post processing effect from the stack.
|
|
68
|
+
* The effect stack will be rebuilt on the next update.
|
|
69
|
+
*/
|
|
70
|
+
removeEffect(effect) {
|
|
71
|
+
const index = this._effects.indexOf(effect);
|
|
72
|
+
if (index !== -1) {
|
|
73
|
+
this._effects.splice(index, 1);
|
|
74
|
+
this._isDirty = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Mark the stack as dirty so the effects are rebuilt on the next update */
|
|
78
|
+
markDirty() {
|
|
79
|
+
this._isDirty = true;
|
|
80
|
+
}
|
|
81
|
+
// --- Adaptive multisampling state ---
|
|
82
|
+
_enabledTime = -1;
|
|
83
|
+
_multisampleAutoChangeTime = 0;
|
|
84
|
+
_multisampleAutoDecreaseTime = 0;
|
|
85
|
+
/** @internal Called from the context render loop to update the postprocessing pipeline */
|
|
86
|
+
update() {
|
|
87
|
+
const context = this._context;
|
|
88
|
+
if (context.isInXR)
|
|
89
|
+
return;
|
|
90
|
+
// Wait for a camera before applying
|
|
91
|
+
if (this._isDirty && context.mainCamera) {
|
|
92
|
+
this.apply();
|
|
93
|
+
}
|
|
94
|
+
// In tonemapping-only mode, keep renderer values in sync with the active effect
|
|
95
|
+
if (this._tonemappingOnlyActive) {
|
|
96
|
+
const activeEffects = this._effects.filter(e => e.active && e.enabled && e.isToneMapping === true);
|
|
97
|
+
if (activeEffects.length > 0) {
|
|
98
|
+
const effect = activeEffects[activeEffects.length - 1];
|
|
99
|
+
context.renderer.toneMapping = effect.threeToneMapping;
|
|
100
|
+
context.renderer.toneMappingExposure = effect.toneMappingExposure;
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!this._handler || !this._composer || this._handler.composer !== this._composer)
|
|
105
|
+
return;
|
|
106
|
+
// The composer is always a pmndrs EffectComposer (created by PostProcessingHandler)
|
|
107
|
+
const composer = this._composer;
|
|
108
|
+
// Handle context lost
|
|
109
|
+
if (context.renderer.getContext().isContextLost()) {
|
|
110
|
+
context.renderer.forceContextRestore();
|
|
111
|
+
}
|
|
112
|
+
if (composer.getRenderer() !== context.renderer)
|
|
113
|
+
composer.setRenderer(context.renderer);
|
|
114
|
+
composer.setMainScene(context.scene);
|
|
115
|
+
// --- Adaptive multisampling ---
|
|
116
|
+
if (this.multisampling === "auto") {
|
|
117
|
+
if (this._handler.hasSmaaEffect) {
|
|
118
|
+
if (this._handler.multisampling !== 0) {
|
|
119
|
+
this._handler.multisampling = 0;
|
|
120
|
+
if (debug || isDevEnvironment()) {
|
|
121
|
+
console.log(`[PostProcessing] multisampling is disabled because it's set to 'auto' and there is an SMAA effect.\n\nIf you need multisampling consider changing 'auto' to a fixed value (e.g. 4).`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const timeSinceLastChange = context.time.realtimeSinceStartup - this._multisampleAutoChangeTime;
|
|
127
|
+
if (context.time.realtimeSinceStartup - this._enabledTime > 2
|
|
128
|
+
&& timeSinceLastChange > .5) {
|
|
129
|
+
const prev = this._handler.multisampling;
|
|
130
|
+
if (this._handler.multisampling > 0 && context.time.smoothedFps <= 50) {
|
|
131
|
+
this._multisampleAutoChangeTime = context.time.realtimeSinceStartup;
|
|
132
|
+
this._multisampleAutoDecreaseTime = context.time.realtimeSinceStartup;
|
|
133
|
+
let newMultiSample = this._handler.multisampling * .5;
|
|
134
|
+
newMultiSample = Math.floor(newMultiSample);
|
|
135
|
+
if (newMultiSample != this._handler.multisampling) {
|
|
136
|
+
this._handler.multisampling = newMultiSample;
|
|
137
|
+
}
|
|
138
|
+
if (debug)
|
|
139
|
+
console.debug(`[PostProcessing] Reduced multisampling from ${prev} to ${this._handler.multisampling}`);
|
|
140
|
+
}
|
|
141
|
+
else if (timeSinceLastChange > 1
|
|
142
|
+
&& context.time.smoothedFps >= 59
|
|
143
|
+
&& this._handler.multisampling < context.renderer.capabilities.maxSamples
|
|
144
|
+
&& context.time.realtimeSinceStartup - this._multisampleAutoDecreaseTime > 10) {
|
|
145
|
+
this._multisampleAutoChangeTime = context.time.realtimeSinceStartup;
|
|
146
|
+
let newMultiSample = this._handler.multisampling <= 0 ? 1 : this._handler.multisampling * 2;
|
|
147
|
+
newMultiSample = Math.floor(newMultiSample);
|
|
148
|
+
if (newMultiSample !== this._handler.multisampling) {
|
|
149
|
+
this._handler.multisampling = newMultiSample;
|
|
150
|
+
}
|
|
151
|
+
if (debug)
|
|
152
|
+
console.debug(`[PostProcessing] Increased multisampling from ${prev} to ${this._handler.multisampling}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const newMultiSample = Math.max(0, Math.min(this.multisampling, context.renderer.capabilities.maxSamples));
|
|
159
|
+
if (newMultiSample !== this._handler.multisampling)
|
|
160
|
+
this._handler.multisampling = newMultiSample;
|
|
161
|
+
}
|
|
162
|
+
// --- Adaptive pixel ratio ---
|
|
163
|
+
this._handler.adaptivePixelRatio = this.adaptiveResolution;
|
|
164
|
+
this._handler.updateAdaptivePixelRatio();
|
|
165
|
+
// Update camera on passes if needed
|
|
166
|
+
if (context.mainCamera) {
|
|
167
|
+
const passes = composer.passes;
|
|
168
|
+
for (const pass of passes) {
|
|
169
|
+
if (pass.mainCamera && pass.mainCamera !== context.mainCamera) {
|
|
170
|
+
composer.setMainCamera(context.mainCamera);
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
_lastApplyTime;
|
|
177
|
+
_rapidApplyCount = 0;
|
|
178
|
+
// --- Tonemapping-only state ---
|
|
179
|
+
/** When true, tonemapping is applied directly to the renderer (no full pipeline) */
|
|
180
|
+
_tonemappingOnlyActive = false;
|
|
181
|
+
_previousToneMapping;
|
|
182
|
+
_previousToneMappingExposure;
|
|
183
|
+
apply() {
|
|
184
|
+
if (debug)
|
|
185
|
+
console.log(`[PostProcessing] Apply stack (${this._effects.length} effects)`);
|
|
186
|
+
if (isDevEnvironment()) {
|
|
187
|
+
if (this._lastApplyTime !== undefined && Date.now() - this._lastApplyTime < 100) {
|
|
188
|
+
this._rapidApplyCount++;
|
|
189
|
+
if (this._rapidApplyCount === 5)
|
|
190
|
+
console.warn("[PostProcessing] Detected rapid post processing modifications - this might be a bug");
|
|
191
|
+
}
|
|
192
|
+
this._lastApplyTime = Date.now();
|
|
193
|
+
}
|
|
194
|
+
this._isDirty = false;
|
|
195
|
+
// Collect active effects
|
|
196
|
+
const activeEffects = this._effects.filter(e => e.active && e.enabled);
|
|
197
|
+
if (activeEffects.length <= 0) {
|
|
198
|
+
this.restoreTonemapping();
|
|
199
|
+
this._handler?.unapply(false);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// Check if ALL active effects are tonemapping-only
|
|
203
|
+
const allToneMapping = activeEffects.every(e => e.isToneMapping === true);
|
|
204
|
+
if (allToneMapping) {
|
|
205
|
+
// Use the last tonemapping effect added (last in the array)
|
|
206
|
+
const tonemappingEffect = activeEffects[activeEffects.length - 1];
|
|
207
|
+
if (debug)
|
|
208
|
+
console.log(`[PostProcessing] Only tonemapping effects in stack — applying directly to renderer`);
|
|
209
|
+
// Store previous values on first activation
|
|
210
|
+
if (!this._tonemappingOnlyActive) {
|
|
211
|
+
this._previousToneMapping = this._context.renderer.toneMapping;
|
|
212
|
+
this._previousToneMappingExposure = this._context.renderer.toneMappingExposure;
|
|
213
|
+
this._tonemappingOnlyActive = true;
|
|
214
|
+
}
|
|
215
|
+
// Apply tonemapping directly to renderer
|
|
216
|
+
this._context.renderer.toneMapping = tonemappingEffect.threeToneMapping;
|
|
217
|
+
this._context.renderer.toneMappingExposure = tonemappingEffect.toneMappingExposure;
|
|
218
|
+
// Tear down any existing postprocessing pipeline
|
|
219
|
+
this._handler?.unapply(false);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
// We have non-tonemapping effects — restore renderer tonemapping if we were in tonemapping-only mode
|
|
223
|
+
this.restoreTonemapping();
|
|
224
|
+
// Build full postprocessing pipeline
|
|
225
|
+
this.ensureHandler()
|
|
226
|
+
.then(handler => {
|
|
227
|
+
if (!handler)
|
|
228
|
+
return;
|
|
229
|
+
return handler.apply(activeEffects);
|
|
230
|
+
})
|
|
231
|
+
.then(() => {
|
|
232
|
+
if (this._handler) {
|
|
233
|
+
if (this.multisampling === "auto") {
|
|
234
|
+
this._handler.multisampling = DeviceUtilities.isMobileDevice()
|
|
235
|
+
? 2
|
|
236
|
+
: 4;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
this._handler.multisampling = Math.max(0, Math.min(this.multisampling, this._context.renderer.capabilities.maxSamples));
|
|
240
|
+
}
|
|
241
|
+
if (debug)
|
|
242
|
+
console.debug(`[PostProcessing] Set multisampling to ${this._handler.multisampling} (Is Mobile: ${DeviceUtilities.isMobileDevice()})`);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
this._enabledTime = this._context.time.realtimeSinceStartup;
|
|
246
|
+
}
|
|
247
|
+
/** Restore renderer tonemapping to previous values when leaving tonemapping-only mode */
|
|
248
|
+
restoreTonemapping() {
|
|
249
|
+
if (this._tonemappingOnlyActive) {
|
|
250
|
+
if (this._previousToneMapping !== undefined)
|
|
251
|
+
this._context.renderer.toneMapping = this._previousToneMapping;
|
|
252
|
+
if (this._previousToneMappingExposure !== undefined)
|
|
253
|
+
this._context.renderer.toneMappingExposure = this._previousToneMappingExposure;
|
|
254
|
+
this._tonemappingOnlyActive = false;
|
|
255
|
+
this._previousToneMapping = undefined;
|
|
256
|
+
this._previousToneMappingExposure = undefined;
|
|
257
|
+
if (debug)
|
|
258
|
+
console.log(`[PostProcessing] Restored renderer tonemapping`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/** Lazily creates the PostProcessingHandler to avoid loading the postprocessing library until actually needed */
|
|
262
|
+
async ensureHandler() {
|
|
263
|
+
if (!this._handler) {
|
|
264
|
+
const { PostProcessingHandler } = await import("../../engine-components/postprocessing/PostProcessingHandler.js");
|
|
265
|
+
if (!this._handler) {
|
|
266
|
+
this._handler = new PostProcessingHandler(this._context);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return this._handler;
|
|
270
|
+
}
|
|
271
|
+
/** @internal */
|
|
272
|
+
dispose() {
|
|
273
|
+
this.restoreTonemapping();
|
|
274
|
+
this._handler?.dispose();
|
|
275
|
+
this._handler = null;
|
|
276
|
+
this._composer = null;
|
|
277
|
+
this._effects.length = 0;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=postprocessing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postprocessing.js","sourceRoot":"","sources":["../../../src/engine/postprocessing/postprocessing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG/D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAEpC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;IAEN,QAAQ,CAAU;IAC3B,QAAQ,GAAkC,IAAI,CAAC;IACtC,QAAQ,GAA4B,EAAE,CAAC;IAChD,QAAQ,GAAY,KAAK,CAAC;IAElC,2DAA2D;IAC3D,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,KAAc,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;IAEpD,kFAAkF;IAClF,IAAI,OAAO,KAAoC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEtE;;;OAGG;IACH,IAAI,QAAQ,KAAkD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACtF,IAAI,QAAQ,CAAC,KAAkD,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;IACpF,SAAS,GAAgD,IAAI,CAAC;IAEtE;;;;OAIG;IACH,aAAa,GAAoB,MAAM,CAAC;IAExC;;;OAGG;IACH,kBAAkB,GAAY,IAAI,CAAC;IAEnC,YAAY,OAAgB;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,MAA6B;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO;QAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,MAA6B;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACzB,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,SAAS;QACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,uCAAuC;IAC/B,YAAY,GAAW,CAAC,CAAC,CAAC;IAC1B,0BAA0B,GAAW,CAAC,CAAC;IACvC,4BAA4B,GAAW,CAAC,CAAC;IAEjD,0FAA0F;IAC1F,MAAM;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO;QAE3B,oCAAoC;QACpC,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,gFAAgF;QAChF,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;YACnG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAuB,CAAC;gBAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;gBACvD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;YACtE,CAAC;YACD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3F,oFAAoF;QACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAA2B,CAAC;QAElD,sBAAsB;QACtB,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC;YAChD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,QAAQ;YAC3C,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE3C,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAErC,iCAAiC;QACjC,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;oBACpC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;oBAChC,IAAI,KAAK,IAAI,gBAAgB,EAAE,EAAE,CAAC;wBAC9B,OAAO,CAAC,GAAG,CAAC,qLAAqL,CAAC,CAAC;oBACvM,CAAC;gBACL,CAAC;YACL,CAAC;iBACI,CAAC;gBACF,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,0BAA0B,CAAC;gBAEhG,IAAI,OAAO,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC;uBACtD,mBAAmB,GAAG,EAAE,EAC7B,CAAC;oBACC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAEzC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;wBACpE,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;wBACpE,IAAI,CAAC,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;wBACtE,IAAI,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,EAAE,CAAC;wBACtD,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;wBAC5C,IAAI,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;4BAChD,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,cAAc,CAAC;wBACjD,CAAC;wBACD,IAAI,KAAK;4BAAE,OAAO,CAAC,KAAK,CAAC,+CAA+C,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;oBACtH,CAAC;yBACI,IAAI,mBAAmB,GAAG,CAAC;2BACzB,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;2BAC9B,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU;2BACtE,OAAO,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,4BAA4B,GAAG,EAAE,EAC/E,CAAC;wBACC,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;wBACpE,IAAI,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,CAAC;wBAC5F,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;wBAC5C,IAAI,cAAc,KAAK,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;4BACjD,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,cAAc,CAAC;wBACjD,CAAC;wBACD,IAAI,KAAK;4BAAE,OAAO,CAAC,KAAK,CAAC,iDAAiD,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;oBACxH,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;aACI,CAAC;YACF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAuB,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;YACrH,IAAI,cAAc,KAAK,IAAI,CAAC,QAAQ,CAAC,aAAa;gBAC9C,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,cAAc,CAAC;QACrD,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,QAAQ,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC;QAEzC,oCAAoC;QACpC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC5D,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBAC3C,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEO,cAAc,CAAU;IACxB,gBAAgB,GAAG,CAAC,CAAC;IAE7B,iCAAiC;IACjC,oFAAoF;IAC5E,sBAAsB,GAAG,KAAK,CAAC;IAC/B,oBAAoB,CAAe;IACnC,4BAA4B,CAAU;IAEtC,KAAK;QACT,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,CAAC,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;QAEzF,IAAI,gBAAgB,EAAE,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;gBAC9E,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;YAC5G,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,yBAAyB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;QAEvE,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,mDAAmD;QACnD,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;QAE1E,IAAI,cAAc,EAAE,CAAC;YACjB,4DAA4D;YAC5D,MAAM,iBAAiB,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAuB,CAAC;YAExF,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;YAE7G,4CAA4C;YAC5C,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAA0B,CAAC;gBAC9E,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAC/E,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACvC,CAAC;YAED,yCAAyC;YACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,GAAG,iBAAiB,CAAC,gBAAgB,CAAC;YACxE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,GAAG,iBAAiB,CAAC,mBAAmB,CAAC;YAEnF,iDAAiD;YACjD,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,qGAAqG;QACrG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,qCAAqC;QACrC,IAAI,CAAC,aAAa,EAAE;aACf,IAAI,CAAC,OAAO,CAAC,EAAE;YACZ,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,OAAO,CAAC,KAAK,CAAC,aAAa,CAAyB,CAAC;QAChE,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,EAAE;YACP,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;oBAChC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,eAAe,CAAC,cAAc,EAAE;wBAC1D,CAAC,CAAC,CAAC;wBACH,CAAC,CAAC,CAAC,CAAC;gBACZ,CAAC;qBACI,CAAC;oBACF,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;gBACtI,CAAC;gBACD,IAAI,KAAK;oBAAE,OAAO,CAAC,KAAK,CAAC,yCAAyC,IAAI,CAAC,QAAQ,CAAC,aAAa,gBAAgB,eAAe,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACtJ,CAAC;QACL,CAAC,CAAC,CAAC;QAEP,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAChE,CAAC;IAED,yFAAyF;IACjF,kBAAkB;QACtB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS;gBACvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC;YACnE,IAAI,IAAI,CAAC,4BAA4B,KAAK,SAAS;gBAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC,4BAA4B,CAAC;YACnF,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;YACtC,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;YAC9C,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC7E,CAAC;IACL,CAAC;IAED,iHAAiH;IACzG,KAAK,CAAC,aAAa;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,iEAAiE,CAAC,CAAC;YAClH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7D,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,gBAAgB;IAChB,OAAO;QACH,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,CAAC;CACJ"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { EffectComposer } from "postprocessing";
|
|
2
|
+
import type { ToneMapping } from "three";
|
|
3
|
+
import type { EffectComposer as ThreeEffectComposer } from "three/examples/jsm/postprocessing/EffectComposer.js";
|
|
4
|
+
/**
|
|
5
|
+
* Minimal interface for a postprocessing effect as seen by the core stack.
|
|
6
|
+
* Implemented by `PostProcessingEffect` in engine-components.
|
|
7
|
+
*/
|
|
8
|
+
export interface IPostProcessingEffect {
|
|
9
|
+
readonly active: boolean;
|
|
10
|
+
readonly enabled: boolean;
|
|
11
|
+
/** When true, this effect is a tonemapping effect. The core stack uses this to detect tonemapping-only scenarios. */
|
|
12
|
+
readonly isToneMapping?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extended interface for tonemapping effects.
|
|
16
|
+
* When ONLY tonemapping effects are in the stack, the core applies tonemapping
|
|
17
|
+
* directly to the renderer instead of creating a full postprocessing pipeline.
|
|
18
|
+
*/
|
|
19
|
+
export interface ITonemappingEffect extends IPostProcessingEffect {
|
|
20
|
+
readonly isToneMapping: true;
|
|
21
|
+
/** The three.js ToneMapping enum value to apply to the renderer */
|
|
22
|
+
readonly threeToneMapping: ToneMapping;
|
|
23
|
+
/** The exposure value to apply to the renderer */
|
|
24
|
+
readonly toneMappingExposure: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Interface for the pipeline builder that manages the EffectComposer.
|
|
28
|
+
* Implemented by `PostProcessingHandler` in engine-components.
|
|
29
|
+
*/
|
|
30
|
+
export interface IPostProcessingHandler {
|
|
31
|
+
readonly composer: EffectComposer | ThreeEffectComposer | null;
|
|
32
|
+
readonly hasSmaaEffect: boolean;
|
|
33
|
+
multisampling: number;
|
|
34
|
+
adaptivePixelRatio: boolean;
|
|
35
|
+
apply(effects: IPostProcessingEffect[]): Promise<void>;
|
|
36
|
+
unapply(dispose?: boolean): void;
|
|
37
|
+
updateAdaptivePixelRatio(): void;
|
|
38
|
+
dispose(): void;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engine/postprocessing/types.ts"],"names":[],"mappings":""}
|
|
@@ -101,10 +101,24 @@ export class WebXRButtonFactory {
|
|
|
101
101
|
this._arButton = button;
|
|
102
102
|
button.classList.add("webxr-button");
|
|
103
103
|
button.dataset["needle"] = "webxr-ar-button";
|
|
104
|
-
button.innerText = "Enter AR";
|
|
105
|
-
button.prepend(getIconElement("view_in_ar"));
|
|
106
104
|
button.title = "Click to start an AR session";
|
|
107
|
-
|
|
105
|
+
const setDefaultText = () => {
|
|
106
|
+
button.innerText = "Enter AR";
|
|
107
|
+
button.prepend(getIconElement("view_in_ar"));
|
|
108
|
+
};
|
|
109
|
+
setDefaultText();
|
|
110
|
+
let tapAgainTimeout;
|
|
111
|
+
button.addEventListener("click", () => {
|
|
112
|
+
NeedleXRSession.start(mode, init);
|
|
113
|
+
if (DeviceUtilities.isiOS() && !DeviceUtilities.isVisionOS()) {
|
|
114
|
+
setTimeout(() => {
|
|
115
|
+
button.innerHTML = "Tap again";
|
|
116
|
+
button.prepend(getIconElement("view_in_ar"));
|
|
117
|
+
clearTimeout(tapAgainTimeout);
|
|
118
|
+
tapAgainTimeout = setTimeout(setDefaultText, 4000);
|
|
119
|
+
}, 500);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
108
122
|
NeedleMenu.setElementPriority(button, arButtonPriority);
|
|
109
123
|
this.updateSessionSupported(button, mode);
|
|
110
124
|
this.listenToXRSessionState(button, mode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRButtons.js","sourceRoot":"","sources":["../../../src/engine/webcomponents/WebXRButtons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,2BAA2B,
|
|
1
|
+
{"version":3,"file":"WebXRButtons.js","sourceRoot":"","sources":["../../../src/engine/webcomponents/WebXRButtons.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,8 +18,10 @@ export function getIconElement(str) {
|
|
|
18
18
|
span.setAttribute("aria-label", str + " icon");
|
|
19
19
|
span.setAttribute("aria-hidden", "true");
|
|
20
20
|
fontReady(fontname).then(res => {
|
|
21
|
-
if (res)
|
|
21
|
+
if (res) {
|
|
22
22
|
span.style.visibility = "";
|
|
23
|
+
span.innerText = str; // re-assign, otherise more_vert doesnt show up. Maybe because of layout restructuring on mobile
|
|
24
|
+
}
|
|
23
25
|
else {
|
|
24
26
|
if (str === "more_vert") {
|
|
25
27
|
span.style.visibility = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../src/engine/webcomponents/icons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../src/engine/webcomponents/icons.ts"],"names":[],"mappings":"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"}
|
|
@@ -122,6 +122,7 @@ export declare class NeedleXRSession implements INeedleXRSession {
|
|
|
122
122
|
* @returns true if the browser supports the given XRSessionMode
|
|
123
123
|
*/
|
|
124
124
|
static isSessionSupported(mode: XRSessionMode): Promise<boolean>;
|
|
125
|
+
private static _sessionSupportedCache;
|
|
125
126
|
private static _currentSessionRequest?;
|
|
126
127
|
private static _activeSession;
|
|
127
128
|
/** Register to listen to XRSession start events. Unsubscribe with `offXRSessionStart` */
|
|
@@ -33,7 +33,6 @@ function getDOMOverlayElement(domElement) {
|
|
|
33
33
|
}
|
|
34
34
|
handleSessionGranted();
|
|
35
35
|
async function handleSessionGranted() {
|
|
36
|
-
// await delay(400);
|
|
37
36
|
let defaultMode = "immersive-vr";
|
|
38
37
|
try {
|
|
39
38
|
// In app clips we default to AR
|
|
@@ -56,7 +55,6 @@ async function handleSessionGranted() {
|
|
|
56
55
|
// showBalloonWarning("NeedleXRSession: Error while checking XR support: " + (e as Error).message);
|
|
57
56
|
return;
|
|
58
57
|
}
|
|
59
|
-
// showBalloonMessage("sessiongranted: " + defaultMode);
|
|
60
58
|
// TODO: asap session granted doesnt handle the pre-room yet
|
|
61
59
|
if (getParam("debugasap")) {
|
|
62
60
|
let asapSession = globalThis["needle:XRSession"];
|
|
@@ -262,8 +260,18 @@ export class NeedleXRSession {
|
|
|
262
260
|
* @param mode The XRSessionMode to check if it is supported
|
|
263
261
|
* @returns true if the browser supports the given XRSessionMode
|
|
264
262
|
*/
|
|
265
|
-
static isSessionSupported(mode) {
|
|
266
|
-
|
|
263
|
+
static isSessionSupported(mode) {
|
|
264
|
+
// We cache the result of the session support check to avoid unnecessary calls to isSessionSupported. This is especially important for user input events that internally run session support checks during onclick where the event must be resolved as fast as possible.
|
|
265
|
+
if (this._sessionSupportedCache[mode] !== undefined) {
|
|
266
|
+
return Promise.resolve(this._sessionSupportedCache[mode]);
|
|
267
|
+
}
|
|
268
|
+
return this.xrSystem?.isSessionSupported(mode).then(supported => {
|
|
269
|
+
this._sessionSupportedCache[mode] = supported;
|
|
270
|
+
return supported;
|
|
271
|
+
}).catch(err => { if (debug)
|
|
272
|
+
console.error(err); return false; }) ?? Promise.resolve(false);
|
|
273
|
+
}
|
|
274
|
+
static _sessionSupportedCache = {};
|
|
267
275
|
static _currentSessionRequest;
|
|
268
276
|
static _activeSession;
|
|
269
277
|
/** Register to listen to XRSession start events. Unsubscribe with `offXRSessionStart` */
|
|
@@ -395,9 +403,10 @@ export class NeedleXRSession {
|
|
|
395
403
|
// handle iOS platform where "immersive-ar" is special:
|
|
396
404
|
// - we either launch QuickLook
|
|
397
405
|
// - or forward to the Needle App Clip experience for WebXR AR
|
|
398
|
-
// TODO: should we add a separate mode (e.g. "AR")? https://linear.app/needle/issue/NE-5303
|
|
399
406
|
if (DeviceUtilities.isiOS()) {
|
|
400
|
-
|
|
407
|
+
// IMPORTANT: on iOS we should have prefetched immersive-ar support already on app start (this is done in xrInit()) - if not then clicking the Enter AR button for the very first time does not immediately open the AppClip overlay.
|
|
408
|
+
// Without an async await here the overlay *does* however open even when clicking for the very first time. (To test this you need to clear the local experience cache on device)
|
|
409
|
+
const arSupported = this._sessionSupportedCache["immersive-ar"] ?? await this.isARSupported();
|
|
401
410
|
// On VisionOS, we use QuickLook for AR experiences; no AppClip support for now.
|
|
402
411
|
if (DeviceUtilities.isVisionOS() && !arSupported && (mode === "ar" || mode === "immersive-ar")) {
|
|
403
412
|
mode = "quicklook";
|
|
@@ -412,6 +421,9 @@ export class NeedleXRSession {
|
|
|
412
421
|
}
|
|
413
422
|
if (!arSupported && (mode === "immersive-ar" || mode === "ar")) {
|
|
414
423
|
this.invokeSessionRequestStart("immersive-ar", init);
|
|
424
|
+
// if we are in an iframe, we need to navigate the top window
|
|
425
|
+
const topWindow = window.top || window;
|
|
426
|
+
const originalUrl = topWindow.location.href;
|
|
415
427
|
// Forward to the AppClip experience (Using the apple.com url the appclip overlay shows immediately)
|
|
416
428
|
// const url =`https://appclip.needle.tools/ar?url=${(location.href)}`;
|
|
417
429
|
const url = new URL("https://appclip.apple.com/id?p=tools.needle.launch-app.Clip");
|
|
@@ -422,16 +434,37 @@ export class NeedleXRSession {
|
|
|
422
434
|
source: "NeedleXRSession.start",
|
|
423
435
|
url: urlStr,
|
|
424
436
|
});
|
|
425
|
-
// if we are in an iframe, we need to navigate the top window
|
|
426
|
-
const topWindow = window.top || window;
|
|
427
437
|
try {
|
|
428
438
|
console.debug("iOS device detected - opening Needle App Clip for AR experience", { mode, init, url });
|
|
439
|
+
// Prewarm the appclip by opening the URL
|
|
440
|
+
// BUT on safari triggering this with multiple URLs causes the
|
|
441
|
+
// Browser to show the dialogue AGAIN in the background
|
|
442
|
+
// SO: we don't do it here...
|
|
443
|
+
const key = "appclip-prewarm:" + new URL(url).origin;
|
|
444
|
+
const allowMultipleNavigations = sessionStorage.getItem(key) === null;
|
|
445
|
+
if (allowMultipleNavigations) {
|
|
446
|
+
const secondUrl = new URL(url);
|
|
447
|
+
secondUrl.searchParams.set("prewarm", "1");
|
|
448
|
+
// eslint-disable-next-line xss/no-location-href-assign
|
|
449
|
+
topWindow.location.href = secondUrl.toString();
|
|
450
|
+
// wait a bit to give the device time to fetch the app clip metadata - this seems to fix the double tap issue (500 ms seem to work)
|
|
451
|
+
await new Promise(res => setTimeout(res, 300));
|
|
452
|
+
}
|
|
429
453
|
// navigate to app clip url but keep the current url in history, open in same tab
|
|
430
454
|
// eslint-disable-next-line xss/no-location-href-assign
|
|
431
455
|
topWindow.location.href = urlStr;
|
|
456
|
+
if (allowMultipleNavigations && !DeviceUtilities.isSafari()) {
|
|
457
|
+
setTimeout(() => {
|
|
458
|
+
const url2 = new URL(url);
|
|
459
|
+
url2.searchParams.set("prewarm", "1");
|
|
460
|
+
// eslint-disable-next-line xss/no-location-href-assign
|
|
461
|
+
topWindow.location.href = url2.toString();
|
|
462
|
+
}, 500);
|
|
463
|
+
}
|
|
464
|
+
sessionStorage.setItem(key, "1");
|
|
432
465
|
}
|
|
433
466
|
catch (e) {
|
|
434
|
-
console.warn(
|
|
467
|
+
console.warn(`Error navigating to AppClip ${urlStr}\n`, e);
|
|
435
468
|
// if top window navigation fails and we are in an iframe, we try to navigate the top window directly
|
|
436
469
|
const weAreInIframe = window !== window.top;
|
|
437
470
|
if (weAreInIframe) {
|
|
@@ -449,7 +482,7 @@ export class NeedleXRSession {
|
|
|
449
482
|
}
|
|
450
483
|
}
|
|
451
484
|
if (mode === "quicklook") {
|
|
452
|
-
console.
|
|
485
|
+
console.error("QuickLook mode is only supported on iOS devices.");
|
|
453
486
|
return null;
|
|
454
487
|
}
|
|
455
488
|
// Since we now know we are not on iOS, ar mode becomes "immersive-ar"
|