1.3.49
 
Loading...
Searching...
No Matches
CollisionDetection.cu File Reference
#include <cstdio>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <vector>
#include "helios_vector_types.h"

Go to the source code of this file.

Data Structures

struct  GPUBVHNode
 GPU-friendly BVH node structure (Legacy AoS format) More...
 
struct  GPUBVHNodesSoA
 GPU-optimized SoA BVH structure for warp-efficient traversal. More...
 

Functions

__device__ bool d_aabbIntersect (const float3 &min1, const float3 &max1, const float3 &min2, const float3 &max2)
 CUDA device function to test AABB intersection.
 
__device__ __forceinline__ float3 cross (const float3 &a, const float3 &b)
 CUDA device helper functions for vector operations.
 
__device__ __forceinline__ float dot (const float3 &a, const float3 &b)
 
__device__ __forceinline__ float3 normalize (const float3 &v)
 
__device__ __forceinline__ float3 operator+ (const float3 &a, const float3 &b)
 
__device__ __forceinline__ float3 operator- (const float3 &a, const float3 &b)
 
__device__ __forceinline__ float3 operator* (const float3 &a, float scalar)
 
__device__ __forceinline__ bool rayTriangleIntersect (const float3 &ray_origin, const float3 &ray_direction, const float3 &v0, const float3 &v1, const float3 &v2, float max_distance, float &hit_distance)
 Fast ray-triangle intersection using Möller-Trumbore algorithm.
 
__device__ __forceinline__ bool warpRayAABBIntersect (const float3 &ray_origin, const float3 &ray_dir, const float3 &aabb_min, const float3 &aabb_max, float max_dist)
 Warp-efficient ray-AABB intersection for GPU optimization.
 
__device__ __forceinline__ bool rayTriangleIntersectCPU (const float3 &origin, const float3 &direction, const float3 &v0, const float3 &v1, const float3 &v2, float &distance)
 High-performance GPU ray-triangle intersection kernel using BVH traversal.
 
__device__ __forceinline__ bool rayPatchIntersect (const float3 &origin, const float3 &direction, const float3 &v0, const float3 &v1, const float3 &v2, const float3 &v3, float &distance)
 
__device__ bool rayVoxelIntersect (const float3 &ray_origin, const float3 &ray_direction, const float3 &aabb_min, const float3 &aabb_max, float &distance)
 
__global__ void rayPrimitiveBVHKernel (GPUBVHNode *d_bvh_nodes, unsigned int *d_primitive_indices, int *d_primitive_types, float3 *d_primitive_vertices, unsigned int *d_vertex_offsets, float3 *d_ray_origins, float3 *d_ray_directions, float *d_ray_max_distances, int num_rays, int primitive_count, int total_vertex_count, float *d_hit_distances, unsigned int *d_hit_primitive_ids, unsigned int *d_hit_counts, bool find_closest_hit)
 
void launchRayPrimitiveIntersection (void *h_bvh_nodes, int node_count, unsigned int *h_primitive_indices, int primitive_count, int *h_primitive_types, float3 *h_primitive_vertices, unsigned int *h_vertex_offsets, int total_vertex_count, float *h_ray_origins, float *h_ray_directions, float *h_ray_max_distances, int num_rays, float *h_hit_distances, unsigned int *h_hit_primitive_ids, unsigned int *h_hit_counts, bool find_closest_hit)
 Launch optimized ray-triangle intersection kernel for true ray tracing.
 
__global__ void bvhTraversalKernel (GPUBVHNode *d_nodes, unsigned int *d_primitive_indices, float3 *d_primitive_aabb_min, float3 *d_primitive_aabb_max, float3 *d_query_aabb_min, float3 *d_query_aabb_max, unsigned int *d_results, unsigned int *d_result_counts, int num_queries, int max_results_per_query)
 CUDA kernel for BVH traversal collision detection.
 
void launchBVHTraversal (void *h_nodes, int node_count, unsigned int *h_primitive_indices, int primitive_count, float *h_primitive_aabb_min, float *h_primitive_aabb_max, float *h_query_aabb_min, float *h_query_aabb_max, int num_queries, unsigned int *h_results, unsigned int *h_result_counts, int max_results_per_query)
 Launch BVH traversal kernel from C++ code.
 
__global__ void intersectRegularGridKernel (const size_t num_rays, float3 *d_ray_origins, float3 *d_ray_directions, float3 grid_center, float3 grid_size, int3 grid_divisions, int primitive_count, int *d_voxel_ray_counts, float *d_voxel_path_lengths, int *d_voxel_transmitted, int *d_voxel_hit_before, int *d_voxel_hit_after, int *d_voxel_hit_inside)
 CUDA kernel to calculate ray path lengths through a regular voxel grid.
 
void launchVoxelRayPathLengths (int num_rays, float *h_ray_origins, float *h_ray_directions, float grid_center_x, float grid_center_y, float grid_center_z, float grid_size_x, float grid_size_y, float grid_size_z, int grid_divisions_x, int grid_divisions_y, int grid_divisions_z, int primitive_count, int *h_voxel_ray_counts, float *h_voxel_path_lengths, int *h_voxel_transmitted, int *h_voxel_hit_before, int *h_voxel_hit_after, int *h_voxel_hit_inside)
 Launch CUDA kernel for regular grid voxel ray path length calculation.
 

Detailed Description

CUDA source file for GPU-accelerated collision detection

Copyright (C) 2016-2025 Brian Bailey

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.

This program 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 General Public License for more details.

Definition in file CollisionDetection.cu.

Function Documentation

◆ bvhTraversalKernel()

__global__ void bvhTraversalKernel ( GPUBVHNode d_nodes,
unsigned int *  d_primitive_indices,
float3 *  d_primitive_aabb_min,
float3 *  d_primitive_aabb_max,
float3 *  d_query_aabb_min,
float3 *  d_query_aabb_max,
unsigned int *  d_results,
unsigned int *  d_result_counts,
int  num_queries,
int  max_results_per_query 
)

CUDA kernel for BVH traversal collision detection.

Each thread processes one query AABB and traverses the BVH to find collisions.

Parameters
[in]d_nodesArray of BVH nodes on GPU
[in]d_primitive_indicesArray of primitive indices on GPU
[in]d_query_aabb_minArray of query AABB minimum corners
[in]d_query_aabb_maxArray of query AABB maximum corners
[out]d_resultsArray to store collision results
[out]d_result_countsArray to store number of results per query
[in]num_queriesNumber of queries to process
[in]max_results_per_queryMaximum results to store per query

Definition at line 753 of file CollisionDetection.cu.

◆ cross()

__device__ __forceinline__ float3 cross ( const float3 &  a,
const float3 &  b 
)

CUDA device helper functions for vector operations.

Definition at line 77 of file CollisionDetection.cu.

◆ d_aabbIntersect()

__device__ bool d_aabbIntersect ( const float3 &  min1,
const float3 &  max1,
const float3 &  min2,
const float3 &  max2 
)

CUDA device function to test AABB intersection.

Parameters
[in]min1Minimum corner of first AABB
[in]max1Maximum corner of first AABB
[in]min2Minimum corner of second AABB
[in]max2Maximum corner of second AABB
Returns
True if AABBs intersect

Definition at line 70 of file CollisionDetection.cu.

◆ dot()

__device__ __forceinline__ float dot ( const float3 &  a,
const float3 &  b 
)

Definition at line 81 of file CollisionDetection.cu.

◆ intersectRegularGridKernel()

__global__ void intersectRegularGridKernel ( const size_t  num_rays,
float3 *  d_ray_origins,
float3 *  d_ray_directions,
float3  grid_center,
float3  grid_size,
int3  grid_divisions,
int  primitive_count,
int *  d_voxel_ray_counts,
float *  d_voxel_path_lengths,
int *  d_voxel_transmitted,
int *  d_voxel_hit_before,
int *  d_voxel_hit_after,
int *  d_voxel_hit_inside 
)

CUDA kernel to calculate ray path lengths through a regular voxel grid.

This kernel computes the intersection of rays with voxels and accumulates path length statistics for integration with aeriallidar and lidar plugins.

Parameters
[in]num_raysNumber of rays to process
[in]d_ray_originsArray of ray origin points
[in]d_ray_directionsArray of ray direction vectors (normalized)
[in]grid_centerCenter of the voxel grid
[in]grid_sizeTotal size of the voxel grid
[in]grid_divisionsNumber of divisions in x, y, z
[out]d_voxel_ray_countsFlattened array to accumulate ray counts per voxel
[out]d_voxel_path_lengthsFlattened array to accumulate path lengths per voxel
[out]d_voxel_transmittedFlattened array to count transmitted rays per voxel

Definition at line 941 of file CollisionDetection.cu.

◆ launchBVHTraversal()

void launchBVHTraversal ( void *  h_nodes,
int  node_count,
unsigned int *  h_primitive_indices,
int  primitive_count,
float *  h_primitive_aabb_min,
float *  h_primitive_aabb_max,
float *  h_query_aabb_min,
float *  h_query_aabb_max,
int  num_queries,
unsigned int *  h_results,
unsigned int *  h_result_counts,
int  max_results_per_query 
)

Launch BVH traversal kernel from C++ code.

Parameters
[in]h_nodesHost array of BVH nodes
[in]node_countNumber of BVH nodes
[in]h_primitive_indicesHost array of primitive indices
[in]primitive_countNumber of primitive indices
[in]h_query_aabb_minHost array of query AABB minimum corners
[in]h_query_aabb_maxHost array of query AABB maximum corners
[in]num_queriesNumber of queries
[out]h_resultsHost array for results
[out]h_result_countsHost array for result counts
[in]max_results_per_queryMaximum results per query

Definition at line 842 of file CollisionDetection.cu.

◆ launchRayPrimitiveIntersection()

void launchRayPrimitiveIntersection ( void *  h_bvh_nodes,
int  node_count,
unsigned int *  h_primitive_indices,
int  primitive_count,
int *  h_primitive_types,
float3 *  h_primitive_vertices,
unsigned int *  h_vertex_offsets,
int  total_vertex_count,
float *  h_ray_origins,
float *  h_ray_directions,
float *  h_ray_max_distances,
int  num_rays,
float *  h_hit_distances,
unsigned int *  h_hit_primitive_ids,
unsigned int *  h_hit_counts,
bool  find_closest_hit 
)

Launch optimized ray-triangle intersection kernel for true ray tracing.

This kernel implements proper ray-triangle intersection using the Möller-Trumbore algorithm with GPU optimizations for high-performance ray tracing.

Parameters
[in]h_bvh_nodesHost array of BVH nodes
[in]node_countNumber of BVH nodes
[in]h_primitive_indicesHost array of primitive indices
[in]primitive_countNumber of primitives
[in]h_triangle_verticesHost array of triangle vertex data (9 floats per triangle: v0,v1,v2)
[in]h_ray_originsHost array of ray origins (3 floats per ray)
[in]h_ray_directionsHost array of ray directions (3 floats per ray)
[in]h_ray_max_distancesHost array of ray maximum distances
[in]num_raysNumber of rays to process
[out]h_hit_distancesHost array for hit distances (closest hit per ray)
[out]h_hit_primitive_idsHost array for hit primitive IDs
[out]h_hit_countsHost array for number of hits per ray
[in]find_closest_hitIf true, return only closest hit; if false, return all hits within distance

Definition at line 522 of file CollisionDetection.cu.

◆ launchVoxelRayPathLengths()

void launchVoxelRayPathLengths ( int  num_rays,
float *  h_ray_origins,
float *  h_ray_directions,
float  grid_center_x,
float  grid_center_y,
float  grid_center_z,
float  grid_size_x,
float  grid_size_y,
float  grid_size_z,
int  grid_divisions_x,
int  grid_divisions_y,
int  grid_divisions_z,
int  primitive_count,
int *  h_voxel_ray_counts,
float *  h_voxel_path_lengths,
int *  h_voxel_transmitted,
int *  h_voxel_hit_before,
int *  h_voxel_hit_after,
int *  h_voxel_hit_inside 
)

Launch CUDA kernel for regular grid voxel ray path length calculation.

Definition at line 1142 of file CollisionDetection.cu.

◆ normalize()

__device__ __forceinline__ float3 normalize ( const float3 &  v)

Definition at line 85 of file CollisionDetection.cu.

◆ operator*()

__device__ __forceinline__ float3 operator* ( const float3 &  a,
float  scalar 
)

Definition at line 101 of file CollisionDetection.cu.

◆ operator+()

__device__ __forceinline__ float3 operator+ ( const float3 &  a,
const float3 &  b 
)

Definition at line 93 of file CollisionDetection.cu.

◆ operator-()

__device__ __forceinline__ float3 operator- ( const float3 &  a,
const float3 &  b 
)

Definition at line 97 of file CollisionDetection.cu.

◆ rayPatchIntersect()

__device__ __forceinline__ bool rayPatchIntersect ( const float3 &  origin,
const float3 &  direction,
const float3 &  v0,
const float3 &  v1,
const float3 &  v2,
const float3 &  v3,
float &  distance 
)

Definition at line 260 of file CollisionDetection.cu.

◆ rayPrimitiveBVHKernel()

__global__ void rayPrimitiveBVHKernel ( GPUBVHNode d_bvh_nodes,
unsigned int *  d_primitive_indices,
int *  d_primitive_types,
float3 *  d_primitive_vertices,
unsigned int *  d_vertex_offsets,
float3 *  d_ray_origins,
float3 *  d_ray_directions,
float *  d_ray_max_distances,
int  num_rays,
int  primitive_count,
int  total_vertex_count,
float *  d_hit_distances,
unsigned int *  d_hit_primitive_ids,
unsigned int *  d_hit_counts,
bool  find_closest_hit 
)

Definition at line 338 of file CollisionDetection.cu.

◆ rayTriangleIntersect()

__device__ __forceinline__ bool rayTriangleIntersect ( const float3 &  ray_origin,
const float3 &  ray_direction,
const float3 &  v0,
const float3 &  v1,
const float3 &  v2,
float  max_distance,
float &  hit_distance 
)

Fast ray-triangle intersection using Möller-Trumbore algorithm.

Parameters
[in]ray_originRay starting point
[in]ray_directionRay direction vector (normalized)
[in]v0First triangle vertex
[in]v1Second triangle vertex
[in]v2Third triangle vertex
[in]max_distanceMaximum ray distance
[out]hit_distanceDistance to intersection (if hit)
Returns
True if ray intersects triangle within max_distance

Definition at line 116 of file CollisionDetection.cu.

◆ rayTriangleIntersectCPU()

__device__ __forceinline__ bool rayTriangleIntersectCPU ( const float3 &  origin,
const float3 &  direction,
const float3 &  v0,
const float3 &  v1,
const float3 &  v2,
float &  distance 
)

High-performance GPU ray-triangle intersection kernel using BVH traversal.

This kernel implements proper ray-triangle intersection with BVH acceleration, using the Möller-Trumbore algorithm optimized for GPU warp efficiency.

Parameters
[in]d_bvh_nodesBVH nodes on GPU
[in]d_primitive_indicesPrimitive indices on GPU
[in]d_triangle_verticesTriangle vertex data on GPU (3 vertices per triangle)
[in]d_ray_originsRay origins on GPU
[in]d_ray_directionsRay directions on GPU
[in]d_ray_max_distancesRay maximum distances on GPU
[in]num_raysNumber of rays to process
[out]d_hit_distancesClosest hit distances per ray
[out]d_hit_primitive_idsHit primitive IDs per ray
[out]d_hit_countsNumber of hits per ray
[in]find_closest_hitIf true, return only closest hit

Definition at line 221 of file CollisionDetection.cu.

◆ rayVoxelIntersect()

__device__ bool rayVoxelIntersect ( const float3 &  ray_origin,
const float3 &  ray_direction,
const float3 &  aabb_min,
const float3 &  aabb_max,
float &  distance 
)

Definition at line 296 of file CollisionDetection.cu.

◆ warpRayAABBIntersect()

__device__ __forceinline__ bool warpRayAABBIntersect ( const float3 &  ray_origin,
const float3 &  ray_dir,
const float3 &  aabb_min,
const float3 &  aabb_max,
float  max_dist 
)

Warp-efficient ray-AABB intersection for GPU optimization.

Parameters
[in]ray_originRay starting point
[in]ray_dirRay direction vector (normalized)
[in]aabb_minAABB minimum corner
[in]aabb_maxAABB maximum corner
[in]max_distMaximum ray distance
Returns
True if ray intersects AABB within max_dist

Definition at line 168 of file CollisionDetection.cu.