diff options
Diffstat (limited to 'engine/src')
| -rw-r--r-- | engine/src/ui/imgui.rs | 68 |
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> |
