Преглед на файлове

Added Flat debugrendermode

Wireframe is back for normal OGL users
MV : Added timed command execution for future "demo mode"
undefined
Benjamin ‘Touky’ Huet Sam Hocevar <sam@hocevar.net> преди 11 години
родител
ревизия
c411be843c
променени са 6 файла, в които са добавени 143 реда и са изтрити 76 реда
  1. +31
    -18
      src/easymesh/easymesh.cpp
  2. +12
    -6
      src/easymesh/easymesh.h
  3. +5
    -21
      src/video.cpp
  4. +1
    -0
      src/video.h
  5. +4
    -2
      test/data/mesh-buffer.txt
  6. +90
    -29
      test/meshviewer.cpp

+ 31
- 18
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;
}
}
}


+ 12
- 6
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<int, int> &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<int, int> 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());


+ 5
- 21
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;
}


+ 1
- 0
src/video.h Целия файл

@@ -28,6 +28,7 @@ struct DebugRenderMode
{
//Add your new rendermode at your convenience
Default,
Flat,
Wireframe,
Lighting,
Normal,


+ 4
- 2
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]
"


+ 90
- 29
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<vec3> 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<EasyMesh*> m_meshes;
Array<EasyMesh*, EasyMesh*> m_meshes;
Array<EasyMesh*> m_gizmos;

//File data


Зареждане…
Отказ
Запис