Browse Source

Magic Leap's Helio support

Mr.doob 6 years ago
parent
commit
e8091f0de0

+ 6 - 0
build/three.js

@@ -22509,6 +22509,12 @@
 
 		};
 
+		this.getSession = function () {
+
+			return session;
+
+		};
+
 		this.setSession = function ( value ) {
 
 			session = value;

+ 4 - 4
build/three.min.js

@@ -153,10 +153,10 @@ x.matrixWorldInverse.fromArray(k.rightViewMatrix);v.getInverse(p);"local-floor"=
 f.hasPosition&&c.position.set(.2,-.6,-.05);null!==f.position&&c.position.fromArray(f.position);null!==f.orientation&&c.quaternion.fromArray(f.orientation);c.matrix.compose(c.position,c.quaternion,c.scale);c.matrix.premultiply(p);c.matrix.decompose(c.position,c.quaternion,c.scale);c.matrixWorldNeedsUpdate=!0;c.visible=!0;f="Daydream Controller"===e.id?0:1;void 0===C[a]&&(C[a]=!1);C[a]!==e.buttons[f].pressed&&(C[a]=e.buttons[f].pressed,!0===C[a]?c.dispatchEvent({type:"selectstart"}):(c.dispatchEvent({type:"selectend"}),
 c.dispatchEvent({type:"select"})))}else c.visible=!1}return A};this.getStandingMatrix=function(){return p};this.isPresenting=b;var F=new ie;this.setAnimationLoop=function(a){F.setAnimationLoop(a);b()&&F.start()};this.submitFrame=function(){b()&&h.submitFrame()};this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",c)};this.setFrameOfReferenceType=function(){console.warn("THREE.WebVRManager: setFrameOfReferenceType() has been deprecated.")}}function lh(a){function b(){return null!==
 h&&null!==k}function c(a){for(var b=0;b<p.length;b++)v[b]===a.inputSource&&p[b].dispatchEvent({type:a.type})}function d(){a.setFramebuffer(null);a.setRenderTarget(a.getRenderTarget());z.stop()}function e(a){k=a;z.setContext(h);z.start()}function f(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var g=a.context,h=null,k=null,m="local-floor",q=null,p=[],v=[],l=new ja;l.layers.enable(1);l.viewport=new ba;
-var r=new ja;r.layers.enable(2);r.viewport=new ba;var u=new Lc([l,r]);u.layers.enable(1);u.layers.enable(2);this.enabled=!1;this.getController=function(a){var b=p[a];void 0===b&&(b=new Yb,b.matrixAutoUpdate=!1,b.visible=!1,p[a]=b);return b};this.setFramebufferScaleFactor=function(a){};this.setReferenceSpaceType=function(a){m=a};this.setSession=function(a){h=a;null!==h&&(h.addEventListener("select",c),h.addEventListener("selectstart",c),h.addEventListener("selectend",c),h.addEventListener("end",d),
-h.updateRenderState({baseLayer:new XRWebGLLayer(h,g)}),h.requestReferenceSpace(m).then(e),v=h.inputSources,h.addEventListener("inputsourceschange",function(){v=h.inputSources;console.log(v);for(var a=0;a<p.length;a++)p[a].userData.inputSource=v[a]}))};this.getCamera=function(a){if(b()){var c=a.parent,d=u.cameras;f(u,c);for(var e=0;e<d.length;e++)f(d[e],c);a.matrixWorld.copy(u.matrixWorld);a=a.children;e=0;for(c=a.length;e<c;e++)a[e].updateMatrixWorld(!0);tf(u,l,r);return u}return a};this.isPresenting=
-b;var n=null,z=new ie;z.setAnimationLoop(function(b,c){q=c.getViewerPose(k);if(null!==q){var d=q.views,e=h.renderState.baseLayer;a.setFramebuffer(e.framebuffer);for(var f=0;f<d.length;f++){var g=d[f],m=e.getViewport(g),l=u.cameras[f];l.matrix.fromArray(g.transform.inverse.matrix).getInverse(l.matrix);l.projectionMatrix.fromArray(g.projectionMatrix);l.viewport.set(m.x,m.y,m.width,m.height);0===f&&u.matrix.copy(l.matrix)}}for(f=0;f<p.length;f++){d=p[f];if(e=v[f])if(e=c.getPose(e.targetRaySpace,k),null!==
-e){d.matrix.fromArray(e.transform.matrix);d.matrix.decompose(d.position,d.rotation,d.scale);d.visible=!0;continue}d.visible=!1}n&&n(b)});this.setAnimationLoop=function(a){n=a};this.dispose=function(){};this.getStandingMatrix=function(){console.warn("THREE.WebXRManager: getStandingMatrix() is no longer needed.");return new O};this.getDevice=function(){console.warn("THREE.WebXRManager: getDevice() has been deprecated.")};this.setDevice=function(){console.warn("THREE.WebXRManager: setDevice() has been deprecated.")};
+var r=new ja;r.layers.enable(2);r.viewport=new ba;var u=new Lc([l,r]);u.layers.enable(1);u.layers.enable(2);this.enabled=!1;this.getController=function(a){var b=p[a];void 0===b&&(b=new Yb,b.matrixAutoUpdate=!1,b.visible=!1,p[a]=b);return b};this.setFramebufferScaleFactor=function(a){};this.setReferenceSpaceType=function(a){m=a};this.getSession=function(){return h};this.setSession=function(a){h=a;null!==h&&(h.addEventListener("select",c),h.addEventListener("selectstart",c),h.addEventListener("selectend",
+c),h.addEventListener("end",d),h.updateRenderState({baseLayer:new XRWebGLLayer(h,g)}),h.requestReferenceSpace(m).then(e),v=h.inputSources,h.addEventListener("inputsourceschange",function(){v=h.inputSources;console.log(v);for(var a=0;a<p.length;a++)p[a].userData.inputSource=v[a]}))};this.getCamera=function(a){if(b()){var c=a.parent,d=u.cameras;f(u,c);for(var e=0;e<d.length;e++)f(d[e],c);a.matrixWorld.copy(u.matrixWorld);a=a.children;e=0;for(c=a.length;e<c;e++)a[e].updateMatrixWorld(!0);tf(u,l,r);return u}return a};
+this.isPresenting=b;var n=null,z=new ie;z.setAnimationLoop(function(b,c){q=c.getViewerPose(k);if(null!==q){var d=q.views,e=h.renderState.baseLayer;a.setFramebuffer(e.framebuffer);for(var f=0;f<d.length;f++){var g=d[f],m=e.getViewport(g),l=u.cameras[f];l.matrix.fromArray(g.transform.inverse.matrix).getInverse(l.matrix);l.projectionMatrix.fromArray(g.projectionMatrix);l.viewport.set(m.x,m.y,m.width,m.height);0===f&&u.matrix.copy(l.matrix)}}for(f=0;f<p.length;f++){d=p[f];if(e=v[f])if(e=c.getPose(e.targetRaySpace,
+k),null!==e){d.matrix.fromArray(e.transform.matrix);d.matrix.decompose(d.position,d.rotation,d.scale);d.visible=!0;continue}d.visible=!1}n&&n(b)});this.setAnimationLoop=function(a){n=a};this.dispose=function(){};this.getStandingMatrix=function(){console.warn("THREE.WebXRManager: getStandingMatrix() is no longer needed.");return new O};this.getDevice=function(){console.warn("THREE.WebXRManager: getDevice() has been deprecated.")};this.setDevice=function(){console.warn("THREE.WebXRManager: setDevice() has been deprecated.")};
 this.setFrameOfReferenceType=function(){console.warn("THREE.WebXRManager: setFrameOfReferenceType() has been deprecated.")};this.submitFrame=function(){}}function ne(a){var b;function c(){la=new gg(M);Ea=new eg(M,la,a);Ea.isWebGL2||(la.get("WEBGL_depth_texture"),la.get("OES_texture_float"),la.get("OES_texture_half_float"),la.get("OES_texture_half_float_linear"),la.get("OES_standard_derivatives"),la.get("OES_element_index_uint"),la.get("ANGLE_instanced_arrays"));la.get("OES_texture_float_linear");
 ka=new sf(M,la,Ea);da=new jh(M,la,ka,Ea);da.scissor(aa.copy(ia).multiplyScalar(ca));da.viewport(S.copy(ea).multiplyScalar(ca));ha=new jg(M);T=new bh;Z=new kh(M,la,da,T,Ea,ka,ha);ua=new Yf(M);va=new hg(M,ua,ha);qa=new mg(va,ha);za=new lg(M);pa=new ah(Y,la,Ea,Z);wa=new eh;sa=new ih;oa=new cg(Y,da,qa,xa);Ba=new dg(M,la,ha,Ea);Ca=new ig(M,la,ha,Ea);ha.programs=pa.programs;Y.context=M;Y.capabilities=Ea;Y.extensions=la;Y.properties=T;Y.renderLists=wa;Y.state=da;Y.info=ha}function d(a){a.preventDefault();
 console.log("THREE.WebGLRenderer: Context Lost.");N=!0}function e(){console.log("THREE.WebGLRenderer: Context Restored.");N=!1;c()}function f(a){a=a.target;a.removeEventListener("dispose",f);g(a);T.remove(a)}function g(a){var b=T.get(a).program;a.program=void 0;void 0!==b&&pa.releaseProgram(b)}function h(a,b){a.render(function(a){Y.renderBufferImmediate(a,b)})}function k(a,b,c,d){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isGroup)c=a.renderOrder;else if(a.isLight)B.pushLight(a),a.castShadow&&

+ 6 - 0
build/three.module.js

@@ -22503,6 +22503,12 @@ function WebXRManager( renderer ) {
 
 	};
 
+	this.getSession = function () {
+
+		return session;
+
+	};
+
 	this.setSession = function ( value ) {
 
 		session = value;

+ 172 - 0
examples/js/vr/HelioWebXRPolyfill.js

@@ -0,0 +1,172 @@
+/**
+ * @author mvilledieu / http://github.com/mvilledieu
+ */
+
+if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
+
+	console.log( "Helio WebXR Polyfill (Lumin 0.96.0)" );
+
+	// WebXRManager - XR.supportSession() Polyfill - WebVR.js line 147
+
+	if (
+		"supportsSession" in navigator.xr === false &&
+    "supportsSessionMode" in navigator.xr
+	) {
+
+		navigator.xr.supportsSession = function ( sessionType ) {
+
+			// Force using immersive-ar
+			return navigator.xr.supportsSessionMode( 'immersive-ar' );
+
+		};
+
+	}
+
+	if ( "requestSession" in navigator.xr ) {
+
+		const tempRequestSession = navigator.xr.requestSession.bind( navigator.xr );
+
+		navigator.xr.requestSession = function ( sessionType ) {
+
+			return new Promise( function ( resolve, reject ) {
+
+				tempRequestSession( {
+					mode: 'immersive-ar' // Force using immersive-ar
+				} )
+					.then( function ( session ) {
+
+						// WebXRManager - xrFrame.getPose() Polyfill - line 279
+
+						const tempRequestAnimationFrame = session.requestAnimationFrame.bind(
+							session
+						);
+
+						session.requestAnimationFrame = function ( callback ) {
+
+							return tempRequestAnimationFrame( function ( time, frame ) {
+
+								// WebXRManager - xrFrame.getViewerPose() Polyfill - line 279
+								// Transforms view.viewMatrix to view.transform.inverse.matrix
+
+								const tempGetViewerPose = frame.getViewerPose.bind( frame );
+
+								frame.getViewerPose = function ( referenceSpace ) {
+
+									const pose = tempGetViewerPose( referenceSpace );
+
+									pose.views.forEach( function ( view ) {
+
+										view.transform = {
+											inverse: {
+												matrix: view.viewMatrix
+											}
+										};
+
+									} );
+
+									return pose;
+
+								};
+
+								// WebXRManager - xrFrame.getPose() Polyfill - line 259
+
+								frame.getPose = function ( targetRaySpace, referenceSpace ) {
+
+									const inputPose = frame.getInputPose(
+										targetRaySpace,
+										referenceSpace
+									);
+
+									inputPose.transform = {
+										matrix: inputPose.targetRay.transformMatrix
+									};
+
+									return inputPose;
+
+								};
+
+								callback( time, frame );
+
+							} );
+
+						};
+
+						// WebXRManager - xrFrame.getPose( inputSource.targetRaySpace, referenceSpace) Polyfill - line 279
+
+						const tempGetInputSources = session.getInputSources.bind( session );
+
+						session.getInputSources = function () {
+
+							const res = tempGetInputSources();
+
+							res.forEach( function (xrInputSource ) {
+
+								Object.defineProperty( xrInputSource, "targetRaySpace", {
+									get: function () {
+
+										return xrInputSource;
+
+									}
+								} );
+
+							} );
+
+							return res;
+
+						};
+
+						// WebXRManager - xrSession.getInputSources() Polyfill Line 132 - 136
+
+						session.inputSources = Object.defineProperty(
+							session,
+							"inputSources",
+							{
+								get: session.getInputSources
+							}
+						);
+
+						// WebXRManager - xrSession.updateRenderState() Polyfill Line 129
+
+						session.updateRenderState = function ( { baseLayer } ) {
+
+							session.baseLayer = baseLayer;
+
+							// WebXRManager - xrSession.renderState.baseLayer Polyfill Line 219
+
+							session.renderState = {
+								baseLayer: baseLayer
+							};
+
+						};
+
+						// WebXRManager - xrSession.requestReferenceSpace() Polyfill Line 130
+
+						const tempRequestReferenceSpace = session.requestReferenceSpace.bind(
+							session
+						);
+
+						session.requestReferenceSpace = function () {
+
+							return tempRequestReferenceSpace( {
+								type: "stationary",
+								subtype: "floor-level"
+							} );
+
+						};
+
+						resolve( session );
+
+					} )
+					.catch( function ( error ) {
+
+						return reject( error );
+
+					} );
+
+			} );
+
+		};
+
+	}
+
+}

+ 1 - 0
examples/webvr_ballshooter.html

@@ -12,6 +12,7 @@
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webvr - ball shooter
 		</div>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 		<script src="js/vr/WebVR.js"></script>
 

+ 1 - 0
examples/webvr_cubes.html

@@ -12,6 +12,7 @@
 			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - interactive cubes
 		</div>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 		<script src="js/vr/WebVR.js"></script>
 

+ 1 - 0
examples/webvr_dragging.html

@@ -12,6 +12,7 @@
 			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webvr - dragging
 		</div>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 		<script src="js/vr/WebVR.js"></script>
 

+ 1 - 1
examples/webvr_lorenzattractor.html

@@ -8,8 +8,8 @@
 	</head>
 	<body>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
-
 		<script src="js/vr/WebVR.js"></script>
 
 		<script>

+ 1 - 1
examples/webvr_paint.html

@@ -12,9 +12,9 @@
 			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webvr - paint
 		</div>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 		<script src="js/vr/WebVR.js"></script>
-
 		<script src="js/loaders/OBJLoader.js"></script>
 
 		<script>

+ 1 - 1
examples/webvr_panorama.html

@@ -7,8 +7,8 @@
 		<link type="text/css" rel="stylesheet" href="main.css">
 	</head>
 	<body>
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
-
 		<script src="js/vr/WebVR.js"></script>
 
 		<script>

+ 1 - 1
examples/webvr_rollercoaster.html

@@ -8,10 +8,10 @@
 	</head>
 	<body>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 
 		<script src="js/RollerCoaster.js"></script>
-
 		<script src="js/vr/WebVR.js"></script>
 
 		<script>

+ 1 - 0
examples/webvr_sandbox.html

@@ -8,6 +8,7 @@
 	</head>
 	<body>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 
 		<script src="js/objects/Lensflare.js"></script>

+ 2 - 0
examples/webvr_sculpt.html

@@ -12,6 +12,8 @@
 			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webvr - sculpt
 		</div>
 
+
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 		<script src="js/vr/WebVR.js"></script>
 

+ 2 - 1
examples/webvr_video.html

@@ -14,8 +14,9 @@
 			stereoscopic panoramic render by <a href="http://pedrofe.com/rendering-for-oculus-rift-with-arnold/" target="_blank" rel="noopener">pedrofe</a>. scene from <a href="http://www.meryproject.com/" target="_blank" rel="noopener">mery project</a>.
 		</div>
 
-		<script src="../build/three.js"></script>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
+		<script src="../build/three.js"></script>
 		<script src="js/vr/WebVR.js"></script>
 
 		<video id="video" loop muted crossOrigin="anonymous" webkit-playsinline style="display:none">

+ 1 - 0
examples/webvr_vive_paint.html

@@ -12,6 +12,7 @@
 			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - htc vive - paint
 		</div>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 
 		<script src="js/vr/ViveController.js"></script>

+ 1 - 0
examples/webvr_vive_sculpt.html

@@ -12,6 +12,7 @@
 			<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - htc vive - sculpt
 		</div>
 
+		<script src="js/vr/HelioWebXRPolyfill.js"></script>
 		<script src="../build/three.js"></script>
 
 		<script src="js/vr/ViveController.js"></script>