Archived
1
Fork 0

Set scissor for imgui commands

This commit is contained in:
redstrate 2021-10-13 07:25:18 -04:00
parent 878ef9c5da
commit a78a18a99a
2 changed files with 31 additions and 7 deletions

View file

@ -1485,6 +1485,17 @@ void GFXVulkan::submit(GFXCommandBuffer* command_buffer, const platform::window_
scissor.extent.width = command.data.set_viewport.viewport.width;
scissor.extent.height = command.data.set_viewport.viewport.height;
vkCmdSetScissor(cmd, 0, 1, &scissor);
}
break;
case GFXCommandType::SetScissor:
{
VkRect2D scissor = {};
scissor.offset.x = command.data.set_scissor.rect.offset.x;
scissor.offset.y = command.data.set_scissor.rect.offset.y;
scissor.extent.width = command.data.set_scissor.rect.extent.width;
scissor.extent.height = command.data.set_scissor.rect.extent.height;
vkCmdSetScissor(cmd, 0, 1, &scissor);
}
break;

View file

@ -123,17 +123,30 @@ void ImGuiPass::render_post(GFXCommandBuffer* command_buffer, RenderTarget& targ
if(pcmd->UserCallback != nullptr) {
pcmd->UserCallback(cmd_list, pcmd);
} else {
ImVec4 clip_rect = {};
clip_rect.x = (pcmd->ClipRect.x - clip_offset.x) * clip_scale.x;
clip_rect.y = (pcmd->ClipRect.y - clip_offset.y) * clip_scale.y;
clip_rect.z = (pcmd->ClipRect.z - clip_offset.x) * clip_scale.x;
clip_rect.w = (pcmd->ClipRect.w - clip_offset.y) * clip_scale.y;
ImVec2 clip_min((pcmd->ClipRect.x - clip_offset.x) * clip_scale.x, (pcmd->ClipRect.y - clip_offset.y) * clip_scale.y);
ImVec2 clip_max((pcmd->ClipRect.z - clip_offset.x) * clip_scale.x, (pcmd->ClipRect.w - clip_offset.y) * clip_scale.y);
// Clamp to viewport as vkCmdSetScissor() won't accept values that are off bounds
if (clip_min.x < 0.0f) { clip_min.x = 0.0f; }
if (clip_min.y < 0.0f) { clip_min.y = 0.0f; }
if (clip_max.x > framebuffer_width) { clip_max.x = (float)framebuffer_width; }
if (clip_max.y > framebuffer_height) { clip_max.y = (float)framebuffer_height; }
if (clip_max.x < clip_min.x || clip_max.y < clip_min.y)
continue;
// Apply scissor/clipping rectangle
prism::Rectangle scissor;
scissor.offset.x = (int32_t)(clip_min.x);
scissor.offset.y = (int32_t)(clip_min.y);
scissor.extent.width = (uint32_t)(clip_max.x - clip_min.x);
scissor.extent.height = (uint32_t)(clip_max.y - clip_min.y);
command_buffer->set_scissor(scissor);
if(clip_rect.x < framebuffer_width && clip_rect.y < framebuffer_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f) {
command_buffer->draw_indexed(pcmd->ElemCount,
(index_offset + pcmd->IdxOffset),
(vertex_offset + pcmd->VtxOffset), 0);
}
}
}