summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-09-07 00:24:09 +0200
committerHampusM <hampus@hampusmat.com>2026-09-07 00:24:09 +0200
commit6eefb4d3a03d8ba4f3e7f5494831d6417b8dcc12 (patch)
tree92bb8b4ca6aa751338f2902a425c5c9401a30c31
parent5cb923fe13818192ad75d8b62899671d72cacb18 (diff)
feat(engine): add face culling mode to rendering::DrawProperties
-rw-r--r--engine/src/rendering.rs18
-rw-r--r--engine/src/rendering/backend/opengl.rs14
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 {