aboutsummaryrefslogtreecommitdiff
path: root/source/GraphicsTags.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/GraphicsTags.cpp')
-rw-r--r--source/GraphicsTags.cpp215
1 files changed, 215 insertions, 0 deletions
diff --git a/source/GraphicsTags.cpp b/source/GraphicsTags.cpp
new file mode 100644
index 0000000..d2da091
--- /dev/null
+++ b/source/GraphicsTags.cpp
@@ -0,0 +1,215 @@
+#include "GraphicsTags.hpp"
+
+#include <absl/container/flat_hash_map.h>
+#include <cstddef>
+#include <cstdint>
+
+using namespace std::literals;
+
+std::string_view Tags::NameOf(VertexElementSemantic semantic) {
+ switch (semantic) {
+ case VES_Position: return "Position"sv;
+ case VES_BlendWeights: return "BlendWeights"sv;
+ case VES_BlendIndices: return "BlendIndices"sv;
+ case VES_Normal: return "Normal"sv;
+ case VES_Color1: return "Color1"sv;
+ case VES_Color2: return "Color2"sv;
+ case VES_Texture_coordinates: return "Texture_coordinates"sv;
+ case VES_Binormal: return "Binormal"sv;
+ case VES_Tangent: return "Tangent"sv;
+ case VES_Generic: return "Generic"sv;
+ case VES_COUNT: break;
+ }
+ return std::string_view();
+}
+
+Tags::VertexElementSemantic Tags::FindVertexElementSemantic(std::string_view name) {
+ if (name == "Position"sv) return VES_Position;
+ if (name == "BlendWeights"sv) return VES_BlendWeights;
+ if (name == "BlendIndices"sv) return VES_BlendIndices;
+ if (name == "Normal"sv) return VES_Normal;
+ if (name == "Color1"sv) return VES_Color1;
+ if (name == "Color2"sv) return VES_Color2;
+ if (name == "Texture_coordinates"sv) return VES_Texture_coordinates;
+ if (name == "Binormal"sv) return VES_Binormal;
+ if (name == "Tangent"sv) return VES_Tangent;
+ if (name == "Generic"sv) return VES_Generic;
+ return VES_COUNT;
+}
+
+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;
+}
+
+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;
+}
+
+namespace ProjectBrussel_UNITY_ID {
+
+struct GLTypeInfo {
+ absl::flat_hash_map<GLenum, std::string_view> enum2Name;
+ absl::flat_hash_map<std::string_view, GLenum> 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::NameOfGLType(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::FindGLType(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 GL_NONE;
+ }
+}