diff --git a/src/engine/renderer/opengl/renderer_opengl.cc b/src/engine/renderer/opengl/renderer_opengl.cc index 192b793..cb1e40a 100644 --- a/src/engine/renderer/opengl/renderer_opengl.cc +++ b/src/engine/renderer/opengl/renderer_opengl.cc @@ -58,6 +58,17 @@ int RendererOpenGL::GetScreenHeight() const { return screen_height_; } +void RendererOpenGL::SetScissor(int x, int y, int width, int height) { + DCHECK(x >= 0 && y >= 0 && width >= 0 && height >= 0); + DCHECK(x + width <= GetScreenWidth() && y + height <= GetScreenHeight()); + glScissor(x, screen_height_ - y - height, width, height); + glEnable(GL_SCISSOR_TEST); +} + +void RendererOpenGL::ResetScissor() { + glDisable(GL_SCISSOR_TEST); +} + uint64_t RendererOpenGL::CreateGeometry(std::unique_ptr mesh) { // Verify that we have a valid layout and get the total byte size per vertex. GLuint vertex_size = mesh->GetVertexSize(); @@ -417,6 +428,10 @@ void RendererOpenGL::SetUniform(uint64_t resource_id, glUniform1i(index, val); } +void RendererOpenGL::PrepareForDrawing() { + glDisable(GL_SCISSOR_TEST); +} + void RendererOpenGL::ContextLost() { LOG(0) << "Context lost."; diff --git a/src/engine/renderer/opengl/renderer_opengl.h b/src/engine/renderer/opengl/renderer_opengl.h index ba82232..6fde45a 100644 --- a/src/engine/renderer/opengl/renderer_opengl.h +++ b/src/engine/renderer/opengl/renderer_opengl.h @@ -31,6 +31,9 @@ class RendererOpenGL final : public Renderer { int GetScreenWidth() const final; int GetScreenHeight() const final; + void SetScissor(int x, int y, int width, int height) final; + void ResetScissor() final; + uint64_t CreateGeometry(std::unique_ptr mesh) final; void DestroyGeometry(uint64_t resource_id) final; void Draw(uint64_t resource_id, @@ -67,7 +70,7 @@ class RendererOpenGL final : public Renderer { void SetUniform(uint64_t resource_id, const std::string& name, int val) final; void UploadUniforms(uint64_t resource_id) final {} - void PrepareForDrawing() final {} + void PrepareForDrawing() final; void Present() final; size_t GetAndResetFPS() final; diff --git a/src/engine/renderer/renderer.h b/src/engine/renderer/renderer.h index ddb2568..f9a5e4f 100644 --- a/src/engine/renderer/renderer.h +++ b/src/engine/renderer/renderer.h @@ -38,6 +38,9 @@ class Renderer { virtual int GetScreenWidth() const = 0; virtual int GetScreenHeight() const = 0; + virtual void SetScissor(int x, int y, int width, int height) = 0; + virtual void ResetScissor() = 0; + virtual uint64_t CreateGeometry(std::unique_ptr mesh) = 0; virtual void DestroyGeometry(uint64_t resource_id) = 0; virtual void Draw(uint64_t resource_id, diff --git a/src/engine/renderer/vulkan/renderer_vulkan.cc b/src/engine/renderer/vulkan/renderer_vulkan.cc index be3ed73..ff37b90 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan.cc +++ b/src/engine/renderer/vulkan/renderer_vulkan.cc @@ -390,6 +390,27 @@ int RendererVulkan::GetScreenHeight() const { return context_.GetWindowHeight(); } +void RendererVulkan::SetScissor(int x, int y, int width, int height) { + DCHECK(x >= 0 && y >= 0 && width >= 0 && height >= 0); + DCHECK(x + width <= GetScreenWidth() && y + height <= GetScreenHeight()); + + VkRect2D scissor; + scissor.offset.x = x; + scissor.offset.y = y; + scissor.extent.width = width; + scissor.extent.height = height; + vkCmdSetScissor(frames_[current_frame_].draw_command_buffer, 0, 1, &scissor); +} + +void RendererVulkan::ResetScissor() { + VkRect2D scissor; + scissor.offset.x = 0; + scissor.offset.y = 0; + scissor.extent.width = context_.GetWindowWidth(); + scissor.extent.height = context_.GetWindowHeight(); + vkCmdSetScissor(frames_[current_frame_].draw_command_buffer, 0, 1, &scissor); +} + uint64_t RendererVulkan::CreateGeometry(std::unique_ptr mesh) { auto& geometry = geometries_[++last_resource_id_] = {}; diff --git a/src/engine/renderer/vulkan/renderer_vulkan.h b/src/engine/renderer/vulkan/renderer_vulkan.h index 9d749ce..ed4de22 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan.h +++ b/src/engine/renderer/vulkan/renderer_vulkan.h @@ -33,6 +33,9 @@ class RendererVulkan final : public Renderer { int GetScreenWidth() const final; int GetScreenHeight() const final; + void SetScissor(int x, int y, int width, int height) final; + void ResetScissor() final; + uint64_t CreateGeometry(std::unique_ptr mesh) final; void DestroyGeometry(uint64_t resource_id) final; void Draw(uint64_t resource_id,