2
// ---------------------------------------------------------
4
// broadphase_blenderbvh.cpp
7
// Broad phase collision detection culling using blender's kdop bvh.
9
// ---------------------------------------------------------
11
// ---------------------------------------------------------
13
// ---------------------------------------------------------
15
#include <broadphasegrid.h>
16
#include <dynamicsurface.h>
18
// ---------------------------------------------------------
20
// ---------------------------------------------------------
22
// ---------------------------------------------------------
23
// Local constants, typedefs, macros
24
// ---------------------------------------------------------
26
// ---------------------------------------------------------
27
// Static function definitions
28
// ---------------------------------------------------------
30
// ---------------------------------------------------------
31
// Member function definitions
32
// ---------------------------------------------------------
35
// --------------------------------------------------------
37
/// Rebuild acceleration grids according to the given triangle mesh
39
// --------------------------------------------------------
41
static void build_bvh_tree
42
void BroadPhaseGrid::update_broad_phase_static( const DynamicSurface& surface )
44
double grid_scale = surface.get_average_edge_length();
47
unsigned int num_vertices = surface.m_positions.size();
48
std::vector<Vec3d> vertex_xmins(num_vertices), vertex_xmaxs(num_vertices);
49
for(unsigned int i = 0; i < num_vertices; i++)
51
surface.vertex_static_bounds(i, vertex_xmins[i], vertex_xmaxs[i]);
53
build_acceleration_grid( m_vertex_grid, vertex_xmins, vertex_xmaxs, grid_scale, surface.m_proximity_epsilon );
57
unsigned int num_edges = surface.m_mesh.m_edges.size();
58
std::vector<Vec3d> edge_xmins(num_edges), edge_xmaxs(num_edges);
59
for(unsigned int i = 0; i < num_edges; i++)
61
surface.edge_static_bounds(i, edge_xmins[i], edge_xmaxs[i]);
64
build_acceleration_grid( m_edge_grid, edge_xmins, edge_xmaxs, grid_scale, surface.m_proximity_epsilon );
68
unsigned int num_triangles = surface.m_mesh.m_tris.size();
69
std::vector<Vec3d> tri_xmins(num_triangles), tri_xmaxs(num_triangles);
70
for(unsigned int i = 0; i < num_triangles; i++)
72
surface.triangle_static_bounds(i, tri_xmins[i], tri_xmaxs[i]);
76
build_acceleration_grid( m_triangle_grid, tri_xmins, tri_xmaxs, grid_scale, surface.m_proximity_epsilon );
83
// --------------------------------------------------------
85
/// Rebuild acceleration grids according to the given triangle mesh
87
// --------------------------------------------------------
89
void BroadPhaseGrid::update_broad_phase_continuous( const DynamicSurface& surface )
91
double grid_scale = surface.get_average_edge_length();
94
unsigned int num_vertices = surface.m_positions.size();
95
std::vector<Vec3d> vertex_xmins(num_vertices), vertex_xmaxs(num_vertices);
96
for(unsigned int i = 0; i < num_vertices; i++)
98
surface.vertex_continuous_bounds(i, vertex_xmins[i], vertex_xmaxs[i]);
101
build_acceleration_grid( m_vertex_grid, vertex_xmins, vertex_xmaxs, grid_scale, surface.m_proximity_epsilon );
105
unsigned int num_edges = surface.m_mesh.m_edges.size();
106
std::vector<Vec3d> edge_xmins(num_edges), edge_xmaxs(num_edges);
107
for(unsigned int i = 0; i < num_edges; i++)
109
surface.edge_continuous_bounds(i, edge_xmins[i], edge_xmaxs[i]);
112
build_acceleration_grid( m_edge_grid, edge_xmins, edge_xmaxs, grid_scale, surface.m_proximity_epsilon );
116
unsigned int num_triangles = surface.m_mesh.m_tris.size();
117
std::vector<Vec3d> tri_xmins(num_triangles), tri_xmaxs(num_triangles);
118
for(unsigned int i = 0; i < num_triangles; i++)
120
surface.triangle_continuous_bounds(i, tri_xmins[i], tri_xmaxs[i]);
123
build_acceleration_grid( m_triangle_grid, tri_xmins, tri_xmaxs, grid_scale, surface.m_proximity_epsilon );