11import { WebGLRenderer } from "./renderers/webgl_renderer" ;
2+ import { createWebGPURenderer } from "./renderers/webgpu/webgpu_renderer" ;
23import { Logger } from "./utilities/logger" ;
34import { ChunkManager } from "./core/chunk_manager" ;
45import { Renderer } from "./core/renderer" ;
@@ -87,10 +88,20 @@ export class Idetik {
8788 *
8889 * @throws {Error } If viewports have duplicate IDs or shared elements
8990 */
90- constructor ( params : IdetikParams ) {
91+ static async create (
92+ params : IdetikParams & { renderer ?: "webgl" | "webgpu-experimental" }
93+ ) : Promise < Idetik > {
94+ const renderer =
95+ params . renderer === "webgpu-experimental"
96+ ? await createWebGPURenderer ( params . canvas )
97+ : new WebGLRenderer ( params . canvas ) ;
98+ return new Idetik ( params , renderer ) ;
99+ }
100+
101+ constructor ( params : IdetikParams , renderer ?: Renderer ) {
91102 this . canvas = params . canvas ;
92103
93- this . renderer_ = new WebGLRenderer ( this . canvas ) ;
104+ this . renderer_ = renderer ?? new WebGLRenderer ( this . canvas ) ;
94105 this . chunkManager_ = new ChunkManager ( ) ;
95106 this . context_ = {
96107 chunkManager : this . chunkManager_ ,
@@ -114,6 +125,7 @@ export class Idetik {
114125 }
115126 this . sizeObserver_ = new PixelSizeObserver ( sizeDependents , ( ) => {
116127 this . renderer_ . updateSize ( ) ;
128+ this . renderer_ . beginFrame ( ) ;
117129 for ( const viewport of this . viewports_ ) {
118130 viewport . updateSize ( ) ;
119131 this . renderer_ . render ( viewport ) ;
@@ -219,6 +231,7 @@ export class Idetik {
219231
220232 this . lastTimestamp_ = timestamp ;
221233
234+ this . renderer_ . beginFrame ( ) ;
222235 for ( const viewport of this . viewports_ ) {
223236 viewport . cameraControls ?. onUpdate ( dt ) ;
224237 this . renderer_ . render ( viewport ) ;
0 commit comments