diff --git a/camera.c b/camera.c index be3f8e1..2099bae 100644 --- a/camera.c +++ b/camera.c @@ -41,6 +41,14 @@ struct solid manifold = (struct solid) { .dist = manidist, }; +struct colour +solid_col(struct object *s, struct ray *r) { + subtract_vec_ip(r->pos, &(s->sol.pos)); + struct colour out = s->col(r, s); + add_vec_ip(r->pos, &(s->sol.pos)); + return out; +} + double solid_dist(struct solid *s, struct vec *v) { subtract_vec_ip(v, &(s->pos)); double out = s->dist(v); @@ -103,7 +111,7 @@ int vectorisnan(struct vec *v) } void -manifoldstepaxees(struct vec *pos, struct vec **lads, int numlads, double distance) +manifoldstepaxees(struct vec *pos, struct vec *dir, struct vec **lads, int numlads, double distance) { if (numlads == 0) { *((int *) 0) = 0; @@ -112,7 +120,7 @@ manifoldstepaxees(struct vec *pos, struct vec **lads, int numlads, double distan struct vec *yaxisold = estimateNormal(pos, &manifold); /* move the vector foward in euclid */ - add_scaled_vec_ip(pos, lads[0], distance); + add_scaled_vec_ip(pos, dir, distance); struct vec *yaxisnew = estimateNormal(pos, &manifold); @@ -186,25 +194,16 @@ void place(struct solid *v) { } struct vec *tdir = new_vec(v->pos.dimension); struct vec *tpos = new_vec(v->pos.dimension); - struct ray ree = (struct ray) { - .dir = tdir, - .pos = tpos, - }; + for (int d = 0; d < v->pos.dimension; d++) { for (double yee = v->pos.elements[d]; dabs(yee) > EPSILON; yee -= dsign(yee) * EPSILON) { - for (int i = 0; i < v->pos.dimension; i++) { - if (i == d) continue; - for (int j = 0; j < v->pos.dimension; j++) { - ree.dir->elements[j] = dirs[d]->elements[j]; - ree.pos->elements[j] = v->pos.elements[j]; - } - manifoldturn(&ree, dirs[i], EPSILON); - } - manifoldstep(&ree, EPSILON); + manifoldstepaxees(tpos, dirs[d], dirs, v->pos.dimension, EPSILON); } } - free_vec(ree.dir); - free_vec(ree.pos); + free_vec(tdir); + free_vec(tpos); + for (int d = 0; d < v->pos.dimension; d++) free_vec(dirs[d]); + free(dirs); } struct pixel_info diff --git a/camera.h b/camera.h index 16641a4..da16ab6 100644 --- a/camera.h +++ b/camera.h @@ -11,12 +11,13 @@ struct pixel_info march(struct ray *r, struct object *scene); Uint32 process_pixel(int, int); +struct colour solid_col(struct object *s, struct ray *r); double solid_dist(struct solid *s, struct vec *v); void place(struct solid *v); struct vec * estimateNormal(struct vec *r, struct solid *sol); void manifoldstep(struct ray *r, double distance); void manifoldturn(struct ray *r, struct vec *v, double distance); -void manifoldstepaxees(struct vec *pos, struct vec **lads, int numlads, double distance); +void manifoldstepaxees(struct vec *pos, struct vec *dir, struct vec **lads, int numlads, double distance); #endif diff --git a/main.c b/main.c index 0e5b311..85f0b5e 100644 --- a/main.c +++ b/main.c @@ -50,34 +50,29 @@ void handle_inputs(void) r.pos = new_vec(4); const double dist = 0.1; - double done = 0; struct vec ** in = malloc(sizeof(struct vec *) * 3); - in[0] = 0x0; + in[0] = camera->x; + in[1] = camera->y; + in[2] = camera->z; if (keyboardstate[SDL_SCANCODE_UP]) { - in[0] = camera->y; in[1] = camera->x; in[2] = camera->z; - done = dist; + manifoldstepaxees(camera->pos, camera->y, in, 3, dist); } if (keyboardstate[SDL_SCANCODE_DOWN]) { - in[0] = camera->y; in[1] = camera->x; in[2] = camera->z; - done = -dist; + manifoldstepaxees(camera->pos, camera->y, in, 3, -dist); } if (keyboardstate[SDL_SCANCODE_LEFT]) { - in[0] = camera->x; in[1] = camera->y; in[2] = camera->z; - done = dist; + manifoldstepaxees(camera->pos, camera->x, in, 3, dist); } if (keyboardstate[SDL_SCANCODE_RIGHT]) { - in[0] = camera->x; in[1] = camera->y; in[2] = camera->z; - done = -dist; + manifoldstepaxees(camera->pos, camera->x, in, 3, -dist); } r.dir->elements[0] = -1; if (keyboardstate[SDL_SCANCODE_ESCAPE]) { exitnow = 1; } - if (in[0]) manifoldstepaxees(camera->pos, in, 3, done); - free(in); } diff --git a/scene.c b/scene.c index e7f4c5c..f3df465 100644 --- a/scene.c +++ b/scene.c @@ -20,7 +20,7 @@ colour_function(struct ray* ray, struct object* obj) double distance = solid_dist(&(scene.objects[i].sol), ray->pos); if (distance < min) { min = distance; - scene_colour = scene.objects[i].col(ray, &scene.objects[i]); + scene_colour = solid_col(scene.objects + i, ray); } }