}
}
-void draw_planet(SDL_Surface *screen, struct planet *p,
- const struct camera *cam)
+void draw_circle(SDL_Surface *screen, const struct vector *pos,
+ const double radius,
+ char r, char g, char b, int transparent)
{
- struct vector pos;
- float radius = p->radius * cam->zoom;
- float r2 = radius * radius;
int x, x_start, y, x_end;
+ float r2 = radius * radius;
- vector_sub(&p->pos, &cam->pos, &pos);
- vector_scale(&pos, cam->zoom, &pos);
- pos.x += screen->w / 2;
- pos.y += screen->h / 2;
-
- y = MAX(pos.y - radius, 0);
+ y = MAX(pos->y - radius, 0);
if (radius * 2 <= 1) {
- if (pos.x >= 0 && pos.x < screen->w &&
- pos.y >= 0 && pos.y < screen->h)
- putpixel(screen, (int)pos.x, (int)pos.y,
- p->r, p->g, p->b);
+ if (pos->x >= 0 && pos->x < screen->w &&
+ pos->y >= 0 && pos->y < screen->h)
+ putpixel(screen, (int)pos->x, (int)pos->y,
+ r, g, b);
return;
}
- for (; y < MIN(pos.y + radius, screen->h); y++) {
+ for (; y < MIN(pos->y + radius, screen->h); y++) {
int offset;
unsigned char *buf = screen->pixels;
- float y2 = (y - pos.y);
+ float y2 = (y - pos->y);
y2 = sqrt(r2 - y2 * y2);
- x_start = pos.x - y2;
- x_end = pos.x + y2;
+ x_start = pos->x - y2;
+ x_end = pos->x + y2;
x_start = MAX(0, x_start);
x_end = MIN(x_end, screen->w);
offset = y * screen->pitch + x_start * 4;
- for (x = x_start; x < x_end; x++) {
- buf[offset++] = p->b;
- buf[offset++] = p->g;
- buf[offset++] = p->r;
- offset++;
+ if (transparent) {
+ for (x = x_start; x < x_end; x++) {
+ buf[offset++] += b;
+ buf[offset++] += g;
+ buf[offset++] += r;
+ offset++;
+ }
+ } else {
+ for (x = x_start; x < x_end; x++) {
+ buf[offset++] = b;
+ buf[offset++] = g;
+ buf[offset++] = r;
+ offset++;
+ }
}
}
}
+void draw_planet(SDL_Surface *screen, struct planet *p,
+ const struct camera *cam)
+{
+ struct vector pos;
+ float radius = p->radius * cam->zoom;
+ int i;
+
+ vector_sub(&p->pos, &cam->pos, &pos);
+ vector_scale(&pos, cam->zoom, &pos);
+ pos.x += screen->w / 2;
+ pos.y += screen->h / 2;
+
+ draw_circle(screen, &pos, radius, p->r, p->g, p->b, 0);
+}
+
int gravitize_planets(struct planet *a, struct planet *b, const double time)
{
struct vector distance, sum;