diff options
| author | HampusM <hampus@hampusmat.com> | 2026-07-10 16:20:57 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-07-10 16:20:57 +0200 |
| commit | d68adea2554981da9dee593bf8a4b9455ca4d636 (patch) | |
| tree | 8f931254aebabbfe7b858e6a5b0a5bbcdb1099bd /engine/src | |
| parent | 9690e173f06d64d3b992b4217d1665d6cbf29394 (diff) | |
feat(engine): make CreateTexture rendering cmd optionally take texture value
Diffstat (limited to 'engine/src')
| -rw-r--r-- | engine/src/rendering.rs | 2 | ||||
| -rw-r--r-- | engine/src/rendering/backend/opengl.rs | 53 | ||||
| -rw-r--r-- | engine/src/rendering/main_render_pass.rs | 14 | ||||
| -rw-r--r-- | engine/src/ui/imgui.rs | 5 |
4 files changed, 42 insertions, 32 deletions
diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs index 9c0e9dd..94c619f 100644 --- a/engine/src/rendering.rs +++ b/engine/src/rendering.rs @@ -237,7 +237,7 @@ pub enum Command CreateShaderProgram(ObjectId, ShaderProgram), ActivateShader(ObjectId), SetShaderBinding(ShaderBindingLocation, ShaderBindingValue), - CreateTexture(AssetHandle<Texture>), + CreateTexture(ObjectId, AssetOrValue<Texture>), CreateMesh { obj_id: ObjectId, diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs index b5ebd81..0323f29 100644 --- a/engine/src/rendering/backend/opengl.rs +++ b/engine/src/rendering/backend/opengl.rs @@ -67,7 +67,7 @@ use raw_window_handle::WindowHandle; use safer_ffi::layout::ReprC; use zerocopy::{Immutable, IntoBytes}; -use crate::asset::{Assets, Handle as AssetHandle}; +use crate::asset::Assets; use crate::data_types::dimens::Dimens; use crate::ecs::actions::Actions; use crate::ecs::query::term::Without; @@ -697,12 +697,13 @@ fn handle_commands( ) .unwrap(); } - Command::CreateTexture(texture_asset) => { + Command::CreateTexture(texture_object_id, texture) => { if let Err(err) = create_texture_object( gl_context, object_store, assets, - &texture_asset, + texture_object_id, + texture, ) { tracing::error!("Failed to create texture object: {err}"); } @@ -1066,23 +1067,31 @@ fn create_texture_object( curr_gl_ctx: &MaybeCurrentContextWithFns, object_store: &mut ObjectStore, assets: &Assets, - texture_asset: &AssetHandle<Texture>, + texture_object_id: ObjectId, + texture: AssetOrValue<Texture>, ) -> Result<(), GlTextureGenerateError> { - let object_id = ObjectId::Asset(texture_asset.id()); - - if object_store.contains_non_pending_with_id(&object_id) { + if object_store.contains_non_pending_with_id(&texture_object_id) { tracing::error!( - texture_object_id=?object_id, - texture_asset_label=?assets.get_label(texture_asset), - " object store already contains object with this ID" + texture_object_id=?texture_object_id, + "Object store already contains object with this ID" ); return Ok(()); } - let Some(texture) = assets.get(&texture_asset) else { - tracing::error!("Texture asset is not loaded",); - return Ok(()); + let texture = match &texture { + AssetOrValue::Asset(texture_asset) => { + let Some(texture) = assets.get(&texture_asset) else { + tracing::error!( + texture_asset_id=?texture_asset.id(), + "Texture asset does not exist" + ); + return Ok(()); + }; + + texture + } + AssetOrValue::Value(texture) => texture, }; let texture_image = match texture.image.color_type() { @@ -1096,16 +1105,12 @@ fn create_texture_object( // To prevent this, the image is converted to RGBA8. RGBA8 images have a pixel // size of 4 bytes so they cannot have any alignment problems - tracing::warn!( - texture_asset = %assets - .get_label(&texture_asset) - .expect("Not possible"), - concat!( - "Converting texture image from RGB8 to RGBA8 to prevent alignment ", - "problems. This conversion may be slow. Consider changing the ", - "texture image's pixel format to RGBA8" - ) - ); + // TODO: Make it clearer in warning log which texture is being talked about + tracing::warn!(concat!( + "Converting texture image from RGB8 to RGBA8 to prevent alignment ", + "problems. This conversion may be slow. Consider changing the ", + "texture image's pixel format to RGBA8" + )); &texture.image.to_rgba8() } @@ -1113,7 +1118,7 @@ fn create_texture_object( }; object_store.insert( - object_id, + texture_object_id, Object::from_raw( create_gl_texture(curr_gl_ctx, texture_image, &texture.properties)? .into_raw(), diff --git a/engine/src/rendering/main_render_pass.rs b/engine/src/rendering/main_render_pass.rs index d5e9163..7d06bf2 100644 --- a/engine/src/rendering/main_render_pass.rs +++ b/engine/src/rendering/main_render_pass.rs @@ -76,9 +76,10 @@ pub fn add_main_render_passes( { object_store.insert_pending(ObjectId::Asset(default_texture_asset.id())); - render_pass - .commands - .push(Command::CreateTexture(default_texture_asset)); + render_pass.commands.push(Command::CreateTexture( + ObjectId::Asset(default_texture_asset.id()), + AssetOrValue::Asset(default_texture_asset), + )); } render_pass.commands.push(Command::ClearBuffers( @@ -169,9 +170,10 @@ pub fn add_main_render_passes( { object_store.insert_pending(ObjectId::Asset(texture_asset.id())); - render_pass - .commands - .push(Command::CreateTexture(texture_asset.clone())); + render_pass.commands.push(Command::CreateTexture( + ObjectId::Asset(texture_asset.id()), + AssetOrValue::Asset(texture_asset.clone()), + )); } } diff --git a/engine/src/ui/imgui.rs b/engine/src/ui/imgui.rs index 13896ff..7dea7fb 100644 --- a/engine/src/ui/imgui.rs +++ b/engine/src/ui/imgui.rs @@ -471,7 +471,10 @@ fn initialize_context( render_passes.passes.push_back(RenderPass { commands: vec