From 17d5b091c9b2901ac96f5eee0da6af07228ae690 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 10 Apr 2022 23:00:36 -0700 Subject: Changeset: 5 Add shader and corresponding editor components --- source/GraphicsTags.cpp | 215 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 source/GraphicsTags.cpp (limited to 'source/GraphicsTags.cpp') 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 +#include +#include + +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 enum2Name; + absl::flat_hash_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::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; + } +} -- cgit v1.2.3-70-g09d2