@needle-tools/engine 4.6.0-next.ffc175e → 4.6.1

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 (30) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{needle-engine.bundle-DUkg_M5A.umd.cjs → needle-engine.bundle-AOXFIsYk.umd.cjs} +129 -125
  3. package/dist/{needle-engine.bundle-B3vWYoFH.js → needle-engine.bundle-BVg46UWZ.js} +4840 -4828
  4. package/dist/{needle-engine.bundle-CZu9qkBv.min.js → needle-engine.bundle-Dt52m2jf.min.js} +119 -115
  5. package/dist/needle-engine.js +2 -2
  6. package/dist/needle-engine.min.js +1 -1
  7. package/dist/needle-engine.umd.cjs +1 -1
  8. package/lib/engine/engine_assetdatabase.js +3 -1
  9. package/lib/engine/engine_assetdatabase.js.map +1 -1
  10. package/lib/engine/engine_context.d.ts +2 -2
  11. package/lib/engine/engine_context.js +11 -10
  12. package/lib/engine/engine_context.js.map +1 -1
  13. package/lib/engine-components/ReflectionProbe.d.ts +2 -1
  14. package/lib/engine-components/ReflectionProbe.js +4 -1
  15. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  16. package/lib/engine-components/Renderer.js +9 -5
  17. package/lib/engine-components/Renderer.js.map +1 -1
  18. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +10 -6
  19. package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
  20. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +2 -1
  21. package/lib/engine-components/postprocessing/PostProcessingHandler.js +81 -66
  22. package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
  23. package/package.json +2 -2
  24. package/plugins/vite/dependency-watcher.js +8 -2
  25. package/src/engine/engine_assetdatabase.ts +3 -1
  26. package/src/engine/engine_context.ts +14 -11
  27. package/src/engine-components/ReflectionProbe.ts +5 -1
  28. package/src/engine-components/Renderer.ts +10 -7
  29. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +9 -7
  30. package/src/engine-components/postprocessing/PostProcessingHandler.ts +88 -72
@@ -1,5 +1,5 @@
1
1
  import type { Effect, EffectComposer, Pass, ToneMappingEffect as _TonemappingEffect } from "postprocessing";
2
- import { HalfFloatType, NoToneMapping } from "three";
2
+ import { HalfFloatType, NoToneMapping, Camera as Camera3 } from "three";
3
3
 
4
4
  import { showBalloonWarning } from "../../engine/debug/index.js";
5
5
  // import { internal_SetSharpeningEffectModule } from "./Effects/Sharpening.js";
@@ -44,7 +44,7 @@ export class PostProcessingHandler {
44
44
  this.context = context;
45
45
  }
46
46
 
47
- apply(components: PostProcessingEffect[]) : Promise<void> {
47
+ apply(components: PostProcessingEffect[]): Promise<void> {
48
48
  if ("env" in import.meta && import.meta.env.VITE_NEEDLE_USE_POSTPROCESSING === "false") {
49
49
  if (debug) console.warn("Postprocessing is disabled via vite env setting");
50
50
  else console.debug("Postprocessing is disabled via vite env setting");
@@ -169,9 +169,7 @@ export class PostProcessingHandler {
169
169
  private applyEffects(context: Context) {
170
170
 
171
171
  const effectsOrPasses = this._effects;
172
-
173
172
  if (effectsOrPasses.length <= 0) return;
174
-
175
173
  const camera = context.mainCameraComponent as Camera;
176
174
  const renderer = context.renderer;
177
175
  const scene = context.scene;
@@ -199,6 +197,7 @@ export class PostProcessingHandler {
199
197
  composer.setMainCamera(cam);
200
198
  composer.setRenderer(renderer);
201
199
  composer.setMainScene(scene);
200
+ 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)
202
201
 
203
202
  for (const prev of composer.passes)
204
203
  prev.dispose();
@@ -218,9 +217,11 @@ export class PostProcessingHandler {
218
217
  const effects: Array<Effect> = [];
219
218
 
220
219
  for (const ef of effectsOrPasses) {
221
- if (ef instanceof MODULES.POSTPROCESSING.MODULE.Effect)
220
+ if (ef instanceof MODULES.POSTPROCESSING.MODULE.Effect) {
222
221
  effects.push(ef as Effect);
222
+ }
223
223
  else if (ef instanceof MODULES.POSTPROCESSING.MODULE.Pass) {
224
+ ef.renderToScreen = false;
224
225
  composer.addPass(ef as Pass);
225
226
  }
226
227
  else {
@@ -233,9 +234,10 @@ export class PostProcessingHandler {
233
234
  // create and apply uber pass
234
235
  if (effects.length > 0) {
235
236
  const pass = new MODULES.POSTPROCESSING.MODULE.EffectPass(cam, ...effects);
236
- pass.name = effects.map(e => e.name).join(" ");
237
+ pass.name = effects.map(e => e.name).join(", ");
237
238
  pass.mainScene = scene;
238
239
  pass.enabled = true;
240
+ pass.renderToScreen = false;
239
241
  composer.addPass(pass);
240
242
  }
241
243
  }
@@ -255,8 +257,10 @@ export class PostProcessingHandler {
255
257
  pass.name = ef.name;
256
258
  composer.addPass(pass);
257
259
  }
258
- else if (ef instanceof MODULES.POSTPROCESSING.MODULE.Pass)
260
+ else if (ef instanceof MODULES.POSTPROCESSING.MODULE.Pass) {
261
+ ef.renderToScreen = false;
259
262
  composer.addPass(ef as Pass);
263
+ }
260
264
  else
261
265
  // seems some effects are not correctly typed, but three can deal with them,
262
266
  // so we just pass them through
@@ -264,10 +268,83 @@ export class PostProcessingHandler {
264
268
  }
265
269
  }
266
270
 
267
- if (debug) {
268
271
 
269
- console.log("[PostProcessing] Passes →", composer.passes);
272
+ // The last pass is the one that renders to the screen, so we need to set the gamma correction for it (and enable it for all others)
273
+ for (let i = 0; i < composer.passes.length; i++) {
274
+ const pass = composer.passes[i] as any;
275
+ const isLast = i === composer.passes.length - 1;
276
+ if (pass?.configuration !== undefined) {
277
+ pass.configuration.gammaCorrection = isLast;
278
+ }
279
+ else if ("autosetGamma" in pass) {
280
+ // Some effects have a autosetGamma property that we can use to set the gamma correction
281
+ pass.autosetGamma = isLast;
282
+ }
283
+ }
284
+
285
+ // DEBUG LAND BELOW
286
+ if (debug) console.log("[PostProcessing] Passes →", [...composer.passes], "\n---------------------------------\n• " + composer.passes.map(i => i.name).join("\n• ") + "\n");
287
+ if (debug) this._onCreateEffectsDebug(this._composer!, cam);
288
+ }
289
+
290
+ private orderEffects() {
291
+ if (debug === "verbose") console.debug("Before ordering effects", [...this._effects]);
292
+
293
+ // Order of effects for correct results.
294
+ // Aligned with https://github.com/pmndrs/postprocessing/wiki/Effect-Merging#effect-execution-order
295
+ // We can not put this into global scope because then the module might not yet be initialized
296
+ effectsOrder ??= [
297
+ MODULES.POSTPROCESSING.MODULE.NormalPass,
298
+ MODULES.POSTPROCESSING.MODULE.DepthDownsamplingPass,
299
+ MODULES.POSTPROCESSING.MODULE.SMAAEffect,
300
+ MODULES.POSTPROCESSING.MODULE.SSAOEffect,
301
+ MODULES.POSTPROCESSING_AO.MODULE.N8AOPostPass,
302
+ MODULES.POSTPROCESSING.MODULE.TiltShiftEffect,
303
+ MODULES.POSTPROCESSING.MODULE.DepthOfFieldEffect,
304
+ MODULES.POSTPROCESSING.MODULE.ChromaticAberrationEffect,
305
+ MODULES.POSTPROCESSING.MODULE.BloomEffect,
306
+ MODULES.POSTPROCESSING.MODULE.SelectiveBloomEffect,
307
+ MODULES.POSTPROCESSING.MODULE.VignetteEffect,
308
+ MODULES.POSTPROCESSING.MODULE.PixelationEffect,
309
+ MODULES.POSTPROCESSING.MODULE.ToneMappingEffect,
310
+ MODULES.POSTPROCESSING.MODULE.HueSaturationEffect,
311
+ MODULES.POSTPROCESSING.MODULE.BrightnessContrastEffect,
312
+ // __SHARPENING_MODULE._SharpeningEffect,
313
+ ];
314
+
315
+
316
+ // TODO: enforce correct order of effects (e.g. DOF before Bloom)
317
+ const effects = this._effects;
318
+ effects.sort((a, b) => {
319
+ // we use find index here because sometimes constructor names are prefixed with `_`
320
+ // TODO: find a more robust solution that isnt name based (not sure if that exists tho... maybe we must give effect TYPES some priority/index)
321
+ const aidx = effectsOrder!.findIndex(e => a.constructor.name.endsWith(e.name));
322
+ const bidx = effectsOrder!.findIndex(e => b.constructor.name.endsWith(e.name));
323
+ // Unknown effects should be rendered first
324
+ if (aidx < 0) {
325
+ if (debug) console.warn("Unknown effect found: ", a.constructor.name);
326
+ return -1;
327
+ }
328
+ else if (bidx < 0) {
329
+ if (debug) console.warn("Unknown effect found: ", b.constructor.name);
330
+ return 1;
331
+ }
332
+ // if (aidx < 0) return 1;
333
+ // if (bidx < 0) return -1;
334
+ return aidx - bidx;
335
+ });
336
+
337
+ if (debug === "verbose") console.debug("After ordering effects", [...this._effects]);
338
+ }
339
+
340
+
341
+
270
342
 
343
+ private _menuEntry: HTMLSelectElement | null = null;
344
+ private _passIndices: number[] | null = null;
345
+
346
+ private _onCreateEffectsDebug(composer: EffectComposer, cam: Camera3) {
347
+ if (debug === "passes") {
271
348
  // DepthEffect for debugging purposes, disabled by default, can be selected in the debug pass select
272
349
  const depthEffect = new MODULES.POSTPROCESSING.MODULE.DepthEffect({
273
350
  blendFunction: MODULES.POSTPROCESSING.MODULE.BlendFunction.NORMAL,
@@ -303,7 +380,7 @@ export class PostProcessingHandler {
303
380
  if (menu && this._passIndices === null) {
304
381
  if (this._menuEntry)
305
382
  this._menuEntry.remove();
306
-
383
+
307
384
  const select = document.createElement("select");
308
385
  select.multiple = true;
309
386
  const defaultOpt = document.createElement("option");
@@ -327,73 +404,12 @@ export class PostProcessingHandler {
327
404
  else {
328
405
  this._passIndices = indices;
329
406
  }
330
-
331
- this.applyEffects(context);
407
+ this.applyEffects(this.context);
332
408
  });
333
409
  }
334
410
  }
335
411
  }
336
412
 
337
- private _menuEntry: HTMLSelectElement | null = null;
338
- private _passIndices: number[] | null = null;
339
-
340
- private orderEffects() {
341
- if (debug) console.log("Before ordering effects", [...this._effects]);
342
-
343
-
344
-
345
- // Order of effects for correct results.
346
- // Aligned with https://github.com/pmndrs/postprocessing/wiki/Effect-Merging#effect-execution-order
347
- // We can not put this into global scope because then the module might not yet be initialized
348
- effectsOrder ??= [
349
- MODULES.POSTPROCESSING.MODULE.NormalPass,
350
- MODULES.POSTPROCESSING.MODULE.DepthDownsamplingPass,
351
- MODULES.POSTPROCESSING.MODULE.SMAAEffect,
352
- MODULES.POSTPROCESSING.MODULE.SSAOEffect,
353
- MODULES.POSTPROCESSING_AO.MODULE.N8AOPostPass,
354
- MODULES.POSTPROCESSING.MODULE.TiltShiftEffect,
355
- MODULES.POSTPROCESSING.MODULE.DepthOfFieldEffect,
356
- MODULES.POSTPROCESSING.MODULE.ChromaticAberrationEffect,
357
- MODULES.POSTPROCESSING.MODULE.BloomEffect,
358
- MODULES.POSTPROCESSING.MODULE.SelectiveBloomEffect,
359
- MODULES.POSTPROCESSING.MODULE.VignetteEffect,
360
- MODULES.POSTPROCESSING.MODULE.PixelationEffect,
361
- MODULES.POSTPROCESSING.MODULE.ToneMappingEffect,
362
- MODULES.POSTPROCESSING.MODULE.HueSaturationEffect,
363
- MODULES.POSTPROCESSING.MODULE.BrightnessContrastEffect,
364
- // __SHARPENING_MODULE._SharpeningEffect,
365
- ];
366
-
367
-
368
- // TODO: enforce correct order of effects (e.g. DOF before Bloom)
369
- const effects = this._effects;
370
- effects.sort((a, b) => {
371
- // we use find index here because sometimes constructor names are prefixed with `_`
372
- // TODO: find a more robust solution that isnt name based (not sure if that exists tho... maybe we must give effect TYPES some priority/index)
373
- const aidx = effectsOrder!.findIndex(e => a.constructor.name.endsWith(e.name));
374
- const bidx = effectsOrder!.findIndex(e => b.constructor.name.endsWith(e.name));
375
- // Unknown effects should be rendered first
376
- if (aidx < 0) {
377
- if (debug) console.warn("Unknown effect found: ", a.constructor.name);
378
- return -1;
379
- }
380
- else if (bidx < 0) {
381
- if (debug) console.warn("Unknown effect found: ", b.constructor.name);
382
- return 1;
383
- }
384
- if (aidx < 0) return 1;
385
- if (bidx < 0) return -1;
386
- return aidx - bidx;
387
- });
388
- if (debug) console.log("After ordering effects", [...this._effects]);
389
- for (let i = 0; i < effects.length; i++) {
390
- const effect = effects[i] as any;
391
- if (effect?.configuration?.gammaCorrection !== undefined) {
392
- const isLast = i === effects.length - 1;
393
- effect.configuration.gammaCorrection = isLast;
394
- }
395
- }
396
- }
397
413
  }
398
414
 
399
415
  let effectsOrder: Array<Constructor<Effect | Pass>> | null = null;