summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2009-07-01 04:44:51 +0000
committerTavian Barnes <tavianator@gmail.com>2009-07-01 04:44:51 +0000
commite957408cb8cd200696a081b4f5c749c5294110ec (patch)
tree3777bb33f7c49786eaced2a50f8196e295428647
parent5dcc62e9f198094e3fd49be1847871853c1449bc (diff)
downloaddimension-e957408cb8cd200696a081b4f5c749c5294110ec.tar.xz
Sphere and cube C++ wrappers.
-rw-r--r--libdimension/Makefile.am10
-rw-r--r--libdimension/cube.c94
-rw-r--r--libdimension/dimension.h5
-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
-rw-r--r--libdimensionxx/Makefile.am2
-rw-r--r--libdimensionxx/dimensionxx.hpp3
-rw-r--r--libdimensionxx/dimensionxx/cube.hpp (renamed from libdimension/dimension/cube.h)15
-rw-r--r--libdimensionxx/dimensionxx/object.hpp2
-rw-r--r--libdimensionxx/dimensionxx/objects.hpp45
-rw-r--r--libdimensionxx/object.cpp5
-rw-r--r--libdimensionxx/objects.cpp54
12 files changed, 234 insertions, 117 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/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;
+}
diff --git a/libdimensionxx/Makefile.am b/libdimensionxx/Makefile.am
index 6b53858..b35ec97 100644
--- a/libdimensionxx/Makefile.am
+++ b/libdimensionxx/Makefile.am
@@ -24,6 +24,7 @@ nobase_include_HEADERS = dimensionxx.hpp \
dimensionxx/cookie.hpp \
dimensionxx/geometry.hpp \
dimensionxx/object.hpp \
+ dimensionxx/objects.hpp \
dimensionxx/png.hpp \
dimensionxx/progress.hpp
@@ -36,6 +37,7 @@ libdimensionxx_la_SOURCES = $(nobase_include_HEADERS) \
color.cpp \
error.cpp \
object.cpp \
+ objects.cpp \
png.cpp \
progress.cpp
diff --git a/libdimensionxx/dimensionxx.hpp b/libdimensionxx/dimensionxx.hpp
index d8df782..c413d87 100644
--- a/libdimensionxx/dimensionxx.hpp
+++ b/libdimensionxx/dimensionxx.hpp
@@ -31,7 +31,8 @@
#include <dimensionxx/geometry.hpp>
#include <dimensionxx/color.hpp>
#include <dimensionxx/canvas.hpp>
-#include <dimensionxx/object.hpp>
#include <dimensionxx/png.hpp>
+#include <dimensionxx/object.hpp>
+#include <dimensionxx/objects.hpp>
#endif /* DIMENSIONXX_HPP */
diff --git a/libdimension/dimension/cube.h b/libdimensionxx/dimensionxx/cube.hpp
index e55ec74..9452c88 100644
--- a/libdimension/dimension/cube.h
+++ b/libdimensionxx/dimensionxx/cube.hpp
@@ -18,14 +18,13 @@
* <http://www.gnu.org/licenses/>. *
*************************************************************************/
-/*
- * A cube, axis-aligned, from (-1, -1, -1) to (1, 1, 1)
- */
+// Cube wrapper
-#ifndef DIMENSION_CUBE_H
-#define DIMENSION_CUBE_H
+#ifndef DIMENSIONXX_CUBE_HPP
+#define DIMENSIONXX_CUBE_HPP
-dmnsn_object *dmnsn_new_cube();
-void dmnsn_delete_cube(dmnsn_object *cube);
+namespace Dimension
+{
+}
-#endif /* DIMENSION_CUBE_H */
+#endif /* DIMENSIONXX_CUBE_HPP */
diff --git a/libdimensionxx/dimensionxx/object.hpp b/libdimensionxx/dimensionxx/object.hpp
index 40dcb25..6eaca83 100644
--- a/libdimensionxx/dimensionxx/object.hpp
+++ b/libdimensionxx/dimensionxx/object.hpp
@@ -43,7 +43,7 @@ namespace Dimension
// No-op
Object();
// Wrap an existing object.
- explicit Object(dmnsn_object* object) : m_object(object) { }
+ explicit Object(dmnsn_object* object);
dmnsn_object* m_object;
diff --git a/libdimensionxx/dimensionxx/objects.hpp b/libdimensionxx/dimensionxx/objects.hpp
new file mode 100644
index 0000000..5d5fe46
--- /dev/null
+++ b/libdimensionxx/dimensionxx/objects.hpp
@@ -0,0 +1,45 @@
+/*************************************************************************
+ * 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/>. *
+ *************************************************************************/
+
+// Object wrappers.
+
+#ifndef DIMENSIONXX_OBJECTS_HPP
+#define DIMENSIONXX_OBJECTS_HPP
+
+namespace Dimension
+{
+ // Sphere object
+ class Sphere : public Object
+ {
+ public:
+ Sphere();
+ virtual ~Sphere();
+ };
+
+ // A cube
+ class Cube : public Object
+ {
+ public:
+ Cube();
+ virtual ~Cube();
+ };
+}
+
+#endif /* DIMENSIONXX_OBJECTS_HPP */
diff --git a/libdimensionxx/object.cpp b/libdimensionxx/object.cpp
index 33aeb85..61a887c 100644
--- a/libdimensionxx/object.cpp
+++ b/libdimensionxx/object.cpp
@@ -58,6 +58,11 @@ namespace Dimension
Object::Object()
{ }
+ // Protected manual constructor
+ Object::Object(dmnsn_object *object)
+ : m_object(object)
+ { }
+
// Custom object callbacks
namespace {
dmnsn_array *
diff --git a/libdimensionxx/objects.cpp b/libdimensionxx/objects.cpp
new file mode 100644
index 0000000..1a63494
--- /dev/null
+++ b/libdimensionxx/objects.cpp
@@ -0,0 +1,54 @@
+/*************************************************************************
+ * 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/>. *
+ *************************************************************************/
+
+#include "dimensionxx.hpp"
+
+namespace Dimension
+{
+ // Create a sphere
+ Sphere::Sphere()
+ : Object(dmnsn_new_sphere())
+ {
+ if (!m_object) {
+ throw Dimension_Error("Failed to allocate sphere.");
+ }
+ }
+
+ // Delete a sphere
+ Sphere::~Sphere()
+ {
+ dmnsn_delete_sphere(m_object);
+ }
+
+ // Create a cube
+ Cube::Cube()
+ : Object(dmnsn_new_cube())
+ {
+ if (!m_object) {
+ throw Dimension_Error("Failed to allocate sphere.");
+ }
+ }
+
+ // Delete a sphere
+ Cube::~Cube()
+ {
+ dmnsn_delete_cube(m_object);
+ }
+}