@@ -426,6 +426,19 @@ EasyMesh::EasyMesh() | |||
: m_build_data(nullptr) | |||
{ | |||
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++) | |||
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); | |||
for (int i = DebugRenderMode::Default + 1; i < DebugRenderMode::Max; i++) | |||
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) | |||
{ | |||
m_vert.Push(VertexData(coord, vec3(0.f, 1.f, 0.f), BD()->Color())); | |||
m_state = MeshRender::NeedConvert; | |||
} | |||
//----------------------------------------------------------------------------- | |||
void EasyMesh::AddDuplicateVertex(int 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), | |||
((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))); | |||
m_state = MeshRender::NeedConvert; | |||
} | |||
//----------------------------------------------------------------------------- | |||
@@ -26,14 +26,17 @@ struct MeshRender | |||
{ | |||
enum Value | |||
{ | |||
NeedInit, | |||
NeedData, | |||
NeedConvert, | |||
CanRender, | |||
IgnoreRender | |||
IgnoreRender, | |||
Max | |||
} | |||
m_value; | |||
inline MeshRender(Value v) : m_value(v) {} | |||
inline MeshRender() : m_value(NeedInit) {} | |||
inline MeshRender() : m_value(NeedData) {} | |||
inline operator Value() { return m_value; } | |||
}; | |||
@@ -106,6 +109,8 @@ public: | |||
class GpuEasyMeshData | |||
{ | |||
friend class EasyMesh; | |||
public: | |||
//--- | |||
GpuEasyMeshData(); | |||
@@ -520,14 +525,18 @@ struct Axis | |||
class EasyMesh | |||
{ | |||
friend class EasyMeshParser; | |||
friend class GpuEasyMeshData; | |||
public: | |||
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: | |||
void UpdateVertexDict(Array< int, int > &vertex_dict); | |||
@@ -832,14 +841,14 @@ public: | |||
vec3 const &GetVertexLocation(int i) { return m_vert[i].m_coord; } | |||
private: | |||
Array<uint16_t> m_indices; | |||
Array<VertexData> m_vert; | |||
Array<uint16_t> m_indices; | |||
Array<VertexData> m_vert; | |||
//<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: | |||
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 | |||
//[afcb 1 1 1 -.1 tx 1] | |||
//[afcb 1 1 1 -.1 tx 0] | |||
@@ -268,8 +268,8 @@ public: | |||
//Target List Setup | |||
Array<vec3> target_list; | |||
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 | |||
@@ -331,17 +331,15 @@ public: | |||
int u = 4; | |||
while (u-- > 0 && MessageService::FetchFirst(MSG_IN, mesh)) | |||
{ | |||
int o = 1; | |||
int o = 4; | |||
while (o-- > 0) | |||
{ | |||
if (m_mesh_id == m_meshes.Count() - 1) | |||
m_mesh_id++; | |||
//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); | |||
#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)); | |||
vec3 x = vec3(1.f,0.f,0.f); | |||
vec3 y = vec3(0.f,1.f,0.f); | |||
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 | |||
int m_mesh_id; | |||
float m_mesh_id1; | |||
Array<EasyMesh, bool> m_meshes; | |||
Array<EasyMesh> m_meshes; | |||
//File data | |||
String m_file_name; | |||
@@ -11,18 +11,18 @@ | |||
<style type="text/css"> | |||
#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 { | |||
position: relative; | |||
left: 0px; | |||
top: 0px; | |||
z-index: 0; | |||
position: relative; | |||
left: 0px; | |||
top: 0px; | |||
z-index: 0; | |||
} | |||
</style> | |||
<!-- | |||
@@ -38,13 +38,13 @@ | |||
document.getElementById('prout').style.top = 0; | |||
function Tick() { | |||
window.setTimeout("Tick()", 100); | |||
window.setTimeout("Tick()", 100); | |||
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'); | |||
if (statusField) { | |||
statusField.innerHTML = truc; | |||
} | |||
} | |||
} | |||
@@ -54,8 +54,8 @@ | |||
MeshCodeModule = document.getElementById('ID_MeshCode'); | |||
//document.getElementById('listener').style.visibility = "visible"; | |||
//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'); | |||
} | |||
@@ -153,17 +153,17 @@ visibility="hidden" | |||
</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> | |||