summaryrefslogtreecommitdiffstats
path: root/libdimension/csg.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2014-06-06 14:14:00 -0400
committerTavian Barnes <tavianator@tavianator.com>2014-06-06 14:14:00 -0400
commit708954192219feead526f84c0c8bdb29088aeae0 (patch)
treebfe241506d38559533016b92136f8d924dfe6fee /libdimension/csg.c
parentc2066966bbf74062c18e8a324996bf88c769362d (diff)
downloaddimension-708954192219feead526f84c0c8bdb29088aeae0.tar.xz
objects: Use a vtable to shrink object structs.
Diffstat (limited to 'libdimension/csg.c')
-rw-r--r--libdimension/csg.c47
1 files changed, 32 insertions, 15 deletions
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;
}