Added scissor mode in renderer Added scissor support in imGui Mouse scroll sensivity tweaklegacy
@@ -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(); | |||