summaryrefslogtreecommitdiff
path: root/engine/src/ui/imgui.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/ui/imgui.rs')
-rw-r--r--engine/src/ui/imgui.rs68
1 files changed, 60 insertions, 8 deletions
diff --git a/engine/src/ui/imgui.rs b/engine/src/ui/imgui.rs
index 75ce9c0..bb13d8d 100644
--- a/engine/src/ui/imgui.rs
+++ b/engine/src/ui/imgui.rs
@@ -63,9 +63,11 @@ use crate::rendering::{
Command as RenderingCommand,
DrawMeshOptions,
DrawProperties,
+ DrawPropertiesUpdateFlags,
MeshUsage,
RenderPass,
RenderPasses,
+ ScissorBox,
SurfaceId,
SurfaceSpec,
PRE_RENDER_PHASE,
@@ -561,6 +563,7 @@ fn add_drawing_render_pass(
},
depth_test_enabled: false,
face_culling_enabled: false,
+ scissor_test_enabled: true,
..Default::default()
},
});
@@ -644,14 +647,26 @@ fn add_drawing_render_pass(
for command in draw_list.commands() {
match command {
ImguiDrawCmd::Elements { count, cmd_params, raw_cmd: _ } => {
- render_pass.commands.push(RenderingCommand::DrawMesh(
- mesh_obj_id,
- DrawMeshOptions::builder()
- .element_offset(cmd_params.idx_offset.try_into().unwrap())
- .vertex_offset(cmd_params.vtx_offset.try_into().unwrap())
- .element_cnt(count.try_into().unwrap())
- .build(),
- ));
+ let Some(scissor_box) =
+ calc_draw_cmd_scissor_box(draw_data, &cmd_params)
+ else {
+ continue;
+ };
+
+ render_pass.commands.extend([
+ RenderingCommand::UpdateDrawProperties(
+ DrawProperties { scissor_box, ..Default::default() },
+ DrawPropertiesUpdateFlags::SCISSOR_BOX,
+ ),
+ RenderingCommand::DrawMesh(
+ mesh_obj_id,
+ DrawMeshOptions::builder()
+ .element_offset(cmd_params.idx_offset.try_into().unwrap())
+ .vertex_offset(cmd_params.vtx_offset.try_into().unwrap())
+ .element_cnt(count.try_into().unwrap())
+ .build(),
+ ),
+ ]);
}
_ => {}
}
@@ -659,6 +674,43 @@ fn add_drawing_render_pass(
}
}
+fn calc_draw_cmd_scissor_box(
+ draw_data: &dear_imgui_rs::DrawData,
+ cmd_params: &dear_imgui_rs::DrawCmdParams,
+) -> Option<ScissorBox>
+{
+ let clip_rect = cmd_params.clip_rect;
+
+ let clip_min_x =
+ (clip_rect[0] - draw_data.display_pos[0]) * draw_data.framebuffer_scale[0];
+
+ let clip_min_y =
+ (clip_rect[1] - draw_data.display_pos[1]) * draw_data.framebuffer_scale[1];
+
+ let clip_max_x =
+ (clip_rect[2] - draw_data.display_pos[0]) * draw_data.framebuffer_scale[0];
+
+ let clip_max_y =
+ (clip_rect[3] - draw_data.display_pos[1]) * draw_data.framebuffer_scale[1];
+
+ if clip_max_x <= clip_min_x || clip_max_y <= clip_min_y {
+ return None;
+ }
+
+ let fb_height = draw_data.display_size[1] * draw_data.framebuffer_scale[1];
+
+ Some(ScissorBox {
+ size: Some(Dimens {
+ width: (clip_max_x - clip_min_x) as u16,
+ height: (clip_max_y - clip_min_y) as u16,
+ }),
+ lower_left_corner_pos: Vec2 {
+ x: clip_min_x as u16,
+ y: (fb_height - clip_max_y) as u16,
+ },
+ })
+}
+
fn create_font_texture(
font_texture_data: &dear_imgui_rs::texture::TextureData,
) -> Result<Texture, ImageFromBytesError>