use js_sys::Float32Array;
use js_sys::Object;
use js_sys::Uint8Array;
use js_sys::Uint16Array;
use std::ops::Deref;
use web_sys::WebGl2RenderingContext;
pub trait ArrayView: Sized {
type JS: Deref<Target = Object>;
const GL_TYPE: u32;
unsafe fn view(rust: &[Self]) -> Self::JS;
}
macro_rules! impl_array_view {
($rust:ty, $js:ty, $gl:expr_2021) => {
impl ArrayView for $rust {
type JS = $js;
const GL_TYPE: u32 = $gl;
unsafe fn view(rust: &[$rust]) -> $js {
unsafe { <$js>::view(rust) }
}
}
};
}
impl_array_view!(f32, Float32Array, WebGl2RenderingContext::FLOAT);
impl_array_view!(u16, Uint16Array, WebGl2RenderingContext::UNSIGNED_INT);
impl_array_view!(u8, Uint8Array, WebGl2RenderingContext::UNSIGNED_BYTE);