Przeglądaj źródła

gpu: handle depth test, alpha blending and face culling in Renderer.

legacy
Sam Hocevar sam 11 lat temu
rodzic
commit
1b213612a5
7 zmienionych plików z 141 dodań i 94 usunięć
  1. +29
    -7
      src/gpu/rendercontext.cpp
  2. +93
    -8
      src/gpu/renderer.cpp
  3. +3
    -1
      src/lol/gpu/rendercontext.h
  4. +8
    -2
      src/lol/gpu/renderer.h
  5. +0
    -4
      src/ticker.cpp
  6. +8
    -67
      src/video.cpp
  7. +0
    -5
      src/video.h

+ 29
- 7
src/gpu/rendercontext.cpp Wyświetl plik

@@ -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 */


+ 93
- 8
src/gpu/renderer.cpp Wyświetl plik

@@ -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 */


+ 3
- 1
src/lol/gpu/rendercontext.h Wyświetl plik

@@ -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;


+ 8
- 2
src/lol/gpu/renderer.h Wyświetl plik

@@ -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;


+ 0
- 4
src/ticker.cpp Wyświetl plik

@@ -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;
} }




+ 8
- 67
src/video.cpp Wyświetl plik

@@ -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


+ 0
- 5
src/video.h Wyświetl plik

@@ -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);


||||||
x
 
000:0
Ładowanie…
Anuluj
Zapisz