()
| 124 | |
| 125 | // Render loop |
| 126 | function render() { |
| 127 | if (!gpuContext || !gridRenderer) return; |
| 128 | |
| 129 | const textureView = getCanvasTexture(gpuContext).createView(); |
| 130 | const commandEncoder = gpuDevice.createCommandEncoder(); |
| 131 | |
| 132 | const renderPassDescriptor: GPURenderPassDescriptor = { |
| 133 | colorAttachments: [ |
| 134 | { |
| 135 | view: textureView, |
| 136 | clearValue: { r: 0.1, g: 0.1, b: 0.15, a: 1.0 }, |
| 137 | loadOp: 'clear', |
| 138 | storeOp: 'store', |
| 139 | }, |
| 140 | ], |
| 141 | }; |
| 142 | |
| 143 | const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor); |
| 144 | |
| 145 | // Render grid |
| 146 | gridRenderer.render(passEncoder); |
| 147 | |
| 148 | // Render axes + ticks |
| 149 | xAxisRenderer?.render(passEncoder); |
| 150 | yAxisRenderer?.render(passEncoder); |
| 151 | |
| 152 | passEncoder.end(); |
| 153 | |
| 154 | gpuDevice.queue.submit([commandEncoder.finish()]); |
| 155 | |
| 156 | // Continue rendering |
| 157 | animationFrameId = requestAnimationFrame(render); |
| 158 | } |
| 159 | |
| 160 | // Start render loop |
| 161 | render(); |
no test coverage detected