From 89adaad118d714200f5dd986016ece26d6334c20 Mon Sep 17 00:00:00 2001 From: Timo Kokkonen Date: Tue, 13 Apr 2010 20:18:11 +0300 Subject: [PATCH] draw_planet: Separate circle drawing into its own function It is easier to draw circles elsewhere in the code if the circle drawing is separated. Signed-off-by: Timo Kokkonen --- planet.c | 66 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/planet.c b/planet.c index 7f39cb6..88577ee 100644 --- 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; -- 2.45.0