The scene now owns its renderer, so there is no need to keep a list of existing renderers and to call Renderer::Get().legacy
@@ -2,7 +2,7 @@ | |||||
// Lol Engine — BtPhys tutorial | // Lol Engine — BtPhys tutorial | ||||
// | // | ||||
// Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// © 2012—2018 Sam Hocevar <sam@hocevar.net> | |||||
// © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -404,7 +404,7 @@ void BtPhysTest::tick_game(float seconds) | |||||
if (!m_init_status) | if (!m_init_status) | ||||
{ | { | ||||
if (Renderer::GetCount()) | |||||
if (Scene::GetCount()) | |||||
InitApp(); | InitApp(); | ||||
return; | return; | ||||
} | } | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine — EasyMesh tutorial | // Lol Engine — EasyMesh tutorial | ||||
// | // | ||||
// Copyright © 2011—2018 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2011—2019 Sam Hocevar <sam@hocevar.net> | |||||
// © 2012—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2012—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
@@ -946,7 +946,7 @@ void MeshViewer::Draw(float seconds, Scene &scene) | |||||
m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0); | m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0); | ||||
#endif //!HAS_WEB && WITH_TEXTURE | #endif //!HAS_WEB && WITH_TEXTURE | ||||
Renderer::Get()->SetClearColor(m_ssetup->m_clear_color); | |||||
scene.get_renderer()->SetClearColor(m_ssetup->m_clear_color); | |||||
for (int i = 0; i < m_gizmos.count(); ++i) | for (int i = 0; i < m_gizmos.count(); ++i) | ||||
{ | { | ||||
@@ -1057,7 +1057,7 @@ void MeshViewer::Draw(float seconds, Scene &scene) | |||||
mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj; | mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj; | ||||
m_camera->SetProjection(new_proj); | m_camera->SetProjection(new_proj); | ||||
m_meshes[i].m1->Render(scene, m_mat); | m_meshes[i].m1->Render(scene, m_mat); | ||||
Renderer::Get()->Clear(ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Depth); | |||||
} | } | ||||
m_camera->SetProjection(save_proj); | m_camera->SetProjection(save_proj); | ||||
#else | #else | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine — Cube tutorial | // Lol Engine — Cube tutorial | ||||
// | // | ||||
// Copyright © 2011—2015 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2011—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -130,7 +130,7 @@ public: | |||||
m_ready = true; | m_ready = true; | ||||
} | } | ||||
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||||
scene.get_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); | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine — EasyMesh tutorial | // Lol Engine — EasyMesh tutorial | ||||
// | // | ||||
// Copyright © 2011—2015 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2011—2019 Sam Hocevar <sam@hocevar.net> | |||||
// © 2012—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2012—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
@@ -129,7 +129,7 @@ public: | |||||
if (!m_ready) | if (!m_ready) | ||||
{ | { | ||||
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||||
scene.get_renderer()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||||
/* Upload vertex data to GPU */ | /* Upload vertex data to GPU */ | ||||
for (int i = 0; i < m_gears.count(); i++) | for (int i = 0; i < m_gears.count(); i++) | ||||
@@ -72,7 +72,7 @@ public: | |||||
if (!m_ready) | if (!m_ready) | ||||
{ | { | ||||
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||||
scene.get_renderer()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||||
m_ready = true; | m_ready = true; | ||||
} | } | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine — Input tutorial | // Lol Engine — Input tutorial | ||||
// | // | ||||
// Copyright © 2011—2015 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2011—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -191,7 +191,7 @@ public: | |||||
m_ready = true; | m_ready = true; | ||||
} | } | ||||
Renderer::Get()->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | |||||
scene.get_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); | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine — Framebuffer Object tutorial | // Lol Engine — Framebuffer Object tutorial | ||||
// | // | ||||
// Copyright © 2012—2015 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -76,10 +76,10 @@ public: | |||||
m_fbo->Bind(); | m_fbo->Bind(); | ||||
{ | { | ||||
RenderContext rc; | |||||
RenderContext rc(scene.get_renderer()); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
} | } | ||||
m_fbo->Unbind(); | m_fbo->Unbind(); | ||||
@@ -90,7 +90,7 @@ public: | |||||
} | } | ||||
/* FIXME: we should just disable depth test in the shader */ | /* FIXME: we should just disable depth test in the shader */ | ||||
RenderContext rc; | |||||
RenderContext rc(scene.get_renderer()); | |||||
rc.SetDepthFunc(DepthFunc::Disabled); | rc.SetDepthFunc(DepthFunc::Disabled); | ||||
/* FIXME: this no longer works because we don’t restore the | /* FIXME: this no longer works because we don’t restore the | ||||
@@ -1,7 +1,8 @@ | |||||
// | // | ||||
// Lol Engine — Voronoi diagram tutorial | // Lol Engine — Voronoi diagram tutorial | ||||
// | // | ||||
// Copyright © 2011—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
// Copyright © 2015—2019 Sam Hocevar <sam@hocevar.net> | |||||
// © 2011—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -143,10 +144,10 @@ public: | |||||
m_fbos.last().m1->Bind(); | m_fbos.last().m1->Bind(); | ||||
{ | { | ||||
RenderContext rc; | |||||
RenderContext rc(scene.get_renderer()); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
} | } | ||||
m_fbos.last().m1->Unbind(); | m_fbos.last().m1->Unbind(); | ||||
} | } | ||||
@@ -154,10 +155,10 @@ public: | |||||
temp_buffer = new Framebuffer(Video::GetSize()); | temp_buffer = new Framebuffer(Video::GetSize()); | ||||
temp_buffer->Bind(); | temp_buffer->Bind(); | ||||
{ | { | ||||
RenderContext rc; | |||||
RenderContext rc(scene.get_renderer()); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
} | } | ||||
temp_buffer->Unbind(); | temp_buffer->Unbind(); | ||||
@@ -218,10 +219,10 @@ public: | |||||
temp_buffer->Bind(); | temp_buffer->Bind(); | ||||
{ | { | ||||
RenderContext rc; | |||||
RenderContext rc(scene.get_renderer()); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
} | } | ||||
temp_buffer->Unbind(); | temp_buffer->Unbind(); | ||||
@@ -248,10 +249,10 @@ public: | |||||
m_fbos[f].m1->Bind(); | m_fbos[f].m1->Bind(); | ||||
{ | { | ||||
RenderContext rc; | |||||
RenderContext rc(scene.get_renderer()); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
} | } | ||||
m_fbos[f].m1->Unbind(); | m_fbos[f].m1->Unbind(); | ||||
@@ -274,7 +275,7 @@ public: | |||||
dst_buf->Bind(); | dst_buf->Bind(); | ||||
/* FIXME: we should just disable depth test in the shader */ | /* FIXME: we should just disable depth test in the shader */ | ||||
Renderer::Get()->Clear(ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Depth); | |||||
m_fbos[f].m2->Bind(); | m_fbos[f].m2->Bind(); | ||||
int i = 0; | int i = 0; | ||||
@@ -293,7 +294,7 @@ public: | |||||
} | } | ||||
} | } | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
//FRAME BUFFER DRAW | //FRAME BUFFER DRAW | ||||
m_timer -= seconds; | m_timer -= seconds; | ||||
@@ -302,10 +303,10 @@ public: | |||||
//m_timer = 1.0f; | //m_timer = 1.0f; | ||||
m_fbos[m_cur_fbo].m1->Bind(); | m_fbos[m_cur_fbo].m1->Bind(); | ||||
{ | { | ||||
RenderContext rc; | |||||
RenderContext rc(scene.get_renderer()); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
} | } | ||||
m_fbos[m_cur_fbo].m1->Unbind(); | m_fbos[m_cur_fbo].m1->Unbind(); | ||||
@@ -336,7 +337,7 @@ public: | |||||
dst_buf->Bind(); | dst_buf->Bind(); | ||||
/* FIXME: we should just disable depth test in the shader */ | /* FIXME: we should just disable depth test in the shader */ | ||||
Renderer::Get()->Clear(ClearMask::Depth); | |||||
scene.get_renderer()->Clear(ClearMask::Depth); | |||||
shader->Bind(); | shader->Bind(); | ||||
int i = 0; | int i = 0; | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
@@ -30,8 +30,8 @@ Camera::Camera() | |||||
m_gamegroup = GAMEGROUP_CAMERA; | m_gamegroup = GAMEGROUP_CAMERA; | ||||
m_drawgroup = DRAWGROUP_CAMERA; | m_drawgroup = DRAWGROUP_CAMERA; | ||||
//Arbitrary values when g_renderer is not ready. | |||||
ivec2 screen_size = (Renderer::GetCount()) ? (Video::GetSize()) : (ivec2(800, 600)); | |||||
//Arbitrary values when scene renderer is not ready. | |||||
ivec2 screen_size = (Scene::GetCount()) ? (Video::GetSize()) : (ivec2(800, 600)); | |||||
m_fov = radians(45.f); | m_fov = radians(45.f); | ||||
m_near = -1000.f; | m_near = -1000.f; | ||||
m_far = 1000.f; | m_far = 1000.f; | ||||
@@ -1,11 +1,13 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// 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. | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// Lol Engine is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
@@ -227,14 +229,14 @@ void Debug::DrawBox(vec2 a, vec2 b, mat2 transform, DCD data) | |||||
} | } | ||||
void Debug::DrawBox(vec2 a, float s, mat2 transform, DCD data) | void Debug::DrawBox(vec2 a, float s, mat2 transform, DCD data) | ||||
{ | { | ||||
vec2 b = s * vec2(1.f, Renderer::Get()->GetXYRatio()); | |||||
vec2 b = s * vec2(1.f, Scene::GetScene(0).get_renderer()->GetXYRatio()); | |||||
Debug::DrawBox(a - b, a + b, transform, data); | Debug::DrawBox(a - b, a + b, transform, data); | ||||
} | } | ||||
//-- CIRCLE ------------------------------------------------------------------- | //-- CIRCLE ------------------------------------------------------------------- | ||||
void Debug::DrawCircle(vec2 a, float s) { Debug::DrawCircle(a, s * vec2(1.f, Renderer::Get()->GetXYRatio()), DC::GetGlobalData()); } | |||||
void Debug::DrawCircle(vec2 a, float s) { Debug::DrawCircle(a, s * vec2(1.f, Scene::GetScene(0).get_renderer()->GetXYRatio()), DC::GetGlobalData()); } | |||||
void Debug::DrawCircle(vec3 a, vec3 n) { Debug::DrawCircle(a, n, DC::GetGlobalData()); } | void Debug::DrawCircle(vec3 a, vec3 n) { Debug::DrawCircle(a, n, DC::GetGlobalData()); } | ||||
void Debug::DrawCircle(vec2 a, vec2 s) { Debug::DrawCircle(a, s * vec2(1.f, Renderer::Get()->GetXYRatio()), DC::GetGlobalData()); } | |||||
void Debug::DrawCircle(vec2 a, vec2 s) { Debug::DrawCircle(a, s * vec2(1.f, Scene::GetScene(0).get_renderer()->GetXYRatio()), DC::GetGlobalData()); } | |||||
void Debug::DrawCircle(vec3 a, vec3 x, vec3 y) { Debug::DrawCircle(a, x, y, DC::GetGlobalData()); } | void Debug::DrawCircle(vec3 a, vec3 x, vec3 y) { Debug::DrawCircle(a, x, y, DC::GetGlobalData()); } | ||||
void Debug::DrawCircle(vec2 a, vec2 x, vec2 y) { Debug::DrawCircle(a, x, y, DC::GetGlobalData()); } | void Debug::DrawCircle(vec2 a, vec2 x, vec2 y) { Debug::DrawCircle(a, x, y, DC::GetGlobalData()); } | ||||
void Debug::DrawCircle(vec3 a, vec3 n, DCD data) | void Debug::DrawCircle(vec3 a, vec3 n, DCD data) | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -430,7 +430,7 @@ void TickerData::DrawThreadTick() | |||||
/* Enable display */ | /* Enable display */ | ||||
scene.EnableDisplay(); | scene.EnableDisplay(); | ||||
Renderer::Get(idx)->Clear(ClearMask::All); | |||||
scene.get_renderer()->Clear(ClearMask::All); | |||||
scene.pre_render(data->deltatime); | scene.pre_render(data->deltatime); | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2017 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -373,8 +373,9 @@ void Framebuffer::Bind() | |||||
/* FIXME: this should be done in the RenderContext object | /* FIXME: this should be done in the RenderContext object | ||||
* instead, maybe by getting rid of Framebuffer::Bind() and | * instead, maybe by getting rid of Framebuffer::Bind() and | ||||
* creating RenderContext::SetFramebuffer() instead. */ | * creating RenderContext::SetFramebuffer() instead. */ | ||||
m_data->m_saved_viewport = Renderer::Get()->GetViewport(); | |||||
Renderer::Get()->SetViewport(ibox2(ivec2::zero, m_data->m_size)); | |||||
auto *renderer = Scene::GetScene(0).get_renderer(); | |||||
m_data->m_saved_viewport = renderer->GetViewport(); | |||||
renderer->SetViewport(ibox2(ivec2::zero, m_data->m_size)); | |||||
m_data->m_bound = true; | m_data->m_bound = true; | ||||
} | } | ||||
@@ -388,7 +389,8 @@ void Framebuffer::Unbind() | |||||
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); | glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); | ||||
#endif | #endif | ||||
Renderer::Get()->SetViewport(m_data->m_saved_viewport); | |||||
auto *renderer = Scene::GetScene(0).get_renderer(); | |||||
renderer->SetViewport(m_data->m_saved_viewport); | |||||
m_data->m_bound = false; | m_data->m_bound = false; | ||||
} | } | ||||
@@ -1,11 +1,13 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// 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. | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// Lol Engine is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#include <lol/engine-internal.h> | #include <lol/engine-internal.h> | ||||
@@ -15,32 +17,32 @@ | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
template<typename T> class TrackedState | |||||
template<typename T> class tracked_var | |||||
{ | { | ||||
public: | public: | ||||
inline TrackedState() | |||||
: m_changed(false) | |||||
inline tracked_var() | |||||
: m_dirty(false) | |||||
{} | {} | ||||
inline void TrackValue(T const &value) | |||||
inline void set(T const &value) | |||||
{ | { | ||||
m_value = value; | m_value = value; | ||||
m_changed = true; | |||||
m_dirty = true; | |||||
} | } | ||||
inline bool HasChanged() | |||||
inline bool is_dirty() | |||||
{ | { | ||||
return m_changed; | |||||
return m_dirty; | |||||
} | } | ||||
inline T GetValue() | |||||
inline T get() | |||||
{ | { | ||||
return m_value; | return m_value; | ||||
} | } | ||||
private: | private: | ||||
T m_value; | T m_value; | ||||
bool m_changed; | |||||
bool m_dirty; | |||||
}; | }; | ||||
class RenderContextData | class RenderContextData | ||||
@@ -48,242 +50,243 @@ class RenderContextData | |||||
friend class RenderContext; | friend class RenderContext; | ||||
private: | private: | ||||
TrackedState<ibox2> m_viewport; | |||||
TrackedState<vec4> m_clear_color; | |||||
TrackedState<float> m_clear_depth; | |||||
TrackedState<AlphaFunc> m_alpha_func; | |||||
TrackedState<float> m_alpha_value; | |||||
TrackedState<BlendEquation> m_blend_rgb, m_blend_alpha; | |||||
TrackedState<BlendFunc> m_blend_src, m_blend_dst; | |||||
TrackedState<DepthFunc> m_depth_func; | |||||
TrackedState<DepthMask> m_depth_mask; | |||||
TrackedState<CullMode> m_cull_mode; | |||||
TrackedState<PolygonMode> m_polygon_mode; | |||||
TrackedState<ScissorMode> m_scissor_mode; | |||||
TrackedState<vec4> m_scissor_rect; | |||||
tracked_var<ibox2> m_viewport; | |||||
tracked_var<vec4> m_clear_color; | |||||
tracked_var<float> m_clear_depth; | |||||
tracked_var<AlphaFunc> m_alpha_func; | |||||
tracked_var<float> m_alpha_value; | |||||
tracked_var<BlendEquation> m_blend_rgb, m_blend_alpha; | |||||
tracked_var<BlendFunc> m_blend_src, m_blend_dst; | |||||
tracked_var<DepthFunc> m_depth_func; | |||||
tracked_var<DepthMask> m_depth_mask; | |||||
tracked_var<CullMode> m_cull_mode; | |||||
tracked_var<PolygonMode> m_polygon_mode; | |||||
tracked_var<ScissorMode> m_scissor_mode; | |||||
tracked_var<vec4> m_scissor_rect; | |||||
}; | }; | ||||
/* | /* | ||||
* Public RenderContext class | * Public RenderContext class | ||||
*/ | */ | ||||
RenderContext::RenderContext() | |||||
: m_data(new RenderContextData()) | |||||
RenderContext::RenderContext(Renderer *renderer) | |||||
: m_renderer(renderer), | |||||
m_data(new RenderContextData()) | |||||
{ | { | ||||
} | } | ||||
RenderContext::~RenderContext() | RenderContext::~RenderContext() | ||||
{ | { | ||||
if (m_data->m_viewport.HasChanged()) | |||||
Renderer::Get()->SetViewport(m_data->m_viewport.GetValue()); | |||||
if (m_data->m_viewport.is_dirty()) | |||||
m_renderer->SetViewport(m_data->m_viewport.get()); | |||||
if (m_data->m_clear_color.HasChanged()) | |||||
Renderer::Get()->SetClearColor(m_data->m_clear_color.GetValue()); | |||||
if (m_data->m_clear_color.is_dirty()) | |||||
m_renderer->SetClearColor(m_data->m_clear_color.get()); | |||||
if (m_data->m_clear_depth.HasChanged()) | |||||
Renderer::Get()->SetClearDepth(m_data->m_clear_depth.GetValue()); | |||||
if (m_data->m_clear_depth.is_dirty()) | |||||
m_renderer->SetClearDepth(m_data->m_clear_depth.get()); | |||||
if (m_data->m_alpha_func.HasChanged()) | |||||
Renderer::Get()->SetAlphaFunc(m_data->m_alpha_func.GetValue(), | |||||
m_data->m_alpha_value.GetValue()); | |||||
if (m_data->m_alpha_func.is_dirty()) | |||||
m_renderer->SetAlphaFunc(m_data->m_alpha_func.get(), | |||||
m_data->m_alpha_value.get()); | |||||
if (m_data->m_blend_src.HasChanged()) | |||||
Renderer::Get()->SetBlendFunc(m_data->m_blend_src.GetValue(), | |||||
m_data->m_blend_dst.GetValue()); | |||||
if (m_data->m_blend_src.is_dirty()) | |||||
m_renderer->SetBlendFunc(m_data->m_blend_src.get(), | |||||
m_data->m_blend_dst.get()); | |||||
if (m_data->m_depth_func.HasChanged()) | |||||
Renderer::Get()->SetDepthFunc(m_data->m_depth_func.GetValue()); | |||||
if (m_data->m_depth_func.is_dirty()) | |||||
m_renderer->SetDepthFunc(m_data->m_depth_func.get()); | |||||
if (m_data->m_depth_mask.HasChanged()) | |||||
Renderer::Get()->SetDepthMask(m_data->m_depth_mask.GetValue()); | |||||
if (m_data->m_depth_mask.is_dirty()) | |||||
m_renderer->SetDepthMask(m_data->m_depth_mask.get()); | |||||
if (m_data->m_cull_mode.HasChanged()) | |||||
Renderer::Get()->SetCullMode(m_data->m_cull_mode.GetValue()); | |||||
if (m_data->m_cull_mode.is_dirty()) | |||||
m_renderer->SetCullMode(m_data->m_cull_mode.get()); | |||||
if (m_data->m_polygon_mode.HasChanged()) | |||||
Renderer::Get()->SetPolygonMode(m_data->m_polygon_mode.GetValue()); | |||||
if (m_data->m_polygon_mode.is_dirty()) | |||||
m_renderer->SetPolygonMode(m_data->m_polygon_mode.get()); | |||||
if (m_data->m_scissor_mode.HasChanged()) | |||||
Renderer::Get()->SetScissorMode(m_data->m_scissor_mode.GetValue()); | |||||
if (m_data->m_scissor_mode.is_dirty()) | |||||
m_renderer->SetScissorMode(m_data->m_scissor_mode.get()); | |||||
delete m_data; | delete m_data; | ||||
} | } | ||||
void RenderContext::SetViewport(ibox2 viewport) | void RenderContext::SetViewport(ibox2 viewport) | ||||
{ | { | ||||
if (!m_data->m_viewport.HasChanged()) | |||||
m_data->m_viewport.TrackValue(Renderer::Get()->GetViewport()); | |||||
if (!m_data->m_viewport.is_dirty()) | |||||
m_data->m_viewport.set(m_renderer->GetViewport()); | |||||
Renderer::Get()->SetViewport(viewport); | |||||
m_renderer->SetViewport(viewport); | |||||
} | } | ||||
ibox2 RenderContext::GetViewport() | ibox2 RenderContext::GetViewport() | ||||
{ | { | ||||
return Renderer::Get()->GetViewport(); | |||||
return m_renderer->GetViewport(); | |||||
} | } | ||||
void RenderContext::SetClearColor(vec4 color) | void RenderContext::SetClearColor(vec4 color) | ||||
{ | { | ||||
if (!m_data->m_clear_color.HasChanged()) | |||||
m_data->m_clear_color.TrackValue(Renderer::Get()->GetClearColor()); | |||||
if (!m_data->m_clear_color.is_dirty()) | |||||
m_data->m_clear_color.set(m_renderer->GetClearColor()); | |||||
Renderer::Get()->SetClearColor(color); | |||||
m_renderer->SetClearColor(color); | |||||
} | } | ||||
vec4 RenderContext::GetClearColor() | vec4 RenderContext::GetClearColor() | ||||
{ | { | ||||
return Renderer::Get()->GetClearColor(); | |||||
return m_renderer->GetClearColor(); | |||||
} | } | ||||
void RenderContext::SetClearDepth(float depth) | void RenderContext::SetClearDepth(float depth) | ||||
{ | { | ||||
if (!m_data->m_clear_depth.HasChanged()) | |||||
m_data->m_clear_depth.TrackValue(Renderer::Get()->GetClearDepth()); | |||||
if (!m_data->m_clear_depth.is_dirty()) | |||||
m_data->m_clear_depth.set(m_renderer->GetClearDepth()); | |||||
Renderer::Get()->SetClearDepth(depth); | |||||
m_renderer->SetClearDepth(depth); | |||||
} | } | ||||
float RenderContext::GetClearDepth() | float RenderContext::GetClearDepth() | ||||
{ | { | ||||
return Renderer::Get()->GetClearDepth(); | |||||
return m_renderer->GetClearDepth(); | |||||
} | } | ||||
void RenderContext::SetAlphaFunc(AlphaFunc func, float alpha) | void RenderContext::SetAlphaFunc(AlphaFunc func, float alpha) | ||||
{ | { | ||||
if (!m_data->m_alpha_func.HasChanged()) | |||||
m_data->m_alpha_func.TrackValue(Renderer::Get()->GetAlphaFunc()); | |||||
if (!m_data->m_alpha_value.HasChanged()) | |||||
m_data->m_alpha_value.TrackValue(Renderer::Get()->GetAlphaValue()); | |||||
if (!m_data->m_alpha_func.is_dirty()) | |||||
m_data->m_alpha_func.set(m_renderer->GetAlphaFunc()); | |||||
if (!m_data->m_alpha_value.is_dirty()) | |||||
m_data->m_alpha_value.set(m_renderer->GetAlphaValue()); | |||||
Renderer::Get()->SetAlphaFunc(func, alpha); | |||||
m_renderer->SetAlphaFunc(func, alpha); | |||||
} | } | ||||
AlphaFunc RenderContext::GetAlphaFunc() | AlphaFunc RenderContext::GetAlphaFunc() | ||||
{ | { | ||||
return Renderer::Get()->GetAlphaFunc(); | |||||
return m_renderer->GetAlphaFunc(); | |||||
} | } | ||||
float RenderContext::GetAlphaValue() | float RenderContext::GetAlphaValue() | ||||
{ | { | ||||
return Renderer::Get()->GetAlphaValue(); | |||||
return m_renderer->GetAlphaValue(); | |||||
} | } | ||||
void RenderContext::SetBlendEquation(BlendEquation rgb, BlendEquation alpha) | void RenderContext::SetBlendEquation(BlendEquation rgb, BlendEquation alpha) | ||||
{ | { | ||||
if (!m_data->m_blend_rgb.HasChanged()) | |||||
m_data->m_blend_rgb.TrackValue(Renderer::Get()->GetBlendEquationRgb()); | |||||
if (!m_data->m_blend_alpha.HasChanged()) | |||||
m_data->m_blend_alpha.TrackValue(Renderer::Get()->GetBlendEquationAlpha()); | |||||
if (!m_data->m_blend_rgb.is_dirty()) | |||||
m_data->m_blend_rgb.set(m_renderer->GetBlendEquationRgb()); | |||||
if (!m_data->m_blend_alpha.is_dirty()) | |||||
m_data->m_blend_alpha.set(m_renderer->GetBlendEquationAlpha()); | |||||
Renderer::Get()->SetBlendEquation(rgb, alpha); | |||||
m_renderer->SetBlendEquation(rgb, alpha); | |||||
} | } | ||||
BlendEquation RenderContext::GetBlendEquationRgb() | BlendEquation RenderContext::GetBlendEquationRgb() | ||||
{ | { | ||||
return Renderer::Get()->GetBlendEquationRgb(); | |||||
return m_renderer->GetBlendEquationRgb(); | |||||
} | } | ||||
BlendEquation RenderContext::GetBlendEquationAlpha() | BlendEquation RenderContext::GetBlendEquationAlpha() | ||||
{ | { | ||||
return Renderer::Get()->GetBlendEquationAlpha(); | |||||
return m_renderer->GetBlendEquationAlpha(); | |||||
} | } | ||||
void RenderContext::SetBlendFunc(BlendFunc src, BlendFunc dst) | void RenderContext::SetBlendFunc(BlendFunc src, BlendFunc dst) | ||||
{ | { | ||||
if (!m_data->m_blend_src.HasChanged()) | |||||
m_data->m_blend_src.TrackValue(Renderer::Get()->GetBlendFuncSrc()); | |||||
if (!m_data->m_blend_dst.HasChanged()) | |||||
m_data->m_blend_dst.TrackValue(Renderer::Get()->GetBlendFuncDst()); | |||||
if (!m_data->m_blend_src.is_dirty()) | |||||
m_data->m_blend_src.set(m_renderer->GetBlendFuncSrc()); | |||||
if (!m_data->m_blend_dst.is_dirty()) | |||||
m_data->m_blend_dst.set(m_renderer->GetBlendFuncDst()); | |||||
Renderer::Get()->SetBlendFunc(src, dst); | |||||
m_renderer->SetBlendFunc(src, dst); | |||||
} | } | ||||
BlendFunc RenderContext::GetBlendFuncSrc() | BlendFunc RenderContext::GetBlendFuncSrc() | ||||
{ | { | ||||
return Renderer::Get()->GetBlendFuncSrc(); | |||||
return m_renderer->GetBlendFuncSrc(); | |||||
} | } | ||||
BlendFunc RenderContext::GetBlendFuncDst() | BlendFunc RenderContext::GetBlendFuncDst() | ||||
{ | { | ||||
return Renderer::Get()->GetBlendFuncDst(); | |||||
return m_renderer->GetBlendFuncDst(); | |||||
} | } | ||||
void RenderContext::SetDepthFunc(DepthFunc func) | void RenderContext::SetDepthFunc(DepthFunc func) | ||||
{ | { | ||||
if (!m_data->m_depth_func.HasChanged()) | |||||
m_data->m_depth_func.TrackValue(Renderer::Get()->GetDepthFunc()); | |||||
if (!m_data->m_depth_func.is_dirty()) | |||||
m_data->m_depth_func.set(m_renderer->GetDepthFunc()); | |||||
Renderer::Get()->SetDepthFunc(func); | |||||
m_renderer->SetDepthFunc(func); | |||||
} | } | ||||
DepthFunc RenderContext::GetDepthFunc() | DepthFunc RenderContext::GetDepthFunc() | ||||
{ | { | ||||
return Renderer::Get()->GetDepthFunc(); | |||||
return m_renderer->GetDepthFunc(); | |||||
} | } | ||||
void RenderContext::SetDepthMask(DepthMask mask) | void RenderContext::SetDepthMask(DepthMask mask) | ||||
{ | { | ||||
if (!m_data->m_depth_mask.HasChanged()) | |||||
m_data->m_depth_mask.TrackValue(Renderer::Get()->GetDepthMask()); | |||||
if (!m_data->m_depth_mask.is_dirty()) | |||||
m_data->m_depth_mask.set(m_renderer->GetDepthMask()); | |||||
Renderer::Get()->SetDepthMask(mask); | |||||
m_renderer->SetDepthMask(mask); | |||||
} | } | ||||
DepthMask RenderContext::GetDepthMask() | DepthMask RenderContext::GetDepthMask() | ||||
{ | { | ||||
return Renderer::Get()->GetDepthMask(); | |||||
return m_renderer->GetDepthMask(); | |||||
} | } | ||||
void RenderContext::SetCullMode(CullMode mode) | void RenderContext::SetCullMode(CullMode mode) | ||||
{ | { | ||||
if (!m_data->m_cull_mode.HasChanged()) | |||||
m_data->m_cull_mode.TrackValue(Renderer::Get()->GetCullMode()); | |||||
if (!m_data->m_cull_mode.is_dirty()) | |||||
m_data->m_cull_mode.set(m_renderer->GetCullMode()); | |||||
Renderer::Get()->SetCullMode(mode); | |||||
m_renderer->SetCullMode(mode); | |||||
} | } | ||||
CullMode RenderContext::GetCullMode() | CullMode RenderContext::GetCullMode() | ||||
{ | { | ||||
return Renderer::Get()->GetCullMode(); | |||||
return m_renderer->GetCullMode(); | |||||
} | } | ||||
void RenderContext::SetPolygonMode(PolygonMode mode) | void RenderContext::SetPolygonMode(PolygonMode mode) | ||||
{ | { | ||||
if (!m_data->m_polygon_mode.HasChanged()) | |||||
m_data->m_polygon_mode.TrackValue(Renderer::Get()->GetPolygonMode()); | |||||
if (!m_data->m_polygon_mode.is_dirty()) | |||||
m_data->m_polygon_mode.set(m_renderer->GetPolygonMode()); | |||||
Renderer::Get()->SetPolygonMode(mode); | |||||
m_renderer->SetPolygonMode(mode); | |||||
} | } | ||||
PolygonMode RenderContext::GetPolygonMode() | PolygonMode RenderContext::GetPolygonMode() | ||||
{ | { | ||||
return Renderer::Get()->GetPolygonMode(); | |||||
return m_renderer->GetPolygonMode(); | |||||
} | } | ||||
void RenderContext::SetScissorMode(ScissorMode mode) | void RenderContext::SetScissorMode(ScissorMode mode) | ||||
{ | { | ||||
if (!m_data->m_scissor_mode.HasChanged()) | |||||
m_data->m_scissor_mode.TrackValue(Renderer::Get()->GetScissorMode()); | |||||
if (!m_data->m_scissor_mode.is_dirty()) | |||||
m_data->m_scissor_mode.set(m_renderer->GetScissorMode()); | |||||
Renderer::Get()->SetScissorMode(mode); | |||||
m_renderer->SetScissorMode(mode); | |||||
} | } | ||||
void RenderContext::SetScissorRect(vec4 rect) | void RenderContext::SetScissorRect(vec4 rect) | ||||
{ | { | ||||
if (!m_data->m_scissor_rect.HasChanged()) | |||||
m_data->m_scissor_rect.TrackValue(Renderer::Get()->GetScissorRect()); | |||||
if (!m_data->m_scissor_rect.is_dirty()) | |||||
m_data->m_scissor_rect.set(m_renderer->GetScissorRect()); | |||||
Renderer::Get()->SetScissorRect(rect); | |||||
m_renderer->SetScissorRect(rect); | |||||
} | } | ||||
ScissorMode RenderContext::GetScissorMode() | ScissorMode RenderContext::GetScissorMode() | ||||
{ | { | ||||
return Renderer::Get()->GetScissorMode(); | |||||
return m_renderer->GetScissorMode(); | |||||
} | } | ||||
vec4 RenderContext::GetScissorRect() | vec4 RenderContext::GetScissorRect() | ||||
{ | { | ||||
return Renderer::Get()->GetScissorRect(); | |||||
return m_renderer->GetScissorRect(); | |||||
} | } | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2017 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -30,13 +30,6 @@ | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
/* | |||||
* The global g_renderers object, initialised by Video::Setup | |||||
*/ | |||||
//Renderer *g_renderer = nullptr; | |||||
array<Renderer*> g_renderers; | |||||
/* | /* | ||||
* Private RendererData class | * Private RendererData class | ||||
*/ | */ | ||||
@@ -142,32 +135,6 @@ void Renderer::Clear(ClearMask mask) | |||||
glClear(m); | glClear(m); | ||||
} | } | ||||
/* | |||||
* Renderer static | |||||
*/ | |||||
void Renderer::AddNew(ivec2 size) | |||||
{ | |||||
g_renderers << new Renderer(size); | |||||
} | |||||
int Renderer::GetCount() | |||||
{ | |||||
return g_renderers.count(); | |||||
} | |||||
Renderer* Renderer::Get(int index) | |||||
{ | |||||
return g_renderers[index]; | |||||
} | |||||
void Renderer::DestroyAll() | |||||
{ | |||||
for (Renderer* renderer : g_renderers) | |||||
delete renderer; | |||||
g_renderers.clear(); | |||||
} | |||||
/* | /* | ||||
* Viewport dimensions | * Viewport dimensions | ||||
*/ | */ | ||||
@@ -1,15 +1,19 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// 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. | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// Lol Engine is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#pragma once | #pragma once | ||||
#include <lol/gpu/renderer.h> | |||||
// | // | ||||
// The RenderContext class | // The RenderContext class | ||||
// ----------------------- | // ----------------------- | ||||
@@ -23,7 +27,7 @@ class RenderContextData; | |||||
class RenderContext | class RenderContext | ||||
{ | { | ||||
public: | public: | ||||
RenderContext(); | |||||
RenderContext(Renderer *renderer); | |||||
~RenderContext(); | ~RenderContext(); | ||||
void SetViewport(ibox2 viewport); | void SetViewport(ibox2 viewport); | ||||
@@ -56,6 +60,7 @@ public: | |||||
vec4 GetScissorRect(); | vec4 GetScissorRect(); | ||||
private: | private: | ||||
Renderer *m_renderer; | |||||
RenderContextData *m_data; | RenderContextData *m_data; | ||||
}; | }; | ||||
@@ -1,11 +1,13 @@ | |||||
// | // | ||||
// Lol Engine | |||||
// 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. | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// Lol Engine is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. 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 the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | // | ||||
#pragma once | #pragma once | ||||
@@ -133,8 +135,8 @@ enum class ScissorMode : uint8_t | |||||
class Renderer | class Renderer | ||||
{ | { | ||||
private: | private: | ||||
/* Only the Video class can create a renderer for now. */ | |||||
friend class Video; | |||||
/* Only the Scene class can create a renderer for now. */ | |||||
friend class Scene; | |||||
Renderer(ivec2 size); | Renderer(ivec2 size); | ||||
~Renderer(); | ~Renderer(); | ||||
@@ -142,12 +144,6 @@ private: | |||||
public: | public: | ||||
void Clear(ClearMask mask); | void Clear(ClearMask mask); | ||||
static void AddNew(ivec2 size); | |||||
static int GetCount(); | |||||
static Renderer* Get(int index = 0); | |||||
static void DestroyAll(); | |||||
public: | |||||
void SetViewport(ibox2 viewport); | void SetViewport(ibox2 viewport); | ||||
ibox2 GetViewport() const; | ibox2 GetViewport() const; | ||||
float GetXYRatio() const; | float GetXYRatio() const; | ||||
@@ -192,7 +188,5 @@ private: | |||||
RendererData *m_data; | RendererData *m_data; | ||||
}; | }; | ||||
//extern Renderer *g_renderer; | |||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -2,7 +2,7 @@ | |||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // Copyright © 2009—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// © 2017—2018 Sam Hocevar <sam@hocevar.net> | |||||
// © 2017—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -357,7 +357,7 @@ void LolImGui::RenderDrawListsMethod(ImDrawData* draw_data) | |||||
if (!m_shader) | if (!m_shader) | ||||
return; | return; | ||||
RenderContext rc; | |||||
RenderContext rc(Scene::GetScene(0).get_renderer()); | |||||
rc.SetCullMode(CullMode::Disabled); | rc.SetCullMode(CullMode::Disabled); | ||||
rc.SetDepthFunc(DepthFunc::Disabled); | rc.SetDepthFunc(DepthFunc::Disabled); | ||||
rc.SetScissorMode(ScissorMode::Enabled); | rc.SetScissorMode(ScissorMode::Enabled); | ||||
@@ -2,7 +2,7 @@ | |||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2013—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // Copyright © 2013—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// © 2017—2018 Sam Hocevar <sam@hocevar.net> | |||||
// © 2017—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -32,7 +32,7 @@ extern "C" | |||||
#endif //EMSCRIPTEN | #endif //EMSCRIPTEN | ||||
/* | /* | ||||
* The global g_renderer object, initialised by Video::Init | |||||
* The global g_messageservice object, initialised by MessageService::Setup() | |||||
*/ | */ | ||||
MessageService *g_messageservice = nullptr; | MessageService *g_messageservice = nullptr; | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// © 2014—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2014—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
@@ -206,6 +206,8 @@ mutex SceneData::m_prim_mutex; | |||||
Scene::Scene(ivec2 size) | Scene::Scene(ivec2 size) | ||||
: data(new SceneData()) | : data(new SceneData()) | ||||
{ | { | ||||
m_renderer = new Renderer(size); | |||||
data->m_renderbuffer[0] = new Framebuffer(size); | data->m_renderbuffer[0] = new Framebuffer(size); | ||||
data->m_renderbuffer[1] = new Framebuffer(size); | data->m_renderbuffer[1] = new Framebuffer(size); | ||||
data->m_renderbuffer[2] = new Framebuffer(size); | data->m_renderbuffer[2] = new Framebuffer(size); | ||||
@@ -260,6 +262,7 @@ Scene::~Scene() | |||||
delete data->m_line_api.m_vdecl; | delete data->m_line_api.m_vdecl; | ||||
delete data->m_tile_api.m_vdecl; | delete data->m_tile_api.m_vdecl; | ||||
delete data; | delete data; | ||||
delete m_renderer; | |||||
} | } | ||||
//----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
@@ -595,14 +598,14 @@ void Scene::pre_render(float) | |||||
} | } | ||||
{ | { | ||||
RenderContext rc; | |||||
RenderContext rc(m_renderer); | |||||
if (do_pp) | if (do_pp) | ||||
{ | { | ||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
} | } | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
m_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||||
} | } | ||||
} | } | ||||
@@ -629,10 +632,10 @@ void Scene::post_render(float) | |||||
data->m_renderbuffer[3]->Bind(); | data->m_renderbuffer[3]->Bind(); | ||||
RenderContext rc; | |||||
RenderContext rc(m_renderer); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
m_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||||
/* Execute post process */ | /* Execute post process */ | ||||
data->m_pp.m_shader[1]->Bind(); | data->m_pp.m_shader[1]->Bind(); | ||||
@@ -653,10 +656,10 @@ void Scene::post_render(float) | |||||
data->m_pp.m_shader[0]->Bind(); | data->m_pp.m_shader[0]->Bind(); | ||||
RenderContext rc; | |||||
RenderContext rc(m_renderer); | |||||
rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | rc.SetClearColor(vec4(0.f, 0.f, 0.f, 1.f)); | ||||
rc.SetClearDepth(1.f); | rc.SetClearDepth(1.f); | ||||
Renderer::Get()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
m_renderer->Clear(ClearMask::Color | ClearMask::Depth); | |||||
/* Blit final image to screen */ | /* Blit final image to screen */ | ||||
data->m_pp.m_shader[0]->SetUniform(data->m_pp.m_buffer_uni[0][0], data->m_renderbuffer[3]->GetTextureUniform(), 3); | data->m_pp.m_shader[0]->SetUniform(data->m_pp.m_buffer_uni[0][0], data->m_renderbuffer[3]->GetTextureUniform(), 3); | ||||
@@ -683,7 +686,7 @@ void Scene::render_primitives() | |||||
ASSERT(!!data, "Trying to access a non-ready scene"); | ASSERT(!!data, "Trying to access a non-ready scene"); | ||||
/* FIXME: Temp fix for mesh having no render context*/ | /* FIXME: Temp fix for mesh having no render context*/ | ||||
RenderContext rc; | |||||
RenderContext rc(m_renderer); | |||||
rc.SetCullMode(CullMode::Clockwise); | rc.SetCullMode(CullMode::Clockwise); | ||||
rc.SetDepthFunc(DepthFunc::LessOrEqual); | rc.SetDepthFunc(DepthFunc::LessOrEqual); | ||||
@@ -703,7 +706,7 @@ void Scene::render_tiles() // XXX: rename to Blit() | |||||
{ | { | ||||
ASSERT(!!data, "Trying to access a non-ready scene"); | ASSERT(!!data, "Trying to access a non-ready scene"); | ||||
RenderContext rc; | |||||
RenderContext rc(m_renderer); | |||||
/* Early test if nothing needs to be rendered */ | /* Early test if nothing needs to be rendered */ | ||||
if (!data->m_tile_api.m_tiles.count() && !data->m_tile_api.m_palettes.count()) | if (!data->m_tile_api.m_tiles.count() && !data->m_tile_api.m_palettes.count()) | ||||
@@ -827,7 +830,7 @@ void Scene::render_lines(float seconds) | |||||
{ | { | ||||
ASSERT(!!data, "Trying to access a non-ready scene"); | ASSERT(!!data, "Trying to access a non-ready scene"); | ||||
RenderContext rc; | |||||
RenderContext rc(m_renderer); | |||||
if (!data->m_line_api.m_lines.count()) | if (!data->m_line_api.m_lines.count()) | ||||
return; | return; | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// © 2014—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2014—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
@@ -24,6 +24,7 @@ | |||||
#include "light.h" | #include "light.h" | ||||
#include "camera.h" | #include "camera.h" | ||||
#include "mesh/mesh.h" | #include "mesh/mesh.h" | ||||
#include <lol/gpu/renderer.h> | |||||
#define LOL_MAX_LIGHT_COUNT 8 | #define LOL_MAX_LIGHT_COUNT 8 | ||||
@@ -128,6 +129,8 @@ public: | |||||
void Reset(); | void Reset(); | ||||
Renderer *get_renderer() { return m_renderer; } | |||||
/* ============================== */ | /* ============================== */ | ||||
# define _KEY_IDX (uintptr_t)key /* TOUKY: I don't like that. hash should be fixed to handle these custom stuff */ | # define _KEY_IDX (uintptr_t)key /* TOUKY: I don't like that. hash should be fixed to handle these custom stuff */ | ||||
/* ============================== */ | /* ============================== */ | ||||
@@ -257,6 +260,7 @@ private: | |||||
void render_lines(float seconds); | void render_lines(float seconds); | ||||
SceneData *data; | SceneData *data; | ||||
Renderer *m_renderer; | |||||
}; | }; | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2016 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -41,8 +41,6 @@ DebugRenderMode VideoData::render_mode = DebugRenderMode::Default; | |||||
void Video::Setup(ivec2 size) | void Video::Setup(ivec2 size) | ||||
{ | { | ||||
//g_renderer = new Renderer(size); | |||||
Renderer::AddNew(size); | |||||
Scene::AddNew(size); | Scene::AddNew(size); | ||||
/* Initialise reasonable scene default properties */ | /* Initialise reasonable scene default properties */ | ||||
@@ -90,10 +88,6 @@ DebugRenderMode Video::GetDebugRenderMode() | |||||
void Video::Destroy() | void Video::Destroy() | ||||
{ | { | ||||
Scene::DestroyAll(); | Scene::DestroyAll(); | ||||
Renderer::DestroyAll(); | |||||
//delete g_renderer; | |||||
//g_renderer = nullptr; | |||||
} | } | ||||
void Video::Capture(uint32_t *buffer) | void Video::Capture(uint32_t *buffer) | ||||
@@ -128,7 +122,7 @@ void Video::Capture(uint32_t *buffer) | |||||
ivec2 Video::GetSize() | ivec2 Video::GetSize() | ||||
{ | { | ||||
return Renderer::Get()->GetViewport().extent(); | |||||
return Scene::GetScene(0).get_renderer()->GetViewport().extent(); | |||||
} | } | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||