WebGLXRFallback.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /**
  2. * Sets up a construction-time WebGL fallback for WebGPU XR examples.
  3. *
  4. * @param {WebGPURenderer} renderer - The initial renderer.
  5. * @param {Function} createFallbackRenderer - A function that returns a new renderer with a WebGL backend.
  6. * @param {Function} onFallback - A function that installs the new renderer in the app.
  7. */
  8. function setupWebGLXRFallback( renderer, createFallbackRenderer, onFallback = () => {} ) {
  9. let currentRenderer = renderer;
  10. const patchedRenderers = new WeakSet();
  11. function patchRenderer( renderer ) {
  12. if ( patchedRenderers.has( renderer ) ) return;
  13. patchedRenderers.add( renderer );
  14. const setSession = renderer.xr.setSession.bind( renderer.xr );
  15. renderer.xr.setSession = async function ( session ) {
  16. if ( renderer !== currentRenderer ) {
  17. return currentRenderer.xr.setSession( session );
  18. }
  19. if ( session !== null && renderer.backend.isWebGPUBackend === true && typeof globalThis.XRGPUBinding === 'undefined' ) {
  20. return switchToFallbackRenderer( session, renderer );
  21. }
  22. return setSession( session );
  23. };
  24. }
  25. async function switchToFallbackRenderer( session, renderer ) {
  26. if ( renderer.initialized === false ) await renderer.init();
  27. const fallbackRenderer = createFallbackRenderer( renderer );
  28. if ( fallbackRenderer.backend.isWebGLBackend !== true ) {
  29. throw new Error( 'THREE.WebGLXRFallback: createFallbackRenderer() must return a renderer with a WebGL backend.' );
  30. }
  31. const animationLoop = renderer.getAnimationLoop();
  32. fallbackRenderer.xr.enabled = renderer.xr.enabled;
  33. fallbackRenderer.xr.cameraAutoUpdate = renderer.xr.cameraAutoUpdate;
  34. fallbackRenderer.xr.setFramebufferScaleFactor( renderer.xr.getFramebufferScaleFactor() );
  35. fallbackRenderer.xr.setReferenceSpaceType( renderer.xr.getReferenceSpaceType() );
  36. if ( animationLoop !== null ) await fallbackRenderer.setAnimationLoop( animationLoop );
  37. await onFallback( fallbackRenderer, renderer );
  38. currentRenderer = fallbackRenderer;
  39. patchRenderer( fallbackRenderer );
  40. return fallbackRenderer.xr.setSession( session );
  41. }
  42. patchRenderer( renderer );
  43. }
  44. export { setupWebGLXRFallback };
粤ICP备19079148号