Преглед изворни кода

gpu: move SetClearColor and SetClearDepth to the Renderer and RenderContext

classes instead of Video.
legacy
Sam Hocevar sam пре 11 година
родитељ
комит
274a732e3c
12 измењених фајлова са 144 додато и 76 уклоњено
  1. +31
    -15
      src/gpu/rendercontext.cpp
  2. +56
    -6
      src/gpu/renderer.cpp
  3. +2
    -0
      src/lol/gpu/rendercontext.h
  4. +6
    -0
      src/lol/gpu/renderer.h
  5. +6
    -30
      src/video.cpp
  6. +0
    -2
      src/video.h
  7. +1
    -1
      test/meshviewer.cpp
  8. +1
    -1
      tutorial/02_cube.cpp
  9. +2
    -2
      tutorial/05_easymesh.cpp
  10. +1
    -1
      tutorial/06_sprite.cpp
  11. +8
    -3
      tutorial/08_fbo.cpp
  12. +30
    -15
      tutorial/12_voronoi.cpp

+ 31
- 15
src/gpu/rendercontext.cpp Прегледај датотеку

@@ -19,36 +19,32 @@
namespace lol namespace lol
{ {


class TrackedState
template<typename T> class TrackedState
{ {
public: public:
inline TrackedState() inline TrackedState()
: m_state(Unchanged)
: m_changed(false)
{} {}


inline void TrackValue(bool set)
inline void TrackValue(T const &value)
{ {
m_state = set ? MustSet : MustUnset;
m_value = value;
m_changed = true;
} }


inline bool HasChanged() inline bool HasChanged()
{ {
return m_state != Unchanged;
return m_changed;
} }


inline bool GetValue()
inline T GetValue()
{ {
return m_state == MustSet;
return m_value;
} }


private: private:
enum
{
Unchanged,
MustSet,
MustUnset,
}
m_state;
T m_value;
bool m_changed;
}; };


class RenderContextData class RenderContextData
@@ -58,7 +54,11 @@ class RenderContextData
private: private:
Scene *m_scene; Scene *m_scene;


TrackedState m_alpha_blend, m_depth_test, m_face_culling;
TrackedState<vec4> m_clear_color;
TrackedState<float> m_clear_depth;
TrackedState<bool> m_alpha_blend;
TrackedState<bool> m_depth_test;
TrackedState<bool> m_face_culling;
}; };


/* /*
@@ -85,6 +85,22 @@ RenderContext::~RenderContext()
delete m_data; delete m_data;
} }


void RenderContext::SetClearColor(vec4 color)
{
if (!m_data->m_clear_color.HasChanged())
m_data->m_clear_color.TrackValue(g_renderer->GetClearColor());

g_renderer->SetClearColor(color);
}

void RenderContext::SetClearDepth(float depth)
{
if (!m_data->m_clear_depth.HasChanged())
m_data->m_clear_depth.TrackValue(g_renderer->GetClearDepth());

g_renderer->SetClearDepth(depth);
}

void RenderContext::SetAlphaBlend(bool set) void RenderContext::SetAlphaBlend(bool set)
{ {
if (!m_data->m_alpha_blend.HasChanged()) if (!m_data->m_alpha_blend.HasChanged())


+ 56
- 6
src/gpu/renderer.cpp Прегледај датотеку

@@ -47,6 +47,8 @@ class RendererData
friend class Renderer; friend class Renderer;


private: private:
vec4 m_clear_color;
float m_clear_depth;
bool m_blend, m_depth_test, m_face_culling; bool m_blend, m_depth_test, m_face_culling;
}; };


@@ -57,6 +59,12 @@ private:
Renderer::Renderer() Renderer::Renderer()
: m_data(new RendererData()) : m_data(new RendererData())
{ {
m_data->m_clear_color = vec4(-1.f);
SetClearColor(vec4(0.1f, 0.2f, 0.3f, 1.0f));

m_data->m_clear_depth = -1.f;
SetClearDepth(1.f);

m_data->m_blend = false; m_data->m_blend = false;
SetAlphaBlend(true); SetAlphaBlend(true);


@@ -72,6 +80,48 @@ Renderer::~Renderer()
delete m_data; delete m_data;
} }


/*
* Clear color
*/

void Renderer::SetClearColor(vec4 color)
{
#if defined USE_D3D9 || defined _XBOX
/* Nothing to do */
#else
glClearColor(color.r, color.g, color.b, color.a);
#endif

m_data->m_clear_color = color;
}

vec4 Renderer::GetClearColor() const
{
return m_data->m_clear_color;
}

/*
* Clear depth
*/

void Renderer::SetClearDepth(float depth)
{
#if defined USE_D3D9 || defined _XBOX
/* Nothing to do */
#elif defined HAVE_GLES_2X
glClearDepthf(depth);
#else
glClearDepth(depth);
#endif

m_data->m_clear_depth = depth;
}

float Renderer::GetClearDepth() const
{
return m_data->m_clear_depth;
}

/* /*
* Alpha blending * Alpha blending
*/ */
@@ -81,8 +131,6 @@ void Renderer::SetAlphaBlend(bool set)
if (m_data->m_blend == set) if (m_data->m_blend == set)
return; return;


m_data->m_blend = set;

#if defined USE_D3D9 || defined _XBOX #if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x # define STR0(x) #x
# define STR(x) STR0(x) # define STR(x) STR0(x)
@@ -93,6 +141,8 @@ void Renderer::SetAlphaBlend(bool set)
else else
glDisable(GL_BLEND); glDisable(GL_BLEND);
#endif #endif

m_data->m_blend = set;
} }


bool Renderer::GetAlphaBlend() const bool Renderer::GetAlphaBlend() const
@@ -109,8 +159,6 @@ void Renderer::SetDepthTest(bool set)
if (m_data->m_depth_test == set) if (m_data->m_depth_test == set)
return; return;


m_data->m_depth_test = set;

#if defined USE_D3D9 || defined _XBOX #if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x # define STR0(x) #x
# define STR(x) STR0(x) # define STR(x) STR0(x)
@@ -121,6 +169,8 @@ void Renderer::SetDepthTest(bool set)
else else
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
#endif #endif

m_data->m_depth_test = set;
} }


bool Renderer::GetDepthTest() const bool Renderer::GetDepthTest() const
@@ -137,8 +187,6 @@ void Renderer::SetFaceCulling(bool set)
if (m_data->m_face_culling == set) if (m_data->m_face_culling == set)
return; return;


m_data->m_face_culling = set;

#if defined USE_D3D9 || defined _XBOX #if defined USE_D3D9 || defined _XBOX
# define STR0(x) #x # define STR0(x) #x
# define STR(x) STR0(x) # define STR(x) STR0(x)
@@ -149,6 +197,8 @@ void Renderer::SetFaceCulling(bool set)
else else
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
#endif #endif

m_data->m_face_culling = set;
} }


bool Renderer::GetFaceCulling() const bool Renderer::GetFaceCulling() const


+ 2
- 0
src/lol/gpu/rendercontext.h Прегледај датотеку

@@ -27,6 +27,8 @@ public:
RenderContext(); RenderContext();
~RenderContext(); ~RenderContext();


void SetClearColor(vec4 color);
void SetClearDepth(float depth);
void SetAlphaBlend(bool set); void SetAlphaBlend(bool set);
void SetDepthTest(bool set); void SetDepthTest(bool set);
void SetFaceCulling(bool set); void SetFaceCulling(bool set);


+ 6
- 0
src/lol/gpu/renderer.h Прегледај датотеку

@@ -27,6 +27,12 @@ public:
Renderer(); Renderer();
~Renderer(); ~Renderer();


void SetClearColor(vec4 color);
vec4 GetClearColor() const;

void SetClearDepth(float depth);
float GetClearDepth() const;

void SetAlphaBlend(bool set); void SetAlphaBlend(bool set);
bool GetAlphaBlend() const; bool GetAlphaBlend() const;




+ 6
- 30
src/video.cpp Прегледај датотеку

@@ -60,8 +60,6 @@ private:
static Direct3D *d3d_ctx; static Direct3D *d3d_ctx;
static D3DDevice *d3d_dev; static D3DDevice *d3d_dev;
# endif # endif
static D3DCOLOR clear_color;
static float clear_depth;
#endif #endif
}; };


@@ -77,8 +75,6 @@ IDirect3DDevice9 *VideoData::d3d_dev;
Direct3D *VideoData::d3d_ctx; Direct3D *VideoData::d3d_ctx;
D3DDevice *VideoData::d3d_dev; D3DDevice *VideoData::d3d_dev;
# endif # endif
D3DCOLOR VideoData::clear_color;
float VideoData::clear_depth;
#endif #endif


/* /*
@@ -155,8 +151,6 @@ void Video::Setup(ivec2 size)
g_renderer = new Renderer(); g_renderer = new Renderer();


/* Initialise reasonable scene default properties */ /* Initialise reasonable scene default properties */
SetClearColor(vec4(0.1f, 0.2f, 0.3f, 1.0f));
SetClearDepth(1.f);
SetDebugRenderMode(DebugRenderMode::Default); SetDebugRenderMode(DebugRenderMode::Default);
} }


@@ -233,28 +227,6 @@ void Video::SetFov(float theta)
} }
} }


void Video::SetClearColor(vec4 color)
{
#if defined USE_D3D9 || defined _XBOX
VideoData::clear_color = D3DCOLOR_XRGB((int)(color.r * 255.999f),
(int)(color.g * 255.999f),
(int)(color.b * 255.999f));
#else
glClearColor(color.r, color.g, color.b, color.a);
#endif
}

void Video::SetClearDepth(float f)
{
#if defined USE_D3D9 || defined _XBOX
VideoData::clear_depth = f;
#elif defined HAVE_GLES_2X
glClearDepthf(f);
#else
glClearDepth(f);
#endif
}

void Video::SetDebugRenderMode(DebugRenderMode d) void Video::SetDebugRenderMode(DebugRenderMode d)
{ {
switch(d) switch(d)
@@ -321,9 +293,13 @@ void Video::Clear(ClearMask m)
mask |= D3DCLEAR_ZBUFFER; mask |= D3DCLEAR_ZBUFFER;
if (m & ClearMask::Stencil) if (m & ClearMask::Stencil)
mask |= D3DCLEAR_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, if (FAILED(VideoData::d3d_dev->Clear(0, nullptr, mask,
VideoData::clear_color,
VideoData::clear_depth, 0)))
clear_color,
g_renderer->GetClearDepth(), 0)))
Abort(); Abort();
#else #else
/* FIXME: is this necessary here? */ /* FIXME: is this necessary here? */


+ 0
- 2
src/video.h Прегледај датотеку

@@ -71,8 +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 SetClearColor(vec4 color);
static void SetClearDepth(float f);
static void SetDebugRenderMode(DebugRenderMode d); static void SetDebugRenderMode(DebugRenderMode d);
static DebugRenderMode GetDebugRenderMode(); static DebugRenderMode GetDebugRenderMode();
static void Clear(ClearMask m); static void Clear(ClearMask m);


+ 1
- 1
test/meshviewer.cpp Прегледај датотеку

@@ -440,7 +440,7 @@ public:
} }
} }


Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));


mat4 default_proj = Scene::GetDefault()->GetCamera()->GetProjection(); mat4 default_proj = Scene::GetDefault()->GetCamera()->GetProjection();
int max_drawn = m_meshes.Count() - m_mesh_shown; int max_drawn = m_meshes.Count() - m_mesh_shown;


+ 1
- 1
tutorial/02_cube.cpp Прегледај датотеку

@@ -103,7 +103,7 @@ public:
m_ready = true; m_ready = true;
} }


Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));


m_shader->Bind(); m_shader->Bind();
m_vdecl->SetStream(m_vbo, m_coord, m_color); m_vdecl->SetStream(m_vbo, m_coord, m_color);


+ 2
- 2
tutorial/05_easymesh.cpp Прегледај датотеку

@@ -111,13 +111,13 @@ public:


if (!m_ready) if (!m_ready)
{ {
g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));

for (int i = 0; i < m_gears.Count(); i++) for (int i = 0; i < m_gears.Count(); i++)
m_gears[i].m1.MeshConvert(); m_gears[i].m1.MeshConvert();
m_ready = true; m_ready = true;
} }


Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));

for (int i = 0; i < m_gears.Count(); i++) for (int i = 0; i < m_gears.Count(); i++)
m_gears[i].m1.Render(m_mat * m_gears[i].m2); m_gears[i].m1.Render(m_mat * m_gears[i].m2);
} }


+ 1
- 1
tutorial/06_sprite.cpp Прегледај датотеку

@@ -69,7 +69,7 @@ public:


if (!m_ready) if (!m_ready)
{ {
Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
m_ready = true; m_ready = true;
} }




+ 8
- 3
tutorial/08_fbo.cpp Прегледај датотеку

@@ -73,9 +73,14 @@ public:


m_fbo = new Framebuffer(Video::GetSize()); m_fbo = new Framebuffer(Video::GetSize());
m_fbo->Bind(); m_fbo->Bind();
Video::SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
Video::SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);

{
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
}

m_fbo->Unbind(); m_fbo->Unbind();


m_ready = true; m_ready = true;


+ 30
- 15
tutorial/12_voronoi.cpp Прегледај датотеку

@@ -122,17 +122,23 @@ public:
} }


m_fbos.Last().m1->Bind(); m_fbos.Last().m1->Bind();
Video::SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
Video::SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
{
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
}
m_fbos.Last().m1->Unbind(); m_fbos.Last().m1->Unbind();
} }


temp_buffer = new Framebuffer(Video::GetSize()); temp_buffer = new Framebuffer(Video::GetSize());
temp_buffer->Bind(); temp_buffer->Bind();
Video::SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
Video::SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
{
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
}
temp_buffer->Unbind(); temp_buffer->Unbind();


m_ready = true; m_ready = true;
@@ -188,9 +194,12 @@ public:
} }


temp_buffer->Bind(); temp_buffer->Bind();
Video::SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
Video::SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
{
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
}
temp_buffer->Unbind(); temp_buffer->Unbind();


{ {
@@ -215,9 +224,12 @@ public:
int f = SrcVoronoiFbo; int f = SrcVoronoiFbo;


m_fbos[f].m1->Bind(); m_fbos[f].m1->Bind();
Video::SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
Video::SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
{
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
}
m_fbos[f].m1->Unbind(); m_fbos[f].m1->Unbind();


int buf = voronoi_points.Count() % 2; int buf = voronoi_points.Count() % 2;
@@ -266,9 +278,12 @@ public:
{ {
//m_timer = 1.0f; //m_timer = 1.0f;
m_fbos[m_cur_fbo].m1->Bind(); m_fbos[m_cur_fbo].m1->Bind();
Video::SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
Video::SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
{
RenderContext rc;
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f));
rc.SetClearDepth(1.f);
Video::Clear(ClearMask::Color | ClearMask::Depth);
}
m_fbos[m_cur_fbo].m1->Unbind(); m_fbos[m_cur_fbo].m1->Unbind();


ivec2 curres = ivec2(512, 512) / 2; ivec2 curres = ivec2(512, 512) / 2;


Loading…
Откажи
Сачувај