UNPKG

threepipe

Version:

A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.

138 lines 6.25 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; import { AViewerPluginSync } from '../../viewer'; import { uiFolderContainer, uiToggle } from 'uiconfig.js'; let VirtualCamerasPlugin = class VirtualCamerasPlugin extends AViewerPluginSync { constructor(enabled = true) { super(); this.enabled = true; this.toJSON = undefined; // disable serialization this.cameras = []; this._viewerListeners = { preRender: () => { if (this.isDisabled() || !this._viewer) return; const viewer = this._viewer; for (const v of this.cameras) { if (!v.enabled) continue; const camera = v.camera; try { this.dispatchEvent({ type: 'preRenderCamera', camera: v }); viewer.scene.renderCamera = camera; viewer.renderManager.render(viewer.scene, false); const source = viewer.renderManager.composer.readBuffer.texture; this.dispatchEvent({ type: 'preBlitCamera', camera: v, readBuffer: source }); viewer.renderManager.blit(v.target, { source }); this.dispatchEvent({ type: 'postRenderCamera', camera: v }); } catch (e) { viewer.console.error(e); v.enabled = false; if (viewer.debug) throw e; } } }, }; this.enabled = enabled; } onAdded(viewer) { super.onAdded(viewer); // todo save camera state in userData? viewer.object3dManager.registerObjectExtension({ uuid: 'VirtualCameraPluginExt', isCompatible: object => object.isCamera, getUiConfig: (object) => { if (!object.isCamera) return undefined; return [{ type: 'button', label: 'Add Virtual Camera', hidden: () => !!this.cameras.find(f => f.camera === object), onClick: () => { if (!this._viewer) return; this.addCamera(object, undefined, true); object.setDirty(); return () => { this.removeCamera(object); object.setDirty(); }; }, }, { type: 'button', label: 'Virtual Camera Enabled', hidden: () => !this.cameras.find(f => f.camera === object), getValue: () => { const vCam = this.cameras.find(f => f.camera === object); return vCam ? vCam.enabled : false; }, setValue: () => { const vCam = this.cameras.find(f => f.camera === object); if (vCam) { vCam.enabled = !vCam.enabled; return vCam.enabled; } return false; }, }, { type: 'button', label: 'Remove Virtual Camera', hidden: () => !this.cameras.find(f => f.camera === object), onClick: () => { if (!this._viewer) return; this.removeCamera(object); object.setDirty(); return () => { this.addCamera(object, undefined, true); object.setDirty(); }; }, }]; }, }); } addCamera(camera, target, addTargetPreview = false) { if (!this._viewer) throw 'Plugin not added to viewer'; target = target ?? this._viewer.renderManager.composerTarget.clone(true); target.name = camera.name + '_virtualCamTarget'; const vCam = { camera, target, enabled: true }; this.cameras.push(vCam); // todo: track for jitter in progressive or something else for jittering if (addTargetPreview) { const rt = this._viewer.getPlugin('RenderTargetPreviewPlugin'); rt?.addTarget(target, camera.name, false, false, true); } return vCam; } removeCamera(camera) { if (!this._viewer) throw 'Plugin not added to viewer'; const index = this.cameras.findIndex(f => f.camera === camera); if (index >= 0) { const vCam = this.cameras[index]; this.cameras.splice(index, 1); const rt = this._viewer.getPlugin('RenderTargetPreviewPlugin'); rt?.removeTarget(vCam.target); vCam.target.dispose(); return true; } return false; } }; VirtualCamerasPlugin.PluginType = 'VirtualCamerasPlugin'; __decorate([ uiToggle() ], VirtualCamerasPlugin.prototype, "enabled", void 0); VirtualCamerasPlugin = __decorate([ uiFolderContainer('Virtual Cameras') ], VirtualCamerasPlugin); export { VirtualCamerasPlugin }; //# sourceMappingURL=VirtualCamerasPlugin.js.map