@@ -721,7 +721,7 @@ void BtPhysTest::tick_draw(float seconds, Scene &scene) | |||
//----------------------------------------------------------------------------- | |||
// CShaderData | |||
//----------------------------------------------------------------------------- | |||
CatShaderData::CatShaderData(uint32_t vert_decl_flags, Shader* shader) | |||
CatShaderData::CatShaderData(uint32_t vert_decl_flags, std::shared_ptr<Shader> shader) | |||
: GpuShaderData(vert_decl_flags, shader, DebugRenderMode::Default) | |||
{ | |||
m_sprite_orientation = .0f; | |||
@@ -2,7 +2,7 @@ | |||
// Lol Engine — Bullet physics test | |||
// | |||
// Copyright © 2009—2013 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -13,6 +13,7 @@ | |||
#pragma once | |||
#include <memory> | |||
#include <string> | |||
#include <map> | |||
@@ -22,7 +23,7 @@ class CatShaderData : public GpuShaderData | |||
public: | |||
//--- | |||
CatShaderData(uint32_t vert_decl_flags, Shader* shader); | |||
CatShaderData(uint32_t vert_decl_flags, std::shared_ptr<Shader> shader); | |||
//--- | |||
void SetupDefaultData(); | |||
virtual void SetupShaderDatas(mat4 const &model); | |||
@@ -89,7 +90,7 @@ private: | |||
TileSet* m_cat_texture; | |||
Shader* m_cat_shader; | |||
std::shared_ptr<Shader> m_cat_shader; | |||
CatShaderData* m_cat_sdata; | |||
Camera* m_camera; | |||
Controller* m_controller; | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine — Triangle 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -14,6 +14,8 @@ | |||
# include "config.h" | |||
#endif | |||
#include <memory> | |||
#include <lol/engine.h> | |||
#include "loldebug.h" | |||
@@ -41,9 +43,9 @@ public: | |||
m_shader = Shader::Create(LOLFX_RESOURCE_NAME(01_triangle)); | |||
m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||
m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vbo = new VertexBuffer(m_vertices.bytes()); | |||
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(); | |||
@@ -62,10 +64,10 @@ public: | |||
private: | |||
array<vec2> m_vertices; | |||
Shader *m_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
ShaderAttrib m_coord; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
bool m_ready; | |||
}; | |||
@@ -107,21 +107,21 @@ public: | |||
m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||
m_color = m_shader->GetAttribLocation(VertexUsage::Color, 0); | |||
m_vdecl = | |||
new VertexDeclaration(VertexStream<vec3,vec3>(VertexUsage::Position, | |||
m_vdecl = std::make_shared<VertexDeclaration>( | |||
VertexStream<vec3,vec3>(VertexUsage::Position, | |||
VertexUsage::Color)); | |||
m_vbo = new VertexBuffer(m_mesh.bytes()); | |||
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 = new IndexBuffer(m_lines_indices.bytes()); | |||
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 = new IndexBuffer(m_faces_indices.bytes()); | |||
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(); | |||
@@ -156,12 +156,12 @@ private: | |||
array<vec3,vec3> m_mesh; | |||
array<uint16_t> m_lines_indices, m_faces_indices; | |||
Shader *m_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
ShaderAttrib m_coord, m_color; | |||
ShaderUniform m_mvp; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo; | |||
IndexBuffer *m_lines_ibo, *m_faces_ibo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
std::shared_ptr<IndexBuffer> m_lines_ibo, m_faces_ibo; | |||
bool m_ready; | |||
}; | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine — Noise 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -14,6 +14,8 @@ | |||
# include "config.h" | |||
#endif | |||
#include <memory> | |||
#include <lol/engine.h> | |||
#include "loldebug.h" | |||
@@ -48,9 +50,9 @@ public: | |||
m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||
m_time_uni = m_shader->GetUniformLocation("u_time"); | |||
m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vbo = new VertexBuffer(m_vertices.bytes()); | |||
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(); | |||
@@ -70,11 +72,11 @@ public: | |||
private: | |||
array<vec2> m_vertices; | |||
Shader *m_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
ShaderAttrib m_coord; | |||
ShaderUniform m_time_uni; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
float m_time; | |||
bool m_ready; | |||
}; | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine — Graphing 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -67,15 +67,15 @@ public: | |||
/* Initialise GPU data */ | |||
if (!m_ready) | |||
{ | |||
m_texture = new Texture(ivec2(TEXTURE_WIDTH, 1), PixelFormat::Y_8); | |||
m_texture = std::make_shared<Texture>(ivec2(TEXTURE_WIDTH, 1), PixelFormat::Y_8); | |||
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_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vbo = new VertexBuffer(m_vertices.bytes()); | |||
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(); | |||
@@ -99,12 +99,12 @@ public: | |||
private: | |||
array<vec2> m_vertices; | |||
Texture *m_texture; | |||
Shader *m_shader; | |||
std::shared_ptr<Texture> m_texture; | |||
std::shared_ptr<Shader> m_shader; | |||
ShaderAttrib m_coord; | |||
ShaderUniform m_texture_uni; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
array<uint8_t> m_heightmap; | |||
int m_frames; | |||
bool m_ready; | |||
@@ -116,7 +116,6 @@ int main(int argc, char **argv) | |||
Application app("Tutorial 4: Texture", ivec2(1280, 720), 60.0f); | |||
//new DebugFps(50, 50); | |||
new TextureDemo(); | |||
app.Run(); | |||
@@ -137,7 +137,7 @@ public: | |||
#if USE_CUSTOM_SHADER | |||
/* Custom Shader: Init the shader */ | |||
Shader *custom_shader = Shader::Create(LOLFX_RESOURCE_NAME(easymesh_shiny)); | |||
auto custom_shader = Shader::Create(LOLFX_RESOURCE_NAME(easymesh_shiny)); | |||
// any other shader stuf here (Get uniform, mostly, and set texture) | |||
for (int i = 0; i < m_gears.count(); i++) | |||
@@ -154,7 +154,6 @@ public: | |||
} | |||
private: | |||
Shader* m_custom_shader; | |||
array<EasyMesh, mat4, float> m_gears; | |||
float m_angle; | |||
mat4 m_mat; | |||
@@ -168,21 +168,21 @@ public: | |||
m_coord = m_shader->GetAttribLocation(VertexUsage::Position, 0); | |||
m_color = m_shader->GetAttribLocation(VertexUsage::Color, 0); | |||
m_vdecl = | |||
new VertexDeclaration(VertexStream<vec3,vec3>(VertexUsage::Position, | |||
m_vdecl = std::make_shared<VertexDeclaration>( | |||
VertexStream<vec3,vec3>(VertexUsage::Position, | |||
VertexUsage::Color)); | |||
m_vbo = new VertexBuffer(m_mesh.bytes()); | |||
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 = new IndexBuffer(m_lines_indices.bytes()); | |||
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 = new IndexBuffer(m_faces_indices.bytes()); | |||
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(); | |||
@@ -238,12 +238,12 @@ private: | |||
array<vec3,vec3> m_mesh; | |||
array<uint16_t> m_lines_indices, m_faces_indices; | |||
Shader *m_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
ShaderAttrib m_coord, m_color; | |||
ShaderUniform m_mvp; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo; | |||
IndexBuffer *m_lines_ibo, *m_faces_ibo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
std::shared_ptr<IndexBuffer> m_lines_ibo, m_faces_ibo; | |||
Text *m_text; | |||
bool m_ready; | |||
@@ -16,6 +16,8 @@ | |||
#include <lol/engine.h> | |||
#include <memory> | |||
using namespace lol; | |||
LOLFX_RESOURCE_DECLARE(08_fbo); | |||
@@ -65,14 +67,14 @@ public: | |||
m_uni_color = m_shader->GetUniformLocation("u_color"); | |||
m_uni_texture = m_shader->GetUniformLocation("u_texture"); | |||
m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vbo = new VertexBuffer(m_vertices.bytes()); | |||
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 = new Framebuffer(Video::GetSize()); | |||
m_fbo = std::make_shared<Framebuffer>(Video::GetSize()); | |||
m_fbo->Bind(); | |||
{ | |||
@@ -120,12 +122,12 @@ public: | |||
private: | |||
array<vec2> m_vertices; | |||
Shader *m_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
ShaderAttrib m_coord; | |||
ShaderUniform m_uni_flag, m_uni_point, m_uni_color, m_uni_texture; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo; | |||
Framebuffer *m_fbo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
std::shared_ptr<Framebuffer> m_fbo; | |||
double m_time; | |||
vec3 m_hotspot, m_color; | |||
bool m_ready; | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine — Fractal tutorial | |||
// | |||
// Copyright © 2011—2016 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2011—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 | |||
@@ -14,6 +14,7 @@ | |||
# include "config.h" | |||
#endif | |||
#include <memory> | |||
#include <cstring> | |||
#include <cstdio> | |||
@@ -460,8 +461,8 @@ public: | |||
{ | |||
/* Create a texture of half the width and twice the height | |||
* so that we can upload four different subimages each frame. */ | |||
m_texture = new Texture(ivec2(m_size.x / 2, m_size.y * 2), | |||
PixelFormat::RGBA_8); | |||
m_texture = std::make_shared<Texture>(ivec2(m_size.x / 2, m_size.y * 2), | |||
PixelFormat::RGBA_8); | |||
/* Ensure the texture data is complete at least once, otherwise | |||
* uploading subimages will not work. */ | |||
@@ -476,11 +477,11 @@ public: | |||
m_screenuni = m_shader->GetUniformLocation("u_screen_size"); | |||
m_zoomuni = m_shader->GetUniformLocation("u_zoom_settings"); | |||
m_vdecl = | |||
new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position), | |||
m_vdecl = std::make_shared<VertexDeclaration>( | |||
VertexStream<vec2>(VertexUsage::Position), | |||
VertexStream<vec2>(VertexUsage::TexCoord)); | |||
m_vbo = new VertexBuffer(sizeof(vertices)); | |||
m_tbo = new VertexBuffer(sizeof(texcoords)); | |||
m_vbo = std::make_shared<VertexBuffer>(sizeof(vertices)); | |||
m_tbo = std::make_shared<VertexBuffer>(sizeof(texcoords)); | |||
void *tmp = m_vbo->Lock(0, 0); | |||
memcpy(tmp, vertices, sizeof(vertices)); | |||
@@ -537,13 +538,13 @@ private: | |||
dvec2 m_texel2world; | |||
array<u8vec4> m_pixels, m_palette; | |||
Shader *m_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
ShaderAttrib m_vertexattrib, m_texattrib; | |||
ShaderUniform m_texuni, m_texeluni, m_screenuni, m_zoomuni; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo, *m_tbo; | |||
Texture *m_texture; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo, m_tbo; | |||
std::shared_ptr<Texture> m_texture; | |||
int m_frame, m_slices, m_dirty[4]; | |||
bool m_ready, m_drag; | |||
@@ -15,6 +15,8 @@ | |||
# include "config.h" | |||
#endif | |||
#include <memory> | |||
#include <lol/engine.h> | |||
#include "loldebug.h" | |||
@@ -102,9 +104,9 @@ public: | |||
if (!m_ready) | |||
{ | |||
m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||
m_vbo = new VertexBuffer(m_vertices.bytes()); | |||
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(); | |||
@@ -115,7 +117,7 @@ public: | |||
for (int i = 0; i < MaxFboType; ++i) | |||
{ | |||
m_fbos.push(new Framebuffer(Video::GetSize()), 0, array<ShaderUniform>(), array<ShaderAttrib>() ); | |||
m_fbos.push(std::make_shared<Framebuffer>(Video::GetSize()), 0, array<ShaderUniform>(), array<ShaderAttrib>() ); | |||
if (i == SrcVoronoiFbo) | |||
{ | |||
@@ -152,7 +154,7 @@ public: | |||
m_fbos.last().m1->Unbind(); | |||
} | |||
temp_buffer = new Framebuffer(Video::GetSize()); | |||
temp_buffer = std::make_shared<Framebuffer>(Video::GetSize()); | |||
temp_buffer->Bind(); | |||
{ | |||
RenderContext rc(scene.get_renderer()); | |||
@@ -259,8 +261,7 @@ public: | |||
int buf = voronoi_points.count() % 2; | |||
for (int j = 0; j < voronoi_points.count(); ++j) | |||
{ | |||
Framebuffer *dst_buf; | |||
Framebuffer *src_buf; | |||
std::shared_ptr<Framebuffer> dst_buf, src_buf; | |||
if (buf) | |||
{ | |||
@@ -314,9 +315,8 @@ public: | |||
int buf = 0; | |||
while (1) | |||
{ | |||
Framebuffer *dst_buf; | |||
Framebuffer *src_buf; | |||
Shader *shader; | |||
std::shared_ptr<Framebuffer> dst_buf, src_buf; | |||
std::shared_ptr<Shader> shader; | |||
if (curres == ivec2::zero) | |||
shader = m_screen_shader; | |||
@@ -385,15 +385,15 @@ private: | |||
Controller* m_controller; | |||
array<vec3, vec2> voronoi_points; | |||
array<vec2> m_vertices; | |||
Shader *m_screen_shader; | |||
std::shared_ptr<Shader> m_screen_shader; | |||
ShaderAttrib m_screen_coord; | |||
ShaderUniform m_screen_texture; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
array<Framebuffer *, Shader *, array<ShaderUniform>, array<ShaderAttrib> > m_fbos; | |||
Framebuffer *temp_buffer; | |||
array<std::shared_ptr<Framebuffer>, std::shared_ptr<Shader>, array<ShaderUniform>, array<ShaderAttrib> > m_fbos; | |||
std::shared_ptr<Framebuffer> temp_buffer; | |||
int mode; | |||
int m_cur_fbo; | |||
@@ -114,8 +114,8 @@ public: | |||
//code = file.ReadString(); | |||
file.Close(); | |||
Shader* shader = Shader::Create(builder.GetName(), code); | |||
Shader::Destroy(shader); | |||
std::shared_ptr<Shader> shader = Shader::Create(builder.GetName(), code); | |||
shader = nullptr; | |||
Ticker::Shutdown(); | |||
} | |||
@@ -2,7 +2,7 @@ | |||
// Lol Engine | |||
// | |||
// Copyright © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||
// © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// © 2009—2013 Cédric Lecacheur <jordx@free.fr> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
@@ -29,10 +29,10 @@ LOLFX_RESOURCE_DECLARE(easymesh_shiny_SK); | |||
void EasyMesh::MeshConvert() | |||
{ | |||
/* Default material */ | |||
Shader *shader = Shader::Create(LOLFX_RESOURCE_NAME(easymesh_shiny)); | |||
auto shader = Shader::Create(LOLFX_RESOURCE_NAME(easymesh_shiny)); | |||
/* Push index buffer to GPU */ | |||
IndexBuffer *ibo = new IndexBuffer(m_indices.count() * sizeof(uint16_t)); | |||
auto ibo = std::make_shared<IndexBuffer>(m_indices.count() * sizeof(uint16_t)); | |||
uint16_t *indices = (uint16_t *)ibo->Lock(0, 0); | |||
for (int i = 0; i < m_indices.count(); ++i) | |||
indices[i] = m_indices[i]; | |||
@@ -46,13 +46,13 @@ void EasyMesh::MeshConvert() | |||
vec4 texcoord; | |||
}; | |||
VertexDeclaration *vdecl = new VertexDeclaration( | |||
auto vdecl = std::make_shared<VertexDeclaration>( | |||
VertexStream<vec3, vec3, u8vec4, vec4>(VertexUsage::Position, | |||
VertexUsage::Normal, | |||
VertexUsage::Color, | |||
VertexUsage::TexCoord)); | |||
VertexBuffer *vbo = new VertexBuffer(m_vert.count() * sizeof(Vertex)); | |||
auto vbo = std::make_shared<VertexBuffer>(m_vert.count() * sizeof(Vertex)); | |||
Vertex *vert = (Vertex *)vbo->Lock(0, 0); | |||
for (int i = 0; i < m_vert.count(); ++i) | |||
{ | |||
@@ -64,9 +64,9 @@ void EasyMesh::MeshConvert() | |||
vbo->Unlock(); | |||
/* Reference our new data in our submesh */ | |||
m_submeshes.push(new SubMesh(shader, vdecl)); | |||
m_submeshes.last()->SetIndexBuffer(ibo); | |||
m_submeshes.last()->SetVertexBuffer(0, vbo); | |||
m_submeshes.push_back(std::make_shared<SubMesh>(shader, vdecl)); | |||
m_submeshes.back()->SetIndexBuffer(ibo); | |||
m_submeshes.back()->SetVertexBuffer(0, vbo); | |||
m_state = MeshRender::CanRender; | |||
} | |||
@@ -78,11 +78,11 @@ GpuShaderData::GpuShaderData() | |||
} | |||
//----------------------------------------------------------------------------- | |||
GpuShaderData::GpuShaderData(uint16_t vert_decl_flags, Shader* shader, DebugRenderMode render_mode) | |||
GpuShaderData::GpuShaderData(uint16_t vert_decl_flags, std::shared_ptr<Shader> shader, DebugRenderMode render_mode) | |||
: m_render_mode(render_mode), | |||
m_shader(shader), | |||
m_vert_decl_flags(vert_decl_flags) | |||
{ | |||
m_render_mode = render_mode; | |||
m_shader = shader; | |||
m_vert_decl_flags = vert_decl_flags; | |||
} | |||
//----------------------------------------------------------------------------- | |||
@@ -152,7 +152,7 @@ DefaultShaderData::DefaultShaderData(DebugRenderMode render_mode) | |||
} | |||
//----------------------------------------------------------------------------- | |||
DefaultShaderData::DefaultShaderData(uint16_t vert_decl_flags, Shader* shader, bool with_UV) | |||
DefaultShaderData::DefaultShaderData(uint16_t vert_decl_flags, std::shared_ptr<Shader> shader, bool with_UV) | |||
: GpuShaderData(vert_decl_flags, shader, DebugRenderMode::Default) | |||
{ | |||
StoreUniformNames(); | |||
@@ -222,16 +222,13 @@ GpuEasyMeshData::GpuEasyMeshData() | |||
{ | |||
m_vertexcount = 0; | |||
m_indexcount = 0; | |||
m_ibo = nullptr; | |||
} | |||
//----------------------------------------------------------------------------- | |||
GpuEasyMeshData::~GpuEasyMeshData() | |||
{ | |||
m_gpudatas.clear(); | |||
m_vdatas.clear(); | |||
if (m_ibo) | |||
delete m_ibo; | |||
m_gpudata.clear(); | |||
m_vdata.clear(); | |||
} | |||
#define BUILD_VFLAG(bool_value, flag_value, check_flag) \ | |||
@@ -245,7 +242,7 @@ GpuEasyMeshData::~GpuEasyMeshData() | |||
count_value += (int)bool_value; | |||
//----------------------------------------------------------------------------- | |||
void GpuEasyMeshData::AddGpuData(GpuShaderData* gpudata, EasyMesh* src_mesh) | |||
void GpuEasyMeshData::AddGpuData(std::shared_ptr<GpuShaderData> gpudata, std::shared_ptr<EasyMesh> src_mesh) | |||
{ | |||
uint16_t vflags = gpudata->m_vert_decl_flags; | |||
@@ -273,7 +270,7 @@ void GpuEasyMeshData::AddGpuData(GpuShaderData* gpudata, EasyMesh* src_mesh) | |||
indexlist << src_mesh->m_indices[i + 2]; | |||
} | |||
m_ibo = new IndexBuffer(indexlist.bytes()); | |||
m_ibo = std::make_shared<IndexBuffer>(indexlist.bytes()); | |||
void *indices = m_ibo->Lock(0, 0); | |||
memcpy(indices, &indexlist[0], indexlist.bytes()); | |||
m_ibo->Unlock(); | |||
@@ -282,26 +279,26 @@ void GpuEasyMeshData::AddGpuData(GpuShaderData* gpudata, EasyMesh* src_mesh) | |||
} | |||
//init to a minimum of gpudata->m_render_mode size | |||
if (m_gpudatas.count() <= gpudata->m_render_mode) | |||
if (m_gpudata.count() <= gpudata->m_render_mode) | |||
{ | |||
int i = m_gpudatas.count(); | |||
int i = m_gpudata.count(); | |||
int max = gpudata->m_render_mode + 1; | |||
m_gpudatas.reserve(max); | |||
m_gpudata.reserve(max); | |||
for (; i < max; i++) | |||
m_gpudatas << nullptr; | |||
m_gpudata.push(nullptr); | |||
} | |||
m_gpudatas[gpudata->m_render_mode] = gpudata; | |||
m_gpudata[gpudata->m_render_mode] = gpudata; | |||
} | |||
//----------------------------------------------------------------------------- | |||
void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
void GpuEasyMeshData::SetupVertexData(uint16_t vflags, std::shared_ptr<EasyMesh> src_mesh) | |||
{ | |||
for (int i = 0; i < m_vdatas.count(); ++i) | |||
if (m_vdatas[i].m1 == vflags) | |||
for (int i = 0; i < m_vdata.count(); ++i) | |||
if (m_vdata[i].m1 == vflags) | |||
return; | |||
VertexDeclaration* new_vdecl = nullptr; | |||
VertexBuffer* new_vbo = nullptr; | |||
std::shared_ptr<VertexDeclaration> new_vdecl; | |||
std::shared_ptr<VertexBuffer> new_vbo; | |||
void *vbo_data = nullptr; | |||
int vbo_bytes = 0; | |||
@@ -309,7 +306,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
vbo_data = &vertexlist[0]; \ | |||
vbo_bytes = vertexlist.bytes(); \ | |||
m_vertexcount = vertexlist.count(); \ | |||
new_vbo = new VertexBuffer(vbo_bytes); \ | |||
new_vbo = std::make_shared<VertexBuffer>(vbo_bytes); \ | |||
void *mesh = new_vbo->Lock(0, 0); \ | |||
memcpy(mesh, vbo_data, vbo_bytes); \ | |||
new_vbo->Unlock(); | |||
@@ -326,7 +323,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
if (flagnb == 5 && has_position && has_normal && has_color && has_texcoord && has_texcoordExt) | |||
{ | |||
new_vdecl = new VertexDeclaration( | |||
new_vdecl = std::make_shared<VertexDeclaration>( | |||
VertexStream<vec3,vec3,u8vec4,vec4>( | |||
VertexUsage::Position, | |||
VertexUsage::Normal, | |||
@@ -343,7 +340,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
} | |||
else if (flagnb == 4 && has_position && has_normal && has_color && has_texcoord) | |||
{ | |||
new_vdecl = new VertexDeclaration( | |||
new_vdecl = std::make_shared<VertexDeclaration>( | |||
VertexStream<vec3,vec3,u8vec4,vec2>( | |||
VertexUsage::Position, | |||
VertexUsage::Normal, | |||
@@ -360,7 +357,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
} | |||
else if (flagnb == 4 && has_position && has_color && has_texcoord && has_texcoordExt) | |||
{ | |||
new_vdecl = new VertexDeclaration(VertexStream<vec3,vec4,vec4>(VertexUsage::Position, VertexUsage::Color, VertexUsage::TexCoord)); | |||
new_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec3,vec4,vec4>(VertexUsage::Position, VertexUsage::Color, VertexUsage::TexCoord)); | |||
array<vec3, vec4, vec4> vertexlist; | |||
for (int i = 0; i < src_mesh->m_vert.count(); i++) | |||
@@ -369,7 +366,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
} | |||
else if (flagnb == 3 && has_position && has_normal && has_color) | |||
{ | |||
new_vdecl = new VertexDeclaration( | |||
new_vdecl = std::make_shared<VertexDeclaration>( | |||
VertexStream<vec3,vec3,u8vec4>( | |||
VertexUsage::Position, | |||
VertexUsage::Normal, | |||
@@ -384,7 +381,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
} | |||
else if (flagnb == 3 && has_position && has_texcoord && has_texcoordExt) | |||
{ | |||
new_vdecl = new VertexDeclaration(VertexStream<vec3,vec4>(VertexUsage::Position, VertexUsage::TexCoord)); | |||
new_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec3,vec4>(VertexUsage::Position, VertexUsage::TexCoord)); | |||
array<vec3, vec4> vertexlist; | |||
for (int i = 0; i < src_mesh->m_vert.count(); i++) | |||
@@ -393,7 +390,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
} | |||
else if (flagnb == 2 && has_position && has_texcoord) | |||
{ | |||
new_vdecl = new VertexDeclaration(VertexStream<vec3,vec2>(VertexUsage::Position, VertexUsage::TexCoord)); | |||
new_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec3,vec2>(VertexUsage::Position, VertexUsage::TexCoord)); | |||
array<vec3, vec2> vertexlist; | |||
for (int i = 0; i < src_mesh->m_vert.count(); i++) | |||
@@ -402,7 +399,7 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
} | |||
else if (flagnb == 2 && has_position && has_color) | |||
{ | |||
new_vdecl = new VertexDeclaration(VertexStream<vec3,u8vec4>(VertexUsage::Position, VertexUsage::Color)); | |||
new_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec3,u8vec4>(VertexUsage::Position, VertexUsage::Color)); | |||
array<vec3, u8vec4> vertexlist; | |||
for (int i = 0; i < src_mesh->m_vert.count(); i++) | |||
@@ -412,27 +409,27 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) | |||
else | |||
ASSERT(0, "no Vertex Declaration combination for 0x%04x", vflags); | |||
m_vdatas.push(vflags, new_vdecl, new_vbo); | |||
m_vdata.push(vflags, new_vdecl, new_vbo); | |||
} | |||
//----------------------------------------------------------------------------- | |||
void GpuEasyMeshData::RenderMeshData(mat4 const &model, int render_mode) | |||
{ | |||
ASSERT(0 <= render_mode && render_mode < m_gpudatas.count(), "render mode is not in the defined range"); | |||
ASSERT(m_gpudatas[render_mode], "gpu datas for this render mode don't exist"); | |||
GpuShaderData& gpu_sd = *(m_gpudatas[render_mode]); | |||
ASSERT(0 <= render_mode && render_mode < m_gpudata.count(), "render mode is not in the defined range"); | |||
ASSERT(m_gpudata[render_mode], "gpu datas for this render mode don't exist"); | |||
GpuShaderData& gpu_sd = *(m_gpudata[render_mode]); | |||
int vdecl_idx = 0; | |||
for (; vdecl_idx < m_vdatas.count(); ++vdecl_idx) | |||
if (m_vdatas[vdecl_idx].m1 == gpu_sd.m_vert_decl_flags) | |||
for (; vdecl_idx < m_vdata.count(); ++vdecl_idx) | |||
if (m_vdata[vdecl_idx].m1 == gpu_sd.m_vert_decl_flags) | |||
break; | |||
if (vdecl_idx >= m_vdatas.count()) | |||
if (vdecl_idx >= m_vdata.count()) | |||
return; | |||
uint16_t vflags = m_vdatas[vdecl_idx].m1; | |||
VertexDeclaration* vdecl = m_vdatas[vdecl_idx].m2; | |||
VertexBuffer* vbo = m_vdatas[vdecl_idx].m3; | |||
uint16_t vflags = m_vdata[vdecl_idx].m1; | |||
auto vdecl = m_vdata[vdecl_idx].m2; | |||
auto vbo = m_vdata[vdecl_idx].m3; | |||
gpu_sd.m_shader->Bind(); | |||
gpu_sd.SetupShaderDatas(model); | |||
@@ -2,7 +2,7 @@ | |||
// Lol Engine | |||
// | |||
// Copyright © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||
// © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// © 2009—2013 Cédric Lecacheur <jordx@free.fr> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
@@ -79,7 +79,7 @@ protected: | |||
GpuShaderData(); | |||
public: | |||
//-- | |||
GpuShaderData(uint16_t vert_decl_flags, Shader* shader, DebugRenderMode render_mode); | |||
GpuShaderData(uint16_t vert_decl_flags, std::shared_ptr<Shader> shader, DebugRenderMode render_mode); | |||
virtual ~GpuShaderData(); | |||
//-- | |||
void AddUniform(std::string const &new_uniform); | |||
@@ -92,7 +92,7 @@ public: | |||
protected: | |||
uint16_t m_vert_decl_flags; | |||
Shader *m_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
int m_render_mode; | |||
array<std::string, ShaderUniform> m_shader_uniform; | |||
array<ShaderAttrib> m_shader_attrib; | |||
@@ -103,7 +103,7 @@ class DefaultShaderData : public GpuShaderData | |||
public: | |||
//--- | |||
DefaultShaderData(DebugRenderMode render_mode); | |||
DefaultShaderData(uint16_t vert_decl_flags, Shader* shader, bool with_UV); | |||
DefaultShaderData(uint16_t vert_decl_flags, std::shared_ptr<Shader> shader, bool with_UV); | |||
virtual ~DefaultShaderData() {} | |||
void StoreUniformNames(); | |||
//--- | |||
@@ -122,21 +122,20 @@ public: | |||
GpuEasyMeshData(); | |||
~GpuEasyMeshData(); | |||
//--- | |||
void AddGpuData(GpuShaderData* gpudata, class EasyMesh* src_mesh); | |||
void AddGpuData(std::shared_ptr<GpuShaderData> gpudata, std::shared_ptr<class EasyMesh> src_mesh); | |||
void RenderMeshData(mat4 const &model, int render_mode=Video::GetDebugRenderMode()); | |||
bool HasData(int render_mode) { return (0 <= render_mode && render_mode < m_gpudatas.count() && !!m_gpudatas[render_mode]); } | |||
bool HasData(int render_mode) { return (0 <= render_mode && render_mode < m_gpudata.count() && !!m_gpudata[render_mode]); } | |||
private: | |||
void SetupVertexData(uint16_t vdecl_flags, EasyMesh* src_mesh); | |||
void SetupVertexData(uint16_t vdecl_flags, std::shared_ptr<EasyMesh> src_mesh); | |||
array<GpuShaderData*> m_gpudatas; | |||
array<std::shared_ptr<GpuShaderData>> m_gpudata; | |||
//uint16_t are the vdecl/vbo flags to avoid copy same vdecl several times. | |||
array<uint16_t, VertexDeclaration*, | |||
VertexBuffer*> m_vdatas; | |||
int m_vertexcount; | |||
array<uint16_t, std::shared_ptr<VertexDeclaration>, std::shared_ptr<VertexBuffer>> m_vdata; | |||
int m_vertexcount; | |||
//We only need only one ibo for the whole mesh | |||
IndexBuffer * m_ibo; | |||
int m_indexcount; | |||
std::shared_ptr<IndexBuffer> m_ibo; | |||
int m_indexcount; | |||
}; | |||
} /* namespace lol */ | |||
@@ -373,7 +373,7 @@ void Framebuffer::Bind() | |||
/* FIXME: this should be done in the RenderContext object | |||
* instead, maybe by getting rid of Framebuffer::Bind() and | |||
* creating RenderContext::SetFramebuffer() instead. */ | |||
auto *renderer = Scene::GetScene(0).get_renderer(); | |||
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; | |||
@@ -389,7 +389,7 @@ void Framebuffer::Unbind() | |||
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); | |||
#endif | |||
auto *renderer = Scene::GetScene(0).get_renderer(); | |||
auto renderer = Scene::GetScene(0).get_renderer(); | |||
renderer->SetViewport(m_data->m_saved_viewport); | |||
m_data->m_bound = false; | |||
} | |||
@@ -69,9 +69,9 @@ private: | |||
* Public RenderContext class | |||
*/ | |||
RenderContext::RenderContext(Renderer *renderer) | |||
RenderContext::RenderContext(std::shared_ptr<Renderer> renderer) | |||
: m_renderer(renderer), | |||
m_data(new RenderContextData()) | |||
m_data(std::make_unique<RenderContextData>()) | |||
{ | |||
} | |||
@@ -108,8 +108,6 @@ RenderContext::~RenderContext() | |||
if (m_data->m_scissor_mode.is_dirty()) | |||
m_renderer->SetScissorMode(m_data->m_scissor_mode.get()); | |||
delete m_data; | |||
} | |||
void RenderContext::SetViewport(ibox2 viewport) | |||
@@ -116,7 +116,6 @@ Renderer::Renderer(ivec2 size) | |||
Renderer::~Renderer() | |||
{ | |||
delete m_data; | |||
} | |||
/* | |||
@@ -13,7 +13,9 @@ | |||
#include <lol/engine-internal.h> | |||
#include <string> | |||
#include <memory> | |||
#include <map> | |||
#include <set> | |||
#include <cstring> | |||
#include <cstdio> | |||
@@ -89,14 +91,10 @@ private: | |||
/* Shader patcher */ | |||
static int GetVersion(); | |||
static std::string Patch(std::string const &code, ShaderType type); | |||
/* Global shader cache */ | |||
static Shader *shaders[]; | |||
static int nshaders; | |||
}; | |||
Shader *ShaderData::shaders[256]; | |||
int ShaderData::nshaders = 0; | |||
/* Global shader cache */ | |||
static std::set<std::shared_ptr<Shader>> g_shaders; | |||
/* | |||
* LolFx parser | |||
@@ -187,7 +185,7 @@ struct lolfx_parser::action<lolfx_parser::code_section> | |||
* Public Shader class | |||
*/ | |||
Shader *Shader::Create(std::string const &name, std::string const &code) | |||
std::shared_ptr<Shader> Shader::Create(std::string const &name, std::string const &code) | |||
{ | |||
lolfx_parser p(code); | |||
@@ -203,31 +201,22 @@ Shader *Shader::Create(std::string const &name, std::string const &code) | |||
size_t new_vert_crc = std::hash<std::string>{}(vert); | |||
size_t new_frag_crc = std::hash<std::string>{}(frag); | |||
for (int n = 0; n < ShaderData::nshaders; n++) | |||
for (auto shader : g_shaders) | |||
{ | |||
if (ShaderData::shaders[n]->data->vert_crc == new_vert_crc | |||
&& ShaderData::shaders[n]->data->frag_crc == new_frag_crc) | |||
{ | |||
return ShaderData::shaders[n]; | |||
} | |||
if (shader->data->vert_crc == new_vert_crc | |||
&& shader->data->frag_crc == new_frag_crc) | |||
return shader; | |||
} | |||
Shader *ret = new Shader(name, vert, frag); | |||
ShaderData::shaders[ShaderData::nshaders] = ret; | |||
ShaderData::nshaders++; | |||
// FIXME: the cache never expires! | |||
auto ret = std::make_shared<Shader>(name, vert, frag); | |||
g_shaders.insert(ret); | |||
return ret; | |||
} | |||
void Shader::Destroy(Shader *shader) | |||
{ | |||
/* XXX: do nothing! the shader should remain in cache */ | |||
UNUSED(shader); | |||
} | |||
Shader::Shader(std::string const &name, | |||
std::string const &vert, std::string const &frag) | |||
: data(new ShaderData()) | |||
: data(std::make_unique<ShaderData>()) | |||
{ | |||
data->m_name = name; | |||
@@ -515,8 +504,6 @@ Shader::~Shader() | |||
glDeleteShader(data->vert_id); | |||
glDeleteShader(data->frag_id); | |||
glDeleteProgram(data->prog_id); | |||
delete data; | |||
} | |||
/* Try to detect shader compiler features */ | |||
@@ -150,18 +150,19 @@ void VertexDeclaration::Unbind() | |||
glBindBuffer(GL_ARRAY_BUFFER, 0); | |||
} | |||
void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
ShaderAttrib attr2, | |||
ShaderAttrib attr3, | |||
ShaderAttrib attr4, | |||
ShaderAttrib attr5, | |||
ShaderAttrib attr6, | |||
ShaderAttrib attr7, | |||
ShaderAttrib attr8, | |||
ShaderAttrib attr9, | |||
ShaderAttrib attr10, | |||
ShaderAttrib attr11, | |||
ShaderAttrib attr12) | |||
void VertexDeclaration::SetStream(std::shared_ptr<VertexBuffer> vb, | |||
ShaderAttrib attr1, | |||
ShaderAttrib attr2, | |||
ShaderAttrib attr3, | |||
ShaderAttrib attr4, | |||
ShaderAttrib attr5, | |||
ShaderAttrib attr6, | |||
ShaderAttrib attr7, | |||
ShaderAttrib attr8, | |||
ShaderAttrib attr9, | |||
ShaderAttrib attr10, | |||
ShaderAttrib attr11, | |||
ShaderAttrib attr12) | |||
{ | |||
ShaderAttrib attribs[12] = { attr1, attr2, attr3, attr4, attr5, attr6, | |||
attr7, attr8, attr9, attr10, attr11, attr12 }; | |||
@@ -169,7 +170,7 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
SetStream(vb, attribs); | |||
} | |||
void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attribs[]) | |||
void VertexDeclaration::SetStream(std::shared_ptr<VertexBuffer> vb, ShaderAttrib attribs[]) | |||
{ | |||
if (!vb->m_data->m_size) | |||
return; | |||
@@ -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. | |||
// | |||
#include <lol/engine-internal.h> | |||
#include <memory> | |||
LOLFX_RESOURCE_DECLARE(gradient); | |||
namespace lol | |||
@@ -24,9 +28,9 @@ class GradientData | |||
friend class Gradient; | |||
private: | |||
Shader *shader; | |||
VertexDeclaration *m_vdecl; | |||
VertexBuffer *m_vbo, *m_cbo; | |||
std::shared_ptr<Shader> shader; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
std::shared_ptr<VertexBuffer> m_vbo, m_cbo; | |||
}; | |||
/* | |||
@@ -34,14 +38,12 @@ private: | |||
*/ | |||
Gradient::Gradient(vec3 aa, vec3 bb) | |||
: data(new GradientData()) | |||
: data(std::make_unique<GradientData>()) | |||
{ | |||
/* FIXME: this should not be hardcoded */ | |||
m_position = aa; | |||
m_aabb.aa = aa; | |||
m_aabb.bb = bb; | |||
data->shader = nullptr; | |||
} | |||
void Gradient::tick_game(float seconds) | |||
@@ -71,11 +73,12 @@ void Gradient::tick_draw(float seconds, Scene &scene) | |||
{ | |||
data->shader = Shader::Create(LOLFX_RESOURCE_NAME(gradient)); | |||
data->m_vbo = new VertexBuffer(sizeof(vertex)); | |||
data->m_cbo = new VertexBuffer(sizeof(color)); | |||
data->m_vbo = std::make_shared<VertexBuffer>(sizeof(vertex)); | |||
data->m_cbo = std::make_shared<VertexBuffer>(sizeof(color)); | |||
data->m_vdecl = new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | |||
VertexStream<vec4>(VertexUsage::Color)); | |||
data->m_vdecl = std::make_shared<VertexDeclaration> | |||
(VertexStream<vec3>(VertexUsage::Position), | |||
VertexStream<vec4>(VertexUsage::Color)); | |||
} | |||
mat4 model_matrix = mat4(1.0f); | |||
@@ -115,8 +118,6 @@ void Gradient::tick_draw(float seconds, Scene &scene) | |||
Gradient::~Gradient() | |||
{ | |||
/* FIXME: destroy shader */ | |||
delete data; | |||
} | |||
} /* namespace lol */ |
@@ -1,7 +1,7 @@ | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -19,6 +19,8 @@ | |||
#include "engine/worldentity.h" | |||
#include <memory> | |||
namespace lol | |||
{ | |||
@@ -37,7 +39,7 @@ protected: | |||
virtual void tick_draw(float seconds, Scene &scene); | |||
private: | |||
GradientData *data; | |||
std::unique_ptr<GradientData> data; | |||
}; | |||
} /* namespace lol */ | |||
@@ -14,6 +14,8 @@ | |||
#include <lol/gpu/renderer.h> | |||
#include <memory> | |||
// | |||
// The RenderContext class | |||
// ----------------------- | |||
@@ -27,7 +29,7 @@ class RenderContextData; | |||
class RenderContext | |||
{ | |||
public: | |||
RenderContext(Renderer *renderer); | |||
RenderContext(std::shared_ptr<Renderer> renderer); | |||
~RenderContext(); | |||
void SetViewport(ibox2 viewport); | |||
@@ -60,8 +62,8 @@ public: | |||
vec4 GetScissorRect(); | |||
private: | |||
Renderer *m_renderer; | |||
RenderContextData *m_data; | |||
std::shared_ptr<Renderer> m_renderer; | |||
std::unique_ptr<RenderContextData> m_data; | |||
}; | |||
} /* namespace lol */ | |||
@@ -134,14 +134,11 @@ enum class ScissorMode : uint8_t | |||
class Renderer | |||
{ | |||
private: | |||
/* Only the Scene class can create a renderer for now. */ | |||
friend class Scene; | |||
public: | |||
// FIXME: only the Scene class should be allowed to create a renderer | |||
Renderer(ivec2 size); | |||
~Renderer(); | |||
public: | |||
void Clear(ClearMask mask); | |||
void SetViewport(ibox2 viewport); | |||
@@ -185,7 +182,7 @@ public: | |||
vec4 GetScissorRect() const; | |||
private: | |||
RendererData *m_data; | |||
std::unique_ptr<RendererData> m_data; | |||
}; | |||
} /* namespace lol */ | |||
@@ -19,6 +19,7 @@ | |||
#include <string> | |||
#include <map> | |||
#include <memory> | |||
#include <cstdint> | |||
#include "engine/entity.h" | |||
@@ -316,8 +317,7 @@ class ShaderData; | |||
class Shader : public Entity | |||
{ | |||
public: | |||
static Shader *Create(std::string const &name, std::string const &code); | |||
static void Destroy(Shader *shader); | |||
static std::shared_ptr<Shader> Create(std::string const &name, std::string const &code); | |||
int GetAttribCount() const; | |||
ShaderAttrib GetAttribLocation(VertexUsage usage, int index) const; | |||
@@ -345,12 +345,11 @@ public: | |||
void Bind() const; | |||
void Unbind() const; | |||
protected: | |||
Shader(std::string const &name, std::string const &vert, std::string const &frag); | |||
~Shader(); | |||
private: | |||
ShaderData *data; | |||
std::unique_ptr<ShaderData> data; | |||
public: | |||
static std::string GetVariablePrefix(const ShaderVariable variable); | |||
@@ -214,20 +214,22 @@ public: | |||
void DrawIndexedElements(MeshPrimitive type, int count, const short* skip = nullptr, short typeSize = 2); | |||
void Unbind(); | |||
void SetStream(VertexBuffer *vb, ShaderAttrib attr1, | |||
ShaderAttrib attr2 = ShaderAttrib(), | |||
ShaderAttrib attr3 = ShaderAttrib(), | |||
ShaderAttrib attr4 = ShaderAttrib(), | |||
ShaderAttrib attr5 = ShaderAttrib(), | |||
ShaderAttrib attr6 = ShaderAttrib(), | |||
ShaderAttrib attr7 = ShaderAttrib(), | |||
ShaderAttrib attr8 = ShaderAttrib(), | |||
ShaderAttrib attr9 = ShaderAttrib(), | |||
ShaderAttrib attr10 = ShaderAttrib(), | |||
ShaderAttrib attr11 = ShaderAttrib(), | |||
ShaderAttrib attr12 = ShaderAttrib()); | |||
void SetStream(VertexBuffer *vb, ShaderAttrib attribs[]); | |||
void SetStream(std::shared_ptr<VertexBuffer> vb, | |||
ShaderAttrib attr1, | |||
ShaderAttrib attr2 = ShaderAttrib(), | |||
ShaderAttrib attr3 = ShaderAttrib(), | |||
ShaderAttrib attr4 = ShaderAttrib(), | |||
ShaderAttrib attr5 = ShaderAttrib(), | |||
ShaderAttrib attr6 = ShaderAttrib(), | |||
ShaderAttrib attr7 = ShaderAttrib(), | |||
ShaderAttrib attr8 = ShaderAttrib(), | |||
ShaderAttrib attr9 = ShaderAttrib(), | |||
ShaderAttrib attr10 = ShaderAttrib(), | |||
ShaderAttrib attr11 = ShaderAttrib(), | |||
ShaderAttrib attr12 = ShaderAttrib()); | |||
void SetStream(std::shared_ptr<VertexBuffer> vb, | |||
ShaderAttrib attribs[]); | |||
int GetStreamCount() const; | |||
@@ -103,7 +103,6 @@ LolImGui::~LolImGui() | |||
Ticker::Unref(m_font); | |||
m_font = nullptr; | |||
Shader::Destroy(m_shader); | |||
delete m_vdecl; | |||
ImGui::DestroyContext(); | |||
@@ -295,10 +294,10 @@ void LolImGui::tick_draw(float seconds, Scene &scene) | |||
{ | |||
super::tick_draw(seconds, scene); | |||
scene.AddPrimitiveRenderer(this, new PrimitiveLolImGui()); | |||
scene.AddPrimitiveRenderer(this, std::make_shared<PrimitiveLolImGui>()); | |||
} | |||
void PrimitiveLolImGui::Render(Scene& scene, PrimitiveSource* primitive) | |||
void PrimitiveLolImGui::Render(Scene& scene, std::shared_ptr<PrimitiveSource> primitive) | |||
{ | |||
UNUSED(scene, primitive); | |||
@@ -383,12 +382,12 @@ void LolImGui::RenderDrawListsMethod(ImDrawData* draw_data) | |||
u8vec4 color; | |||
}; | |||
VertexBuffer* vbo = new VertexBuffer(command_list.VtxBuffer.Size * sizeof(ImDrawVert)); | |||
auto vbo = std::make_shared<VertexBuffer>(command_list.VtxBuffer.Size * sizeof(ImDrawVert)); | |||
ImDrawVert *vert = (ImDrawVert *)vbo->Lock(0, 0); | |||
memcpy(vert, command_list.VtxBuffer.Data, command_list.VtxBuffer.Size * sizeof(ImDrawVert)); | |||
vbo->Unlock(); | |||
IndexBuffer *ibo = new IndexBuffer(command_list.IdxBuffer.Size * sizeof(ImDrawIdx)); | |||
auto ibo = std::make_shared<IndexBuffer>(command_list.IdxBuffer.Size * sizeof(ImDrawIdx)); | |||
ImDrawIdx *indices = (ImDrawIdx *)ibo->Lock(0, 0); | |||
memcpy(indices, command_list.IdxBuffer.Data, command_list.IdxBuffer.Size * sizeof(ImDrawIdx)); | |||
ibo->Unlock(); | |||
@@ -460,9 +459,6 @@ void LolImGui::RenderDrawListsMethod(ImDrawData* draw_data) | |||
m_vdecl->Unbind(); | |||
ibo->Unbind(); | |||
delete vbo; | |||
delete ibo; | |||
} | |||
m_shader->Unbind(); | |||
@@ -2,7 +2,7 @@ | |||
// Lol Engine | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -15,6 +15,7 @@ | |||
#include <string> | |||
#include <map> | |||
#include <memory> | |||
// | |||
// The Imgui integration | |||
@@ -186,7 +187,7 @@ protected: | |||
//------------------------------------------------------------------------- | |||
TextureImage* m_font = nullptr; | |||
ShaderBuilder m_builder = ShaderBuilder("imgui_shader", "120"); | |||
Shader* m_shader = nullptr; | |||
std::shared_ptr<Shader> m_shader = nullptr; | |||
Uniform m_ortho; | |||
Uniform m_texture; | |||
array<ShaderAttrib> m_attribs; | |||
@@ -205,7 +206,7 @@ class PrimitiveLolImGui : public PrimitiveRenderer | |||
{ | |||
public: | |||
PrimitiveLolImGui() { } | |||
virtual void Render(Scene& scene, PrimitiveSource* primitive); | |||
virtual void Render(Scene& scene, std::shared_ptr<PrimitiveSource> primitive); | |||
}; | |||
//bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks); | |||
@@ -12,6 +12,7 @@ | |||
#include <lol/engine-internal.h> | |||
#include <memory> | |||
#include <cstring> | |||
#include <cstdlib> | |||
@@ -34,38 +35,38 @@ void Mesh::Render(Scene& scene, mat4 const &matrix) | |||
{ | |||
//if (scene.HasPrimitiveRenderer(this) < m_submeshes.count()) | |||
{ | |||
for (int i = 0; i < m_submeshes.count(); ++i) | |||
scene.AddPrimitiveRenderer(this, new PrimitiveMesh(m_submeshes[i], matrix)); | |||
for (auto submesh : m_submeshes) | |||
scene.AddPrimitiveRenderer(this, std::make_shared<PrimitiveMesh>(submesh, matrix)); | |||
} | |||
} | |||
void Mesh::Render() | |||
{ | |||
for (int i = 0; i < m_submeshes.count(); ++i) | |||
m_submeshes[i]->Render(); | |||
for (auto submesh : m_submeshes) | |||
submesh->Render(); | |||
} | |||
void Mesh::SetMaterial(Shader *shader) | |||
void Mesh::SetMaterial(std::shared_ptr<Shader> shader) | |||
{ | |||
for (int i = 0; i < m_submeshes.count(); ++i) | |||
m_submeshes[i]->SetShader(shader); | |||
for (auto submesh : m_submeshes) | |||
submesh->SetShader(shader); | |||
} | |||
/* | |||
* SubMesh class | |||
*/ | |||
SubMesh::SubMesh(Shader *shader, VertexDeclaration *vdecl) | |||
SubMesh::SubMesh(std::shared_ptr<Shader> shader, std::shared_ptr<VertexDeclaration> vdecl) | |||
: m_mesh_prim(MeshPrimitive::Triangles), | |||
m_shader(shader), | |||
m_vdecl(vdecl) | |||
{ | |||
Ticker::Ref(m_shader); | |||
Ticker::Ref(m_shader.get()); | |||
} | |||
SubMesh::~SubMesh() | |||
{ | |||
Ticker::Unref(m_shader); | |||
Ticker::Unref(m_shader.get()); | |||
// TODO: cleanup | |||
} | |||
@@ -74,24 +75,24 @@ void SubMesh::SetMeshPrimitive(MeshPrimitive mesh_primitive) | |||
m_mesh_prim = mesh_primitive; | |||
} | |||
void SubMesh::SetShader(Shader *shader) | |||
void SubMesh::SetShader(std::shared_ptr<Shader> shader) | |||
{ | |||
Ticker::Unref(m_shader); | |||
Ticker::Unref(m_shader.get()); | |||
m_shader = shader; | |||
Ticker::Ref(m_shader); | |||
Ticker::Ref(m_shader.get()); | |||
} | |||
Shader *SubMesh::GetShader() | |||
std::shared_ptr<Shader> SubMesh::GetShader() | |||
{ | |||
return m_shader; | |||
} | |||
void SubMesh::SetVertexDeclaration(VertexDeclaration *vdecl) | |||
void SubMesh::SetVertexDeclaration(std::shared_ptr<VertexDeclaration> vdecl) | |||
{ | |||
m_vdecl = vdecl; | |||
} | |||
void SubMesh::SetVertexBuffer(int index, VertexBuffer* vbo) | |||
void SubMesh::SetVertexBuffer(int index, std::shared_ptr<VertexBuffer> vbo) | |||
{ | |||
while (index >= m_vbos.count()) | |||
m_vbos.push(nullptr); | |||
@@ -99,12 +100,12 @@ void SubMesh::SetVertexBuffer(int index, VertexBuffer* vbo) | |||
m_vbos[index] = vbo; | |||
} | |||
void SubMesh::SetIndexBuffer(IndexBuffer* ibo) | |||
void SubMesh::SetIndexBuffer(std::shared_ptr<IndexBuffer> ibo) | |||
{ | |||
m_ibo = ibo; | |||
} | |||
void SubMesh::AddTexture(std::string const &name, Texture* texture) | |||
void SubMesh::AddTexture(std::string const &name, std::shared_ptr<Texture> texture) | |||
{ | |||
m_textures.push(name, texture); | |||
} | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// 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 | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -17,6 +17,9 @@ | |||
// -------------- | |||
// | |||
#include <vector> | |||
#include <memory> | |||
#include <lol/gpu/vertexbuffer.h> | |||
#include <lol/gpu/indexbuffer.h> | |||
@@ -59,7 +62,7 @@ public: | |||
/* FIXME: this should eventually take a “material” as argument, which | |||
* may behave differently between submeshes. */ | |||
void SetMaterial(Shader *shader); | |||
void SetMaterial(std::shared_ptr<Shader> shader); | |||
//TODO: Not sure about the name | |||
void Render(Scene& scene, mat4 const &matrix); | |||
@@ -68,7 +71,7 @@ protected: | |||
void Render(); | |||
public: | |||
array<class SubMesh *> m_submeshes; | |||
std::vector<std::shared_ptr<class SubMesh>> m_submeshes; | |||
}; | |||
/* | |||
@@ -85,27 +88,27 @@ class SubMesh | |||
friend class Mesh; | |||
public: | |||
SubMesh(Shader *shader, VertexDeclaration* vdecl); | |||
SubMesh(std::shared_ptr<Shader> shader, std::shared_ptr<VertexDeclaration> vdecl); | |||
~SubMesh(); | |||
void SetMeshPrimitive(MeshPrimitive mesh_primitive); | |||
void SetShader(Shader *shader); | |||
Shader *GetShader(); | |||
void SetVertexDeclaration(VertexDeclaration *vdecl); | |||
void SetVertexBuffer(int index, VertexBuffer* vbo); | |||
void SetIndexBuffer(IndexBuffer* ibo); | |||
void AddTexture(std::string const &name, Texture* texture); | |||
void SetShader(std::shared_ptr<Shader> shader); | |||
std::shared_ptr<Shader> GetShader(); | |||
void SetVertexDeclaration(std::shared_ptr<VertexDeclaration> vdecl); | |||
void SetVertexBuffer(int index, std::shared_ptr<VertexBuffer> vbo); | |||
void SetIndexBuffer(std::shared_ptr<IndexBuffer> ibo); | |||
void AddTexture(std::string const &name, std::shared_ptr<Texture> texture); | |||
protected: | |||
void Render(); | |||
MeshPrimitive m_mesh_prim; | |||
Shader *m_shader; | |||
VertexDeclaration* m_vdecl; | |||
array<VertexBuffer *> m_vbos; | |||
IndexBuffer *m_ibo; | |||
std::shared_ptr<Shader> m_shader; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
array<std::shared_ptr<VertexBuffer>> m_vbos; | |||
std::shared_ptr<IndexBuffer> m_ibo; | |||
array<std::string, Texture*> m_textures; | |||
array<std::string, std::shared_ptr<Texture>> m_textures; | |||
}; | |||
} /* namespace lol */ | |||
@@ -1,15 +1,18 @@ | |||
// | |||
// 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 <memory> | |||
#include <cstring> | |||
#include <cstdlib> | |||
@@ -20,7 +23,7 @@ namespace lol | |||
* Primitive class | |||
*/ | |||
PrimitiveMesh::PrimitiveMesh(SubMesh *submesh, mat4 const &matrix) | |||
PrimitiveMesh::PrimitiveMesh(std::shared_ptr<SubMesh> submesh, mat4 const &matrix) | |||
: m_submesh(submesh), | |||
m_matrix(matrix) | |||
{ | |||
@@ -30,12 +33,12 @@ PrimitiveMesh::~PrimitiveMesh() | |||
{ | |||
} | |||
void PrimitiveMesh::Render(Scene& scene, PrimitiveSource* primitive) | |||
void PrimitiveMesh::Render(Scene& scene, std::shared_ptr<PrimitiveSource> primitive) | |||
{ | |||
/* TODO: this should be the main entry for rendering of all | |||
* primitives found in the scene graph. When we have one. */ | |||
Shader *shader = nullptr; | |||
std::shared_ptr<Shader> shader; | |||
ShaderUniform u_model, u_modelview, u_normalmat, uni_tex, uni_texsize; | |||
ShaderAttrib a_pos, a_tex; | |||
@@ -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 | |||
@@ -23,12 +25,12 @@ class PrimitiveMesh : public PrimitiveRenderer | |||
friend class Scene; | |||
public: | |||
PrimitiveMesh(SubMesh *submesh, mat4 const &matrix); | |||
PrimitiveMesh(std::shared_ptr<SubMesh> submesh, mat4 const &matrix); | |||
virtual ~PrimitiveMesh(); | |||
virtual void Render(Scene& scene, PrimitiveSource* primitive); | |||
virtual void Render(Scene& scene, std::shared_ptr<PrimitiveSource> primitive); | |||
private: | |||
SubMesh *m_submesh; | |||
std::shared_ptr<SubMesh> m_submesh; | |||
mat4 m_matrix; | |||
}; | |||
@@ -109,7 +109,7 @@ void SceneDisplay::Disable() | |||
void PrimitiveSource::Render(Scene& scene) { UNUSED(scene); } | |||
void PrimitiveRenderer::Render(Scene& scene, PrimitiveSource* primitive) | |||
void PrimitiveRenderer::Render(Scene& scene, std::shared_ptr<PrimitiveSource> primitive) | |||
{ | |||
UNUSED(scene); | |||
UNUSED(primitive); | |||
@@ -123,7 +123,7 @@ class SceneData | |||
{ | |||
friend class Scene; | |||
private: | |||
public: | |||
SceneData() | |||
{ | |||
/* TODO: FIX THAT */ | |||
@@ -132,6 +132,7 @@ private: | |||
m_used_id = m_used_id << 1; | |||
} | |||
private: | |||
/* Mask ID */ | |||
/* TODO: Do a mask class that handles more than 64 slots */ | |||
static uint64_t m_used_id; | |||
@@ -146,9 +147,9 @@ private: | |||
struct postprocess | |||
{ | |||
Shader *m_shader[2]; | |||
VertexBuffer *m_vbo = nullptr; | |||
VertexDeclaration *m_vdecl = nullptr; | |||
std::shared_ptr<Shader> m_shader[2]; | |||
std::shared_ptr<VertexBuffer> m_vbo; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
ShaderUniform m_buffer_uni[2][3]; | |||
ShaderAttrib m_coord[2]; | |||
} | |||
@@ -161,8 +162,8 @@ private: | |||
* - Updated by entity | |||
* - Marked Fire&Forget | |||
* - Scene is destroyed */ | |||
std::map<uintptr_t, array<PrimitiveRenderer*>> m_prim_renderers; | |||
static std::map<uintptr_t, array<PrimitiveSource*>> m_prim_sources; | |||
std::map<uintptr_t, array<std::shared_ptr<PrimitiveRenderer>>> m_prim_renderers; | |||
static std::map<uintptr_t, array<std::shared_ptr<PrimitiveSource>>> m_prim_sources; | |||
static mutex m_prim_mutex; | |||
Camera *m_default_cam; | |||
@@ -175,8 +176,8 @@ private: | |||
//vec4 m_color; | |||
array<vec3, vec3, vec4, float, int, bool, bool> m_lines; | |||
int /*m_mask,*/ m_debug_mask; | |||
Shader *m_shader; | |||
VertexDeclaration *m_vdecl; | |||
std::shared_ptr<Shader> m_shader; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
} | |||
m_line_api; | |||
@@ -188,16 +189,16 @@ private: | |||
array<Tile> m_palettes; | |||
array<Light *> m_lights; | |||
Shader *m_shader; | |||
Shader *m_palette_shader; | |||
std::shared_ptr<Shader> m_shader; | |||
std::shared_ptr<Shader> m_palette_shader; | |||
VertexDeclaration *m_vdecl; | |||
array<VertexBuffer *> m_bufs; | |||
std::shared_ptr<VertexDeclaration> m_vdecl; | |||
array<std::shared_ptr<VertexBuffer>> m_bufs; | |||
} | |||
m_tile_api; | |||
}; | |||
uint64_t SceneData::m_used_id = 1; | |||
std::map<uintptr_t, array<PrimitiveSource*>> SceneData::m_prim_sources; | |||
std::map<uintptr_t, array<std::shared_ptr<PrimitiveSource>>> SceneData::m_prim_sources; | |||
mutex SceneData::m_prim_mutex; | |||
/* | |||
@@ -206,8 +207,8 @@ mutex SceneData::m_prim_mutex; | |||
Scene::Scene(ivec2 size) | |||
: m_size(size), | |||
m_wanted_size(size), | |||
data(new SceneData()), | |||
m_renderer(new Renderer(size)) | |||
data(std::make_unique<SceneData>()), | |||
m_renderer(std::make_shared<Renderer>(size)) | |||
{ | |||
data->m_renderbuffer[0] = new Framebuffer(m_size); | |||
data->m_renderbuffer[1] = new Framebuffer(m_size); | |||
@@ -217,7 +218,7 @@ Scene::Scene(ivec2 size) | |||
data->m_pp.m_shader[1] = Shader::Create(LOLFX_RESOURCE_NAME(gpu_postprocess)); | |||
data->m_pp.m_coord[0] = data->m_pp.m_shader[0]->GetAttribLocation(VertexUsage::Position, 0); | |||
data->m_pp.m_coord[1] = data->m_pp.m_shader[1]->GetAttribLocation(VertexUsage::Position, 0); | |||
data->m_pp.m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position)); | |||
data->m_pp.m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec2>(VertexUsage::Position)); | |||
data->m_pp.m_buffer_uni[0][0] = data->m_pp.m_shader[0]->GetUniformLocation("u_buffer"); | |||
data->m_pp.m_buffer_uni[1][0] = data->m_pp.m_shader[1]->GetUniformLocation("u_buffer"); | |||
data->m_pp.m_buffer_uni[1][1] = data->m_pp.m_shader[1]->GetUniformLocation("u_prev_buffer"); | |||
@@ -226,7 +227,7 @@ Scene::Scene(ivec2 size) | |||
array<vec2> quad { 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), }; | |||
data->m_pp.m_vbo = new VertexBuffer(quad.bytes()); | |||
data->m_pp.m_vbo = std::make_shared<VertexBuffer>(quad.bytes()); | |||
void *vertices = data->m_pp.m_vbo->Lock(0, 0); | |||
memcpy(vertices, quad.data(), quad.bytes()); | |||
data->m_pp.m_vbo->Unlock(); | |||
@@ -240,11 +241,11 @@ Scene::Scene(ivec2 size) | |||
data->m_tile_api.m_cam = -1; | |||
data->m_tile_api.m_shader = 0; | |||
data->m_tile_api.m_palette_shader = 0; | |||
data->m_tile_api.m_vdecl = new VertexDeclaration(VertexStream<vec3>(VertexUsage::Position), | |||
VertexStream<vec2>(VertexUsage::TexCoord)); | |||
data->m_tile_api.m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec3>(VertexUsage::Position), | |||
VertexStream<vec2>(VertexUsage::TexCoord)); | |||
data->m_line_api.m_shader = 0; | |||
data->m_line_api.m_vdecl = new VertexDeclaration(VertexStream<vec4,vec4>(VertexUsage::Position, VertexUsage::Color)); | |||
data->m_line_api.m_vdecl = std::make_shared<VertexDeclaration>(VertexStream<vec4,vec4>(VertexUsage::Position, VertexUsage::Color)); | |||
data->m_line_api.m_debug_mask = 1; | |||
} | |||
@@ -264,11 +265,6 @@ Scene::~Scene() | |||
/* FIXME: also, make sure we do not add code to Reset() that will | |||
* reallocate stuff */ | |||
Reset(); | |||
delete data->m_line_api.m_vdecl; | |||
delete data->m_tile_api.m_vdecl; | |||
delete data; | |||
delete m_renderer; | |||
} | |||
//----------------------------------------------------------------------------- | |||
@@ -381,10 +377,7 @@ void Scene::Reset() | |||
ReleasePrimitiveRenderer(idx--, key); | |||
} | |||
for (int i = 0; i < data->m_tile_api.m_bufs.count(); i++) | |||
delete data->m_tile_api.m_bufs[i]; | |||
data->m_tile_api.m_bufs.clear(); | |||
data->m_tile_api.m_lights.clear(); | |||
} | |||
@@ -400,7 +393,7 @@ int Scene::HasPrimitiveSource(uintptr_t key) | |||
return count; | |||
} | |||
int Scene::AddPrimitiveSource(uintptr_t key, PrimitiveSource* source) | |||
int Scene::AddPrimitiveSource(uintptr_t key, std::shared_ptr<PrimitiveSource> source) | |||
{ | |||
int count; | |||
SceneData::m_prim_mutex.lock(); | |||
@@ -412,12 +405,14 @@ int Scene::AddPrimitiveSource(uintptr_t key, PrimitiveSource* source) | |||
return count; | |||
} | |||
void Scene::SetPrimitiveSource(int index, uintptr_t key, PrimitiveSource* source) | |||
void Scene::SetPrimitiveSource(int index, uintptr_t key, std::shared_ptr<PrimitiveSource> source) | |||
{ | |||
ASSERT(source); | |||
ASSERT(index >= 0); | |||
PrimitiveSource* old = nullptr; | |||
// Keep reference to old source until AFTER we release the lock | |||
std::shared_ptr<PrimitiveSource> old; | |||
SceneData::m_prim_mutex.lock(); | |||
{ | |||
if (index < SceneData::m_prim_sources[key].count()) | |||
@@ -427,14 +422,11 @@ void Scene::SetPrimitiveSource(int index, uintptr_t key, PrimitiveSource* source | |||
SceneData::m_prim_sources[key][index] = source; | |||
} | |||
SceneData::m_prim_mutex.unlock(); | |||
// Delete old AFTER having released the lock | |||
delete old; | |||
} | |||
void Scene::ReleasePrimitiveSource(int index, uintptr_t key) | |||
{ | |||
PrimitiveSource* old = nullptr; | |||
std::shared_ptr<PrimitiveSource> old; | |||
SceneData::m_prim_mutex.lock(); | |||
{ | |||
ASSERT(0 <= index && index < SceneData::m_prim_sources[key].count()); | |||
@@ -442,26 +434,21 @@ void Scene::ReleasePrimitiveSource(int index, uintptr_t key) | |||
SceneData::m_prim_sources[key].remove(index); | |||
} | |||
SceneData::m_prim_mutex.unlock(); | |||
// Delete old AFTER having released the lock | |||
delete old; | |||
} | |||
void Scene::ReleaseAllPrimitiveSources(uintptr_t key) | |||
{ | |||
array<PrimitiveSource*> oldies; | |||
// Delete oldies AFTER having released the lock | |||
array<std::shared_ptr<PrimitiveSource>> oldies; | |||
SceneData::m_prim_mutex.lock(); | |||
{ | |||
oldies.reserve(SceneData::m_prim_sources[key].count()); | |||
for (PrimitiveSource* source : SceneData::m_prim_sources[key]) | |||
for (auto source : SceneData::m_prim_sources[key]) | |||
oldies << source; | |||
SceneData::m_prim_sources[key].clear(); | |||
} | |||
SceneData::m_prim_mutex.unlock(); | |||
// Delete oldies AFTER having released the lock | |||
for (PrimitiveSource* old : oldies) | |||
delete old; | |||
} | |||
//---- Primitive renderer stuff ----------------------------------------------- | |||
@@ -470,23 +457,18 @@ int Scene::HasPrimitiveRenderer(uintptr_t key) | |||
return data->m_prim_renderers[key].count(); | |||
} | |||
void Scene::AddPrimitiveRenderer(uintptr_t key, PrimitiveRenderer* renderer) | |||
void Scene::AddPrimitiveRenderer(uintptr_t key, std::shared_ptr<PrimitiveRenderer> renderer) | |||
{ | |||
renderer->m_fire_and_forget = true; | |||
data->m_prim_renderers[key].push(renderer); | |||
} | |||
void Scene::SetPrimitiveRenderer(int index, uintptr_t key, PrimitiveRenderer* renderer) | |||
void Scene::SetPrimitiveRenderer(int index, uintptr_t key, std::shared_ptr<PrimitiveRenderer> renderer) | |||
{ | |||
ASSERT(renderer); | |||
ASSERT(index >= 0); | |||
if (index < data->m_prim_renderers[key].count()) | |||
{ | |||
ASSERT(data->m_prim_renderers[key][index]); | |||
delete data->m_prim_renderers[key][index]; | |||
} | |||
else | |||
if (index >= data->m_prim_renderers[key].count()) | |||
data->m_prim_renderers[key].resize(index + 1); | |||
data->m_prim_renderers[key][index] = renderer; | |||
} | |||
@@ -495,17 +477,13 @@ void Scene::ReleasePrimitiveRenderer(int index, uintptr_t key) | |||
{ | |||
ASSERT(0 <= index && index < data->m_prim_renderers[key].count()); | |||
delete data->m_prim_renderers[key][index]; | |||
data->m_prim_renderers[key].remove(index); | |||
} | |||
void Scene::ReleaseAllPrimitiveRenderers(uintptr_t key) | |||
{ | |||
for (PrimitiveRenderer*& renderer : data->m_prim_renderers[key]) | |||
{ | |||
delete renderer; | |||
for (auto& renderer : data->m_prim_renderers[key]) | |||
renderer = nullptr; | |||
} | |||
} | |||
//----------------------------------------------------------------------------- | |||
@@ -719,7 +697,8 @@ void Scene::render_primitives() | |||
for (int idx = 0; idx < data->m_prim_renderers[key].count(); ++idx) | |||
{ | |||
/* TODO: Not sure if thread compliant */ | |||
data->m_prim_renderers[key][idx]->Render(*this, idx < SceneData::m_prim_sources[key].count() ? SceneData::m_prim_sources[key][idx] : nullptr); | |||
if (idx < SceneData::m_prim_sources[key].count()) | |||
data->m_prim_renderers[key][idx]->Render(*this, SceneData::m_prim_sources[key][idx]); | |||
} | |||
} | |||
} | |||
@@ -755,8 +734,8 @@ void Scene::render_tiles() // XXX: rename to Blit() | |||
for (int p = 0; p < 2; p++) | |||
{ | |||
Shader *shader = (p == 0) ? data->m_tile_api.m_shader : data->m_tile_api.m_palette_shader; | |||
array<Tile>& tiles = (p == 0) ? data->m_tile_api.m_tiles : data->m_tile_api.m_palettes; | |||
auto shader = (p == 0) ? data->m_tile_api.m_shader : data->m_tile_api.m_palette_shader; | |||
auto &tiles = (p == 0) ? data->m_tile_api.m_tiles : data->m_tile_api.m_palettes; | |||
if (tiles.count() == 0) | |||
continue; | |||
@@ -787,9 +766,9 @@ void Scene::render_tiles() // XXX: rename to Blit() | |||
break; | |||
/* Create a vertex array object */ | |||
VertexBuffer *vb1 = new VertexBuffer(6 * (n - i) * sizeof(vec3)); | |||
auto vb1 = std::make_shared<VertexBuffer>(6 * (n - i) * sizeof(vec3)); | |||
vec3 *vertex = (vec3 *)vb1->Lock(0, 0); | |||
VertexBuffer *vb2 = new VertexBuffer(6 * (n - i) * sizeof(vec2)); | |||
auto vb2 = std::make_shared<VertexBuffer>(6 * (n - i) * sizeof(vec2)); | |||
vec2 *texture = (vec2 *)vb2->Lock(0, 0); | |||
data->m_tile_api.m_bufs.push(vb1); | |||
@@ -889,7 +868,7 @@ void Scene::render_lines(float seconds) | |||
linecount--; | |||
} | |||
} | |||
VertexBuffer *vb = new VertexBuffer(buff.bytes()); | |||
auto vb = std::make_shared<VertexBuffer>(buff.bytes()); | |||
float *vertex = (float *)vb->Lock(0, 0); | |||
memcpy(vertex, buff.data(), buff.bytes()); | |||
vb->Unlock(); | |||
@@ -915,7 +894,6 @@ void Scene::render_lines(float seconds) | |||
data->m_line_api.m_shader->Unbind(); | |||
//data->m_line_api.m_lines.clear(); | |||
delete vb; | |||
} | |||
} /* namespace lol */ | |||
@@ -18,7 +18,8 @@ | |||
// --------------- | |||
// | |||
#include <stdint.h> | |||
#include <memory> | |||
#include <cstdint> | |||
#include "tileset.h" | |||
#include "light.h" | |||
@@ -51,7 +52,7 @@ class PrimitiveRenderer | |||
public: | |||
PrimitiveRenderer() { } | |||
virtual ~PrimitiveRenderer() { } | |||
virtual void Render(Scene& scene, PrimitiveSource* primitive); | |||
virtual void Render(Scene& scene, std::shared_ptr<PrimitiveSource> primitive); | |||
private: | |||
bool m_fire_and_forget = false; | |||
@@ -129,15 +130,15 @@ public: | |||
void Reset(); | |||
Renderer *get_renderer() { return m_renderer; } | |||
std::shared_ptr<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 */ | |||
/* ============================== */ | |||
private: | |||
int HasPrimitiveSource(uintptr_t key); | |||
int AddPrimitiveSource(uintptr_t key, class PrimitiveSource* source); | |||
void SetPrimitiveSource(int index, uintptr_t key, class PrimitiveSource* source); | |||
int AddPrimitiveSource(uintptr_t key, std::shared_ptr<class PrimitiveSource> source); | |||
void SetPrimitiveSource(int index, uintptr_t key, std::shared_ptr<class PrimitiveSource> source); | |||
void ReleasePrimitiveSource(int index, uintptr_t key); | |||
void ReleaseAllPrimitiveSources(uintptr_t key); | |||
public: | |||
@@ -152,7 +153,7 @@ public: | |||
/* Add a primitive sources linked to the given entity | |||
* Returns the slot number */ | |||
template <typename T> | |||
int AddPrimitiveSource(T* key, class PrimitiveSource* source) | |||
int AddPrimitiveSource(T* key, std::shared_ptr<class PrimitiveSource> source) | |||
{ | |||
ASSERT(key); | |||
return AddPrimitiveSource(_KEY_IDX, source); | |||
@@ -161,7 +162,7 @@ public: | |||
* Deletes the old one | |||
* The slot is kept even if source == nullptr */ | |||
template <typename T> | |||
void SetPrimitiveSource(int index, T* key, class PrimitiveSource* source) | |||
void SetPrimitiveSource(int index, T* key, std::shared_ptr<class PrimitiveSource> source) | |||
{ | |||
ASSERT(key); | |||
SetPrimitiveSource(index, _KEY_IDX, source); | |||
@@ -184,8 +185,8 @@ public: | |||
private: | |||
int HasPrimitiveRenderer(uintptr_t key); | |||
void AddPrimitiveRenderer(uintptr_t key, class PrimitiveRenderer* renderer); | |||
void SetPrimitiveRenderer(int index, uintptr_t key, class PrimitiveRenderer* renderer); | |||
void AddPrimitiveRenderer(uintptr_t key, std::shared_ptr<class PrimitiveRenderer> renderer); | |||
void SetPrimitiveRenderer(int index, uintptr_t key, std::shared_ptr<class PrimitiveRenderer> renderer); | |||
void ReleasePrimitiveRenderer(int index, uintptr_t key); | |||
void ReleaseAllPrimitiveRenderers(uintptr_t key); | |||
public: | |||
@@ -201,7 +202,7 @@ public: | |||
* The primitive is considered as Fire&Forget and | |||
* will be destroyed at the end of the frame */ | |||
template <typename T> | |||
void AddPrimitiveRenderer(T* key, class PrimitiveRenderer* renderer) | |||
void AddPrimitiveRenderer(T* key, std::shared_ptr<class PrimitiveRenderer> renderer) | |||
{ | |||
ASSERT(key); | |||
AddPrimitiveRenderer(_KEY_IDX, renderer); | |||
@@ -210,7 +211,7 @@ public: | |||
* Deletes the old one | |||
* Will assert if renderer == nullptr */ | |||
template <typename T> | |||
void SetPrimitiveRenderer(int index, T* key, class PrimitiveRenderer* renderer) | |||
void SetPrimitiveRenderer(int index, T* key, std::shared_ptr<class PrimitiveRenderer> renderer) | |||
{ | |||
ASSERT(key && renderer); | |||
SetPrimitiveRenderer(index, _KEY_IDX, renderer); | |||
@@ -263,8 +264,8 @@ private: | |||
ivec2 m_size, m_wanted_size; | |||
SceneData *data; | |||
Renderer *m_renderer; | |||
std::unique_ptr<SceneData> data; | |||
std::shared_ptr<Renderer> m_renderer; | |||
}; | |||
} /* namespace lol */ | |||