@@ -130,6 +130,39 @@ Renderer::~Renderer() | |||
delete m_data; | |||
} | |||
/* | |||
* Buffer clearing | |||
*/ | |||
void Renderer::Clear(ClearMask mask) | |||
{ | |||
#if defined USE_D3D9 || defined _XBOX | |||
int m = 0; | |||
if (mask & ClearMask::Color) | |||
m |= D3DCLEAR_TARGET; | |||
if (mask & ClearMask::Depth) | |||
m |= D3DCLEAR_ZBUFFER; | |||
if (mask & ClearMask::Stencil) | |||
m |= D3DCLEAR_STENCIL; | |||
vec3 tmp = 255.999f * GetClearColor().rgb; | |||
D3DCOLOR clear_color = D3DCOLOR_XRGB((int)tmp.r, (int)tmp.g, (int)tmp.b); | |||
if (FAILED(VideoData::d3d_dev->Clear(0, nullptr, m, clear_color, | |||
g_renderer->GetClearDepth(), 0))) | |||
Abort(); | |||
#else | |||
GLbitfield m = 0; | |||
if (mask & ClearMask::Color) | |||
m |= GL_COLOR_BUFFER_BIT; | |||
if (mask & ClearMask::Depth) | |||
m |= GL_DEPTH_BUFFER_BIT; | |||
if (mask & ClearMask::Stencil) | |||
m |= GL_STENCIL_BUFFER_BIT; | |||
glClear(m); | |||
#endif | |||
} | |||
/* | |||
* Viewport dimensions | |||
*/ | |||
@@ -21,6 +21,26 @@ namespace lol | |||
class RendererData; | |||
/* A list of bitmasks to clear a render buffer. */ | |||
struct ClearMask | |||
{ | |||
enum Value | |||
{ | |||
/* Note: D3D9 doesn't appear to support the accumulation buffer, | |||
* and it is a deprecated OpenGL feature. No reason to support it. */ | |||
Color = 1 << 0, | |||
Depth = 1 << 1, | |||
Stencil = 1 << 2, | |||
All = 0xffffffff | |||
} | |||
m_value; | |||
inline ClearMask(Value v) : m_value(v) {} | |||
inline ClearMask(uint64_t i) : m_value((Value)i) {} | |||
inline operator Value() { return m_value; } | |||
}; | |||
/* A safe enum to indicate the blending factors. */ | |||
struct BlendFunc | |||
{ | |||
@@ -118,6 +138,9 @@ private: | |||
Renderer(ivec2 size); | |||
~Renderer(); | |||
public: | |||
void Clear(ClearMask mask); | |||
public: | |||
void SetViewport(ibox2 viewport); | |||
ibox2 GetViewport() const; | |||
@@ -387,7 +387,7 @@ void TickerData::DrawThreadTick() | |||
{ | |||
case Entity::DRAWGROUP_BEGIN: | |||
Scene::GetDefault()->Reset(); | |||
Video::Clear(ClearMask::All); | |||
g_renderer->Clear(ClearMask::All); | |||
break; | |||
default: | |||
break; | |||
@@ -185,36 +185,6 @@ DebugRenderMode Video::GetDebugRenderMode() | |||
return VideoData::render_mode; | |||
} | |||
void Video::Clear(ClearMask m) | |||
{ | |||
#if defined USE_D3D9 || defined _XBOX | |||
int mask = 0; | |||
if (m & ClearMask::Color) | |||
mask |= D3DCLEAR_TARGET; | |||
if (m & ClearMask::Depth) | |||
mask |= D3DCLEAR_ZBUFFER; | |||
if (m & ClearMask::Stencil) | |||
mask |= D3DCLEAR_STENCIL; | |||
vec4 tmp = 255.999f * g_renderer->GetClearColor(); | |||
D3DCOLOR clear_color = D3DCOLOR_XRGB((int)tmp.r, (int)tmp.g, (int)tmp.b); | |||
if (FAILED(VideoData::d3d_dev->Clear(0, nullptr, mask, | |||
clear_color, | |||
g_renderer->GetClearDepth(), 0))) | |||
Abort(); | |||
#else | |||
GLbitfield mask = 0; | |||
if (m & ClearMask::Color) | |||
mask |= GL_COLOR_BUFFER_BIT; | |||
if (m & ClearMask::Depth) | |||
mask |= GL_DEPTH_BUFFER_BIT; | |||
if (m & ClearMask::Stencil) | |||
mask |= GL_STENCIL_BUFFER_BIT; | |||
glClear(mask); | |||
#endif | |||
} | |||
void Video::Destroy() | |||
{ | |||
delete g_renderer; | |||
@@ -22,25 +22,6 @@ | |||
namespace lol | |||
{ | |||
struct ClearMask | |||
{ | |||
enum Value | |||
{ | |||
/* Note: D3D9 doesn't appear to support the accumulation buffer, | |||
* and it is a deprecated OpenGL feature. No reason to support it. */ | |||
Color = 1 << 0, | |||
Depth = 1 << 1, | |||
Stencil = 1 << 2, | |||
All = 0xffffffff | |||
} | |||
m_value; | |||
inline ClearMask(Value v) : m_value(v) {} | |||
inline ClearMask(uint64_t i) : m_value((Value)i) {} | |||
inline operator Value() { return m_value; } | |||
}; | |||
struct DebugRenderMode | |||
{ | |||
enum Value | |||
@@ -68,11 +49,11 @@ public: | |||
static void Setup(ivec2 size); | |||
static void Destroy(); | |||
static ivec2 GetSize(); | |||
static void SetDebugRenderMode(DebugRenderMode d); | |||
static DebugRenderMode GetDebugRenderMode(); | |||
static void Clear(ClearMask m); | |||
static void Capture(uint32_t *buffer); | |||
static ivec2 GetSize(); | |||
}; | |||
} /* namespace lol */ | |||
@@ -472,7 +472,7 @@ public: | |||
#else | |||
m_meshes[i].m1.Render(m_mat); | |||
#endif | |||
Video::Clear(ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Depth); | |||
} | |||
} | |||
Scene::GetDefault()->GetCamera()->SetProjection(default_proj); | |||
@@ -78,7 +78,7 @@ public: | |||
RenderContext rc; | |||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | |||
rc.SetClearDepth(1.f); | |||
Video::Clear(ClearMask::Color | ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||
} | |||
m_fbo->Unbind(); | |||
@@ -126,7 +126,7 @@ public: | |||
RenderContext rc; | |||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | |||
rc.SetClearDepth(1.f); | |||
Video::Clear(ClearMask::Color | ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||
} | |||
m_fbos.Last().m1->Unbind(); | |||
} | |||
@@ -137,7 +137,7 @@ public: | |||
RenderContext rc; | |||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | |||
rc.SetClearDepth(1.f); | |||
Video::Clear(ClearMask::Color | ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||
} | |||
temp_buffer->Unbind(); | |||
@@ -198,7 +198,7 @@ public: | |||
RenderContext rc; | |||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | |||
rc.SetClearDepth(1.f); | |||
Video::Clear(ClearMask::Color | ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||
} | |||
temp_buffer->Unbind(); | |||
@@ -228,7 +228,7 @@ public: | |||
RenderContext rc; | |||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | |||
rc.SetClearDepth(1.f); | |||
Video::Clear(ClearMask::Color | ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||
} | |||
m_fbos[f].m1->Unbind(); | |||
@@ -251,7 +251,7 @@ public: | |||
dst_buf->Bind(); | |||
/* FIXME: we should just disable depth test in the shader */ | |||
Video::Clear(ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Depth); | |||
m_fbos[f].m2->Bind(); | |||
int i = 0; | |||
@@ -270,7 +270,7 @@ public: | |||
} | |||
} | |||
Video::Clear(ClearMask::Color | ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||
//FRAME BUFFER DRAW | |||
m_timer -= seconds; | |||
@@ -282,7 +282,7 @@ public: | |||
RenderContext rc; | |||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | |||
rc.SetClearDepth(1.f); | |||
Video::Clear(ClearMask::Color | ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||
} | |||
m_fbos[m_cur_fbo].m1->Unbind(); | |||
@@ -313,7 +313,7 @@ public: | |||
dst_buf->Bind(); | |||
/* FIXME: we should just disable depth test in the shader */ | |||
Video::Clear(ClearMask::Depth); | |||
g_renderer->Clear(ClearMask::Depth); | |||
shader->Bind(); | |||
//08_FBO ?? | |||