gdk-graphics  1b6d84e044c2c953fd7c9501e628a67e80f4da0d
webgl1es2_scene.h
1 // © 2019 Joseph Cameron - All Rights Reserved
2 
3 #ifndef GDK_GFX_WEBGL1ES2_SCENE
4 #define GDK_GFX_WEBGL1ES2_SCENE
5 
6 #include <gdk/scene.h>
7 #include <gdk/webgl1es2_screen_camera.h>
8 #include <gdk/webgl1es2_texture_camera.h>
9 #include <gdk/webgl1es2_material.h>
10 #include <gdk/webgl1es2_model.h>
11 
12 #include <unordered_set>
13 
14 // TODO handle entity material & model changes. -> Will need to implement signals... vec<functor> likely. Maybe. This adds bookkeeping complexity, runtime complexity. it may be preferrable for the user to "change" an entities properties by removing the one you no longer want and inserting a new one with new properties.
15 namespace gdk
16 {
18  class render_set
19  {
20  public:
21  using entity_ptr_type = std::shared_ptr<const entity>;
22  using material_ptr_type = std::shared_ptr<webgl1es2_material>;
23  using model_ptr_type = std::shared_ptr<webgl1es2_model>;
24  using model_to_entity_collection = std::unordered_map<model_ptr_type,
25  std::unordered_set<entity_ptr_type>>;
26  using material_to_model_to_entity_collection_collection =
27  std::unordered_map<material_ptr_type, model_to_entity_collection>;
28 
29  virtual void draw(const webgl1es2_camera *r) const;
30 
31  virtual void try_add(entity_ptr_type);
32 
33  virtual ~render_set() = default;
34 
35  protected:
36  material_to_model_to_entity_collection_collection m_MaterialToModelToEntityCollection;
37 
38  std::unordered_set<entity_ptr_type> m_unique_entities;
39  };
40 
41  class sorted_render_set final : public render_set
42  {
43  public:
44  virtual void draw(const webgl1es2_camera *r) const;
45 
46  virtual void try_add(entity_ptr_type) override;
47 
48  sorted_render_set() = default;
49 
50  private:
51 
52  };
53 
55  class webgl1es2_scene final : public scene
56  {
57  public:
59  using material_ptr_type = std::shared_ptr<webgl1es2_material>;
61  using model_ptr_type = std::shared_ptr<webgl1es2_model>;
62 
65  using model_to_entity_collection = std::unordered_map<model_ptr_type,
66  std::unordered_set<std::shared_ptr<const entity>>>;
70  std::unordered_map<material_ptr_type, model_to_entity_collection>;
71 
74  //
75  virtual void add(const std::shared_ptr<const screen_camera> &pCamera) override;
76  virtual void add(const std::shared_ptr<const texture_camera> &pCamera) override;
77  virtual void add(const std::shared_ptr<const entity> &pEntity) override;
78 
79  virtual void remove(const std::shared_ptr<const screen_camera> &pCamera) override;
80  virtual void remove(const std::shared_ptr<const texture_camera> &pCamera) override;
81  virtual void remove(const std::shared_ptr<const entity> &pEntity) override;
82 
83  virtual void draw(const gdk::graphics_intvector2_type &aFrameBufferSize) const override;
85 
86  private:
88  std::unordered_set<std::shared_ptr<const webgl1es2_screen_camera>> m_screen_cameras;
89 
91  std::unordered_set<std::shared_ptr<const webgl1es2_texture_camera>> m_texture_cameras;
92 
94  material_to_model_to_entity_collection_collection m_MaterialToModelToEntityCollection;
95 
96  render_set m_opaque_set;
97 
98  sorted_render_set m_translucent_set;
99  };
100 }
101 
102 #endif
Definition: camera.h:9
set of objects to render
Definition: webgl1es2_scene.h:18
Definition: webgl1es2_scene.h:41
std::shared_ptr< webgl1es2_model > model_ptr_type
models can be shared across webgl1es2_scenes
Definition: webgl1es2_scene.h:61
render scene.
Definition: webgl1es2_scene.h:55
std::shared_ptr< webgl1es2_material > material_ptr_type
materials can be shared across webgl1es2_scenes
Definition: webgl1es2_scene.h:59
a 3d environment within which cameras draw entities
Definition: scene.h:18
std::unordered_map< material_ptr_type, model_to_entity_collection > material_to_model_to_entity_collection_collection
Definition: webgl1es2_scene.h:70
webgl1es2_camera implementation of camera
Definition: webgl1es2_camera.h:21
std::unordered_map< model_ptr_type, std::unordered_set< std::shared_ptr< const entity > >> model_to_entity_collection
Definition: webgl1es2_scene.h:66