| import {BaseEvent, Color, Event, EventDispatcher, LinearSRGBColorSpace, Object3D, Vector2} from 'three' | |||||
| import { | |||||
| BaseEvent, | |||||
| Color, | |||||
| Event, | |||||
| EventDispatcher, | |||||
| LinearSRGBColorSpace, | |||||
| Object3D, | |||||
| Quaternion, | |||||
| Vector2, | |||||
| Vector3, | |||||
| } from 'three' | |||||
| import {Class, createCanvasElement, onChange, serialize} from 'ts-browser-helpers' | import {Class, createCanvasElement, onChange, serialize} from 'ts-browser-helpers' | ||||
| import {TViewerScreenShader} from '../postprocessing' | import {TViewerScreenShader} from '../postprocessing' | ||||
| import { | import { | ||||
| */ | */ | ||||
| readonly resizeObserver = window?.ResizeObserver ? new window.ResizeObserver(_ => this.resize()) : undefined | readonly resizeObserver = window?.ResizeObserver ? new window.ResizeObserver(_ => this.resize()) : undefined | ||||
| private _lastCameraPosition: Vector3 = new Vector3() | |||||
| private _lastCameraQuat: Quaternion = new Quaternion() | |||||
| private _lastCameraTarget: Vector3 = new Vector3() | |||||
| private _tempVec: Vector3 = new Vector3() | |||||
| private _tempQuat: Quaternion = new Quaternion() | |||||
| readonly debug: boolean | readonly debug: boolean | ||||
| /** | /** | ||||
| * Create a viewer instance for using the webgi viewer SDK. | * Create a viewer instance for using the webgi viewer SDK. | ||||
| const camera = new PerspectiveCamera2('orbit', this._canvas) | const camera = new PerspectiveCamera2('orbit', this._canvas) | ||||
| camera.name = 'Default Camera' | camera.name = 'Default Camera' | ||||
| camera.position.set(0, 0, 5) | camera.position.set(0, 0, 5) | ||||
| camera.userData.autoLookAtTarget = true | |||||
| camera.userData.autoLookAtTarget = true // only for when controls are disabled / not available | |||||
| // Update camera controls postFrame if allowed to interact | |||||
| this.addEventListener('postFrame', () => { // todo: move inside RootScene. | this.addEventListener('postFrame', () => { // todo: move inside RootScene. | ||||
| const cam = this._scene.mainCamera | const cam = this._scene.mainCamera | ||||
| if (cam && cam.canUserInteract) { | if (cam && cam.canUserInteract) { | ||||
| } | } | ||||
| }) | }) | ||||
| // if camera position or target changed in last frame, call setDirty on camera | |||||
| this.addEventListener('preFrame', () => { // todo: move inside RootScene. | |||||
| const cam = this._scene.mainCamera | |||||
| if ( | |||||
| cam.getWorldPosition(this._tempVec).sub(this._lastCameraPosition).lengthSq() // position is in local space | |||||
| + this._tempVec.subVectors(cam.target, this._lastCameraTarget).lengthSq() // target is in world space | |||||
| + cam.getWorldQuaternion(this._tempQuat).angleTo(this._lastCameraQuat) | |||||
| > 0.000001) cam.setDirty() | |||||
| }) | |||||
| // scene | // scene | ||||
| this._scene = new RootScene(camera, this._objectProcessor) | this._scene = new RootScene(camera, this._objectProcessor) | ||||
| if (e.geometryChanged === false) return | if (e.geometryChanged === false) return | ||||
| this.renderManager.resetShadows() | this.renderManager.resetShadows() | ||||
| }) | }) | ||||
| this._scene.addEventListener('mainCameraUpdate', () => { | |||||
| this._scene.mainCamera.getWorldPosition(this._lastCameraPosition) | |||||
| this._lastCameraTarget.copy(this._scene.mainCamera.target) | |||||
| this._scene.mainCamera.getWorldQuaternion(this._lastCameraQuat) | |||||
| }) | |||||
| // render manager | // render manager |