Mr.doob 8 лет назад
Родитель
Сommit
e5d7a899f2
3 измененных файлов с 622 добавлено и 259 удалено
  1. 180 0
      build/three.js
  2. 262 259
      build/three.min.js
  3. 180 0
      build/three.module.js

+ 180 - 0
build/three.js

@@ -19684,6 +19684,164 @@
 
 
 	}
 	}
 
 
+	/**
+	 * @author mrdoob / http://mrdoob.com/
+	 */
+
+	function WebVRManager( renderer ) {
+
+		var scope = this;
+
+		var device = null;
+		var frameData = null;
+
+		if ( 'VRFrameData' in window ) {
+
+			frameData = new window.VRFrameData();
+
+		}
+
+		var cameraL = new THREE.PerspectiveCamera();
+		cameraL.bounds = new THREE.Vector4( 0.0, 0.0, 0.5, 1.0 );
+		cameraL.layers.enable( 1 );
+
+		var cameraR = new THREE.PerspectiveCamera();
+		cameraR.bounds = new THREE.Vector4( 0.5, 0.0, 0.5, 1.0 );
+		cameraR.layers.enable( 2 );
+
+		var cameraVR = new THREE.ArrayCamera( [ cameraL, cameraR ] );
+
+		//
+
+		var currentSize, currentPixelRatio;
+
+		function onVRDisplayPresentChange() {
+
+			if ( device.isPresenting ) {
+
+				var eyeParameters = device.getEyeParameters( 'left' );
+				var renderWidth = eyeParameters.renderWidth;
+				var renderHeight = eyeParameters.renderHeight;
+
+				currentPixelRatio = renderer.getPixelRatio();
+				currentSize = renderer.getSize();
+
+				renderer.setPixelRatio( 1 );
+				renderer.setSize( renderWidth * 2, renderHeight, false );
+
+			} else if ( scope.enabled ) {
+
+				renderer.setPixelRatio( currentPixelRatio );
+				renderer.setSize( currentSize.width, currentSize.height, true );
+
+			}
+
+		}
+
+		window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );
+
+		//
+
+		this.enabled = false;
+
+		this.getDevice = function () {
+
+			return device;
+
+		};
+
+		this.setDevice = function ( value ) {
+
+			if ( value !== undefined ) device = value;
+
+		};
+
+		this.getCamera = function ( camera ) {
+
+			if ( device === null ) return camera;
+
+			device.depthNear = camera.near;
+			device.depthFar = camera.far;
+
+			device.getFrameData( frameData );
+
+			//
+
+			var pose = frameData.pose;
+
+			if ( pose.position !== null ) {
+
+				camera.position.fromArray( pose.position );
+
+			} else {
+
+				camera.position.set( 0, 0, 0 );
+
+			}
+
+			if ( pose.orientation !== null ) {
+
+				camera.quaternion.fromArray( pose.orientation );
+
+			}
+
+			camera.updateMatrixWorld();
+
+			if ( device.isPresenting === false ) return camera;
+
+			//
+
+			cameraVR.matrixWorld.copy( camera.matrixWorld );
+			cameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse );
+
+			cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
+			cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
+
+			var parent = camera.parent;
+
+			if ( parent !== null ) {
+
+				cameraL.matrixWorldInverse.multiply( parent.matrixWorldInverse );
+				cameraR.matrixWorldInverse.multiply( parent.matrixWorldInverse );
+
+			}
+
+			cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );
+			cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );
+
+			// HACK @mrdoob
+			// https://github.com/w3c/webvr/issues/203
+
+			cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
+
+			//
+
+			var layers = device.getLayers();
+
+			if ( layers.length ) {
+
+				var layer = layers[ 0 ];
+
+				if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {
+
+					cameraL.bounds.fromArray( layer.leftBounds );
+
+				}
+
+				if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {
+
+					cameraR.bounds.fromArray( layer.rightBounds );
+
+				}
+
+			}
+
+			return cameraVR;
+
+		};
+
+	}
+
 	/**
 	/**
 	 * @author mrdoob / http://mrdoob.com/
 	 * @author mrdoob / http://mrdoob.com/
 	 */
 	 */
@@ -20166,6 +20324,7 @@
 		var programCache = new WebGLPrograms( this, capabilities );
 		var programCache = new WebGLPrograms( this, capabilities );
 		var lightCache = new WebGLLights();
 		var lightCache = new WebGLLights();
 		var renderLists = new WebGLRenderLists();
 		var renderLists = new WebGLRenderLists();
+		var vr = new WebVRManager( this );
 
 
 		this.info.programs = programCache.programs;
 		this.info.programs = programCache.programs;
 
 
@@ -20216,6 +20375,7 @@
 		this.properties = properties;
 		this.properties = properties;
 		this.renderLists = renderLists;
 		this.renderLists = renderLists;
 		this.state = state;
 		this.state = state;
+		this.vr = vr;
 
 
 		// shadow map
 		// shadow map
 
 
@@ -20953,6 +21113,20 @@
 
 
 		// Rendering
 		// Rendering
 
 
+		this.animate = function ( callback ) {
+
+			function onFrame() {
+
+				callback();
+
+				( vr.getDevice() || window ).requestAnimationFrame( onFrame );
+
+			}
+
+			( vr.getDevice() || window ).requestAnimationFrame( onFrame );
+
+		};
+
 		this.render = function ( scene, camera, renderTarget, forceClear ) {
 		this.render = function ( scene, camera, renderTarget, forceClear ) {
 
 
 			if ( ! ( camera && camera.isCamera ) ) {
 			if ( ! ( camera && camera.isCamera ) ) {
@@ -20978,6 +21152,12 @@
 
 
 			if ( camera.parent === null ) camera.updateMatrixWorld();
 			if ( camera.parent === null ) camera.updateMatrixWorld();
 
 
+			if ( vr.enabled ) {
+
+				camera = vr.getCamera( camera );
+
+			}
+
 			_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
 			_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
 			_frustum.setFromMatrix( _projScreenMatrix );
 			_frustum.setFromMatrix( _projScreenMatrix );
 
 

Разница между файлами не показана из-за своего большого размера
+ 262 - 259
build/three.min.js


+ 180 - 0
build/three.module.js

@@ -19678,6 +19678,164 @@ function WebGLCapabilities( gl, extensions, parameters ) {
 
 
 }
 }
 
 
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+function WebVRManager( renderer ) {
+
+	var scope = this;
+
+	var device = null;
+	var frameData = null;
+
+	if ( 'VRFrameData' in window ) {
+
+		frameData = new window.VRFrameData();
+
+	}
+
+	var cameraL = new THREE.PerspectiveCamera();
+	cameraL.bounds = new THREE.Vector4( 0.0, 0.0, 0.5, 1.0 );
+	cameraL.layers.enable( 1 );
+
+	var cameraR = new THREE.PerspectiveCamera();
+	cameraR.bounds = new THREE.Vector4( 0.5, 0.0, 0.5, 1.0 );
+	cameraR.layers.enable( 2 );
+
+	var cameraVR = new THREE.ArrayCamera( [ cameraL, cameraR ] );
+
+	//
+
+	var currentSize, currentPixelRatio;
+
+	function onVRDisplayPresentChange() {
+
+		if ( device.isPresenting ) {
+
+			var eyeParameters = device.getEyeParameters( 'left' );
+			var renderWidth = eyeParameters.renderWidth;
+			var renderHeight = eyeParameters.renderHeight;
+
+			currentPixelRatio = renderer.getPixelRatio();
+			currentSize = renderer.getSize();
+
+			renderer.setPixelRatio( 1 );
+			renderer.setSize( renderWidth * 2, renderHeight, false );
+
+		} else if ( scope.enabled ) {
+
+			renderer.setPixelRatio( currentPixelRatio );
+			renderer.setSize( currentSize.width, currentSize.height, true );
+
+		}
+
+	}
+
+	window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );
+
+	//
+
+	this.enabled = false;
+
+	this.getDevice = function () {
+
+		return device;
+
+	};
+
+	this.setDevice = function ( value ) {
+
+		if ( value !== undefined ) device = value;
+
+	};
+
+	this.getCamera = function ( camera ) {
+
+		if ( device === null ) return camera;
+
+		device.depthNear = camera.near;
+		device.depthFar = camera.far;
+
+		device.getFrameData( frameData );
+
+		//
+
+		var pose = frameData.pose;
+
+		if ( pose.position !== null ) {
+
+			camera.position.fromArray( pose.position );
+
+		} else {
+
+			camera.position.set( 0, 0, 0 );
+
+		}
+
+		if ( pose.orientation !== null ) {
+
+			camera.quaternion.fromArray( pose.orientation );
+
+		}
+
+		camera.updateMatrixWorld();
+
+		if ( device.isPresenting === false ) return camera;
+
+		//
+
+		cameraVR.matrixWorld.copy( camera.matrixWorld );
+		cameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse );
+
+		cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
+		cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
+
+		var parent = camera.parent;
+
+		if ( parent !== null ) {
+
+			cameraL.matrixWorldInverse.multiply( parent.matrixWorldInverse );
+			cameraR.matrixWorldInverse.multiply( parent.matrixWorldInverse );
+
+		}
+
+		cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );
+		cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );
+
+		// HACK @mrdoob
+		// https://github.com/w3c/webvr/issues/203
+
+		cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
+
+		//
+
+		var layers = device.getLayers();
+
+		if ( layers.length ) {
+
+			var layer = layers[ 0 ];
+
+			if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {
+
+				cameraL.bounds.fromArray( layer.leftBounds );
+
+			}
+
+			if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {
+
+				cameraR.bounds.fromArray( layer.rightBounds );
+
+			}
+
+		}
+
+		return cameraVR;
+
+	};
+
+}
+
 /**
 /**
  * @author mrdoob / http://mrdoob.com/
  * @author mrdoob / http://mrdoob.com/
  */
  */
@@ -20160,6 +20318,7 @@ function WebGLRenderer( parameters ) {
 	var programCache = new WebGLPrograms( this, capabilities );
 	var programCache = new WebGLPrograms( this, capabilities );
 	var lightCache = new WebGLLights();
 	var lightCache = new WebGLLights();
 	var renderLists = new WebGLRenderLists();
 	var renderLists = new WebGLRenderLists();
+	var vr = new WebVRManager( this );
 
 
 	this.info.programs = programCache.programs;
 	this.info.programs = programCache.programs;
 
 
@@ -20210,6 +20369,7 @@ function WebGLRenderer( parameters ) {
 	this.properties = properties;
 	this.properties = properties;
 	this.renderLists = renderLists;
 	this.renderLists = renderLists;
 	this.state = state;
 	this.state = state;
+	this.vr = vr;
 
 
 	// shadow map
 	// shadow map
 
 
@@ -20947,6 +21107,20 @@ function WebGLRenderer( parameters ) {
 
 
 	// Rendering
 	// Rendering
 
 
+	this.animate = function ( callback ) {
+
+		function onFrame() {
+
+			callback();
+
+			( vr.getDevice() || window ).requestAnimationFrame( onFrame );
+
+		}
+
+		( vr.getDevice() || window ).requestAnimationFrame( onFrame );
+
+	};
+
 	this.render = function ( scene, camera, renderTarget, forceClear ) {
 	this.render = function ( scene, camera, renderTarget, forceClear ) {
 
 
 		if ( ! ( camera && camera.isCamera ) ) {
 		if ( ! ( camera && camera.isCamera ) ) {
@@ -20972,6 +21146,12 @@ function WebGLRenderer( parameters ) {
 
 
 		if ( camera.parent === null ) camera.updateMatrixWorld();
 		if ( camera.parent === null ) camera.updateMatrixWorld();
 
 
+		if ( vr.enabled ) {
+
+			camera = vr.getCamera( camera );
+
+		}
+
 		_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
 		_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
 		_frustum.setFromMatrix( _projScreenMatrix );
 		_frustum.setFromMatrix( _projScreenMatrix );
 
 

Некоторые файлы не были показаны из-за большого количества измененных файлов