1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
use web_sys::WebGl2RenderingContext as Gl; #[derive(Clone, Copy, PartialEq)] pub enum LoadOp<T> { Load, Clear(T), } impl LoadOp<[f32; 4]> { pub(crate) fn as_load_float_action(&self, index: i32) -> LoadAction { match self { LoadOp::Load => LoadAction::Load, LoadOp::Clear(value) => LoadAction::ClearColorFloat(index, *value), } } } impl LoadOp<[i32; 4]> { pub(crate) fn as_load_integer_action(&self, index: i32) -> LoadAction { match self { LoadOp::Load => LoadAction::Load, LoadOp::Clear(value) => LoadAction::ClearColorInteger(index, *value), } } } impl LoadOp<[u32; 4]> { pub(crate) fn as_load_unsigned_integer_action(&self, index: i32) -> LoadAction { match self { LoadOp::Load => LoadAction::Load, LoadOp::Clear(value) => LoadAction::ClearColorUnsignedInteger(index, *value), } } } impl LoadOp<(f32, i32)> { pub(crate) fn as_load_depth_stencil_action(&self) -> LoadAction { match self { LoadOp::Load => LoadAction::Load, LoadOp::Clear((depth, stencil)) => LoadAction::ClearDepthStencil(*depth, *stencil), } } } impl LoadOp<f32> { pub(crate) fn as_load_depth_action(&self) -> LoadAction { match self { LoadOp::Load => LoadAction::Load, LoadOp::Clear(depth) => LoadAction::ClearDepth(*depth), } } } impl LoadOp<i32> { pub(crate) fn as_load_stencil_action(&self) -> LoadAction { match self { LoadOp::Load => LoadAction::Load, LoadOp::Clear(stencil) => LoadAction::ClearStencil(*stencil), } } } #[derive(Clone, Copy)] pub(crate) enum LoadAction { Load, ClearColorFloat(i32, [f32; 4]), ClearColorInteger(i32, [i32; 4]), ClearColorUnsignedInteger(i32, [u32; 4]), ClearDepthStencil(f32, i32), ClearDepth(f32), ClearStencil(i32), } impl LoadAction { pub(crate) fn perform(&self, gl: &Gl) { match self { LoadAction::Load => (), LoadAction::ClearColorFloat(index, value) => { gl.clear_bufferfv_with_f32_array(Gl::COLOR, *index, value) } LoadAction::ClearColorInteger(index, value) => { gl.clear_bufferiv_with_i32_array(Gl::COLOR, *index, value) } LoadAction::ClearColorUnsignedInteger(index, value) => { gl.clear_bufferuiv_with_u32_array(Gl::COLOR, *index, value) } LoadAction::ClearDepthStencil(depth, stencil) => { gl.clear_bufferfi(Gl::DEPTH_STENCIL, 0, *depth, *stencil) } LoadAction::ClearDepth(value) => { gl.clear_bufferfv_with_f32_array(Gl::DEPTH, 0, &mut [*value]) } LoadAction::ClearStencil(value) => { gl.clear_bufferiv_with_i32_array(Gl::STENCIL, 0, &mut [*value]) } } } }