summaryrefslogtreecommitdiff
path: root/engine/src
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src')
-rw-r--r--engine/src/ui/dear_imgui.rs145
1 files changed, 69 insertions, 76 deletions
diff --git a/engine/src/ui/dear_imgui.rs b/engine/src/ui/dear_imgui.rs
index 7822c2f..b8a2b35 100644
--- a/engine/src/ui/dear_imgui.rs
+++ b/engine/src/ui/dear_imgui.rs
@@ -1,7 +1,6 @@
use std::collections::HashMap;
use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicU64, Ordering};
-use std::sync::LazyLock;
use dear_imgui_rs::{
DrawCmd as ImguiDrawCmd,
@@ -21,7 +20,6 @@ use ecs::time::Time;
use ecs::{Component, Query, Sole};
use intmap::IntMap;
-use crate::asset::{Assets, Handle as AssetHandle, Label as AssetLabel};
use crate::data_types::dimens::Dimens;
use crate::input::keyboard::{Key, Keyboard};
use crate::input::mouse::{Button as MouseButton, Buttons as MouseButtons, Mouse};
@@ -42,7 +40,7 @@ use crate::rendering::blending::{
Equation as RenderingBlendingEquation,
Factor as RenderingBlendingFactor,
};
-use crate::rendering::object::Id as RenderingObjectId;
+use crate::rendering::object::{Id as RenderingObjectId, Store as RenderingObjectStore};
use crate::rendering::shader::cursor::{
BindingTextureKind as ShaderBindingTextureKind,
BindingValue as ShaderBindingValue,
@@ -52,6 +50,7 @@ use crate::rendering::shader::{
Context as ShaderContext,
EntrypointFlags as ShaderEntrypointFlags,
ModuleSource as ShaderModuleSource,
+ Program as ShaderProgram,
};
use crate::rendering::{
AssetOrValue,
@@ -84,11 +83,6 @@ mod reexports
pub use reexports::*;
-pub static SHADER_ASSET_LABEL: LazyLock<AssetLabel> = LazyLock::new(|| AssetLabel {
- path: Path::new("").into(),
- name: Some("imgui_shader".into()),
-});
-
/// Dear Imgui context
#[derive(Sole)]
pub struct Context
@@ -241,9 +235,9 @@ fn update(
target_window_query: Query<(&Window, &Surface, With<TargetWindow>)>,
mut context: Single<Context>,
time: Single<Time>,
- mut assets: Single<Assets>,
mut render_passes: Single<RenderPasses>,
shader_context: Single<ShaderContext>,
+ mut rendering_object_store: Single<RenderingObjectStore>,
rendering_backend_properties: Single<RenderingBackendProperties>,
keyboard: Single<Keyboard>,
mouse: Single<Mouse>,
@@ -255,9 +249,9 @@ fn update(
unreachable!();
};
- let assets = assets.get_mut()?;
let render_passes = render_passes.get_mut()?;
let shader_context = shader_context.get()?;
+ let rendering_object_store = rendering_object_store.get_mut()?;
let keyboard = keyboard.get()?;
let mouse = mouse.get()?;
let mouse_buttons = mouse_buttons.get()?;
@@ -274,25 +268,23 @@ fn update(
match curr_state {
State::NotInitialized => {
- let Some((shader_asset, mesh_obj_id, mesh)) = initialize_context(
+ let resources = initialize_context(
context,
&window,
window_surface.id,
- assets,
render_passes,
shader_context,
- ) else {
- *state = State::NotInitialized;
- return Ok(());
- };
+ rendering_object_store,
+ rendering_backend_properties,
+ )?;
context.ctx.new_frame();
- *state = State::Ready { shader_asset, mesh_obj_id, mesh };
+ *state = State::Ready { resources };
}
- State::Ready { shader_asset, mesh_obj_id, mut mesh } => {
+ State::Ready { mut resources } => {
if !context.enabled {
- *state = State::Ready { shader_asset, mesh_obj_id, mesh };
+ *state = State::Ready { resources };
return Ok(());
}
@@ -306,17 +298,14 @@ fn update(
add_drawing_render_pass(
context,
render_passes,
- shader_context,
rendering_backend_properties,
window_surface.id,
- shader_asset.clone(),
- mesh_obj_id,
- &mut mesh,
+ &mut resources,
)?;
context.ctx.new_frame();
- *state = State::Ready { shader_asset, mesh_obj_id, mesh };
+ *state = State::Ready { resources };
}
State::Unreachable => unreachable!(),
}
@@ -334,41 +323,50 @@ enum State
NotInitialized,
Ready
{
- shader_asset: AssetHandle<ShaderModuleSource>,
- mesh_obj_id: RenderingObjectId,
- mesh: Mesh,
+ resources: InitializedResources,
},
Unreachable,
}
+#[derive(Debug)]
+struct InitializedResources
+{
+ shader_obj_id: RenderingObjectId,
+ shader: ShaderProgram,
+ mesh_obj_id: RenderingObjectId,
+ mesh: Mesh,
+}
+
fn initialize_context(
context: &mut Context,
window: &Window,
window_surface_id: SurfaceId,
- assets: &mut Assets,
render_passes: &mut RenderPasses,
shader_context: &ShaderContext,
-) -> Option<(AssetHandle<ShaderModuleSource>, RenderingObjectId, Mesh)>
+ rendering_object_store: &mut RenderingObjectStore,
+ rendering_backend_properties: &RenderingBackendProperties,
+) -> Result<InitializedResources, crate::Error>
{
- let Some(shader_asset) =
- assets.get_handle_to_loaded::<ShaderModuleSource>(SHADER_ASSET_LABEL.clone())
- else {
- assets.store_with_label(
- SHADER_ASSET_LABEL.clone(),
- ShaderModuleSource {
- name: "imgui_shader.slang".into(),
- file_path: Path::new("@engine/imgui_shader").into(),
- source: include_str!("../../res/imgui_shader.slang").into(),
- link_entry_points: ShaderEntrypointFlags::VERTEX
- | ShaderEntrypointFlags::FRAGMENT,
- },
- );
-
- // We want to wait with initializing until the shader have been processed by the
- // shader context
- return None;
+ let shader_module_source = ShaderModuleSource {
+ name: "imgui_shader.slang".into(),
+ file_path: Path::new("@engine/imgui_shader").into(),
+ source: include_str!("../../res/imgui_shader.slang").into(),
+ link_entry_points: ShaderEntrypointFlags::VERTEX
+ | ShaderEntrypointFlags::FRAGMENT,
};
+ let shader_obj_id = RenderingObjectId::new_sequential();
+
+ let shader = shader_context
+ .compose_program(
+ &[shader_context.load_module(&shader_module_source)?],
+ shader_module_source.link_entry_points,
+ rendering_backend_properties.shader_target_id,
+ )?
+ .into_linked()?;
+
+ rendering_object_store.insert_pending(shader_obj_id);
+
#[allow(clippy::cast_possible_truncation)]
let hidpi_factor = window.scale_factor().round() as f32;
@@ -392,6 +390,8 @@ fn initialize_context(
let mesh_obj_id = RenderingObjectId::new_sequential();
+ rendering_object_store.insert_pending(mesh_obj_id);
+
let mesh = Mesh::builder()
.vertices(MeshVertexBuffer::with_capacity(
&[
@@ -416,14 +416,8 @@ fn initialize_context(
render_passes.passes.push_back(RenderPass {
commands: vec![
RenderingCommand::MakeCurrent(window_surface_id),
- RenderingCommand::CreateShaderProgram(
- RenderingObjectId::Asset(shader_asset.id()),
- shader_context
- .get_program(&shader_asset.id())
- .expect("Not possible")
- .clone(),
- ),
- RenderingCommand::ActivateShader(RenderingObjectId::Asset(shader_asset.id())),
+ RenderingCommand::CreateShaderProgram(shader_obj_id, shader.clone()),
+ RenderingCommand::ActivateShader(shader_obj_id),
RenderingCommand::CreateMesh {
obj_id: mesh_obj_id,
mesh: AssetOrValue::Value(mesh.clone()),
@@ -433,7 +427,12 @@ fn initialize_context(
draw_properties: DrawProperties::default(),
});
- Some((shader_asset, mesh_obj_id, mesh))
+ Ok(InitializedResources {
+ shader_obj_id,
+ shader,
+ mesh_obj_id,
+ mesh,
+ })
}
fn update_inputs(
@@ -484,12 +483,9 @@ fn update_inputs(
fn add_drawing_render_pass(
context: &mut Context,
render_passes: &mut RenderPasses,
- shader_context: &ShaderContext,
rendering_backend_properties: &RenderingBackendProperties,
window_surface_id: SurfaceId,
- shader_asset: AssetHandle<ShaderModuleSource>,
- mesh_obj_id: RenderingObjectId,
- mesh: &mut Mesh,
+ resources: &mut InitializedResources,
) -> Result<(), crate::Error>
{
let render_pass = render_passes.passes.push_back_mut(RenderPass {
@@ -508,12 +504,9 @@ fn add_drawing_render_pass(
},
});
- let shader_program = shader_context
- .get_program(&shader_asset.id())
- .expect("Not possible");
-
let shader_cursor = ShaderCursor::new(
- shader_program
+ resources
+ .shader
.reflection(rendering_backend_properties.shader_target_id)
.unwrap()
.global_params_var_layout()
@@ -521,10 +514,10 @@ fn add_drawing_render_pass(
);
let Context {
- enabled: _,
ctx,
texture_lookup,
texture_id_lookup,
+ ..
} = context;
let render_frame = ctx.render();
@@ -688,13 +681,11 @@ fn add_drawing_render_pass(
// let [scale_width, scale_height] = draw_data.framebuffer_scale;
- let shader_object_id = RenderingObjectId::Asset(shader_asset.id());
-
render_pass.commands.extend([
RenderingCommand::MakeCurrent(window_surface_id),
- RenderingCommand::ActivateShader(shader_object_id),
+ RenderingCommand::ActivateShader(resources.shader_obj_id),
RenderingCommand::SetShaderBinding(
- shader_object_id,
+ resources.shader_obj_id,
shader_cursor
.field("Uniforms")
.field("projection")
@@ -719,10 +710,10 @@ fn add_drawing_render_pass(
]);
for draw_list in draw_data.draw_lists() {
- mesh.vertex_buf_mut().clear();
+ resources.mesh.vertex_buf_mut().clear();
for vertex in draw_list.vtx_buffer() {
- mesh.vertex_buf_mut().push((
+ resources.mesh.vertex_buf_mut().push((
MeshNamedVertexAttr::<[f32; 3]> {
label: VertexLabel::Position,
value: [vertex.pos[0], vertex.pos[1], 0.0],
@@ -738,11 +729,13 @@ fn add_drawing_render_pass(
));
}
- mesh.set_indices(draw_list.idx_buffer().iter().map(|index| (*index).into()));
+ resources
+ .mesh
+ .set_indices(draw_list.idx_buffer().iter().map(|index| (*index).into()));
render_pass.commands.push(RenderingCommand::UpdateMesh {
- obj_id: mesh_obj_id,
- mesh: mesh.clone(),
+ obj_id: resources.mesh_obj_id,
+ mesh: resources.mesh.clone(),
usage: MeshUsage::Stream,
});
@@ -771,7 +764,7 @@ fn add_drawing_render_pass(
DrawPropertiesUpdateFlags::SCISSOR_BOX,
),
RenderingCommand::SetShaderBinding(
- shader_object_id,
+ resources.shader_obj_id,
shader_cursor.field("main_texture").binding(
ShaderBindingValue::Texture(
*texture_object_id,
@@ -780,7 +773,7 @@ fn add_drawing_render_pass(
)?,
),
RenderingCommand::DrawMesh(
- mesh_obj_id,
+ resources.mesh_obj_id,
DrawMeshOptions::builder()
.element_offset(cmd_params.idx_offset.try_into().unwrap())
.vertex_offset(cmd_params.vtx_offset.try_into().unwrap())