| @@ -59,7 +59,8 @@ private: | |||
| TrackedState<float> m_alpha_value; | |||
| TrackedState<BlendFunc> m_blend_src, m_blend_dst; | |||
| TrackedState<DepthFunc> m_depth_func; | |||
| TrackedState<CullMode> m_face_culling; | |||
| TrackedState<CullMode> m_cull_mode; | |||
| TrackedState<PolygonMode> m_polygon_mode; | |||
| }; | |||
| /* | |||
| @@ -93,8 +94,11 @@ RenderContext::~RenderContext() | |||
| if (m_data->m_depth_func.HasChanged()) | |||
| g_renderer->SetDepthFunc(m_data->m_depth_func.GetValue()); | |||
| if (m_data->m_face_culling.HasChanged()) | |||
| g_renderer->SetFaceCulling(m_data->m_face_culling.GetValue()); | |||
| if (m_data->m_cull_mode.HasChanged()) | |||
| g_renderer->SetCullMode(m_data->m_cull_mode.GetValue()); | |||
| if (m_data->m_polygon_mode.HasChanged()) | |||
| g_renderer->SetPolygonMode(m_data->m_polygon_mode.GetValue()); | |||
| delete m_data; | |||
| } | |||
| @@ -151,12 +155,20 @@ void RenderContext::SetDepthFunc(DepthFunc func) | |||
| g_renderer->SetDepthFunc(func); | |||
| } | |||
| void RenderContext::SetFaceCulling(CullMode mode) | |||
| void RenderContext::SetCullMode(CullMode mode) | |||
| { | |||
| if (!m_data->m_cull_mode.HasChanged()) | |||
| m_data->m_cull_mode.TrackValue(g_renderer->GetCullMode()); | |||
| g_renderer->SetCullMode(mode); | |||
| } | |||
| void RenderContext::SetPolygonMode(PolygonMode mode) | |||
| { | |||
| if (!m_data->m_face_culling.HasChanged()) | |||
| m_data->m_face_culling.TrackValue(g_renderer->GetFaceCulling()); | |||
| if (!m_data->m_polygon_mode.HasChanged()) | |||
| m_data->m_polygon_mode.TrackValue(g_renderer->GetPolygonMode()); | |||
| g_renderer->SetFaceCulling(mode); | |||
| g_renderer->SetPolygonMode(mode); | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -63,7 +63,8 @@ private: | |||
| float m_alpha_value; | |||
| BlendFunc m_blend_src, m_blend_dst; | |||
| DepthFunc m_depth_func; | |||
| CullMode m_face_culling; | |||
| CullMode m_cull_mode; | |||
| PolygonMode m_polygon_mode; | |||
| private: | |||
| #if defined USE_D3D9 | |||
| @@ -155,8 +156,11 @@ Renderer::Renderer(ivec2 size) | |||
| m_data->m_depth_func = DepthFunc::Disabled; | |||
| SetDepthFunc(DepthFunc::LessOrEqual); | |||
| m_data->m_face_culling = CullMode::Disabled; | |||
| SetFaceCulling(CullMode::CounterClockwise); | |||
| m_data->m_cull_mode = CullMode::Disabled; | |||
| SetCullMode(CullMode::CounterClockwise); | |||
| m_data->m_polygon_mode = PolygonMode::Point; | |||
| SetPolygonMode(PolygonMode::Fill); | |||
| /* Add some rendering states that we don't export to the user */ | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| @@ -600,9 +604,9 @@ DepthFunc Renderer::GetDepthFunc() const | |||
| * Face culling | |||
| */ | |||
| void Renderer::SetFaceCulling(CullMode mode) | |||
| void Renderer::SetCullMode(CullMode mode) | |||
| { | |||
| if (m_data->m_face_culling == mode) | |||
| if (m_data->m_cull_mode == mode) | |||
| return; | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| @@ -637,12 +641,57 @@ void Renderer::SetFaceCulling(CullMode mode) | |||
| } | |||
| #endif | |||
| m_data->m_face_culling = mode; | |||
| m_data->m_cull_mode = mode; | |||
| } | |||
| CullMode Renderer::GetCullMode() const | |||
| { | |||
| return m_data->m_cull_mode; | |||
| } | |||
| /* | |||
| * Polygon rendering mode | |||
| */ | |||
| void Renderer::SetPolygonMode(PolygonMode mode) | |||
| { | |||
| if (m_data->m_polygon_mode == mode) | |||
| return; | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| switch (mode) | |||
| { | |||
| case PolygonMode::Point: | |||
| m_data->m_d3d_dev->SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT); | |||
| break; | |||
| case PolygonMode::Line: | |||
| m_data->m_d3d_dev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); | |||
| break; | |||
| case PolygonMode::Fill: | |||
| m_data->m_d3d_dev->SetRenderState(D3DRS_FILLMODE, D3DCULL_SOLID); | |||
| break; | |||
| } | |||
| #else | |||
| switch (mode) | |||
| { | |||
| case PolygonMode::Point: | |||
| glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); | |||
| break; | |||
| case PolygonMode::Line: | |||
| glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | |||
| break; | |||
| case PolygonMode::Fill: | |||
| glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | |||
| break; | |||
| } | |||
| #endif | |||
| m_data->m_polygon_mode = mode; | |||
| } | |||
| CullMode Renderer::GetFaceCulling() const | |||
| PolygonMode Renderer::GetPolygonMode() const | |||
| { | |||
| return m_data->m_face_culling; | |||
| return m_data->m_polygon_mode; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -1,151 +0,0 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| // | |||
| // The Renderer class | |||
| // ------------------ | |||
| // | |||
| #if !defined __LOL_RENDERER_H__ | |||
| #define __LOL_RENDERER_H__ | |||
| namespace lol | |||
| { | |||
| class RendererData; | |||
| /* A safe enum to indicate the blending factors. */ | |||
| struct BlendFunc | |||
| { | |||
| enum Value | |||
| { | |||
| Disabled, | |||
| Zero, | |||
| One, | |||
| SrcColor, | |||
| OneMinusSrcColor, | |||
| DstColor, | |||
| OneMinusDstColor, | |||
| SrcAlpha, | |||
| OneMinusSrcAlpha, | |||
| DstAlpha, | |||
| OneMinusDstAlpha, | |||
| ConstantColor, | |||
| OneMinusConstantColor, | |||
| ConstantAlpha, | |||
| OneMinusConstantAlpha, | |||
| } | |||
| m_value; | |||
| inline BlendFunc() : m_value(Zero) {} | |||
| inline BlendFunc(Value v) : m_value(v) {} | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| /* A safe enum to indicate the face culling mode. */ | |||
| struct CullMode | |||
| { | |||
| enum Value | |||
| { | |||
| Disabled, | |||
| Clockwise, | |||
| CounterClockwise, | |||
| } | |||
| m_value; | |||
| inline CullMode() : m_value(Disabled) {} | |||
| inline CullMode(Value v) : m_value(v) {} | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| /* A safe enum to indicate the depth test mode. */ | |||
| struct DepthFunc | |||
| { | |||
| enum Value | |||
| { | |||
| Disabled, | |||
| Never, | |||
| Less, | |||
| Equal, | |||
| LessOrEqual, | |||
| Greater, | |||
| NotEqual, | |||
| GreaterOrEqual, | |||
| Always, | |||
| } | |||
| m_value; | |||
| inline DepthFunc() : m_value(Disabled) {} | |||
| inline DepthFunc(Value v) : m_value(v) {} | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| /* A safe enum to indicate the alpha test mode. */ | |||
| struct AlphaFunc | |||
| { | |||
| enum Value | |||
| { | |||
| Disabled, | |||
| Never, | |||
| Less, | |||
| Equal, | |||
| LessOrEqual, | |||
| Greater, | |||
| NotEqual, | |||
| GreaterOrEqual, | |||
| Always, | |||
| } | |||
| m_value; | |||
| inline AlphaFunc() : m_value(Disabled) {} | |||
| inline AlphaFunc(Value v) : m_value(v) {} | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| class Renderer | |||
| { | |||
| private: | |||
| /* Only the Video class can create a renderer for now. */ | |||
| friend class Video; | |||
| Renderer(); | |||
| ~Renderer(); | |||
| public: | |||
| void SetClearColor(vec4 color); | |||
| vec4 GetClearColor() const; | |||
| void SetClearDepth(float depth); | |||
| float GetClearDepth() const; | |||
| void SetAlphaFunc(AlphaFunc func, float alpha); | |||
| AlphaFunc GetAlphaFunc() const; | |||
| float GetAlphaValue() const; | |||
| void SetBlendFunc(BlendFunc src, BlendFunc dst); | |||
| BlendFunc GetBlendFuncSrc() const; | |||
| BlendFunc GetBlendFuncDst() const; | |||
| void SetDepthFunc(DepthFunc func); | |||
| DepthFunc GetDepthFunc() const; | |||
| void SetFaceCulling(CullMode mode); | |||
| CullMode GetFaceCulling() const; | |||
| private: | |||
| RendererData *m_data; | |||
| }; | |||
| extern Renderer *g_renderer; | |||
| } /* namespace lol */ | |||
| #endif // __LOL_RENDERER_H__ | |||
| @@ -33,7 +33,8 @@ public: | |||
| void SetAlphaFunc(AlphaFunc func, float alpha); | |||
| void SetBlendFunc(BlendFunc src, BlendFunc dst); | |||
| void SetDepthFunc(DepthFunc func); | |||
| void SetFaceCulling(CullMode mode); | |||
| void SetCullMode(CullMode mode); | |||
| void SetPolygonMode(PolygonMode mode); | |||
| private: | |||
| RenderContextData *m_data; | |||
| @@ -85,6 +85,22 @@ struct CullMode | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| /* A safe enum to indicate the polygon mode. */ | |||
| struct PolygonMode | |||
| { | |||
| enum Value | |||
| { | |||
| Fill, | |||
| Line, | |||
| Point, | |||
| } | |||
| m_value; | |||
| inline PolygonMode() : m_value(Fill) {} | |||
| inline PolygonMode(Value v) : m_value(v) {} | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| /* A safe enum to indicate the depth test mode. */ | |||
| struct DepthFunc | |||
| { | |||
| @@ -164,8 +180,11 @@ public: | |||
| void SetDepthFunc(DepthFunc func); | |||
| DepthFunc GetDepthFunc() const; | |||
| void SetFaceCulling(CullMode mode); | |||
| CullMode GetFaceCulling() const; | |||
| void SetCullMode(CullMode mode); | |||
| CullMode GetCullMode() const; | |||
| void SetPolygonMode(PolygonMode mode); | |||
| PolygonMode GetPolygonMode() const; | |||
| private: | |||
| RendererData *m_data; | |||
| @@ -75,7 +75,7 @@ void Video::SetDebugRenderMode(DebugRenderMode d) | |||
| // SetFaceCulling(false); | |||
| // else | |||
| // SetFaceCulling(true); | |||
| glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | |||
| // glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); | |||
| #endif | |||
| break; | |||
| } | |||
| @@ -98,7 +98,7 @@ void Video::SetDebugRenderMode(DebugRenderMode d) | |||
| #if defined USE_D3D9 || defined _XBOX | |||
| #elif defined HAVE_GLES_2X | |||
| #else | |||
| glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | |||
| // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); | |||
| #endif | |||
| break; | |||
| } | |||