UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

76 lines (66 loc) 2.36 kB
import {BaseSopOperation} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {InputCloneMode} from '../../../engine/poly/InputCloneMode'; import {RectAreaLightUniformsLib} from 'three/examples/jsm/lights/RectAreaLightUniformsLib'; import {isBooleanTrue} from '../../../core/BooleanValue'; import {Group, RectAreaLight} from 'three'; import {AreaLightParams, CoreRectAreaLightHelper, DEFAULT_AREA_LIGHT_PARAMS} from '../../../core/lights/AreaLight'; import {CoreSceneObjectsFactory, GeneratorName} from '../../../core/CoreSceneObjectsFactory'; export class AreaLightSopOperation extends BaseSopOperation { static override readonly DEFAULT_PARAMS: AreaLightParams = DEFAULT_AREA_LIGHT_PARAMS; static override readonly INPUT_CLONED_STATE = InputCloneMode.NEVER; static override type(): Readonly<'areaLight'> { return 'areaLight'; } override cook(inputCoreGroups: CoreGroup[], params: AreaLightParams) { const light = this.createLight(); light.name = params.name; this.updateLightParams(light, params); if (isBooleanTrue(params.showHelper)) { const group = new Group(); group.matrixAutoUpdate = false; group.add(light); const helper = this._createHelper(light); if (helper) { group.add(helper); } group.name = `AreaLightGroup_${light.name}`; return this.createCoreGroupFromObjects([group]); } else { return this.createCoreGroupFromObjects([light]); } } createLight() { const light = CoreSceneObjectsFactory.generator(GeneratorName.AREA_LIGHT)({ color: 0xffffff, intensity: 1, width: 1, height: 1, }); light.matrixAutoUpdate = false; const nodeName = this._node?.name(); if (nodeName) { light.name = `AreaLight_${nodeName}`; } if (!(RectAreaLightUniformsLib as any).initialized) { RectAreaLightUniformsLib.init(); (RectAreaLightUniformsLib as any).initialized = true; } return light; } updateLightParams(light: RectAreaLight, params: AreaLightParams) { light.color = params.color; light.intensity = params.intensity; light.width = params.width; light.height = params.height; // this._helperController.update(); } private _createHelper(light: RectAreaLight) { const nodeName = this._node?.name(); if (nodeName) { const helper = new CoreRectAreaLightHelper(light, nodeName); helper.update(); return helper; } } }