export class RenderSystem { constructor( device, canvas ) { this.device = device; this.canvas = canvas; // simple per-system depth texture; recreated on resize by user as needed this.depthTexture = null; } _beginFrame( clearColor = { r: 0.3, g: 0.3, b: 0.3, a: 1 } ) { const canvas = this.canvas; const context = canvas.getContext( "webgpu" ); const format = navigator.gpu.getPreferredCanvasFormat(); if ( !this.depthTexture || this.depthTexture.width !== canvas.width || this.depthTexture.height !== canvas.height ) { this.depthTexture = this.device.createTexture( { size: [ canvas.width, canvas.height, 1 ], sampleCount: 1, format: "depth24plus", usage: GPUTextureUsage.RENDER_ATTACHMENT } ); } const encoder = this.device.createCommandEncoder(); const view = context.getCurrentTexture().createView(); const depthView = this.depthTexture.createView(); const renderPassDescriptor = { colorAttachments: [ { view: view, loadOp: "clear", storeOp: "store", clearValue: clearColor } ], depthStencilAttachment: { view: depthView, depthLoadOp: "clear", depthStoreOp: "store", depthClearValue: 1.0 } }; const passEncoder = encoder.beginRenderPass( renderPassDescriptor ); return { encoder, passEncoder }; } _endFrame( frame ) { frame.passEncoder.end(); this.device.queue.submit( [ frame.encoder.finish() ] ); } render( scene, clearColor ) { const frame = this._beginFrame( clearColor ); scene.draw( frame.passEncoder ); this._endFrame( frame ); } }