Parcourir la source

Add support for automatically setting camera.setDirty when position, rotation or target changes in the last frame.

master
Palash Bansal il y a 2 ans
Parent
révision
90eaaafa5b
Aucun compte lié à l'adresse e-mail de l'auteur
1 fichiers modifiés avec 35 ajouts et 2 suppressions
  1. 35
    2
      src/viewer/ThreeViewer.ts

+ 35
- 2
src/viewer/ThreeViewer.ts Voir le fichier

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

Chargement…
Annuler
Enregistrer