#include "planet.h"
#include "utils.h"
-struct quadtree_ops planet_ops = {
- .compare = planet_spatial_compare,
-};
+struct quadtree_ops planet_ops;
static void putpixel(struct SDL_Surface *screen, const int x, const int y,
const unsigned char r, const unsigned char g,
void init_planet(struct planet *p)
{
- p->speed.x = 0;
- p->speed.y = 0;
- p->pos.x = 0;
- p->pos.y = 0;
- p->mass = 0;
+ memset(p, 0, sizeof(*p));
reshape_planet(p);
p->r = get_random() % 256;
p->g = get_random() % 256;
draw_planet(i->screen, p, i->cam);
}
+
+static void planet_recalculate_stats(struct quadtree *node)
+{
+ struct planet *p = tree_to_planet(node), *c;
+ struct vector vect;
+ double dist;
+ int i;
+
+ p->tree_area = 0;
+ p->tree_mass = p->mass;
+
+ for (i = 0; i < 4; i++) {
+ if (!node->child[i])
+ continue;
+
+ c = tree_to_planet(node->child[i]);
+ p->tree_mass += c->tree_mass;
+
+ vector_sub(&p->pos, &c->pos, &vect);
+ dist = vector_abs(&vect);
+ dist += c->tree_area;
+ p->tree_area = MAX(p->tree_area, dist);
+ }
+}
+
+struct quadtree_ops planet_ops = {
+ .compare = planet_spatial_compare,
+ .recalculate_stats = planet_recalculate_stats,
+};
+