@@ -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()) | if (m_data->m_alpha_blend.HasChanged()) | ||||
g_renderer->SetBlendState(m_data->m_blend.GetValue()); | 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()) | if (!m_data->m_face_culling.HasChanged()) | ||||
m_data->m_blend.TrackValue(g_renderer->GetBlendState()); | 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); | void SetAlphaBlend(bool set); | ||||
bool GetBlendState() const; | 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) | // if (VideoData::render_mode == d && glIsEnabled(GL_CULL_FACE) == GL_TRUE) | ||||
SetFaceCulling(false); | // SetFaceCulling(false); | ||||
else | // else | ||||
SetFaceCulling(true); | // 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); | ||||