Sfoglia il codice sorgente

scene: start working on the scene class reorganisation.

undefined
Sam Hocevar 11 anni fa
parent
commit
1945e85afc
14 ha cambiato i file con 201 aggiunte e 56 eliminazioni
  1. +1
    -0
      src/Makefile.am
  2. +1
    -0
      src/core.h
  3. +6
    -6
      src/gpu/line.lolfx
  4. +8
    -8
      src/gpu/tile.lolfx
  5. +3
    -3
      src/gradient.cpp
  6. +8
    -8
      src/gradient.lolfx
  7. +2
    -0
      src/lolcore.vcxproj
  8. +7
    -1
      src/lolcore.vcxproj.filters
  9. +10
    -11
      src/mesh/mesh.cpp
  10. +26
    -14
      src/mesh/mesh.h
  11. +39
    -0
      src/mesh/primitive.cpp
  12. +42
    -0
      src/mesh/primitive.h
  13. +44
    -5
      src/scene.cpp
  14. +4
    -0
      src/scene.h

+ 1
- 0
src/Makefile.am Vedi File

@@ -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 \


+ 1
- 0
src/core.h Vedi File

@@ -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
- 6
src/gpu/line.lolfx Vedi File

@@ -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;
}



+ 8
- 8
src/gpu/tile.lolfx Vedi File

@@ -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;
}



+ 3
- 3
src/gradient.cpp Vedi File

@@ -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();


+ 8
- 8
src/gradient.lolfx Vedi File

@@ -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;
}



+ 2
- 0
src/lolcore.vcxproj Vedi File

@@ -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" />


+ 7
- 1
src/lolcore.vcxproj.filters Vedi File

@@ -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>

+ 10
- 11
src/mesh/mesh.cpp Vedi File

@@ -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();
}



+ 26
- 14
src/mesh/mesh.h Vedi File

@@ -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__ */


+ 39
- 0
src/mesh/primitive.cpp Vedi File

@@ -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 */


+ 42
- 0
src/mesh/primitive.h Vedi File

@@ -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__ */


+ 44
- 5
src/scene.cpp Vedi File

@@ -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();


+ 4
- 0
src/scene.h Vedi File

@@ -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);


Caricamento…
Annulla
Salva