summaryrefslogtreecommitdiffstats
path: root/libdimension/csg.c
diff options
context:
space:
mode:
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;
}