summaryrefslogtreecommitdiffstats
path: root/libdimension/bvh.h
blob: 27652c1cfacd90c4a495636c8f48d224593a6b9e (plain)
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);