UNPKG

@polygonjs/polygonjs

Version:

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

67 lines (61 loc) 2.24 kB
import {BaseSopOperation} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {Camera, OrthographicCamera, PerspectiveCamera, Vector3} from 'three'; import {InputCloneMode} from '../../poly/InputCloneMode'; import {isBooleanTrue} from '../../../core/Type'; import {DefaultOperationParams} from '../../../core/operations/_Base'; import { CorePoint } from '../../../core/geometry/entities/point/CorePoint'; import { CoreObjectType } from '../../../core/geometry/ObjectContent'; const _points:CorePoint<CoreObjectType>[]=[] interface CameraProjectSopParams extends DefaultOperationParams { project: boolean; } export class CameraProjectSopOperation extends BaseSopOperation { static override readonly DEFAULT_PARAMS: CameraProjectSopParams = { project: true, }; static override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE; static override type(): Readonly<'cameraProject'> { return 'cameraProject'; } private _pointPosition = new Vector3(); override cook(inputCoreGroups: CoreGroup[], params: CameraProjectSopParams) { const inputCoreGroup = inputCoreGroups[0]; const cameraCoreGroup = inputCoreGroups[1]; let cameraObject: Camera | undefined; const cameraCoreGroupObjects = cameraCoreGroup.threejsObjects(); for (let cameraCoreGroupObject of cameraCoreGroupObjects) { cameraCoreGroupObject.traverse((childObject) => { if (!cameraObject) { if ((childObject as Camera).isCamera) { cameraObject = childObject as Camera; } } }); } if (!cameraObject) { this.states?.error.set(`camera not found.`); return inputCoreGroup; } // update cam cameraObject.updateMatrix(); if ( (cameraObject as PerspectiveCamera).isPerspectiveCamera || (cameraObject as OrthographicCamera).isOrthographicCamera ) { (cameraObject as PerspectiveCamera).updateProjectionMatrix(); } inputCoreGroup.points(_points); const project = isBooleanTrue(params.project); for (const point of _points) { point.position(this._pointPosition); if (project) { this._pointPosition.project(cameraObject); } else { this._pointPosition.unproject(cameraObject); } point.setPosition(this._pointPosition); } return inputCoreGroup; } }