#include "GraphicsTags.hpp" #include #include #include using namespace std::literals; int Tags::SizeOf(VertexElementType type) { switch (type) { case VET_Float1: return sizeof(float); case VET_Float2: return sizeof(float) * 2; case VET_Float3: return sizeof(float) * 3; case VET_Float4: return sizeof(float) * 4; case VET_Double1: return sizeof(double); case VET_Double2: return sizeof(double) * 2; case VET_Double3: return sizeof(double) * 3; case VET_Double4: return sizeof(double) * 4; case VET_Short2: case VET_Short2Norm: case VET_Ushort2: case VET_Ushort2Norm: return sizeof(short) * 2; case VET_Short4: case VET_Short4Norm: case VET_Ushort4: case VET_Ushort4Norm: return sizeof(short) * 4; case VET_Int1: case VET_Uint1: return sizeof(int); case VET_Int2: case VET_Uint2: return sizeof(int) * 2; case VET_Int3: case VET_Uint3: return sizeof(int) * 3; case VET_Int4: case VET_Uint4: return sizeof(int) * 4; case VET_Byte4: case VET_Byte4Norm: case VET_Ubyte4: case VET_Ubyte4Norm: return sizeof(char) * 4; } return 0; } int Tags::VectorLenOf(VertexElementType type) { switch (type) { case VET_Float1: case VET_Double1: case VET_Int1: case VET_Uint1: return 1; case VET_Float2: case VET_Double2: case VET_Short2: case VET_Short2Norm: case VET_Ushort2: case VET_Ushort2Norm: case VET_Int2: case VET_Uint2: return 2; case VET_Float3: case VET_Double3: case VET_Int3: case VET_Uint3: return 3; case VET_Float4: case VET_Double4: case VET_Short4: case VET_Short4Norm: case VET_Ushort4: case VET_Ushort4Norm: case VET_Int4: case VET_Uint4: case VET_Byte4: case VET_Byte4Norm: case VET_Ubyte4: case VET_Ubyte4Norm: return 4; } return 0; } GLenum Tags::FindGLType(VertexElementType type) { switch (type) { case VET_Float1: case VET_Float2: case VET_Float3: case VET_Float4: return GL_FLOAT; case VET_Double1: case VET_Double2: case VET_Double3: case VET_Double4: return GL_DOUBLE; case VET_Short2: case VET_Short2Norm: case VET_Short4: case VET_Short4Norm: return GL_SHORT; case VET_Ushort2: case VET_Ushort2Norm: case VET_Ushort4: case VET_Ushort4Norm: return GL_UNSIGNED_SHORT; case VET_Int1: case VET_Int2: case VET_Int3: case VET_Int4: return GL_INT; case VET_Uint1: case VET_Uint2: case VET_Uint3: case VET_Uint4: return GL_UNSIGNED_INT; case VET_Byte4: case VET_Byte4Norm: return GL_BYTE; case VET_Ubyte4: case VET_Ubyte4Norm: return GL_UNSIGNED_BYTE; } return 0; } bool Tags::IsNormalized(VertexElementType type) { return type >= VET_NORM_BEGIN && type <= VET_NORM_END; } int Tags::SizeOf(IndexType type) { switch (type) { case IT_16Bit: return sizeof(uint16_t); case IT_32Bit: return sizeof(uint32_t); } return 0; } GLenum Tags::FindGLType(IndexType type) { switch (type) { case IT_16Bit: return GL_UNSIGNED_SHORT; case IT_32Bit: return GL_UNSIGNED_BYTE; } return 0; } namespace ProjectBrussel_UNITY_ID { struct GLTypeInfo { robin_hood::unordered_flat_map enum2Name; robin_hood::unordered_flat_map name2Enum; GLTypeInfo() { InsertEntry("float"sv, GL_FLOAT); InsertEntry("double"sv, GL_DOUBLE); InsertEntry("int"sv, GL_INT); InsertEntry("uint"sv, GL_UNSIGNED_INT); InsertEntry("bool"sv, GL_BOOL); InsertEntry("vec2"sv, GL_FLOAT_VEC2); InsertEntry("vec3"sv, GL_FLOAT_VEC3); InsertEntry("vec4"sv, GL_FLOAT_VEC4); InsertEntry("dvec2"sv, GL_DOUBLE_VEC2); InsertEntry("dvec3"sv, GL_DOUBLE_VEC3); InsertEntry("dvec4"sv, GL_DOUBLE_VEC4); InsertEntry("ivec2"sv, GL_INT_VEC2); InsertEntry("ivec3"sv, GL_INT_VEC3); InsertEntry("ivec4"sv, GL_INT_VEC4); InsertEntry("uvec2"sv, GL_UNSIGNED_INT_VEC2); InsertEntry("uvec3"sv, GL_UNSIGNED_INT_VEC3); InsertEntry("uvec4"sv, GL_UNSIGNED_INT_VEC4); InsertEntry("bvec2"sv, GL_BOOL_VEC2); InsertEntry("bvec3"sv, GL_BOOL_VEC3); InsertEntry("bvec4"sv, GL_BOOL_VEC4); InsertEntry("mat2"sv, GL_FLOAT_MAT2); InsertEntry("mat3"sv, GL_FLOAT_MAT3); InsertEntry("mat4"sv, GL_FLOAT_MAT4); InsertEntry("mat2x3"sv, GL_FLOAT_MAT2x3); InsertEntry("mat2x4"sv, GL_FLOAT_MAT2x4); InsertEntry("mat3x2"sv, GL_FLOAT_MAT3x2); InsertEntry("mat3x4"sv, GL_FLOAT_MAT3x4); InsertEntry("mat4x2"sv, GL_FLOAT_MAT4x2); InsertEntry("mat4x3"sv, GL_FLOAT_MAT4x3); InsertEntry("dmat2"sv, GL_DOUBLE_MAT2); InsertEntry("dmat3"sv, GL_DOUBLE_MAT3); InsertEntry("dmat4"sv, GL_DOUBLE_MAT4); InsertEntry("dmat2x3"sv, GL_DOUBLE_MAT2x3); InsertEntry("dmat2x4"sv, GL_DOUBLE_MAT2x4); InsertEntry("dmat3x2"sv, GL_DOUBLE_MAT3x2); InsertEntry("dmat3x4"sv, GL_DOUBLE_MAT3x4); InsertEntry("dmat4x2"sv, GL_DOUBLE_MAT4x2); InsertEntry("dmat4x3"sv, GL_DOUBLE_MAT4x3); InsertEntry("sampler1D"sv, GL_SAMPLER_1D); InsertEntry("sampler2D"sv, GL_SAMPLER_2D); InsertEntry("sampler3D"sv, GL_SAMPLER_3D); InsertEntry("samplerCube"sv, GL_SAMPLER_CUBE); InsertEntry("sampler1DShadow"sv, GL_SAMPLER_1D_SHADOW); InsertEntry("sampler2DShadow"sv, GL_SAMPLER_2D_SHADOW); InsertEntry("sampler1DArray"sv, GL_SAMPLER_1D_ARRAY); InsertEntry("sampler2DArray"sv, GL_SAMPLER_2D_ARRAY); InsertEntry("sampler1DArrayShadow"sv, GL_SAMPLER_1D_ARRAY_SHADOW); InsertEntry("sampler2DArrayShadow"sv, GL_SAMPLER_2D_ARRAY_SHADOW); InsertEntry("sampler2DMultisample"sv, GL_SAMPLER_2D_MULTISAMPLE); InsertEntry("sampler2DMultisampleArray"sv, GL_SAMPLER_2D_MULTISAMPLE_ARRAY); InsertEntry("samplerCubeShadow"sv, GL_SAMPLER_CUBE_SHADOW); InsertEntry("samplerBuffer"sv, GL_SAMPLER_BUFFER); InsertEntry("sampler2DRect"sv, GL_SAMPLER_2D_RECT); InsertEntry("sampler2DRectShadow"sv, GL_SAMPLER_2D_RECT_SHADOW); InsertEntry("isampler1D"sv, GL_INT_SAMPLER_1D); InsertEntry("isampler2D"sv, GL_INT_SAMPLER_2D); InsertEntry("isampler3D"sv, GL_INT_SAMPLER_3D); InsertEntry("isamplerCube"sv, GL_INT_SAMPLER_CUBE); InsertEntry("isampler1DArray"sv, GL_INT_SAMPLER_1D_ARRAY); InsertEntry("isampler2DArray"sv, GL_INT_SAMPLER_2D_ARRAY); InsertEntry("isampler2DMultisample"sv, GL_INT_SAMPLER_2D_MULTISAMPLE); InsertEntry("isampler2DMultisampleArray"sv, GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY); InsertEntry("isamplerBuffer"sv, GL_INT_SAMPLER_BUFFER); InsertEntry("isampler2DRect"sv, GL_INT_SAMPLER_2D_RECT); InsertEntry("usampler1D"sv, GL_UNSIGNED_INT_SAMPLER_1D); InsertEntry("usampler2D"sv, GL_UNSIGNED_INT_SAMPLER_2D); InsertEntry("usampler3D"sv, GL_UNSIGNED_INT_SAMPLER_3D); InsertEntry("usamplerCube"sv, GL_UNSIGNED_INT_SAMPLER_CUBE); InsertEntry("usampler1DArray"sv, GL_UNSIGNED_INT_SAMPLER_1D_ARRAY); InsertEntry("usampler2DArray"sv, GL_UNSIGNED_INT_SAMPLER_2D_ARRAY); InsertEntry("usampler2DMultisample"sv, GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE); InsertEntry("usampler2DMultisampleArray"sv, GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY); InsertEntry("usamplerBuffer"sv, GL_UNSIGNED_INT_SAMPLER_BUFFER); InsertEntry("usampler2DRect"sv, GL_UNSIGNED_INT_SAMPLER_2D_RECT); } void InsertEntry(std::string_view name, GLenum value) { enum2Name.try_emplace(value, name); name2Enum.try_emplace(name, value); } } const kGLTypeInfo; } // namespace ProjectBrussel_UNITY_ID std::string_view Tags::GLTypeToString(GLenum value) { using namespace ProjectBrussel_UNITY_ID; auto iter = kGLTypeInfo.enum2Name.find(value); if (iter != kGLTypeInfo.enum2Name.end()) { return iter->second; } else { return std::string_view(); } } GLenum Tags::GLTypeFromString(std::string_view name) { using namespace ProjectBrussel_UNITY_ID; auto iter = kGLTypeInfo.name2Enum.find(name); if (iter != kGLTypeInfo.name2Enum.end()) { return iter->second; } else { return 0; } } #include