remove old transform and velocity components and replace with new decomposed components

focus on 2D for now
This commit is contained in:
2022-01-04 22:33:59 +01:00
parent c36fa30cbc
commit 12b0a90ad0
71 changed files with 1114 additions and 528 deletions

View File

@ -1,21 +1,66 @@
#include "./simple_velocity_system2d.hpp"
#include "mm/components/rotation2d.hpp"
#include "mm/components/velocity2d_position.hpp"
#include "mm/components/velocity2d_rotation.hpp"
#include <entt/entity/registry.hpp>
namespace MM::Systems {
void simple_velocity(
void simple_positional_velocity(
entt::view<entt::get_t<
Components::Transform2D,
const Components::Velocity2D
Components::Position2D,
const Components::Velocity2DPosition
>> view,
const Components::TimeDelta& td
) {
view.each([delta = td.tickDelta](auto, auto& t, auto& v) {
t.position += v.velocity * delta;
t.rotation += v.rotation * delta;
view.each([delta = td.tickDelta](auto& t, auto& v) {
t.pos += v.pos_vel * delta;
});
}
void simple_positional_velocity_patching(
entt::registry& scene,
entt::view<entt::get_t<
Components::Position2D,
const Components::Velocity2DPosition
>> view,
const Components::TimeDelta& td
) {
view.each([&scene, delta = td.tickDelta](const auto e, auto& t, auto& v) {
if (v.pos_vel.x != 0.f || v.pos_vel.y != 0.f) {
t.pos += v.pos_vel * delta;
scene.patch<MM::Components::Position2D>(e);
}
);
});
}
void simple_rotational_velocity(
entt::view<entt::get_t<
Components::Rotation2D,
const Components::Velocity2DRotation
>> view,
const Components::TimeDelta& td
) {
view.each([delta = td.tickDelta](auto& r, auto& v) {
r.rot += v.rot_vel * delta;
});
}
void simple_rotational_velocity_patching(
entt::registry& scene,
entt::view<entt::get_t<
Components::Rotation2D,
const Components::Velocity2DRotation
>> view,
const Components::TimeDelta& td
) {
view.each([&scene, delta = td.tickDelta](const auto e, auto& r, auto& v) {
if (v.rot_vel != 0.f) {
r.rot += v.rot_vel * delta;
scene.patch<MM::Components::Rotation2D>(e);
}
});
}
} // MM::Systems

View File

@ -1,17 +1,49 @@
#pragma once
#include <mm/components/velocity2d.hpp>
#include <mm/components/transform2d.hpp>
#include <mm/components/velocity2d_position.hpp>
#include <mm/components/velocity2d_rotation.hpp>
#include <mm/components/position2d.hpp>
#include <mm/components/rotation2d.hpp>
#include <mm/components/time_delta.hpp>
#include <mm/services/scene_service_interface.hpp>
#include <entt/fwd.hpp>
namespace MM::Systems {
void simple_velocity(
// non patching (on_update())
void simple_positional_velocity(
entt::view<entt::get_t<
Components::Transform2D,
const Components::Velocity2D
Components::Position2D,
const Components::Velocity2DPosition
>> view,
const Components::TimeDelta& td
);
// patching (on_update())
void simple_positional_velocity_patching(
entt::registry& scene,
entt::view<entt::get_t<
Components::Position2D,
const Components::Velocity2DPosition
>> view,
const Components::TimeDelta& td
);
// non patching (on_update())
void simple_rotational_velocity(
entt::view<entt::get_t<
Components::Rotation2D,
const Components::Velocity2DRotation
>> view,
const Components::TimeDelta& td
);
// patching (on_update())
void simple_rotational_velocity_patching(
entt::registry& scene,
entt::view<entt::get_t<
Components::Rotation2D,
const Components::Velocity2DRotation
>> view,
const Components::TimeDelta& td
);

View File

@ -12,7 +12,8 @@ TEST(simple_velocity_2d, basic_run) {
// setup v system
auto& org = scene.set<entt::organizer>();
org.emplace<&MM::Systems::simple_velocity>("simple_velocity");
org.emplace<&MM::Systems::simple_positional_velocity>("simple_positional_velocity");
org.emplace<&MM::Systems::simple_rotational_velocity>("simple_rotational_velocity");
auto graph = org.graph();
// setup delta
@ -21,19 +22,21 @@ TEST(simple_velocity_2d, basic_run) {
// setup test entity
auto e = scene.create();
auto& t = scene.emplace<MM::Components::Transform2D>(e);
auto& v = scene.emplace<MM::Components::Velocity2D>(e);
t.position = { 0.f, 0.f };
t.rotation = 0.f;
auto& p = scene.emplace<MM::Components::Position2D>(e);
auto& r = scene.emplace<MM::Components::Rotation2D>(e);
auto& vp = scene.emplace<MM::Components::Velocity2DPosition>(e);
auto& vr = scene.emplace<MM::Components::Velocity2DRotation>(e);
p.pos = { 0.f, 0.f };
r.rot = 0.f;
v.velocity = { 1.f, 1.f };
v.rotation = 0.f;
vp.pos_vel = { 1.f, 1.f };
vr.rot_vel = 0.f;
// run all systems
for (auto&& vert : graph) {
vert.callback()(vert.data(), scene);
}
ASSERT_EQ(t.position.x, 1.f * 1.f/60.f);
ASSERT_EQ(p.pos.x, 1.f * 1.f/60.f);
}