X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fdatatype.h;h=7188cb5a9c847b37a8f455d682ad660189e131f5;hb=729a477b47e97aea41f3f0b5db551f02bf70d1ee;hp=ccd288c9ebc75f2f13c3fc8b8098e5968d9805f6;hpb=6f39983060a27634c012f66c82fea0d09fea9774;p=libs%2Fgl.git diff --git a/source/core/datatype.h b/source/core/datatype.h index ccd288c9..7188cb5a 100644 --- a/source/core/datatype.h +++ b/source/core/datatype.h @@ -1,6 +1,8 @@ #ifndef MSP_GL_DATATYPE_H_ #define MSP_GL_DATATYPE_H_ +#include +#include #include "gl.h" namespace Msp { @@ -91,10 +93,46 @@ enum DataType }; inline unsigned 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; } +inline DataType get_matrix_column_type(DataType t) +{ + unsigned cols = ((t&0xC000)>>14)+1; + return static_cast((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((t&~0xC0FF) | (get_type_size(t)/elems)); +} + +template struct TypeTraits; +template<> struct TypeTraits { static const DataType type = BOOL; }; +template<> struct TypeTraits { static const DataType type = BYTE; }; +template<> struct TypeTraits { static const DataType type = UNSIGNED_BYTE; }; +template<> struct TypeTraits { static const DataType type = SHORT; }; +template<> struct TypeTraits { static const DataType type = UNSIGNED_SHORT; }; +template<> struct TypeTraits { static const DataType type = INT; }; +template<> struct TypeTraits { static const DataType type = UNSIGNED_INT; }; +template<> struct TypeTraits { static const DataType type = FLOAT; }; +template<> struct TypeTraits { static const DataType type = DOUBLE; }; + +template +struct TypeTraits> +{ + static const DataType type = static_cast((TypeTraits::type&0xF00) | ((TypeTraits::type&0xFF)*N) | ((N-1)<<12)); +}; + +template +struct TypeTraits> +{ + static const DataType type = static_cast((TypeTraits::type&0xF00) | ((TypeTraits::type&0xFF)*N*M) | ((N-1)<<12) | ((M-1)<<14)); +}; + GLenum get_gl_type(DataType); DataType from_gl_type(GLenum);