228 std::cout <<
"Calculating primitive-voxel intersections..." << std::flush;
231 std::vector<uint> UUIDs_voxels;
232 std::vector<uint> UUIDs_prims;
234 UUIDs_voxels.resize(UUIDs.size());
235 UUIDs_prims.resize(UUIDs.size());
241 for (
size_t u = 0; u < UUIDs.size(); u++) {
246 if (type == helios::PRIMITIVE_TYPE_VOXEL) {
247 UUIDs_voxels.at(Nvoxels) = p;
250 UUIDs_prims.at(Nprims) = p;
257 std::cout <<
"done. ";
258 std::cout <<
"WARNING: no voxels found in Context, nothing to intersect." << std::endl;
260 }
else if (Nprims == 0) {
262 std::cout <<
"done. ";
263 std::cout <<
"WARNING: no planar primitives found in Context, nothing to intersect." << std::endl;
267 UUIDs_voxels.resize(Nvoxels);
268 UUIDs_prims.resize(Nprims);
270 std::map<uint, std::vector<uint>> vint;
274 const uint N = Nprims;
277 float3 *hit_xyz = (float3 *) malloc(N *
sizeof(float3));
278 CUDA_CHECK_ERROR(cudaMalloc((
void **) &d_hit_xyz, N *
sizeof(float3)));
281 for (std::size_t r = 0; r < N; r++) {
286 CUDA_CHECK_ERROR(cudaMemcpy(d_hit_xyz, hit_xyz, N *
sizeof(float3), cudaMemcpyHostToDevice));
290 float3 *d_grid_center;
292 float *d_grid_rotation;
294 const uint Ncells = Nvoxels;
296 float3 *center = (float3 *) malloc(Ncells *
sizeof(float3));
297 CUDA_CHECK_ERROR(cudaMalloc((
void **) &d_grid_center, Ncells *
sizeof(float3)));
299 float3 *size = (float3 *) malloc(Ncells *
sizeof(float3));
300 CUDA_CHECK_ERROR(cudaMalloc((
void **) &d_grid_size, Ncells *
sizeof(float3)));
302 float *rotation = (
float *) malloc(Ncells *
sizeof(
float));
303 CUDA_CHECK_ERROR(cudaMalloc((
void **) &d_grid_rotation, Ncells *
sizeof(
float)));
306 for (
int c = 0; c < Ncells; c++) {
307 center[c] = vec3tofloat3(context->
getVoxelCenter(UUIDs_voxels.at(c)));
308 size[c] = vec3tofloat3(context->
getVoxelSize(UUIDs_voxels.at(c)));
311 std::vector<uint> empty_uint_vector;
312 context->
setPrimitiveData(UUIDs_voxels.at(c),
"inside_UUIDs", empty_uint_vector);
316 CUDA_CHECK_ERROR(cudaMemcpy(d_grid_center, center, Ncells *
sizeof(float3), cudaMemcpyHostToDevice));
317 CUDA_CHECK_ERROR(cudaMemcpy(d_grid_size, size, Ncells *
sizeof(float3), cudaMemcpyHostToDevice));
318 CUDA_CHECK_ERROR(cudaMemcpy(d_grid_rotation, rotation, Ncells *
sizeof(
float), cudaMemcpyHostToDevice));
326 int *hit_vol = (
int *) malloc(N *
sizeof(
int));
328 CUDA_CHECK_ERROR(cudaMalloc(&d_hit_vol, N *
sizeof(
int)));
330 dim3 dimBlock(64, 1);
331 dim3 dimGrid(ceil(N / 64.f));
332 insideVolume_vi<<<dimGrid, dimBlock>>>(N, d_hit_xyz, Ncells, d_grid_size, d_grid_center, d_grid_rotation, d_hit_vol);
334 CUDA_CHECK_ERROR(cudaPeekAtLastError());
335 CUDA_CHECK_ERROR(cudaDeviceSynchronize());
337 CUDA_CHECK_ERROR(cudaMemcpy(hit_vol, d_hit_vol, N *
sizeof(
int), cudaMemcpyDeviceToHost));
339 for (std::size_t r = 0; r < N; r++) {
340 if (hit_vol[r] >= 0) {
341 vint[UUIDs_voxels.at(hit_vol[r])].push_back(UUIDs_prims.at(r));
345 for (std::map<
uint, std::vector<uint>>::iterator it = vint.begin(); it != vint.end(); ++it) {
346 uint UUID = it->first;
347 size_t s = vint.at(UUID).size();
353 CUDA_CHECK_ERROR(cudaFree(d_hit_vol));
354 CUDA_CHECK_ERROR(cudaFree(d_hit_xyz));
355 CUDA_CHECK_ERROR(cudaFree(d_grid_center));
356 CUDA_CHECK_ERROR(cudaFree(d_grid_size));
360 std::cout <<
"done." << std::endl;