diff --git a/src/ObjLoading/XModel/Gltf/GltfLoader.cpp b/src/ObjLoading/XModel/Gltf/GltfLoader.cpp index ef5face7..42644a5a 100644 --- a/src/ObjLoading/XModel/Gltf/GltfLoader.cpp +++ b/src/ObjLoading/XModel/Gltf/GltfLoader.cpp @@ -214,6 +214,7 @@ namespace const auto vertexCount = positionAccessor->GetCount(); NullAccessor nullAccessor(vertexCount); + OnesAccessor onesAccessor(vertexCount); // clang-format off auto* normalAccessor = GetAccessorForIndex( @@ -237,7 +238,7 @@ namespace accessorsForVertex.colorAccessor, {JsonAccessorType::VEC3, JsonAccessorType::VEC4}, {JsonAccessorComponentType::FLOAT, JsonAccessorComponentType::UNSIGNED_BYTE, JsonAccessorComponentType::UNSIGNED_SHORT} - ).value_or(&nullAccessor); + ).value_or(&onesAccessor); VerifyAccessorVertexCount("COLOR_0", colorAccessor, vertexCount); auto* jointsAccessor = GetAccessorForIndex( diff --git a/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.cpp b/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.cpp index 3ded1bb8..8bf26355 100644 --- a/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.cpp +++ b/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.cpp @@ -81,6 +81,85 @@ size_t NullAccessor::GetCount() const return m_count; } +OnesAccessor::OnesAccessor(const size_t count) + : m_count(count) +{ +} + +bool OnesAccessor::GetFloatVec2(const size_t index, float (&out)[2]) const +{ + if (index >= m_count) + return false; + + out[0] = 1.0f; + out[1] = 1.0f; + + return true; +} + +bool OnesAccessor::GetFloatVec3(const size_t index, float (&out)[3]) const +{ + if (index >= m_count) + return false; + + out[0] = 1.0f; + out[1] = 1.0f; + out[2] = 1.0f; + + return true; +} + +bool OnesAccessor::GetFloatVec4(const size_t index, float (&out)[4]) const +{ + if (index >= m_count) + return false; + + out[0] = 1.0f; + out[1] = 1.0f; + out[2] = 1.0f; + out[3] = 1.0f; + + return true; +} + +bool OnesAccessor::GetUnsigned(const size_t index, unsigned& out) const +{ + if (index >= m_count) + return false; + + out = 0xFFFFFFFFu; + + return true; +} + +bool OnesAccessor::GetUnsignedVec4(const size_t index, unsigned (&out)[4]) const +{ + if (index >= m_count) + return false; + + out[0] = 0xFFFFFFFFu; + out[1] = 0xFFFFFFFFu; + out[2] = 0xFFFFFFFFu; + out[3] = 0xFFFFFFFFu; + + return true; +} + +std::optional OnesAccessor::GetComponentType() const +{ + return std::nullopt; +} + +std::optional OnesAccessor::GetType() const +{ + return std::nullopt; +} + +size_t OnesAccessor::GetCount() const +{ + return m_count; +} + FloatAccessor::FloatAccessor(const BufferView* bufferView, const JsonAccessorType type, size_t byteOffset, const size_t count) : m_buffer_view(bufferView), m_type(type), diff --git a/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.h b/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.h index 12b442c3..8395f037 100644 --- a/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.h +++ b/src/ObjLoading/XModel/Gltf/Internal/GltfAccessor.h @@ -46,6 +46,25 @@ namespace gltf size_t m_count; }; + class OnesAccessor final : public Accessor + { + public: + explicit OnesAccessor(size_t count); + + [[nodiscard]] std::optional GetType() const override; + [[nodiscard]] std::optional GetComponentType() const override; + [[nodiscard]] size_t GetCount() const override; + + [[nodiscard]] bool GetFloatVec2(size_t index, float (&out)[2]) const override; + [[nodiscard]] bool GetFloatVec3(size_t index, float (&out)[3]) const override; + [[nodiscard]] bool GetFloatVec4(size_t index, float (&out)[4]) const override; + [[nodiscard]] bool GetUnsigned(size_t index, unsigned& out) const override; + [[nodiscard]] bool GetUnsignedVec4(size_t index, unsigned (&out)[4]) const override; + + private: + size_t m_count; + }; + class FloatAccessor final : public Accessor { public: