diff options
Diffstat (limited to 'engine/src')
| -rw-r--r-- | engine/src/rendering.rs | 18 | ||||
| -rw-r--r-- | engine/src/rendering/backend/opengl.rs | 14 |
2 files changed, 30 insertions, 2 deletions
diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs index 1bb11cc..524c617 100644 --- a/engine/src/rendering.rs +++ b/engine/src/rendering.rs @@ -384,6 +384,7 @@ pub struct DrawProperties pub scissor_test_enabled: bool, pub scissor_box: ScissorBox, pub face_culling_enabled: bool, + pub face_culling_mode: FaceCullingMode, /// `None` for default framebuffer pub draw_framebuffer: Option<ObjectId>, @@ -405,6 +406,7 @@ impl Default for DrawProperties scissor_test_enabled: false, scissor_box: ScissorBox::default(), face_culling_enabled: false, + face_culling_mode: FaceCullingMode::default(), draw_framebuffer: None, read_framebuffer: None, } @@ -423,11 +425,23 @@ bitflags! { const SCISSOR_TEST_ENABLED = 1 << 5; const SCISSOR_BOX = 1 << 6; const FACE_CULLING_ENABLED = 1 << 7; - const DRAW_FRAMEBUFFER = 1 << 8; - const READ_FRAMEBUFFER = 1 << 9; + const FACE_CULLING_MODE = 1 << 8; + const DRAW_FRAMEBUFFER = 1 << 9; + const READ_FRAMEBUFFER = 1 << 10; } } +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum FaceCullingMode +{ + Front, + + #[default] + Back, + + FrontAndBack, +} + #[derive(Debug, Clone)] #[non_exhaustive] pub enum TextureCreation diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs index 32afd8f..25583b5 100644 --- a/engine/src/rendering/backend/opengl.rs +++ b/engine/src/rendering/backend/opengl.rs @@ -50,10 +50,12 @@ use opengl_bindings::misc::{ get_viewport as gl_get_viewport, set_depth_function as gl_set_depth_function, set_enabled, + set_face_culling_mode as gl_set_face_culling_mode, set_viewport as gl_set_viewport, BufferClearMask as GlBufferClearMask, Capability, DepthFunction as GlDepthFunction, + FaceCullingMode as GlFaceCullingMode, }; use opengl_bindings::shader::{ Error as GlShaderError, @@ -126,6 +128,7 @@ use crate::rendering::{ DrawMeshOptions, DrawProperties, DrawPropertiesUpdateFlags, + FaceCullingMode, FramebufferProperties, FramebufferPropertiesUpdateFlags, GraphicsProperties, @@ -1388,6 +1391,17 @@ fn update_draw_properties( ); } + if update_flags.contains(DrawPropertiesUpdateFlags::FACE_CULLING_MODE) { + gl_set_face_culling_mode( + gl_context, + match properties.face_culling_mode { + FaceCullingMode::Front => GlFaceCullingMode::Front, + FaceCullingMode::Back => GlFaceCullingMode::Back, + FaceCullingMode::FrontAndBack => GlFaceCullingMode::FrontAndBack, + }, + ); + } + 'if_draw_fb: { if update_flags.contains(DrawPropertiesUpdateFlags::DRAW_FRAMEBUFFER) { let Some(framebuffer_obj_id) = properties.draw_framebuffer else { |
