| @@ -58,7 +58,7 @@ class RenderContextData | |||||
| private: | private: | ||||
| Scene *m_scene; | Scene *m_scene; | ||||
| TrackedState m_blend; | |||||
| TrackedState m_alpha_blend, m_depth_test, m_face_culling; | |||||
| }; | }; | ||||
| /* | /* | ||||
| @@ -73,18 +73,40 @@ RenderContext::RenderContext() | |||||
| RenderContext::~RenderContext() | RenderContext::~RenderContext() | ||||
| { | { | ||||
| if (m_data->m_blend.HasChanged()) | |||||
| g_renderer->SetBlendState(m_data->m_blend.GetValue()); | |||||
| if (m_data->m_alpha_blend.HasChanged()) | |||||
| g_renderer->SetAlphaBlend(m_data->m_alpha_blend.GetValue()); | |||||
| if (m_data->m_depth_test.HasChanged()) | |||||
| g_renderer->SetDepthTest(m_data->m_depth_test.GetValue()); | |||||
| if (m_data->m_face_culling.HasChanged()) | |||||
| g_renderer->SetFaceCulling(m_data->m_face_culling.GetValue()); | |||||
| delete m_data; | delete m_data; | ||||
| } | } | ||||
| void RenderContext::SetBlendState(bool set) | |||||
| void RenderContext::SetAlphaBlend(bool set) | |||||
| { | |||||
| if (!m_data->m_alpha_blend.HasChanged()) | |||||
| m_data->m_alpha_blend.TrackValue(g_renderer->GetAlphaBlend()); | |||||
| g_renderer->SetAlphaBlend(set); | |||||
| } | |||||
| void RenderContext::SetDepthTest(bool set) | |||||
| { | |||||
| if (!m_data->m_depth_test.HasChanged()) | |||||
| m_data->m_depth_test.TrackValue(g_renderer->GetDepthTest()); | |||||
| g_renderer->SetDepthTest(set); | |||||
| } | |||||
| void RenderContext::SetFaceCulling(bool set) | |||||
| { | { | ||||
| if (!m_data->m_blend.HasChanged()) | |||||
| m_data->m_blend.TrackValue(g_renderer->GetBlendState()); | |||||
| if (!m_data->m_face_culling.HasChanged()) | |||||
| m_data->m_face_culling.TrackValue(g_renderer->GetFaceCulling()); | |||||
| g_renderer->SetBlendState(set); | |||||
| g_renderer->SetFaceCulling(set); | |||||
| } | } | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -14,7 +14,22 @@ | |||||
| #include <cstdlib> | #include <cstdlib> | ||||
| #if defined _XBOX | |||||
| # include <xtl.h> | |||||
| # undef near /* Fuck Microsoft */ | |||||
| # undef far /* Fuck Microsoft again */ | |||||
| #elif defined _WIN32 | |||||
| # if defined USE_D3D9 | |||||
| # include <d3d9.h> | |||||
| # endif | |||||
| # define WIN32_LEAN_AND_MEAN | |||||
| # include <windows.h> | |||||
| # undef near /* Fuck Microsoft */ | |||||
| # undef far /* Fuck Microsoft again */ | |||||
| #endif | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "lolgl.h" | |||||
| namespace lol | namespace lol | ||||
| { | { | ||||
| @@ -32,7 +47,7 @@ class RendererData | |||||
| friend class Renderer; | friend class Renderer; | ||||
| private: | private: | ||||
| bool m_blend; | |||||
| bool m_blend, m_depth_test, m_face_culling; | |||||
| }; | }; | ||||
| /* | /* | ||||
| @@ -43,6 +58,13 @@ Renderer::Renderer() | |||||
| : m_data(new RendererData()) | : m_data(new RendererData()) | ||||
| { | { | ||||
| m_data->m_blend = false; | m_data->m_blend = false; | ||||
| SetAlphaBlend(true); | |||||
| m_data->m_depth_test = false; | |||||
| SetDepthTest(true); | |||||
| m_data->m_face_culling = false; | |||||
| SetFaceCulling(true); | |||||
| } | } | ||||
| Renderer::~Renderer() | Renderer::~Renderer() | ||||
| @@ -50,25 +72,88 @@ Renderer::~Renderer() | |||||
| delete m_data; | delete m_data; | ||||
| } | } | ||||
| void Renderer::SetBlendState(bool set) | |||||
| /* | |||||
| * Alpha blending | |||||
| */ | |||||
| void Renderer::SetAlphaBlend(bool set) | |||||
| { | { | ||||
| if (m_data->m_blend == set) | if (m_data->m_blend == set) | ||||
| return; | return; | ||||
| m_data->m_blend = set; | m_data->m_blend = set; | ||||
| #if defined USE_D3D9 || defined _XBOX | |||||
| # define STR0(x) #x | |||||
| # define STR(x) STR0(x) | |||||
| # pragma message(__FILE__ "(" STR(__LINE__) "): warning: Renderer::SetAlphaBlend() not implemented") | |||||
| #else | |||||
| if (set) | if (set) | ||||
| { | |||||
| glEnable(GL_BLEND); | |||||
| else | |||||
| glDisable(GL_BLEND); | |||||
| #endif | |||||
| } | |||||
| bool Renderer::GetAlphaBlend() const | |||||
| { | |||||
| return m_data->m_blend; | |||||
| } | |||||
| } | |||||
| /* | |||||
| * Depth test | |||||
| */ | |||||
| void Renderer::SetDepthTest(bool set) | |||||
| { | |||||
| if (m_data->m_depth_test == set) | |||||
| return; | |||||
| m_data->m_depth_test = set; | |||||
| #if defined USE_D3D9 || defined _XBOX | |||||
| # define STR0(x) #x | |||||
| # define STR(x) STR0(x) | |||||
| # pragma message(__FILE__ "(" STR(__LINE__) "): warning: Renderer::SetDepthTest() not implemented") | |||||
| #else | |||||
| if (set) | |||||
| glEnable(GL_DEPTH_TEST); | |||||
| else | else | ||||
| { | |||||
| glDisable(GL_DEPTH_TEST); | |||||
| #endif | |||||
| } | |||||
| } | |||||
| bool Renderer::GetDepthTest() const | |||||
| { | |||||
| return m_data->m_depth_test; | |||||
| } | } | ||||
| bool Renderer::GetBlendState() const | |||||
| /* | |||||
| * Face culling | |||||
| */ | |||||
| void Renderer::SetFaceCulling(bool set) | |||||
| { | { | ||||
| return m_data->m_blend; | |||||
| if (m_data->m_face_culling == set) | |||||
| return; | |||||
| m_data->m_face_culling = set; | |||||
| #if defined USE_D3D9 || defined _XBOX | |||||
| # define STR0(x) #x | |||||
| # define STR(x) STR0(x) | |||||
| # pragma message(__FILE__ "(" STR(__LINE__) "): warning: Renderer::SetFaceCulling() not implemented") | |||||
| #else | |||||
| if (set) | |||||
| glEnable(GL_CULL_FACE); | |||||
| else | |||||
| glDisable(GL_CULL_FACE); | |||||
| #endif | |||||
| } | |||||
| bool Renderer::GetFaceCulling() const | |||||
| { | |||||
| return m_data->m_face_culling; | |||||
| } | } | ||||
| } /* namespace lol */ | } /* namespace lol */ | ||||
| @@ -27,7 +27,9 @@ public: | |||||
| RenderContext(); | RenderContext(); | ||||
| ~RenderContext(); | ~RenderContext(); | ||||
| void SetBlendState(bool set); | |||||
| void SetAlphaBlend(bool set); | |||||
| void SetDepthTest(bool set); | |||||
| void SetFaceCulling(bool set); | |||||
| private: | private: | ||||
| RenderContextData *m_data; | RenderContextData *m_data; | ||||
| @@ -27,8 +27,14 @@ public: | |||||
| Renderer(); | Renderer(); | ||||
| ~Renderer(); | ~Renderer(); | ||||
| void SetBlendState(bool set); | |||||
| bool GetBlendState() const; | |||||
| void SetAlphaBlend(bool set); | |||||
| bool GetAlphaBlend() const; | |||||
| void SetDepthTest(bool set); | |||||
| bool GetDepthTest() const; | |||||
| void SetFaceCulling(bool set); | |||||
| bool GetFaceCulling() const; | |||||
| private: | private: | ||||
| RendererData *m_data; | RendererData *m_data; | ||||
| @@ -389,11 +389,7 @@ void TickerData::DrawThreadTick() | |||||
| Scene::GetDefault()->Reset(); | Scene::GetDefault()->Reset(); | ||||
| Video::Clear(ClearMask::All); | Video::Clear(ClearMask::All); | ||||
| break; | break; | ||||
| case Entity::DRAWGROUP_HUD: | |||||
| Video::SetDepth(false); | |||||
| break; | |||||
| default: | default: | ||||
| Video::SetDepth(true); | |||||
| break; | break; | ||||
| } | } | ||||
| @@ -52,8 +52,6 @@ private: | |||||
| static mat4 proj_matrix; | static mat4 proj_matrix; | ||||
| static ivec2 saved_viewport; | static ivec2 saved_viewport; | ||||
| static DebugRenderMode render_mode; | static DebugRenderMode render_mode; | ||||
| static bool face_culling; | |||||
| static bool alpha_blend; | |||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| # if defined USE_D3D9 | # if defined USE_D3D9 | ||||
| static IDirect3D9 *d3d_ctx; | static IDirect3D9 *d3d_ctx; | ||||
| @@ -70,8 +68,6 @@ private: | |||||
| mat4 VideoData::proj_matrix; | mat4 VideoData::proj_matrix; | ||||
| ivec2 VideoData::saved_viewport(0, 0); | ivec2 VideoData::saved_viewport(0, 0); | ||||
| DebugRenderMode VideoData::render_mode = DebugRenderMode::Default; | DebugRenderMode VideoData::render_mode = DebugRenderMode::Default; | ||||
| bool VideoData::face_culling = true; | |||||
| bool VideoData::alpha_blend = true; | |||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| # if defined USE_D3D9 | # if defined USE_D3D9 | ||||
| @@ -91,8 +87,6 @@ float VideoData::clear_depth; | |||||
| void Video::Setup(ivec2 size) | void Video::Setup(ivec2 size) | ||||
| { | { | ||||
| g_renderer = new Renderer(); | |||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| VideoData::d3d_ctx = Direct3DCreate9(D3D_SDK_VERSION); | VideoData::d3d_ctx = Direct3DCreate9(D3D_SDK_VERSION); | ||||
| if (!VideoData::d3d_ctx) | if (!VideoData::d3d_ctx) | ||||
| @@ -158,10 +152,11 @@ void Video::Setup(ivec2 size) | |||||
| # endif | # endif | ||||
| #endif | #endif | ||||
| g_renderer = new Renderer(); | |||||
| /* Initialise reasonable scene default properties */ | /* Initialise reasonable scene default properties */ | ||||
| SetClearColor(vec4(0.1f, 0.2f, 0.3f, 1.0f)); | SetClearColor(vec4(0.1f, 0.2f, 0.3f, 1.0f)); | ||||
| SetClearDepth(1.f); | SetClearDepth(1.f); | ||||
| SetAlphaBlend(true); | |||||
| SetDebugRenderMode(DebugRenderMode::Default); | SetDebugRenderMode(DebugRenderMode::Default); | ||||
| } | } | ||||
| @@ -238,60 +233,6 @@ void Video::SetFov(float theta) | |||||
| } | } | ||||
| } | } | ||||
| void Video::SetDepth(bool set) | |||||
| { | |||||
| #if defined USE_D3D9 || defined _XBOX | |||||
| # define STR0(x) #x | |||||
| # define STR(x) STR0(x) | |||||
| # pragma message(__FILE__ "(" STR(__LINE__) "): warning: Video::SetDepth() not implemented") | |||||
| #else | |||||
| if (set) | |||||
| glEnable(GL_DEPTH_TEST); | |||||
| else | |||||
| glDisable(GL_DEPTH_TEST); | |||||
| #endif | |||||
| } | |||||
| void Video::SetFaceCulling(bool set) | |||||
| { | |||||
| #if defined USE_D3D9 || defined _XBOX | |||||
| # define STR0(x) #x | |||||
| # define STR(x) STR0(x) | |||||
| # pragma message(__FILE__ "(" STR(__LINE__) "): warning: Video::SetFaceCulling() not implemented") | |||||
| #else | |||||
| VideoData::face_culling = set; | |||||
| if (set) | |||||
| glEnable(GL_CULL_FACE); | |||||
| else | |||||
| glDisable(GL_CULL_FACE); | |||||
| #endif | |||||
| } | |||||
| bool Video::HasFaceCulling() | |||||
| { | |||||
| return VideoData::face_culling; | |||||
| } | |||||
| void Video::SetAlphaBlend(bool set) | |||||
| { | |||||
| #if defined USE_D3D9 || defined _XBOX | |||||
| # define STR0(x) #x | |||||
| # define STR(x) STR0(x) | |||||
| # pragma message(__FILE__ "(" STR(__LINE__) "): warning: Video::SetAlphaBlend() not implemented") | |||||
| #else | |||||
| VideoData::alpha_blend = set; | |||||
| if (set) | |||||
| glEnable(GL_BLEND); | |||||
| else | |||||
| glDisable(GL_BLEND); | |||||
| #endif | |||||
| } | |||||
| bool Video::HasAlphaBlend() | |||||
| { | |||||
| return VideoData::alpha_blend; | |||||
| } | |||||
| void Video::SetClearColor(vec4 color) | void Video::SetClearColor(vec4 color) | ||||
| { | { | ||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| @@ -328,10 +269,10 @@ void Video::SetDebugRenderMode(DebugRenderMode d) | |||||
| #elif defined HAVE_GLES_2X | #elif defined HAVE_GLES_2X | ||||
| glEnable(GL_CULL_FACE); | glEnable(GL_CULL_FACE); | ||||
| #else | #else | ||||
| if (VideoData::render_mode == d && glIsEnabled(GL_CULL_FACE) == GL_TRUE) | |||||
| SetFaceCulling(false); | |||||
| else | |||||
| SetFaceCulling(true); | |||||
| // if (VideoData::render_mode == d && glIsEnabled(GL_CULL_FACE) == GL_TRUE) | |||||
| // SetFaceCulling(false); | |||||
| // else | |||||
| // SetFaceCulling(true); | |||||
| glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | ||||
| #endif | #endif | ||||
| break; | break; | ||||
| @@ -342,14 +283,14 @@ void Video::SetDebugRenderMode(DebugRenderMode d) | |||||
| { | { | ||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| #else | #else | ||||
| SetFaceCulling(!VideoData::face_culling); | |||||
| // SetFaceCulling(!VideoData::face_culling); | |||||
| #endif | #endif | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| #else | #else | ||||
| SetFaceCulling(false); | |||||
| // SetFaceCulling(false); | |||||
| #endif | #endif | ||||
| } | } | ||||
| #if defined USE_D3D9 || defined _XBOX | #if defined USE_D3D9 || defined _XBOX | ||||
| @@ -71,11 +71,6 @@ public: | |||||
| static void SetCustomSize(ivec2 size); | static void SetCustomSize(ivec2 size); | ||||
| static void RestoreSize(); | static void RestoreSize(); | ||||
| static void SetFov(float theta); | static void SetFov(float theta); | ||||
| static void SetDepth(bool set); | |||||
| static void SetFaceCulling(bool set); | |||||
| static bool HasFaceCulling(); | |||||
| static void SetAlphaBlend(bool set); | |||||
| static bool HasAlphaBlend(); | |||||
| static void SetClearColor(vec4 color); | static void SetClearColor(vec4 color); | ||||
| static void SetClearDepth(float f); | static void SetClearDepth(float f); | ||||
| static void SetDebugRenderMode(DebugRenderMode d); | static void SetDebugRenderMode(DebugRenderMode d); | ||||