#ifndef _PLANET_H #define _PLANET_H #include #include "vector.h" #include "list.h" #include "utils.h" #include "camera.h" #include "quadtree.h" struct planet { struct vector speed; struct list_head list; struct quadtree tree; double mass; float radius; unsigned char r, g, b; int to_be_deleted; /* 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 { struct quadtree_iterator qt_iterator; struct vector limit[2]; struct camera *cam; SDL_Surface *screen; int modify; }; extern int gravitations, optimizations; #define list_to_planet(list_head) container_of((list_head), struct planet, list) #define tree_to_planet(qt) container_of((qt), struct planet, tree) #define qt_itr_to_planet_itr(qt) \ container_of((qt), struct planet_search_iterator, qt_iterator) void init_planet(struct planet *p); void create_planets(struct planet *p, int num, double total_mass, double radius); void draw_planet(SDL_Surface *screen, const struct planet *p, const struct camera *); 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); int planet_spatial_compare(struct quadtree *a, struct quadtree *b); int planet_search_rectangular(struct quadtree *node, struct quadtree_iterator *itr); void planet_draw_iterator(struct quadtree *node, struct quadtree_iterator *it); #endif