From 7acd8ea6673b7a90ed4041408ccf1b024b8a007a Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sun, 12 Jun 2011 02:37:51 -0600 Subject: 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. --- libdimension/pigment.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'libdimension/pigment.c') 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); +} -- cgit v1.2.3