| @@ -59,6 +59,8 @@ private: | |||
| TrackedState<DepthMask> m_depth_mask; | |||
| TrackedState<CullMode> m_cull_mode; | |||
| TrackedState<PolygonMode> m_polygon_mode; | |||
| TrackedState<ScissorMode> m_scissor_mode; | |||
| TrackedState<vec4> m_scissor_rect; | |||
| }; | |||
| /* | |||
| @@ -101,6 +103,9 @@ RenderContext::~RenderContext() | |||
| if (m_data->m_polygon_mode.HasChanged()) | |||
| Renderer::Get()->SetPolygonMode(m_data->m_polygon_mode.GetValue()); | |||
| if (m_data->m_scissor_mode.HasChanged()) | |||
| Renderer::Get()->SetScissorMode(m_data->m_scissor_mode.GetValue()); | |||
| delete m_data; | |||
| } | |||
| @@ -255,5 +260,31 @@ PolygonMode RenderContext::GetPolygonMode() | |||
| return Renderer::Get()->GetPolygonMode(); | |||
| } | |||
| void RenderContext::SetScissorMode(ScissorMode mode) | |||
| { | |||
| if (!m_data->m_scissor_mode.HasChanged()) | |||
| m_data->m_scissor_mode.TrackValue(Renderer::Get()->GetScissorMode()); | |||
| Renderer::Get()->SetScissorMode(mode); | |||
| } | |||
| void RenderContext::SetScissorRect(vec4 rect) | |||
| { | |||
| if (!m_data->m_scissor_rect.HasChanged()) | |||
| m_data->m_scissor_rect.TrackValue(Renderer::Get()->GetScissorRect()); | |||
| Renderer::Get()->SetScissorRect(rect); | |||
| } | |||
| ScissorMode RenderContext::GetScissorMode() | |||
| { | |||
| return Renderer::Get()->GetScissorMode(); | |||
| } | |||
| vec4 RenderContext::GetScissorRect() | |||
| { | |||
| return Renderer::Get()->GetScissorRect(); | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -54,6 +54,8 @@ private: | |||
| DepthMask m_depth_mask; | |||
| CullMode m_cull_mode; | |||
| PolygonMode m_polygon_mode; | |||
| ScissorMode m_scissor_mode; | |||
| vec4 m_scissor_rect; | |||
| }; | |||
| /* | |||
| @@ -107,6 +109,9 @@ Renderer::Renderer(ivec2 size) | |||
| m_data->m_polygon_mode = PolygonMode::Point; | |||
| SetPolygonMode(PolygonMode::Fill); | |||
| m_data->m_scissor_mode = ScissorMode::Disabled; | |||
| SetPolygonMode(PolygonMode::Fill); | |||
| /* Add some rendering states that we don't export to the user */ | |||
| #if defined HAVE_GL_2X && !defined __APPLE__ | |||
| glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); | |||
| @@ -548,5 +553,42 @@ PolygonMode Renderer::GetPolygonMode() const | |||
| return m_data->m_polygon_mode; | |||
| } | |||
| /* | |||
| * Scissor test mode | |||
| */ | |||
| void Renderer::SetScissorMode(ScissorMode mode) | |||
| { | |||
| if (m_data->m_scissor_mode == mode) | |||
| return; | |||
| if (mode == ScissorMode::Enabled) | |||
| glEnable(GL_SCISSOR_TEST); | |||
| else | |||
| glDisable(GL_SCISSOR_TEST); | |||
| m_data->m_scissor_mode = mode; | |||
| } | |||
| void Renderer::SetScissorRect(vec4 rect) | |||
| { | |||
| m_data->m_scissor_rect = rect; | |||
| if (m_data->m_scissor_mode == ScissorMode::Enabled) | |||
| { | |||
| glScissor((int)rect.x, (int)Video::GetSize().y - rect.w, (int)(rect.z - rect.x), (int)(rect.w - rect.y)); | |||
| //glScissor((int)rect.x, (int)rect.y, (int)(rect.z - rect.x), (int)(rect.w - rect.y)); | |||
| } | |||
| } | |||
| ScissorMode Renderer::GetScissorMode() const | |||
| { | |||
| return m_data->m_scissor_mode; | |||
| } | |||
| vec4 Renderer::GetScissorRect() const | |||
| { | |||
| return m_data->m_scissor_rect; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -114,7 +114,7 @@ InputDeviceInternal* InputDeviceInternal::CreateStandardMouse() | |||
| mouse->AddAxis(g_name_mouse_axis_y.C()); | |||
| mouse->AddAxis(g_name_mouse_axis_xpixel.C()); | |||
| mouse->AddAxis(g_name_mouse_axis_ypixel.C()); | |||
| mouse->AddAxis(g_name_mouse_axis_scroll.C()); | |||
| mouse->AddAxis(g_name_mouse_axis_scroll.C(), .0000001f); | |||
| mouse->AddCursor(g_name_mouse_cursor.C()); | |||
| @@ -36,6 +36,8 @@ public: | |||
| void SetDepthMask(DepthMask mask); | |||
| void SetCullMode(CullMode mode); | |||
| void SetPolygonMode(PolygonMode mode); | |||
| void SetScissorMode(ScissorMode mode); | |||
| void SetScissorRect(vec4 rect); | |||
| ibox2 GetViewport(); | |||
| vec4 GetClearColor(); | |||
| @@ -50,6 +52,8 @@ public: | |||
| DepthMask GetDepthMask(); | |||
| CullMode GetCullMode(); | |||
| PolygonMode GetPolygonMode(); | |||
| ScissorMode GetScissorMode(); | |||
| vec4 GetScissorRect(); | |||
| private: | |||
| RenderContextData *m_data; | |||
| @@ -123,6 +123,13 @@ enum class AlphaFunc : uint8_t | |||
| Always, | |||
| }; | |||
| /* A safe enum to indicate the depth mask. */ | |||
| enum class ScissorMode : uint8_t | |||
| { | |||
| Disabled, | |||
| Enabled, | |||
| }; | |||
| class Renderer | |||
| { | |||
| private: | |||
| @@ -176,6 +183,11 @@ public: | |||
| void SetPolygonMode(PolygonMode mode); | |||
| PolygonMode GetPolygonMode() const; | |||
| void SetScissorMode(ScissorMode mode); | |||
| void SetScissorRect(vec4 rect); | |||
| ScissorMode GetScissorMode() const; | |||
| vec4 GetScissorRect() const; | |||
| private: | |||
| RendererData *m_data; | |||
| }; | |||
| @@ -366,6 +366,7 @@ void LolImGui::RenderDrawListsMethod(ImDrawData* draw_data) | |||
| RenderContext rc; | |||
| rc.SetCullMode(CullMode::Disabled); | |||
| rc.SetDepthFunc(DepthFunc::Disabled); | |||
| rc.SetScissorMode(ScissorMode::Enabled); | |||
| m_shader->Bind(); | |||
| for (int n = 0; n < draw_data->CmdListsCount; n++) | |||
| @@ -402,6 +403,11 @@ void LolImGui::RenderDrawListsMethod(ImDrawData* draw_data) | |||
| for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) | |||
| { | |||
| const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[(int)cmd_i]; | |||
| TextureImage* image = (TextureImage*)pcmd->TextureId; | |||
| if (image) image->Bind(); | |||
| rc.SetScissorRect(vec4(pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w)); | |||
| #ifdef SHOW_IMGUI_DEBUG | |||
| //----------------------------------------------------------------- | |||
| //<Debug render> -------------------------------------------------- | |||
| @@ -448,6 +454,8 @@ void LolImGui::RenderDrawListsMethod(ImDrawData* draw_data) | |||
| m_vdecl->DrawIndexedElements(MeshPrimitive::Triangles, pcmd->ElemCount, (const short*)idx_buffer_offset); | |||
| idx_buffer_offset += pcmd->ElemCount; | |||
| if (image) image->Unbind(); | |||
| } | |||
| m_vdecl->Unbind(); | |||