]> git.itanic.dy.fi Git - sdl-planets/commitdiff
draw_planet: Separate circle drawing into its own function
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 13 Apr 2010 17:18:11 +0000 (20:18 +0300)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Tue, 13 Apr 2010 19:42:35 +0000 (22:42 +0300)
It is easier to draw circles elsewhere in the code if the circle
drawing is separated.

Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
planet.c

index 7f39cb6d187be6b4ee6aabf9a561945396cab740..88577ee8541e28a043794debe8a1c91ef4e04167 100644 (file)
--- a/planet.c
+++ b/planet.c
@@ -94,50 +94,68 @@ void create_planets(struct planet *p, int num, double total_mass, double radius)
        }
 }
 
-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;