@@ -100,6 +100,7 @@ liblolcore_sources = \ | |||
generated/lolfx-scanner.cpp \ | |||
\ | |||
mesh/mesh.cpp mesh/mesh.h \ | |||
mesh/primitive.cpp mesh/primitive.h \ | |||
\ | |||
sys/init.cpp sys/timer.cpp sys/file.cpp \ | |||
sys/threadbase.h \ | |||
@@ -183,6 +183,7 @@ static inline int isnan(float f) | |||
#include "map.h" | |||
#include "layer.h" | |||
#include "mesh/mesh.h" | |||
#include "mesh/primitive.h" | |||
#include "application/application.h" | |||
#include "easymesh/csgbsp.h" | |||
#include "easymesh/easymesh.h" | |||
@@ -6,12 +6,12 @@ attribute vec3 in_Position; | |||
attribute vec4 in_Color; | |||
varying vec4 pass_Color; | |||
uniform mat4 proj_matrix; | |||
uniform mat4 view_matrix; | |||
uniform mat4 u_projection; | |||
uniform mat4 u_view; | |||
void main() | |||
{ | |||
gl_Position = proj_matrix * view_matrix | |||
gl_Position = u_projection * u_view | |||
* vec4(in_Position, 1.0); | |||
pass_Color = in_Color; | |||
} | |||
@@ -35,12 +35,12 @@ void main() | |||
void main(float4 in_Position : POSITION, | |||
float4 in_Color : COLOR, | |||
uniform float4x4 proj_matrix, | |||
uniform float4x4 view_matrix, | |||
uniform float4x4 u_projection, | |||
uniform float4x4 u_view, | |||
out float4 out_Color : COLOR, | |||
out float4 out_Position : POSITION) | |||
{ | |||
out_Position = mul(proj_matrix, mul(view_matrix, in_Position)); | |||
out_Position = mul(u_projection, mul(u_view, in_Position)); | |||
out_Color = in_Color; | |||
} | |||
@@ -6,13 +6,13 @@ attribute vec3 in_Position; | |||
attribute vec2 in_TexCoord; | |||
varying vec2 pass_TexCoord; | |||
uniform mat4 proj_matrix; | |||
uniform mat4 view_matrix; | |||
uniform mat4 model_matrix; | |||
uniform mat4 u_projection; | |||
uniform mat4 u_view; | |||
uniform mat4 u_model; | |||
void main() | |||
{ | |||
gl_Position = proj_matrix * view_matrix * model_matrix | |||
gl_Position = u_projection * u_view * u_model | |||
* vec4(in_Position, 1.0); | |||
pass_TexCoord = in_TexCoord; | |||
} | |||
@@ -39,9 +39,9 @@ void main() | |||
void main(float4 in_Position : POSITION, | |||
float2 in_TexCoord : TEXCOORD0, | |||
uniform float4x4 proj_matrix, | |||
uniform float4x4 view_matrix, | |||
uniform float4x4 model_matrix, | |||
uniform float4x4 u_projection, | |||
uniform float4x4 u_view, | |||
uniform float4x4 u_model, | |||
uniform float2 in_TexSize, | |||
out float2 out_TexCoord : TEXCOORD0, | |||
out float4 out_Position : POSITION) | |||
@@ -51,7 +51,7 @@ void main(float4 in_Position : POSITION, | |||
#else | |||
float2 delta = float2(0.0, 0.0); | |||
#endif | |||
out_Position = mul(proj_matrix, mul(view_matrix, mul(model_matrix, in_Position))); | |||
out_Position = mul(u_projection, mul(u_view, mul(u_model, in_Position))); | |||
out_TexCoord = in_TexCoord + delta; | |||
} | |||
@@ -93,11 +93,11 @@ void Gradient::TickDraw(float seconds) | |||
data->shader->Bind(); | |||
uni_mat = data->shader->GetUniformLocation("proj_matrix"); | |||
uni_mat = data->shader->GetUniformLocation("u_projection"); | |||
data->shader->SetUniform(uni_mat, g_scene->GetCamera()->GetProjection()); | |||
uni_mat = data->shader->GetUniformLocation("view_matrix"); | |||
uni_mat = data->shader->GetUniformLocation("u_view"); | |||
data->shader->SetUniform(uni_mat, g_scene->GetCamera()->GetView()); | |||
uni_mat = data->shader->GetUniformLocation("model_matrix"); | |||
uni_mat = data->shader->GetUniformLocation("u_model"); | |||
data->shader->SetUniform(uni_mat, model_matrix); | |||
data->shader->Bind(); | |||
@@ -6,13 +6,13 @@ attribute vec3 in_Position; | |||
attribute vec4 in_Color; | |||
varying vec4 pass_Color; | |||
uniform mat4 proj_matrix; | |||
uniform mat4 view_matrix; | |||
uniform mat4 model_matrix; | |||
uniform mat4 u_projection; | |||
uniform mat4 u_view; | |||
uniform mat4 u_model; | |||
void main() | |||
{ | |||
gl_Position = proj_matrix * view_matrix * model_matrix | |||
gl_Position = u_projection * u_view * u_model | |||
* vec4(in_Position, 1.0); | |||
pass_Color = in_Color; | |||
} | |||
@@ -81,13 +81,13 @@ void main() | |||
void main(float4 in_Vertex : POSITION, | |||
float4 in_Color : COLOR, | |||
uniform float4x4 proj_matrix, | |||
uniform float4x4 view_matrix, | |||
uniform float4x4 model_matrix, | |||
uniform float4x4 u_projection, | |||
uniform float4x4 u_view, | |||
uniform float4x4 u_model, | |||
out float4 out_Color : COLOR, | |||
out float4 out_Position : POSITION) | |||
{ | |||
out_Position = mul(proj_matrix, mul(view_matrix, mul(model_matrix, in_Vertex))); | |||
out_Position = mul(u_projection, mul(u_view, mul(u_model, in_Vertex))); | |||
out_Color = in_Color; | |||
} | |||
@@ -158,6 +158,7 @@ | |||
<ClCompile Include="math\trig.cpp" /> | |||
<ClCompile Include="math\vector.cpp" /> | |||
<ClCompile Include="mesh\mesh.cpp" /> | |||
<ClCompile Include="mesh\primitive.cpp" /> | |||
<ClCompile Include="messageservice.cpp" /> | |||
<ClCompile Include="platform.cpp" /> | |||
<ClCompile Include="platform\d3d9\d3d9input.cpp" /> | |||
@@ -307,6 +308,7 @@ | |||
<ClInclude Include="lol\sys\timer.h" /> | |||
<ClInclude Include="lol\unit.h" /> | |||
<ClInclude Include="mesh\mesh.h" /> | |||
<ClInclude Include="mesh\primitive.h" /> | |||
<ClInclude Include="map.h" /> | |||
<ClInclude Include="messageservice.h" /> | |||
<ClInclude Include="numeric.h" /> | |||
@@ -117,6 +117,9 @@ | |||
<ClCompile Include="mesh\mesh.cpp"> | |||
<Filter>mesh</Filter> | |||
</ClCompile> | |||
<ClCompile Include="mesh\primitive.cpp"> | |||
<Filter>mesh</Filter> | |||
</ClCompile> | |||
<ClCompile Include="gpu\rendercontext.cpp"> | |||
<Filter>gpu</Filter> | |||
</ClCompile> | |||
@@ -378,6 +381,9 @@ | |||
<ClInclude Include="mesh\mesh.h"> | |||
<Filter>mesh</Filter> | |||
</ClInclude> | |||
<ClInclude Include="mesh\primitive.h"> | |||
<Filter>mesh</Filter> | |||
</ClInclude> | |||
<ClInclude Include="application\application.h"> | |||
<Filter>application</Filter> | |||
</ClInclude> | |||
@@ -715,4 +721,4 @@ | |||
</None> | |||
<None Include="Makefile.am" /> | |||
</ItemGroup> | |||
</Project> | |||
</Project> |
@@ -46,9 +46,6 @@ SubMesh::SubMesh(lol::VertexDeclaration* vdecl) | |||
: m_mesh_prim(MeshPrimitive::Triangles) | |||
{ | |||
m_vdecl = vdecl; | |||
m_vbos = new VertexBuffer*[vdecl->GetStreamCount()]; | |||
memset(m_vbos, 0, sizeof(VertexBuffer*) * vdecl->GetStreamCount()); | |||
m_vertex_count = -1; | |||
} | |||
SubMesh::~SubMesh() | |||
@@ -63,9 +60,10 @@ void SubMesh::SetMeshPrimitive(MeshPrimitive mesh_primitive) | |||
void SubMesh::SetVertexBuffer(int index, VertexBuffer* vbo) | |||
{ | |||
while (index >= m_vbos.Count()) | |||
m_vbos.Push(nullptr); | |||
m_vbos[index] = vbo; | |||
if (m_vertex_count < 0) | |||
m_vertex_count = vbo->GetSize() / m_vdecl->GetStream(index).GetSize(); | |||
} | |||
void SubMesh::AddTexture(const char* name, Texture* texture) | |||
@@ -75,10 +73,9 @@ void SubMesh::AddTexture(const char* name, Texture* texture) | |||
void SubMesh::Render(Shader* shader) | |||
{ | |||
ShaderAttrib attribs[12]; | |||
int vertex_count = 0; | |||
int c = 0; | |||
for (int i = 0; i < m_vdecl->GetStreamCount(); ++i) | |||
for (int i = 0; i < m_vbos.Count(); ++i) | |||
{ | |||
ShaderAttrib attribs[12]; | |||
@@ -98,18 +95,20 @@ void SubMesh::Render(Shader* shader) | |||
attribs[j] = shader->GetAttribLocation(usage, indices[usage]++); | |||
} | |||
vertex_count = m_vbos[i]->GetSize() / m_vdecl->GetStream(i).GetSize(); | |||
m_vdecl->SetStream(m_vbos[i], attribs); | |||
} | |||
for (int i = 0; i < m_textures.Count(); ++i) | |||
{ | |||
// TODO: might be good to cache this | |||
ShaderUniform uniform = shader->GetUniformLocation(m_textures[i].m1.C()); | |||
shader->SetUniform(uniform, m_textures[i].m2->GetTexture(), i); | |||
ShaderUniform u_tex = shader->GetUniformLocation(m_textures[i].m1.C()); | |||
shader->SetUniform(u_tex, m_textures[i].m2->GetTexture(), i); | |||
} | |||
m_vdecl->Bind(); | |||
m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, m_vertex_count); | |||
m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, vertex_count); | |||
m_vdecl->Unbind(); | |||
} | |||
@@ -19,6 +19,31 @@ | |||
namespace lol | |||
{ | |||
/* | |||
* A mesh contains a list of submeshes. This is a convenient way to | |||
* handle different materials or mesh types (static, skeletal, morph | |||
* targets, etc.) within the same container object. | |||
*/ | |||
class Mesh | |||
{ | |||
public: | |||
Mesh(); | |||
~Mesh(); | |||
void Render(mat4 const &model); | |||
private: | |||
Array<class SubMesh *> m_submeshes; | |||
}; | |||
/* | |||
* A submesh contains: | |||
* - a vertex declaration | |||
* - a list of VBOs | |||
* - a list of textures | |||
*/ | |||
class SubMesh | |||
{ | |||
public: | |||
@@ -34,24 +59,11 @@ public: | |||
protected: | |||
VertexDeclaration* m_vdecl; | |||
MeshPrimitive m_mesh_prim; | |||
VertexBuffer** m_vbos; | |||
int m_vertex_count; | |||
Array<VertexBuffer *> m_vbos; | |||
Array<String, Texture*> m_textures; | |||
}; | |||
class Mesh | |||
{ | |||
public: | |||
Mesh(); | |||
~Mesh(); | |||
void Render(mat4 const &model); | |||
private: | |||
Array<SubMesh *> m_submeshes; | |||
}; | |||
} /* namespace lol */ | |||
#endif /* __MESH_MESH_H__ */ | |||
@@ -0,0 +1,39 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// | |||
#if defined HAVE_CONFIG_H | |||
# include "config.h" | |||
#endif | |||
#include <cstring> | |||
#include <cstdlib> | |||
#include "core.h" | |||
namespace lol | |||
{ | |||
/* | |||
* Primitive class | |||
*/ | |||
Primitive::Primitive(Mesh *mesh, Shader *shader, mat4 const &matrix) | |||
: m_mesh(mesh), | |||
m_shader(shader), | |||
m_matrix(matrix) | |||
{ | |||
} | |||
Primitive::~Primitive() | |||
{ | |||
} | |||
} /* namespace lol */ | |||
@@ -0,0 +1,42 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// | |||
// | |||
// The Primitive class | |||
// ------------------- | |||
// | |||
#if !defined __MESH_PRIMITIVE_H__ | |||
#define __MESH_PRIMITIVE_H__ | |||
#include "mesh/mesh.h" | |||
namespace lol | |||
{ | |||
class Primitive | |||
{ | |||
friend class Scene; | |||
public: | |||
Primitive(Mesh *mesh, Shader *shader, mat4 const &matrix); | |||
~Primitive(); | |||
private: | |||
Mesh *m_mesh; | |||
Shader *m_shader; | |||
mat4 m_matrix; | |||
}; | |||
} /* namespace lol */ | |||
#endif /* __MESH_PRIMITIVE_H__ */ | |||
@@ -56,6 +56,10 @@ class SceneData | |||
friend class Scene; | |||
private: | |||
/* New scenegraph */ | |||
Array<Primitive> m_primitives; | |||
/* Old API */ | |||
Array<vec3, vec3, vec4> m_lines; | |||
Shader *m_line_shader; | |||
VertexDeclaration *m_line_vdecl; | |||
@@ -144,6 +148,11 @@ void Scene::Reset() | |||
data->m_lights.Empty(); | |||
} | |||
void Scene::AddPrimitive(Mesh *mesh, Shader *shader, mat4 const &matrix) | |||
{ | |||
data->m_primitives.Push(Primitive(mesh, shader, matrix)); | |||
} | |||
void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale) | |||
{ | |||
ASSERT(id < tileset->GetTileCount()); | |||
@@ -179,6 +188,36 @@ void Scene::RenderPrimitives() | |||
{ | |||
/* TODO: this should be the main entry for rendering of all | |||
* primitives found in the scene graph. When we have one. */ | |||
Shader *shader = nullptr; | |||
ShaderUniform u_model, uni_tex, uni_texsize; | |||
ShaderAttrib a_pos, a_tex; | |||
for (int i = 0; i < data->m_primitives.Count(); ++i) | |||
{ | |||
Primitive &p = data->m_primitives[i]; | |||
/* If this primitive uses a new shader, update attributes */ | |||
if (p.m_shader != shader) | |||
{ | |||
shader = p.m_shader; | |||
a_pos = shader->GetAttribLocation(VertexUsage::Position, 0); | |||
a_tex = shader->GetAttribLocation(VertexUsage::TexCoord, 0); | |||
shader->Bind(); | |||
ShaderUniform u_mat; | |||
u_mat = shader->GetUniformLocation("u_projection"); | |||
shader->SetUniform(u_mat, GetCamera()->GetProjection()); | |||
u_mat = shader->GetUniformLocation("u_view"); | |||
shader->SetUniform(u_mat, GetCamera()->GetView()); | |||
u_model = shader->GetUniformLocation("u_model"); | |||
} | |||
shader->SetUniform(u_model, p.m_matrix); | |||
} | |||
} | |||
void Scene::RenderTiles() // XXX: rename to Blit() | |||
@@ -207,11 +246,11 @@ void Scene::RenderTiles() // XXX: rename to Blit() | |||
data->m_tile_shader->Bind(); | |||
uni_mat = data->m_tile_shader->GetUniformLocation("proj_matrix"); | |||
uni_mat = data->m_tile_shader->GetUniformLocation("u_projection"); | |||
data->m_tile_shader->SetUniform(uni_mat, GetCamera()->GetProjection()); | |||
uni_mat = data->m_tile_shader->GetUniformLocation("view_matrix"); | |||
uni_mat = data->m_tile_shader->GetUniformLocation("u_view"); | |||
data->m_tile_shader->SetUniform(uni_mat, GetCamera()->GetView()); | |||
uni_mat = data->m_tile_shader->GetUniformLocation("model_matrix"); | |||
uni_mat = data->m_tile_shader->GetUniformLocation("u_model"); | |||
data->m_tile_shader->SetUniform(uni_mat, mat4(1.f)); | |||
uni_tex = data->m_tile_shader->GetUniformLocation("in_Texture"); | |||
@@ -312,9 +351,9 @@ void Scene::RenderLines() // XXX: rename to Blit() | |||
data->m_line_shader->Bind(); | |||
uni_mat = data->m_line_shader->GetUniformLocation("proj_matrix"); | |||
uni_mat = data->m_line_shader->GetUniformLocation("u_projection"); | |||
data->m_line_shader->SetUniform(uni_mat, GetCamera()->GetProjection()); | |||
uni_mat = data->m_line_shader->GetUniformLocation("view_matrix"); | |||
uni_mat = data->m_line_shader->GetUniformLocation("u_view"); | |||
data->m_line_shader->SetUniform(uni_mat, GetCamera()->GetView()); | |||
data->m_line_vdecl->Bind(); | |||
@@ -21,6 +21,7 @@ | |||
#include "tileset.h" | |||
#include "light.h" | |||
#include "camera.h" | |||
#include "mesh/primitive.h" | |||
namespace lol | |||
{ | |||
@@ -46,6 +47,9 @@ public: | |||
void RenderTiles(); | |||
void RenderLines(); | |||
/* New scenegraph */ | |||
void AddPrimitive(Mesh *mesh, Shader *shader, mat4 const &matrix); | |||
/* FIXME: this should be deprecated -- it doesn't really match | |||
* the architecture we want to build */ | |||
void AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale); | |||