@needle-tools/engine 4.6.1-next.26cf56c → 4.6.1-next.2b1af6a
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/dist/{needle-engine.bundle-gJVfKnbJ.js → needle-engine.bundle-BBxAzv6J.js} +9228 -9100
- package/dist/{needle-engine.bundle-B23LP9xh.min.js → needle-engine.bundle-BwVJc8bG.min.js} +213 -201
- package/dist/{needle-engine.bundle-B0Kku0-E.umd.cjs → needle-engine.bundle-cvRBTPLl.umd.cjs} +190 -178
- package/dist/needle-engine.js +351 -350
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-BPhSPjAn.umd.cjs → postprocessing-CjW23fio.umd.cjs} +17 -17
- package/dist/{postprocessing-XKNCD6By.js → postprocessing-DYLNOL3W.js} +1 -0
- package/dist/{postprocessing-DoBd3XIR.min.js → postprocessing-xYQWCHFu.min.js} +26 -26
- package/lib/engine/engine_context.d.ts +4 -1
- package/lib/engine/engine_context.js +9 -2
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_three_utils.d.ts +17 -14
- package/lib/engine/engine_three_utils.js +106 -53
- package/lib/engine/engine_three_utils.js.map +1 -1
- package/lib/engine/engine_tonemapping.d.ts +4 -0
- package/lib/engine/engine_tonemapping.js +21 -18
- package/lib/engine/engine_tonemapping.js.map +1 -1
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +4 -1
- package/lib/engine/webcomponents/needle-engine.extras.js +3 -3
- package/lib/engine/webcomponents/needle-engine.extras.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.js +11 -21
- package/lib/engine/webcomponents/needle-engine.js.map +1 -1
- package/lib/engine-components/CameraUtils.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +2 -1
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +2 -2
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +5 -2
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +8 -0
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +27 -8
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +1 -0
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +1 -0
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +4 -0
- package/lib/engine-components/postprocessing/Effects/Sharpening.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +2 -9
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +22 -57
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -0
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +52 -0
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js.map +1 -0
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +18 -0
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +20 -2
- package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +10 -4
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +180 -126
- package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
- package/lib/engine-components/postprocessing/Volume.d.ts +0 -1
- package/lib/engine-components/postprocessing/Volume.js +49 -42
- 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 +41 -0
- package/lib/engine-components/postprocessing/utils.js +82 -0
- package/lib/engine-components/postprocessing/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/engine_context.ts +13 -4
- package/src/engine/engine_three_utils.ts +134 -58
- package/src/engine/engine_tonemapping.ts +23 -24
- package/src/engine/engine_utils.ts +2 -2
- package/src/engine/webcomponents/needle-engine.extras.ts +3 -3
- package/src/engine/webcomponents/needle-engine.ts +14 -25
- package/src/engine-components/CameraUtils.ts +3 -3
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +2 -1
- package/src/engine-components/postprocessing/Effects/BloomEffect.ts +6 -4
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +24 -13
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +1 -0
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +5 -0
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +24 -66
- package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -0
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +21 -2
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +201 -130
- package/src/engine-components/postprocessing/Volume.ts +50 -47
- package/src/engine-components/postprocessing/index.ts +2 -1
- package/src/engine-components/postprocessing/utils.ts +100 -2
|
@@ -1,70 +1,18 @@
|
|
|
1
1
|
import type { ToneMappingEffect as _TonemappingEffect, ToneMappingMode } from "postprocessing";
|
|
2
|
-
import { ACESFilmicToneMapping, AgXToneMapping, LinearToneMapping, NeutralToneMapping, NoToneMapping, ReinhardToneMapping, WebGLRenderer } from "three";
|
|
3
2
|
|
|
4
3
|
import { MODULES } from "../../../engine/engine_modules.js";
|
|
5
4
|
import { serializable } from "../../../engine/engine_serialization.js";
|
|
5
|
+
import { nameToThreeTonemapping } from "../../../engine/engine_tonemapping.js";
|
|
6
6
|
import { getParam } from "../../../engine/engine_utils.js";
|
|
7
7
|
import { EffectProviderResult, PostProcessingEffect } from "../PostProcessingEffect.js";
|
|
8
8
|
import { findPostProcessingManager } from "../utils.js";
|
|
9
9
|
import { VolumeParameter } from "../VolumeParameter.js";
|
|
10
10
|
import { registerCustomEffectType } from "../VolumeProfile.js";
|
|
11
|
+
import { NEToneMappingMode, NEToneMappingModeNames, threeToNeedleToneMapping, threeToneMappingToEffectMode, toThreeToneMapping } from "./Tonemapping.utils.js";
|
|
11
12
|
|
|
12
13
|
const debug = getParam("debugpost");
|
|
13
14
|
|
|
14
15
|
|
|
15
|
-
enum NEToneMappingMode {
|
|
16
|
-
None = 0,
|
|
17
|
-
Neutral = 1, // Neutral tonemapper, close to Reinhard
|
|
18
|
-
ACES = 2, // ACES Filmic reference tonemapper (custom approximation)
|
|
19
|
-
AgX = 3, // AgX Filmic tonemapper
|
|
20
|
-
KhronosNeutral = 4, // PBR Neural tonemapper
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
type NEToneMappingModeNames = keyof typeof NEToneMappingMode;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
function toThreeToneMapping(mode: NEToneMappingMode | undefined) {
|
|
27
|
-
switch (mode) {
|
|
28
|
-
case NEToneMappingMode.None:
|
|
29
|
-
return LinearToneMapping;
|
|
30
|
-
case NEToneMappingMode.Neutral:
|
|
31
|
-
return ReinhardToneMapping;
|
|
32
|
-
case NEToneMappingMode.ACES:
|
|
33
|
-
return ACESFilmicToneMapping;
|
|
34
|
-
case NEToneMappingMode.AgX:
|
|
35
|
-
return AgXToneMapping;
|
|
36
|
-
case NEToneMappingMode.KhronosNeutral:
|
|
37
|
-
return NeutralToneMapping;
|
|
38
|
-
default:
|
|
39
|
-
if(debug) console.warn("[Postprocessing] Unknown tone mapping mode", mode);
|
|
40
|
-
return NeutralToneMapping;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function threeToNeToneMapping(mode: number | undefined): NEToneMappingMode {
|
|
45
|
-
switch (mode) {
|
|
46
|
-
case LinearToneMapping: return NEToneMappingMode.None;
|
|
47
|
-
case ACESFilmicToneMapping: return NEToneMappingMode.ACES;
|
|
48
|
-
case AgXToneMapping: return NEToneMappingMode.AgX;
|
|
49
|
-
case NeutralToneMapping: return NEToneMappingMode.Neutral;
|
|
50
|
-
case ReinhardToneMapping: return NEToneMappingMode.Neutral;
|
|
51
|
-
default: return NEToneMappingMode.None;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
function threeToneMappingToEffectMode(mode: number | undefined): ToneMappingMode {
|
|
58
|
-
switch (mode) {
|
|
59
|
-
case LinearToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
60
|
-
case ACESFilmicToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;
|
|
61
|
-
case AgXToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.AGX;
|
|
62
|
-
case NeutralToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;
|
|
63
|
-
case ReinhardToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;
|
|
64
|
-
default: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
16
|
/**
|
|
69
17
|
* @category Effects
|
|
70
18
|
* @group Components
|
|
@@ -102,6 +50,7 @@ export class ToneMappingEffect extends PostProcessingEffect {
|
|
|
102
50
|
super.onEffectEnabled(ppmanager);
|
|
103
51
|
}
|
|
104
52
|
|
|
53
|
+
private _didCreateEffect = false;
|
|
105
54
|
onCreateEffect(): EffectProviderResult | undefined {
|
|
106
55
|
|
|
107
56
|
// TODO: this should be done in the PostProcessingHandler
|
|
@@ -118,10 +67,12 @@ export class ToneMappingEffect extends PostProcessingEffect {
|
|
|
118
67
|
}
|
|
119
68
|
|
|
120
69
|
|
|
70
|
+
this._didCreateEffect = true;
|
|
71
|
+
|
|
121
72
|
// ensure the effect tonemapping value is initialized
|
|
122
73
|
if (this.mode.isInitialized == false) {
|
|
123
|
-
const mode =
|
|
124
|
-
if(debug) console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping", this.context.renderer.toneMapping + " → " + mode);
|
|
74
|
+
const mode = threeToNeedleToneMapping(this.context.renderer.toneMapping);
|
|
75
|
+
if (debug) console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping", this.context.renderer.toneMapping + " → " + mode);
|
|
125
76
|
this.mode.initialize(mode);
|
|
126
77
|
}
|
|
127
78
|
|
|
@@ -130,26 +81,33 @@ export class ToneMappingEffect extends PostProcessingEffect {
|
|
|
130
81
|
mode: threeToneMappingToEffectMode(threeMode),
|
|
131
82
|
});
|
|
132
83
|
this.mode.onValueChanged = (newValue) => {
|
|
133
|
-
|
|
134
|
-
|
|
84
|
+
if (typeof newValue === "string") {
|
|
85
|
+
newValue = nameToThreeTonemapping(newValue);
|
|
86
|
+
tonemapping.mode = threeToneMappingToEffectMode(newValue);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const threeMode = toThreeToneMapping(newValue);
|
|
90
|
+
tonemapping.mode = threeToneMappingToEffectMode(threeMode);
|
|
91
|
+
}
|
|
92
|
+
tonemapping.name = "ToneMapping (" + NEToneMappingMode[newValue] + ")";
|
|
135
93
|
if (debug) console.log("[PostProcessing] ToneMapping mode changed to", NEToneMappingMode[newValue], threeMode, tonemapping.mode);
|
|
136
94
|
};
|
|
137
95
|
if (debug) console.log("[PostProcessing] Use ToneMapping", NEToneMappingMode[this.mode.value], threeMode, tonemapping.mode, "renderer.tonemapping: " + this.context.renderer.toneMapping);
|
|
138
96
|
|
|
139
97
|
|
|
140
|
-
this.exposure.onValueChanged = (newValue) => {
|
|
141
|
-
this.context.renderer.toneMappingExposure = newValue;
|
|
142
|
-
};
|
|
143
|
-
|
|
144
98
|
return tonemapping;
|
|
145
99
|
}
|
|
146
100
|
|
|
147
101
|
|
|
148
102
|
onBeforeRender(): void {
|
|
149
|
-
if (this.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
this.
|
|
103
|
+
if (this._didCreateEffect) {
|
|
104
|
+
if (this.mode.overrideState)
|
|
105
|
+
this.context.renderer.toneMapping = toThreeToneMapping(this.mode.value);
|
|
106
|
+
if (this.exposure.overrideState && this.exposure.value !== undefined) {
|
|
107
|
+
const newValue = Math.max(0.01, this.exposure.value);
|
|
108
|
+
this.context.renderer.toneMappingExposure = newValue;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
153
111
|
}
|
|
154
112
|
|
|
155
113
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ToneMappingMode } from "postprocessing";
|
|
2
|
+
import { ACESFilmicToneMapping, AgXToneMapping, LinearToneMapping, NeutralToneMapping, ReinhardToneMapping, ToneMapping } from "three";
|
|
3
|
+
|
|
4
|
+
import { MODULES } from "../../../engine/engine_modules.js";
|
|
5
|
+
|
|
6
|
+
export enum NEToneMappingMode {
|
|
7
|
+
None = 0,
|
|
8
|
+
Neutral = 1, // Neutral tonemapper, close to Reinhard
|
|
9
|
+
ACES = 2, // ACES Filmic reference tonemapper (custom approximation)
|
|
10
|
+
AgX = 3, // AgX Filmic tonemapper
|
|
11
|
+
KhronosNeutral = 4, // PBR Neural tonemapper
|
|
12
|
+
}
|
|
13
|
+
export type NEToneMappingModeNames = keyof typeof NEToneMappingMode;
|
|
14
|
+
|
|
15
|
+
const unknownTonemappingWarning = new Map<any, boolean>();
|
|
16
|
+
|
|
17
|
+
export function toThreeToneMapping(mode: NEToneMappingMode | undefined) {
|
|
18
|
+
switch (mode) {
|
|
19
|
+
case NEToneMappingMode.None:
|
|
20
|
+
return LinearToneMapping;
|
|
21
|
+
case NEToneMappingMode.Neutral:
|
|
22
|
+
return ReinhardToneMapping;
|
|
23
|
+
case NEToneMappingMode.ACES:
|
|
24
|
+
return ACESFilmicToneMapping;
|
|
25
|
+
case NEToneMappingMode.AgX:
|
|
26
|
+
return AgXToneMapping;
|
|
27
|
+
case NEToneMappingMode.KhronosNeutral:
|
|
28
|
+
return NeutralToneMapping;
|
|
29
|
+
default:
|
|
30
|
+
if(!unknownTonemappingWarning.has(mode)) {
|
|
31
|
+
unknownTonemappingWarning.set(mode, true);
|
|
32
|
+
console.warn("[Postprocessing] Unknown tone mapping mode", mode);
|
|
33
|
+
}
|
|
34
|
+
return NeutralToneMapping;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function threeToNeedleToneMapping(mode: ToneMapping | number | undefined): NEToneMappingMode {
|
|
39
|
+
switch (mode) {
|
|
40
|
+
case LinearToneMapping: return NEToneMappingMode.None;
|
|
41
|
+
case ACESFilmicToneMapping: return NEToneMappingMode.ACES;
|
|
42
|
+
case AgXToneMapping: return NEToneMappingMode.AgX;
|
|
43
|
+
case NeutralToneMapping: return NEToneMappingMode.Neutral;
|
|
44
|
+
case ReinhardToneMapping: return NEToneMappingMode.Neutral;
|
|
45
|
+
default: return NEToneMappingMode.None;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
export function threeToneMappingToEffectMode(mode: number | undefined): ToneMappingMode {
|
|
52
|
+
switch (mode) {
|
|
53
|
+
case LinearToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
54
|
+
case ACESFilmicToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;
|
|
55
|
+
case AgXToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.AGX;
|
|
56
|
+
case NeutralToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;
|
|
57
|
+
case ReinhardToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;
|
|
58
|
+
default: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -55,6 +55,25 @@ export abstract class PostProcessingEffect extends Component implements IEffectP
|
|
|
55
55
|
|
|
56
56
|
get isPostProcessingEffect() { return true; }
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* The order of this effect. The higher the order the later the effect will be applied in the post processing stack.
|
|
60
|
+
* This can be used to control the order of effects when multiple effects are applied.
|
|
61
|
+
* It is recommended to use the PostProcessingEffectOrder constant to order your custom effects before or after built-in effects.
|
|
62
|
+
* @default `undefined` (no specific order set, will be applied in the order of registration)
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* import { PostProcessingEffectOrder } from "@needle-tools/engine"
|
|
67
|
+
*
|
|
68
|
+
* export class MyCustomEffect extends PostProcessingEffect {
|
|
69
|
+
* order: PostProcessingEffectOrder.Bloom + 1; // render after bloom
|
|
70
|
+
* // This will ensure that the effect is applied after the bloom effect in the post processing stack.
|
|
71
|
+
* // ... the rest of your effect code
|
|
72
|
+
* }
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
order: number | undefined = undefined;
|
|
76
|
+
|
|
58
77
|
constructor(params: any = undefined) {
|
|
59
78
|
super();
|
|
60
79
|
if (params) {
|
|
@@ -86,7 +105,7 @@ export abstract class PostProcessingEffect extends Component implements IEffectP
|
|
|
86
105
|
|
|
87
106
|
onEnable(): void {
|
|
88
107
|
super.onEnable();
|
|
89
|
-
if (debug) console.warn("
|
|
108
|
+
if (debug) console.warn("Enable", this.constructor.name + (!this.__internalDidAwakeAndStart ? " (awake)" : ""));
|
|
90
109
|
// Dont override the serialized value by enabling (we could also just disable this component / map enabled to active)
|
|
91
110
|
if (this.__internalDidAwakeAndStart)
|
|
92
111
|
this.active = true;
|
|
@@ -95,7 +114,7 @@ export abstract class PostProcessingEffect extends Component implements IEffectP
|
|
|
95
114
|
|
|
96
115
|
onDisable(): void {
|
|
97
116
|
super.onDisable();
|
|
98
|
-
if (debug) console.warn("
|
|
117
|
+
if (debug) console.warn("Disable", this.constructor.name);
|
|
99
118
|
this._manager?.removeEffect(this);
|
|
100
119
|
this.active = false;
|
|
101
120
|
}
|