summaryrefslogtreecommitdiffstats
path: root/libdimension
diff options
context:
space:
mode:
Diffstat (limited to 'libdimension')
-rw-r--r--libdimension/Makefile.am10
-rw-r--r--libdimension/cube.c94
-rw-r--r--libdimension/dimension.h5
-rw-r--r--libdimension/dimension/cube.h31
-rw-r--r--libdimension/dimension/objects.h (renamed from libdimension/dimension/sphere.h)13
-rw-r--r--libdimension/objects.c (renamed from libdimension/sphere.c)103
6 files changed, 118 insertions, 138 deletions
diff --git a/libdimension/Makefile.am b/libdimension/Makefile.am
index 125ad77..8278d64 100644
--- a/libdimension/Makefile.am
+++ b/libdimension/Makefile.am
@@ -22,15 +22,14 @@ nobase_include_HEADERS = dimension.h \
dimension/camera.h \
dimension/canvas.h \
dimension/color.h \
- dimension/cube.h \
dimension/error.h \
dimension/geometry.h \
dimension/png.h \
dimension/progress.h \
dimension/object.h \
+ dimension/objects.h \
dimension/raytrace.h \
- dimension/scene.h \
- dimension/sphere.h
+ dimension/scene.h
lib_LTLIBRARIES = libdimension.la
@@ -39,15 +38,14 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \
camera.c \
canvas.c \
color.c \
- cube.c \
error.c \
geometry.c \
inlines.c \
png.c \
progress.c \
object.c \
+ objects.c \
raytrace.c \
- scene.c \
- sphere.c
+ scene.c
libdimension_la_LDFLAGS = -version-info 0:0:0
libdimension_la_LIBADD = -lm -lpthread -lpng
diff --git a/libdimension/cube.c b/libdimension/cube.c
index bb71d0b..d8a1236 100644
--- a/libdimension/cube.c
+++ b/libdimension/cube.c
@@ -21,97 +21,3 @@
#include "dimension.h"
#include <stdlib.h> /* For malloc */
#include <math.h> /* For sqrt */
-
-static dmnsn_array *dmnsn_cube_intersections_fn(const dmnsn_object *cube,
- dmnsn_line line);
-static int dmnsn_cube_inside_fn(const dmnsn_object *cube,
- dmnsn_vector point);
-
-/* Allocate a new cube object */
-dmnsn_object *
-dmnsn_new_cube()
-{
- dmnsn_object *cube = dmnsn_new_object();
- if (cube) {
- cube->intersections_fn = &dmnsn_cube_intersections_fn;
- cube->inside_fn = &dmnsn_cube_inside_fn;
- }
- return cube;
-}
-
-/* Delete a cube */
-void
-dmnsn_delete_cube(dmnsn_object *cube)
-{
- dmnsn_delete_object(cube);
-}
-
-/* Intersections callback for a cube */
-static dmnsn_array *
-dmnsn_cube_intersections_fn(const dmnsn_object *cube, dmnsn_line line)
-{
- double t;
- dmnsn_vector p;
- dmnsn_array *array = dmnsn_new_array(sizeof(double));
-
- /* Six ray-plane intersection tests (x, y, z) = +/- 1.0 */
-
- if (line.n.x != 0.0) {
- /* x = -1.0 */
- t = (-1.0 - line.x0.x)/line.n.x;
- p = dmnsn_line_point(line, t);
- if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
- dmnsn_array_push(array, &t);
- }
-
- /* x = 1.0 */
- t = (1.0 - line.x0.x)/line.n.x;
- p = dmnsn_line_point(line, t);
- if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
- dmnsn_array_push(array, &t);
- }
- }
-
- if (line.n.y != 0.0) {
- /* y = -1.0 */
- t = (-1.0 - line.x0.y)/line.n.y;
- p = dmnsn_line_point(line, t);
- if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
- dmnsn_array_push(array, &t);
- }
-
- /* y = 1.0 */
- t = (1.0 - line.x0.y)/line.n.y;
- p = dmnsn_line_point(line, t);
- if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
- dmnsn_array_push(array, &t);
- }
- }
-
- if (line.n.z != 0.0) {
- /* z = -1.0 */
- t = (-1.0 - line.x0.z)/line.n.z;
- p = dmnsn_line_point(line, t);
- if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0) {
- dmnsn_array_push(array, &t);
- }
-
- /* z = 1.0 */
- t = (1.0 - line.x0.z)/line.n.z;
- p = dmnsn_line_point(line, t);
- if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0) {
- dmnsn_array_push(array, &t);
- }
- }
-
- return array;
-}
-
-/* Inside callback for a cube */
-static int
-dmnsn_cube_inside_fn(const dmnsn_object *cube, dmnsn_vector point)
-{
- return point.x > -1.0 && point.x < 1.0
- && point.y > -1.0 && point.y < 1.0
- && point.z > -1.0 && point.z < 1.0;
-}
diff --git a/libdimension/dimension.h b/libdimension/dimension.h
index 4157f8b..327638f 100644
--- a/libdimension/dimension.h
+++ b/libdimension/dimension.h
@@ -57,13 +57,12 @@ extern "C" {
#include <dimension/geometry.h>
#include <dimension/color.h>
#include <dimension/canvas.h>
+#include <dimension/png.h>
#include <dimension/object.h>
- #include <dimension/sphere.h>
- #include <dimension/cube.h>
+#include <dimension/objects.h>
#include <dimension/camera.h>
#include <dimension/scene.h>
#include <dimension/raytrace.h>
-#include <dimension/png.h>
#ifdef __cplusplus
}
diff --git a/libdimension/dimension/cube.h b/libdimension/dimension/cube.h
deleted file mode 100644
index e55ec74..0000000
--- a/libdimension/dimension/cube.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*************************************************************************
- * Copyright (C) 2008 Tavian Barnes <tavianator@gmail.com> *
- * *
- * This file is part of The Dimension Library. *
- * *
- * The Dimension Library is free software; you can redistribute it and/ *
- * or modify it under the terms of the GNU Lesser General Public License *
- * as published by the Free Software Foundation; either version 3 of the *
- * License, or (at your option) any later version. *
- * *
- * The Dimension Library is distributed in the hope that it will be *
- * useful, but WITHOUT ANY WARRANTY; without even the implied warranty *
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
- * Lesser General Public License for more details. *
- * *
- * You should have received a copy of the GNU Lesser General Public *
- * License along with this program. If not, see *
- * <http://www.gnu.org/licenses/>. *
- *************************************************************************/
-
-/*
- * A cube, axis-aligned, from (-1, -1, -1) to (1, 1, 1)
- */
-
-#ifndef DIMENSION_CUBE_H
-#define DIMENSION_CUBE_H
-
-dmnsn_object *dmnsn_new_cube();
-void dmnsn_delete_cube(dmnsn_object *cube);
-
-#endif /* DIMENSION_CUBE_H */
diff --git a/libdimension/dimension/sphere.h b/libdimension/dimension/objects.h
index d7a8f54..4eb8fe8 100644
--- a/libdimension/dimension/sphere.h
+++ b/libdimension/dimension/objects.h
@@ -19,13 +19,18 @@
*************************************************************************/
/*
- * A sphere object, of radius 1, centered at the origin.
+ * Custom objects.
*/
-#ifndef DIMENSION_SPHERE_H
-#define DIMENSION_SPHERE_H
+#ifndef DIMENSION_OBJECTS_H
+#define DIMENSION_OBJECTS_H
+/* A sphere object, of radius 1, centered at the origin. */
dmnsn_object *dmnsn_new_sphere();
void dmnsn_delete_sphere(dmnsn_object *sphere);
-#endif /* DIMENSION_SPHERE_H */
+/* A cube, axis-aligned, from (-1, -1, -1) to (1, 1, 1) */
+dmnsn_object *dmnsn_new_cube();
+void dmnsn_delete_cube(dmnsn_object *cube);
+
+#endif /* DIMENSION_OBJECTS_H */
diff --git a/libdimension/sphere.c b/libdimension/objects.c
index f6950dc..b5cf64c 100644
--- a/libdimension/sphere.c
+++ b/libdimension/objects.c
@@ -22,6 +22,10 @@
#include <stdlib.h> /* For malloc */
#include <math.h> /* For sqrt */
+/*
+ * Sphere
+ */
+
/* Sphere object callbacks */
static dmnsn_array *dmnsn_sphere_intersections_fn(const dmnsn_object *sphere,
dmnsn_line line);
@@ -76,3 +80,102 @@ dmnsn_sphere_inside_fn(const dmnsn_object *sphere, dmnsn_vector point)
{
return point.x*point.x + point.y*point.y + point.z*point.z < 1.0;
}
+
+/*
+ * Cube
+ */
+
+/* Cube callbacks */
+static dmnsn_array *dmnsn_cube_intersections_fn(const dmnsn_object *cube,
+ dmnsn_line line);
+static int dmnsn_cube_inside_fn(const dmnsn_object *cube,
+ dmnsn_vector point);
+
+/* Allocate a new cube object */
+dmnsn_object *
+dmnsn_new_cube()
+{
+ dmnsn_object *cube = dmnsn_new_object();
+ if (cube) {
+ cube->intersections_fn = &dmnsn_cube_intersections_fn;
+ cube->inside_fn = &dmnsn_cube_inside_fn;
+ }
+ return cube;
+}
+
+/* Delete a cube */
+void
+dmnsn_delete_cube(dmnsn_object *cube)
+{
+ dmnsn_delete_object(cube);
+}
+
+/* Intersections callback for a cube */
+static dmnsn_array *
+dmnsn_cube_intersections_fn(const dmnsn_object *cube, dmnsn_line line)
+{
+ double t;
+ dmnsn_vector p;
+ dmnsn_array *array = dmnsn_new_array(sizeof(double));
+
+ /* Six ray-plane intersection tests (x, y, z) = +/- 1.0 */
+
+ if (line.n.x != 0.0) {
+ /* x = -1.0 */
+ t = (-1.0 - line.x0.x)/line.n.x;
+ p = dmnsn_line_point(line, t);
+ if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
+ dmnsn_array_push(array, &t);
+ }
+
+ /* x = 1.0 */
+ t = (1.0 - line.x0.x)/line.n.x;
+ p = dmnsn_line_point(line, t);
+ if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
+ dmnsn_array_push(array, &t);
+ }
+ }
+
+ if (line.n.y != 0.0) {
+ /* y = -1.0 */
+ t = (-1.0 - line.x0.y)/line.n.y;
+ p = dmnsn_line_point(line, t);
+ if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
+ dmnsn_array_push(array, &t);
+ }
+
+ /* y = 1.0 */
+ t = (1.0 - line.x0.y)/line.n.y;
+ p = dmnsn_line_point(line, t);
+ if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0) {
+ dmnsn_array_push(array, &t);
+ }
+ }
+
+ if (line.n.z != 0.0) {
+ /* z = -1.0 */
+ t = (-1.0 - line.x0.z)/line.n.z;
+ p = dmnsn_line_point(line, t);
+ if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0) {
+ dmnsn_array_push(array, &t);
+ }
+
+ /* z = 1.0 */
+ t = (1.0 - line.x0.z)/line.n.z;
+ p = dmnsn_line_point(line, t);
+ if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0) {
+ dmnsn_array_push(array, &t);
+ }
+ }
+
+ return array;
+}
+
+/* Inside callback for a cube */
+static int
+dmnsn_cube_inside_fn(const dmnsn_object *cube, dmnsn_vector point)
+{
+ return point.x > -1.0 && point.x < 1.0
+ && point.y > -1.0 && point.y < 1.0
+ && point.z > -1.0 && point.z < 1.0;
+}