summaryrefslogtreecommitdiffstats
path: root/libdimension/pigment.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2011-06-12 02:37:51 -0600
committerTavian Barnes <tavianator@gmail.com>2011-06-13 00:16:06 -0600
commit7acd8ea6673b7a90ed4041408ccf1b024b8a007a (patch)
treed52199dd7c58e0217bfd1a74e7601d739ad333f5 /libdimension/pigment.c
parent066261810c2fca192677c5c1c01c91d6ecec65a0 (diff)
downloaddimension-7acd8ea6673b7a90ed4041408ccf1b024b8a007a.tar.xz
Vast libdimension API and internals improvements.
Couldn't really do these while I was trying to be POV-Ray compatible, 'cause they would've broken compatibility.
Diffstat (limited to 'libdimension/pigment.c')
-rw-r--r--libdimension/pigment.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/libdimension/pigment.c b/libdimension/pigment.c
index a1b4fb7..5522d71 100644
--- a/libdimension/pigment.c
+++ b/libdimension/pigment.c
@@ -35,6 +35,8 @@ dmnsn_new_pigment(void)
pigment->free_fn = NULL;
pigment->trans = dmnsn_identity_matrix();
pigment->quick_color = dmnsn_black;
+ pigment->refcount = 1;
+ pigment->initialized = false;
return pigment;
}
@@ -42,7 +44,7 @@ dmnsn_new_pigment(void)
void
dmnsn_delete_pigment(dmnsn_pigment *pigment)
{
- if (pigment) {
+ if (DMNSN_DECREF(pigment)) {
if (pigment->free_fn) {
pigment->free_fn(pigment->ptr);
}
@@ -54,9 +56,20 @@ dmnsn_delete_pigment(dmnsn_pigment *pigment)
void
dmnsn_initialize_pigment(dmnsn_pigment *pigment)
{
+ dmnsn_assert(!pigment->initialized, "Pigment double-initialized.");
+ pigment->initialized = true;
+
if (pigment->initialize_fn) {
pigment->initialize_fn(pigment);
}
pigment->trans_inv = dmnsn_matrix_inverse(pigment->trans);
}
+
+/* Evaluate a pigment */
+dmnsn_color
+dmnsn_evaluate_pigment(const dmnsn_pigment *pigment, dmnsn_vector v)
+{
+ dmnsn_vector v_trans = dmnsn_transform_vector(pigment->trans_inv, v);
+ return pigment->pigment_fn(pigment, v_trans);
+}