ref: d1cebf608b05e45b148108ac6c16ae94f6862097
dir: /sys/src/games/galaxy/galaxy.h/
typedef struct QB QB; typedef struct Body Body; typedef struct Quad Quad; typedef struct Vector Vector; struct QB { union { Quad *q; Body *b; }; int t; }; struct Vector { double x, y; }; struct Body { Vector; Vector v, a, newa; double size, mass; Image *col; }; struct Quad { Vector; QB c[4]; double mass; }; #pragma varargck type "B" Body* struct { QLock; Body *a; int nb, max; } glxy; struct { Quad *a; int l, max; } quads; #define π2 6.28318530718e0 enum { EMPTY, QUAD, BODY, }; void quit(char*); Image *randcol(void); Point topoint(Vector); Vector tovector(Point); Body *body(void); void drawbody(Body*); Vector center(void); void glxyinit(void); int Bfmt(Fmt*); void readglxy(int); void writeglxy(int); void drawglxy(void); void simulate(void*); void quadcalc(Body*, QB, double); int quadins(Body*, double); void growquads(void); void quadsinit(void); int stats, quaddepth, calcs, extraproc, throttle; double G, θ, scale, ε, LIM, dt, dt², avgcalcs; Point orig; QB space; Body ZB; enum { STK = 8192, }; #define STATS(e) if(stats) {e} #define CHECKLIM(b, f) \ if(((f) = fabs((b)->x)) > LIM/2) \ LIM = (f)*2; \ if(((f) = fabs((b)->y)) > LIM/2) \ LIM = (f)*2