1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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);
|