From c411be843c1a78a75e1cd05db4cc610851f8e4fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20=E2=80=98Touky=E2=80=99=20Huet?= Date: Sat, 19 Oct 2013 17:57:59 +0000 Subject: [PATCH] Added Flat debugrendermode Wireframe is back for normal OGL users MV : Added timed command execution for future "demo mode" --- src/easymesh/easymesh.cpp | 49 ++++++++++------ src/easymesh/easymesh.h | 18 ++++-- src/video.cpp | 26 ++------- src/video.h | 1 + test/data/mesh-buffer.txt | 6 +- test/meshviewer.cpp | 119 ++++++++++++++++++++++++++++---------- 6 files changed, 143 insertions(+), 76 deletions(-) diff --git a/src/easymesh/easymesh.cpp b/src/easymesh/easymesh.cpp index 349271cd..fedcc70d 100644 --- a/src/easymesh/easymesh.cpp +++ b/src/easymesh/easymesh.cpp @@ -96,6 +96,8 @@ DefaultShaderData::DefaultShaderData(DebugRenderMode render_mode) if (render_mode == DebugRenderMode::Default) m_shader = Shader::Create(LOLFX_RESOURCE_NAME(shiny)); + else if (render_mode == DebugRenderMode::Flat) + m_shader = Shader::Create(LOLFX_RESOURCE_NAME(shinyflat)); else if (render_mode == DebugRenderMode::Wireframe) m_shader = Shader::Create(LOLFX_RESOURCE_NAME(shinydebugwireframe)); else if (render_mode == DebugRenderMode::Lighting) @@ -434,12 +436,13 @@ EasyMesh::EasyMesh() //----------------------------------------------------------------------------- EasyMesh::EasyMesh(const EasyMesh& em) { - //*this = em; m_indices = em.m_indices; m_vert = em.m_vert; m_cursors = em.m_cursors; m_build_data = nullptr; m_gpu_data = GpuEasyMeshData(); + if (em.m_build_data) + m_build_data = new EasyMeshBuildData(*em.m_build_data); if (m_indices.Count() && m_vert.Count() && m_cursors.Count()) m_state = MeshRender::NeedConvert; else @@ -447,7 +450,7 @@ EasyMesh::EasyMesh(const EasyMesh& em) } //----------------------------------------------------------------------------- -bool EasyMesh::Compile(char const *command) +bool EasyMesh::Compile(char const *command, bool Execute) { bool res = false; EasyMeshCompiler mc(*this); @@ -455,18 +458,8 @@ bool EasyMesh::Compile(char const *command) if ((res = mc.ParseString(command))) { BD()->Disable(MeshBuildOperation::CommandRecording); - BD()->Enable(MeshBuildOperation::CommandExecution); - ExecuteCmdStack(); - BD()->Disable(MeshBuildOperation::CommandExecution); - - if (!BD()->IsEnabled(MeshBuildOperation::PreventVertCleanup)) - VerticesCleanup(); - - if (BD()->IsEnabled(MeshBuildOperation::PostBuildComputeNormals)) - ComputeNormals(0, m_indices.Count()); - - BD()->Disable(MeshBuildOperation::PostBuildComputeNormals); - BD()->Disable(MeshBuildOperation::PreventVertCleanup); + if (Execute) + ExecuteCmdStack(); } return res; } @@ -502,14 +495,21 @@ bool EasyMesh::Compile(char const *command) LOL_CALL(LOL_CAT(EZCALL_, LOL_CALL(LOL_COUNT_TO_12, (__VA_ARGS__))), (__VA_ARGS__)) //----------------------------------------------------------------------------- -void EasyMesh::ExecuteCmdStack() +void EasyMesh::ExecuteCmdStack(bool ExecAllStack) { #define DO_EXEC_CMD(MESH_CMD, FUNC_PARAMS) \ case EasyMeshCmdType::MESH_CMD: \ { EZM_CALL_FUNC FUNC_PARAMS; break; } - for (BD()->Cmdi() = 0; BD()->Cmdi() < BD()->CmdStack().GetCmdNb(); ++BD()->Cmdi()) + BD()->Enable(MeshBuildOperation::CommandExecution); + if (ExecAllStack) + BD()->Cmdi() = 0; + + for (; BD()->Cmdi() < BD()->CmdStack().GetCmdNb() && BD()->CmdExecNb() != 0; ++BD()->Cmdi()) { + if (BD()->CmdExecNb() > 0) + --BD()->CmdExecNb(); + switch (BD()->CmdStack().GetCmd(BD()->Cmdi())) { DO_EXEC_CMD(MeshCsg, (MeshCsg, CSGUsage)) @@ -549,6 +549,19 @@ void EasyMesh::ExecuteCmdStack() ASSERT(0, "Unknown command pseudo bytecode"); } } + BD()->Disable(MeshBuildOperation::CommandExecution); + + if (!BD()->IsEnabled(MeshBuildOperation::PreventVertCleanup)) + VerticesCleanup(); + + if (BD()->IsEnabled(MeshBuildOperation::PostBuildComputeNormals)) + ComputeNormals(0, m_indices.Count()); + + BD()->Disable(MeshBuildOperation::PostBuildComputeNormals); + BD()->Disable(MeshBuildOperation::PreventVertCleanup); + + if (BD()->CmdExecNb() > 0) + BD()->CmdExecNb() = -1; } //----------------------------------------------------------------------------- @@ -859,10 +872,10 @@ void VertexDictionnary::RemoveVertex(const int vert_id) if (jf < 0) { jf = i; - vertex_list[i].m3 == VDictType::Master; + vertex_list[i].m3 = VDictType::Master; } else - vertex_list[i].m3 == jf; + vertex_list[i].m3 = jf; } } } diff --git a/src/easymesh/easymesh.h b/src/easymesh/easymesh.h index e259f8e6..1229aa89 100644 --- a/src/easymesh/easymesh.h +++ b/src/easymesh/easymesh.h @@ -32,8 +32,7 @@ private: int m_i_cur; public: - //cmd storage - void AddCmd(int cmd) { m_commands.Push(cmd, m_floats.Count(), m_ints.Count()); } + //GET/SET exec int GetCmdNb() { return m_commands.Count(); } int GetCmd(int i) { @@ -43,6 +42,9 @@ public: return m_commands[i].m1; } + //cmd storage + void AddCmd(int cmd) { m_commands.Push(cmd, m_floats.Count(), m_ints.Count()); } + //GETTER inline float F() { return m_floats[m_f_cur++]; } inline int I() { return m_ints[m_i_cur++]; } @@ -373,6 +375,8 @@ public: m_texcoord_scale = vec2(1.f); m_texcoord_scale2 = vec2(1.f); m_build_flags = 0; + m_i_cmd = 0; + m_exec_nb = -1; for (int i = 0; i < MeshType::Max; ++i) { m_texcoord_build_type[i] = TexCoordBuildType::TriangleDefault; @@ -381,7 +385,8 @@ public: } inline CommandStack &CmdStack() { return m_stack; } - inline int &Cmdi() { return m_cmd_i; } + inline int &Cmdi() { return m_i_cmd; } + inline int &CmdExecNb() { return m_exec_nb; } inline Array &LoopStack(){ return m_loop_stack; } inline vec4 &ColorA() { return m_color_a; } inline vec4 &ColorB() { return m_color_b; } @@ -570,7 +575,8 @@ public: public: CommandStack m_stack; - int m_cmd_i; + int m_i_cmd; + int m_exec_nb; Array m_loop_stack; vec4 m_color_a; vec4 m_color_b; @@ -667,8 +673,8 @@ public: EasyMesh(); EasyMesh(const EasyMesh& em); - bool Compile(char const *command); - void ExecuteCmdStack(); + bool Compile(char const *command, bool Execute=true); + void ExecuteCmdStack(bool ExecAllStack=true); void MeshConvert(GpuShaderData* new_gpu_sdata); void MeshConvert(Shader* ProvidedShader = nullptr); bool Render(mat4 const &model, int render_mode=Video::GetDebugRenderMode()); diff --git a/src/video.cpp b/src/video.cpp index 795337eb..a2d57fc6 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -63,42 +63,26 @@ void Video::SetDebugRenderMode(DebugRenderMode d) { //All these modes are handled in the shaders. case DebugRenderMode::Default: + case DebugRenderMode::Flat: case DebugRenderMode::Lighting: case DebugRenderMode::Normal: case DebugRenderMode::UV: { #if defined USE_D3D9 || defined _XBOX #elif defined HAVE_GLES_2X -// glEnable(GL_CULL_FACE); #else -// if (VideoData::render_mode == d && glIsEnabled(GL_CULL_FACE) == GL_TRUE) -// SetFaceCulling(false); -// else -// SetFaceCulling(true); -// glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glEnable(GL_CULL_FACE); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif break; } case DebugRenderMode::Wireframe: { - if (VideoData::render_mode == d) - { -#if defined USE_D3D9 || defined _XBOX -#else -// SetFaceCulling(!VideoData::face_culling); -#endif - } - else - { -#if defined USE_D3D9 || defined _XBOX -#else -// SetFaceCulling(false); -#endif - } #if defined USE_D3D9 || defined _XBOX #elif defined HAVE_GLES_2X #else -// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glDisable(GL_CULL_FACE); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #endif break; } diff --git a/src/video.h b/src/video.h index e32fc03e..e371d432 100644 --- a/src/video.h +++ b/src/video.h @@ -28,6 +28,7 @@ struct DebugRenderMode { //Add your new rendermode at your convenience Default, + Flat, Wireframe, Lighting, Normal, diff --git a/test/data/mesh-buffer.txt b/test/data/mesh-buffer.txt index 8a2edaab..57ff86b7 100644 --- a/test/data/mesh-buffer.txt +++ b/test/data/mesh-buffer.txt @@ -1,6 +1,6 @@ addlight 0 position (1 -.5 1.5) color #bbb addlight 0 position (-1 -.5 -1.5) color #bbb addlight 1 position (0 1 0) color #444 clearcolor #ddd -showgizmo false +showgizmo true showlight false @@ -48,8 +48,10 @@ custom setmesh " //sc#0f0 ab 2 ty 1.5 ab 2 //sc#00f ab 2 ty 1.5 ab 2 +sc#00f tqw lp 5[tz 11 [lp 6 [tx 5 ty 5 ab 10 ]]] tz -22 -[sc#66f afcb(10) .25tx0]csgs[sc#fff afcb(10).25t(2)][[sc#6f6 afcb(7).25]csgs[sc#fff afcb(7).25t(1.5)]][[sc#f44 asph4 12t(-2.5)]csga[sc#fff afcb(7).25t(1.4)]csgs[sc#fff afcb(7).25t(2.5)]][[sc#ff0 ato6 2.5 1.2rx90tz-1.25tx-.9][sc#ff0 ab.5 2.1 .5dup[rz90sx.5ty-.8tx-.28]ty.55tx.25tz-.4taz1 1sy.8sx.8ty-.55tx-.25tz.4tz-1.2tx1.2]tz1.25tx1.25dup[sx-1ry90]tz-1.25tx-1.25] + +//[sc#66f afcb(10) .25tx0]csgs[sc#fff afcb(10).25t(2)][[sc#6f6 afcb(7).25]csgs[sc#fff afcb(7).25t(1.5)]][[sc#f44 asph4 12t(-2.5)]csga[sc#fff afcb(7).25t(1.4)]csgs[sc#fff afcb(7).25t(2.5)]][[sc#ff0 ato6 2.5 1.2rx90tz-1.25tx-.9][sc#ff0 ab.5 2.1 .5dup[rz90sx.5ty-.8tx-.28]ty.55tx.25tz-.4taz1 1sy.8sx.8ty-.55tx-.25tz.4tz-1.2tx1.2]tz1.25tx1.25dup[sx-1ry90]tz-1.25tx-1.25] " diff --git a/test/meshviewer.cpp b/test/meshviewer.cpp index 813f1c7d..1b4d5314 100644 --- a/test/meshviewer.cpp +++ b/test/meshviewer.cpp @@ -166,6 +166,7 @@ public: // Mesh Setup m_render_max = vec2(-.9f, 4.1f); + m_mesh_render = 0; m_mesh_id = 0; m_mesh_id1 = 0.f; m_default_texture = nullptr; @@ -194,6 +195,9 @@ public: m_mat_prev = mat4(quat::fromeuler_xyz(vec3::zero)); m_mat = mat4(quat::fromeuler_xyz(vec3(m_rot_mesh, .0f))); + m_build_timer = 0.1f; + m_build_time = -1.f; + //stream update m_stream_update_time = 2.0f; m_stream_update_timer = 1.0f; @@ -297,7 +301,7 @@ public: { if (m_mesh_id == m_meshes.Count() - 1) m_mesh_id++; - m_meshes.Push(em); + m_meshes.Push(em, nullptr); } #else m_ssetup->Compile("addlight 0.0 position (4 -1 -4) color (.0 .2 .5 1) " @@ -461,8 +465,8 @@ public: //Target List Setup Array target_list; if (m_meshes.Count() && m_mesh_id >= 0) - for (int i = 0; i < m_meshes[m_mesh_id]->GetVertexCount(); i++) - target_list << (m_mat * mat4::translate(m_meshes[m_mesh_id]->GetVertexLocation(i))).v3.xyz; + for (int i = 0; i < m_meshes[m_mesh_id].m1->GetVertexCount(); i++) + target_list << (m_mat * mat4::translate(m_meshes[m_mesh_id].m1->GetVertexLocation(i))).v3.xyz; //-- //Update mesh screen location - Get the Min/Max needed @@ -582,11 +586,12 @@ public: { //Create a new mesh EasyMesh* em = new EasyMesh(); - if (em->Compile(m_ssetup->m_custom_cmd[i].m2.C())) + if (em->Compile(m_ssetup->m_custom_cmd[i].m2.C(), false)) { + em->BD()->Cmdi() = 0; if (m_mesh_id == m_meshes.Count() - 1) m_mesh_id++; - m_meshes.Push(em); + m_meshes.Push(em, nullptr); } else delete(em); @@ -645,16 +650,10 @@ public: //TODO : This should probably be "standard LoL behaviour" #if NO_NACL_EM_INPUT { - if (KeyReleased(KEY_F1)) - Video::SetDebugRenderMode(DebugRenderMode::Default); if (KeyReleased(KEY_F2)) - Video::SetDebugRenderMode(DebugRenderMode::Wireframe); - if (KeyReleased(KEY_F3)) - Video::SetDebugRenderMode(DebugRenderMode::Lighting); - if (KeyReleased(KEY_F4)) - Video::SetDebugRenderMode(DebugRenderMode::Normal); - if (KeyReleased(KEY_F5)) - Video::SetDebugRenderMode(DebugRenderMode::UV); + Video::SetDebugRenderMode((Video::GetDebugRenderMode() + 1) % DebugRenderMode::Max); + else if (KeyReleased(KEY_F1)) + Video::SetDebugRenderMode((Video::GetDebugRenderMode() + DebugRenderMode::Max - 1) % DebugRenderMode::Max); } #endif //NO_NACL_EM_INPUT @@ -679,6 +678,63 @@ public: break; } + if (m_build_timer > .0f) + { + if (m_build_time < .0f) + { + m_build_time = m_build_timer; + for (int i = 0; i < m_meshes.Count(); ++i) + { + if (m_meshes[i].m1 && m_meshes[i].m1->BD()->Cmdi() < m_meshes[i].m1->BD()->CmdStack().GetCmdNb()) + { + EasyMesh* tmp = m_meshes[i].m1; + EasyMesh* newtmp = new EasyMesh(*tmp); + int ii = 1; +#if 1 + bool stop = false; + while (!stop) + { + int cmdi = newtmp->BD()->Cmdi() + ii; + if (cmdi < newtmp->BD()->CmdStack().GetCmdNb()) + { + switch (newtmp->BD()->CmdStack().GetCmd(cmdi)) + { + case EasyMeshCmdType::LoopStart: + case EasyMeshCmdType::LoopEnd: + case EasyMeshCmdType::OpenBrace: + case EasyMeshCmdType::CloseBrace: + case EasyMeshCmdType::ScaleWinding: + case EasyMeshCmdType::QuadWeighting: + case EasyMeshCmdType::PostBuildNormal: + case EasyMeshCmdType::PreventVertCleanup: + case EasyMeshCmdType::SetColorA: + case EasyMeshCmdType::SetColorB: + { + ii++; + break; + } + default: + { + stop = true; + break; + } + } + } + else + stop = true; + } +#endif + newtmp->BD()->CmdExecNb() = ii; + newtmp->ExecuteCmdStack(false); + + m_meshes[i].m1 = newtmp; + delete(tmp); + } + } + } + m_build_time -= seconds; + } + vec3 x = vec3(1.f,0.f,0.f); vec3 y = vec3(0.f,1.f,0.f); mat4 save_proj = m_camera->GetProjection(); @@ -692,21 +748,21 @@ public: for (int i = 0; i < m_meshes.Count(); i++) { { - if (m_meshes[i]->GetMeshState() == MeshRender::NeedConvert) + if (m_meshes[i].m1->GetMeshState() == MeshRender::NeedConvert) { #if WITH_TEXTURE - m_meshes[i]->MeshConvert(new DefaultShaderData(((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) | - (1 << VertexUsage::Color) | (1 << VertexUsage::TexCoord)), - m_texture_shader, true)); + m_meshes[i].m1->MeshConvert(new DefaultShaderData(((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) | + (1 << VertexUsage::Color) | (1 << VertexUsage::TexCoord)), + m_texture_shader, true)); #else - m_meshes[i]->MeshConvert(); + m_meshes[i].m1->MeshConvert(); #endif //WITH_TEXTURE } #if ALL_FEATURES float j = -(float)(m_meshes.Count() - (i + 1)) + (-m_mesh_id1 + (float)(m_meshes.Count() - 1)); if (m_mesh_id1 - m_render_max[0] > (float)i && m_mesh_id1 - m_render_max[1] < (float)i && - m_meshes[i]->GetMeshState() > MeshRender::NeedConvert) + m_meshes[i].m1->GetMeshState() > MeshRender::NeedConvert) { float a_j = lol::abs(j); float i_trans = (a_j * a_j * m_hist_scale_mesh.x + a_j * m_hist_scale_mesh.x) * .5f; @@ -720,12 +776,12 @@ public: //Camera projection mat4 new_proj = mat_obj_offset * mat_count_offset * mat_align * mat_count_scale * save_proj; m_camera->SetProjection(new_proj); - m_meshes[i]->Render(m_mat); + m_meshes[i].m1->Render(m_mat); g_renderer->Clear(ClearMask::Depth); } m_camera->SetProjection(save_proj); #else - m_meshes[i]->Render(m_mat); + m_meshes[i].m1->Render(m_mat); #endif //ALL_FEATURES } } @@ -762,19 +818,19 @@ public: #if 0 //Debug normal draw for (int i = m_meshes.Count() - 1; 0 <= i && i < m_meshes.Count(); i++) { - for (int j = 0; j < m_meshes[i]->m_indices.Count(); j += 3) + for (int j = 0; j < m_meshes[i].m1->m_indices.Count(); j += 3) { - VertexData v[3] = { m_meshes[i]->m_vert[m_meshes[i]->m_indices[j ]], - m_meshes[i]->m_vert[m_meshes[i]->m_indices[j+1]], - m_meshes[i]->m_vert[m_meshes[i]->m_indices[j+2]] + VertexData v[3] = { m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j ]], + m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j+1]], + m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j+2]] }; for (int k = 0; k < 3; k++) Debug::DrawLine((m_mat * mat4::translate(v[k].m_coord)).v3.xyz, (m_mat * mat4::translate(v[(k+1)%3].m_coord)).v3.xyz, vec4(vec3((v[k].m_coord.z + 1.f)*.5f),1.f)); } - for (int j = 0; j < m_meshes[i]->m_vert.Count(); j++) + for (int j = 0; j < m_meshes[i].m1->m_vert.Count(); j++) { - VertexData &v = m_meshes[i]->m_vert[m_meshes[i]->m_indices[j]]; + VertexData &v = m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j]]; Debug::DrawLine((m_mat * mat4::translate(v.m_coord)).v3.xyz, (m_mat * mat4::translate(v.m_coord)).v3.xyz + (m_mat * vec4(v.m_normal * 5.f, 0.f)).xyz, vec4(lol::abs(v.m_normal), 1.f)); @@ -813,11 +869,16 @@ private: vec2 m_hist_scale_speed; vec2 m_screen_offset; + //Mesh update timer + float m_build_timer; + float m_build_time; + //Mesh infos vec2 m_render_max; + int m_mesh_render; int m_mesh_id; float m_mesh_id1; - Array m_meshes; + Array m_meshes; Array m_gizmos; //File data