diff --git a/src/AssetMacros.h b/src/AssetMacros.h index 8a5f081..1880d3c 100644 --- a/src/AssetMacros.h +++ b/src/AssetMacros.h @@ -20,7 +20,7 @@ enum class BUFFER_TARGET : int ELEMENT_ARRAY_BUFFER = 34963 }; -enum class ACCESSOR_DATA_TYPE : int +enum class ACCESSOR_COMPONENT_TYPE : int { BYTE = 5120, U_BYTE = 5121, @@ -30,25 +30,25 @@ enum class ACCESSOR_DATA_TYPE : int FLOAT = 5126 }; -constexpr size_t SizeOfType(ACCESSOR_DATA_TYPE type) +constexpr size_t SizeOfType(ACCESSOR_COMPONENT_TYPE type) { switch(type) { - case ACCESSOR_DATA_TYPE::BYTE: - case ACCESSOR_DATA_TYPE::U_BYTE: + case ACCESSOR_COMPONENT_TYPE::BYTE: + case ACCESSOR_COMPONENT_TYPE::U_BYTE: return sizeof(char); - case ACCESSOR_DATA_TYPE::SHORT: - case ACCESSOR_DATA_TYPE::U_SHORT: + case ACCESSOR_COMPONENT_TYPE::SHORT: + case ACCESSOR_COMPONENT_TYPE::U_SHORT: return sizeof(short); - case ACCESSOR_DATA_TYPE::U_INT: - case ACCESSOR_DATA_TYPE::FLOAT: + case ACCESSOR_COMPONENT_TYPE::U_INT: + case ACCESSOR_COMPONENT_TYPE::FLOAT: return sizeof(float); default: return 0; } } -enum class ACCESSOR_COMPONENT_TYPE : int +enum class ACCESSOR_DATA_TYPE : int { SCALAR = 64 + 1, VEC2 = 2, @@ -61,6 +61,29 @@ enum class ACCESSOR_COMPONENT_TYPE : int MATRIX = 64 + 16 }; +constexpr size_t CountOfType(ACCESSOR_DATA_TYPE type) +{ + switch (type) + { + case ACCESSOR_DATA_TYPE::SCALAR: + return 1; + case ACCESSOR_DATA_TYPE::VEC2: + return 2; + case ACCESSOR_DATA_TYPE::VEC3: + return 3; + case ACCESSOR_DATA_TYPE::VEC4: + return 4; + case ACCESSOR_DATA_TYPE::MAT2: + return 2 * 2; + case ACCESSOR_DATA_TYPE::MAT3: + return 3 * 3; + case ACCESSOR_DATA_TYPE::MAT4: + return 4 * 4; + default: + return 0; + } +} + enum class PRIMITIVE_MODE : int { POINT = 0, diff --git a/src/Libraries/MeshCompiler.hpp b/src/Libraries/MeshCompiler.hpp index 9bceb96..e94fb89 100644 --- a/src/Libraries/MeshCompiler.hpp +++ b/src/Libraries/MeshCompiler.hpp @@ -118,11 +118,12 @@ namespace SH_COMP { auto const& accessor = (*accessors)[accessorID]; auto const& view = (*bufferViews)[accessor.bufferView]; - auto const typeIdentifier{ static_cast(accessor.componentType) }; + auto const typeIdentifier{ static_cast(accessor.componentType) }; auto const sizeIdentifier{ SizeOfType(typeIdentifier) }; - if (sizeof(T) == sizeIdentifier) + auto const componentCount{ CountOfType(accessor.type) }; + dst.resize(accessor.count); + if (sizeof(T) == sizeIdentifier * componentCount) { - dst.resize(accessor.count); std::memcpy( dst.data(), buffer + view.byteOffset, @@ -138,9 +139,19 @@ namespace SH_COMP view.byteLength ); - for (auto i{0}; i < accessor.count; i += sizeIdentifier) + auto srcPtr{ tempData.data() }; + auto dstPtr{ dst.data() }; + size_t index{ 0 }; + for (auto i{0}; i < accessor.count; ++i, ++index) { - + std::memcpy( + dstPtr, + srcPtr, + sizeIdentifier + ); + + srcPtr += sizeIdentifier; + dstPtr += sizeof(T); } }