@needle-tools/engine
Version:
Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.
62 lines (53 loc) • 2.19 kB
text/typescript
import { serializeable } from "../../engine/engine_serialization_decorator.js";
import { getParam } from "../../engine/engine_utils.js";
import { Component } from "../Component.js";
import { PostProcessingEffect } from "./PostProcessingEffect.js";
import type { Volume } from "./Volume.js";
const debug = getParam("debugpost");
const customEffects: { [name: string]: typeof PostProcessingEffect } = {};
export function registerCustomEffectType(name: string, effect: typeof PostProcessingEffect) {
customEffects[name] = effect;
}
// resolve the types:
function resolveComponentType(data: { __type: string }) {
if (data.__type in customEffects)
return customEffects[data.__type];
// if ("mode" in data) return ToneMapping;
// if ("postExposure" in data) return ColorAdjustments;
// switch (data.__type) {
// // case "Bloom": return Bloom;
// // case "DepthOfField": return DepthOfField;
// // case "Vignette": return Vignette
// // case "ColorAdjustments": return ColorAdjustments;
// // case "Tonemapping": return ToneMapping;
// }
if (debug && data.__type)
console.warn("Unknown postprocessing type", data.__type, data)
return PostProcessingEffect;
}
/** @internal */
export class VolumeProfile {
/** effects added to the volume */
([d => resolveComponentType(d), PostProcessingEffect])
components: PostProcessingEffect[] = [];
/**
* call init on all components
* @hidden
**/
__init(owner: Component) {
this.components?.forEach(c => {
// Make sure all components are added to the gameobject (this is not the case when e.g. effects are serialized from Unity)
if (c.gameObject === undefined) {
owner.gameObject.addComponent(c);
}
c.init()
});
}
addEffect(effect: PostProcessingEffect) {
this.components.push(effect);
}
removeEffect(effect: PostProcessingEffect) {
const idx = this.components.indexOf(effect);
if (idx >= 0) this.components.splice(idx, 1);
}
}