@needle-tools/engine 4.6.1-next.1e3d612 → 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-Dx31Hfkf.js → needle-engine.bundle-BBxAzv6J.js} +6556 -6485
- package/dist/{needle-engine.bundle-BYdv-DmQ.min.js → needle-engine.bundle-BwVJc8bG.min.js} +170 -158
- package/dist/{needle-engine.bundle-DsI9yYlp.umd.cjs → needle-engine.bundle-cvRBTPLl.umd.cjs} +173 -161
- package/dist/needle-engine.js +48 -48
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/lib/engine/engine_context.d.ts +2 -1
- package/lib/engine/engine_context.js +3 -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/BloomEffect.d.ts +1 -1
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +2 -2
- 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/Sharpening.d.ts +1 -1
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +2 -2
- 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 +7 -7
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +7 -7
- package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +6 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +107 -16
- package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
- package/lib/engine-components/postprocessing/Volume.js +19 -24
- package/lib/engine-components/postprocessing/Volume.js.map +1 -1
- package/lib/engine-components/postprocessing/index.d.ts +1 -1
- package/lib/engine-components/postprocessing/index.js +1 -1
- package/lib/engine-components/postprocessing/index.js.map +1 -1
- package/lib/engine-components/postprocessing/utils.d.ts +6 -6
- package/lib/engine-components/postprocessing/utils.js +26 -25
- package/lib/engine-components/postprocessing/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/engine_context.ts +5 -3
- 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/BloomEffect.ts +2 -2
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +24 -13
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +2 -2
- 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 +7 -7
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +122 -20
- package/src/engine-components/postprocessing/Volume.ts +19 -26
- package/src/engine-components/postprocessing/index.ts +1 -1
- package/src/engine-components/postprocessing/utils.ts +27 -26
|
@@ -9,7 +9,7 @@ import { Uniform } from "three";
|
|
|
9
9
|
import { MODULES } from "../../../engine/engine_modules.js";
|
|
10
10
|
import { serializable } from "../../../engine/engine_serialization.js";
|
|
11
11
|
import { PostProcessingEffect } from "../PostProcessingEffect.js";
|
|
12
|
-
import {
|
|
12
|
+
import { PostProcessingEffectOrder } from "../utils.js";
|
|
13
13
|
// import type { createSharpeningEffectType } from "./Sharpening.effect";
|
|
14
14
|
// let __SHARPENING_MODULE: typeof import("./Sharpening.effect");
|
|
15
15
|
// /** @hidden */
|
|
@@ -24,7 +24,7 @@ export class SharpeningEffect extends PostProcessingEffect {
|
|
|
24
24
|
get typeName() {
|
|
25
25
|
return "Sharpening";
|
|
26
26
|
}
|
|
27
|
-
|
|
27
|
+
order = PostProcessingEffectOrder.Sharpening;
|
|
28
28
|
_effect;
|
|
29
29
|
onCreateEffect() {
|
|
30
30
|
this._effect ??= new (createSharpeningEffectType())();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sharpening.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/Effects/Sharpening.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Sharpening.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/Effects/Sharpening.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,yEAAyE;AAEzE,iEAAiE;AACjE,iBAAiB;AACjB,qGAAqG;AACrG,oCAAoC;AACpC,IAAI;AAEJ;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,oBAAoB;IAEtD,IAAI,QAAQ;QACR,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,KAAK,GAAuB,yBAAyB,CAAC,UAAU,CAAC;IAEzD,OAAO,CAAO;IAEtB,cAAc;QACV,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAY,MAAM;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAGD,IAAI,MAAM,CAAC,KAAa;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM;QACN,IAAI,IAAI,CAAC,OAAO;YACZ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC;QACtD,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IACO,OAAO,GAAG,CAAC,CAAC;IAGpB,IAAI,MAAM,CAAC,KAAa;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM;QACN,IAAI,IAAI,CAAC,OAAO;YACZ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC;QACtD,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IACO,OAAO,GAAG,CAAC,CAAC;CAUvB;AAjCG;IADC,YAAY,EAAE;8CAKd;AASD;IADC,YAAY,EAAE;8CAKd;AAoBL,SAAS,0BAA0B;IAE/B,MAAM,IAAI,GAAG;;;;;KAKZ,CAAA;IAED,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuCZ,CAAA;IAED,MAAM,iBAAkB,SAAQ,OAAO,CAAC,cAAc,CAAC,MAAO,CAAC,MAAM;QACjE;YACI,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE;gBACtB,YAAY,EAAE,IAAI;gBAClB,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM;gBACjE,QAAQ,EAAE,IAAI,GAAG,CAAuB;oBACpC,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1B,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1B,iCAAiC;iBACpC,CAAC;gBACF,UAAU,EAAE,eAAe,CAAC,WAAW;aAC1C,CAAC,CAAC;QACP,CAAC;KACJ;IACD,OAAO,iBAAiB,CAAC;AAG7B,CAAC"}
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { EffectProviderResult, PostProcessingEffect } from "../PostProcessingEffect.js";
|
|
2
2
|
import { VolumeParameter } from "../VolumeParameter.js";
|
|
3
|
-
|
|
4
|
-
None = 0,
|
|
5
|
-
Neutral = 1,
|
|
6
|
-
ACES = 2,
|
|
7
|
-
AgX = 3,
|
|
8
|
-
KhronosNeutral = 4
|
|
9
|
-
}
|
|
10
|
-
type NEToneMappingModeNames = keyof typeof NEToneMappingMode;
|
|
3
|
+
import { NEToneMappingModeNames } from "./Tonemapping.utils.js";
|
|
11
4
|
/**
|
|
12
5
|
* @category Effects
|
|
13
6
|
* @group Components
|
|
@@ -20,7 +13,7 @@ export declare class ToneMappingEffect extends PostProcessingEffect {
|
|
|
20
13
|
setMode(mode: NEToneMappingModeNames): this;
|
|
21
14
|
get isToneMapping(): boolean;
|
|
22
15
|
onEffectEnabled(): void;
|
|
16
|
+
private _didCreateEffect;
|
|
23
17
|
onCreateEffect(): EffectProviderResult | undefined;
|
|
24
18
|
onBeforeRender(): void;
|
|
25
19
|
}
|
|
26
|
-
export {};
|
|
@@ -4,61 +4,16 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { ACESFilmicToneMapping, AgXToneMapping, LinearToneMapping, NeutralToneMapping, ReinhardToneMapping } from "three";
|
|
8
7
|
import { MODULES } from "../../../engine/engine_modules.js";
|
|
9
8
|
import { serializable } from "../../../engine/engine_serialization.js";
|
|
9
|
+
import { nameToThreeTonemapping } from "../../../engine/engine_tonemapping.js";
|
|
10
10
|
import { getParam } from "../../../engine/engine_utils.js";
|
|
11
11
|
import { PostProcessingEffect } from "../PostProcessingEffect.js";
|
|
12
12
|
import { findPostProcessingManager } from "../utils.js";
|
|
13
13
|
import { VolumeParameter } from "../VolumeParameter.js";
|
|
14
14
|
import { registerCustomEffectType } from "../VolumeProfile.js";
|
|
15
|
+
import { NEToneMappingMode, threeToNeedleToneMapping, threeToneMappingToEffectMode, toThreeToneMapping } from "./Tonemapping.utils.js";
|
|
15
16
|
const debug = getParam("debugpost");
|
|
16
|
-
var NEToneMappingMode;
|
|
17
|
-
(function (NEToneMappingMode) {
|
|
18
|
-
NEToneMappingMode[NEToneMappingMode["None"] = 0] = "None";
|
|
19
|
-
NEToneMappingMode[NEToneMappingMode["Neutral"] = 1] = "Neutral";
|
|
20
|
-
NEToneMappingMode[NEToneMappingMode["ACES"] = 2] = "ACES";
|
|
21
|
-
NEToneMappingMode[NEToneMappingMode["AgX"] = 3] = "AgX";
|
|
22
|
-
NEToneMappingMode[NEToneMappingMode["KhronosNeutral"] = 4] = "KhronosNeutral";
|
|
23
|
-
})(NEToneMappingMode || (NEToneMappingMode = {}));
|
|
24
|
-
function toThreeToneMapping(mode) {
|
|
25
|
-
switch (mode) {
|
|
26
|
-
case NEToneMappingMode.None:
|
|
27
|
-
return LinearToneMapping;
|
|
28
|
-
case NEToneMappingMode.Neutral:
|
|
29
|
-
return ReinhardToneMapping;
|
|
30
|
-
case NEToneMappingMode.ACES:
|
|
31
|
-
return ACESFilmicToneMapping;
|
|
32
|
-
case NEToneMappingMode.AgX:
|
|
33
|
-
return AgXToneMapping;
|
|
34
|
-
case NEToneMappingMode.KhronosNeutral:
|
|
35
|
-
return NeutralToneMapping;
|
|
36
|
-
default:
|
|
37
|
-
if (debug)
|
|
38
|
-
console.warn("[Postprocessing] Unknown tone mapping mode", mode);
|
|
39
|
-
return NeutralToneMapping;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function threeToNeToneMapping(mode) {
|
|
43
|
-
switch (mode) {
|
|
44
|
-
case LinearToneMapping: return NEToneMappingMode.None;
|
|
45
|
-
case ACESFilmicToneMapping: return NEToneMappingMode.ACES;
|
|
46
|
-
case AgXToneMapping: return NEToneMappingMode.AgX;
|
|
47
|
-
case NeutralToneMapping: return NEToneMappingMode.Neutral;
|
|
48
|
-
case ReinhardToneMapping: return NEToneMappingMode.Neutral;
|
|
49
|
-
default: return NEToneMappingMode.None;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function threeToneMappingToEffectMode(mode) {
|
|
53
|
-
switch (mode) {
|
|
54
|
-
case LinearToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
55
|
-
case ACESFilmicToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;
|
|
56
|
-
case AgXToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.AGX;
|
|
57
|
-
case NeutralToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;
|
|
58
|
-
case ReinhardToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;
|
|
59
|
-
default: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
17
|
/**
|
|
63
18
|
* @category Effects
|
|
64
19
|
* @group Components
|
|
@@ -88,6 +43,7 @@ export class ToneMappingEffect extends PostProcessingEffect {
|
|
|
88
43
|
return;
|
|
89
44
|
super.onEffectEnabled(ppmanager);
|
|
90
45
|
}
|
|
46
|
+
_didCreateEffect = false;
|
|
91
47
|
onCreateEffect() {
|
|
92
48
|
// TODO: this should be done in the PostProcessingHandler
|
|
93
49
|
if (this.postprocessingContext) {
|
|
@@ -102,9 +58,10 @@ export class ToneMappingEffect extends PostProcessingEffect {
|
|
|
102
58
|
}
|
|
103
59
|
}
|
|
104
60
|
}
|
|
61
|
+
this._didCreateEffect = true;
|
|
105
62
|
// ensure the effect tonemapping value is initialized
|
|
106
63
|
if (this.mode.isInitialized == false) {
|
|
107
|
-
const mode =
|
|
64
|
+
const mode = threeToNeedleToneMapping(this.context.renderer.toneMapping);
|
|
108
65
|
if (debug)
|
|
109
66
|
console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping", this.context.renderer.toneMapping + " → " + mode);
|
|
110
67
|
this.mode.initialize(mode);
|
|
@@ -114,23 +71,31 @@ export class ToneMappingEffect extends PostProcessingEffect {
|
|
|
114
71
|
mode: threeToneMappingToEffectMode(threeMode),
|
|
115
72
|
});
|
|
116
73
|
this.mode.onValueChanged = (newValue) => {
|
|
117
|
-
|
|
118
|
-
|
|
74
|
+
if (typeof newValue === "string") {
|
|
75
|
+
newValue = nameToThreeTonemapping(newValue);
|
|
76
|
+
tonemapping.mode = threeToneMappingToEffectMode(newValue);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const threeMode = toThreeToneMapping(newValue);
|
|
80
|
+
tonemapping.mode = threeToneMappingToEffectMode(threeMode);
|
|
81
|
+
}
|
|
82
|
+
tonemapping.name = "ToneMapping (" + NEToneMappingMode[newValue] + ")";
|
|
119
83
|
if (debug)
|
|
120
84
|
console.log("[PostProcessing] ToneMapping mode changed to", NEToneMappingMode[newValue], threeMode, tonemapping.mode);
|
|
121
85
|
};
|
|
122
86
|
if (debug)
|
|
123
87
|
console.log("[PostProcessing] Use ToneMapping", NEToneMappingMode[this.mode.value], threeMode, tonemapping.mode, "renderer.tonemapping: " + this.context.renderer.toneMapping);
|
|
124
|
-
this.exposure.onValueChanged = (newValue) => {
|
|
125
|
-
this.context.renderer.toneMappingExposure = newValue;
|
|
126
|
-
};
|
|
127
88
|
return tonemapping;
|
|
128
89
|
}
|
|
129
90
|
onBeforeRender() {
|
|
130
|
-
if (this.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
this.
|
|
91
|
+
if (this._didCreateEffect) {
|
|
92
|
+
if (this.mode.overrideState)
|
|
93
|
+
this.context.renderer.toneMapping = toThreeToneMapping(this.mode.value);
|
|
94
|
+
if (this.exposure.overrideState && this.exposure.value !== undefined) {
|
|
95
|
+
const newValue = Math.max(0.01, this.exposure.value);
|
|
96
|
+
this.context.renderer.toneMappingExposure = newValue;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
134
99
|
}
|
|
135
100
|
}
|
|
136
101
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tonemapping.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/Effects/Tonemapping.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"Tonemapping.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/Effects/Tonemapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ToneMappingMode } from "postprocessing";
|
|
2
|
+
import { ToneMapping } from "three";
|
|
3
|
+
export declare enum NEToneMappingMode {
|
|
4
|
+
None = 0,
|
|
5
|
+
Neutral = 1,
|
|
6
|
+
ACES = 2,
|
|
7
|
+
AgX = 3,
|
|
8
|
+
KhronosNeutral = 4
|
|
9
|
+
}
|
|
10
|
+
export type NEToneMappingModeNames = keyof typeof NEToneMappingMode;
|
|
11
|
+
export declare function toThreeToneMapping(mode: NEToneMappingMode | undefined): 1 | 2 | 4 | 6 | 7;
|
|
12
|
+
export declare function threeToNeedleToneMapping(mode: ToneMapping | number | undefined): NEToneMappingMode;
|
|
13
|
+
export declare function threeToneMappingToEffectMode(mode: number | undefined): ToneMappingMode;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ACESFilmicToneMapping, AgXToneMapping, LinearToneMapping, NeutralToneMapping, ReinhardToneMapping } from "three";
|
|
2
|
+
import { MODULES } from "../../../engine/engine_modules.js";
|
|
3
|
+
export var NEToneMappingMode;
|
|
4
|
+
(function (NEToneMappingMode) {
|
|
5
|
+
NEToneMappingMode[NEToneMappingMode["None"] = 0] = "None";
|
|
6
|
+
NEToneMappingMode[NEToneMappingMode["Neutral"] = 1] = "Neutral";
|
|
7
|
+
NEToneMappingMode[NEToneMappingMode["ACES"] = 2] = "ACES";
|
|
8
|
+
NEToneMappingMode[NEToneMappingMode["AgX"] = 3] = "AgX";
|
|
9
|
+
NEToneMappingMode[NEToneMappingMode["KhronosNeutral"] = 4] = "KhronosNeutral";
|
|
10
|
+
})(NEToneMappingMode || (NEToneMappingMode = {}));
|
|
11
|
+
const unknownTonemappingWarning = new Map();
|
|
12
|
+
export function toThreeToneMapping(mode) {
|
|
13
|
+
switch (mode) {
|
|
14
|
+
case NEToneMappingMode.None:
|
|
15
|
+
return LinearToneMapping;
|
|
16
|
+
case NEToneMappingMode.Neutral:
|
|
17
|
+
return ReinhardToneMapping;
|
|
18
|
+
case NEToneMappingMode.ACES:
|
|
19
|
+
return ACESFilmicToneMapping;
|
|
20
|
+
case NEToneMappingMode.AgX:
|
|
21
|
+
return AgXToneMapping;
|
|
22
|
+
case NEToneMappingMode.KhronosNeutral:
|
|
23
|
+
return NeutralToneMapping;
|
|
24
|
+
default:
|
|
25
|
+
if (!unknownTonemappingWarning.has(mode)) {
|
|
26
|
+
unknownTonemappingWarning.set(mode, true);
|
|
27
|
+
console.warn("[Postprocessing] Unknown tone mapping mode", mode);
|
|
28
|
+
}
|
|
29
|
+
return NeutralToneMapping;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function threeToNeedleToneMapping(mode) {
|
|
33
|
+
switch (mode) {
|
|
34
|
+
case LinearToneMapping: return NEToneMappingMode.None;
|
|
35
|
+
case ACESFilmicToneMapping: return NEToneMappingMode.ACES;
|
|
36
|
+
case AgXToneMapping: return NEToneMappingMode.AgX;
|
|
37
|
+
case NeutralToneMapping: return NEToneMappingMode.Neutral;
|
|
38
|
+
case ReinhardToneMapping: return NEToneMappingMode.Neutral;
|
|
39
|
+
default: return NEToneMappingMode.None;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function threeToneMappingToEffectMode(mode) {
|
|
43
|
+
switch (mode) {
|
|
44
|
+
case LinearToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
45
|
+
case ACESFilmicToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.ACES_FILMIC;
|
|
46
|
+
case AgXToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.AGX;
|
|
47
|
+
case NeutralToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.NEUTRAL;
|
|
48
|
+
case ReinhardToneMapping: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.REINHARD;
|
|
49
|
+
default: return MODULES.POSTPROCESSING.MODULE.ToneMappingMode.LINEAR;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=Tonemapping.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tonemapping.utils.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/Effects/Tonemapping.utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAe,MAAM,OAAO,CAAC;AAEvI,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAE5D,MAAM,CAAN,IAAY,iBAMX;AAND,WAAY,iBAAiB;IACzB,yDAAQ,CAAA;IACR,+DAAW,CAAA;IACX,yDAAQ,CAAA;IACR,uDAAO,CAAA;IACP,6EAAkB,CAAA;AACtB,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,QAM5B;AAGD,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAgB,CAAC;AAE1D,MAAM,UAAU,kBAAkB,CAAC,IAAmC;IAClE,QAAQ,IAAI,EAAE;QACV,KAAK,iBAAiB,CAAC,IAAI;YACvB,OAAO,iBAAiB,CAAC;QAC7B,KAAK,iBAAiB,CAAC,OAAO;YAC1B,OAAO,mBAAmB,CAAC;QAC/B,KAAK,iBAAiB,CAAC,IAAI;YACvB,OAAO,qBAAqB,CAAC;QACjC,KAAK,iBAAiB,CAAC,GAAG;YACtB,OAAO,cAAc,CAAC;QAC1B,KAAK,iBAAiB,CAAC,cAAc;YACjC,OAAO,kBAAkB,CAAC;QAC9B;YACI,IAAG,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACrC,yBAAyB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,4CAA4C,EAAE,IAAI,CAAC,CAAC;aACpE;YACD,OAAO,kBAAkB,CAAC;KACjC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAsC;IAC3E,QAAQ,IAAI,EAAE;QACV,KAAK,iBAAiB,CAAC,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC;QACtD,KAAK,qBAAqB,CAAC,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC;QAC1D,KAAK,cAAc,CAAC,CAAC,OAAO,iBAAiB,CAAC,GAAG,CAAC;QAClD,KAAK,kBAAkB,CAAC,CAAC,OAAO,iBAAiB,CAAC,OAAO,CAAC;QAC1D,KAAK,mBAAmB,CAAC,CAAC,OAAO,iBAAiB,CAAC,OAAO,CAAC;QAC3D,OAAO,CAAC,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC;KAC1C;AAEL,CAAC;AAGD,MAAM,UAAU,4BAA4B,CAAC,IAAwB;IACjE,QAAQ,IAAI,EAAE;QACV,KAAK,iBAAiB,CAAC,CAAC,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;QACpF,KAAK,qBAAqB,CAAC,CAAC,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC;QAC7F,KAAK,cAAc,CAAC,CAAC,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC;QAC9E,KAAK,kBAAkB,CAAC,CAAC,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC;QACtF,KAAK,mBAAmB,CAAC,CAAC,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;QACxF,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;KACxE;AACL,CAAC"}
|
|
@@ -44,23 +44,23 @@ export interface IEffectProvider {
|
|
|
44
44
|
export declare abstract class PostProcessingEffect extends Component implements IEffectProvider, IEditorModification {
|
|
45
45
|
get isPostProcessingEffect(): boolean;
|
|
46
46
|
/**
|
|
47
|
-
* The
|
|
47
|
+
* The order of this effect. The higher the order the later the effect will be applied in the post processing stack.
|
|
48
48
|
* This can be used to control the order of effects when multiple effects are applied.
|
|
49
|
-
* It is recommended to use the
|
|
50
|
-
* @default `undefined` (no specific
|
|
49
|
+
* It is recommended to use the PostProcessingEffectOrder constant to order your custom effects before or after built-in effects.
|
|
50
|
+
* @default `undefined` (no specific order set, will be applied in the order of registration)
|
|
51
51
|
*
|
|
52
52
|
* @example
|
|
53
53
|
* ```typescript
|
|
54
|
-
* import {
|
|
54
|
+
* import { PostProcessingEffectOrder } from "@needle-tools/engine"
|
|
55
55
|
*
|
|
56
56
|
* export class MyCustomEffect extends PostProcessingEffect {
|
|
57
|
-
*
|
|
58
|
-
*
|
|
57
|
+
* order: PostProcessingEffectOrder.Bloom + 1; // render after bloom
|
|
58
|
+
* // This will ensure that the effect is applied after the bloom effect in the post processing stack.
|
|
59
59
|
* // ... the rest of your effect code
|
|
60
60
|
* }
|
|
61
61
|
* ```
|
|
62
62
|
*/
|
|
63
|
-
|
|
63
|
+
order: number | undefined;
|
|
64
64
|
constructor(params?: any);
|
|
65
65
|
abstract get typeName(): string;
|
|
66
66
|
/**
|
|
@@ -42,23 +42,23 @@ const debug = getParam("debugpost");
|
|
|
42
42
|
export class PostProcessingEffect extends Component {
|
|
43
43
|
get isPostProcessingEffect() { return true; }
|
|
44
44
|
/**
|
|
45
|
-
* The
|
|
45
|
+
* The order of this effect. The higher the order the later the effect will be applied in the post processing stack.
|
|
46
46
|
* This can be used to control the order of effects when multiple effects are applied.
|
|
47
|
-
* It is recommended to use the
|
|
48
|
-
* @default `undefined` (no specific
|
|
47
|
+
* It is recommended to use the PostProcessingEffectOrder constant to order your custom effects before or after built-in effects.
|
|
48
|
+
* @default `undefined` (no specific order set, will be applied in the order of registration)
|
|
49
49
|
*
|
|
50
50
|
* @example
|
|
51
51
|
* ```typescript
|
|
52
|
-
* import {
|
|
52
|
+
* import { PostProcessingEffectOrder } from "@needle-tools/engine"
|
|
53
53
|
*
|
|
54
54
|
* export class MyCustomEffect extends PostProcessingEffect {
|
|
55
|
-
*
|
|
56
|
-
*
|
|
55
|
+
* order: PostProcessingEffectOrder.Bloom + 1; // render after bloom
|
|
56
|
+
* // This will ensure that the effect is applied after the bloom effect in the post processing stack.
|
|
57
57
|
* // ... the rest of your effect code
|
|
58
58
|
* }
|
|
59
59
|
* ```
|
|
60
60
|
*/
|
|
61
|
-
|
|
61
|
+
order = undefined;
|
|
62
62
|
constructor(params = undefined) {
|
|
63
63
|
super();
|
|
64
64
|
if (params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostProcessingEffect.js","sourceRoot":"","sources":["../../../src/engine-components/postprocessing/PostProcessingEffect.ts"],"names":[],"mappings":";;;;;;AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,wBAAwB,EAA0B,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAcpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAgB,oBAAqB,SAAQ,SAAS;IAExD,IAAI,sBAAsB,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAE7C;;;;;;;;;;;;;;;;OAgBG;IACH,
|
|
1
|
+
{"version":3,"file":"PostProcessingEffect.js","sourceRoot":"","sources":["../../../src/engine-components/postprocessing/PostProcessingEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { EffectComposer } from "postprocessing";
|
|
2
2
|
import { Context } from "../../engine/engine_setup.js";
|
|
3
3
|
import { PostProcessingEffect } from "./PostProcessingEffect.js";
|
|
4
4
|
/**
|
|
@@ -23,6 +23,11 @@ export declare class PostProcessingHandler {
|
|
|
23
23
|
get anyPassHasDepth(): boolean;
|
|
24
24
|
get anyPassHasNormal(): boolean;
|
|
25
25
|
get hasSmaaEffect(): boolean;
|
|
26
|
+
private _customInputBuffer;
|
|
27
|
+
private _customInputBufferId;
|
|
28
|
+
private _multisampling;
|
|
29
|
+
set multisampling(value: number);
|
|
30
|
+
get multisampling(): number;
|
|
26
31
|
/** Build composer passes */
|
|
27
32
|
private applyEffects;
|
|
28
33
|
/** Should be called before `composer.addPass()` to create an effect pass with all previously collected effects that can be merged up to that point */
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { HalfFloatType, NoToneMapping } from "three";
|
|
1
|
+
import { DepthTexture, HalfFloatType, LinearFilter, NoToneMapping, WebGLRenderTarget } from "three";
|
|
2
2
|
import { showBalloonWarning } from "../../engine/debug/index.js";
|
|
3
3
|
// import { internal_SetSharpeningEffectModule } from "./Effects/Sharpening.js";
|
|
4
4
|
import { MODULES } from "../../engine/engine_modules.js";
|
|
5
|
+
import { Graphics } from "../../engine/engine_three_utils.js";
|
|
5
6
|
import { getParam } from "../../engine/engine_utils.js";
|
|
6
|
-
import {
|
|
7
|
+
import { threeToneMappingToEffectMode } from "./Effects/Tonemapping.utils.js";
|
|
8
|
+
import { orderEffects, PostProcessingEffectOrder } from "./utils.js";
|
|
7
9
|
globalThis["NEEDLE_USE_POSTPROCESSING"] = globalThis["NEEDLE_USE_POSTPROCESSING"] !== undefined ? globalThis["NEEDLE_USE_POSTPROCESSING"] : true;
|
|
8
10
|
const debug = getParam("debugpost");
|
|
9
11
|
const activeKey = Symbol("needle:postprocessing-handler");
|
|
10
12
|
const autoclearSetting = Symbol("needle:previous-autoclear-state");
|
|
13
|
+
const previousToneMapping = Symbol("needle:previous-tone-mapping");
|
|
11
14
|
/**
|
|
12
15
|
* PostProcessingHandler is responsible for applying post processing effects to the scene. It is internally used by the {@link Volume} component
|
|
13
16
|
*/
|
|
@@ -62,6 +65,9 @@ export class PostProcessingHandler {
|
|
|
62
65
|
if (typeof context.renderer[autoclearSetting] === "boolean") {
|
|
63
66
|
context.renderer.autoClear = context.renderer[autoclearSetting];
|
|
64
67
|
}
|
|
68
|
+
if (typeof context.renderer[previousToneMapping] === "number") {
|
|
69
|
+
context.renderer.toneMapping = context.renderer[previousToneMapping];
|
|
70
|
+
}
|
|
65
71
|
}
|
|
66
72
|
this._composer?.removeAllPasses();
|
|
67
73
|
if (dispose)
|
|
@@ -124,14 +130,14 @@ export class PostProcessingHandler {
|
|
|
124
130
|
for (const effect of res) {
|
|
125
131
|
this._effects.push({
|
|
126
132
|
effect,
|
|
127
|
-
priority: component.
|
|
133
|
+
priority: component.order
|
|
128
134
|
});
|
|
129
135
|
}
|
|
130
136
|
}
|
|
131
137
|
else {
|
|
132
138
|
this._effects.push({
|
|
133
139
|
effect: res,
|
|
134
|
-
priority: component.
|
|
140
|
+
priority: component.order
|
|
135
141
|
});
|
|
136
142
|
}
|
|
137
143
|
}
|
|
@@ -141,13 +147,6 @@ export class PostProcessingHandler {
|
|
|
141
147
|
showBalloonWarning("Volume component is not a VolumeComponent: " + component["__type"]);
|
|
142
148
|
}
|
|
143
149
|
}
|
|
144
|
-
// Ensure that we have a tonemapping effect if the renderer is set to use a tone mapping
|
|
145
|
-
if (this.context.renderer.toneMapping != NoToneMapping) {
|
|
146
|
-
if (!this._effects.find(e => e instanceof MODULES.POSTPROCESSING.MODULE.ToneMappingEffect)) {
|
|
147
|
-
const tonemapping = new MODULES.POSTPROCESSING.MODULE.ToneMappingEffect();
|
|
148
|
-
this._effects.push({ effect: tonemapping });
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
150
|
this.applyEffects(context);
|
|
152
151
|
}
|
|
153
152
|
_anyPassHasDepth = false;
|
|
@@ -156,14 +155,22 @@ export class PostProcessingHandler {
|
|
|
156
155
|
get anyPassHasDepth() { return this._anyPassHasDepth; }
|
|
157
156
|
get anyPassHasNormal() { return this._anyPassHasNormal; }
|
|
158
157
|
get hasSmaaEffect() { return this._hasSmaaEffect; }
|
|
158
|
+
_customInputBuffer = null;
|
|
159
|
+
_customInputBufferId = 0;
|
|
160
|
+
_multisampling = 0;
|
|
161
|
+
set multisampling(value) {
|
|
162
|
+
this._multisampling = value;
|
|
163
|
+
}
|
|
164
|
+
get multisampling() {
|
|
165
|
+
return this._multisampling;
|
|
166
|
+
}
|
|
159
167
|
/** Build composer passes */
|
|
160
168
|
applyEffects(context) {
|
|
161
169
|
// Reset state
|
|
162
170
|
this._anyPassHasDepth = false;
|
|
163
171
|
this._anyPassHasNormal = false;
|
|
164
172
|
this._hasSmaaEffect = false;
|
|
165
|
-
|
|
166
|
-
if (effectsOrPasses.length <= 0) {
|
|
173
|
+
if (this._effects.length <= 0) {
|
|
167
174
|
return;
|
|
168
175
|
}
|
|
169
176
|
const camera = context.mainCameraComponent;
|
|
@@ -178,6 +185,19 @@ export class PostProcessingHandler {
|
|
|
178
185
|
renderer.autoClear = renderer[autoclearSetting];
|
|
179
186
|
}
|
|
180
187
|
renderer[autoclearSetting] = renderer.autoClear;
|
|
188
|
+
if (typeof renderer[previousToneMapping] === "number") {
|
|
189
|
+
renderer.toneMapping = renderer[previousToneMapping];
|
|
190
|
+
}
|
|
191
|
+
renderer[previousToneMapping] = renderer.toneMapping;
|
|
192
|
+
// Ensure that we have a tonemapping effect if the renderer is set to use a tone mapping
|
|
193
|
+
if (renderer.toneMapping != NoToneMapping) {
|
|
194
|
+
if (!this._effects.find(e => e instanceof MODULES.POSTPROCESSING.MODULE.ToneMappingEffect)) {
|
|
195
|
+
const tonemapping = new MODULES.POSTPROCESSING.MODULE.ToneMappingEffect();
|
|
196
|
+
tonemapping.name = `ToneMapping (${renderer.toneMapping})`;
|
|
197
|
+
tonemapping.mode = threeToneMappingToEffectMode(renderer.toneMapping);
|
|
198
|
+
this._effects.push({ effect: tonemapping, priority: PostProcessingEffectOrder.ToneMapping });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
181
201
|
// create composer and set active on context
|
|
182
202
|
if (!this._composer) {
|
|
183
203
|
// const hdrRenderTarget = new WebGLRenderTarget(window.innerWidth, window.innerHeight, { type: HalfFloatType });
|
|
@@ -195,20 +215,77 @@ export class PostProcessingHandler {
|
|
|
195
215
|
composer.setRenderer(renderer);
|
|
196
216
|
composer.setMainScene(scene);
|
|
197
217
|
composer.autoRenderToScreen = true; // Must be enabled because it might be disabled during addPass by the composer itself (depending on the effect's settings or order)
|
|
198
|
-
composer.multisampling = 0;
|
|
218
|
+
composer.multisampling = 0; // Disable multisampling by default
|
|
199
219
|
for (const prev of composer.passes)
|
|
200
220
|
prev.dispose();
|
|
201
221
|
composer.removeAllPasses();
|
|
202
222
|
// Render to screen pass
|
|
203
223
|
const screenpass = new MODULES.POSTPROCESSING.MODULE.RenderPass(scene, cam);
|
|
204
|
-
screenpass.name = "
|
|
224
|
+
screenpass.name = "RenderPass";
|
|
205
225
|
screenpass.mainScene = scene;
|
|
206
226
|
composer.addPass(screenpass);
|
|
227
|
+
const screenPassRender = screenpass.render;
|
|
228
|
+
this._customInputBuffer?.dispose();
|
|
229
|
+
this._customInputBuffer = null;
|
|
230
|
+
screenpass.render = (renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) => {
|
|
231
|
+
if (!inputBuffer)
|
|
232
|
+
return;
|
|
233
|
+
// screenPassRender.call(screenpass, renderer, inputBuffer, outputBuffer, deltaTime, stencilTest);
|
|
234
|
+
// return;
|
|
235
|
+
// Make sure multisampling is disabled on the composer buffers. Technically a user could still set multisampling directly on the composer so this is to override that and make sure these textures do NOT use multisampling
|
|
236
|
+
inputBuffer.samples = 0;
|
|
237
|
+
if (outputBuffer) {
|
|
238
|
+
outputBuffer.samples = 0;
|
|
239
|
+
}
|
|
240
|
+
// Make sure the input buffer is a WebGLRenderTarget with the correct settings
|
|
241
|
+
if (!this._customInputBuffer
|
|
242
|
+
|| this._customInputBuffer.width !== inputBuffer.width
|
|
243
|
+
|| this._customInputBuffer.height !== inputBuffer.height
|
|
244
|
+
|| this._customInputBuffer.samples !== this._multisampling
|
|
245
|
+
|| this._customInputBuffer.texture.format !== inputBuffer.texture.format
|
|
246
|
+
|| this._customInputBuffer.texture.type !== HalfFloatType) {
|
|
247
|
+
this._customInputBuffer?.dispose();
|
|
248
|
+
this._customInputBuffer = new WebGLRenderTarget(inputBuffer.width, inputBuffer.height, {
|
|
249
|
+
format: inputBuffer.texture.format,
|
|
250
|
+
type: HalfFloatType,
|
|
251
|
+
depthBuffer: inputBuffer.depthBuffer,
|
|
252
|
+
depthTexture: inputBuffer.depthTexture
|
|
253
|
+
? new DepthTexture(inputBuffer.width, inputBuffer.height)
|
|
254
|
+
: undefined,
|
|
255
|
+
stencilBuffer: inputBuffer.stencilBuffer,
|
|
256
|
+
samples: Math.max(0, this._multisampling),
|
|
257
|
+
minFilter: inputBuffer.texture.minFilter ?? LinearFilter,
|
|
258
|
+
magFilter: inputBuffer.texture.magFilter ?? LinearFilter,
|
|
259
|
+
generateMipmaps: inputBuffer.texture.generateMipmaps,
|
|
260
|
+
});
|
|
261
|
+
this._customInputBufferId++;
|
|
262
|
+
this._customInputBuffer.texture.name = `CustomInputBuffer-${this._customInputBufferId}`;
|
|
263
|
+
if (this._customInputBuffer.depthTexture && inputBuffer.depthTexture) {
|
|
264
|
+
this._customInputBuffer.depthTexture.format = inputBuffer.depthTexture.format;
|
|
265
|
+
this._customInputBuffer.depthTexture.type = inputBuffer.depthTexture.type;
|
|
266
|
+
}
|
|
267
|
+
// https://github.com/pmndrs/postprocessing/blob/ad338df710ef41fee4e5d10ad2c2c299030d46ef/src/core/EffectComposer.js#L366
|
|
268
|
+
if (this._customInputBuffer.samples > 0)
|
|
269
|
+
this._customInputBuffer.ignoreDepthForMultisampleCopy = false;
|
|
270
|
+
if (debug)
|
|
271
|
+
console.warn(`[PostProcessing] Input buffer created with size ${this._customInputBuffer.width}x${this._customInputBuffer.height} and samples ${this._customInputBuffer.samples}`);
|
|
272
|
+
}
|
|
273
|
+
// Calling the original render function with the input buffer
|
|
274
|
+
screenPassRender.call(screenpass, renderer, this._customInputBuffer, outputBuffer, deltaTime, stencilTest);
|
|
275
|
+
// Blit the resulting buffer to the input buffer passed in by the composer so it's used for subsequent effects
|
|
276
|
+
Graphics.blit(this._customInputBuffer.texture, inputBuffer, {
|
|
277
|
+
renderer,
|
|
278
|
+
depthTexture: this._customInputBuffer.depthTexture,
|
|
279
|
+
depthWrite: true,
|
|
280
|
+
depthTest: true,
|
|
281
|
+
});
|
|
282
|
+
};
|
|
283
|
+
let foundTonemappingEffect = false;
|
|
207
284
|
try {
|
|
208
285
|
orderEffects(this._effects);
|
|
209
286
|
const effectsToMerge = [];
|
|
210
287
|
let hasConvolutionEffectInArray = false;
|
|
211
|
-
for (const entry of
|
|
288
|
+
for (const entry of this._effects) {
|
|
212
289
|
const ef = entry.effect;
|
|
213
290
|
if (ef instanceof MODULES.POSTPROCESSING.MODULE.SMAAEffect) {
|
|
214
291
|
this._hasSmaaEffect = true;
|
|
@@ -216,6 +293,20 @@ export class PostProcessingHandler {
|
|
|
216
293
|
else if (ef instanceof MODULES.POSTPROCESSING.MODULE.NormalPass) {
|
|
217
294
|
this._anyPassHasNormal = true;
|
|
218
295
|
}
|
|
296
|
+
// There can be only one tonemapping effect in the scene, so we can skip all others
|
|
297
|
+
if (ef instanceof MODULES.POSTPROCESSING.MODULE.ToneMappingEffect) {
|
|
298
|
+
// If we already have a tonemapping effect, we can skip this one
|
|
299
|
+
if (foundTonemappingEffect)
|
|
300
|
+
continue;
|
|
301
|
+
foundTonemappingEffect = true;
|
|
302
|
+
}
|
|
303
|
+
// We can also not merge multiple effects of the same type in one pass
|
|
304
|
+
// So we first need to create a new pass with whatever effects we have so far
|
|
305
|
+
// TODO: this seems to work fine for some effects (like ColorAdjustments) and only caused issues with multiple Tonemapping effects so far which is handled above
|
|
306
|
+
// const constructor = ef.constructor as Constructor<Effect | Pass>;
|
|
307
|
+
// if(effectsToMerge.find(e => e.constructor === constructor)) {
|
|
308
|
+
// // this.createPassForMergeableEffects(effectsToMerge, composer, cam, scene);
|
|
309
|
+
// }
|
|
219
310
|
if (ef instanceof MODULES.POSTPROCESSING.MODULE.Effect) {
|
|
220
311
|
const attributes = ef.getAttributes();
|
|
221
312
|
const convolution = MODULES.POSTPROCESSING.MODULE.EffectAttribute.CONVOLUTION;
|