| @@ -26,34 +26,31 @@ LOLFX_RESOURCE_DECLARE(01_triangle); | |||||
| class Triangle : public WorldEntity | class Triangle : public WorldEntity | ||||
| { | { | ||||
| public: | public: | ||||
| Triangle() | |||||
| : m_vertices({ vec2( 0.0f, 0.8f), | |||||
| vec2(-0.8f, -0.8f), | |||||
| vec2( 0.8f, -0.8f) }), | |||||
| m_ready(false) | |||||
| virtual bool init_draw() override | |||||
| { | { | ||||
| } | |||||
| virtual void tick_draw(float seconds, Scene &scene) | |||||
| { | |||||
| WorldEntity::tick_draw(seconds, scene); | |||||
| if (!m_ready) | |||||
| array<vec2> vertices | |||||
| { | { | ||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(01_triangle)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| vec2( 0.0f, 0.8f), | |||||
| vec2(-0.8f, -0.8f), | |||||
| vec2( 0.8f, -0.8f), | |||||
| }; | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(01_triangle)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_vbo = std::make_shared<VertexBuffer>(m_vertices.bytes()); | |||||
| void *vertices = m_vbo->Lock(0, 0); | |||||
| memcpy(vertices, &m_vertices[0], m_vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_ready = true; | |||||
| m_vbo = std::make_shared<VertexBuffer>(vertices.bytes()); | |||||
| void *data = m_vbo->Lock(0, 0); | |||||
| memcpy(data, vertices.data(), vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| /* FIXME: this object never cleans up */ | |||||
| } | |||||
| return true; | |||||
| } | |||||
| virtual void tick_draw(float seconds, Scene &scene) override | |||||
| { | |||||
| WorldEntity::tick_draw(seconds, scene); | |||||
| m_shader->Bind(); | m_shader->Bind(); | ||||
| m_vdecl->SetStream(m_vbo, m_coord); | m_vdecl->SetStream(m_vbo, m_coord); | ||||
| @@ -62,13 +59,20 @@ public: | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||
| virtual bool release_draw() override | |||||
| { | |||||
| m_shader.reset(); | |||||
| m_vdecl.reset(); | |||||
| m_vbo.reset(); | |||||
| return true; | |||||
| } | |||||
| private: | private: | ||||
| array<vec2> m_vertices; | |||||
| std::shared_ptr<Shader> m_shader; | std::shared_ptr<Shader> m_shader; | ||||
| ShaderAttrib m_coord; | ShaderAttrib m_coord; | ||||
| std::shared_ptr<VertexDeclaration> m_vdecl; | std::shared_ptr<VertexDeclaration> m_vdecl; | ||||
| std::shared_ptr<VertexBuffer> m_vbo; | std::shared_ptr<VertexBuffer> m_vbo; | ||||
| bool m_ready; | |||||
| }; | }; | ||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| @@ -41,8 +41,7 @@ public: | |||||
| 0, 4, 1, 5, 2, 6, 3, 7, }), | 0, 4, 1, 5, 2, 6, 3, 7, }), | ||||
| m_faces_indices({ 0, 1, 2, 2, 3, 0, 1, 5, 6, 6, 2, 1, | m_faces_indices({ 0, 1, 2, 2, 3, 0, 1, 5, 6, 6, 2, 1, | ||||
| 7, 6, 5, 5, 4, 7, 4, 0, 3, 3, 7, 4, | 7, 6, 5, 5, 4, 7, 4, 0, 3, 3, 7, 4, | ||||
| 4, 5, 1, 1, 0, 4, 3, 2, 6, 6, 7, 3, }), | |||||
| m_ready(false) | |||||
| 4, 5, 1, 1, 0, 4, 3, 2, 6, 6, 7, 3, }) | |||||
| { | { | ||||
| m_camera = new Camera(); | m_camera = new Camera(); | ||||
| m_camera->SetProjection(mat4::perspective(radians(30.f), 640.f, 480.f, .1f, 1000.f)); | m_camera->SetProjection(mat4::perspective(radians(30.f), 640.f, 480.f, .1f, 1000.f)); | ||||
| @@ -52,7 +51,6 @@ public: | |||||
| Scene& scene = Scene::GetScene(); | Scene& scene = Scene::GetScene(); | ||||
| scene.PushCamera(m_camera); | scene.PushCamera(m_camera); | ||||
| Ticker::Ref(m_camera); | Ticker::Ref(m_camera); | ||||
| } | } | ||||
| ~Cube() | ~Cube() | ||||
| @@ -62,7 +60,37 @@ public: | |||||
| Ticker::Unref(m_camera); | Ticker::Unref(m_camera); | ||||
| } | } | ||||
| virtual void tick_game(float seconds) | |||||
| virtual bool init_draw() override | |||||
| { | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(02_cube)); | |||||
| m_mvp = m_shader->GetUniformLocation("u_matrix"); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_color = m_shader->GetAttribLocation(VertexUsage::Color, 0); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>( | |||||
| VertexStream<vec3,vec3>(VertexUsage::Position, | |||||
| VertexUsage::Color)); | |||||
| m_vbo = std::make_shared<VertexBuffer>(m_mesh.bytes()); | |||||
| void *mesh = m_vbo->Lock(0, 0); | |||||
| memcpy(mesh, m_mesh.data(), m_mesh.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_lines_ibo = std::make_shared<IndexBuffer>(m_lines_indices.bytes()); | |||||
| void *indices = m_lines_ibo->Lock(0, 0); | |||||
| memcpy(indices, m_lines_indices.data(), m_lines_indices.bytes()); | |||||
| m_lines_ibo->Unlock(); | |||||
| m_faces_ibo = std::make_shared<IndexBuffer>(m_faces_indices.bytes()); | |||||
| indices = m_faces_ibo->Lock(0, 0); | |||||
| memcpy(indices, m_faces_indices.data(), m_faces_indices.bytes()); | |||||
| m_faces_ibo->Unlock(); | |||||
| return true; | |||||
| } | |||||
| virtual void tick_game(float seconds) override | |||||
| { | { | ||||
| WorldEntity::tick_game(seconds); | WorldEntity::tick_game(seconds); | ||||
| @@ -95,41 +123,10 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| virtual void tick_draw(float seconds, Scene &scene) | |||||
| virtual void tick_draw(float seconds, Scene &scene) override | |||||
| { | { | ||||
| WorldEntity::tick_draw(seconds, scene); | WorldEntity::tick_draw(seconds, scene); | ||||
| if (!m_ready) | |||||
| { | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(02_cube)); | |||||
| m_mvp = m_shader->GetUniformLocation("u_matrix"); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_color = m_shader->GetAttribLocation(VertexUsage::Color, 0); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>( | |||||
| VertexStream<vec3,vec3>(VertexUsage::Position, | |||||
| VertexUsage::Color)); | |||||
| m_vbo = std::make_shared<VertexBuffer>(m_mesh.bytes()); | |||||
| void *mesh = m_vbo->Lock(0, 0); | |||||
| memcpy(mesh, &m_mesh[0], m_mesh.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_lines_ibo = std::make_shared<IndexBuffer>(m_lines_indices.bytes()); | |||||
| void *indices = m_lines_ibo->Lock(0, 0); | |||||
| memcpy(indices, &m_lines_indices[0], m_lines_indices.bytes()); | |||||
| m_lines_ibo->Unlock(); | |||||
| m_faces_ibo = std::make_shared<IndexBuffer>(m_faces_indices.bytes()); | |||||
| indices = m_faces_ibo->Lock(0, 0); | |||||
| memcpy(indices, &m_faces_indices[0], m_faces_indices.bytes()); | |||||
| m_faces_ibo->Unlock(); | |||||
| /* FIXME: this object never cleans up */ | |||||
| m_ready = true; | |||||
| } | |||||
| scene.get_renderer()->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(); | ||||
| @@ -149,6 +146,16 @@ public: | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||
| virtual bool release_draw() override | |||||
| { | |||||
| m_shader.reset(); | |||||
| m_vdecl.reset(); | |||||
| m_vbo.reset(); | |||||
| m_lines_ibo.reset(); | |||||
| m_faces_ibo.reset(); | |||||
| return true; | |||||
| } | |||||
| private: | private: | ||||
| Camera* m_camera = nullptr; | Camera* m_camera = nullptr; | ||||
| float m_angle; | float m_angle; | ||||
| @@ -162,8 +169,6 @@ private: | |||||
| std::shared_ptr<VertexDeclaration> m_vdecl; | std::shared_ptr<VertexDeclaration> m_vdecl; | ||||
| std::shared_ptr<VertexBuffer> m_vbo; | std::shared_ptr<VertexBuffer> m_vbo; | ||||
| std::shared_ptr<IndexBuffer> m_lines_ibo, m_faces_ibo; | std::shared_ptr<IndexBuffer> m_lines_ibo, m_faces_ibo; | ||||
| bool m_ready; | |||||
| }; | }; | ||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| @@ -26,42 +26,38 @@ LOLFX_RESOURCE_DECLARE(03_noise); | |||||
| class NoiseDemo : public WorldEntity | class NoiseDemo : public WorldEntity | ||||
| { | { | ||||
| public: | public: | ||||
| NoiseDemo() | |||||
| : m_vertices({ vec2(-1.0, 1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2(-1.0, 1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2( 1.0, 1.0), }), | |||||
| m_time(0.0), | |||||
| m_ready(false) | |||||
| virtual bool init_draw() override | |||||
| { | { | ||||
| array<vec2> vertices | |||||
| { | |||||
| vec2(-1.0, 1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2(-1.0, 1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2( 1.0, 1.0), | |||||
| }; | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(03_noise)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_time_uni = m_shader->GetUniformLocation("u_time"); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_vbo = std::make_shared<VertexBuffer>(vertices.bytes()); | |||||
| void *data = m_vbo->Lock(0, 0); | |||||
| memcpy(data, vertices.data(), vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| return true; | |||||
| } | } | ||||
| virtual void tick_draw(float seconds, Scene &scene) | |||||
| virtual void tick_draw(float seconds, Scene &scene) override | |||||
| { | { | ||||
| WorldEntity::tick_draw(seconds, scene); | WorldEntity::tick_draw(seconds, scene); | ||||
| m_time += seconds; | m_time += seconds; | ||||
| if (!m_ready) | |||||
| { | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(03_noise)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_time_uni = m_shader->GetUniformLocation("u_time"); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_vbo = std::make_shared<VertexBuffer>(m_vertices.bytes()); | |||||
| void *vertices = m_vbo->Lock(0, 0); | |||||
| memcpy(vertices, &m_vertices[0], m_vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_ready = true; | |||||
| /* FIXME: this object never cleans up */ | |||||
| } | |||||
| m_shader->Bind(); | m_shader->Bind(); | ||||
| m_shader->SetUniform(m_time_uni, m_time); | m_shader->SetUniform(m_time_uni, m_time); | ||||
| m_vdecl->SetStream(m_vbo, m_coord); | m_vdecl->SetStream(m_vbo, m_coord); | ||||
| @@ -70,15 +66,21 @@ public: | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||
| virtual bool release_draw() override | |||||
| { | |||||
| m_shader.reset(); | |||||
| m_vdecl.reset(); | |||||
| m_vbo.reset(); | |||||
| return true; | |||||
| } | |||||
| private: | private: | ||||
| array<vec2> m_vertices; | |||||
| std::shared_ptr<Shader> m_shader; | std::shared_ptr<Shader> m_shader; | ||||
| ShaderAttrib m_coord; | ShaderAttrib m_coord; | ||||
| ShaderUniform m_time_uni; | ShaderUniform m_time_uni; | ||||
| std::shared_ptr<VertexDeclaration> m_vdecl; | std::shared_ptr<VertexDeclaration> m_vdecl; | ||||
| std::shared_ptr<VertexBuffer> m_vbo; | std::shared_ptr<VertexBuffer> m_vbo; | ||||
| float m_time; | |||||
| bool m_ready; | |||||
| float m_time = 0.0; | |||||
| }; | }; | ||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| @@ -27,19 +27,11 @@ class TextureDemo : public WorldEntity | |||||
| { | { | ||||
| public: | public: | ||||
| TextureDemo() | TextureDemo() | ||||
| : m_vertices({ vec2(-1.0, 1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2(-1.0, 1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2( 1.0, 1.0), }), | |||||
| m_frames(0), | |||||
| m_ready(false) | |||||
| { | { | ||||
| m_heightmap.resize(TEXTURE_WIDTH * 1); | m_heightmap.resize(TEXTURE_WIDTH * 1); | ||||
| } | } | ||||
| virtual void tick_game(float seconds) | |||||
| virtual void tick_game(float seconds) override | |||||
| { | { | ||||
| WorldEntity::tick_game(seconds); | WorldEntity::tick_game(seconds); | ||||
| @@ -60,30 +52,37 @@ public: | |||||
| ++m_frames; | ++m_frames; | ||||
| } | } | ||||
| virtual void tick_draw(float seconds, Scene &scene) | |||||
| virtual bool init_draw() override | |||||
| { | { | ||||
| WorldEntity::tick_draw(seconds, scene); | |||||
| /* Initialise GPU data */ | |||||
| if (!m_ready) | |||||
| array<vec2> vertices | |||||
| { | { | ||||
| m_texture = std::make_shared<Texture>(ivec2(TEXTURE_WIDTH, 1), PixelFormat::Y_8); | |||||
| vec2(-1.0, 1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2(-1.0, 1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2( 1.0, 1.0), | |||||
| }; | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(04_texture)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_texture_uni = m_shader->GetUniformLocation("u_texture"); | |||||
| m_texture = std::make_shared<Texture>(ivec2(TEXTURE_WIDTH, 1), PixelFormat::Y_8); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(04_texture)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_texture_uni = m_shader->GetUniformLocation("u_texture"); | |||||
| m_vbo = std::make_shared<VertexBuffer>(m_vertices.bytes()); | |||||
| void *vertices = m_vbo->Lock(0, 0); | |||||
| memcpy(vertices, &m_vertices[0], m_vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_ready = true; | |||||
| m_vbo = std::make_shared<VertexBuffer>(vertices.bytes()); | |||||
| void *data = m_vbo->Lock(0, 0); | |||||
| memcpy(data, vertices.data(), vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| /* FIXME: this object never cleans up */ | |||||
| } | |||||
| return true; | |||||
| } | |||||
| virtual void tick_draw(float seconds, Scene &scene) | |||||
| { | |||||
| WorldEntity::tick_draw(seconds, scene); | |||||
| /* Send new heightmap to GPU */ | /* Send new heightmap to GPU */ | ||||
| m_texture->Bind(); | m_texture->Bind(); | ||||
| @@ -97,8 +96,16 @@ public: | |||||
| m_vdecl->Unbind(); | m_vdecl->Unbind(); | ||||
| } | } | ||||
| virtual bool release_draw() override | |||||
| { | |||||
| m_texture.reset(); | |||||
| m_shader.reset(); | |||||
| m_vdecl.reset(); | |||||
| m_vbo.reset(); | |||||
| return true; | |||||
| } | |||||
| private: | private: | ||||
| array<vec2> m_vertices; | |||||
| std::shared_ptr<Texture> m_texture; | std::shared_ptr<Texture> m_texture; | ||||
| std::shared_ptr<Shader> m_shader; | std::shared_ptr<Shader> m_shader; | ||||
| ShaderAttrib m_coord; | ShaderAttrib m_coord; | ||||
| @@ -106,8 +113,7 @@ private: | |||||
| std::shared_ptr<VertexDeclaration> m_vdecl; | std::shared_ptr<VertexDeclaration> m_vdecl; | ||||
| std::shared_ptr<VertexBuffer> m_vbo; | std::shared_ptr<VertexBuffer> m_vbo; | ||||
| array<uint8_t> m_heightmap; | array<uint8_t> m_heightmap; | ||||
| int m_frames; | |||||
| bool m_ready; | |||||
| int m_frames = 0; | |||||
| }; | }; | ||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
| @@ -25,19 +25,7 @@ LOLFX_RESOURCE_DECLARE(08_fbo); | |||||
| class FBO : public WorldEntity | class FBO : public WorldEntity | ||||
| { | { | ||||
| public: | public: | ||||
| FBO() | |||||
| : m_vertices { vec2( 1.0, 1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, 1.0), | |||||
| vec2(-1.0, 1.0), }, | |||||
| m_time(0.f), | |||||
| m_ready(false) | |||||
| { | |||||
| } | |||||
| virtual void tick_game(float seconds) | |||||
| virtual void tick_game(float seconds) override | |||||
| { | { | ||||
| WorldEntity::tick_game(seconds); | WorldEntity::tick_game(seconds); | ||||
| @@ -54,42 +42,49 @@ public: | |||||
| m_color /= x; | m_color /= x; | ||||
| } | } | ||||
| virtual void tick_draw(float seconds, Scene &scene) | |||||
| virtual bool init_draw() override | |||||
| { | { | ||||
| WorldEntity::tick_draw(seconds, scene); | |||||
| if (!m_ready) | |||||
| array<vec2> vertices | |||||
| { | { | ||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(08_fbo)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_uni_flag = m_shader->GetUniformLocation("u_flag"); | |||||
| m_uni_point = m_shader->GetUniformLocation("u_point"); | |||||
| m_uni_color = m_shader->GetUniformLocation("u_color"); | |||||
| m_uni_texture = m_shader->GetUniformLocation("u_texture"); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_vbo = std::make_shared<VertexBuffer>(m_vertices.bytes()); | |||||
| void *vertices = m_vbo->Lock(0, 0); | |||||
| memcpy(vertices, &m_vertices[0], m_vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_fbo = std::make_shared<Framebuffer>(Video::GetSize()); | |||||
| m_fbo->Bind(); | |||||
| { | |||||
| render_context rc(scene.get_renderer()); | |||||
| rc.clear_color(vec4(0.f, 0.f, 0.f, 1.f)); | |||||
| rc.clear_depth(1.f); | |||||
| scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
| } | |||||
| m_fbo->Unbind(); | |||||
| vec2( 1.0, 1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, -1.0), | |||||
| vec2(-1.0, -1.0), | |||||
| vec2( 1.0, 1.0), | |||||
| vec2(-1.0, 1.0), | |||||
| }; | |||||
| m_shader = Shader::Create(LOLFX_RESOURCE_NAME(08_fbo)); | |||||
| m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||||
| m_uni_flag = m_shader->GetUniformLocation("u_flag"); | |||||
| m_uni_point = m_shader->GetUniformLocation("u_point"); | |||||
| m_uni_color = m_shader->GetUniformLocation("u_color"); | |||||
| m_uni_texture = m_shader->GetUniformLocation("u_texture"); | |||||
| m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||||
| m_vbo = std::make_shared<VertexBuffer>(vertices.bytes()); | |||||
| void *data = m_vbo->Lock(0, 0); | |||||
| memcpy(data, vertices.data(), vertices.bytes()); | |||||
| m_vbo->Unlock(); | |||||
| m_fbo = std::make_shared<Framebuffer>(Video::GetSize()); | |||||
| return true; | |||||
| } | |||||
| m_ready = true; | |||||
| virtual void tick_draw(float seconds, Scene &scene) override | |||||
| { | |||||
| WorldEntity::tick_draw(seconds, scene); | |||||
| /* FIXME: this object never cleans up */ | |||||
| // FIXME: this should only be done once! | |||||
| m_fbo->Bind(); | |||||
| { | |||||
| render_context rc(scene.get_renderer()); | |||||
| rc.clear_color(vec4(0.f, 0.f, 0.f, 1.f)); | |||||
| rc.clear_depth(1.f); | |||||
| scene.get_renderer()->Clear(ClearMask::Color | ClearMask::Depth); | |||||
| } | } | ||||
| m_fbo->Unbind(); | |||||
| /* FIXME: we should just disable depth test in the shader */ | /* FIXME: we should just disable depth test in the shader */ | ||||
| render_context rc(scene.get_renderer()); | render_context rc(scene.get_renderer()); | ||||
| @@ -120,17 +115,24 @@ public: | |||||
| m_shader->Unbind(); | m_shader->Unbind(); | ||||
| } | } | ||||
| virtual bool release_draw() override | |||||
| { | |||||
| m_shader.reset(); | |||||
| m_vdecl.reset(); | |||||
| m_vbo.reset(); | |||||
| m_fbo.reset(); | |||||
| return true; | |||||
| } | |||||
| private: | private: | ||||
| array<vec2> m_vertices; | |||||
| std::shared_ptr<Shader> m_shader; | std::shared_ptr<Shader> m_shader; | ||||
| ShaderAttrib m_coord; | ShaderAttrib m_coord; | ||||
| ShaderUniform m_uni_flag, m_uni_point, m_uni_color, m_uni_texture; | ShaderUniform m_uni_flag, m_uni_point, m_uni_color, m_uni_texture; | ||||
| std::shared_ptr<VertexDeclaration> m_vdecl; | std::shared_ptr<VertexDeclaration> m_vdecl; | ||||
| std::shared_ptr<VertexBuffer> m_vbo; | std::shared_ptr<VertexBuffer> m_vbo; | ||||
| std::shared_ptr<Framebuffer> m_fbo; | std::shared_ptr<Framebuffer> m_fbo; | ||||
| double m_time; | |||||
| double m_time = 0.0f; | |||||
| vec3 m_hotspot, m_color; | vec3 m_hotspot, m_color; | ||||
| bool m_ready; | |||||
| }; | }; | ||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||