| @@ -426,6 +426,19 @@ EasyMesh::EasyMesh() | |||||
| : m_build_data(nullptr) | : m_build_data(nullptr) | ||||
| { | { | ||||
| m_cursors.Push(0, 0); | m_cursors.Push(0, 0); | ||||
| m_state = MeshRender::NeedData; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| EasyMesh::EasyMesh(const EasyMesh& em) | |||||
| { | |||||
| *this = em; | |||||
| m_build_data = nullptr; | |||||
| m_gpu_data = GpuEasyMeshData(); | |||||
| if (m_indices.Count() && m_vert.Count() && m_cursors.Count()) | |||||
| m_state = MeshRender::NeedConvert; | |||||
| else | |||||
| m_state = MeshRender::NeedData; | |||||
| } | } | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| @@ -458,6 +471,7 @@ void EasyMesh::MeshConvert(GpuShaderData* new_gpu_sdata) | |||||
| for (int i = DebugRenderMode::Default + 1; i < DebugRenderMode::Max; i++) | for (int i = DebugRenderMode::Default + 1; i < DebugRenderMode::Max; i++) | ||||
| m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); | m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); | ||||
| } | } | ||||
| m_state = MeshRender::CanRender; | |||||
| } | } | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| @@ -476,12 +490,36 @@ void EasyMesh::MeshConvert(Shader* provided_shader) | |||||
| m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode::Default), this); | m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode::Default), this); | ||||
| for (int i = DebugRenderMode::Default + 1; i < DebugRenderMode::Max; i++) | for (int i = DebugRenderMode::Default + 1; i < DebugRenderMode::Max; i++) | ||||
| m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); | m_gpu_data.AddGpuData(new DefaultShaderData(DebugRenderMode(i)), this); | ||||
| m_state = MeshRender::CanRender; | |||||
| } | |||||
| //----------------------------------------------------------------------------- | |||||
| bool EasyMesh::Render(mat4 const &model) | |||||
| { | |||||
| if (m_state == MeshRender::CanRender) | |||||
| { | |||||
| m_gpu_data.RenderMeshData(model); | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | } | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| void EasyMesh::Render(mat4 const &model) | |||||
| bool EasyMesh::SetRender(bool should_render) | |||||
| { | { | ||||
| m_gpu_data.RenderMeshData(model); | |||||
| if (m_state == MeshRender::CanRender) | |||||
| { | |||||
| if (!should_render) | |||||
| m_state = MeshRender::IgnoreRender; | |||||
| return true; | |||||
| } | |||||
| else if (m_state == MeshRender::IgnoreRender) | |||||
| { | |||||
| if (should_render) | |||||
| m_state = MeshRender::CanRender; | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | } | ||||
| //------------------- | //------------------- | ||||
| @@ -851,12 +889,14 @@ void EasyMesh::SetCurColor2(vec4 const &color) | |||||
| void EasyMesh::AddVertex(vec3 const &coord) | void EasyMesh::AddVertex(vec3 const &coord) | ||||
| { | { | ||||
| m_vert.Push(VertexData(coord, vec3(0.f, 1.f, 0.f), BD()->Color())); | m_vert.Push(VertexData(coord, vec3(0.f, 1.f, 0.f), BD()->Color())); | ||||
| m_state = MeshRender::NeedConvert; | |||||
| } | } | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| void EasyMesh::AddDuplicateVertex(int i) | void EasyMesh::AddDuplicateVertex(int i) | ||||
| { | { | ||||
| m_vert << m_vert[i]; | m_vert << m_vert[i]; | ||||
| m_state = MeshRender::NeedConvert; | |||||
| } | } | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| @@ -869,6 +909,7 @@ void EasyMesh::AddLerpVertex(int i, int j, float alpha) | |||||
| lol::lerp(m_vert[i].m_texcoord, m_vert[j].m_texcoord, alpha), | lol::lerp(m_vert[i].m_texcoord, m_vert[j].m_texcoord, alpha), | ||||
| ((alpha < .5f) ? (m_vert[i].m_bone_id) : (m_vert[j].m_bone_id)), /* FIXME ? */ | ((alpha < .5f) ? (m_vert[i].m_bone_id) : (m_vert[j].m_bone_id)), /* FIXME ? */ | ||||
| lol::lerp(m_vert[i].m_bone_weight, m_vert[j].m_bone_weight, alpha))); | lol::lerp(m_vert[i].m_bone_weight, m_vert[j].m_bone_weight, alpha))); | ||||
| m_state = MeshRender::NeedConvert; | |||||
| } | } | ||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
| @@ -26,14 +26,17 @@ struct MeshRender | |||||
| { | { | ||||
| enum Value | enum Value | ||||
| { | { | ||||
| NeedInit, | |||||
| NeedData, | |||||
| NeedConvert, | |||||
| CanRender, | CanRender, | ||||
| IgnoreRender | |||||
| IgnoreRender, | |||||
| Max | |||||
| } | } | ||||
| m_value; | m_value; | ||||
| inline MeshRender(Value v) : m_value(v) {} | inline MeshRender(Value v) : m_value(v) {} | ||||
| inline MeshRender() : m_value(NeedInit) {} | |||||
| inline MeshRender() : m_value(NeedData) {} | |||||
| inline operator Value() { return m_value; } | inline operator Value() { return m_value; } | ||||
| }; | }; | ||||
| @@ -106,6 +109,8 @@ public: | |||||
| class GpuEasyMeshData | class GpuEasyMeshData | ||||
| { | { | ||||
| friend class EasyMesh; | |||||
| public: | public: | ||||
| //--- | //--- | ||||
| GpuEasyMeshData(); | GpuEasyMeshData(); | ||||
| @@ -520,14 +525,18 @@ struct Axis | |||||
| class EasyMesh | class EasyMesh | ||||
| { | { | ||||
| friend class EasyMeshParser; | friend class EasyMeshParser; | ||||
| friend class GpuEasyMeshData; | |||||
| public: | public: | ||||
| EasyMesh(); | EasyMesh(); | ||||
| EasyMesh(const EasyMesh& em); | |||||
| bool Compile(char const *command); | |||||
| void MeshConvert(GpuShaderData* new_gpu_sdata); | |||||
| void MeshConvert(Shader* ProvidedShader = nullptr); | |||||
| void Render(mat4 const &model); | |||||
| bool Compile(char const *command); | |||||
| void MeshConvert(GpuShaderData* new_gpu_sdata); | |||||
| void MeshConvert(Shader* ProvidedShader = nullptr); | |||||
| bool Render(mat4 const &model); | |||||
| MeshRender GetMeshState() { return m_state; } | |||||
| bool SetRender(bool should_render); | |||||
| private: | private: | ||||
| void UpdateVertexDict(Array< int, int > &vertex_dict); | void UpdateVertexDict(Array< int, int > &vertex_dict); | ||||
| @@ -832,14 +841,14 @@ public: | |||||
| vec3 const &GetVertexLocation(int i) { return m_vert[i].m_coord; } | vec3 const &GetVertexLocation(int i) { return m_vert[i].m_coord; } | ||||
| private: | private: | ||||
| Array<uint16_t> m_indices; | |||||
| Array<VertexData> m_vert; | |||||
| Array<uint16_t> m_indices; | |||||
| Array<VertexData> m_vert; | |||||
| //<vert count, indices count> | //<vert count, indices count> | ||||
| Array<int, int> m_cursors; | |||||
| Array<int, int> m_cursors; | |||||
| friend class GpuEasyMeshData; | |||||
| GpuEasyMeshData m_gpu_data; | |||||
| MeshRender m_state; | |||||
| GpuEasyMeshData m_gpu_data; | |||||
| public: | public: | ||||
| inline EasyMeshBuildData* BD() | inline EasyMeshBuildData* BD() | ||||
| @@ -1,7 +1,9 @@ | |||||
| [sc#f8f ab 1 splt 3 twy 90] | |||||
| // splt 5 twy 90 0 | |||||
| //[sc#f8f afcb 10 10 10 .25 tx 0 splt 3 twy 1.6 0 ] | |||||
| [sc#f8f ab 1 splt 4 twy 90] | |||||
| // splt 5 twy 90 0 | |||||
| //[sc#f8f afcb 10 10 10 .25 tx 0 splt 4 twy 1.6 0 ] | |||||
| //sc#fff | //sc#fff | ||||
| //[afcb 1 1 1 -.1 tx 1] | //[afcb 1 1 1 -.1 tx 1] | ||||
| //[afcb 1 1 1 -.1 tx 0] | //[afcb 1 1 1 -.1 tx 0] | ||||
| @@ -268,8 +268,8 @@ public: | |||||
| //Target List Setup | //Target List Setup | ||||
| Array<vec3> target_list; | Array<vec3> target_list; | ||||
| if (m_meshes.Count() && m_mesh_id >= 0) | if (m_meshes.Count() && m_mesh_id >= 0) | ||||
| 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; | |||||
| 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; | |||||
| //-- | //-- | ||||
| //Update mesh screen location - Get the Min/Max needed | //Update mesh screen location - Get the Min/Max needed | ||||
| @@ -331,17 +331,15 @@ public: | |||||
| int u = 4; | int u = 4; | ||||
| while (u-- > 0 && MessageService::FetchFirst(MSG_IN, mesh)) | while (u-- > 0 && MessageService::FetchFirst(MSG_IN, mesh)) | ||||
| { | { | ||||
| int o = 1; | |||||
| int o = 4; | |||||
| while (o-- > 0) | while (o-- > 0) | ||||
| { | { | ||||
| if (m_mesh_id == m_meshes.Count() - 1) | if (m_mesh_id == m_meshes.Count() - 1) | ||||
| m_mesh_id++; | m_mesh_id++; | ||||
| //Create a new mesh | //Create a new mesh | ||||
| m_meshes.Push(EasyMesh(), false); | |||||
| if (!m_meshes.Last().m1.Compile(mesh.C())) | |||||
| m_meshes.Pop(); | |||||
| //else | |||||
| // m_meshes.Last().m1.ComputeTexCoord(0.2f, 2); | |||||
| EasyMesh tmp; | |||||
| if (tmp.Compile(mesh.C())) | |||||
| m_meshes.Push(tmp); | |||||
| } | } | ||||
| } | } | ||||
| @@ -431,49 +429,47 @@ public: | |||||
| m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0); | m_texture_shader->SetUniform(m_texture_uni, m_default_texture->GetTexture(), 0); | ||||
| #endif //!__native_client__ | #endif //!__native_client__ | ||||
| for (int i = 0; i < m_meshes.Count(); i++) | |||||
| { | |||||
| if (!m_meshes[i].m2) | |||||
| { | |||||
| #if WITH_TEXTURE | |||||
| 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].m1.MeshConvert(); | |||||
| #endif | |||||
| m_meshes[i].m2 = true; | |||||
| } | |||||
| } | |||||
| g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | g_renderer->SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f)); | ||||
| vec3 x = vec3(1.f,0.f,0.f); | vec3 x = vec3(1.f,0.f,0.f); | ||||
| vec3 y = vec3(0.f,1.f,0.f); | vec3 y = vec3(0.f,1.f,0.f); | ||||
| for (int i = 0; i < m_meshes.Count(); i++) | for (int i = 0; i < m_meshes.Count(); i++) | ||||
| { | { | ||||
| mat4 save_proj = m_camera->GetProjection(); | |||||
| float j = -(float)(m_meshes.Count() - (i + 1)) + (-m_mesh_id1 + (float)(m_meshes.Count() - 1)); | |||||
| if (m_meshes[i].m2) | |||||
| { | { | ||||
| mat4 new_proj = | |||||
| //Y object Offset | |||||
| mat4::translate(x * m_screen_offset.x + y * m_screen_offset.y) * | |||||
| //Mesh Pos Offset | |||||
| mat4::translate((x * m_pos_mesh.x * RATIO_HW + y * m_pos_mesh.y) * 2.f * (1.f + .5f * m_zoom_mesh / SCREEN_LIMIT)) * | |||||
| //Mesh count offset | |||||
| mat4::translate(x * RATIO_HW * 2.f * j) * | |||||
| //Align right meshes | |||||
| mat4::translate(x - x * RATIO_HW) * | |||||
| //Mesh count scale | |||||
| //mat4::scale(1.f - .2f * j * (1.f / (float)m_meshes.Count())) * | |||||
| //Camera projection | |||||
| save_proj; | |||||
| m_camera->SetProjection(new_proj); | |||||
| m_meshes[i].m1.Render(m_mat); | |||||
| g_renderer->Clear(ClearMask::Depth); | |||||
| if (m_meshes[i].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)); | |||||
| #else | |||||
| m_meshes[i].MeshConvert(); | |||||
| #endif //WITH_TEXTURE | |||||
| } | |||||
| mat4 save_proj = m_camera->GetProjection(); | |||||
| float j = -(float)(m_meshes.Count() - (i + 1)) + (-m_mesh_id1 + (float)(m_meshes.Count() - 1)); | |||||
| if (m_meshes[i].GetMeshState() > MeshRender::NeedConvert) | |||||
| { | |||||
| mat4 new_proj = | |||||
| //Y object Offset | |||||
| mat4::translate(x * m_screen_offset.x + y * m_screen_offset.y) * | |||||
| //Mesh Pos Offset | |||||
| mat4::translate((x * m_pos_mesh.x * RATIO_HW + y * m_pos_mesh.y) * 2.f * (1.f + .5f * m_zoom_mesh / SCREEN_LIMIT)) * | |||||
| //Mesh count offset | |||||
| mat4::translate(x * RATIO_HW * 2.f * j) * | |||||
| //Align right meshes | |||||
| mat4::translate(x - x * RATIO_HW) * | |||||
| //Mesh count scale | |||||
| //mat4::scale(1.f - .2f * j * (1.f / (float)m_meshes.Count())) * | |||||
| //Camera projection | |||||
| save_proj; | |||||
| m_camera->SetProjection(new_proj); | |||||
| m_meshes[i].Render(m_mat); | |||||
| g_renderer->Clear(ClearMask::Depth); | |||||
| } | |||||
| m_camera->SetProjection(save_proj); | |||||
| } | } | ||||
| m_camera->SetProjection(save_proj); | |||||
| } | } | ||||
| } | } | ||||
| @@ -502,7 +498,7 @@ private: | |||||
| //Mesh infos | //Mesh infos | ||||
| int m_mesh_id; | int m_mesh_id; | ||||
| float m_mesh_id1; | float m_mesh_id1; | ||||
| Array<EasyMesh, bool> m_meshes; | |||||
| Array<EasyMesh> m_meshes; | |||||
| //File data | //File data | ||||
| String m_file_name; | String m_file_name; | ||||
| @@ -11,18 +11,18 @@ | |||||
| <style type="text/css"> | <style type="text/css"> | ||||
| #canvas_loading { | #canvas_loading { | ||||
| position: relative; | |||||
| left: -2px; | |||||
| top: -487px; | |||||
| z-index: 1; | |||||
| border:2px solid #c3c3c3; | |||||
| width:640px;height:480px; | |||||
| position: relative; | |||||
| left: -2px; | |||||
| top: -487px; | |||||
| z-index: 1; | |||||
| border:2px solid #c3c3c3; | |||||
| width:640px;height:480px; | |||||
| } | } | ||||
| #nacl_div { | #nacl_div { | ||||
| position: relative; | |||||
| left: 0px; | |||||
| top: 0px; | |||||
| z-index: 0; | |||||
| position: relative; | |||||
| left: 0px; | |||||
| top: 0px; | |||||
| z-index: 0; | |||||
| } | } | ||||
| </style> | </style> | ||||
| <!-- | <!-- | ||||
| @@ -38,13 +38,13 @@ | |||||
| document.getElementById('prout').style.top = 0; | document.getElementById('prout').style.top = 0; | ||||
| function Tick() { | function Tick() { | ||||
| window.setTimeout("Tick()", 100); | |||||
| window.setTimeout("Tick()", 100); | |||||
| var truc = parseInt(document.getElementById('prout').style.top); | var truc = parseInt(document.getElementById('prout').style.top); | ||||
| //document.getElementById('prout').style.top = truc + 1 + "px"; | |||||
| //document.getElementById('prout').style.top = truc + 1 + "px"; | |||||
| var statusField = document.getElementById('tick_field'); | var statusField = document.getElementById('tick_field'); | ||||
| if (statusField) { | if (statusField) { | ||||
| statusField.innerHTML = truc; | statusField.innerHTML = truc; | ||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -54,8 +54,8 @@ | |||||
| MeshCodeModule = document.getElementById('ID_MeshCode'); | MeshCodeModule = document.getElementById('ID_MeshCode'); | ||||
| //document.getElementById('listener').style.visibility = "visible"; | //document.getElementById('listener').style.visibility = "visible"; | ||||
| //document.getElementById('canvas_loading').style.display = "none"; | //document.getElementById('canvas_loading').style.display = "none"; | ||||
| //document.getElementById('ID_NaClModule').width = 640; | |||||
| //document.getElementById('ID_NaClModule').height = 480; | |||||
| //document.getElementById('ID_NaClModule').width = 640; | |||||
| //document.getElementById('ID_NaClModule').height = 480; | |||||
| updateStatus('SUCCESS'); | updateStatus('SUCCESS'); | ||||
| } | } | ||||
| @@ -153,17 +153,17 @@ visibility="hidden" | |||||
| </td> </tr> | </td> </tr> | ||||
| --> | --> | ||||
| <div id="nacl_div"> | |||||
| <embed name="nacl_module" | |||||
| id="ID_NaClModule" | |||||
| width=770 height=200 | |||||
| src="nacl.nmf" | |||||
| type="application/x-nacl" /> | |||||
| </div> | |||||
| <div id="nacl_div"> | |||||
| <embed name="nacl_module" | |||||
| id="ID_NaClModule" | |||||
| width=770 height=200 | |||||
| src="nacl.nmf" | |||||
| type="application/x-nacl" /> | |||||
| </div> | |||||
| <!-- | <!-- | ||||
| <div id="canvas_loading"> | |||||
| <canvas id="myCanvas" width="640" height="480" visibility="hidden"></canvas> | |||||
| </div> | |||||
| <div id="canvas_loading"> | |||||
| <canvas id="myCanvas" width="640" height="480" visibility="hidden"></canvas> | |||||
| </div> | |||||
| --> | --> | ||||
| <script> | <script> | ||||