UNPKG

@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

53 lines (45 loc) 2.08 kB
import { Object3D } from "three"; import { isDevEnvironment } from "../../engine/debug/index.js"; import { addComponent } from "../../engine/engine_components.js"; import { foreachComponentEnumerator } from "../../engine/engine_gameobject.js"; import { ConstructorConcrete, IComponent } from "../../engine/engine_types.js"; import { getParam } from "../../engine/engine_utils.js"; import { type PostProcessingEffect } from "./PostProcessingEffect.js"; export const debug = getParam("debugpost"); export type IPostProcessingManager = IComponent & { get isPostProcessingManager(): boolean; addEffect(effect: PostProcessingEffect): void; removeEffect(effect: PostProcessingEffect): void; } let PostprocessingManagerType: ConstructorConcrete<IPostProcessingManager> | null = null; export function setPostprocessingManagerType(type: ConstructorConcrete<IPostProcessingManager>) { PostprocessingManagerType = type; } export function findPostProcessingManager(effect: PostProcessingEffect): IPostProcessingManager | null { let obj = effect.gameObject as Object3D | null; while (obj) { for (const comp of foreachComponentEnumerator(obj)) { if ((comp as unknown as IPostProcessingManager).isPostProcessingManager === true) { return comp as unknown as IPostProcessingManager; } } obj = obj.parent; } return null; } export function getPostProcessingManager(effect: PostProcessingEffect): IPostProcessingManager | null { let manager: IPostProcessingManager | null = findPostProcessingManager(effect); if (!manager) { if (PostprocessingManagerType) { if (debug) console.warn("Adding postprocessing manager to the scene."); const scene = effect.scene; manager = addComponent(scene, PostprocessingManagerType); } else { if (isDevEnvironment()) console.warn("No post processing manager found"); } } return manager; }