From af2af06f7bc145e0661def88861f56ca92dd3d89 Mon Sep 17 00:00:00 2001 From: HampusM Date: Thu, 6 Aug 2026 15:57:29 +0200 Subject: feat(engine): add shader binding texture kind enum --- engine/src/rendering/backend/opengl.rs | 5 ++-- engine/src/rendering/shader/cursor.rs | 21 ++++++++++++---- engine/src/rendering/shader/default.rs | 44 +++++++++++++++++++++++++--------- engine/src/ui/dear_imgui.rs | 6 ++++- 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs index be977f9..dc636ef 100644 --- a/engine/src/rendering/backend/opengl.rs +++ b/engine/src/rendering/backend/opengl.rs @@ -622,7 +622,8 @@ fn handle_commands( continue; }; - if let ShaderBindingValue::Texture(texture_object_id) = &binding_value { + if let ShaderBindingValue::Texture(texture_object_id, _) = &binding_value + { let Some(texture_obj) = object_store.get_texture_obj(texture_object_id) else { @@ -725,7 +726,7 @@ fn handle_commands( ShaderBindingValue::FMat4x4(ref value) => { value.items().as_bytes() } - ShaderBindingValue::Texture(_) => unreachable!(), + ShaderBindingValue::Texture(_, _) => unreachable!(), }, ) .unwrap(); diff --git a/engine/src/rendering/shader/cursor.rs b/engine/src/rendering/shader/cursor.rs index c54ffc9..169ad0b 100644 --- a/engine/src/rendering/shader/cursor.rs +++ b/engine/src/rendering/shader/cursor.rs @@ -201,7 +201,7 @@ pub enum BindingValue FVec3(Vec3), Color(Color), FMat4x4(Matrix), - Texture(RenderingObjectId), + Texture(RenderingObjectId, BindingTextureKind), } impl BindingValue @@ -272,9 +272,15 @@ impl BindingValue _, _, ) if ty.row_cnt() == Some(4) && ty.column_cnt() == Some(4) => Ok(()), - (Self::Texture(_), TypeKind::Resource, _, _, _, Some(res_shape)) - if (res_shape & ResourceShape::BASE) - .contains(ResourceShape::TEXTURE_2D) => + ( + Self::Texture(_, BindingTextureKind::Texture2D), + TypeKind::Resource, + _, + _, + _, + Some(res_shape), + ) if (res_shape & ResourceShape::BASE) + .contains(ResourceShape::TEXTURE_2D) => { Ok(()) } @@ -345,6 +351,13 @@ pub struct Binding pub value: BindingValue, } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[non_exhaustive] +pub enum BindingTextureKind +{ + Texture2D, +} + #[derive(Debug, thiserror::Error)] #[non_exhaustive] pub enum BindingError diff --git a/engine/src/rendering/shader/default.rs b/engine/src/rendering/shader/default.rs index 32cdc47..737916f 100644 --- a/engine/src/rendering/shader/default.rs +++ b/engine/src/rendering/shader/default.rs @@ -6,16 +6,21 @@ use crate::camera::{Active as ActiveCamera, Camera}; use crate::data_types::dimens::Dimens; use crate::draw_flags::NoDraw; use crate::ecs::actions::Actions; -use crate::ecs::query::term::{Traverse, TraverseUp, With, Without}; use crate::ecs::pair::ChildOf; +use crate::ecs::query::term::{Traverse, TraverseUp, With, Without}; use crate::ecs::sole::Single; use crate::ecs::Query; -use crate::lighting::{DirectionalLight, Environmental as EnvironmentalLighting, PointLight}; +use crate::lighting::{ + DirectionalLight, + Environmental as EnvironmentalLighting, + PointLight, +}; use crate::material::{Flags as MaterialFlags, Material}; use crate::matrix::Matrix; use crate::model::{MaterialSearchResult, Model}; use crate::projection::{ClipVolume as ProjectionClipVolume, Projection}; use crate::rendering::shader::cursor::{ + BindingTextureKind as ShaderBindingTextureKind, BindingValue as ShaderBindingValue, Cursor as ShaderCursor, }; @@ -64,17 +69,17 @@ pub fn enqueue_set_shader_bindings( &Camera, &WorldPosition, &ActiveCamera, - Traverse<(With, With), TraverseUp, ChildOf> + Traverse<(With, With), TraverseUp, ChildOf>, )>, window_query: Query<(&Window, &SurfaceSpec, With)>, point_light_query: Query<( &PointLight, &WorldPosition, - Traverse<(With, With), TraverseUp, ChildOf> + Traverse<(With, With), TraverseUp, ChildOf>, )>, directional_light_query: Query<( &DirectionalLight, - Traverse<(With, With), TraverseUp, ChildOf> + Traverse<(With, With), TraverseUp, ChildOf>, )>, assets: Single, shader_context: Single, @@ -95,7 +100,15 @@ pub fn enqueue_set_shader_bindings( for ( entity_id, - (model, environmental_lighting, material_flags, world_pos, scale, shader, mut pending_shader_bindings), + ( + model, + environmental_lighting, + material_flags, + world_pos, + scale, + shader, + mut pending_shader_bindings, + ), ) in renderable_query.iter_with_euids() { let shader_asset = match &shader { @@ -173,7 +186,7 @@ pub fn enqueue_set_shader_bindings( let env_lighting = match &environmental_lighting { Some(env_lighting) => &env_lighting, - None => &EnvironmentalLighting::default() + None => &EnvironmentalLighting::default(), }; let model_3d_shader_cursor = shader_cursor.field("Uniforms").field("model_3d"); @@ -189,9 +202,7 @@ pub fn enqueue_set_shader_bindings( model_3d_shader_cursor .field("model_inverted") .binding(inverted_model_matrix.into())?, - model_3d_shader_cursor - .field("view") - .binding(view.into())?, + model_3d_shader_cursor.field("view").binding(view.into())?, lighting_shader_cursor .field("view_pos") .binding(camera_world_pos.position.into())?, @@ -319,6 +330,7 @@ pub fn enqueue_set_shader_bindings( }) .id() .into(), + ShaderBindingTextureKind::Texture2D, ))?, ); @@ -339,6 +351,7 @@ pub fn enqueue_set_shader_bindings( }) .id() .into(), + ShaderBindingTextureKind::Texture2D, ))?, ); @@ -359,6 +372,7 @@ pub fn enqueue_set_shader_bindings( }) .id() .into(), + ShaderBindingTextureKind::Texture2D, ))?, ); @@ -413,7 +427,15 @@ fn create_projection_matrix( type RenderableEntity<'a> = ( &'a Model, - Traverse<(Option<&'a EnvironmentalLighting>, With, With), TraverseUp, ChildOf>, + Traverse< + ( + Option<&'a EnvironmentalLighting>, + With, + With, + ), + TraverseUp, + ChildOf, + >, Option<&'a MaterialFlags>, Option<&'a WorldPosition>, Option<&'a Scale>, diff --git a/engine/src/ui/dear_imgui.rs b/engine/src/ui/dear_imgui.rs index 60a8da1..b9775ea 100644 --- a/engine/src/ui/dear_imgui.rs +++ b/engine/src/ui/dear_imgui.rs @@ -51,6 +51,7 @@ use crate::rendering::blending::{ }; use crate::rendering::object::Id as RenderingObjectId; use crate::rendering::shader::cursor::{ + BindingTextureKind as ShaderBindingTextureKind, BindingValue as ShaderBindingValue, Cursor as ShaderCursor, }; @@ -720,7 +721,10 @@ fn add_drawing_render_pass( ), RenderingCommand::SetShaderBinding( shader_cursor.field("main_texture").binding( - ShaderBindingValue::Texture(*texture_object_id), + ShaderBindingValue::Texture( + *texture_object_id, + ShaderBindingTextureKind::Texture2D, + ), )?, ), RenderingCommand::DrawMesh( -- cgit v1.2.3-18-g5258