WebGLXRFallback.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 && session.enabledFeatures.includes( 'webgpu' ) === false ) {
  20. return switchToFallbackRenderer( session, renderer );
  21. }
  22. try {
  23. return await setSession( session );
  24. } catch ( error ) {
  25. if ( session === null || renderer.backend.isWebGPUBackend !== true ) {
  26. throw error;
  27. }
  28. return switchToFallbackRenderer( session, renderer );
  29. }
  30. };
  31. }
  32. async function switchToFallbackRenderer( session, renderer ) {
  33. if ( renderer.initialized === false ) await renderer.init();
  34. const fallbackRenderer = createFallbackRenderer( renderer );
  35. if ( fallbackRenderer.backend.isWebGLBackend !== true ) {
  36. throw new Error( 'THREE.WebGLXRFallback: createFallbackRenderer() must return a renderer with a WebGL backend.' );
  37. }
  38. const animationLoop = renderer.getAnimationLoop();
  39. fallbackRenderer.xr.enabled = renderer.xr.enabled;
  40. fallbackRenderer.xr.cameraAutoUpdate = renderer.xr.cameraAutoUpdate;
  41. fallbackRenderer.xr.setFramebufferScaleFactor( renderer.xr.getFramebufferScaleFactor() );
  42. fallbackRenderer.xr.setReferenceSpaceType( renderer.xr.getReferenceSpaceType() );
  43. if ( animationLoop !== null ) await fallbackRenderer.setAnimationLoop( animationLoop );
  44. await onFallback( fallbackRenderer, renderer );
  45. currentRenderer = fallbackRenderer;
  46. patchRenderer( fallbackRenderer );
  47. return fallbackRenderer.xr.setSession( session );
  48. }
  49. patchRenderer( renderer );
  50. }
  51. export { setupWebGLXRFallback };
粤ICP备19079148号