Simulant  21.12-1292
A portable game engine for Windows, OSX, Linux, Dreamcast, and PSP
uniform_manager.h
1 #pragma once
2 
3 #include <functional>
4 #include <unordered_map>
5 #include <string>
6 #include <stdexcept>
7 #include <cstdint>
8 
9 namespace smlt {
10 
11 /*
12  Automatic uniforms that are set by the renderer
13 */
14 enum ShaderAvailableAuto {
15  SP_AUTO_MODELVIEW_PROJECTION_MATRIX,
16  SP_AUTO_VIEW_MATRIX,
17  SP_AUTO_MODELVIEW_MATRIX,
18  SP_AUTO_PROJECTION_MATRIX,
19  SP_AUTO_INVERSE_TRANSPOSE_MODELVIEW_MATRIX,
20  SP_AUTO_MATERIAL_DIFFUSE,
21  SP_AUTO_MATERIAL_SPECULAR,
22  SP_AUTO_MATERIAL_AMBIENT,
23  SP_AUTO_MATERIAL_SHININESS,
24  SP_AUTO_MATERIAL_TEX_MATRIX0,
25  SP_AUTO_MATERIAL_TEX_MATRIX1,
26  SP_AUTO_MATERIAL_TEX_MATRIX2,
27  SP_AUTO_MATERIAL_TEX_MATRIX3,
28  SP_AUTO_MATERIAL_TEX_MATRIX4,
29  SP_AUTO_MATERIAL_TEX_MATRIX5,
30  SP_AUTO_MATERIAL_TEX_MATRIX6,
31  SP_AUTO_MATERIAL_TEX_MATRIX7,
32  SP_AUTO_MATERIAL_ACTIVE_TEXTURE_UNITS,
33  SP_AUTO_MATERIAL_POINT_SIZE,
34  SP_AUTO_LIGHT_GLOBAL_AMBIENT,
35  SP_AUTO_LIGHT_POSITION,
36  SP_AUTO_LIGHT_DIRECTION,
37  SP_AUTO_LIGHT_DIFFUSE,
38  SP_AUTO_LIGHT_SPECULAR,
39  SP_AUTO_LIGHT_AMBIENT,
40  SP_AUTO_LIGHT_CONSTANT_ATTENUATION,
41  SP_AUTO_LIGHT_LINEAR_ATTENUATION,
42  SP_AUTO_LIGHT_QUADRATIC_ATTENUATION,
43 
44  /* Arrays */
45  SP_AUTO_LIGHTS_GLOBAL_AMBIENT,
46  SP_AUTO_LIGHTS_POSITION,
47  SP_AUTO_LIGHTS_DIRECTION,
48  SP_AUTO_LIGHTS_DIFFUSE,
49  SP_AUTO_LIGHTS_SPECULAR,
50  SP_AUTO_LIGHTS_AMBIENT,
51  SP_AUTO_LIGHTS_CONSTANT_ATTENUATION,
52  SP_AUTO_LIGHTS_LINEAR_ATTENUATION,
53  SP_AUTO_LIGHTS_QUADRATIC_ATTENUATION,
54  SP_AUTO_LIGHT_COUNT
55  //TODO: cameras(?)
56 };
57 
58 }
59 
60 namespace std {
61  using smlt::ShaderAvailableAuto;
62 
63  template<>
64  struct hash<ShaderAvailableAuto> {
65  size_t operator()(const ShaderAvailableAuto& a) const {
66  hash<int32_t> make_hash;
67  return make_hash(int32_t(a));
68  }
69  };
70 }
71 
72 namespace smlt {
73 
75 public:
76  bool uses_auto(ShaderAvailableAuto uniform) const {
77  return auto_uniforms_.find(uniform) != auto_uniforms_.end();
78  }
79 
80  std::string auto_variable_name(ShaderAvailableAuto auto_name) const {
81  auto it = auto_uniforms_.find(auto_name);
82  if(it == auto_uniforms_.end()) {
83  throw std::logic_error("Specified auto is not registered");
84  }
85 
86  return (*it).second;
87  }
88 
89  void register_auto(ShaderAvailableAuto uniform, const std::string& var_name);
90  const std::unordered_map<ShaderAvailableAuto, std::string>& auto_uniforms() const {
91  return auto_uniforms_;
92  }
93 
94 private:
95  std::unordered_map<ShaderAvailableAuto, std::string> auto_uniforms_;
96 };
97 
98 
99 }
100 
101 
smlt
Definition: animation.cpp:25
std
Extensions to the C++ standard library.
Definition: variant.hpp:2752
smlt::UniformManager
Definition: uniform_manager.h:74