summaryrefslogtreecommitdiff
path: root/src/mbgl/gfx/uniform.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/gfx/uniform.hpp')
-rw-r--r--src/mbgl/gfx/uniform.hpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/mbgl/gfx/uniform.hpp b/src/mbgl/gfx/uniform.hpp
new file mode 100644
index 0000000000..bc6e7c1866
--- /dev/null
+++ b/src/mbgl/gfx/uniform.hpp
@@ -0,0 +1,51 @@
+#pragma once
+
+#include <mbgl/util/type_list.hpp>
+#include <mbgl/util/indexed_tuple.hpp>
+
+#include <array>
+
+#define MBGL_DEFINE_UNIFORM_SCALAR(type_, name_) \
+ struct name_ { \
+ using Value = type_; \
+ static constexpr auto name() { \
+ return #name_; \
+ } \
+ }
+
+#define MBGL_DEFINE_UNIFORM_VECTOR(type_, n_, name_) \
+ struct name_ { \
+ using Value = std::array<type_, n_>; \
+ static constexpr auto name() { \
+ return #name_; \
+ } \
+ }
+
+#define MBGL_DEFINE_UNIFORM_MATRIX(type_, n_, name_) \
+ struct name_ { \
+ using Value = std::array<type_, n_ * n_>; \
+ static constexpr auto name() { \
+ return #name_; \
+ } \
+ }
+
+namespace mbgl {
+namespace gfx {
+namespace detail {
+
+template <class>
+class UniformValues;
+
+template <class... Us>
+class UniformValues<TypeList<Us...>> {
+public:
+ using Type = IndexedTuple<TypeList<Us...>, TypeList<typename Us::Value...>>;
+};
+
+} // namespace detail
+
+template <class UniformTypeList>
+using UniformValues = typename detail::UniformValues<UniformTypeList>::Type;
+
+} // namespace gfx
+} // namespace mbgl