diff --git a/src/easymesh/easymesh.cpp b/src/easymesh/easymesh.cpp index b2a34c36..349271cd 100644 --- a/src/easymesh/easymesh.cpp +++ b/src/easymesh/easymesh.cpp @@ -239,10 +239,13 @@ void GpuEasyMeshData::AddGpuData(GpuShaderData* gpudata, EasyMesh* src_mesh) m_indexcount = indexlist.Count(); } - if (m_gpudatas.Count() != DebugRenderMode::Max) + //init to a minimum of gpudata->m_render_mode size + if (m_gpudatas.Count() <= gpudata->m_render_mode) { - m_gpudatas.Reserve(DebugRenderMode::Max); - for (int i = 0; i < DebugRenderMode::Max; i++) + int i = m_gpudatas.Count(); + int max = gpudata->m_render_mode + 1; + m_gpudatas.Reserve(max); + for (; i < max; i++) m_gpudatas << nullptr; } m_gpudatas[gpudata->m_render_mode] = gpudata; @@ -373,10 +376,11 @@ void GpuEasyMeshData::SetupVertexData(uint16_t vflags, EasyMesh* src_mesh) } //----------------------------------------------------------------------------- -void GpuEasyMeshData::RenderMeshData(mat4 const &model) +void GpuEasyMeshData::RenderMeshData(mat4 const &model, int render_mode) { - DebugRenderMode d = Video::GetDebugRenderMode(); - GpuShaderData& gpu_sd = *(m_gpudatas[d]); + 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]); int vdecl_idx = 0; for (; vdecl_idx < m_vdatas.Count(); ++vdecl_idx) @@ -620,8 +624,9 @@ void EasyMesh::MeshConvert(GpuShaderData* new_gpu_sdata) if (new_gpu_sdata) { m_gpu_data.AddGpuData(new_gpu_sdata, this); - for (int i = DebugRenderMode::Default + 1; i < DebugRenderMode::Max; i++) - m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); + for (int i = DebugRenderMode::Default; i < DebugRenderMode::Max; i++) + if (!m_gpu_data.HasData(i)) + m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); } m_state = MeshRender::CanRender; } @@ -646,11 +651,11 @@ void EasyMesh::MeshConvert(Shader* provided_shader) } //----------------------------------------------------------------------------- -bool EasyMesh::Render(mat4 const &model) +bool EasyMesh::Render(mat4 const &model, int render_mode) { if (m_state == MeshRender::CanRender) { - m_gpu_data.RenderMeshData(model); + m_gpu_data.RenderMeshData(model, render_mode); return true; } return false; @@ -834,6 +839,39 @@ void VertexDictionnary::AddVertex(const int vert_id, const vec3 vert_coord) vertex_list.Push(vert_id, vert_coord, VDictType::Alone); } +//----------------------------------------------------------------------------- +//Will update the given list with all the vertices on the same spot. +void VertexDictionnary::RemoveVertex(const int vert_id) +{ + int j = 0; + for (; j < vertex_list.Count(); j++) + if (vertex_list[j].m1 == vert_id) + break; + + if (vertex_list[j].m3 == VDictType::Master) + { + int jf = -1; + //change all the master ref in the list + for (int i = 0; i < vertex_list.Count(); i++) + { + if (vertex_list[i].m3 == j) + { + if (jf < 0) + { + jf = i; + vertex_list[i].m3 == VDictType::Master; + } + else + vertex_list[i].m3 == jf; + } + } + } + vertex_list.Remove(j); + for (int i = 0; i < master_list.Count(); i++) + if (master_list[j] == j) + break; +} + //----------------------------------------------------------------------------- void EasyMesh::MeshCsg(CSGUsage csg_operation) { diff --git a/src/easymesh/easymesh.h b/src/easymesh/easymesh.h index 0c722f2d..e259f8e6 100644 --- a/src/easymesh/easymesh.h +++ b/src/easymesh/easymesh.h @@ -150,7 +150,7 @@ public: protected: uint16_t m_vert_decl_flags; Shader* m_shader; - DebugRenderMode m_render_mode; + int m_render_mode; Array m_shader_uniform; Array m_shader_attrib; }; @@ -180,7 +180,8 @@ public: ~GpuEasyMeshData(); //--- void AddGpuData(GpuShaderData* gpudata, class EasyMesh* src_mesh); - void RenderMeshData(mat4 const &model); + 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]); } private: void SetupVertexData(uint16_t vdecl_flags, EasyMesh* src_mesh); @@ -632,6 +633,7 @@ public: bool FindConnectedTriangles(const ivec2 &search_idx, const Array &tri_list, const int tri0, Array &connected_tri, Array const *ignored_tri = nullptr); bool FindConnectedTriangles(const ivec3 &search_idx, const Array &tri_list, const int tri0, Array &connected_tri, Array const *ignored_tri = nullptr); void AddVertex(int vert_id, vec3 vert_coord); + void RemoveVertex(int vert_id); bool GetMasterList(Array &ret_master_list) { ret_master_list = master_list; return ret_master_list.Count() > 0; } void Clear() { vertex_list.Empty(); } private: @@ -669,7 +671,7 @@ public: void ExecuteCmdStack(); void MeshConvert(GpuShaderData* new_gpu_sdata); void MeshConvert(Shader* ProvidedShader = nullptr); - bool Render(mat4 const &model); + bool Render(mat4 const &model, int render_mode=Video::GetDebugRenderMode()); MeshRender GetMeshState() { return m_state; } bool SetRender(bool should_render); diff --git a/src/scene.cpp b/src/scene.cpp index 958ab078..4ed6a231 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -80,7 +80,7 @@ Scene::Scene(ivec2 size) { /* Create a default orthographic camera, in case the user doesn’t. */ data->m_default_cam = new Camera(); - mat4 proj = mat4::ortho(0, size.x, 0, size.y, -1000.f, 1000.f); + mat4 proj = mat4::ortho(0.f, size.x, 0.f, size.y, -1000.f, 1000.f); data->m_default_cam->SetProjection(proj); PushCamera(data->m_default_cam); @@ -150,7 +150,7 @@ void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale) Tile t; /* FIXME: this sorting only works for a 45-degree camera */ - t.prio = -pos.y - 2 * 32 * pos.z + (o ? 0 : 32); + t.prio = -pos.y - 2 * 32 * pos.z + ((float)o ? 0 : 32); t.tileset = tileset; t.id = id; t.pos = pos;