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
JavaScript
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