diff --git a/libs/gfx/include/psemek/gfx/gltf_accessor_iterator.hpp b/libs/gfx/include/psemek/gfx/gltf_accessor_iterator.hpp index f414a495..2a1852c1 100644 --- a/libs/gfx/include/psemek/gfx/gltf_accessor_iterator.hpp +++ b/libs/gfx/include/psemek/gfx/gltf_accessor_iterator.hpp @@ -22,6 +22,9 @@ namespace psemek::gfx { return &value; } + + static void finalize(T &) + {} }; template @@ -31,9 +34,7 @@ namespace psemek::gfx template struct accessor_traits : accessor_traits_helper> - { - - }; + {}; template struct accessor_traits> @@ -46,6 +47,9 @@ namespace psemek::gfx { return &value[0]; } + + static void finalize(geom::vector &) + {} }; template @@ -59,6 +63,9 @@ namespace psemek::gfx { return &value[0]; } + + static void finalize(geom::point &) + {} }; template @@ -72,6 +79,29 @@ namespace psemek::gfx { return &value[0]; } + + static void finalize(geom::quaternion &) + {} + }; + + template + struct accessor_traits> + { + static constexpr bool is_floating_point = accessor_traits::is_floating_point; + static constexpr std::size_t components = R * C; + using component_type = T; + + static auto pointer(geom::matrix & value) + { + return &value[0][0]; + } + + static void finalize(geom::matrix & value) + { + geom::matrix temp; + std::copy(value.coords, value.coords + R * C, temp.coords); + value = geom::transpose(temp); + } }; template @@ -189,6 +219,8 @@ namespace psemek::gfx ptr += component_size(accessor.component_type); } + traits::finalize(result); + return result; } diff --git a/libs/gfx/include/psemek/gfx/gltf_parser.hpp b/libs/gfx/include/psemek/gfx/gltf_parser.hpp index 3c6bd2c8..0099845a 100644 --- a/libs/gfx/include/psemek/gfx/gltf_parser.hpp +++ b/libs/gfx/include/psemek/gfx/gltf_parser.hpp @@ -221,6 +221,9 @@ namespace psemek::gfx case type_t::vec2: return 2; case type_t::vec3: return 3; case type_t::vec4: return 4; + case type_t::mat2: return 4; + case type_t::mat3: return 9; + case type_t::mat4: return 16; default: throw util::exception("Unsupported attribute type"); } }