]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/datatype.h
Use size_t to store sizes of buffers and such
[libs/gl.git] / source / core / datatype.h
index 92529a18fc256535eb92e85bd0ae93252c1c11a9..a03b6bda99162f3dd6a59a8facd52c0886b59775 100644 (file)
@@ -1,7 +1,8 @@
 #ifndef MSP_GL_DATATYPE_H_
 #define MSP_GL_DATATYPE_H_
 
-#include "gl.h"
+#include <msp/linal/matrix.h>
+#include <msp/linal/vector.h>
 
 namespace Msp {
 namespace GL {
@@ -90,12 +91,52 @@ enum DataType
        SAMPLER_CUBE_ARRAY_SHADOW = 0x3C0304
 };
 
-inline unsigned get_type_size(DataType t)
-{ return t&0xFF; }
+inline std::size_t get_type_size(DataType t) { return t&0xFF; }
+inline bool is_float(DataType t) { return t&0x200; }
+inline bool is_matrix(DataType t) { return t&0xC000; }
+inline bool is_vector(DataType t) { return !is_matrix(t) && (t&0x3000); }
+inline bool is_image(DataType t) { return t&0x70000; }
 
-GLenum get_gl_type(DataType);
+inline DataType get_matrix_column_type(DataType t)
+{
+       unsigned cols = ((t&0xC000)>>14)+1;
+       return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/cols));
+}
+
+inline DataType get_element_type(DataType t)
+{
+       unsigned elems = (((t&0xC000)>>14)+1)*(((t&0x3000)>>12)+1);
+       return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/elems));
+}
+
+template<typename T> struct TypeTraits;
+template<> struct TypeTraits<bool> { static const DataType type = BOOL; };
+template<> struct TypeTraits<char> { static const DataType type = BYTE; };
+template<> struct TypeTraits<unsigned char> { static const DataType type = UNSIGNED_BYTE; };
+template<> struct TypeTraits<short> { static const DataType type = SHORT; };
+template<> struct TypeTraits<unsigned short> { static const DataType type = UNSIGNED_SHORT; };
+template<> struct TypeTraits<int> { static const DataType type = INT; };
+template<> struct TypeTraits<unsigned> { static const DataType type = UNSIGNED_INT; };
+template<> struct TypeTraits<float> { static const DataType type = FLOAT; };
+template<> struct TypeTraits<double> { static const DataType type = DOUBLE; };
+
+template<typename T, unsigned N>
+struct TypeTraits<LinAl::Vector<T, N>>
+{
+       static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N) | ((N-1)<<12));
+};
+
+template<typename T, unsigned N, unsigned M>
+struct TypeTraits<LinAl::Matrix<T, N, M>>
+{
+       static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N*M) | ((N-1)<<12) | ((M-1)<<14));
+};
+
+void require_type(DataType);
 
 } // namespace GL
 } // namespace Msp
 
+#include "datatype_backend.h"
+
 #endif