| @@ -137,28 +137,36 @@ private: | |||
| static map<uintptr_t, array<PrimitiveSource*>> m_prim_sources; | |||
| static mutex m_prim_mutex; | |||
| /* Old API <P0, P1, COLOR, TIME, MASK> */ | |||
| float m_new_line_time; | |||
| int m_new_line_mask; | |||
| float m_new_line_segment_size; | |||
| vec4 m_new_line_color; | |||
| array<vec3, vec3, vec4, float, int, bool, bool> m_lines; | |||
| int m_debug_mask; | |||
| Shader *m_line_shader; | |||
| VertexDeclaration *m_line_vdecl; | |||
| int m_tile_cam; | |||
| array<Tile> m_tiles; | |||
| array<Tile> m_palettes; | |||
| array<Light *> m_lights; | |||
| Shader *m_tile_shader; | |||
| Shader *m_palette_shader; | |||
| VertexDeclaration *m_tile_vdecl; | |||
| array<VertexBuffer *> m_tile_bufs; | |||
| Camera *m_default_cam; | |||
| array<Camera *> m_camera_stack; | |||
| /* Old line API <P0, P1, COLOR, TIME, MASK> */ | |||
| struct line_api | |||
| { | |||
| float m_time, m_segment_size; | |||
| 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; | |||
| } | |||
| m_line_api; | |||
| /* The old tiles API */ | |||
| struct tile_api | |||
| { | |||
| int m_cam; | |||
| array<Tile> m_tiles; | |||
| array<Tile> m_palettes; | |||
| array<Light *> m_lights; | |||
| Shader *m_shader; | |||
| Shader *m_palette_shader; | |||
| VertexDeclaration *m_vdecl; | |||
| array<VertexBuffer *> m_bufs; | |||
| } | |||
| m_tile_api; | |||
| }; | |||
| uint64_t SceneData::m_used_id = 1; | |||
| map<uintptr_t, array<PrimitiveSource*>> 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<vec3>(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<vec3>(VertexUsage::Position), | |||
| VertexStream<vec2>(VertexUsage::TexCoord)); | |||
| data->m_line_shader = 0; | |||
| data->m_line_vdecl = new VertexDeclaration(VertexStream<vec4,vec4>(VertexUsage::Position, VertexUsage::Color)); | |||
| data->m_line_api.m_shader = 0; | |||
| data->m_line_api.m_vdecl = new VertexDeclaration(VertexStream<vec4,vec4>(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<Light *> 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<Tile>& 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<Tile>& 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<vec4, vec4, vec4, vec4> 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; | |||
| } | |||