Browse Source

woooooo

place-stuff
Joel 4 years ago
parent
commit
2aaabf36a9
  1. 33
      camera.c
  2. 3
      camera.h
  3. 19
      main.c
  4. 2
      scene.c

33
camera.c

@ -41,6 +41,14 @@ struct solid manifold = (struct solid) { @@ -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) @@ -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 @@ -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) { @@ -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

3
camera.h

@ -11,12 +11,13 @@ @@ -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

19
main.c

@ -50,34 +50,29 @@ void handle_inputs(void) @@ -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);
}

2
scene.c

@ -20,7 +20,7 @@ colour_function(struct ray* ray, struct object* obj) @@ -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);
}
}

Loading…
Cancel
Save