@@ -85,6 +85,11 @@ static inline int isnan(float f) | |||
#endif | |||
/* XXX: workaround for X11 headers that try to #define None */ | |||
#undef None | |||
#define None None | |||
/* External declaration for LolFx files. */ | |||
#define LOLFX_RESOURCE_DECLARE(name) \ | |||
extern "C" char const *LOLFX_RESOURCE_NAME(name) | |||
@@ -61,7 +61,7 @@ private: | |||
TrackedState<BlendFactor> m_blend_dst; | |||
TrackedState<bool> m_alpha_test; | |||
TrackedState<bool> m_depth_test; | |||
TrackedState<bool> m_face_culling; | |||
TrackedState<CullMode> m_face_culling; | |||
}; | |||
/* | |||
@@ -151,12 +151,12 @@ void RenderContext::SetDepthTest(bool set) | |||
g_renderer->SetDepthTest(set); | |||
} | |||
void RenderContext::SetFaceCulling(bool set) | |||
void RenderContext::SetFaceCulling(CullMode mode) | |||
{ | |||
if (!m_data->m_face_culling.HasChanged()) | |||
m_data->m_face_culling.TrackValue(g_renderer->GetFaceCulling()); | |||
g_renderer->SetFaceCulling(set); | |||
g_renderer->SetFaceCulling(mode); | |||
} | |||
} /* namespace lol */ | |||
@@ -31,6 +31,12 @@ | |||
#include "core.h" | |||
#include "lolgl.h" | |||
#if defined USE_D3D9 | |||
extern IDirect3DDevice9 *g_d3ddevice; | |||
#elif defined _XBOX | |||
extern D3DDevice *g_d3ddevice; | |||
#endif | |||
namespace lol | |||
{ | |||
@@ -50,7 +56,14 @@ private: | |||
vec4 m_clear_color; | |||
float m_clear_depth; | |||
BlendFactor m_blend_src, m_blend_dst; | |||
bool m_alpha_blend, m_alpha_test, m_depth_test, m_face_culling; | |||
CullMode m_face_culling; | |||
bool m_alpha_blend, m_alpha_test, m_depth_test; | |||
#if defined USE_D3D9 | |||
IDirect3DDevice9 *m_d3d_dev; | |||
#elif defined _XBOX | |||
D3DDevice *m_d3d_dev; | |||
#endif | |||
}; | |||
/* | |||
@@ -61,7 +74,8 @@ Renderer::Renderer() | |||
: m_data(new RendererData()) | |||
{ | |||
#if defined USE_D3D9 || defined _XBOX | |||
/* TODO */ | |||
/* FIXME: we should be in charge of creating this */ | |||
m_data->m_d3d_dev = g_d3ddevice; | |||
#else | |||
# if defined USE_GLEW && !defined __APPLE__ | |||
/* Initialise GLEW if necessary */ | |||
@@ -94,8 +108,8 @@ Renderer::Renderer() | |||
m_data->m_depth_test = false; | |||
SetDepthTest(true); | |||
m_data->m_face_culling = false; | |||
SetFaceCulling(true); | |||
m_data->m_face_culling = CullMode::None; | |||
SetFaceCulling(CullMode::CCW); | |||
/* Add some rendering states that we don't export to the user */ | |||
#if defined USE_D3D9 || defined _XBOX | |||
@@ -349,26 +363,45 @@ bool Renderer::GetDepthTest() const | |||
* Face culling | |||
*/ | |||
void Renderer::SetFaceCulling(bool set) | |||
void Renderer::SetFaceCulling(CullMode mode) | |||
{ | |||
if (m_data->m_face_culling == set) | |||
if (m_data->m_face_culling == mode) | |||
return; | |||
#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") | |||
switch (mode) | |||
{ | |||
case CullMode::None: | |||
m_data->m_d3d_dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); | |||
break; | |||
case CullMode::CW: | |||
m_data->m_d3d_dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); | |||
break; | |||
case CullMode::CCW: | |||
m_data->m_d3d_dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); | |||
break; | |||
} | |||
#else | |||
if (set) | |||
glEnable(GL_CULL_FACE); | |||
else | |||
switch (mode) | |||
{ | |||
case CullMode::None: | |||
glDisable(GL_CULL_FACE); | |||
break; | |||
case CullMode::CW: | |||
glEnable(GL_CULL_FACE); | |||
glFrontFace(GL_CW); | |||
break; | |||
case CullMode::CCW: | |||
glEnable(GL_CULL_FACE); | |||
glFrontFace(GL_CCW); | |||
break; | |||
} | |||
#endif | |||
m_data->m_face_culling = set; | |||
m_data->m_face_culling = mode; | |||
} | |||
bool Renderer::GetFaceCulling() const | |||
CullMode Renderer::GetFaceCulling() const | |||
{ | |||
return m_data->m_face_culling; | |||
} | |||
@@ -127,8 +127,6 @@ void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) | |||
return; | |||
#if defined _XBOX || defined USE_D3D9 | |||
if (FAILED(g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW))) | |||
Abort(); | |||
switch (type) | |||
{ | |||
case MeshPrimitive::Triangles: | |||
@@ -159,8 +157,6 @@ void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) | |||
} | |||
#else | |||
/* FIXME: this has nothing to do here! */ | |||
glFrontFace(GL_CCW); | |||
switch (type) | |||
{ | |||
case MeshPrimitive::Triangles: | |||
@@ -190,8 +186,6 @@ void VertexDeclaration::DrawIndexedElements(MeshPrimitive type, int vbase, | |||
return; | |||
#if defined _XBOX || defined USE_D3D9 | |||
if (FAILED(g_d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW))) | |||
Abort(); | |||
switch (type) | |||
{ | |||
case MeshPrimitive::Triangles: | |||
@@ -225,8 +219,6 @@ void VertexDeclaration::DrawIndexedElements(MeshPrimitive type, int vbase, | |||
} | |||
#else | |||
/* FIXME: this has nothing to do here! */ | |||
glFrontFace(GL_CCW); | |||
switch (type) | |||
{ | |||
case MeshPrimitive::Triangles: | |||
@@ -33,7 +33,7 @@ public: | |||
void SetBlendFunc(BlendFactor src, BlendFactor dst); | |||
void SetAlphaTest(bool set); | |||
void SetDepthTest(bool set); | |||
void SetFaceCulling(bool set); | |||
void SetFaceCulling(CullMode mode); | |||
private: | |||
RenderContextData *m_data; | |||
@@ -48,6 +48,22 @@ struct BlendFactor | |||
inline operator Value() { return m_value; } | |||
}; | |||
/* A safe enum to indicate the face culling mode. */ | |||
struct CullMode | |||
{ | |||
enum Value | |||
{ | |||
None, | |||
CW, | |||
CCW, | |||
} | |||
m_value; | |||
inline CullMode() : m_value(None) {} | |||
inline CullMode(Value v) : m_value(v) {} | |||
inline operator Value() { return m_value; } | |||
}; | |||
class Renderer | |||
{ | |||
private: | |||
@@ -77,8 +93,8 @@ public: | |||
void SetDepthTest(bool set); | |||
bool GetDepthTest() const; | |||
void SetFaceCulling(bool set); | |||
bool GetFaceCulling() const; | |||
void SetFaceCulling(CullMode mode); | |||
CullMode GetFaceCulling() const; | |||
private: | |||
RendererData *m_data; | |||
@@ -180,7 +180,7 @@ void Video::SetDebugRenderMode(DebugRenderMode d) | |||
{ | |||
#if defined USE_D3D9 || defined _XBOX | |||
#elif defined HAVE_GLES_2X | |||
glEnable(GL_CULL_FACE); | |||
// glEnable(GL_CULL_FACE); | |||
#else | |||
// if (VideoData::render_mode == d && glIsEnabled(GL_CULL_FACE) == GL_TRUE) | |||
// SetFaceCulling(false); | |||