diff options
Diffstat (limited to 'libdimension')
-rw-r--r-- | libdimension/dimension/object.h | 1 | ||||
-rw-r--r-- | libdimension/object.c | 18 | ||||
-rw-r--r-- | libdimension/objects.c | 20 | ||||
-rw-r--r-- | libdimension/raytrace.c | 3 |
4 files changed, 32 insertions, 10 deletions
diff --git a/libdimension/dimension/object.h b/libdimension/dimension/object.h index fefb061..c70452d 100644 --- a/libdimension/dimension/object.h +++ b/libdimension/dimension/object.h @@ -35,6 +35,7 @@ typedef struct { const dmnsn_texture *texture; } dmnsn_intersection; +/* Intersection allocation cannot fail */ dmnsn_intersection *dmnsn_new_intersection(); void dmnsn_delete_intersection(dmnsn_intersection *intersection); diff --git a/libdimension/object.c b/libdimension/object.c index 6b248ff..f10d53d 100644 --- a/libdimension/object.c +++ b/libdimension/object.c @@ -21,6 +21,24 @@ #include "dimension.h" #include <stdlib.h> /* For malloc */ +/* Allocate an intersection - cannot fail */ +dmnsn_intersection * +dmnsn_new_intersection() +{ + dmnsn_intersection *intersection = malloc(sizeof(dmnsn_intersection)); + if (!intersection) { + dmnsn_error(DMNSN_SEVERITY_HIGH, "Couldn't allocate an intersection object."); + } + return intersection; +} + +/* Free an intersection */ +void +dmnsn_delete_intersection(dmnsn_intersection *intersection) +{ + free(intersection); +} + /* Allocate a dummy object */ dmnsn_object * dmnsn_new_object() diff --git a/libdimension/objects.c b/libdimension/objects.c index 780c06b..3c772d1 100644 --- a/libdimension/objects.c +++ b/libdimension/objects.c @@ -100,7 +100,7 @@ dmnsn_new_cube() dmnsn_object *cube = dmnsn_new_object(); if (cube) { cube->intersection_fn = &dmnsn_cube_intersection_fn; - cube->inside_fn = &dmnsn_cube_inside_fn; + cube->inside_fn = &dmnsn_cube_inside_fn; } return cube; } @@ -126,7 +126,7 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) /* x = 1.0 */ t_temp = (1.0 - line.x0.x)/line.n.x; - p = dmnsn_line_point(line, t); + p = dmnsn_line_point(line, t_temp); if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0 && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; @@ -136,16 +136,16 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) if (line.n.y != 0.0) { /* y = -1.0 */ t_temp = (-1.0 - line.x0.y)/line.n.y; - p = dmnsn_line_point(line, t); - if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0 + p = dmnsn_line_point(line, t_temp); + if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0 && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; } /* y = 1.0 */ t_temp = (1.0 - line.x0.y)/line.n.y; - p = dmnsn_line_point(line, t); - if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0 + p = dmnsn_line_point(line, t_temp); + if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0 && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; } @@ -154,16 +154,16 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) if (line.n.z != 0.0) { /* z = -1.0 */ t_temp = (-1.0 - line.x0.z)/line.n.z; - p = dmnsn_line_point(line, t); - if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0 + p = dmnsn_line_point(line, t_temp); + if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0 && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; } /* z = 1.0 */ t_temp = (1.0 - line.x0.z)/line.n.z; - p = dmnsn_line_point(line, t); - if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0 + p = dmnsn_line_point(line, t_temp); + if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0 && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; } diff --git a/libdimension/raytrace.c b/libdimension/raytrace.c index 75e857c..10f400d 100644 --- a/libdimension/raytrace.c +++ b/libdimension/raytrace.c @@ -248,6 +248,9 @@ dmnsn_raytrace_shoot(dmnsn_scene *scene, dmnsn_color color, if (intersection) { color = dmnsn_color_from_XYZ(dmnsn_whitepoint); } + + /* Delete the intersection */ + dmnsn_delete_intersection(intersection); } return color; |