diff --git a/libs/phys/include/psemek/phys/engine_2d.hpp b/libs/phys/include/psemek/phys/engine_2d.hpp index 47eba6ed..7d880283 100644 --- a/libs/phys/include/psemek/phys/engine_2d.hpp +++ b/libs/phys/include/psemek/phys/engine_2d.hpp @@ -7,6 +7,7 @@ #include #include +#include namespace psemek::phys2d { @@ -46,9 +47,21 @@ namespace psemek::phys2d static_state * group_static_state(group_handle handle); dynamic_state * group_dynamic_state(group_handle handle); - void add_object(group_handle group, shape_handle shape, material_handle material, static_state const & ss, dynamic_state const & ds); + std::size_t add_object(group_handle group, shape_handle shape, material_handle material, static_state const & ss, dynamic_state const & ds); void remove_object(group_handle group, std::size_t index); + struct object_info + { + engine::shape_handle shape; + engine::material_handle material; + float inv_mass; + float inv_inertia; + }; + + object_info const & info(group_handle group, std::size_t index); + + std::variant shape(group_handle group, std::size_t index); + // Global system properties void set_gravity(geom::vector const & g); diff --git a/libs/phys/source/engine_2d.cpp b/libs/phys/source/engine_2d.cpp index 470deb5b..a4df452a 100644 --- a/libs/phys/source/engine_2d.cpp +++ b/libs/phys/source/engine_2d.cpp @@ -369,14 +369,6 @@ namespace psemek::phys2d util::flat_list materials; - struct object_info - { - engine::shape_handle shape; - engine::material_handle material; - float inv_mass; - float inv_inertia; - }; - struct group { std::vector infos; @@ -687,7 +679,7 @@ namespace psemek::phys2d return impl().groups[handle].dynamic_states.data(); } - void engine::add_object(group_handle group, shape_handle shape, material_handle material, static_state const & ss, dynamic_state const & ds) + std::size_t engine::add_object(group_handle group, shape_handle shape, material_handle material, static_state const & ss, dynamic_state const & ds) { float const density = impl().materials[material].density; float const area = impl().shapes.visit([](auto const & s){ return s.area; }, shape); @@ -697,6 +689,8 @@ namespace psemek::phys2d g.infos.push_back({shape, material, 1.f / (area * density), 1.f / (inertia * density)}); g.static_states.push_back(ss); g.dynamic_states.push_back(ds); + + return g.infos.size() - 1; } void engine::remove_object(group_handle group, std::size_t index) @@ -707,6 +701,18 @@ namespace psemek::phys2d g.dynamic_states.erase(g.dynamic_states.begin() + index); } + engine::object_info const & engine::info(group_handle group, std::size_t index) + { + return impl().groups[group].infos[index]; + } + + std::variant engine::shape(group_handle group, std::size_t index) + { + using result = std::variant; + auto sh = impl().groups[group].infos[index].shape; + return impl().shapes.visit([](auto const & s) -> result { return s.shape; }, sh); + } + void engine::set_gravity(geom::vector const & g) { impl().gravity = g;