]> git.itanic.dy.fi Git - sdl-planets/commitdiff
Make the tree gravitation calculation work better
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Wed, 17 Nov 2010 20:36:11 +0000 (22:36 +0200)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Wed, 17 Nov 2010 20:36:11 +0000 (22:36 +0200)
main.c
planet.c
planet.h

diff --git a/main.c b/main.c
index afb9d86ee7f2a6904ce7c1f3ed4e347dfca5334a..9a300e2a412bb3541cd9330067e1e5e7e8d6d8ec 100644 (file)
--- a/main.c
+++ b/main.c
@@ -225,13 +225,14 @@ static void loop(SDL_Surface *screen, int num_of_planets, double total_mass,
                optimizations = 0;
 
                gravitize_planet_tree(planet_root, step_time);
+               planets = propagate_tree_movement(planet_root);
 
                planet_root = prune_planet_tree(planet_root);
 
                list_for_each_entry(pl1, &planet_root->list, list) {
                        planet_root = move_planet(pl1, step_time);
-                       planets++;
                }
+
                move_camera(&camera, true_time);
 
                if (poll_events(&status, true_time))
index 1bedc6e6f2900036beb6515fa07b81488a3cd24e..1441fc33e729534c8f622834090ddb35ee759391 100644 (file)
--- a/planet.c
+++ b/planet.c
@@ -7,7 +7,7 @@
 struct quadtree_ops planet_ops;
 int gravitations, optimizations;
 
-static int draw_lines = 1;
+static int draw_lines = 0;
 static int draw_tree_area = 0;
 
 static void putpixel(struct SDL_Surface *screen, const int x, const int y,
@@ -229,6 +229,10 @@ int gravitize_planet_with_planet(struct planet *a, struct planet *b,
 
        f = a->mass * b->mass / (dist * dist) * time;
 
+       acc = f / b->mass;
+       vector_scale(&distance, acc, &sum);
+       vector_add(&b->speed, &sum, &b->speed);
+
        acc = f / a->mass;
        vector_scale(&distance, acc, &sum);
        vector_sub(&a->speed, &sum, &a->speed);
@@ -259,6 +263,10 @@ int gravitize_planet_with_tree(struct planet *a, struct planet *b,
        vector_scale(&distance, acc, &sum);
        vector_sub(&a->speed, &sum, &a->speed);
 
+       acc = f / b->tree_mass;
+       vector_scale(&distance, acc, &sum);
+       vector_add(&b->tree_speed, &sum, &b->tree_speed);
+
        return 0;
 }
 
@@ -334,7 +342,7 @@ static void gravitize_planet(struct planet *p, struct planet *pt, double time)
        if (p != pt)
                gravitize_planet_with_planet(p, pt, time);
 
-       if (dist > pt->tree_area * 2) {
+       if (dist > pt->tree_area * 8) {
                /*
                 * OK, the node is far enough. We can approximate the
                 * entire tree as a single entity.
@@ -475,10 +483,34 @@ struct planet *move_planet(struct planet *p, const double time)
        }
 
        p->tree.pos = new_pos;
-       tree_parent = tree_to_planet(quadtree_find_parent(&p->tree));
+       tree_parent = quadtree_find_parent(&p->tree);
 out:
        quadtree_validate_tree(&p->tree);
-       return tree_parent;
+       return tree_to_planet(tree_parent);
+}
+
+int propagate_tree_movement(struct planet *p)
+{
+       int i, count = 1;
+
+       for (i = 0; i < 4; i++) {
+               if (!p->tree.child[i])
+                       continue;
+
+               vector_add(&tree_to_planet(p->tree.child[i])->speed,
+                       &p->tree_speed,
+                       &tree_to_planet(p->tree.child[i])->speed);
+
+               count += propagate_tree_movement(
+                       tree_to_planet(p->tree.child[i]));
+       }
+
+       vector_add(&p->tree_speed, &p->speed, &p->speed);
+
+       p->tree_speed.x = 0;
+       p->tree_speed.y = 0;
+
+       return count;
 }
 
 struct planet *prune_planet_tree(struct planet *p)
index 85ed98e20c06ad3800bc4637515fa0d26349283d..19bce3c2760b6d2274c6bd571e6270307cff61f9 100644 (file)
--- a/planet.h
+++ b/planet.h
@@ -21,6 +21,8 @@ struct planet {
        /* info about the planets in sub branches */
        float tree_area;        /* total area occupied by the tree */
        double tree_mass;       /* total mass occupied by the tree */
+       /* the amount of speed the entire tree has gained */
+       struct vector tree_speed;
 };
 
 struct planet_search_iterator {
@@ -48,6 +50,7 @@ void draw_planet(SDL_Surface *screen, const struct planet *p,
 void gravitize_planet_tree(struct planet *p, double time);
 struct planet *merge_planets(struct planet *a, struct planet *b);
 struct planet *move_planet(struct planet *p, const double time);
+int propagate_tree_movement(struct planet *p);
 void print_planet(const struct planet *p);
 struct planet *prune_planet_tree(struct planet *p);