浏览代码

Merge pull request #7670 from bghgary/native-fix

Fix WebXRSessionManager to work with native correctly
David Catuhe 5 年之前
父节点
当前提交
b5e531314c
共有 1 个文件被更改,包括 11 次插入33 次删除
  1. 11 33
      src/XR/webXRSessionManager.ts

+ 11 - 33
src/XR/webXRSessionManager.ts

@@ -11,18 +11,6 @@ interface IRenderTargetProvider {
     getRenderTargetForEye(eye: XREye): RenderTargetTexture;
 }
 
-class RenderTargetProvider implements IRenderTargetProvider {
-    private _texture: RenderTargetTexture;
-
-    public constructor(texture: RenderTargetTexture) {
-        this._texture = texture;
-    }
-
-    public getRenderTargetForEye(eye: XREye): RenderTargetTexture {
-        return this._texture;
-    }
-}
-
 /**
  * Manages an XRSession to work with Babylon's engine
  * @see https://doc.babylonjs.com/how_to/webxr
@@ -241,12 +229,11 @@ export class WebXRSessionManager implements IDisposable {
         };
 
         if (this._xrNavigator.xr.native) {
-            this._rttProvider = this._xrNavigator.xr.getNativeRenderTargetProvider(this.session, (width: number, height: number) => {
-                return engine.createRenderTargetTexture({ width: width, height: height }, false);
-            });
+            this._rttProvider = this._xrNavigator.xr.getNativeRenderTargetProvider(this.session, this._createRenderTargetTexture.bind(this));
         } else {
-            // Create render target texture from WebXR's webgl render target
-            this._rttProvider = new RenderTargetProvider(WebXRSessionManager._CreateRenderTargetTextureFromSession(this.session, this.scene, this.baseLayer!));
+            // Create render target texture from xr's webgl render target
+            const rtt = this._createRenderTargetTexture(this.baseLayer!.framebufferWidth, this.baseLayer!.framebufferHeight, this.baseLayer!.framebuffer);
+            this._rttProvider = { getRenderTargetForEye: () => rtt };
         }
 
         // Stop window's animation frame and trigger sessions animation frame
@@ -321,25 +308,16 @@ export class WebXRSessionManager implements IDisposable {
         }
     }
 
-    /**
-     * @hidden
-     * Converts the render layer of xrSession to a render target
-     * @param session session to create render target for
-     * @param scene scene the new render target should be created for
-     * @param baseLayer the webgl layer to create the render target for
-     */
-    public static _CreateRenderTargetTextureFromSession(_session: XRSession, scene: Scene, baseLayer: XRWebGLLayer) {
-        if (!baseLayer) {
-            throw "no layer";
-        }
+    private _createRenderTargetTexture(width: number, height: number, framebuffer: Nullable<WebGLFramebuffer> = null) {
         // Create internal texture
-        var internalTexture = new InternalTexture(scene.getEngine(), InternalTextureSource.Unknown, true);
-        internalTexture.width = baseLayer.framebufferWidth;
-        internalTexture.height = baseLayer.framebufferHeight;
-        internalTexture._framebuffer = baseLayer.framebuffer;
+        var internalTexture = new InternalTexture(this.scene.getEngine(), InternalTextureSource.Unknown, true);
+        internalTexture.width = width;
+        internalTexture.height = height;
+        internalTexture._framebuffer = framebuffer;
 
         // Create render target texture from the internal texture
-        var renderTargetTexture = new RenderTargetTexture("XR renderTargetTexture", { width: internalTexture.width, height: internalTexture.height }, scene, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true);
+        var renderTargetTexture = new RenderTargetTexture("XR renderTargetTexture", { width: width, height: height }, this.scene,
+            undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true);
         renderTargetTexture._texture = internalTexture;
 
         return renderTargetTexture;