diff --git a/src/scene.cpp b/src/scene.cpp index 66d2f6d7..8b35025f 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -137,28 +137,36 @@ private: static map> m_prim_sources; static mutex m_prim_mutex; - /* Old API */ - float m_new_line_time; - int m_new_line_mask; - float m_new_line_segment_size; - vec4 m_new_line_color; - array m_lines; - int m_debug_mask; - Shader *m_line_shader; - VertexDeclaration *m_line_vdecl; - - int m_tile_cam; - array m_tiles; - array m_palettes; - array m_lights; - - Shader *m_tile_shader; - Shader *m_palette_shader; - VertexDeclaration *m_tile_vdecl; - array m_tile_bufs; - Camera *m_default_cam; array m_camera_stack; + + /* Old line API */ + struct line_api + { + float m_time, m_segment_size; + vec4 m_color; + array m_lines; + int m_mask, m_debug_mask; + Shader *m_shader; + VertexDeclaration *m_vdecl; + } + m_line_api; + + /* The old tiles API */ + struct tile_api + { + int m_cam; + array m_tiles; + array m_palettes; + array m_lights; + + Shader *m_shader; + Shader *m_palette_shader; + + VertexDeclaration *m_vdecl; + array m_bufs; + } + m_tile_api; }; uint64_t SceneData::m_used_id = 1; map> SceneData::m_prim_sources; @@ -176,16 +184,16 @@ Scene::Scene(ivec2 size) data->m_default_cam->SetProjection(proj); PushCamera(data->m_default_cam); - data->m_tile_cam = -1; - data->m_tile_shader = 0; - data->m_palette_shader = 0; - data->m_tile_vdecl = new VertexDeclaration(VertexStream(VertexUsage::Position), + 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(VertexUsage::Position), VertexStream(VertexUsage::TexCoord)); - data->m_line_shader = 0; - data->m_line_vdecl = new VertexDeclaration(VertexStream(VertexUsage::Position, VertexUsage::Color)); + data->m_line_api.m_shader = 0; + data->m_line_api.m_vdecl = new VertexDeclaration(VertexStream(VertexUsage::Position, VertexUsage::Color)); - data->m_debug_mask = 1; + data->m_line_api.m_debug_mask = 1; SetLineTime(); SetLineMask(); @@ -204,8 +212,8 @@ Scene::~Scene() * reallocate stuff */ Reset(); - delete data->m_line_vdecl; - delete data->m_tile_vdecl; + delete data->m_line_api.m_vdecl; + delete data->m_tile_api.m_vdecl; delete data; } @@ -303,7 +311,7 @@ void Scene::SetTileCam(int cam_idx) { ASSERT(!!data, "Trying to access a non-ready scene"); - data->m_tile_cam = cam_idx; + data->m_tile_api.m_cam = cam_idx; } //----------------------------------------------------------------------------- @@ -320,11 +328,11 @@ void Scene::Reset() ReleasePrimitiveRenderer(idx--, key); } - for (int i = 0; i < data->m_tile_bufs.count(); i++) - delete data->m_tile_bufs[i]; - data->m_tile_bufs.empty(); + 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.empty(); - data->m_lights.empty(); + data->m_tile_api.m_lights.empty(); } //---- Primitive source stuff ------------------------------------------------- @@ -472,9 +480,9 @@ void Scene::AddTile(TileSet *tileset, int id, mat4 model) t.m_id = id; if (tileset->GetPalette()) - data->m_palettes.push(t); + data->m_tile_api.m_palettes.push(t); else - data->m_tiles.push(t); + data->m_tile_api.m_tiles.push(t); } //----------------------------------------------------------------------------- @@ -482,28 +490,28 @@ void Scene::SetLineTime(float new_time) { ASSERT(!!data, "Trying to access a non-ready scene"); - data->m_new_line_time = new_time; + data->m_line_api.m_time = new_time; } void Scene::SetLineMask(int new_mask) { ASSERT(!!data, "Trying to access a non-ready scene"); - data->m_new_line_mask = new_mask; + data->m_line_api.m_mask = new_mask; } void Scene::SetLineSegmentSize(float new_segment_size) { ASSERT(!!data, "Trying to access a non-ready scene"); - data->m_new_line_segment_size = new_segment_size; + data->m_line_api.m_segment_size = new_segment_size; } void Scene::SetLineColor(vec4 new_color) { ASSERT(!!data, "Trying to access a non-ready scene"); - data->m_new_line_color = new_color; + data->m_line_api.m_color = new_color; } //----------------------------------------------------------------------------- @@ -511,14 +519,14 @@ float Scene::GetLineSegmentSize() { ASSERT(!!data, "Trying to access a non-ready scene"); - return data->m_new_line_segment_size; + return data->m_line_api.m_segment_size; } vec4 Scene::GetLineColor() { ASSERT(!!data, "Trying to access a non-ready scene"); - return data->m_new_line_color; + return data->m_line_api.m_color; } //----------------------------------------------------------------------------- @@ -526,8 +534,8 @@ void Scene::AddLine(vec3 a, vec3 b, vec4 color) { ASSERT(!!data, "Trying to access a non-ready scene"); - data->m_lines.push(a, b, color, - data->m_new_line_time, data->m_new_line_mask, false, false); + data->m_line_api.m_lines.push(a, b, color, + data->m_line_api.m_time, data->m_line_api.m_mask, false, false); } //----------------------------------------------------------------------------- @@ -535,7 +543,7 @@ void Scene::AddLight(Light *l) { ASSERT(!!data, "Trying to access a non-ready scene"); - data->m_lights.push(l); + data->m_tile_api.m_lights.push(l); } //----------------------------------------------------------------------------- @@ -543,7 +551,7 @@ array const &Scene::GetLights() { ASSERT(!!data, "Trying to access a non-ready scene"); - return data->m_lights; + return data->m_tile_api.m_lights; } //----------------------------------------------------------------------------- @@ -597,7 +605,7 @@ void Scene::RenderTiles() // XXX: rename to Blit() RenderContext rc; /* Early test if nothing needs to be rendered */ - if (!data->m_tiles.count() && !data->m_palettes.count()) + if (!data->m_tile_api.m_tiles.count() && !data->m_tile_api.m_palettes.count()) return; /* FIXME: we disable culling for now because we don’t have a reliable @@ -615,15 +623,15 @@ void Scene::RenderTiles() // XXX: rename to Blit() glEnable(GL_TEXTURE_2D); #endif - if (!data->m_tile_shader) - data->m_tile_shader = Shader::Create(LOLFX_RESOURCE_NAME(tile)); - if (!data->m_palette_shader) - data->m_palette_shader = Shader::Create(LOLFX_RESOURCE_NAME(palette)); + if (!data->m_tile_api.m_shader) + data->m_tile_api.m_shader = Shader::Create(LOLFX_RESOURCE_NAME(tile)); + if (!data->m_tile_api.m_palette_shader) + data->m_tile_api.m_palette_shader = Shader::Create(LOLFX_RESOURCE_NAME(palette)); for (int p = 0; p < 2; p++) { - Shader *shader = (p == 0) ? data->m_tile_shader : data->m_palette_shader; - array& tiles = (p == 0) ? data->m_tiles : data->m_palettes; + Shader *shader = (p == 0) ? data->m_tile_api.m_shader : data->m_tile_api.m_palette_shader; + array& tiles = (p == 0) ? data->m_tile_api.m_tiles : data->m_tile_api.m_palettes; if (tiles.count() == 0) continue; @@ -636,14 +644,14 @@ void Scene::RenderTiles() // XXX: rename to Blit() shader->Bind(); uni_mat = shader->GetUniformLocation("u_projection"); - shader->SetUniform(uni_mat, GetCamera(data->m_tile_cam)->GetProjection()); + shader->SetUniform(uni_mat, GetCamera(data->m_tile_api.m_cam)->GetProjection()); uni_mat = shader->GetUniformLocation("u_view"); - shader->SetUniform(uni_mat, GetCamera(data->m_tile_cam)->GetView()); + shader->SetUniform(uni_mat, GetCamera(data->m_tile_api.m_cam)->GetView()); uni_mat = shader->GetUniformLocation("u_model"); shader->SetUniform(uni_mat, mat4(1.f)); uni_tex = shader->GetUniformLocation("u_texture"); - uni_pal = data->m_palette_shader->GetUniformLocation("u_palette"); + uni_pal = data->m_tile_api.m_palette_shader->GetUniformLocation("u_palette"); uni_texsize = shader->GetUniformLocation("u_texsize"); for (int buf = 0, i = 0, n; i < tiles.count(); i = n, buf += 2) @@ -659,8 +667,8 @@ void Scene::RenderTiles() // XXX: rename to Blit() VertexBuffer *vb2 = new VertexBuffer(6 * (n - i) * sizeof(vec2)); vec2 *texture = (vec2 *)vb2->Lock(0, 0); - data->m_tile_bufs.push(vb1); - data->m_tile_bufs.push(vb2); + data->m_tile_api.m_bufs.push(vb1); + data->m_tile_api.m_bufs.push(vb2); for (int j = i; j < n; j++) { @@ -690,13 +698,13 @@ void Scene::RenderTiles() // XXX: rename to Blit() (vec2)tiles[i].m_tileset->GetTextureSize()); /* Bind vertex and texture coordinate buffers */ - data->m_tile_vdecl->Bind(); - data->m_tile_vdecl->SetStream(vb1, attr_pos); - data->m_tile_vdecl->SetStream(vb2, attr_tex); + data->m_tile_api.m_vdecl->Bind(); + data->m_tile_api.m_vdecl->SetStream(vb1, attr_pos); + data->m_tile_api.m_vdecl->SetStream(vb2, attr_tex); /* Draw arrays */ - data->m_tile_vdecl->DrawElements(MeshPrimitive::Triangles, 0, (n - i) * 6); - data->m_tile_vdecl->Unbind(); + data->m_tile_api.m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, (n - i) * 6); + data->m_tile_api.m_vdecl->Unbind(); tiles[i].m_tileset->Unbind(); } @@ -720,7 +728,7 @@ void Scene::RenderLines(float seconds) // XXX: rename to Blit() RenderContext rc; - if (!data->m_lines.count()) + if (!data->m_line_api.m_lines.count()) return; rc.SetDepthFunc(DepthFunc::LessOrEqual); @@ -728,10 +736,10 @@ void Scene::RenderLines(float seconds) // XXX: rename to Blit() rc.SetBlendEquation(BlendEquation::Add, BlendEquation::Max); rc.SetAlphaFunc(AlphaFunc::GreaterOrEqual, 0.01f); - int linecount = (int)data->m_lines.count(); + int linecount = (int)data->m_line_api.m_lines.count(); - if (!data->m_line_shader) - data->m_line_shader = Shader::Create(LOLFX_RESOURCE_NAME(line)); + if (!data->m_line_api.m_shader) + data->m_line_api.m_shader = Shader::Create(LOLFX_RESOURCE_NAME(line)); array buff; buff.resize(linecount); @@ -739,18 +747,18 @@ void Scene::RenderLines(float seconds) // XXX: rename to Blit() mat4 const inv_view_proj = inverse(GetCamera()->GetProjection() * GetCamera()->GetView()); for (int i = 0; i < linecount; i++) { - if (data->m_lines[i].m5 & data->m_debug_mask) + if (data->m_line_api.m_lines[i].m5 & data->m_line_api.m_debug_mask) { - buff[real_linecount].m1 = vec4(data->m_lines[i].m1, (float)data->m_lines[i].m6); - buff[real_linecount].m2 = data->m_lines[i].m3; - buff[real_linecount].m3 = vec4(data->m_lines[i].m2, (float)data->m_lines[i].m7); - buff[real_linecount].m4 = data->m_lines[i].m3; + buff[real_linecount].m1 = vec4(data->m_line_api.m_lines[i].m1, (float)data->m_line_api.m_lines[i].m6); + buff[real_linecount].m2 = data->m_line_api.m_lines[i].m3; + buff[real_linecount].m3 = vec4(data->m_line_api.m_lines[i].m2, (float)data->m_line_api.m_lines[i].m7); + buff[real_linecount].m4 = data->m_line_api.m_lines[i].m3; real_linecount++; } - data->m_lines[i].m4 -= seconds; - if (data->m_lines[i].m4 < 0.f) + data->m_line_api.m_lines[i].m4 -= seconds; + if (data->m_line_api.m_lines[i].m4 < 0.f) { - data->m_lines.remove_swap(i--); + data->m_line_api.m_lines.remove_swap(i--); linecount--; } } @@ -759,27 +767,27 @@ void Scene::RenderLines(float seconds) // XXX: rename to Blit() memcpy(vertex, buff.data(), buff.bytes()); vb->Unlock(); - data->m_line_shader->Bind(); + data->m_line_api.m_shader->Bind(); ShaderUniform uni_mat, uni_tex; ShaderAttrib attr_pos, attr_col; - attr_pos = data->m_line_shader->GetAttribLocation(VertexUsage::Position, 0); - attr_col = data->m_line_shader->GetAttribLocation(VertexUsage::Color, 0); + attr_pos = data->m_line_api.m_shader->GetAttribLocation(VertexUsage::Position, 0); + attr_col = data->m_line_api.m_shader->GetAttribLocation(VertexUsage::Color, 0); - data->m_line_shader->Bind(); + data->m_line_api.m_shader->Bind(); - uni_mat = data->m_line_shader->GetUniformLocation("u_projection"); - data->m_line_shader->SetUniform(uni_mat, GetCamera()->GetProjection()); - uni_mat = data->m_line_shader->GetUniformLocation("u_view"); - data->m_line_shader->SetUniform(uni_mat, GetCamera()->GetView()); + uni_mat = data->m_line_api.m_shader->GetUniformLocation("u_projection"); + data->m_line_api.m_shader->SetUniform(uni_mat, GetCamera()->GetProjection()); + uni_mat = data->m_line_api.m_shader->GetUniformLocation("u_view"); + data->m_line_api.m_shader->SetUniform(uni_mat, GetCamera()->GetView()); - data->m_line_vdecl->Bind(); - data->m_line_vdecl->SetStream(vb, attr_pos, attr_col); - data->m_line_vdecl->DrawElements(MeshPrimitive::Lines, 0, 2 * real_linecount); - data->m_line_vdecl->Unbind(); - data->m_line_shader->Unbind(); + data->m_line_api.m_vdecl->Bind(); + data->m_line_api.m_vdecl->SetStream(vb, attr_pos, attr_col); + data->m_line_api.m_vdecl->DrawElements(MeshPrimitive::Lines, 0, 2 * real_linecount); + data->m_line_api.m_vdecl->Unbind(); + data->m_line_api.m_shader->Unbind(); - //data->m_lines.empty(); + //data->m_line_api.m_lines.empty(); delete vb; }