From 82614cb93fa2b5580251b9789906eba782925978 Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 18 Oct 2020 10:03:55 +1000 Subject: [PATCH] segfaultereu --- camera.c | 62 ++++++++++++++++++++++++++++++++++++-------------------- camera.h | 2 +- main.c | 56 ++++++++++---------------------------------------- main.h | 2 +- scene.c | 14 ++++++------- scene.h | 2 +- 6 files changed, 61 insertions(+), 77 deletions(-) diff --git a/camera.c b/camera.c index 067fef4..84d62ed 100644 --- a/camera.c +++ b/camera.c @@ -42,7 +42,7 @@ struct solid manifold = (struct solid) { }; double solid_dist(struct solid *s, struct vec *v) { - subtract_vec_ip(v, &s->pos); + subtract_vec_ip(v, &(s->pos)); double out = s->dist(v); add_vec_ip(v, &s->pos); return out; @@ -102,32 +102,36 @@ int vectorisnan(struct vec *v) return 0; } -void -manifoldturn(struct ray *r, struct vec *v, double distance) +void +manifoldstepaxees(struct vec *pos, struct vec **lads, int numlads, double distance) { + if (numlads == 0) { + *((int *) 0) = 0; + } - struct vec *yaxisold = estimateNormal(r->pos, &manifold); + struct vec *yaxisold = estimateNormal(pos, &manifold); /* move the vector foward in euclid */ - add_scaled_vec_ip(r->pos, r->dir, distance); + add_scaled_vec_ip(pos, lads[0], distance); - struct vec *yaxisnew = estimateNormal(r->pos, &manifold); + struct vec *yaxisnew = estimateNormal(pos, &manifold); /* stick it to the manifold */ - add_scaled_vec_ip(r->pos, yaxisnew, manifold.dist(r->pos)); + add_scaled_vec_ip(pos, yaxisnew, manifold.dist(pos)); double protamtloc = acos(dot_product_vec(yaxisold,yaxisnew)); struct vec *protaxisloc = normalise_vec_ip(reyeet(yaxisold, yaxisnew)); - - struct vec *temp = copy_vec(v); - rotateaxis(temp, protaxisloc, protamtloc); /* change the direction */ - if (!vectorisnan(temp)) { - free(v->elements); - v->elements = temp->elements; - free(temp); - } else { - free_vec(temp); + for (int i = 0; i < numlads; i++) { + struct vec *temp = copy_vec(lads[i]); + rotateaxis(temp, protaxisloc, protamtloc); /* change the direction */ + if (!vectorisnan(temp)) { + free(lads[i]->elements); + lads[i]->elements = temp->elements; + free(temp); + } else { + free_vec(temp); + } } free_vec(yaxisnew); @@ -136,12 +140,9 @@ manifoldturn(struct ray *r, struct vec *v, double distance) } void -manifoldstep(struct ray *r, double distance) +manifoldturn(struct ray *r, struct vec *v, double distance) { - manifoldturn(r, r->dir, distance); - return; - struct vec *yaxisold = estimateNormal(r->pos, &manifold); /* move the vector foward in euclid */ @@ -155,13 +156,28 @@ manifoldstep(struct ray *r, double distance) double protamtloc = acos(dot_product_vec(yaxisold,yaxisnew)); struct vec *protaxisloc = normalise_vec_ip(reyeet(yaxisold, yaxisnew)); - rotateaxis(r->dir, protaxisloc, protamtloc); /* change the direction */ + + struct vec *temp = copy_vec(v); + rotateaxis(temp, protaxisloc, protamtloc); /* change the direction */ + if (!vectorisnan(temp)) { + free(v->elements); + v->elements = temp->elements; + free(temp); + } else { + free_vec(temp); + } free_vec(yaxisnew); free_vec(yaxisold); free_vec(protaxisloc); } +void +manifoldstep(struct ray *r, double distance) +{ + manifoldturn(r, r->dir, distance); +} + void place(struct solid *v) { struct vec *dirs [v->pos.dimension]; for (int d = 0; d < v->pos.dimension; d++) { @@ -201,8 +217,9 @@ march(struct ray *r, struct object *scene) int fligs = 0; struct colour out = (struct colour) {.sp = CS_RGB}; for (i = 0; (i < MAX_ITERATIONS) && (travel_dist < DRAW_DIST); i++) { - //scene_dist = scene->sol.dist(&(r->pos)); + /* calculate the distance to the scene */ scene_dist = solid_dist(&(scene->sol), r->pos); + if (scene_dist < EPSILON) { /* we've hit an object */ out = scene->col(r, scene); fligs |= 0x01; @@ -212,6 +229,7 @@ march(struct ray *r, struct object *scene) if (min_dist > scene_dist) min_dist = scene_dist; + /* step foward the calculated distance */ manifoldstep(r, scene_dist); travel_dist += scene_dist; } diff --git a/camera.h b/camera.h index 4582344..16641a4 100644 --- a/camera.h +++ b/camera.h @@ -16,7 +16,7 @@ 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); #endif diff --git a/main.c b/main.c index 9f7f7a7..b7c5071 100644 --- a/main.c +++ b/main.c @@ -19,7 +19,7 @@ int exitnow = 0; SDL_Renderer * ren; Uint32 pixels[B_INTERNAL_HEIGHT][B_INTERNAL_WIDTH]; -struct object scene_object; +struct object *scene_object; struct camera *camera; struct SDL_Window* make_window(void) { @@ -34,6 +34,8 @@ struct SDL_Window* make_window(void) { SDL_WINDOW_RESIZABLE); } + + void handle_inputs(void) { /* this is so broken it leaks memory everywhere and crashes and idek why @@ -50,55 +52,22 @@ void handle_inputs(void) const double dist = 0.1; double done = 0; - if (keyboardstate[SDL_SCANCODE_UP]) { - struct ray cameraray = {.pos = copy_vec(camera->pos), .dir = camera->y}; - manifoldturn(&cameraray, camera->x, dist); - free_vec(cameraray.pos); - - cameraray.pos = copy_vec(camera->pos); - manifoldturn(&cameraray, camera->z, dist); + struct vec * in [3]; - cameraray.pos = camera->pos; - manifoldstep(&cameraray, dist); + if (keyboardstate[SDL_SCANCODE_UP]) { + in[0] = camera->y; in[1] = camera->x; in[2] = camera->z; done = dist; } if (keyboardstate[SDL_SCANCODE_DOWN]) { - struct ray cameraray = {.pos = copy_vec(camera->pos), .dir = camera->y}; - manifoldturn(&cameraray, camera->x, dist); - - free_vec(cameraray.pos); - cameraray.pos = copy_vec(camera->pos); - manifoldturn(&cameraray, camera->z, -dist); - - free_vec(cameraray.pos); - cameraray.pos = camera->pos; - manifoldstep(&cameraray, -dist); + in[0] = camera->y; in[1] = camera->x; in[2] = camera->z; done = -dist; } if (keyboardstate[SDL_SCANCODE_LEFT]) { - struct ray cameraray = {.pos = copy_vec(camera->pos), .dir = camera->x}; - manifoldturn(&cameraray, camera->z, dist); - - free_vec(cameraray.pos); - cameraray.pos = copy_vec(camera->pos); - - manifoldturn(&cameraray, camera->y, dist); - free_vec(cameraray.pos); - cameraray.pos = camera->pos; - manifoldstep(&cameraray, -dist); + in[0] = camera->x; in[1] = camera->y; in[2] = camera->z; done = -dist; } if (keyboardstate[SDL_SCANCODE_RIGHT]) { - struct ray cameraray = {.pos = copy_vec(camera->pos), .dir = camera->x}; - manifoldturn(&cameraray, camera->z, dist); - - free_vec(cameraray.pos); - cameraray.pos = copy_vec(camera->pos); - - manifoldturn(&cameraray, camera->y, dist); - free_vec(cameraray.pos); - cameraray.pos = camera->pos; - manifoldstep(&cameraray, dist); + in[0] = camera->x; in[1] = camera->y; in[2] = camera->z; done = -dist; } r.dir->elements[0] = -1; @@ -106,13 +75,10 @@ void handle_inputs(void) exitnow = 1; } - if (fabs(done) > 0.00001) - manifoldstep(&r, done); + manifoldstepaxees(camera->pos, in, 3, done); - free_vec(r.dir); - free_vec(r.pos); return; -}; +} int input_loop(void *ptr) { diff --git a/main.h b/main.h index 1aca2d0..160eab7 100644 --- a/main.h +++ b/main.h @@ -31,7 +31,7 @@ void sdlb_set_colour(struct colour col); void sdlb_draw_col_pixel(struct colour col, int x, int y); -extern struct object scene_object; +extern struct object *scene_object; extern int keyboardstate[322]; // 322 is the number of SDLK_DOWN events extern struct camera *camera; #endif diff --git a/scene.c b/scene.c index 5662f3b..e7f4c5c 100644 --- a/scene.c +++ b/scene.c @@ -41,7 +41,7 @@ distance_function(struct vec* position) return min; } -struct object +struct object * new_scene(int num_scene_objects, struct object* scene_objects) { scene.num_objects = num_scene_objects; @@ -51,13 +51,13 @@ new_scene(int num_scene_objects, struct object* scene_objects) // place(&(scene.objects[i].sol)); // } - struct object scene_rep; - scene_rep.sol.dist = distance_function; - scene_rep.sol.op = B_ADD; - scene_rep.sol.rotation = 0; - scene_rep.sol.scale = 1; + struct object *scene_rep = malloc(sizeof(struct object)); + scene_rep->sol.dist = distance_function; + scene_rep->sol.op = B_ADD; + scene_rep->sol.rotation = 0; + scene_rep->sol.scale = 1; - scene_rep.col = colour_function; + scene_rep->col = colour_function; return scene_rep; } diff --git a/scene.h b/scene.h index 971c703..7770d1b 100644 --- a/scene.h +++ b/scene.h @@ -9,6 +9,6 @@ extern struct scene_objects scene; -struct object new_scene(int, struct object*); +struct object * new_scene(int, struct object*); #endif \ No newline at end of file