diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2012-12-17 15:53:56 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2012-12-17 16:34:51 -0500 |
commit | 9defe68bb518bb7e4c7d6b9954a6f604191b7abd (patch) | |
tree | 401d40c16652635e924b7d9dcf0a8c81ceeda82a /libdimension/bvh.h | |
parent | 77d871406b15d101cae330947d72a4484eebc698 (diff) | |
download | dimension-9defe68bb518bb7e4c7d6b9954a6f604191b7abd.tar.xz |
Allow other BVH implementations to be used.
dmnsn_bvh is now a generic API, which could potentially support
octrees, etc, in addition to PR-trees.
Diffstat (limited to 'libdimension/bvh.h')
-rw-r--r-- | libdimension/bvh.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/libdimension/bvh.h b/libdimension/bvh.h new file mode 100644 index 0000000..2c3a8a4 --- /dev/null +++ b/libdimension/bvh.h @@ -0,0 +1,76 @@ +/************************************************************************* + * Copyright (C) 2012 Tavian Barnes <tavianator@tavianator.com> * + * * + * This file is part of The Dimension Library. * + * * + * The Dimension Library is free software; you can redistribute it and/ * + * or modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Library is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this program. If not, see * + * <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +/** + * @file. + * Bounding volume hierarchy. This generic interface allows different data + * structures to be represented in the same way, thus sharing code for their + * traversal algorithm. + */ + +#include <stdbool.h> + +/** A bounding volume hierarchy. */ +typedef struct dmnsn_bvh dmnsn_bvh; + +/** Available BVH implementations. */ +typedef enum dmnsn_bvh_kind { + DMNSN_BVH_NONE, + DMNSN_BVH_PRTREE, +} dmnsn_bvh_kind; + +/** Create a BVH. */ +DMNSN_INTERNAL dmnsn_bvh *dmnsn_new_bvh(const dmnsn_array *objects, + dmnsn_bvh_kind kind); +/** Delete a BVH. */ +DMNSN_INTERNAL void dmnsn_delete_bvh(dmnsn_bvh *bvh); + +/** Find the closest ray-object intersection in the tree. */ +DMNSN_INTERNAL bool dmnsn_bvh_intersection(const dmnsn_bvh *bvh, + dmnsn_line ray, + dmnsn_intersection *intersection, + bool reset); +/** Determine whether a point is inside any object in the tree. */ +DMNSN_INTERNAL bool dmnsn_bvh_inside(const dmnsn_bvh *bvh, dmnsn_vector point); +/** Return the bounding box of the whole hierarchy. */ +DMNSN_INTERNAL dmnsn_bounding_box dmnsn_bvh_bounding_box(const dmnsn_bvh *bvh); + +/** A non-flat BVH representation, used by BVH implementations. */ +typedef struct dmnsn_bvh_node { + dmnsn_bounding_box bounding_box; /** The bounding box of this node. */ + dmnsn_object *object; /** The object, for leaf nodes. */ + int data; /** Extra field for implementation use. */ + size_t nchildren; /** How many children this node has. */ + size_t max_children; /** Maximum number of children. */ + struct dmnsn_bvh_node *children[]; /** Flexible array of children. */ +} dmnsn_bvh_node; + +/** Create a BVH node. */ +DMNSN_INTERNAL dmnsn_bvh_node *dmnsn_new_bvh_node(size_t max_children); + +/** Create a BVH leaf node. */ +DMNSN_INTERNAL dmnsn_bvh_node *dmnsn_new_bvh_leaf_node(dmnsn_object *object); + +/** Delete a BVH node. */ +DMNSN_INTERNAL void dmnsn_delete_bvh_node(dmnsn_bvh_node *node); + +/** Add a child to a BVH node. */ +DMNSN_INTERNAL void dmnsn_bvh_node_add(dmnsn_bvh_node *parent, + dmnsn_bvh_node *child); |