{"version":3,"file":"autoDetectRenderer.mjs","sources":["../../../src/rendering/renderers/autoDetectRenderer.ts"],"sourcesContent":["import { isWebGLSupported } from '../../utils/browser/isWebGLSupported';\nimport { isWebGPUSupported } from '../../utils/browser/isWebGPUSupported';\nimport { AbstractRenderer } from './shared/system/AbstractRenderer';\n\nimport type { CanvasOptions } from './canvas/CanvasRenderer';\nimport type { WebGLOptions } from './gl/WebGLRenderer';\nimport type { WebGPUOptions } from './gpu/WebGPURenderer';\nimport type { Renderer, RendererOptions } from './types';\n\n/**\n * Options for {@link autoDetectRenderer}.\n * @category rendering\n * @advanced\n */\nexport interface AutoDetectOptions extends RendererOptions\n{\n    /** The preferred renderer type. WebGPU is recommended as its generally faster than WebGL. */\n    preference?: 'webgl' | 'webgpu' | 'canvas';\n    /** Optional WebGPUOptions to pass only to WebGPU renderer. */\n    webgpu?: Partial<WebGPUOptions>;\n    /** Optional WebGLOptions to pass only to the WebGL renderer */\n    webgl?: Partial<WebGLOptions>;\n    /** Optional CanvasOptions to pass only to the Canvas renderer */\n    canvasOptions?: Partial<CanvasOptions>;\n}\n\nconst renderPriority = ['webgl', 'webgpu', 'canvas'];\n\n/**\n * Automatically determines the most appropriate renderer for the current environment.\n *\n * The function will prioritize the WebGL renderer as it is the most tested safe API to use.\n * In the near future as WebGPU becomes more stable and ubiquitous, it will be prioritized over WebGL.\n *\n * The selected renderer's code is then dynamically imported to optimize\n * performance and minimize the initial bundle size.\n *\n * To maximize the benefits of dynamic imports, it's recommended to use a modern bundler\n * that supports code splitting. This will place the renderer code in a separate chunk,\n * which is loaded only when needed.\n * @example\n *\n * // create a renderer\n * const renderer = await autoDetectRenderer({\n *   width: 800,\n *   height: 600,\n *   antialias: true,\n * });\n *\n * // custom for each renderer\n * const renderer = await autoDetectRenderer({\n *   width: 800,\n *   height: 600,\n *   webgpu:{\n *     antialias: true,\n *     backgroundColor: 'red'\n *   },\n *   webgl:{\n *     antialias: true,\n *     backgroundColor: 'green'\n *   }\n *  });\n * @param options - A partial configuration object based on the `AutoDetectOptions` type.\n * @returns A Promise that resolves to an instance of the selected renderer.\n * @category rendering\n * @standard\n */\nexport async function autoDetectRenderer(options: Partial<AutoDetectOptions>): Promise<Renderer>\n{\n    let preferredOrder: string[] = [];\n\n    if (options.preference)\n    {\n        preferredOrder.push(options.preference);\n\n        renderPriority.forEach((item) =>\n        {\n            if (item !== options.preference)\n            {\n                preferredOrder.push(item);\n            }\n        });\n    }\n    else\n    {\n        preferredOrder = renderPriority.slice();\n    }\n\n    let RendererClass: new () => Renderer;\n    let finalOptions: Partial<AutoDetectOptions> = {};\n\n    for (let i = 0; i < preferredOrder.length; i++)\n    {\n        const rendererType = preferredOrder[i];\n\n        if (rendererType === 'webgpu' && (await isWebGPUSupported()))\n        {\n            const { WebGPURenderer } = await import('./gpu/WebGPURenderer');\n\n            RendererClass = WebGPURenderer;\n\n            finalOptions = { ...options, ...options.webgpu };\n\n            break;\n        }\n        else if (\n            rendererType === 'webgl'\n            && isWebGLSupported(\n                options.failIfMajorPerformanceCaveat\n                    ?? AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat\n            )\n        )\n        {\n            const { WebGLRenderer } = await import('./gl/WebGLRenderer');\n\n            RendererClass = WebGLRenderer;\n\n            finalOptions = { ...options, ...options.webgl };\n\n            break;\n        }\n        else if (rendererType === 'canvas')\n        {\n            const { CanvasRenderer } = await import('./canvas/CanvasRenderer');\n\n            RendererClass = CanvasRenderer;\n\n            finalOptions = { ...options, ...options.canvasOptions };\n\n            break;\n        }\n    }\n\n    delete finalOptions.webgpu;\n    delete finalOptions.webgl;\n    delete finalOptions.canvasOptions;\n\n    if (!RendererClass)\n    {\n        throw new Error('No available renderer for the current environment');\n    }\n\n    const renderer = new RendererClass();\n\n    await renderer.init(finalOptions);\n\n    return renderer;\n}\n"],"names":[],"mappings":";;;;;AA0BA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAA;AAyCnD,eAAsB,mBAAmB,OAAA,EACzC;AACI,EAAA,IAAI,iBAA2B,EAAC;AAEhC,EAAA,IAAI,QAAQ,UAAA,EACZ;AACI,IAAA,cAAA,CAAe,IAAA,CAAK,QAAQ,UAAU,CAAA;AAEtC,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,IAAA,KACxB;AACI,MAAA,IAAI,IAAA,KAAS,QAAQ,UAAA,EACrB;AACI,QAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,MAC5B;AAAA,IACJ,CAAC,CAAA;AAAA,EACL,CAAA,MAEA;AACI,IAAA,cAAA,GAAiB,eAAe,KAAA,EAAM;AAAA,EAC1C;AAEA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,eAA2C,EAAC;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAC3C;AACI,IAAA,MAAM,YAAA,GAAe,eAAe,CAAC,CAAA;AAErC,IAAA,IAAI,YAAA,KAAiB,QAAA,IAAa,MAAM,iBAAA,EAAkB,EAC1D;AACI,MAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,0BAAsB,CAAA;AAE9D,MAAA,aAAA,GAAgB,cAAA;AAEhB,MAAA,YAAA,GAAe,EAAE,GAAG,OAAA,EAAS,GAAG,QAAQ,MAAA,EAAO;AAE/C,MAAA;AAAA,IACJ,CAAA,MAAA,IAEI,iBAAiB,OAAA,IACd,gBAAA;AAAA,MACC,OAAA,CAAQ,4BAAA,IACD,gBAAA,CAAiB,cAAA,CAAe;AAAA,KAC3C,EAEJ;AACI,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,wBAAoB,CAAA;AAE3D,MAAA,aAAA,GAAgB,aAAA;AAEhB,MAAA,YAAA,GAAe,EAAE,GAAG,OAAA,EAAS,GAAG,QAAQ,KAAA,EAAM;AAE9C,MAAA;AAAA,IACJ,CAAA,MAAA,IACS,iBAAiB,QAAA,EAC1B;AACI,MAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,6BAAyB,CAAA;AAEjE,MAAA,aAAA,GAAgB,cAAA;AAEhB,MAAA,YAAA,GAAe,EAAE,GAAG,OAAA,EAAS,GAAG,QAAQ,aAAA,EAAc;AAEtD,MAAA;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAO,YAAA,CAAa,MAAA;AACpB,EAAA,OAAO,YAAA,CAAa,KAAA;AACpB,EAAA,OAAO,YAAA,CAAa,aAAA;AAEpB,EAAA,IAAI,CAAC,aAAA,EACL;AACI,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,aAAA,EAAc;AAEnC,EAAA,MAAM,QAAA,CAAS,KAAK,YAAY,CAAA;AAEhC,EAAA,OAAO,QAAA;AACX;;;;"}