Revision control
Copy as Markdown
import XRViewport from './XRViewport.js'
import MatrixMath from './fill/MatrixMath.js'
/*
An XRView describes a single view into an XR scene.
It provides several values directly, and acts as a key to query view-specific values from other interfaces.
*/
export default class XRView {
	constructor(fov, depthNear, depthFar, eye=null){
		this._fov = fov
		this._depthNear = depthNear
		this._depthFar = depthFar
		this._eye = eye
		this._viewport = new XRViewport(0, 0, 1, 1)
		this._projectionMatrix = new Float32Array(16)
		MatrixMath.mat4_perspectiveFromFieldOfView(this._projectionMatrix, this._fov, this._depthNear, this._depthFar)
	}
	get eye(){ return this._eye }
	get projectionMatrix(){ return this._projectionMatrix }
	setProjectionMatrix(array16){
		for(let i=0; i < 16; i++){
			this._projectionMatrix[i] = array16[i]
		}
	}
	getViewport(layer){
		if(this._eye === XRView.LEFT){
			this._viewport.x = 0
			this._viewport.y = 0
			this._viewport.width = layer.framebufferWidth / 2
			this._viewport.height = layer.framebufferHeight
		} else if(this._eye === XRView.RIGHT){
			this._viewport.x = layer.framebufferWidth / 2
			this._viewport.y = 0
			this._viewport.width = layer.framebufferWidth / 2
			this._viewport.height = layer.framebufferHeight
		} else {
			this._viewport.x = 0
			this._viewport.y = 0
			this._viewport.width = layer.framebufferWidth
			this._viewport.height = layer.framebufferHeight
		}
		return this._viewport
	}
}
XRView.LEFT = 'left'
XRView.RIGHT = 'right'
XRView.EYES = [XRView.LEFT, XRView.RIGHT]