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))
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,
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);
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;
}
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.
}
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)
/* 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 {
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);