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
Scene.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "TaskManager.hpp"
4 
5 class SceneObject;
6 class Scene;
7 
12 {
17  {
18  int animation;
19  float time;
26  AnimationStart(int _animation, float _time)
27  : animation(_animation)
28  , time(_time)
29  { }
30  };
31 
34  vector<mat4> m_state;
36  queue<AnimationStart> m_animationQueue;
38  friend class Scene;
39 
40  public:
46 
47  public:
54  SceneInstance(Application* app, Scene* parent, bool pickable = true);
58  virtual ~SceneInstance();
59 
66  virtual bool update(double time, double timeDelta);
67 
73  void queueAnimation(float time, uint animation);
79  void queueAnimation(float time, string animation);
80 };
81 
86 class Scene
87 {
91  class Material
92  {
96  struct data
97  {
98  vec4 ambient;
99  vec4 diffuse;
100  vec4 specular;
101  float shininess;
102  };
103 
104  GLuint m_ubuffer;
107  public:
116  Material(vec4 const & ambient, vec4 const & diffuse, vec4 const & specular, float const shininess, Texture* texture);
120  ~Material();
121 
127  void bindTo(Shader * shader, string const uniform);
128  };
129 
134  class Mesh
135  {
137  string m_name;
139  vector<int> m_nodeIndices;
141  GLuint m_baseIndex;
142  GLuint m_indexCount;
146  friend class Scene;
147 
148  public:
158  Mesh(Scene* scene, string const & name, GLuint const baseIdx, GLuint const idxCount, Material* material);
159 
165  void drawInstances(Shader* shader, set<SceneInstance*> const & instances);
166  };
167 
173  {
174  public:
178  template<typename T>
179  struct Frame
180  {
181  float time;
182  T value;
183  };
184 
185  private:
186  vector<Frame<vec3>> m_positions;
187  vector<Frame<vec3>> m_scalings;
188  vector<Frame<quat>> m_rotations;
190  friend class Scene;
191 
192  public:
199  bool transformationByTime(float const time, OUT mat4& result);
200 
201  private:
208  template<typename T>
209  T interpolate(vector<Frame<T>> const & frames, float const time)
210  {
211  if (frames.size() == 1)
212  return frames.front().value;
213 
214  Frame<T> const * prev;
215  Frame<T> const * next;
216 
217  nearestFrames(frames, time, OUT prev, OUT next);
218 
219  float t = 0;
220 
221  if (next->time != prev->time)
222  t = (time - prev->time) / (next->time - prev->time);
223 
224  return glm::mix(prev->value, next->value, glm::clamp(t,0.0f,1.0f));
225  }
226 
234  template<typename T>
235  void nearestFrames(vector<Frame<T>> const & frames, float const time, OUT Frame<T> const * & prev, OUT Frame<T> const * & next)
236  {
237  auto it = frames.rbegin();
238 
239  while (it != frames.rend())
240  {
241  if (it->time < time) break;
242  it++;
243  }
244 
245  if (it == frames.rend())
246  {
247  next = &(frames.front());
248  prev = &(frames.front());
249  return;
250  }
251 
252  prev = &(*it);
253  it--;
254 
255  if (it == frames.rbegin())
256  {
257  next = &(frames.back());
258  return;
259  }
260 
261  next = &(*it);
262  }
263  };
264 
268  class Node
269  {
271  vector<unique_ptr<Node>> m_children;
272  vector<Mesh*> m_meshes;
273  mat4 m_local;
274  int m_idx;
275  bool m_isBone;
276  map<uint, NodeAnimation> m_animations;
278  friend class Scene;
279 
280  public:
286  Node(Scene* scene, mat4 const & local);
287 
294  mat4 transformationByTime(uint const animation, float const time);
295 
302  void updateInstance(SceneInstance& instance, float time, mat4 const & parentTransformation);
303  };
304 
306  string m_name;
307  vector<unique_ptr<Material>> m_materials;
308  vector<unique_ptr<Mesh>> m_meshes;
309  unique_ptr<Node> m_root;
310  set<SceneInstance*> m_instances;
312  map<string,int> m_animationsByName;
313  vector<float> m_animationsDuration;
314  size_t m_boneCount;
316  vector<mat4> m_boneOffsets;
323  GLuint m_uvBuffer;
325  GLuint m_boneIdBuffer;
328  GLuint m_vao;
329  GLuint m_stateTBO;
330  GLuint m_stateBuffer;
331  GLuint m_idTBO;
332  GLuint m_idBuffer;
334  friend class SceneInstance;
335 
336  public:
343  Scene(Application* app, string const & name);
347  ~Scene();
348 
354  void updateInstance(SceneInstance* instance, float const time);
360  void updateAllInstances(float const time);
366  void drawAllInstances(DrawArgs& args, Shader* shader);
372  void updateNdraw(DrawArgs& args, Shader* shader);
373 
379  SceneInstance* createInstance(bool pickable = true);
386 };
387 
392 class Scenes
393 {
394  typedef map<string,unique_ptr<Scene>> mesh_map;
395 
400  public:
405  Scenes(Application* app);
406 
413  Scene* get(string const & name);
414 
419  void drawAll(DrawArgs& args);
420 };
GLuint m_vao
Definition: Scene.hpp:328
SceneInstance * createInstance(bool pickable=true)
Definition: Scene.cpp:666
unique_ptr< Node > m_root
Definition: Scene.hpp:309
map< string, unique_ptr< Scene > > mesh_map
Definition: Scene.hpp:394
vector< Frame< quat > > m_rotations
Definition: Scene.hpp:188
void nearestFrames(vector< Frame< T >> const &frames, float const time, OUT Frame< T > const *&prev, OUT Frame< T > const *&next)
Definition: Scene.hpp:235
vector< unique_ptr< Material > > m_materials
Definition: Scene.hpp:307
void unregisterInstance(SceneInstance *obj)
Definition: Scene.cpp:677
Application * m_app
Definition: Scene.hpp:311
vector< unique_ptr< Node > > m_children
Definition: Scene.hpp:271
size_t m_instancesInBuffer
Definition: Scene.hpp:319
GLuint m_ubuffer
Definition: Scene.hpp:104
void bindTo(Shader *shader, string const uniform)
Definition: Scene.cpp:710
GLuint m_idTBO
Definition: Scene.hpp:331
void drawAll(DrawArgs &args)
Definition: Scene.cpp:842
AnimationStart(int _animation, float _time)
Definition: Scene.hpp:26
Transformation m_transformation
Definition: Scene.hpp:33
string m_name
Definition: Scene.hpp:137
mesh_map m_scenes
Definition: Scene.hpp:396
Definition: Shader.hpp:8
void updateAllInstances(float const time)
Definition: Scene.cpp:557
map< uint, NodeAnimation > m_animations
Definition: Scene.hpp:276
Scene(Application *app, string const &name)
Definition: Scene.cpp:45
Scene * m_scene
Definition: Scene.hpp:136
GLuint m_boneIdBuffer
Definition: Scene.hpp:325
vector< float > m_animationsDuration
Definition: Scene.hpp:313
void updateInstance(SceneInstance *instance, float const time)
Definition: Scene.cpp:577
Scene * m_scene
Definition: Scene.hpp:32
size_t m_boneCount
Definition: Scene.hpp:314
Material(vec4 const &ambient, vec4 const &diffuse, vec4 const &specular, float const shininess, Texture *texture)
Definition: Scene.cpp:689
GLuint m_indexCount
Definition: Scene.hpp:142
bool transformationByTime(float const time, OUT mat4 &result)
Definition: Scene.cpp:752
vector< Frame< vec3 > > m_scalings
Definition: Scene.hpp:187
Application * m_app
Definition: Scene.hpp:397
Transformation & getTransform()
Definition: Scene.hpp:45
GLuint m_indicesBuffer
Definition: Scene.hpp:327
GLuint m_stateTBO
Definition: Scene.hpp:329
SceneInstance(Application *app, Scene *parent, bool pickable=true)
Definition: Scene.cpp:3
Scenes(Application *app)
Definition: Scene.cpp:814
bool m_needToUpdateIdBuffer
Definition: Scene.hpp:320
T interpolate(vector< Frame< T >> const &frames, float const time)
Definition: Scene.hpp:209
Node(Scene *scene, mat4 const &local)
Definition: Scene.cpp:769
vector< unique_ptr< Mesh > > m_meshes
Definition: Scene.hpp:308
Material * m_material
Definition: Scene.hpp:144
void updateNdraw(DrawArgs &args, Shader *shader)
Definition: Scene.cpp:660
mat4 transformationByTime(uint const animation, float const time)
Definition: Scene.cpp:792
Scene * m_scene
Definition: Scene.hpp:270
void queueAnimation(float time, uint animation)
Definition: Scene.cpp:32
GLuint m_uvBuffer
Definition: Scene.hpp:323
mat4 m_inverseRootTransform
Definition: Scene.hpp:317
vector< mat4 > m_boneOffsets
Definition: Scene.hpp:316
~Scene()
Definition: Scene.cpp:544
vector< int > m_nodeIndices
Definition: Scene.hpp:139
Shader * m_shader
Definition: Scene.hpp:398
virtual bool update(double time, double timeDelta)
Definition: Scene.cpp:14
void updateInstance(SceneInstance &instance, float time, mat4 const &parentTransformation)
Definition: Scene.cpp:775
virtual ~SceneInstance()
Definition: Scene.cpp:10
Mesh(Scene *scene, string const &name, GLuint const baseIdx, GLuint const idxCount, Material *material)
Definition: Scene.cpp:727
GLuint m_idBuffer
Definition: Scene.hpp:332
vector< Mesh * > m_meshes
Definition: Scene.hpp:272
set< SceneInstance * > m_instances
Definition: Scene.hpp:310
int m_idx
Definition: Scene.hpp:274
GLuint m_positionsBuffer
Definition: Scene.hpp:322
Definition: Scene.hpp:86
queue< AnimationStart > m_animationQueue
Definition: Scene.hpp:36
GLuint m_normalsBuffer
Definition: Scene.hpp:324
string m_name
Definition: Scene.hpp:306
GLuint m_baseIndex
Definition: Scene.hpp:141
vector< Frame< vec3 > > m_positions
Definition: Scene.hpp:186
void drawInstances(Shader *shader, set< SceneInstance * > const &instances)
Definition: Scene.cpp:734
Texture * m_texture
Definition: Scene.hpp:105
size_t m_drawNodeCount
Definition: Scene.hpp:315
GLuint m_boneWeightBuffer
Definition: Scene.hpp:326
vector< mat4 > m_state
Definition: Scene.hpp:34
bool m_isBone
Definition: Scene.hpp:275
auto_reset_event m_parallelEvent
Definition: Scene.hpp:305
map< string, int > m_animationsByName
Definition: Scene.hpp:312
AnimationStart m_animation
Definition: Scene.hpp:35
mat4 m_local
Definition: Scene.hpp:273
GLuint m_stateBuffer
Definition: Scene.hpp:330
void drawAllInstances(DrawArgs &args, Shader *shader)
Definition: Scene.cpp:585