*
* It is left for the caller to deal with the scrap planet b
*/
-static void _merge_planets(struct planet *a, struct planet *b)
+static struct planet *_merge_planets(struct planet *a, struct planet *b)
{
+ struct quadtree *parent = &a->tree;
struct vector pa, pb, p;
float mass;
mass = a->mass + b->mass;
if (a->mass < b->mass)
- a->tree.pos = b->tree.pos;
+ parent = quadtree_move(&a->tree, b->tree.pos, &planet_ops);
a->r = (a->r * a->mass + b->r * b->mass) / mass;
a->g = (a->g * a->mass + b->g * b->mass) / mass;
a->mass = mass;
reshape_planet(a);
vector_div(&p, a->mass, &a->speed);
+
+ return tree_to_planet(quadtree_find_parent(parent));
}
/*
*/
struct planet *merge_planets(struct planet *a, struct planet *b)
{
+ struct quadtree *p;
_merge_planets(a, b);
list_del(&b->list);
- quadtree_del(&b->tree, &planet_ops);
+ p = quadtree_del(&b->tree, &planet_ops);
free(b);
- return a;
+ return tree_to_planet(p);
}
struct planet *move_planet(struct planet *p, const double time)