Browse Source

segfaultereu

place-stuff
Joel 4 years ago
parent
commit
82614cb93f
  1. 62
      camera.c
  2. 2
      camera.h
  3. 56
      main.c
  4. 2
      main.h
  5. 14
      scene.c
  6. 2
      scene.h

62
camera.c

@ -42,7 +42,7 @@ struct solid manifold = (struct solid) { @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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;
}

2
camera.h

@ -16,7 +16,7 @@ void place(struct solid *v); @@ -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

56
main.c

@ -19,7 +19,7 @@ int exitnow = 0; @@ -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) { @@ -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) @@ -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) @@ -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) {

2
main.h

@ -31,7 +31,7 @@ void sdlb_set_colour(struct colour col); @@ -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

14
scene.c

@ -41,7 +41,7 @@ distance_function(struct vec* position) @@ -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) @@ -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;
}

2
scene.h

@ -9,6 +9,6 @@ @@ -9,6 +9,6 @@
extern struct scene_objects scene;
struct object new_scene(int, struct object*);
struct object * new_scene(int, struct object*);
#endif
Loading…
Cancel
Save