From 708954192219feead526f84c0c8bdb29088aeae0 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Fri, 6 Jun 2014 14:14:00 -0400 Subject: objects: Use a vtable to shrink object structs. --- libdimension/csg.c | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) (limited to 'libdimension/csg.c') diff --git a/libdimension/csg.c b/libdimension/csg.c index a8d0acc..e4ee672 100644 --- a/libdimension/csg.c +++ b/libdimension/csg.c @@ -65,6 +65,13 @@ dmnsn_csg_union_initialize_fn(dmnsn_object *object) csg->object.bounding_box = dmnsn_bvh_bounding_box(bvh); } +/** CSG union vtable. */ +static const dmnsn_object_vtable dmnsn_csg_union_vtable = { + .intersection_fn = dmnsn_csg_union_intersection_fn, + .inside_fn = dmnsn_csg_union_inside_fn, + .initialize_fn = dmnsn_csg_union_initialize_fn, +}; + /** CSG union destruction callback. */ static void dmnsn_csg_union_cleanup(void *ptr) @@ -83,11 +90,9 @@ dmnsn_new_csg_union(dmnsn_pool *pool, dmnsn_array *objects) dmnsn_object *object = &csg->object; dmnsn_init_object(object); + object->vtable = &dmnsn_csg_union_vtable; object->children = objects; 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; return object; } @@ -202,19 +207,23 @@ dmnsn_csg_intersection_initialize_fn(dmnsn_object *csg) = dmnsn_vector_min(A->bounding_box.max, B->bounding_box.max); } +/** CSG intersection vtable. */ +static const dmnsn_object_vtable dmnsn_csg_intersection_vtable = { + .intersection_fn = dmnsn_csg_intersection_intersection_fn, + .inside_fn = dmnsn_csg_intersection_inside_fn, + .initialize_fn = dmnsn_csg_intersection_initialize_fn, +}; + dmnsn_object * dmnsn_new_csg_intersection(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) { dmnsn_object *csg = dmnsn_new_object(pool); + csg->vtable = &dmnsn_csg_intersection_vtable; csg->children = DMNSN_PALLOC_ARRAY(pool, dmnsn_object *); 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; - return csg; } @@ -250,19 +259,23 @@ dmnsn_csg_difference_initialize_fn(dmnsn_object *csg) csg->bounding_box = A->bounding_box; } +/** CSG difference vtable. */ +static const dmnsn_object_vtable dmnsn_csg_difference_vtable = { + .intersection_fn = dmnsn_csg_difference_intersection_fn, + .inside_fn = dmnsn_csg_difference_inside_fn, + .initialize_fn = dmnsn_csg_difference_initialize_fn, +}; + dmnsn_object * dmnsn_new_csg_difference(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) { dmnsn_object *csg = dmnsn_new_object(pool); + csg->vtable = &dmnsn_csg_difference_vtable; csg->children = DMNSN_PALLOC_ARRAY(pool, dmnsn_object *); dmnsn_array_push(csg->children, &A); dmnsn_array_push(csg->children, &B); - csg->intersection_fn = dmnsn_csg_difference_intersection_fn; - csg->inside_fn = dmnsn_csg_difference_inside_fn; - csg->initialize_fn = dmnsn_csg_difference_initialize_fn; - return csg; } @@ -302,18 +315,22 @@ dmnsn_csg_merge_initialize_fn(dmnsn_object *csg) = dmnsn_vector_max(A->bounding_box.max, B->bounding_box.max); } +/** CSG merge vtable. */ +static const dmnsn_object_vtable dmnsn_csg_merge_vtable = { + .intersection_fn = dmnsn_csg_merge_intersection_fn, + .inside_fn = dmnsn_csg_merge_inside_fn, + .initialize_fn = dmnsn_csg_merge_initialize_fn, +}; + dmnsn_object * dmnsn_new_csg_merge(dmnsn_pool *pool, dmnsn_object *A, dmnsn_object *B) { dmnsn_object *csg = dmnsn_new_object(pool); + csg->vtable = &dmnsn_csg_merge_vtable; csg->children = DMNSN_PALLOC_ARRAY(pool, dmnsn_object *); dmnsn_array_push(csg->children, &A); dmnsn_array_push(csg->children, &B); - csg->intersection_fn = dmnsn_csg_merge_intersection_fn; - csg->inside_fn = dmnsn_csg_merge_inside_fn; - csg->initialize_fn = dmnsn_csg_merge_initialize_fn; - return csg; } -- cgit v1.2.3