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