import {Light} from 'three/src/lights/Light'; import {Object3D} from 'three/src/core/Object3D'; import {BaseLightHelper, BaseLightHelperObjNode} from './helpers/_BaseLightHelper'; // interface Helper extends BaseLightHelper { // dispose: () => void; // update: () => void; // } export interface HelperConstructor { new (node: BaseLightHelperObjNode, name: string): BaseLightHelper>; } export class HelperController { private _helper: BaseLightHelper> | undefined; constructor( private node: BaseLightHelperObjNode, private _helper_constructor: HelperConstructor, private _name: string ) {} initializeNode() { this.node.flags.display.add_hook(() => { this.update(); }); } get helper() { if (this.node.flags.display.active()) { return (this._helper = this._helper || this._create_helper()); } } get visible() { return this.node.flags.display.active() && this.node.pv.showHelper; } private _create_helper(): BaseLightHelper> { const helper = new this._helper_constructor(this.node, this._name); helper.build(); return helper; } update() { if (this.visible) { if (!this._helper) { this._helper = this._create_helper(); } if (this._helper) { this.node.light.add(this._helper.object); this._helper.update(); } } else { if (this._helper) { this.node.light.remove(this._helper.object); } } } }