Number5
Visualisierung 2 Project - Florian Schober (0828151, f.schober@live.com), Andreas Walch (0926780, walch.andreas89@gmail.com)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SimpleMesh.cpp
Go to the documentation of this file.
1 #include "Application.hpp"
2 #include "meshes/cube.hpp"
3 #include "meshes/plane.hpp"
4 
5 
7  : ISceneObject(app, pickable)
8  , m_mesh(mesh)
9 {
10 }
12 {
14 }
15 
16 
18 {
19  shader->uniform("model", m_transformation.getMatrix());
20  shader->uniform("id", m_pickable ? m_id : (id_t) 0);
21 
22  for (auto& kvp : m_uniforms)
23  kvp.second(shader);
24 
26  {
27  shader->uniform("color", glm::mix(vec3(1,0,0), vec3(1,1,0), (float)(0.5 + 0.5*sin(args.time*5))));
28  }
29 }
30 bool SimpleMeshInstance::update(double time, double timeDelta)
31 {
33 }
34 
35 
36 
38 {
39  glGenBuffers(1, &m_positionsBuffer);
40  glBindBuffer(GL_ARRAY_BUFFER, m_positionsBuffer);
41  glBufferData(GL_ARRAY_BUFFER, m_positions.size() * sizeof(vec3), m_positions.data(), GL_STATIC_DRAW);
42  glBindBuffer(GL_ARRAY_BUFFER, 0);
43 
44  glGenBuffers(1, &m_normalsBuffer);
45  glBindBuffer(GL_ARRAY_BUFFER, m_normalsBuffer);
46  glBufferData(GL_ARRAY_BUFFER, m_normals.size() * sizeof(vec3), m_normals.data(), GL_STATIC_DRAW);
47  glBindBuffer(GL_ARRAY_BUFFER, 0);
48 
49  glGenBuffers(1, &m_uvBuffer);
50  glBindBuffer(GL_ARRAY_BUFFER, m_uvBuffer);
51  glBufferData(GL_ARRAY_BUFFER, m_uvs.size() * sizeof(vec2), m_uvs.data(), GL_STATIC_DRAW);
52  glBindBuffer(GL_ARRAY_BUFFER, 0);
53 
54  glGenBuffers(1, &m_indicesBuffer);
55  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indicesBuffer);
56  glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size() * sizeof(uint), m_indices.data(), GL_STATIC_DRAW);
57  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
58 
59 
60  glGenVertexArrays(1, &m_vao);
61  glBindVertexArray(m_vao);
62 
63  glBindBuffer(GL_ARRAY_BUFFER, m_positionsBuffer);
64  GLint positionIndex = Shader::position;
65  glEnableVertexAttribArray(positionIndex);
66  glVertexAttribPointer(positionIndex, 3, GL_FLOAT, GL_FALSE, 0, 0);
67 
68  glBindBuffer(GL_ARRAY_BUFFER, m_normalsBuffer);
69  GLint normalIndex = Shader::normal;
70  glEnableVertexAttribArray(normalIndex);
71  glVertexAttribPointer(normalIndex, 3, GL_FLOAT, GL_FALSE, 0, 0);
72 
73  glBindBuffer(GL_ARRAY_BUFFER, m_uvBuffer);
74  GLint uvIndex = Shader::uv;
75  glEnableVertexAttribArray(uvIndex);
76  glVertexAttribPointer(uvIndex, 2, GL_FLOAT, GL_FALSE, 0, 0);
77 
78  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indicesBuffer);
79 
80  glBindVertexArray(0);
81  glBindBuffer(GL_ARRAY_BUFFER, 0);
82  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
83 }
85 {
86  glDeleteBuffers(1, &m_positionsBuffer);
87  glDeleteBuffers(1, &m_indicesBuffer);
88  glDeleteBuffers(1, &m_normalsBuffer);
89  glDeleteBuffers(1, &m_uvBuffer);
90  glDeleteVertexArrays(1, &m_vao);
91 }
93 {
94  glBindVertexArray(m_vao);
95  {
96  for(auto& instance : m_instances)
97  {
98  instance->prepareDraw(args, shader);
99 
100  glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, 0);
101  }
102  }
103  glBindVertexArray(0);
104 }
106 {
107  SimpleMeshInstance* instance = new SimpleMeshInstance(m_app, this, pickable);
108  m_instances.insert(instance);
109 
110  m_app->getSceneGraph().add(instance);
111 
112  return instance;
113 }
115 {
116  m_instances.erase(m_instances.find(obj));
117 }
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 void copy_to_mesh(vector<vec3>* _positions, vector<vec3>* _normals, vector<vec2>* _uvs, vector<uint>* _idx,
132  float const *positions, float const * normals, float const *uvs, uint const *indices, size_t vertexCount, size_t indexCount)
133 {
134  _positions->resize(vertexCount);
135  memcpy(_positions->data(), positions, vertexCount * sizeof(vec3));
136 
137  _normals->resize(vertexCount);
138  memcpy(_normals->data(), normals, vertexCount * sizeof(vec3));
139 
140  _uvs->resize(vertexCount);
141  memcpy(_uvs->data(), uvs, vertexCount * sizeof(vec2));
142 
143  _idx->resize(indexCount);
144  memcpy(_idx->data(), indices, indexCount * sizeof(uint));
145 }
146 function<void(vector<vec3>*, vector<vec3>*, vector<vec2>*, vector<uint>*)> create_mesh(float const *positions, float const * normals, float const *uvs, uint const *indices, size_t vertexCount, size_t indexCount)
147 {
148  return [positions, normals, uvs, indices, vertexCount, indexCount]
149  (vector<vec3>* _positions, vector<vec3>* _normals, vector<vec2>* _uvs, vector<uint>* _idx)
150  {
151  copy_to_mesh(_positions, _normals, _uvs, _idx, positions, normals, uvs, indices, vertexCount, indexCount);
152  };
153 }
154 
155 
156 
158  : m_app(app)
159  , m_shader(m_app->getShaders().get("mesh"))
160 {
162  cube_normals,
163  cube_uvs,
164  cube_indices,
165  ARRAYSIZE(cube_positions)/3,
166  ARRAYSIZE(cube_indices)));
167 
169  plane_normals,
170  plane_uvs,
172  ARRAYSIZE(plane_positions)/3,
173  ARRAYSIZE(plane_indices)));
174 }
175 
176 SimpleMesh* SimpleMeshes::get(string const & name)
177 {
178  auto found = m_meshes.find(name);
179 
180  if (found == m_meshes.end())
181  return nullptr;
182 
183  return found->second.get();
184 }
185 
187 {
188  m_shader->use();
189 
190  m_shader->uniform("proj", *args.projectionMatrix);
191  m_shader->uniform("view", *args.viewMatrix);
192 
193  for(auto& mesh : m_meshes)
194  mesh.second->drawAllInstances(args, m_shader);
195 }
void use()
Definition: Shader.cpp:111
Transformation m_transformation
Definition: SimpleMesh.hpp:14
void copy_to_mesh(vector< vec3 > *_positions, vector< vec3 > *_normals, vector< vec2 > *_uvs, vector< uint > *_idx, float const *positions, float const *normals, float const *uvs, uint const *indices, size_t vertexCount, size_t indexCount)
Definition: SimpleMesh.cpp:131
double time
Definition: SceneFBO.hpp:10
uint16 id_t
The data-type used for the id-buffer.
Definition: Util.hpp:6
vector< vec3 > m_positions
Definition: SimpleMesh.hpp:80
SimpleMeshes(Application *app)
Definition: SimpleMesh.cpp:157
const float plane_positions[]
Definition: plane.hpp:3
GLuint m_positionsBuffer
Definition: SimpleMesh.hpp:85
bool const needsRecalc()
t_obj & add(t_obj *object)
Definition: SceneGraph.hpp:42
id_t getFocusId() const
Definition: Picker.hpp:39
mat4 const & getMatrix()
GLuint m_uvBuffer
Definition: SimpleMesh.hpp:86
void create()
Definition: SimpleMesh.cpp:37
SimpleMesh * m_mesh
Definition: SimpleMesh.hpp:13
Definition: Shader.hpp:8
SimpleMeshInstance * createInstance(bool pickable=true)
Definition: SimpleMesh.cpp:105
set< SimpleMeshInstance * > m_instances
Definition: SimpleMesh.hpp:91
mat4 const * viewMatrix
Definition: SceneFBO.hpp:13
static const uint position
Definition: Shader.hpp:122
static const uint uv
Definition: Shader.hpp:124
void prepareDraw(DrawArgs &args, Shader *shader)
Definition: SimpleMesh.cpp:17
Shader * m_shader
Definition: SimpleMesh.hpp:153
GLuint m_indicesBuffer
Definition: SimpleMesh.hpp:88
Application * m_app
map< string, function< void(Shader *)> > m_uniforms
Definition: SimpleMesh.hpp:15
function< void(vector< vec3 > *, vector< vec3 > *, vector< vec2 > *, vector< uint > *)> create_mesh(float const *positions, float const *normals, float const *uvs, uint const *indices, size_t vertexCount, size_t indexCount)
Definition: SimpleMesh.cpp:146
SimpleMesh * get(string const &name)
Definition: SimpleMesh.cpp:176
SceneGraph & getSceneGraph()
Definition: Application.hpp:56
vector< vec3 > m_normals
Definition: SimpleMesh.hpp:82
vector< uint > m_indices
Definition: SimpleMesh.hpp:83
const float cube_positions[]
Definition: cube.hpp:3
mat4 const * projectionMatrix
Definition: SceneFBO.hpp:12
const float plane_uvs[]
Definition: plane.hpp:24
const float cube_normals[]
Definition: cube.hpp:62
GLuint m_normalsBuffer
Definition: SimpleMesh.hpp:87
void drawAllInstances(DrawArgs &args, Shader *shader)
Definition: SimpleMesh.cpp:92
const float cube_uvs[]
Definition: cube.hpp:94
vector< vec2 > m_uvs
Definition: SimpleMesh.hpp:81
Picker & getPicker()
Definition: Application.hpp:91
const unsigned int cube_indices[]
Definition: cube.hpp:42
bool hasFocusId() const
Definition: Picker.hpp:49
const unsigned int plane_indices[]
Definition: plane.hpp:11
mesh_map m_meshes
Definition: SimpleMesh.hpp:151
static const uint normal
Definition: Shader.hpp:123
SimpleMesh * create(string const &name, t_fnc fnc)
Definition: SimpleMesh.hpp:169
void unregisterInstance(SimpleMeshInstance *obj)
Definition: SimpleMesh.cpp:114
void drawAll(DrawArgs &args)
Definition: SimpleMesh.cpp:186
virtual ~SimpleMeshInstance()
Definition: SimpleMesh.cpp:11
const float plane_normals[]
Definition: plane.hpp:16
virtual bool update(double time, double timeDelta)
Definition: SimpleMesh.cpp:30
GLint uniform(string const &name)
Definition: Shader.cpp:115
GLuint m_vao
Definition: SimpleMesh.hpp:89
Application * m_app
Definition: SimpleMesh.hpp:76
SimpleMeshInstance(Application *app, SimpleMesh *mesh, bool pickable=true)
Definition: SimpleMesh.cpp:6