X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FWorld.cpp;h=53115dc386360b73558a07ae5ee00bafe381c9e2;hb=79dbf3ed50c70107164d0473bd7479ee680d6e70;hp=219708ecb066749179c08603dc731761318a9837;hpb=587986123da991c9d640d43f26a8c7035cd7cec5;p=gworm.git diff --git a/src/world/World.cpp b/src/world/World.cpp index 219708e..53115dc 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -15,10 +15,21 @@ World::World(Vector size) void World::Update(float dt) { + for (Entity &e : entities) { + e.acc = ForceAt(e.pos, e.mass) / e.mass; + e.Update(dt); + } +} + +Entity &World::AddEntity(const Entity &e) { + entities.emplace_back(e); + return entities.back(); } +// returns <1.37136364,1.37136734> for 1 mass at <0,0> +/* Vector World::ForceAt(Vector p1, float m1) const { Vector force(0, 0); @@ -39,5 +50,33 @@ Vector World::ForceAt(Vector p1, float m1) const { return force; } +*/ + +// returns <1.37136674,1.37136662> for 1 mass at <0,0> +// (should be less prone to rounding loss, i.e. more accurate) +Vector World::ForceAt(Vector p1, float m1) const { + Vector force(0, 0); + + for (Vector p2(0, 0); p2.y < size.y; ++p2.y) { + Vector rowForce(0, 0); + for (p2.x = 0; p2.x < size.x; ++p2.x) { + const int i = Index(p2); + if (p1 == Vector(p2)) continue; + + const Vector diff(Vector(p2) - p1); + const Vector dir(Norm(diff)); + + const float m2 = masses[i]; + const float r2 = Dot(diff, diff); + + const float mag = G * ((m1 * m2) / r2) * 2; // double because m2 is our reference frame + + rowForce += dir * mag; + } + force += rowForce; + } + + return force; +} }