use super::*;
impl RayTraceBackendAdapter {
pub(crate) async fn attach(
canvas: &HtmlCanvasElement,
backend: RayTraceBackend,
width: u32,
height: u32,
) -> Result<Self, JsValue> {
match backend {
RayTraceBackend::Canvas2D => Ok(Self::Canvas2D(CanvasRayTraceBackend::attach(
canvas, width, height,
)?)),
RayTraceBackend::WebGl2 => Ok(Self::WebGl2(WebGlRayTraceBackend::attach(
canvas, width, height,
)?)),
RayTraceBackend::WebGpu => {
Ok(Self::WebGpu(WebGpuRayTraceBackend::attach(canvas).await?))
}
}
}
pub(crate) fn dimension_limit(&self) -> Option<u32> {
match self {
Self::Canvas2D(backend) => backend.dimension_limit(),
Self::WebGl2(backend) => backend.dimension_limit(),
Self::WebGpu(backend) => backend.dimension_limit(),
}
}
pub(crate) fn resize(&mut self, width: u32, height: u32) -> Result<(), JsValue> {
match self {
Self::Canvas2D(backend) => backend.resize(width, height),
Self::WebGl2(backend) => backend.resize(width, height),
Self::WebGpu(backend) => backend.resize(width, height),
}
}
pub(crate) fn upload_scene(&mut self, packed: &[f32]) -> Result<(), JsValue> {
match self {
Self::Canvas2D(_) => Ok(()),
Self::WebGl2(backend) => backend.upload_scene(packed),
Self::WebGpu(backend) => backend.upload_scene(packed),
}
}
pub(crate) fn draw(&mut self, frame: &[f32]) -> Result<(), JsValue> {
match self {
Self::Canvas2D(_) => Ok(()),
Self::WebGl2(backend) => backend.draw(frame),
Self::WebGpu(backend) => backend.draw(frame),
}
}
pub(crate) fn present(&mut self, pixels: &[u8]) -> Result<(), JsValue> {
match self {
Self::Canvas2D(backend) => backend.present(pixels),
_ => Ok(()),
}
}
pub(crate) fn release(&mut self) {
match self {
Self::Canvas2D(backend) => backend.release(),
Self::WebGl2(backend) => backend.release(),
Self::WebGpu(backend) => backend.release(),
}
}
}