From 180714c96505c53d380e2f205034f587cab0466d Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 31 May 2014 15:34:59 -0400 Subject: object: Use pool. --- libdimension-python/dimension.pxd | 41 ++++++++++++++++----------------------- libdimension-python/dimension.pyx | 38 +++++++++++++----------------------- libdimension/bench/prtree.c | 22 +++++++++------------ libdimension/bench/triangle.c | 9 ++++++--- libdimension/cone.c | 20 +++++++++---------- libdimension/csg.c | 34 +++++++++++++++----------------- libdimension/cube.c | 10 +++++----- libdimension/dimension/csg.h | 14 ++++++++----- libdimension/dimension/object.h | 24 ++++++----------------- libdimension/dimension/objects.h | 24 ++++++++++++++--------- libdimension/object.c | 31 +++++------------------------ libdimension/plane.c | 6 +++--- libdimension/scene.c | 15 ++------------ libdimension/sphere.c | 10 +++++----- libdimension/tests/prtree.c | 11 +++++------ libdimension/tests/render.c | 28 +++++++++++++------------- libdimension/torus.c | 9 ++++----- libdimension/triangle.c | 11 ++++++----- 18 files changed, 151 insertions(+), 206 deletions(-) diff --git a/libdimension-python/dimension.pxd b/libdimension-python/dimension.pxd index 33f2300..f5a723c 100644 --- a/libdimension-python/dimension.pxd +++ b/libdimension-python/dimension.pxd @@ -33,8 +33,6 @@ cdef extern from "../libdimension/dimension.h": ctypedef void dmnsn_callback_fn(void *ptr) - void DMNSN_INCREF(void *) - void dmnsn_die_on_warnings(bint always_die) double dmnsn_epsilon @@ -318,28 +316,23 @@ cdef extern from "../libdimension/dimension.h": dmnsn_matrix trans dmnsn_matrix intrinsic_trans - dmnsn_object *dmnsn_new_object() - void dmnsn_delete_object(dmnsn_object *object) - - dmnsn_object *dmnsn_new_flat_triangle(dmnsn_vector a, - dmnsn_vector b, - dmnsn_vector c) - dmnsn_object *dmnsn_new_triangle(dmnsn_vector a, - dmnsn_vector b, - dmnsn_vector c, - dmnsn_vector na, - dmnsn_vector nb, - dmnsn_vector nc) - dmnsn_object *dmnsn_new_plane(dmnsn_vector normal) - dmnsn_object *dmnsn_new_sphere() - dmnsn_object *dmnsn_new_cube() - dmnsn_object *dmnsn_new_cone(double r1, double r2, bint open) - dmnsn_object *dmnsn_new_torus(double major, double minor) - - dmnsn_object *dmnsn_new_csg_union(dmnsn_array *objects) - dmnsn_object *dmnsn_new_csg_intersection(dmnsn_object *A, dmnsn_object *B) - dmnsn_object *dmnsn_new_csg_difference(dmnsn_object *A, dmnsn_object *B) - dmnsn_object *dmnsn_new_csg_merge(dmnsn_object *A, dmnsn_object *B) + dmnsn_object *dmnsn_new_object(dmnsn_pool *pool) + + dmnsn_object *dmnsn_new_flat_triangle(dmnsn_pool *pool, dmnsn_vector a, dmnsn_vector b, dmnsn_vector c) + dmnsn_object *dmnsn_new_triangle( + dmnsn_pool *pool, + dmnsn_vector a, dmnsn_vector b, dmnsn_vector c, + dmnsn_vector na, dmnsn_vector nb, dmnsn_vector nc) + dmnsn_object *dmnsn_new_plane(dmnsn_pool *pool, dmnsn_vector normal) + dmnsn_object *dmnsn_new_sphere(dmnsn_pool *pool) + dmnsn_object *dmnsn_new_cube(dmnsn_pool *pool) + dmnsn_object *dmnsn_new_cone(dmnsn_pool *pool, double r1, double r2, bint open) + dmnsn_object *dmnsn_new_torus(dmnsn_pool *pool, double major, double minor) + + dmnsn_object *dmnsn_new_csg_union(dmnsn_pool *pool, dmnsn_array *objects) + dmnsn_object *dmnsn_new_csg_intersection(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) + dmnsn_object *dmnsn_new_csg_difference(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) + dmnsn_object *dmnsn_new_csg_merge(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) ########## # Lights # diff --git a/libdimension-python/dimension.pyx b/libdimension-python/dimension.pyx index 2ab683d..d8bbb3a 100644 --- a/libdimension-python/dimension.pyx +++ b/libdimension-python/dimension.pyx @@ -1080,9 +1080,6 @@ cdef class Object(_Transformable): if interior is not None: self.interior = interior - def __dealloc__(self): - dmnsn_delete_object(self._object) - property texture: """The object's Texture.""" def __get__(self): @@ -1132,10 +1129,11 @@ cdef class Triangle(Object): a_normal = cross(b - a, c - a) b_normal = a_normal c_normal = a_normal - self._object = dmnsn_new_triangle(Vector(a)._v, Vector(b)._v, Vector(c)._v, - Vector(a_normal)._v, - Vector(b_normal)._v, - Vector(c_normal)._v) + self._object = dmnsn_new_triangle( + _get_pool(), + Vector(a)._v, Vector(b)._v, Vector(c)._v, + Vector(a_normal)._v, Vector(b_normal)._v, Vector(c_normal)._v + ) Object.__init__(self, *args, **kwargs) cdef class Plane(Object): @@ -1151,7 +1149,7 @@ cdef class Plane(Object): Additionally, Plane() accepts any arguments that Object() accepts. """ - self._object = dmnsn_new_plane(Vector(normal)._v) + self._object = dmnsn_new_plane(_get_pool(), Vector(normal)._v) Object.__init__(self, *args, **kwargs) self._intrinsic_transform(translate(distance*Vector(normal))) @@ -1168,7 +1166,7 @@ cdef class Sphere(Object): Additionally, Sphere() accepts any arguments that Object() accepts. """ - self._object = dmnsn_new_sphere() + self._object = dmnsn_new_sphere(_get_pool()) Object.__init__(self, *args, **kwargs) cdef Matrix trans = translate(Vector(center)) @@ -1187,7 +1185,7 @@ cdef class Box(Object): Additionally, Box() accepts any arguments that Object() accepts. """ - self._object = dmnsn_new_cube() + self._object = dmnsn_new_cube(_get_pool()) Object.__init__(self, *args, **kwargs) min = Vector(min) @@ -1212,7 +1210,7 @@ cdef class Cone(Object): Additionally, Cone() accepts any arguments that Object() accepts. """ - self._object = dmnsn_new_cone(bottom_radius, top_radius, open) + self._object = dmnsn_new_cone(_get_pool(), bottom_radius, top_radius, open) Object.__init__(self, *args, **kwargs) # Lift the cone to start at the origin, then scale, rotate, and translate @@ -1261,7 +1259,7 @@ cdef class Torus(Object): Additionally, Torus() accepts any arguments that Object() accepts. """ - self._object = dmnsn_new_torus(major_radius, minor_radius) + self._object = dmnsn_new_torus(_get_pool(), major_radius, minor_radius) Object.__init__(self, *args, **kwargs) cdef class Union(Object): @@ -1284,10 +1282,9 @@ cdef class Union(Object): try: for obj in objects: o = (obj)._object - DMNSN_INCREF(o) dmnsn_array_push(array, &o) - self._object = dmnsn_new_csg_union(array) + self._object = dmnsn_new_csg_union(_get_pool(), array) finally: dmnsn_delete_array(array) @@ -1312,11 +1309,9 @@ cdef class Intersection(Object): for obj in objects: if self._object == NULL: self._object = (obj)._object - DMNSN_INCREF(self._object) else: o = (obj)._object - DMNSN_INCREF(o) - self._object = dmnsn_new_csg_intersection(self._object, o) + self._object = dmnsn_new_csg_intersection(_get_pool(), self._object, o) Object.__init__(self, *args, **kwargs) @@ -1339,11 +1334,9 @@ cdef class Difference(Object): for obj in objects: if self._object == NULL: self._object = (obj)._object - DMNSN_INCREF(self._object) else: o = (obj)._object - DMNSN_INCREF(o) - self._object = dmnsn_new_csg_difference(self._object, o) + self._object = dmnsn_new_csg_difference(_get_pool(), self._object, o) Object.__init__(self, *args, **kwargs) @@ -1366,11 +1359,9 @@ cdef class Merge(Object): for obj in objects: if self._object == NULL: self._object = (obj)._object - DMNSN_INCREF(self._object) else: o = (obj)._object - DMNSN_INCREF(o) - self._object = dmnsn_new_csg_merge(self._object, o) + self._object = dmnsn_new_csg_merge(_get_pool(), self._object, o) Object.__init__(self, *args, **kwargs) @@ -1479,7 +1470,6 @@ cdef class Scene: cdef dmnsn_object *o for obj in objects: o = (obj)._object - DMNSN_INCREF(o) dmnsn_array_push(self._scene.objects, &o) cdef dmnsn_light *l diff --git a/libdimension/bench/prtree.c b/libdimension/bench/prtree.c index f05f04c..c09a701 100644 --- a/libdimension/bench/prtree.c +++ b/libdimension/bench/prtree.c @@ -58,13 +58,13 @@ dmnsn_randomize_bounding_box(dmnsn_object *object) } static dmnsn_object * -dmnsn_new_fake_object(void) +dmnsn_new_fake_object(dmnsn_pool *pool) { - dmnsn_object *object = dmnsn_new_object(); + dmnsn_object *object = dmnsn_new_object(pool); /* Generate a bounding box in (-1, -1, -1), (1, 1, 1) */ dmnsn_randomize_bounding_box(object); object->intersection_fn = dmnsn_fake_intersection_fn; - object->inside_fn = dmnsn_fake_inside_fn; + object->inside_fn = dmnsn_fake_inside_fn; return object; } @@ -79,13 +79,13 @@ main(void) return EXIT_FAILURE; } - dmnsn_array *objects = DMNSN_NEW_ARRAY(dmnsn_object *); - dmnsn_texture *texture = dmnsn_new_texture(); - texture->pigment = dmnsn_new_pigment(); + dmnsn_pool *pool = dmnsn_new_pool(); + dmnsn_array *objects = DMNSN_PALLOC_ARRAY(pool, dmnsn_object *); + dmnsn_texture *texture = dmnsn_new_texture(pool); + texture->pigment = dmnsn_new_pigment(pool); for (size_t i = 0; i < nobjects; ++i) { - dmnsn_object *object = dmnsn_new_fake_object(); + dmnsn_object *object = dmnsn_new_fake_object(pool); object->texture = texture; - DMNSN_INCREF(object->texture); dmnsn_object_initialize(object); dmnsn_array_push(objects, &object); } @@ -121,10 +121,6 @@ main(void) /* Cleanup */ dmnsn_delete_bvh(bvh); - DMNSN_ARRAY_FOREACH (dmnsn_object **, object, objects) { - dmnsn_delete_object(*object); - } - dmnsn_delete_texture(texture); - dmnsn_delete_array(objects); + dmnsn_delete_pool(pool); return EXIT_SUCCESS; } diff --git a/libdimension/bench/triangle.c b/libdimension/bench/triangle.c index 18944e8..39b9322 100644 --- a/libdimension/bench/triangle.c +++ b/libdimension/bench/triangle.c @@ -30,13 +30,16 @@ main(void) return EXIT_FAILURE; } + dmnsn_pool *pool = dmnsn_new_pool(); + dmnsn_object *triangle = dmnsn_new_flat_triangle( + pool, dmnsn_new_vector(1.0, 0.0, 0.0), dmnsn_new_vector(2.0, 2.0, 1.0), dmnsn_new_vector(3.0, 0.0, 2.0) ); - triangle->texture = dmnsn_new_texture(); - triangle->texture->pigment = dmnsn_new_pigment(); + triangle->texture = dmnsn_new_texture(pool); + triangle->texture->pigment = dmnsn_new_pigment(pool); dmnsn_object_initialize(triangle); dmnsn_intersection intersection; @@ -59,7 +62,7 @@ main(void) dmnsn_assert(!intersected, "Intersected"); printf("dmnsn_triangle_intersection(false): %ld\n", sandglass.grains); - dmnsn_delete_object(triangle); + dmnsn_delete_pool(pool); return EXIT_SUCCESS; } diff --git a/libdimension/cone.c b/libdimension/cone.c index 2e52751..ef3ad33 100644 --- a/libdimension/cone.c +++ b/libdimension/cone.c @@ -124,13 +124,13 @@ dmnsn_cone_cap_inside_fn(const dmnsn_object *object, dmnsn_vector point) /** Allocate a new cone cap. */ dmnsn_object * -dmnsn_new_cone_cap(double r) +dmnsn_new_cone_cap(dmnsn_pool *pool, double r) { - dmnsn_cone_cap *cap = DMNSN_MALLOC(dmnsn_cone_cap); + dmnsn_cone_cap *cap = DMNSN_PALLOC(pool, dmnsn_cone_cap); cap->r = r; dmnsn_object *object = &cap->object; - dmnsn_init_object(object); + dmnsn_init_object(pool, object); object->intersection_fn = dmnsn_cone_cap_intersection_fn; object->inside_fn = dmnsn_cone_cap_inside_fn; object->bounding_box.min = dmnsn_new_vector(-r, 0.0, -r); @@ -140,15 +140,15 @@ dmnsn_new_cone_cap(double r) /* Allocate a new cone object */ dmnsn_object * -dmnsn_new_cone(double r1, double r2, bool open) +dmnsn_new_cone(dmnsn_pool *pool, double r1, double r2, bool open) { - dmnsn_cone *cone = DMNSN_MALLOC(dmnsn_cone); + dmnsn_cone *cone = DMNSN_PALLOC(pool, dmnsn_cone); cone->r1 = r1; cone->r2 = r2; dmnsn_object *object = &cone->object; - dmnsn_init_object(object); - object->intersection_fn = dmnsn_cone_intersection_fn; + dmnsn_init_object(pool, object); + object->intersection_fn = dmnsn_cone_intersection_fn; object->inside_fn = dmnsn_cone_inside_fn; double rmax = dmnsn_max(r1, r2); @@ -160,8 +160,8 @@ dmnsn_new_cone(double r1, double r2, bool open) } /* Implement closed cones as a union with the caps */ - dmnsn_object *cap1 = dmnsn_new_cone_cap(r1); - dmnsn_object *cap2 = dmnsn_new_cone_cap(r2); + dmnsn_object *cap1 = dmnsn_new_cone_cap(pool, r1); + dmnsn_object *cap2 = dmnsn_new_cone_cap(pool, r2); cap1->intrinsic_trans = dmnsn_translation_matrix( dmnsn_new_vector(0.0, -1.0, 0.0) ); @@ -175,7 +175,7 @@ dmnsn_new_cone(double r1, double r2, bool open) dmnsn_array_push(withcaps, &cone); dmnsn_array_push(withcaps, &cap1); dmnsn_array_push(withcaps, &cap2); - dmnsn_object *cone_cap_union = dmnsn_new_csg_union(withcaps); + dmnsn_object *cone_cap_union = dmnsn_new_csg_union(pool, withcaps); dmnsn_delete_array(withcaps); return cone_cap_union; diff --git a/libdimension/csg.c b/libdimension/csg.c index 38c5983..b77b20e 100644 --- a/libdimension/csg.c +++ b/libdimension/csg.c @@ -67,31 +67,29 @@ dmnsn_csg_union_initialize_fn(dmnsn_object *object) /** CSG union destruction callback. */ static void -dmnsn_csg_union_free_fn(dmnsn_object *object) +dmnsn_csg_union_cleanup(void *ptr) { - dmnsn_csg_union *csg = (dmnsn_csg_union *)object; + dmnsn_csg_union *csg = ptr; dmnsn_delete_bvh(csg->bvh); - dmnsn_free(csg); } /* Bulk-load a union */ dmnsn_object * -dmnsn_new_csg_union(const dmnsn_array *objects) +dmnsn_new_csg_union(dmnsn_pool *pool, const dmnsn_array *objects) { - dmnsn_csg_union *csg = DMNSN_MALLOC(dmnsn_csg_union); + dmnsn_csg_union *csg = DMNSN_PALLOC_TIDY(pool, dmnsn_csg_union, dmnsn_csg_union_cleanup); csg->bvh = NULL; dmnsn_object *object = &csg->object; - dmnsn_init_object(object); + dmnsn_init_object(pool, object); DMNSN_ARRAY_FOREACH (dmnsn_object **, child, objects) { dmnsn_array_push(object->children, child); } - object->split_children = true; + object->split_children = true; object->intersection_fn = dmnsn_csg_union_intersection_fn; - object->inside_fn = dmnsn_csg_union_inside_fn; - object->initialize_fn = dmnsn_csg_union_initialize_fn; - object->free_fn = dmnsn_csg_union_free_fn; + object->inside_fn = dmnsn_csg_union_inside_fn; + object->initialize_fn = dmnsn_csg_union_initialize_fn; return object; } @@ -207,16 +205,16 @@ dmnsn_csg_intersection_initialize_fn(dmnsn_object *csg) } dmnsn_object * -dmnsn_new_csg_intersection(dmnsn_object *A, dmnsn_object *B) +dmnsn_new_csg_intersection(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) { - dmnsn_object *csg = dmnsn_new_object(); + dmnsn_object *csg = dmnsn_new_object(pool); dmnsn_array_push(csg->children, &A); dmnsn_array_push(csg->children, &B); csg->intersection_fn = dmnsn_csg_intersection_intersection_fn; - csg->inside_fn = dmnsn_csg_intersection_inside_fn; - csg->initialize_fn = dmnsn_csg_intersection_initialize_fn; + csg->inside_fn = dmnsn_csg_intersection_inside_fn; + csg->initialize_fn = dmnsn_csg_intersection_initialize_fn; return csg; } @@ -254,9 +252,9 @@ dmnsn_csg_difference_initialize_fn(dmnsn_object *csg) } dmnsn_object * -dmnsn_new_csg_difference(dmnsn_object *A, dmnsn_object *B) +dmnsn_new_csg_difference(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) { - dmnsn_object *csg = dmnsn_new_object(); + dmnsn_object *csg = dmnsn_new_object(pool); dmnsn_array_push(csg->children, &A); dmnsn_array_push(csg->children, &B); @@ -305,9 +303,9 @@ dmnsn_csg_merge_initialize_fn(dmnsn_object *csg) } dmnsn_object * -dmnsn_new_csg_merge(dmnsn_object *A, dmnsn_object *B) +dmnsn_new_csg_merge(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) { - dmnsn_object *csg = dmnsn_new_object(); + dmnsn_object *csg = dmnsn_new_object(pool); dmnsn_array_push(csg->children, &A); dmnsn_array_push(csg->children, &B); diff --git a/libdimension/cube.c b/libdimension/cube.c index cc6b3ad..8a1a503 100644 --- a/libdimension/cube.c +++ b/libdimension/cube.c @@ -1,5 +1,5 @@ /************************************************************************* - * Copyright (C) 2009-2011 Tavian Barnes * + * Copyright (C) 2009-2014 Tavian Barnes * * * * This file is part of The Dimension Library. * * * @@ -131,11 +131,11 @@ dmnsn_cube_inside_fn(const dmnsn_object *cube, dmnsn_vector point) /* Allocate a new cube object */ dmnsn_object * -dmnsn_new_cube(void) +dmnsn_new_cube(dmnsn_pool *pool) { - dmnsn_object *cube = dmnsn_new_object(); - cube->intersection_fn = dmnsn_cube_intersection_fn; - cube->inside_fn = dmnsn_cube_inside_fn; + dmnsn_object *cube = dmnsn_new_object(pool); + cube->intersection_fn = dmnsn_cube_intersection_fn; + cube->inside_fn = dmnsn_cube_inside_fn; cube->bounding_box.min = dmnsn_new_vector(-1.0, -1.0, -1.0); cube->bounding_box.max = dmnsn_new_vector(1.0, 1.0, 1.0); return cube; diff --git a/libdimension/dimension/csg.h b/libdimension/dimension/csg.h index 9d86f71..9e29019 100644 --- a/libdimension/dimension/csg.h +++ b/libdimension/dimension/csg.h @@ -1,5 +1,5 @@ /************************************************************************* - * Copyright (C) 2010 Tavian Barnes * + * Copyright (C) 2010-2014 Tavian Barnes * * * * This file is part of The Dimension Library. * * * @@ -25,31 +25,35 @@ /** * CSG union. + * @param[in] pool The memory pool to allocate from. * @param[in] objects The objects from which to compose the union. * @return A union of the objects in \p objects. */ -dmnsn_object *dmnsn_new_csg_union(const dmnsn_array *objects); +dmnsn_object *dmnsn_new_csg_union(dmnsn_pool *pool, const dmnsn_array *objects); /** * CSG intersection. + * @param[in] pool The memory pool to allocate from. * @param[in,out] A The first object. * @param[in,out] B The second object. * @return The intersection of \p A and \p B. */ -dmnsn_object *dmnsn_new_csg_intersection(dmnsn_object *A, dmnsn_object *B); +dmnsn_object *dmnsn_new_csg_intersection(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B); /** * CSG intersection. + * @param[in] pool The memory pool to allocate from. * @param[in,out] A The outer object. * @param[in,out] B The inner object. * @return The difference between \p A and \p B. */ -dmnsn_object *dmnsn_new_csg_difference(dmnsn_object *A, dmnsn_object *B); +dmnsn_object *dmnsn_new_csg_difference(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B); /** * CSG Merge. + * @param[in] pool The memory pool to allocate from. * @param[in,out] A The first object. * @param[in,out] B The second object. * @return The merge of \p A and \p B. */ -dmnsn_object *dmnsn_new_csg_merge(dmnsn_object *A, dmnsn_object *B); +dmnsn_object *dmnsn_new_csg_merge(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B); diff --git a/libdimension/dimension/object.h b/libdimension/dimension/object.h index 75a8aa7..9724dec 100644 --- a/libdimension/dimension/object.h +++ b/libdimension/dimension/object.h @@ -67,12 +67,6 @@ typedef bool dmnsn_object_intersection_fn(const dmnsn_object *object, typedef bool dmnsn_object_inside_fn(const dmnsn_object *object, dmnsn_vector point); -/** - * Object destruction callback. - * @param[in,out] object The object to delete. - */ -typedef void dmnsn_object_free_fn(dmnsn_object *object); - /** An object. */ struct dmnsn_object { dmnsn_texture *texture; /**< Surface properties. */ @@ -88,32 +82,26 @@ struct dmnsn_object { dmnsn_array *children; /**< Child objects. */ bool split_children; /**< Whether the child objects can be split. */ - dmnsn_object_initialize_fn *initialize_fn; /**< Initialization callback. */ + dmnsn_object_initialize_fn *initialize_fn; /**< Initialization callback. */ dmnsn_object_intersection_fn *intersection_fn; /**< Intersection callback. */ - dmnsn_object_inside_fn *inside_fn; /**< Inside callback. */ - dmnsn_object_free_fn *free_fn; /**< Destruction callback. */ + dmnsn_object_inside_fn *inside_fn; /**< Inside callback. */ - DMNSN_REFCOUNT; /**< Reference count. */ bool initialized; /**< @internal Whether the object is initialized yet. */ }; /** * Allocate a dummy object. + * @param[in] pool The memory pool to allocate from. * @return The allocated object. */ -dmnsn_object *dmnsn_new_object(void); +dmnsn_object *dmnsn_new_object(dmnsn_pool *pool); /** * Initialize a dmnsn_object field. + * @param[in] pool The memory pool to allocate from. * @param[out] object The object to initialize. */ -void dmnsn_init_object(dmnsn_object *object); - -/** - * Free an object - * @param[in,out] object The object to destroy. - */ -void dmnsn_delete_object(dmnsn_object *object); +void dmnsn_init_object(dmnsn_pool *pool, dmnsn_object *object); /** * Initialize an object and potentially its children. diff --git a/libdimension/dimension/objects.h b/libdimension/dimension/objects.h index 9ce9e46..eb476cf 100644 --- a/libdimension/dimension/objects.h +++ b/libdimension/dimension/objects.h @@ -1,5 +1,5 @@ /************************************************************************* - * Copyright (C) 2009-2011 Tavian Barnes * + * Copyright (C) 2009-2014 Tavian Barnes * * * * This file is part of The Dimension Library. * * * @@ -27,6 +27,7 @@ /** * A triangle, with normals interpolated between the points. + * @param[in] pool The memory pool to allocate from. * @param[in] a The first corner of the triangle. * @param[in] b The second corner of the triangle. * @param[in] c The third corner of the triangle. @@ -35,52 +36,57 @@ * @param[in] nc The normal at \p c. */ dmnsn_object *dmnsn_new_triangle( + dmnsn_pool *pool, dmnsn_vector a, dmnsn_vector b, dmnsn_vector c, dmnsn_vector na, dmnsn_vector nb, dmnsn_vector nc ); /** * A flat triangle, without normal interpolation. + * @param[in] pool The memory pool to allocate from. * @param[in] a The first corner of the triangle. * @param[in] b The second corner of the triangle. * @param[in] c The third corner of the triangle. */ -dmnsn_object *dmnsn_new_flat_triangle( - dmnsn_vector a, dmnsn_vector b, dmnsn_vector c -); +dmnsn_object *dmnsn_new_flat_triangle(dmnsn_pool *pool, dmnsn_vector a, dmnsn_vector b, dmnsn_vector c); /** * A plane. + * @param[in] pool The memory pool to allocate from. * @param[in] normal The normal vector of the plane. * @return A plane through the origin, with the given normal. */ -dmnsn_object *dmnsn_new_plane(dmnsn_vector normal); +dmnsn_object *dmnsn_new_plane(dmnsn_pool *pool, dmnsn_vector normal); /** * A sphere. + * @param[in] pool The memory pool to allocate from. * @return A sphere of radius 1, centered at the origin. */ -dmnsn_object *dmnsn_new_sphere(void); +dmnsn_object *dmnsn_new_sphere(dmnsn_pool *pool); /** * A cube. + * @param[in] pool The memory pool to allocate from. * @return An axis-aligned cube, from (-1, -1, -1) to (1, 1, 1). */ -dmnsn_object *dmnsn_new_cube(void); +dmnsn_object *dmnsn_new_cube(dmnsn_pool *pool); /** * A cylinder/cone. + * @param[in] pool The memory pool to allocate from. * @param[in] r1 The bottom radius. * @param[in] r2 The top radius. * @param[in] open Whether to render caps. * @return A cone slice, from r = \p r1 at y = -1, to r = \p r2 at y = 1 */ -dmnsn_object *dmnsn_new_cone(double r1, double r2, bool open); +dmnsn_object *dmnsn_new_cone(dmnsn_pool *pool, double r1, double r2, bool open); /** * A torus. + * @param[in] pool The memory pool to allocate from. * @param[in] major The major radius. * @param[in] minor The minor radius. * @return A torus, centered at the origin and lying in the x-z plane. */ -dmnsn_object *dmnsn_new_torus(double major, double minor); +dmnsn_object *dmnsn_new_torus(dmnsn_pool *pool, double major, double minor); diff --git a/libdimension/object.c b/libdimension/object.c index 674eea8..432e473 100644 --- a/libdimension/object.c +++ b/libdimension/object.c @@ -26,50 +26,29 @@ #include "dimension-internal.h" #include -static void -dmnsn_default_object_free_fn(dmnsn_object *object) -{ - dmnsn_free(object); -} - /* Allocate a dummy object */ dmnsn_object * -dmnsn_new_object(void) +dmnsn_new_object(dmnsn_pool *pool) { - dmnsn_object *object = DMNSN_MALLOC(dmnsn_object); - dmnsn_init_object(object); + dmnsn_object *object = DMNSN_PALLOC(pool, dmnsn_object); + dmnsn_init_object(pool, object); return object; } /* Initialize a dmnsn_object field */ void -dmnsn_init_object(dmnsn_object *object) +dmnsn_init_object(dmnsn_pool *pool, dmnsn_object *object) { object->texture = NULL; object->interior = NULL; object->trans = dmnsn_identity_matrix(); object->intrinsic_trans = dmnsn_identity_matrix(); - object->children = DMNSN_NEW_ARRAY(dmnsn_object *); + object->children = DMNSN_PALLOC_ARRAY(pool, dmnsn_object *); object->split_children = false; object->intersection_fn = NULL; object->inside_fn = NULL; object->initialize_fn = NULL; - object->free_fn = dmnsn_default_object_free_fn; object->initialized = false; - DMNSN_REFCOUNT_INIT(object); -} - -/* Free a dmnsn_object */ -void -dmnsn_delete_object(dmnsn_object *object) -{ - if (DMNSN_DECREF(object)) { - DMNSN_ARRAY_FOREACH (dmnsn_object **, child, object->children) { - dmnsn_delete_object(*child); - } - dmnsn_delete_array(object->children); - object->free_fn(object); - } } /** Recursively initialize objects. */ diff --git a/libdimension/plane.c b/libdimension/plane.c index e2c8ae8..e597306 100644 --- a/libdimension/plane.c +++ b/libdimension/plane.c @@ -43,13 +43,13 @@ static bool dmnsn_plane_inside_fn(const dmnsn_object *plane, /* Allocate a new plane */ dmnsn_object * -dmnsn_new_plane(dmnsn_vector normal) +dmnsn_new_plane(dmnsn_pool *pool, dmnsn_vector normal) { - dmnsn_plane *plane = DMNSN_MALLOC(dmnsn_plane); + dmnsn_plane *plane = DMNSN_PALLOC(pool, dmnsn_plane); plane->normal = normal; dmnsn_object *object = &plane->object; - dmnsn_init_object(object); + dmnsn_init_object(pool, object); object->intersection_fn = dmnsn_plane_intersection_fn; object->inside_fn = dmnsn_plane_inside_fn; object->bounding_box = dmnsn_infinite_bounding_box(); diff --git a/libdimension/scene.c b/libdimension/scene.c index c3aac1f..39be881 100644 --- a/libdimension/scene.c +++ b/libdimension/scene.c @@ -26,22 +26,11 @@ #include "dimension-internal.h" #include -static void -dmnsn_scene_cleanup(void *ptr) -{ - dmnsn_scene *scene = ptr; - - DMNSN_ARRAY_FOREACH (dmnsn_object **, object, scene->objects) { - dmnsn_delete_object(*object); - } - dmnsn_delete_array(scene->objects); -} - /* Allocate an empty scene */ dmnsn_scene * dmnsn_new_scene(dmnsn_pool *pool) { - dmnsn_scene *scene = DMNSN_PALLOC_TIDY(pool, dmnsn_scene, dmnsn_scene_cleanup); + dmnsn_scene *scene = DMNSN_PALLOC(pool, dmnsn_scene); scene->background = NULL; scene->default_texture = dmnsn_new_texture(pool); @@ -51,7 +40,7 @@ dmnsn_new_scene(dmnsn_pool *pool) scene->region_y = 0; scene->outer_width = 0; scene->outer_height = 0; - scene->objects = DMNSN_NEW_ARRAY(dmnsn_object *); + scene->objects = DMNSN_PALLOC_ARRAY(pool, dmnsn_object *); scene->lights = DMNSN_PALLOC_ARRAY(pool, dmnsn_light *); scene->camera = NULL; scene->quality = DMNSN_RENDER_FULL; diff --git a/libdimension/sphere.c b/libdimension/sphere.c index 96bc617..821113d 100644 --- a/libdimension/sphere.c +++ b/libdimension/sphere.c @@ -1,5 +1,5 @@ /************************************************************************* - * Copyright (C) 2009-2011 Tavian Barnes * + * Copyright (C) 2009-2014 Tavian Barnes * * * * This file is part of The Dimension Library. * * * @@ -60,11 +60,11 @@ dmnsn_sphere_inside_fn(const dmnsn_object *sphere, dmnsn_vector point) /* Allocate a new sphere */ dmnsn_object * -dmnsn_new_sphere(void) +dmnsn_new_sphere(dmnsn_pool *pool) { - dmnsn_object *sphere = dmnsn_new_object(); - sphere->intersection_fn = dmnsn_sphere_intersection_fn; - sphere->inside_fn = dmnsn_sphere_inside_fn; + dmnsn_object *sphere = dmnsn_new_object(pool); + sphere->intersection_fn = dmnsn_sphere_intersection_fn; + sphere->inside_fn = dmnsn_sphere_inside_fn; sphere->bounding_box.min = dmnsn_new_vector(-1.0, -1.0, -1.0); sphere->bounding_box.max = dmnsn_new_vector(1.0, 1.0, 1.0); return sphere; diff --git a/libdimension/tests/prtree.c b/libdimension/tests/prtree.c index 5c377e2..a7db68e 100644 --- a/libdimension/tests/prtree.c +++ b/libdimension/tests/prtree.c @@ -64,11 +64,13 @@ main(void) /* Treat warnings as errors for tests */ dmnsn_die_on_warnings(true); + dmnsn_pool *pool = dmnsn_new_pool(); + const size_t nobjects = 128; - dmnsn_array *objects = DMNSN_NEW_ARRAY(dmnsn_object *); + dmnsn_array *objects = DMNSN_PALLOC_ARRAY(pool, dmnsn_object *); for (size_t i = 0; i < nobjects; ++i) { - dmnsn_object *object = dmnsn_new_object(); + dmnsn_object *object = dmnsn_new_object(pool); dmnsn_randomize_bounding_box(object); object->intersection_fn = dmnsn_fake_intersection_fn; object->trans_inv = dmnsn_identity_matrix(); @@ -96,9 +98,6 @@ main(void) } dmnsn_delete_bvh(bvh); - DMNSN_ARRAY_FOREACH (dmnsn_object **, object, objects) { - dmnsn_delete_object(*object); - } - dmnsn_delete_array(objects); + dmnsn_delete_pool(pool); return EXIT_SUCCESS; } diff --git a/libdimension/tests/render.c b/libdimension/tests/render.c index d093947..f12aa8b 100644 --- a/libdimension/tests/render.c +++ b/libdimension/tests/render.c @@ -118,7 +118,7 @@ dmnsn_test_scene_add_lights(dmnsn_pool *pool, dmnsn_scene *scene) static void dmnsn_test_scene_add_hollow_cube(dmnsn_pool *pool, dmnsn_scene *scene) { - dmnsn_object *cube = dmnsn_new_cube(); + dmnsn_object *cube = dmnsn_new_cube(pool); cube->trans = dmnsn_rotation_matrix( dmnsn_new_vector(dmnsn_radians(45.0), 0.0, 0.0) ); @@ -133,13 +133,13 @@ dmnsn_test_scene_add_hollow_cube(dmnsn_pool *pool, dmnsn_scene *scene) cube->interior = dmnsn_new_interior(pool); cube->interior->ior = 1.1; - dmnsn_object *sphere = dmnsn_new_sphere(); + dmnsn_object *sphere = dmnsn_new_sphere(pool); sphere->texture = dmnsn_new_texture(pool); sphere->texture->pigment = dmnsn_new_solid_pigment(pool, DMNSN_TCOLOR(dmnsn_green)); sphere->texture->finish.specular = dmnsn_new_phong(pool, dmnsn_sRGB_inverse_gamma(0.2), 40.0); sphere->trans = dmnsn_scale_matrix(dmnsn_new_vector(1.25, 1.25, 1.25)); - dmnsn_object *hollow_cube = dmnsn_new_csg_difference(cube, sphere); + dmnsn_object *hollow_cube = dmnsn_new_csg_difference(pool, cube, sphere); dmnsn_array_push(scene->objects, &hollow_cube); } @@ -155,18 +155,18 @@ dmnsn_test_scene_add_spike(dmnsn_pool *pool, dmnsn_scene *scene) { dmnsn_array *arrow_array = DMNSN_NEW_ARRAY(dmnsn_object *); - dmnsn_object *cylinder = dmnsn_new_cone(0.1, 0.1, false); + dmnsn_object *cylinder = dmnsn_new_cone(pool, 0.1, 0.1, false); cylinder->trans = dmnsn_scale_matrix(dmnsn_new_vector(1.0, 1.25, 1.0)); dmnsn_array_push(arrow_array, &cylinder); - dmnsn_object *cone = dmnsn_new_cone(0.1, 0.0, true); + dmnsn_object *cone = dmnsn_new_cone(pool, 0.1, 0.0, true); cone->trans = dmnsn_matrix_mul( dmnsn_translation_matrix(dmnsn_new_vector(0.0, 1.375, 0.0)), dmnsn_scale_matrix(dmnsn_new_vector(1.0, 0.125, 1.0)) ); dmnsn_array_push(arrow_array, &cone); - dmnsn_object *arrow = dmnsn_new_csg_union(arrow_array); + dmnsn_object *arrow = dmnsn_new_csg_union(pool, arrow_array); dmnsn_delete_array(arrow_array); dmnsn_pattern *gradient = dmnsn_new_gradient_pattern(pool, dmnsn_y); dmnsn_map *gradient_pigment_map = dmnsn_new_pigment_map(pool); @@ -190,18 +190,18 @@ dmnsn_test_scene_add_spike(dmnsn_pool *pool, dmnsn_scene *scene) dmnsn_array *torus_array = DMNSN_NEW_ARRAY(dmnsn_object *); - dmnsn_object *torus1 = dmnsn_new_torus(0.15, 0.05); + dmnsn_object *torus1 = dmnsn_new_torus(pool, 0.15, 0.05); torus1->trans = dmnsn_translation_matrix(dmnsn_new_vector(0.0, -1.0, 0.0)); dmnsn_array_push(torus_array, &torus1); - dmnsn_object *torus2 = dmnsn_new_torus(0.15, 0.05); + dmnsn_object *torus2 = dmnsn_new_torus(pool, 0.15, 0.05); dmnsn_array_push(torus_array, &torus2); - dmnsn_object *torus3 = dmnsn_new_torus(0.15, 0.05); + dmnsn_object *torus3 = dmnsn_new_torus(pool, 0.15, 0.05); torus3->trans = dmnsn_translation_matrix(dmnsn_new_vector(0.0, 1.0, 0.0)); dmnsn_array_push(torus_array, &torus3); - dmnsn_object *torii = dmnsn_new_csg_union(torus_array); + dmnsn_object *torii = dmnsn_new_csg_union(pool, torus_array); dmnsn_delete_array(torus_array); torii->texture = dmnsn_new_texture(pool); torii->texture->pigment = dmnsn_new_solid_pigment(pool, DMNSN_TCOLOR(dmnsn_blue)); @@ -210,7 +210,7 @@ dmnsn_test_scene_add_spike(dmnsn_pool *pool, dmnsn_scene *scene) dmnsn_array *spike_array = DMNSN_NEW_ARRAY(dmnsn_object *); dmnsn_array_push(spike_array, &arrow); dmnsn_array_push(spike_array, &torii); - dmnsn_object *spike = dmnsn_new_csg_union(spike_array); + dmnsn_object *spike = dmnsn_new_csg_union(pool, spike_array); dmnsn_delete_array(spike_array); spike->trans = dmnsn_rotation_matrix( dmnsn_new_vector(dmnsn_radians(-45.0), 0.0, 0.0) @@ -234,7 +234,7 @@ dmnsn_test_scene_add_triangle_strip(dmnsn_pool *pool, dmnsn_scene *scene) strip_textures[1]->pigment = dmnsn_new_solid_pigment(pool, DMNSN_TCOLOR(dmnsn_orange)); strip_textures[2]->pigment = dmnsn_new_solid_pigment(pool, DMNSN_TCOLOR(dmnsn_yellow)); for (unsigned int i = 0; i < 128; ++i) { - dmnsn_object *triangle = dmnsn_new_flat_triangle(a, b, c); + dmnsn_object *triangle = dmnsn_new_flat_triangle(pool, a, b, c); triangle->texture = strip_textures[i%3]; dmnsn_array_push(strip_array, &triangle); @@ -243,7 +243,7 @@ dmnsn_test_scene_add_triangle_strip(dmnsn_pool *pool, dmnsn_scene *scene) c = dmnsn_vector_add(a, dmnsn_z); } - dmnsn_object *strip = dmnsn_new_csg_union(strip_array); + dmnsn_object *strip = dmnsn_new_csg_union(pool, strip_array); dmnsn_delete_array(strip_array); strip->trans = dmnsn_translation_matrix(dmnsn_new_vector(5.0, -2.0, -4.0)); dmnsn_array_push(scene->objects, &strip); @@ -252,7 +252,7 @@ dmnsn_test_scene_add_triangle_strip(dmnsn_pool *pool, dmnsn_scene *scene) static void dmnsn_test_scene_add_ground(dmnsn_pool *pool, dmnsn_scene *scene) { - dmnsn_object *plane = dmnsn_new_plane(dmnsn_new_vector(0.0, 1.0, 0.0)); + dmnsn_object *plane = dmnsn_new_plane(pool, dmnsn_new_vector(0.0, 1.0, 0.0)); plane->trans = dmnsn_translation_matrix(dmnsn_new_vector(0.0, -2.0, 0.0)); dmnsn_pattern *checker = dmnsn_new_checker_pattern(pool); dmnsn_map *small_map = dmnsn_new_pigment_map(pool); diff --git a/libdimension/torus.c b/libdimension/torus.c index 158e196..5f2085c 100644 --- a/libdimension/torus.c +++ b/libdimension/torus.c @@ -46,8 +46,7 @@ dmnsn_torus_bound_intersection(const dmnsn_torus *torus, dmnsn_line l) dmnsn_vector upper = dmnsn_line_point(l, tupper); double ldist2 = lower.x*lower.x + lower.z*lower.z; double udist2 = upper.x*upper.x + upper.z*upper.z; - if ((ldist2 < rmin2 || ldist2 > rmax2) && (udist2 < rmin2 || udist2 > rmax2)) - { + if ((ldist2 < rmin2 || ldist2 > rmax2) && (udist2 < rmin2 || udist2 > rmax2)) { /* No valid intersection with the caps, try the cylinder walls */ double dist2 = l.x0.x*l.x0.x + l.x0.z*l.x0.z; double bigcyl[3], smallcyl[3]; @@ -143,14 +142,14 @@ dmnsn_torus_inside_fn(const dmnsn_object *object, dmnsn_vector point) /* Allocate a new torus */ dmnsn_object * -dmnsn_new_torus(double major, double minor) +dmnsn_new_torus(dmnsn_pool *pool, double major, double minor) { - dmnsn_torus *torus = DMNSN_MALLOC(dmnsn_torus); + dmnsn_torus *torus = DMNSN_PALLOC(pool, dmnsn_torus); torus->major = major; torus->minor = minor; dmnsn_object *object = &torus->object; - dmnsn_init_object(object); + dmnsn_init_object(pool, object); object->intersection_fn = dmnsn_torus_intersection_fn; object->inside_fn = dmnsn_torus_inside_fn; diff --git a/libdimension/triangle.c b/libdimension/triangle.c index afe9065..94a6a95 100644 --- a/libdimension/triangle.c +++ b/libdimension/triangle.c @@ -66,20 +66,21 @@ dmnsn_triangle_inside_fn(const dmnsn_object *triangle, dmnsn_vector point) /* Allocate a new triangle */ dmnsn_object * -dmnsn_new_triangle(dmnsn_vector a, dmnsn_vector b, dmnsn_vector c, +dmnsn_new_triangle(dmnsn_pool *pool, + dmnsn_vector a, dmnsn_vector b, dmnsn_vector c, dmnsn_vector na, dmnsn_vector nb, dmnsn_vector nc) { na = dmnsn_vector_normalized(na); nb = dmnsn_vector_normalized(nb); nc = dmnsn_vector_normalized(nc); - dmnsn_triangle *triangle = DMNSN_MALLOC(dmnsn_triangle); + dmnsn_triangle *triangle = DMNSN_PALLOC(pool, dmnsn_triangle); triangle->na = na; triangle->nab = dmnsn_vector_sub(nb, na); triangle->nac = dmnsn_vector_sub(nc, na); dmnsn_object *object = &triangle->object; - dmnsn_init_object(object); + dmnsn_init_object(pool, object); object->intersection_fn = dmnsn_triangle_intersection_fn; object->inside_fn = dmnsn_triangle_inside_fn; object->bounding_box.min = dmnsn_zero; @@ -101,7 +102,7 @@ dmnsn_new_triangle(dmnsn_vector a, dmnsn_vector b, dmnsn_vector c, /* Allocate a new flat triangle */ dmnsn_object * -dmnsn_new_flat_triangle(dmnsn_vector a, dmnsn_vector b, dmnsn_vector c) +dmnsn_new_flat_triangle(dmnsn_pool *pool, dmnsn_vector a, dmnsn_vector b, dmnsn_vector c) { /* Flat triangles are just smooth triangles with identical normals at all verticies */ @@ -109,5 +110,5 @@ dmnsn_new_flat_triangle(dmnsn_vector a, dmnsn_vector b, dmnsn_vector c) dmnsn_vector_sub(b, a), dmnsn_vector_sub(c, a) ); - return dmnsn_new_triangle(a, b, c, normal, normal, normal); + return dmnsn_new_triangle(pool, a, b, c, normal, normal, normal); } -- cgit v1.2.3