summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libdimension/dimension.h22
-rw-r--r--libdimension/dimension/common.h30
-rw-r--r--libdimension/dimension/geometry.h74
-rw-r--r--libdimension/dimension/math.h99
-rw-r--r--libdimension/polynomial.c8
5 files changed, 139 insertions, 94 deletions
diff --git a/libdimension/dimension.h b/libdimension/dimension.h
index 71c68fa..fc3a681 100644
--- a/libdimension/dimension.h
+++ b/libdimension/dimension.h
@@ -20,25 +20,21 @@
/**
* @file
- * The main \#include file for libdimension. This file declares all public
- * functions and types used by the Dimension library. You should never attempt
- * to include any of the component headers in the dimension/ subdirectory
- * directly; only this file.
+ * The main \#include file for the Dimension library. This file declares all
+ * of its public functions and types.
*/
/**
* @mainpage libdimension - A library for photo-realistic 3-D rendering
*
* The Dimension library (libdimension) is the ray-tracing library that handles
- * all rendering-related tasks for Dimension. It is written in C and designed
- * with performance and concurrency in mind. It is also generic enough to be
- * used for applications other than Dimension, though that is its primary
- * purpose.
+ * all rendering-related tasks for Dimension.
*/
#ifndef DIMENSION_H
#define DIMENSION_H
+/* Include compiler.h first for DMNSN_CXX */
#include <dimension/compiler.h>
#if DMNSN_CXX
@@ -46,15 +42,8 @@
extern "C" {
#endif
-/* Common types */
-
-/**
- * Generic callback type.
- * @param[in,out] ptr A pointer to an object to act on.
- */
-typedef void dmnsn_callback_fn(void *ptr);
-
/* Include all the libdimension headers */
+#include <dimension/common.h>
#include <dimension/error.h>
#include <dimension/malloc.h>
#include <dimension/pool.h>
@@ -62,6 +51,7 @@ typedef void dmnsn_callback_fn(void *ptr);
#include <dimension/dictionary.h>
#include <dimension/future.h>
#include <dimension/timer.h>
+#include <dimension/math.h>
#include <dimension/geometry.h>
#include <dimension/polynomial.h>
#include <dimension/color.h>
diff --git a/libdimension/dimension/common.h b/libdimension/dimension/common.h
new file mode 100644
index 0000000..15bafd8
--- /dev/null
+++ b/libdimension/dimension/common.h
@@ -0,0 +1,30 @@
+/*************************************************************************
+ * Copyright (C) 2014 Tavian Barnes <tavianator@tavianator.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/>. *
+ *************************************************************************/
+
+/**
+ * @file
+ * Common types and utilities.
+ */
+
+/**
+ * Generic callback type.
+ * @param[in,out] ptr A pointer to an object to act on.
+ */
+typedef void dmnsn_callback_fn(void *ptr);
diff --git a/libdimension/dimension/geometry.h b/libdimension/dimension/geometry.h
index 811f591..2ea10ca 100644
--- a/libdimension/dimension/geometry.h
+++ b/libdimension/dimension/geometry.h
@@ -82,9 +82,6 @@ typedef struct dmnsn_bounding_box {
/* Constants */
-/** The smallest value considered non-zero by some numerical algorithms. */
-#define dmnsn_epsilon 1.0e-10
-
/** The zero vector. */
static const dmnsn_vector dmnsn_zero = { 0.0, 0.0, 0.0 };
/** The x vector. */
@@ -94,66 +91,6 @@ static const dmnsn_vector dmnsn_y = { 0.0, 1.0, 0.0 };
/** The z vector. */
static const dmnsn_vector dmnsn_z = { 0.0, 0.0, 1.0 };
-/**
- * @def DMNSN_INFINITY
- * Expands to floating-point infinity.
- */
-#if defined(INFINITY) || DMNSN_C99
- #define DMNSN_INFINITY INFINITY
-#else
- #define DMNSN_INFINITY HUGE_VAL
-#endif
-
-/* Scalar functions */
-
-/** Find the minimum of two scalars. */
-DMNSN_INLINE double
-dmnsn_min(double a, double b)
-{
- return a < b ? a : b;
-}
-
-/** Find the maximum of two scalars. */
-DMNSN_INLINE double
-dmnsn_max(double a, double b)
-{
- return a > b ? a : b;
-}
-
-/** Clamp a value to an interval. */
-DMNSN_INLINE double
-dmnsn_clamp(double n, double min, double max)
-{
- return dmnsn_min(dmnsn_max(n, min), max);
-}
-
-/** Convert degrees to radians. */
-DMNSN_INLINE double
-dmnsn_radians(double degrees)
-{
- return degrees*atan(1.0)/45.0;
-}
-
-/** Convert radians to degrees. */
-DMNSN_INLINE double
-dmnsn_degrees(double radians)
-{
- return radians*45.0/atan(1.0);
-}
-
-/** Return the sign of a scalar. */
-DMNSN_INLINE int
-dmnsn_sign(double n)
-{
- if (n > 0.0) {
- return 1;
- } else if (n < 0.0) {
- return -1;
- } else {
- return 0;
- }
-}
-
/* Shorthand for vector/matrix construction */
/** Construct a new vector. */
@@ -526,17 +463,6 @@ dmnsn_bounding_box_swallow(dmnsn_bounding_box box, dmnsn_vector point)
return ret;
}
-/** Return whether a scalar is NaN. */
-DMNSN_INLINE bool
-dmnsn_isnan(double n)
-{
-#if DMNSN_C99
- return isnan(n);
-#else
- return n != n;
-#endif
-}
-
/** Return whether a vector contains any NaN components. */
DMNSN_INLINE bool
dmnsn_vector_isnan(dmnsn_vector v)
diff --git a/libdimension/dimension/math.h b/libdimension/dimension/math.h
new file mode 100644
index 0000000..597be36
--- /dev/null
+++ b/libdimension/dimension/math.h
@@ -0,0 +1,99 @@
+/*************************************************************************
+ * Copyright (C) 2014 Tavian Barnes <tavianator@tavianator.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/>. *
+ *************************************************************************/
+
+/**
+ * @file
+ * Useful math functions.
+ */
+
+#include <math.h>
+#include <stdbool.h>
+
+/** The smallest value considered non-zero by some numerical algorithms. */
+#define dmnsn_epsilon 1.0e-10
+
+/**
+ * @def DMNSN_INFINITY
+ * Expands to floating-point infinity.
+ */
+#if defined(INFINITY) || DMNSN_C99
+ #define DMNSN_INFINITY INFINITY
+#else
+ #define DMNSN_INFINITY HUGE_VAL
+#endif
+
+/** Find the minimum of two values. */
+DMNSN_INLINE double
+dmnsn_min(double a, double b)
+{
+ return a < b ? a : b;
+}
+
+/** Find the maximum of two values. */
+DMNSN_INLINE double
+dmnsn_max(double a, double b)
+{
+ return a > b ? a : b;
+}
+
+/** Clamp a value to an interval. */
+DMNSN_INLINE double
+dmnsn_clamp(double n, double min, double max)
+{
+ return dmnsn_min(dmnsn_max(n, min), max);
+}
+
+/** Convert degrees to radians. */
+DMNSN_INLINE double
+dmnsn_radians(double degrees)
+{
+ return degrees*(atan(1.0)/45.0);
+}
+
+/** Convert radians to degrees. */
+DMNSN_INLINE double
+dmnsn_degrees(double radians)
+{
+ return radians*(45.0/atan(1.0));
+}
+
+/** Signum function: return the sign of a value. */
+DMNSN_INLINE int
+dmnsn_sgn(double n)
+{
+ if (n > 0.0) {
+ return 1;
+ } else if (n < 0.0) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+/** Return whether a value is NaN. */
+DMNSN_INLINE bool
+dmnsn_isnan(double n)
+{
+#if DMNSN_C99
+ return isnan(n);
+#else
+ return n != n;
+#endif
+}
diff --git a/libdimension/polynomial.c b/libdimension/polynomial.c
index 23b96d1..609364a 100644
--- a/libdimension/polynomial.c
+++ b/libdimension/polynomial.c
@@ -125,9 +125,9 @@ dmnsn_descartes_bound(const double poly[], size_t degree)
// Find the number of sign changes in p[]
size_t changes = 0;
- int lastsign = dmnsn_sign(p[0]);
+ int lastsign = dmnsn_sgn(p[0]);
for (size_t i = 1; changes <= 1 && i <= degree; ++i) {
- int sign = dmnsn_sign(p[i]);
+ int sign = dmnsn_sgn(p[i]);
if (sign != 0 && sign != lastsign) {
++changes;
lastsign = sign;
@@ -227,7 +227,7 @@ dmnsn_bisect_root(const double poly[], size_t degree, double min, double max)
for (size_t i = 0; i < DMNSN_BISECT_ITERATIONS; ++i) {
mid = (min*evmax - max*evmin)/(evmax - evmin);
evmid = dmnsn_polynomial_evaluate(poly, degree, mid);
- int sign = dmnsn_sign(evmid);
+ int sign = dmnsn_sgn(evmid);
if ((fabs(evmid) < fabs(mid)*dmnsn_epsilon
// This condition improves stability when one of the bounds is close to
@@ -250,7 +250,7 @@ dmnsn_bisect_root(const double poly[], size_t degree, double min, double max)
evmin = evmax;
max = mid;
evmax = evmid;
- } else if (sign == dmnsn_sign(evmax)) {
+ } else if (sign == dmnsn_sgn(evmax)) {
max = mid;
evmax = evmid;
if (sign == lastsign) {