summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libdimension/Makefile.am4
-rw-r--r--libdimension/dimension.h4
-rw-r--r--libdimension/dimension/finish.h103
-rw-r--r--libdimension/dimension/pigment.h83
-rw-r--r--libdimension/dimension/texture.h140
-rw-r--r--libdimension/finish.c51
-rw-r--r--libdimension/pigment.c62
-rw-r--r--libdimension/texture.c64
8 files changed, 307 insertions, 204 deletions
diff --git a/libdimension/Makefile.am b/libdimension/Makefile.am
index 049381d..65f41d2 100644
--- a/libdimension/Makefile.am
+++ b/libdimension/Makefile.am
@@ -28,6 +28,7 @@ nobase_include_HEADERS = dimension.h \
dimension/color.h \
dimension/csg.h \
dimension/error.h \
+ dimension/finish.h \
dimension/finishes.h \
dimension/geometry.h \
dimension/gl.h \
@@ -42,6 +43,7 @@ nobase_include_HEADERS = dimension.h \
dimension/objects.h \
dimension/pattern.h \
dimension/patterns.h \
+ dimension/pigment.h \
dimension/pigments.h \
dimension/png.h \
dimension/polynomial.h \
@@ -68,6 +70,7 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \
diffuse.c \
dimension-impl.h \
error.c \
+ finish.c \
finish_combination.c \
geometry.c \
gradient.c \
@@ -81,6 +84,7 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \
pattern.c \
perspective.c \
phong.c \
+ pigment.c \
pigment_map.c \
plane.c \
platform.c \
diff --git a/libdimension/dimension.h b/libdimension/dimension.h
index e190de3..8e7b567 100644
--- a/libdimension/dimension.h
+++ b/libdimension/dimension.h
@@ -75,9 +75,11 @@ typedef void dmnsn_free_fn(void *ptr);
#include <dimension/pattern.h>
#include <dimension/patterns.h>
#include <dimension/map.h>
-#include <dimension/texture.h>
+#include <dimension/pigment.h>
#include <dimension/pigments.h>
+#include <dimension/finish.h>
#include <dimension/finishes.h>
+#include <dimension/texture.h>
#include <dimension/interior.h>
#include <dimension/object.h>
#include <dimension/objects.h>
diff --git a/libdimension/dimension/finish.h b/libdimension/dimension/finish.h
new file mode 100644
index 0000000..022a2b0
--- /dev/null
+++ b/libdimension/dimension/finish.h
@@ -0,0 +1,103 @@
+/*************************************************************************
+ * Copyright (C) 2009-2010 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/>. *
+ *************************************************************************/
+
+/**
+ * @file
+ * Object finishes.
+ */
+
+#ifndef DIMENSION_FINISH_H
+#define DIMENSION_FINISH_H
+
+/* Forward-declare dmnsn_finish */
+typedef struct dmnsn_finish dmnsn_finish;
+
+/**
+ * Diffuse reflection callback.
+ * @param[in] finish The finish itself.
+ * @param[in] light The color of the light illuminating the object.
+ * @param[in] color The pigment of the object.
+ * @param[in] ray The direction of the light source.
+ * @param[in] normal The normal vector of the surface.
+ * @return The diffuse reflection component of the object's color.
+ */
+typedef dmnsn_color dmnsn_diffuse_fn(const dmnsn_finish *finish,
+ dmnsn_color light, dmnsn_color color,
+ dmnsn_vector ray, dmnsn_vector normal);
+/**
+ * Specular highlight callback.
+ * @param[in] finish The finish itself.
+ * @param[in] light The color of the light illuminating the object.
+ * @param[in] color The pigment of the object.
+ * @param[in] ray The direction of the light source.
+ * @param[in] normal The normal vector of the surface.
+ * @param[in] viewer The direction of the viewer.
+ * @return The specular reflection component of the object's color.
+ */
+typedef dmnsn_color dmnsn_specular_fn(const dmnsn_finish *finish,
+ dmnsn_color light, dmnsn_color color,
+ dmnsn_vector ray, dmnsn_vector normal,
+ dmnsn_vector viewer);
+/**
+ * Ambient light callback.
+ * @param[in] finish The finish itself.
+ * @param[in] pigment The pigment of the object.
+ * @return The ambient contribution to the object's color.
+ */
+typedef dmnsn_color dmnsn_ambient_fn(const dmnsn_finish *finish,
+ dmnsn_color pigment);
+/**
+ * Reflected light callback.
+ * @param[in] finish The finish itself.
+ * @param[in] reflect The color of the reflected ray.
+ * @param[in] color The pigment of the object.
+ * @param[in] ray The direction of the reflected ray.
+ * @param[in] normal The normal vector of the surface.
+ * @return The contribution of the reflected ray to the object's color.
+ */
+typedef dmnsn_color dmnsn_reflection_fn(const dmnsn_finish *finish,
+ dmnsn_color reflect, dmnsn_color color,
+ dmnsn_vector ray, dmnsn_vector normal);
+
+/** A finish. */
+struct dmnsn_finish {
+ dmnsn_diffuse_fn *diffuse_fn; /**< The diffuse callback. */
+ dmnsn_specular_fn *specular_fn; /**< The specular callback. */
+ dmnsn_ambient_fn *ambient_fn; /**< The ambient callback. */
+ dmnsn_reflection_fn *reflection_fn; /**< The reflection callback. */
+ dmnsn_free_fn *free_fn; /**< The destruction callback. */
+
+ /** Generic pointer. */
+ void *ptr;
+};
+
+/**
+ * Allocate a new dummy finish.
+ * @return The allocated finish.
+ */
+dmnsn_finish *dmnsn_new_finish(void);
+
+/**
+ * Delete a finish.
+ * @param[in,out] finish The finish to delete.
+ */
+void dmnsn_delete_finish(dmnsn_finish *finish);
+
+#endif /* DIMENSION_FINISH_H */
diff --git a/libdimension/dimension/pigment.h b/libdimension/dimension/pigment.h
new file mode 100644
index 0000000..946cf5b
--- /dev/null
+++ b/libdimension/dimension/pigment.h
@@ -0,0 +1,83 @@
+/*************************************************************************
+ * Copyright (C) 2009-2010 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/>. *
+ *************************************************************************/
+
+/**
+ * @file
+ * Object pigments.
+ */
+
+#ifndef DIMENSION_PIGMENT_H
+#define DIMENSION_PIGMENT_H
+
+/* Forward-declare dmnsn_pigment */
+typedef struct dmnsn_pigment dmnsn_pigment;
+
+/**
+ * Pigment callback.
+ * @param[in] pigment The pigment itself.
+ * @param[in] v The point to color.
+ * @return The color of the pigment at \p v.
+ */
+typedef dmnsn_color dmnsn_pigment_fn(const dmnsn_pigment *pigment,
+ dmnsn_vector v);
+
+/**
+ * Pigment initializer callback.
+ * @param[in,out] pigment The pigment to initialize.
+ */
+typedef void dmnsn_pigment_initialize_fn(dmnsn_pigment *pigment);
+
+/** A pigment. */
+struct dmnsn_pigment {
+ dmnsn_pigment_fn *pigment_fn; /**< The pigment callback. */
+ dmnsn_pigment_initialize_fn *initialize_fn; /**< The initializer callback. */
+ dmnsn_free_fn *free_fn; /**< The destructor callback. */
+
+ dmnsn_matrix trans; /**< Transformation matrix. */
+ dmnsn_matrix trans_inv; /**< The inverse of the transformation matrix. */
+
+ /** Quick color -- used for low-quality renders. */
+ dmnsn_color quick_color;
+
+ /** Generic pointer. */
+ void *ptr;
+};
+
+/**
+ * Allocate a new dummy pigment.
+ * @return The allocated pigment.
+ */
+dmnsn_pigment *dmnsn_new_pigment(void);
+
+/**
+ * Delete a pigment.
+ * @param[in,out] pigment The pigment to delete.
+ */
+void dmnsn_delete_pigment(dmnsn_pigment *pigment);
+
+/**
+ * Initialize a pigment. Pigments should not be used before being initialized,
+ * but should not be modified after being initialized. Pigments are generally
+ * initialized for you.
+ * @param[in,out] pigment The pigment to initialize.
+ */
+void dmnsn_initialize_pigment(dmnsn_pigment *pigment);
+
+#endif /* DIMENSION_PIGMENT_H */
diff --git a/libdimension/dimension/texture.h b/libdimension/dimension/texture.h
index 0398abc..bac7d84 100644
--- a/libdimension/dimension/texture.h
+++ b/libdimension/dimension/texture.h
@@ -26,146 +26,6 @@
#ifndef DIMENSION_TEXTURE_H
#define DIMENSION_TEXTURE_H
-/*
- * Pigments
- */
-
-/* Forward-declare dmnsn_pigment */
-typedef struct dmnsn_pigment dmnsn_pigment;
-
-/**
- * Pigment callback.
- * @param[in] pigment The pigment itself.
- * @param[in] v The point to color.
- * @return The color of the pigment at \p v.
- */
-typedef dmnsn_color dmnsn_pigment_fn(const dmnsn_pigment *pigment,
- dmnsn_vector v);
-
-/**
- * Pigment initializer callback.
- * @param[in,out] pigment The pigment to initialize.
- */
-typedef void dmnsn_pigment_initialize_fn(dmnsn_pigment *pigment);
-
-/** A pigment. */
-struct dmnsn_pigment {
- dmnsn_pigment_fn *pigment_fn; /**< The pigment callback. */
- dmnsn_pigment_initialize_fn *initialize_fn; /**< The initializer callback. */
- dmnsn_free_fn *free_fn; /**< The destructor callback. */
-
- dmnsn_matrix trans; /**< Transformation matrix. */
- dmnsn_matrix trans_inv; /**< The inverse of the transformation matrix. */
-
- /** Quick color -- used for low-quality renders. */
- dmnsn_color quick_color;
-
- /** Generic pointer. */
- void *ptr;
-};
-
-/**
- * Allocate a new dummy pigment.
- * @return The allocated pigment.
- */
-dmnsn_pigment *dmnsn_new_pigment(void);
-
-/**
- * Delete a pigment.
- * @param[in,out] pigment The pigment to delete.
- */
-void dmnsn_delete_pigment(dmnsn_pigment *pigment);
-
-/**
- * Initialize a pigment. Pigments should not be used before being initialized,
- * but should not be modified after being initialized. Pigments are generally
- * initialized for you.
- * @param[in,out] pigment The pigment to initialize.
- */
-void dmnsn_initialize_pigment(dmnsn_pigment *pigment);
-
-/*
- * Finishes
- */
-
-/* Forward-declare dmnsn_finish */
-typedef struct dmnsn_finish dmnsn_finish;
-
-/**
- * Diffuse reflection callback.
- * @param[in] finish The finish itself.
- * @param[in] light The color of the light illuminating the object.
- * @param[in] color The pigment of the object.
- * @param[in] ray The direction of the light source.
- * @param[in] normal The normal vector of the surface.
- * @return The diffuse reflection component of the object's color.
- */
-typedef dmnsn_color dmnsn_diffuse_fn(const dmnsn_finish *finish,
- dmnsn_color light, dmnsn_color color,
- dmnsn_vector ray, dmnsn_vector normal);
-/**
- * Specular highlight callback.
- * @param[in] finish The finish itself.
- * @param[in] light The color of the light illuminating the object.
- * @param[in] color The pigment of the object.
- * @param[in] ray The direction of the light source.
- * @param[in] normal The normal vector of the surface.
- * @param[in] viewer The direction of the viewer.
- * @return The specular reflection component of the object's color.
- */
-typedef dmnsn_color dmnsn_specular_fn(const dmnsn_finish *finish,
- dmnsn_color light, dmnsn_color color,
- dmnsn_vector ray, dmnsn_vector normal,
- dmnsn_vector viewer);
-/**
- * Ambient light callback.
- * @param[in] finish The finish itself.
- * @param[in] pigment The pigment of the object.
- * @return The ambient contribution to the object's color.
- */
-typedef dmnsn_color dmnsn_ambient_fn(const dmnsn_finish *finish,
- dmnsn_color pigment);
-/**
- * Reflected light callback.
- * @param[in] finish The finish itself.
- * @param[in] reflect The color of the reflected ray.
- * @param[in] color The pigment of the object.
- * @param[in] ray The direction of the reflected ray.
- * @param[in] normal The normal vector of the surface.
- * @return The contribution of the reflected ray to the object's color.
- */
-typedef dmnsn_color dmnsn_reflection_fn(const dmnsn_finish *finish,
- dmnsn_color reflect, dmnsn_color color,
- dmnsn_vector ray, dmnsn_vector normal);
-
-/** A finish. */
-struct dmnsn_finish {
- dmnsn_diffuse_fn *diffuse_fn; /**< The diffuse callback. */
- dmnsn_specular_fn *specular_fn; /**< The specular callback. */
- dmnsn_ambient_fn *ambient_fn; /**< The ambient callback. */
- dmnsn_reflection_fn *reflection_fn; /**< The reflection callback. */
- dmnsn_free_fn *free_fn; /**< The destruction callback. */
-
- /** Generic pointer. */
- void *ptr;
-};
-
-/**
- * Allocate a new dummy finish.
- * @return The allocated finish.
- */
-dmnsn_finish *dmnsn_new_finish(void);
-
-/**
- * Delete a finish.
- * @param[in,out] finish The finish to delete.
- */
-void dmnsn_delete_finish(dmnsn_finish *finish);
-
-/*
- * Textures
- */
-
/** A complete texture. */
typedef struct {
dmnsn_pigment *pigment; /**< Pigment. */
diff --git a/libdimension/finish.c b/libdimension/finish.c
new file mode 100644
index 0000000..0309e6e
--- /dev/null
+++ b/libdimension/finish.c
@@ -0,0 +1,51 @@
+/*************************************************************************
+ * Copyright (C) 2009-2010 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/>. *
+ *************************************************************************/
+
+/**
+ * @file
+ * Finishes.
+ */
+
+#include "dimension.h"
+
+/* Allocate a dummy finish */
+dmnsn_finish *
+dmnsn_new_finish(void)
+{
+ dmnsn_finish *finish = dmnsn_malloc(sizeof(dmnsn_finish));
+ finish->diffuse_fn = NULL;
+ finish->specular_fn = NULL;
+ finish->ambient_fn = NULL;
+ finish->reflection_fn = NULL;
+ finish->free_fn = NULL;
+ return finish;
+}
+
+/* Free a finish */
+void
+dmnsn_delete_finish(dmnsn_finish *finish)
+{
+ if (finish) {
+ if (finish->free_fn) {
+ (*finish->free_fn)(finish->ptr);
+ }
+ dmnsn_free(finish);
+ }
+}
diff --git a/libdimension/pigment.c b/libdimension/pigment.c
new file mode 100644
index 0000000..2ca1e2e
--- /dev/null
+++ b/libdimension/pigment.c
@@ -0,0 +1,62 @@
+/*************************************************************************
+ * Copyright (C) 2009-2010 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/>. *
+ *************************************************************************/
+
+/**
+ * @file
+ * Pigments.
+ */
+
+#include "dimension.h"
+
+/* Allocate a dummy pigment */
+dmnsn_pigment *
+dmnsn_new_pigment(void)
+{
+ dmnsn_pigment *pigment = dmnsn_malloc(sizeof(dmnsn_pigment));
+ pigment->pigment_fn = NULL;
+ pigment->initialize_fn = NULL;
+ pigment->free_fn = NULL;
+ pigment->trans = dmnsn_identity_matrix();
+ pigment->quick_color = dmnsn_black;
+ return pigment;
+}
+
+/* Free a pigment */
+void
+dmnsn_delete_pigment(dmnsn_pigment *pigment)
+{
+ if (pigment) {
+ if (pigment->free_fn) {
+ (*pigment->free_fn)(pigment->ptr);
+ }
+ dmnsn_free(pigment);
+ }
+}
+
+/* Precompute pigment properties */
+void
+dmnsn_initialize_pigment(dmnsn_pigment *pigment)
+{
+ if (pigment->initialize_fn) {
+ (*pigment->initialize_fn)(pigment);
+ }
+
+ pigment->trans_inv = dmnsn_matrix_inverse(pigment->trans);
+}
diff --git a/libdimension/texture.c b/libdimension/texture.c
index 0096ce0..4c66c25 100644
--- a/libdimension/texture.c
+++ b/libdimension/texture.c
@@ -20,72 +20,10 @@
/**
* @file
- * Textures, pigments, and finishes.
+ * Textures.
*/
#include "dimension.h"
-#include <stdlib.h>
-
-/* Allocate a dummy pigment */
-dmnsn_pigment *
-dmnsn_new_pigment(void)
-{
- dmnsn_pigment *pigment = dmnsn_malloc(sizeof(dmnsn_pigment));
- pigment->pigment_fn = NULL;
- pigment->initialize_fn = NULL;
- pigment->free_fn = NULL;
- pigment->trans = dmnsn_identity_matrix();
- pigment->quick_color = dmnsn_black;
- return pigment;
-}
-
-/* Free a pigment */
-void
-dmnsn_delete_pigment(dmnsn_pigment *pigment)
-{
- if (pigment) {
- if (pigment->free_fn) {
- (*pigment->free_fn)(pigment->ptr);
- }
- dmnsn_free(pigment);
- }
-}
-
-/* Precompute pigment properties */
-void
-dmnsn_initialize_pigment(dmnsn_pigment *pigment)
-{
- if (pigment->initialize_fn) {
- (*pigment->initialize_fn)(pigment);
- }
-
- pigment->trans_inv = dmnsn_matrix_inverse(pigment->trans);
-}
-
-/* Allocate a dummy finish */
-dmnsn_finish *
-dmnsn_new_finish(void)
-{
- dmnsn_finish *finish = dmnsn_malloc(sizeof(dmnsn_finish));
- finish->diffuse_fn = NULL;
- finish->specular_fn = NULL;
- finish->ambient_fn = NULL;
- finish->reflection_fn = NULL;
- finish->free_fn = NULL;
- return finish;
-}
-
-/* Free a finish */
-void
-dmnsn_delete_finish(dmnsn_finish *finish)
-{
- if (finish) {
- if (finish->free_fn) {
- (*finish->free_fn)(finish->ptr);
- }
- dmnsn_free(finish);
- }
-}
/* Allocate a dummy texture */
dmnsn_texture *