@needle-tools/engine 4.6.1-next.1e3d612 → 4.6.1-next.20d54cd

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/{needle-engine.bundle-DsI9yYlp.umd.cjs → needle-engine.bundle-BVrLqIyi.umd.cjs} +174 -162
  2. package/dist/{needle-engine.bundle-Dx31Hfkf.js → needle-engine.bundle-BonYthMO.js} +6830 -6751
  3. package/dist/{needle-engine.bundle-BYdv-DmQ.min.js → needle-engine.bundle-CokaG-YG.min.js} +165 -153
  4. package/dist/needle-engine.js +48 -48
  5. package/dist/needle-engine.min.js +1 -1
  6. package/dist/needle-engine.umd.cjs +1 -1
  7. package/lib/engine/engine_context.d.ts +2 -1
  8. package/lib/engine/engine_context.js +3 -2
  9. package/lib/engine/engine_context.js.map +1 -1
  10. package/lib/engine/engine_three_utils.d.ts +17 -14
  11. package/lib/engine/engine_three_utils.js +106 -53
  12. package/lib/engine/engine_three_utils.js.map +1 -1
  13. package/lib/engine/engine_tonemapping.d.ts +4 -0
  14. package/lib/engine/engine_tonemapping.js +21 -18
  15. package/lib/engine/engine_tonemapping.js.map +1 -1
  16. package/lib/engine/engine_utils.js.map +1 -1
  17. package/lib/engine/webcomponents/needle-engine.d.ts +4 -1
  18. package/lib/engine/webcomponents/needle-engine.extras.js +3 -3
  19. package/lib/engine/webcomponents/needle-engine.extras.js.map +1 -1
  20. package/lib/engine/webcomponents/needle-engine.js +11 -21
  21. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  22. package/lib/engine-components/CameraUtils.js.map +1 -1
  23. package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +1 -1
  24. package/lib/engine-components/postprocessing/Effects/BloomEffect.js +2 -2
  25. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +8 -0
  26. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +27 -8
  27. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js.map +1 -1
  28. package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +1 -1
  29. package/lib/engine-components/postprocessing/Effects/Sharpening.js +2 -2
  30. package/lib/engine-components/postprocessing/Effects/Sharpening.js.map +1 -1
  31. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +2 -9
  32. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +23 -71
  33. package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
  34. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +13 -0
  35. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js +52 -0
  36. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.js.map +1 -0
  37. package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +7 -7
  38. package/lib/engine-components/postprocessing/PostProcessingEffect.js +7 -7
  39. package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
  40. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +10 -1
  41. package/lib/engine-components/postprocessing/PostProcessingHandler.js +128 -16
  42. package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
  43. package/lib/engine-components/postprocessing/Volume.js +19 -24
  44. package/lib/engine-components/postprocessing/Volume.js.map +1 -1
  45. package/lib/engine-components/postprocessing/index.d.ts +1 -1
  46. package/lib/engine-components/postprocessing/index.js +1 -1
  47. package/lib/engine-components/postprocessing/index.js.map +1 -1
  48. package/lib/engine-components/postprocessing/utils.d.ts +6 -6
  49. package/lib/engine-components/postprocessing/utils.js +26 -25
  50. package/lib/engine-components/postprocessing/utils.js.map +1 -1
  51. package/package.json +1 -1
  52. package/src/engine/engine_context.ts +5 -3
  53. package/src/engine/engine_three_utils.ts +134 -58
  54. package/src/engine/engine_tonemapping.ts +23 -24
  55. package/src/engine/engine_utils.ts +2 -2
  56. package/src/engine/webcomponents/needle-engine.extras.ts +3 -3
  57. package/src/engine/webcomponents/needle-engine.ts +14 -25
  58. package/src/engine-components/CameraUtils.ts +3 -3
  59. package/src/engine-components/postprocessing/Effects/BloomEffect.ts +2 -2
  60. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +24 -13
  61. package/src/engine-components/postprocessing/Effects/Sharpening.ts +2 -2
  62. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +26 -80
  63. package/src/engine-components/postprocessing/Effects/Tonemapping.utils.ts +60 -0
  64. package/src/engine-components/postprocessing/PostProcessingEffect.ts +7 -7
  65. package/src/engine-components/postprocessing/PostProcessingHandler.ts +143 -19
  66. package/src/engine-components/postprocessing/Volume.ts +19 -26
  67. package/src/engine-components/postprocessing/index.ts +1 -1
  68. 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 { PostProcessingEffectPriority } from "../utils.js";
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
- priority = PostProcessingEffectPriority.Sharpening;
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,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAC3D,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,QAAQ,GAAuB,4BAA4B,CAAC,UAAU,CAAC;IAE/D,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
+ {"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
- declare enum NEToneMappingMode {
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 _tonemappingEffect;
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,49 +43,46 @@ export class ToneMappingEffect extends PostProcessingEffect {
88
43
  return;
89
44
  super.onEffectEnabled(ppmanager);
90
45
  }
46
+ _tonemappingEffect = null;
91
47
  onCreateEffect() {
92
- // TODO: this should be done in the PostProcessingHandler
93
- if (this.postprocessingContext) {
94
- for (const other of this.postprocessingContext.components) {
95
- // If we're the first tonemapping effect it's all good
96
- if (other === this)
97
- break;
98
- // If another tonemapping effect is found, warn the user
99
- if (other != this && other instanceof ToneMappingEffect) {
100
- console.warn("[PostProcessing] Multiple tonemapping effects found in the same postprocessing stack: Please check your scene setup.", { activeEffect: other, ignoredEffect: this });
101
- return undefined;
102
- }
103
- }
104
- }
105
48
  // ensure the effect tonemapping value is initialized
106
49
  if (this.mode.isInitialized == false) {
107
- const mode = threeToNeToneMapping(this.context.renderer.toneMapping);
50
+ const mode = threeToNeedleToneMapping(this.context.renderer.toneMapping);
108
51
  if (debug)
109
52
  console.log("[PostProcessing] Initializing ToneMapping mode to renderer.toneMapping", this.context.renderer.toneMapping + " → " + mode);
110
53
  this.mode.initialize(mode);
111
54
  }
55
+ this._tonemappingEffect?.dispose();
112
56
  const threeMode = toThreeToneMapping(this.mode.value);
113
- const tonemapping = new MODULES.POSTPROCESSING.MODULE.ToneMappingEffect({
57
+ const tonemapping = this._tonemappingEffect = new MODULES.POSTPROCESSING.MODULE.ToneMappingEffect({
114
58
  mode: threeToneMappingToEffectMode(threeMode),
115
59
  });
116
60
  this.mode.onValueChanged = (newValue) => {
117
- const threeMode = toThreeToneMapping(newValue);
118
- tonemapping.mode = threeToneMappingToEffectMode(threeMode);
61
+ if (typeof newValue === "string") {
62
+ newValue = nameToThreeTonemapping(newValue);
63
+ tonemapping.mode = threeToneMappingToEffectMode(newValue);
64
+ }
65
+ else {
66
+ const threeMode = toThreeToneMapping(newValue);
67
+ tonemapping.mode = threeToneMappingToEffectMode(threeMode);
68
+ }
69
+ tonemapping.name = "ToneMapping (" + NEToneMappingMode[newValue] + ")";
119
70
  if (debug)
120
71
  console.log("[PostProcessing] ToneMapping mode changed to", NEToneMappingMode[newValue], threeMode, tonemapping.mode);
121
72
  };
122
73
  if (debug)
123
74
  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
75
  return tonemapping;
128
76
  }
129
77
  onBeforeRender() {
130
- if (this.mode.overrideState)
131
- this.context.renderer.toneMapping = toThreeToneMapping(this.mode.value);
132
- if (this.exposure.overrideState && this.exposure.value !== undefined)
133
- this.context.renderer.toneMappingExposure = this.exposure.value;
78
+ if (this._tonemappingEffect && this.postprocessingContext?.handler.getEffectIsActive(this._tonemappingEffect)) {
79
+ if (this.mode.overrideState)
80
+ this.context.renderer.toneMapping = toThreeToneMapping(this.mode.value);
81
+ if (this.exposure.overrideState && this.exposure.value !== undefined) {
82
+ const newValue = Math.max(0.01, this.exposure.value);
83
+ this.context.renderer.toneMappingExposure = newValue;
84
+ }
85
+ }
134
86
  }
135
87
  }
136
88
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"Tonemapping.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/Effects/Tonemapping.ts"],"names":[],"mappings":"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"}
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 priority of this effect. The higher the priority the later the effect will be applied in the post processing stack.
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 PostProcessingEffectPriority constant to order your custom effects before or after built-in effects.
50
- * @default `undefined` (no specific priority set, will be applied in the order of registration)
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 { PostProcessingEffectPriority } from "@needle-tools/engine"
54
+ * import { PostProcessingEffectOrder } from "@needle-tools/engine"
55
55
  *
56
56
  * export class MyCustomEffect extends PostProcessingEffect {
57
- * priority: PostProcessingEffectPriority.Bloom + 1; // render after bloom
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
- priority: number | undefined;
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 priority of this effect. The higher the priority the later the effect will be applied in the post processing stack.
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 PostProcessingEffectPriority constant to order your custom effects before or after built-in effects.
48
- * @default `undefined` (no specific priority set, will be applied in the order of registration)
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 { PostProcessingEffectPriority } from "@needle-tools/engine"
52
+ * import { PostProcessingEffectOrder } from "@needle-tools/engine"
53
53
  *
54
54
  * export class MyCustomEffect extends PostProcessingEffect {
55
- * priority: PostProcessingEffectPriority.Bloom + 1; // render after bloom
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
- priority = undefined;
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":"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"}
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 type { EffectComposer } from "postprocessing";
1
+ import type { Effect, EffectComposer } from "postprocessing";
2
2
  import { Context } from "../../engine/engine_setup.js";
3
3
  import { PostProcessingEffect } from "./PostProcessingEffect.js";
4
4
  /**
@@ -8,6 +8,10 @@ export declare class PostProcessingHandler {
8
8
  private _composer;
9
9
  private _lastVolumeComponents?;
10
10
  private readonly _effects;
11
+ /**
12
+ * Returns true if a specific effect is currently active in the post processing stack.
13
+ */
14
+ getEffectIsActive(effect: Effect): boolean;
11
15
  get isActive(): boolean;
12
16
  get composer(): EffectComposer | null;
13
17
  private _isActive;
@@ -23,6 +27,11 @@ export declare class PostProcessingHandler {
23
27
  get anyPassHasDepth(): boolean;
24
28
  get anyPassHasNormal(): boolean;
25
29
  get hasSmaaEffect(): boolean;
30
+ private _customInputBuffer;
31
+ private _customInputBufferId;
32
+ private _multisampling;
33
+ set multisampling(value: number);
34
+ get multisampling(): number;
26
35
  /** Build composer passes */
27
36
  private applyEffects;
28
37
  /** 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 { orderEffects } from "./utils.js";
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
  */
@@ -15,6 +18,14 @@ export class PostProcessingHandler {
15
18
  _composer = null;
16
19
  _lastVolumeComponents;
17
20
  _effects = [];
21
+ /**
22
+ * Returns true if a specific effect is currently active in the post processing stack.
23
+ */
24
+ getEffectIsActive(effect) {
25
+ if (!effect)
26
+ return false;
27
+ return this._isActive && this._effects.some(e => e.effect === effect);
28
+ }
18
29
  get isActive() {
19
30
  return this._isActive;
20
31
  }
@@ -62,6 +73,9 @@ export class PostProcessingHandler {
62
73
  if (typeof context.renderer[autoclearSetting] === "boolean") {
63
74
  context.renderer.autoClear = context.renderer[autoclearSetting];
64
75
  }
76
+ if (typeof context.renderer[previousToneMapping] === "number") {
77
+ context.renderer.toneMapping = context.renderer[previousToneMapping];
78
+ }
65
79
  }
66
80
  this._composer?.removeAllPasses();
67
81
  if (dispose)
@@ -124,14 +138,14 @@ export class PostProcessingHandler {
124
138
  for (const effect of res) {
125
139
  this._effects.push({
126
140
  effect,
127
- priority: component.priority
141
+ priority: component.order
128
142
  });
129
143
  }
130
144
  }
131
145
  else {
132
146
  this._effects.push({
133
147
  effect: res,
134
- priority: component.priority
148
+ priority: component.order
135
149
  });
136
150
  }
137
151
  }
@@ -141,13 +155,6 @@ export class PostProcessingHandler {
141
155
  showBalloonWarning("Volume component is not a VolumeComponent: " + component["__type"]);
142
156
  }
143
157
  }
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
158
  this.applyEffects(context);
152
159
  }
153
160
  _anyPassHasDepth = false;
@@ -156,14 +163,22 @@ export class PostProcessingHandler {
156
163
  get anyPassHasDepth() { return this._anyPassHasDepth; }
157
164
  get anyPassHasNormal() { return this._anyPassHasNormal; }
158
165
  get hasSmaaEffect() { return this._hasSmaaEffect; }
166
+ _customInputBuffer = null;
167
+ _customInputBufferId = 0;
168
+ _multisampling = 0;
169
+ set multisampling(value) {
170
+ this._multisampling = value;
171
+ }
172
+ get multisampling() {
173
+ return this._multisampling;
174
+ }
159
175
  /** Build composer passes */
160
176
  applyEffects(context) {
161
177
  // Reset state
162
178
  this._anyPassHasDepth = false;
163
179
  this._anyPassHasNormal = false;
164
180
  this._hasSmaaEffect = false;
165
- const effectsOrPasses = this._effects;
166
- if (effectsOrPasses.length <= 0) {
181
+ if (this._effects.length <= 0) {
167
182
  return;
168
183
  }
169
184
  const camera = context.mainCameraComponent;
@@ -178,6 +193,19 @@ export class PostProcessingHandler {
178
193
  renderer.autoClear = renderer[autoclearSetting];
179
194
  }
180
195
  renderer[autoclearSetting] = renderer.autoClear;
196
+ if (typeof renderer[previousToneMapping] === "number") {
197
+ renderer.toneMapping = renderer[previousToneMapping];
198
+ }
199
+ renderer[previousToneMapping] = renderer.toneMapping;
200
+ // Ensure that we have a tonemapping effect if the renderer is set to use a tone mapping
201
+ if (renderer.toneMapping != NoToneMapping) {
202
+ if (!this._effects.find(e => e instanceof MODULES.POSTPROCESSING.MODULE.ToneMappingEffect)) {
203
+ const tonemapping = new MODULES.POSTPROCESSING.MODULE.ToneMappingEffect();
204
+ tonemapping.name = `ToneMapping (${renderer.toneMapping})`;
205
+ tonemapping.mode = threeToneMappingToEffectMode(renderer.toneMapping);
206
+ this._effects.push({ effect: tonemapping, priority: PostProcessingEffectOrder.ToneMapping });
207
+ }
208
+ }
181
209
  // create composer and set active on context
182
210
  if (!this._composer) {
183
211
  // const hdrRenderTarget = new WebGLRenderTarget(window.innerWidth, window.innerHeight, { type: HalfFloatType });
@@ -195,20 +223,92 @@ export class PostProcessingHandler {
195
223
  composer.setRenderer(renderer);
196
224
  composer.setMainScene(scene);
197
225
  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;
226
+ composer.multisampling = 0; // Disable multisampling by default
199
227
  for (const prev of composer.passes)
200
228
  prev.dispose();
201
229
  composer.removeAllPasses();
202
230
  // Render to screen pass
203
231
  const screenpass = new MODULES.POSTPROCESSING.MODULE.RenderPass(scene, cam);
204
- screenpass.name = "Render To Screen";
232
+ screenpass.name = "RenderPass";
205
233
  screenpass.mainScene = scene;
206
234
  composer.addPass(screenpass);
235
+ const screenPassRender = screenpass.render;
236
+ this._customInputBuffer?.dispose();
237
+ this._customInputBuffer = null;
238
+ screenpass.render = (renderer, inputBuffer, outputBuffer, deltaTime, stencilTest) => {
239
+ if (!inputBuffer)
240
+ return;
241
+ // screenPassRender.call(screenpass, renderer, inputBuffer, outputBuffer, deltaTime, stencilTest);
242
+ // return;
243
+ // 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
244
+ inputBuffer.samples = 0;
245
+ if (outputBuffer) {
246
+ outputBuffer.samples = 0;
247
+ }
248
+ // Make sure the input buffer is a WebGLRenderTarget with the correct settings
249
+ if (!this._customInputBuffer
250
+ || this._customInputBuffer.width !== inputBuffer.width
251
+ || this._customInputBuffer.height !== inputBuffer.height
252
+ || this._customInputBuffer.samples !== this._multisampling
253
+ || this._customInputBuffer.texture.format !== inputBuffer.texture.format
254
+ || this._customInputBuffer.texture.type !== HalfFloatType) {
255
+ this._customInputBuffer?.dispose();
256
+ this._customInputBuffer = new WebGLRenderTarget(inputBuffer.width, inputBuffer.height, {
257
+ format: inputBuffer.texture.format,
258
+ type: HalfFloatType,
259
+ depthBuffer: inputBuffer.depthBuffer,
260
+ depthTexture: inputBuffer.depthTexture
261
+ ? new DepthTexture(inputBuffer.width, inputBuffer.height)
262
+ : undefined,
263
+ stencilBuffer: inputBuffer.stencilBuffer,
264
+ samples: Math.max(0, this._multisampling),
265
+ minFilter: inputBuffer.texture.minFilter ?? LinearFilter,
266
+ magFilter: inputBuffer.texture.magFilter ?? LinearFilter,
267
+ generateMipmaps: inputBuffer.texture.generateMipmaps,
268
+ });
269
+ this._customInputBufferId++;
270
+ this._customInputBuffer.texture.name = `CustomInputBuffer-${this._customInputBufferId}`;
271
+ if (this._customInputBuffer.depthTexture && inputBuffer.depthTexture) {
272
+ this._customInputBuffer.depthTexture.format = inputBuffer.depthTexture.format;
273
+ this._customInputBuffer.depthTexture.type = inputBuffer.depthTexture.type;
274
+ }
275
+ // https://github.com/pmndrs/postprocessing/blob/ad338df710ef41fee4e5d10ad2c2c299030d46ef/src/core/EffectComposer.js#L366
276
+ if (this._customInputBuffer.samples > 0)
277
+ this._customInputBuffer.ignoreDepthForMultisampleCopy = false;
278
+ if (debug)
279
+ console.warn(`[PostProcessing] Input buffer created with size ${this._customInputBuffer.width}x${this._customInputBuffer.height} and samples ${this._customInputBuffer.samples}`);
280
+ }
281
+ // Calling the original render function with the input buffer
282
+ screenPassRender.call(screenpass, renderer, this._customInputBuffer, outputBuffer, deltaTime, stencilTest);
283
+ // Blit the resulting buffer to the input buffer passed in by the composer so it's used for subsequent effects
284
+ Graphics.blit(this._customInputBuffer.texture, inputBuffer, {
285
+ renderer,
286
+ depthTexture: this._customInputBuffer.depthTexture,
287
+ depthWrite: true,
288
+ depthTest: true,
289
+ });
290
+ };
207
291
  try {
208
292
  orderEffects(this._effects);
293
+ let foundTonemappingEffect = false;
294
+ let activeTonemappingEffect = null;
295
+ for (let i = this._effects.length - 1; i >= 0; i--) {
296
+ const ef = this._effects[i].effect;
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
+ if (debug)
301
+ console.warn(`[PostProcessing] Found multiple tonemapping effects in the scene: ${ef.name} and ${activeTonemappingEffect?.name}. Only the last one added will be used.`);
302
+ this._effects.splice(i, 1);
303
+ continue;
304
+ }
305
+ activeTonemappingEffect = ef;
306
+ foundTonemappingEffect = true;
307
+ }
308
+ }
209
309
  const effectsToMerge = [];
210
310
  let hasConvolutionEffectInArray = false;
211
- for (const entry of effectsOrPasses) {
311
+ for (const entry of this._effects) {
212
312
  const ef = entry.effect;
213
313
  if (ef instanceof MODULES.POSTPROCESSING.MODULE.SMAAEffect) {
214
314
  this._hasSmaaEffect = true;
@@ -216,6 +316,18 @@ export class PostProcessingHandler {
216
316
  else if (ef instanceof MODULES.POSTPROCESSING.MODULE.NormalPass) {
217
317
  this._anyPassHasNormal = true;
218
318
  }
319
+ // There can be only one tonemapping effect in the scene, so we can skip all others
320
+ if (ef instanceof MODULES.POSTPROCESSING.MODULE.ToneMappingEffect && activeTonemappingEffect !== ef) {
321
+ // If we already have a tonemapping effect, we can skip this one
322
+ continue;
323
+ }
324
+ // We can also not merge multiple effects of the same type in one pass
325
+ // So we first need to create a new pass with whatever effects we have so far
326
+ // 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
327
+ // const constructor = ef.constructor as Constructor<Effect | Pass>;
328
+ // if(effectsToMerge.find(e => e.constructor === constructor)) {
329
+ // // this.createPassForMergeableEffects(effectsToMerge, composer, cam, scene);
330
+ // }
219
331
  if (ef instanceof MODULES.POSTPROCESSING.MODULE.Effect) {
220
332
  const attributes = ef.getAttributes();
221
333
  const convolution = MODULES.POSTPROCESSING.MODULE.EffectAttribute.CONVOLUTION;