{"version":3,"sources":["jsdelivr-header.js","/npm/@antv/g-webgl@2.1.1/src/WebGLContextService.ts","/npm/@antv/g-webgl@2.1.1/src/ContextRegisterPlugin.ts","/npm/@antv/g-webgl@2.1.1/src/WebXRController.ts","/npm/@antv/g-webgl@2.1.1/src/WebXRManager.ts","/npm/@antv/g-webgl@2.1.1/src/ARButton.ts","/npm/@antv/g-webgl@2.1.1/src/index.ts"],"names":[],"mappings":"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","file":"/npm/@antv/g-webgl@2.1.1/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@antv/g-webgl@2.1.1/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import type {\n  CanvasContext,\n  CanvasLike,\n  DataURLOptions,\n  GlobalRuntime,\n  CanvasConfig,\n  ContextService,\n} from '@antv/g-lite';\nimport { setDOMSize } from '@antv/g-lite';\nimport type * as DeviceRenderer from '@antv/g-plugin-device-renderer';\nimport { isString } from '@antv/util';\n\nexport class WebGLContextService\n  implements ContextService<WebGLRenderingContext>\n{\n  private $container: HTMLElement | null;\n  private $canvas: CanvasLike | null;\n  private dpr: number;\n\n  private canvasConfig: Partial<CanvasConfig>;\n  private deviceRendererPlugin: DeviceRenderer.Plugin;\n\n  constructor(context: GlobalRuntime & CanvasContext) {\n    this.canvasConfig = context.config;\n    // @ts-ignore\n    this.deviceRendererPlugin = context.deviceRendererPlugin;\n  }\n\n  init() {\n    const { container, canvas } = this.canvasConfig;\n\n    if (canvas) {\n      this.$canvas = canvas;\n\n      if (\n        container &&\n        (canvas as HTMLCanvasElement).parentElement !== container\n      ) {\n        (container as HTMLElement).appendChild(canvas as HTMLCanvasElement);\n      }\n\n      this.$container = (canvas as HTMLCanvasElement).parentElement;\n      this.canvasConfig.container = this.$container;\n    } else if (container) {\n      // create container\n      this.$container = isString(container)\n        ? document.getElementById(container)\n        : container;\n      if (this.$container) {\n        // create canvas\n        const $canvas = document.createElement('canvas');\n        this.$container.appendChild($canvas);\n        if (!this.$container.style.position) {\n          this.$container.style.position = 'relative';\n        }\n        this.$canvas = $canvas;\n      }\n    }\n\n    this.resize(this.canvasConfig.width, this.canvasConfig.height);\n  }\n\n  getDomElement() {\n    return this.$canvas;\n  }\n\n  getContext() {\n    // @ts-ignore\n    return this.deviceRendererPlugin.getDevice().gl as\n      | WebGLRenderingContext\n      | WebGL2RenderingContext;\n  }\n\n  getBoundingClientRect() {\n    if ((this.$canvas as HTMLCanvasElement).getBoundingClientRect) {\n      return (this.$canvas as HTMLCanvasElement).getBoundingClientRect();\n    }\n  }\n\n  destroy() {\n    // @ts-ignore\n    if (this.$container && this.$canvas && this.$canvas.parentNode) {\n      // @ts-ignore\n      this.$container.removeChild(this.$canvas);\n    }\n  }\n\n  resize(width: number, height: number) {\n    // use user-defined dpr first\n    const { devicePixelRatio: dpr } = this.canvasConfig;\n    this.dpr = dpr;\n\n    if (this.$canvas) {\n      const dpr = this.getDPR();\n\n      // set canvas width & height\n      this.$canvas.width = dpr * width;\n      this.$canvas.height = dpr * height;\n\n      // set CSS style width & height\n      setDOMSize(this.$canvas, width, height);\n    }\n  }\n\n  getDPR() {\n    return this.dpr;\n  }\n\n  applyCursorStyle(cursor: string) {\n    if (this.$container && this.$container.style) {\n      this.$container.style.cursor = cursor;\n    }\n  }\n\n  async toDataURL(options: Partial<DataURLOptions> = {}) {\n    // @see https://stackoverflow.com/questions/26783586/canvas-todataurl-returns-blank-image\n    return this.deviceRendererPlugin.toDataURL(options);\n  }\n}\n","import { AbstractRendererPlugin } from '@antv/g-lite';\nimport type * as DeviceRenderer from '@antv/g-plugin-device-renderer';\nimport { WebGLDeviceContribution } from '@antv/g-device-api';\nimport { WebGLContextService } from './WebGLContextService';\nimport { WebGLRendererConfig } from '.';\n\nexport class ContextRegisterPlugin extends AbstractRendererPlugin {\n  name = 'webgl-context-register';\n\n  constructor(\n    private rendererPlugin: DeviceRenderer.Plugin,\n    private config: Partial<WebGLRendererConfig>,\n  ) {\n    super();\n  }\n\n  init(): void {\n    this.context.ContextService = WebGLContextService;\n    this.context.deviceRendererPlugin = this.rendererPlugin;\n    const { config } = this;\n    this.context.deviceContribution = new WebGLDeviceContribution({\n      ...(config?.targets\n        ? {\n            targets: config.targets,\n          }\n        : {\n            targets: ['webgl2', 'webgl1'],\n          }),\n      onContextLost: config?.onContextLost,\n      onContextRestored: config?.onContextRestored,\n      onContextCreationError: config?.onContextCreationError,\n    });\n  }\n  destroy(): void {\n    delete this.context.ContextService;\n  }\n}\n","import { Group, CustomEvent } from '@antv/g-lite';\nimport { vec3 } from 'gl-matrix';\n\nconst DEFAULT_EVENT = new CustomEvent('');\n\n/**\n * @see https://github.com/mrdoob/three.js/blob/master/src/renderers/webxr/WebXRController.js\n */\nexport class WebXRController {\n  private targetRay: Group = null;\n\n  connect(inputSource: XRInputSource) {\n    // if (inputSource && inputSource.hand) {\n    //   const hand = this._hand;\n\n    //   if (hand) {\n    //     for (const inputjoint of inputSource.hand.values()) {\n    //       // Initialize hand with joints when connected\n    //       this._getHandJoint(hand, inputjoint);\n    //     }\n    //   }\n    // }\n\n    this.dispatchEvent({ type: 'connected', data: inputSource });\n\n    return this;\n  }\n\n  disconnect(inputSource: XRInputSource) {\n    this.dispatchEvent({ type: 'disconnected', data: inputSource });\n\n    if (this.targetRay !== null) {\n      this.targetRay.style.visible = false;\n    }\n\n    // if (this._grip !== null) {\n    //   this._grip.visible = false;\n    // }\n\n    // if (this._hand !== null) {\n    //   this._hand.visible = false;\n    // }\n\n    return this;\n  }\n\n  update(\n    inputSource: XRInputSource,\n    frame: XRFrame,\n    referenceSpace: XRReferenceSpace,\n  ) {\n    let inputPose: XRPose & {\n      linearVelocity?: Float32Array;\n      angularVelocity?: Float32Array;\n    } = null;\n    // let gripPose = null;\n    // let handPose = null;\n\n    const { targetRay } = this;\n    // const grip = this._grip;\n    // const hand = this._hand;\n\n    if (inputSource && frame.session.visibilityState !== 'visible-blurred') {\n      // if (hand && inputSource.hand) {\n      //   handPose = true;\n\n      //   for (const inputjoint of inputSource.hand.values()) {\n      //     // Update the joints groups with the XRJoint poses\n      //     const jointPose = frame.getJointPose(inputjoint, referenceSpace);\n\n      //     // The transform of this joint will be updated with the joint pose on each frame\n      //     const joint = this._getHandJoint(hand, inputjoint);\n\n      //     if (jointPose !== null) {\n      //       joint.matrix.fromArray(jointPose.transform.matrix);\n      //       joint.matrix.decompose(joint.position, joint.rotation, joint.scale);\n      //       joint.matrixWorldNeedsUpdate = true;\n      //       joint.jointRadius = jointPose.radius;\n      //     }\n\n      //     joint.visible = jointPose !== null;\n      //   }\n\n      //   // Custom events\n\n      //   // Check pinchz\n      //   const indexTip = hand.joints['index-finger-tip'];\n      //   const thumbTip = hand.joints['thumb-tip'];\n      //   const distance = indexTip.position.distanceTo(thumbTip.position);\n\n      //   const distanceToPinch = 0.02;\n      //   const threshold = 0.005;\n\n      //   if (\n      //     hand.inputState.pinching &&\n      //     distance > distanceToPinch + threshold\n      //   ) {\n      //     hand.inputState.pinching = false;\n      //     this.dispatchEvent({\n      //       type: 'pinchend',\n      //       handedness: inputSource.handedness,\n      //       target: this,\n      //     });\n      //   } else if (\n      //     !hand.inputState.pinching &&\n      //     distance <= distanceToPinch - threshold\n      //   ) {\n      //     hand.inputState.pinching = true;\n      //     this.dispatchEvent({\n      //       type: 'pinchstart',\n      //       handedness: inputSource.handedness,\n      //       target: this,\n      //     });\n      //   }\n      // } else {\n      //   if (grip !== null && inputSource.gripSpace) {\n      //     gripPose = frame.getPose(inputSource.gripSpace, referenceSpace);\n\n      //     if (gripPose !== null) {\n      //       grip.matrix.fromArray(gripPose.transform.matrix);\n      //       grip.matrix.decompose(grip.position, grip.rotation, grip.scale);\n      //       grip.matrixWorldNeedsUpdate = true;\n\n      //       if (gripPose.linearVelocity) {\n      //         grip.hasLinearVelocity = true;\n      //         grip.linearVelocity.copy(gripPose.linearVelocity);\n      //       } else {\n      //         grip.hasLinearVelocity = false;\n      //       }\n\n      //       if (gripPose.angularVelocity) {\n      //         grip.hasAngularVelocity = true;\n      //         grip.angularVelocity.copy(gripPose.angularVelocity);\n      //       } else {\n      //         grip.hasAngularVelocity = false;\n      //       }\n      //     }\n      //   }\n      // }\n\n      if (targetRay !== null) {\n        inputPose = frame.getPose(inputSource.targetRaySpace, referenceSpace);\n\n        // Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n        // if (inputPose === null && gripPose !== null) {\n        //   inputPose = gripPose;\n        // }\n\n        if (inputPose !== null) {\n          targetRay.setLocalTransform(inputPose.transform.matrix);\n\n          if (inputPose.linearVelocity) {\n            targetRay.style.hasLinearVelocity = true;\n            vec3.copy(targetRay.style.linearVelocity, inputPose.linearVelocity);\n          } else {\n            targetRay.style.hasLinearVelocity = false;\n          }\n\n          if (inputPose.angularVelocity) {\n            targetRay.style.hasAngularVelocity = true;\n            targetRay.style.angularVelocity.copy(inputPose.angularVelocity);\n          } else {\n            targetRay.style.hasAngularVelocity = false;\n          }\n\n          this.dispatchEvent({ type: 'move' });\n        }\n      }\n    }\n\n    if (targetRay !== null) {\n      targetRay.style.visible = inputPose !== null;\n    }\n\n    // if (grip !== null) {\n    //   grip.visible = gripPose !== null;\n    // }\n\n    // if (hand !== null) {\n    //   hand.visible = handPose !== null;\n    // }\n\n    return this;\n  }\n\n  getTargetRaySpace() {\n    if (this.targetRay === null) {\n      this.targetRay = new Group();\n      this.targetRay.style.visible = false;\n      this.targetRay.style.hasLinearVelocity = false;\n      this.targetRay.style.linearVelocity = vec3.create();\n      this.targetRay.style.hasAngularVelocity = false;\n      this.targetRay.style.angularVelocity = vec3.create();\n    }\n\n    return this.targetRay;\n  }\n\n  dispatchEvent(event: { type: string; data?: any }) {\n    const { type, data } = event;\n    DEFAULT_EVENT.type = type;\n    DEFAULT_EVENT.detail = data;\n\n    if (this.targetRay !== null) {\n      this.targetRay.dispatchEvent(DEFAULT_EVENT);\n    }\n\n    // if (this._grip !== null) {\n    //   this._grip.dispatchEvent(event);\n    // }\n\n    // if (this._hand !== null) {\n    //   this._hand.dispatchEvent(event);\n    // }\n\n    return this;\n  }\n}\n","import { Canvas } from '@antv/g-lite';\nimport { DeviceRenderer } from '.';\nimport { WebXRController } from './WebXRController';\n\nexport class WebXRManager {\n  private session: XRSession;\n  private referenceSpaceType: XRReferenceSpaceType;\n  private referenceSpace: XRReferenceSpace;\n  private glBaseLayer: XRWebGLLayer;\n  private controllers: WebXRController[] = [];\n  private controllerInputSources: XRInputSource[] = [];\n\n  constructor(private plugin: DeviceRenderer.Plugin) {}\n\n  async setSession(canvas: Canvas, session: XRSession) {\n    if (session) {\n      this.session = session;\n      const gl = this.plugin.getDevice().gl as WebGL2RenderingContext;\n      // const swapChain = this.plugin.getSwapChain();\n      const attributes = gl.getContextAttributes();\n\n      if (attributes.xrCompatible !== true) {\n        // @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/makeXRCompatible\n        await gl.makeXRCompatible();\n      }\n\n      session.addEventListener('select', this.onSessionEvent);\n      session.addEventListener('selectstart', this.onSessionEvent);\n      session.addEventListener('selectend', this.onSessionEvent);\n      session.addEventListener('squeeze', this.onSessionEvent);\n      session.addEventListener('squeezestart', this.onSessionEvent);\n      session.addEventListener('squeezeend', this.onSessionEvent);\n      session.addEventListener('end', this.onSessionEnd);\n      session.addEventListener('inputsourceschange', this.onInputSourcesChange);\n\n      if (session.renderState.layers === undefined) {\n        const layerInit = {\n          antialias: attributes.antialias,\n          alpha: true,\n          depth: attributes.depth,\n          stencil: attributes.stencil,\n          framebufferScaleFactor: 1.0,\n        };\n\n        this.glBaseLayer = new XRWebGLLayer(session, gl, layerInit);\n        session.updateRenderState({ baseLayer: this.glBaseLayer });\n\n        this.referenceSpace = await session.requestReferenceSpace(\n          this.referenceSpaceType,\n        );\n\n        // @ts-ignore\n        session.referenceSpace = this.referenceSpace;\n      }\n\n      canvas.requestAnimationFrame =\n        session.requestAnimationFrame.bind(session);\n    }\n  }\n\n  setReferenceSpaceType(referenceSpaceType: XRReferenceSpaceType) {\n    this.referenceSpaceType = referenceSpaceType;\n  }\n\n  getSession() {\n    return this.session;\n  }\n\n  getReferenceSpace() {\n    return this.referenceSpace;\n  }\n\n  private getOrCreateController(index: number) {\n    let controller = this.controllers[index];\n    if (controller === undefined) {\n      controller = new WebXRController();\n      this.controllers[index] = controller;\n    }\n    return controller;\n  }\n\n  getController(index: number) {\n    return this.getOrCreateController(index).getTargetRaySpace();\n  }\n\n  // getControllerGrip(index: number) {\n  //   return this.getOrCreateController(index).getGripSpace();\n  // }\n\n  // getHand(index: number) {\n  //   return this.getOrCreateController(index).getHandSpace();\n  // }\n\n  private onSessionEnd = () => {\n    this.session.removeEventListener('select', this.onSessionEvent);\n    this.session.removeEventListener('selectstart', this.onSessionEvent);\n    this.session.removeEventListener('selectend', this.onSessionEvent);\n    this.session.removeEventListener('squeeze', this.onSessionEvent);\n    this.session.removeEventListener('squeezestart', this.onSessionEvent);\n    this.session.removeEventListener('squeezeend', this.onSessionEvent);\n    this.session.removeEventListener('end', this.onSessionEnd);\n    this.session.removeEventListener(\n      'inputsourceschange',\n      this.onInputSourcesChange,\n    );\n\n    for (let i = 0; i < this.controllers.length; i++) {\n      const inputSource = this.controllerInputSources[i];\n      if (inputSource === null) continue;\n      this.controllerInputSources[i] = null;\n      this.controllers[i].disconnect(inputSource);\n    }\n  };\n\n  private onSessionEvent = (event: XRInputSourceEvent) => {\n    const controllerIndex = this.controllerInputSources.indexOf(\n      event.inputSource,\n    );\n\n    if (controllerIndex === -1) {\n      return;\n    }\n\n    const controller = this.controllers[controllerIndex];\n\n    if (controller !== undefined) {\n      controller.update(\n        event.inputSource,\n        event.frame,\n        // @ts-ignore\n        this.session.referenceSpace,\n      );\n      controller.dispatchEvent({ type: event.type, data: event.inputSource });\n    }\n  };\n\n  private onInputSourcesChange = (event: XRInputSourceChangeEvent) => {\n    // Notify disconnected\n    for (let i = 0; i < event.removed.length; i++) {\n      const inputSource = event.removed[i];\n      const index = this.controllerInputSources.indexOf(inputSource);\n\n      if (index >= 0) {\n        this.controllerInputSources[index] = null;\n        this.controllers[index].disconnect(inputSource);\n      }\n    }\n\n    // Notify connected\n    for (let i = 0; i < event.added.length; i++) {\n      const inputSource = event.added[i];\n\n      let controllerIndex = this.controllerInputSources.indexOf(inputSource);\n\n      if (controllerIndex === -1) {\n        // Assign input source a controller that currently has no input source\n\n        for (let i = 0; i < this.controllers.length; i++) {\n          if (i >= this.controllerInputSources.length) {\n            this.controllerInputSources.push(inputSource);\n            controllerIndex = i;\n            break;\n          } else if (this.controllerInputSources[i] === null) {\n            this.controllerInputSources[i] = inputSource;\n            controllerIndex = i;\n            break;\n          }\n        }\n\n        // If all controllers do currently receive input we ignore new ones\n\n        if (controllerIndex === -1) break;\n      }\n\n      const controller = this.controllers[controllerIndex];\n\n      if (controller) {\n        controller.connect(inputSource);\n      }\n    }\n  };\n}\n","import { Canvas } from '@antv/g-lite';\nimport { Renderer } from '.';\n\n/**\n * @see https://github.com/mrdoob/three.js/blob/master/examples/jsm/webxr/ARButton.js\n * @example\n *\n * import { ARButton } from '@antv/g-webgl';\n * const $button = ARButton.createButton(renderer, { domOverlay: { root: document.body } });\n */\nexport class ARButton {\n  static createButton(\n    canvas: Canvas,\n    renderer: Renderer,\n    sessionInit: XRSessionInit = {},\n  ) {\n    const button = document.createElement('button');\n\n    const disableButton = () => {\n      button.style.display = '';\n\n      button.style.cursor = 'auto';\n      button.style.left = 'calc(50% - 75px)';\n      button.style.width = '150px';\n\n      button.onmouseenter = null;\n      button.onmouseleave = null;\n\n      button.onclick = null;\n    };\n\n    const showARNotSupported = () => {\n      disableButton();\n      button.textContent = 'AR NOT SUPPORTED';\n    };\n\n    const showARNotAllowed = (exception: Error) => {\n      disableButton();\n\n      console.warn(\n        'Exception when trying to call xr.isSessionSupported',\n        exception,\n      );\n\n      button.textContent = 'AR NOT ALLOWED';\n    };\n\n    const stylizeElement = (element: HTMLElement) => {\n      element.style.position = 'absolute';\n      element.style.bottom = '20px';\n      element.style.padding = '12px 6px';\n      element.style.border = '1px solid #fff';\n      element.style.borderRadius = '4px';\n      element.style.background = 'rgba(0,0,0,0.1)';\n      element.style.color = '#fff';\n      element.style.font = 'normal 13px sans-serif';\n      element.style.textAlign = 'center';\n      element.style.opacity = '0.5';\n      element.style.outline = 'none';\n      element.style.zIndex = '999';\n    };\n\n    const showStartAR = () => {\n      let currentSession: XRSession;\n      button.style.display = '';\n      button.style.cursor = 'pointer';\n      button.style.left = 'calc(50% - 50px)';\n      button.style.width = '100px';\n      button.textContent = 'START AR';\n\n      const onSessionEnded = () => {\n        currentSession.removeEventListener('end', onSessionEnded);\n\n        button.textContent = 'START AR';\n        (sessionInit.domOverlay.root as HTMLElement).style.display = 'none';\n        currentSession = undefined;\n      };\n\n      const onSessionStarted = async (session: XRSession) => {\n        session.addEventListener('end', onSessionEnded);\n\n        renderer.xr.setReferenceSpaceType('local');\n\n        await renderer.xr.setSession(canvas, session);\n\n        button.textContent = 'STOP AR';\n        (sessionInit.domOverlay.root as HTMLElement).style.display = '';\n        currentSession = session;\n      };\n\n      if (sessionInit.domOverlay === undefined) {\n        const overlay = document.createElement('div');\n        overlay.style.display = 'none';\n        document.body.appendChild(overlay);\n\n        const svg = document.createElementNS(\n          'http://www.w3.org/2000/svg',\n          'svg',\n        );\n        svg.setAttribute('width', '38');\n        svg.setAttribute('height', '38');\n        svg.style.position = 'absolute';\n        svg.style.right = '20px';\n        svg.style.top = '20px';\n        svg.addEventListener('click', function () {\n          currentSession.end();\n        });\n        overlay.appendChild(svg);\n\n        const path = document.createElementNS(\n          'http://www.w3.org/2000/svg',\n          'path',\n        );\n        path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28');\n        path.setAttribute('stroke', '#fff');\n        path.setAttribute('stroke-width', '2');\n        svg.appendChild(path);\n\n        if (sessionInit.optionalFeatures === undefined) {\n          sessionInit.optionalFeatures = [];\n        }\n\n        sessionInit.optionalFeatures.push('dom-overlay');\n        sessionInit.domOverlay = { root: overlay };\n      }\n\n      /**\n       * Bind event listeners to button.\n       */\n      button.onclick = () => {\n        if (!currentSession) {\n          navigator.xr\n            .requestSession('immersive-ar', sessionInit)\n            .then(onSessionStarted);\n        } else {\n          currentSession.end();\n        }\n      };\n      button.onmouseenter = () => {\n        button.style.opacity = '1.0';\n      };\n      button.onmouseleave = () => {\n        button.style.opacity = '0.5';\n      };\n    };\n\n    if ('xr' in navigator) {\n      button.id = 'ARButton';\n      button.style.display = 'none';\n\n      stylizeElement(button);\n\n      navigator.xr\n        .isSessionSupported('immersive-ar')\n        .then(function (supported) {\n          supported ? showStartAR() : showARNotSupported();\n        })\n        .catch(showARNotAllowed);\n\n      return button;\n    }\n    const message = document.createElement('a');\n\n    if (window.isSecureContext === false) {\n      message.href = document.location.href.replace(/^http:/, 'https:');\n      message.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n    } else {\n      message.href = 'https://immersiveweb.dev/';\n      message.innerHTML = 'WEBXR NOT AVAILABLE';\n    }\n\n    message.style.left = 'calc(50% - 90px)';\n    message.style.width = '180px';\n    message.style.textDecoration = 'none';\n\n    stylizeElement(message);\n\n    return message;\n  }\n}\n","import type { RendererConfig } from '@antv/g-lite';\nimport {\n  AbstractRenderer,\n  ImageLoader,\n  HTMLRenderer,\n  DomInteraction,\n} from '@antv/g-lite';\nimport * as DeviceRenderer from '@antv/g-plugin-device-renderer';\nimport { ContextRegisterPlugin } from './ContextRegisterPlugin';\nimport { WebXRManager } from './WebXRManager';\n\nexport { DomInteraction, DeviceRenderer, HTMLRenderer };\nexport { ARButton } from './ARButton';\nexport { WebXRManager } from './WebXRManager';\n\nexport interface WebGLRendererConfig extends RendererConfig {\n  targets: ('webgl1' | 'webgl2')[];\n  onContextLost: (e: Event) => void;\n  onContextRestored: (e: Event) => void;\n  onContextCreationError: (e: Event) => void;\n  enableFXAA: boolean;\n}\n\nexport class Renderer extends AbstractRenderer {\n  xr: WebXRManager;\n\n  constructor(config?: Partial<WebGLRendererConfig>) {\n    super({\n      enableSizeAttenuation: false,\n      ...config,\n    });\n\n    const deviceRendererPlugin = new DeviceRenderer.Plugin(config);\n    this.xr = new WebXRManager(deviceRendererPlugin);\n\n    this.registerPlugin(\n      new ContextRegisterPlugin(deviceRendererPlugin, config),\n    );\n    this.registerPlugin(new ImageLoader.Plugin());\n    this.registerPlugin(deviceRendererPlugin);\n    this.registerPlugin(new DomInteraction.Plugin());\n    this.registerPlugin(new HTMLRenderer.Plugin());\n  }\n}\n"]}