diff --git a/include/viennaray/gpu/raygLaunchParams.hpp b/include/viennaray/gpu/raygLaunchParams.hpp index 0f0f4d8..666df4b 100644 --- a/include/viennaray/gpu/raygLaunchParams.hpp +++ b/include/viennaray/gpu/raygLaunchParams.hpp @@ -40,6 +40,7 @@ struct LaunchParams { float sticking = 1.f; float cosineExponent = 1.f; int *materialIds; + int *materialMap; float *materialSticking; void *customData; diff --git a/include/viennaray/gpu/raygTrace.hpp b/include/viennaray/gpu/raygTrace.hpp index 5fb345b..311274c 100644 --- a/include/viennaray/gpu/raygTrace.hpp +++ b/include/viennaray/gpu/raygTrace.hpp @@ -97,6 +97,7 @@ template class Trace { if (materialIdsBuffer_.sizeInBytes != 0) { launchParams_.materialIds = (int *)materialIdsBuffer_.dPointer(); + launchParams_.materialMap = (int *)materialMapBuffer_.dPointer(); } launchParams_.seed = config_.rngSeed + config_.runNumber++; @@ -243,14 +244,24 @@ template class Trace { template void setMaterialIds(const std::vector &materialIds, - const bool mapToConsecutive = true) { + const bool mapToConsecutive = true, + const std::set &pUniqueMaterialIds = {}) { assert(materialIds.size() == launchParams_.numElements); - if (mapToConsecutive) { - uniqueMaterialIds_.clear(); + uniqueMaterialIds_.clear(); + if (!pUniqueMaterialIds.empty()) { + uniqueMaterialIds_ = pUniqueMaterialIds; + } else { for (auto &matId : materialIds) { uniqueMaterialIds_.insert(static_cast(matId)); } + } + + std::vector materialMap(uniqueMaterialIds_.begin(), + uniqueMaterialIds_.end()); + materialMapBuffer_.allocUpload(materialMap); + + if (mapToConsecutive) { std::unordered_map materialIdMap; int currentId = 0; for (auto &uniqueMaterialId : uniqueMaterialIds_) { @@ -266,6 +277,7 @@ template class Trace { materialIdsBuffer_.allocUpload(materialIdsMapped); } else { std::vector materialIdsMapped(launchParams_.numElements); +#pragma omp parallel for for (int i = 0; i < launchParams_.numElements; i++) { materialIdsMapped[i] = static_cast(materialIds[i]); } @@ -347,6 +359,7 @@ template class Trace { buffer.free(); } materialIdsBuffer_.free(); + materialMapBuffer_.free(); for (auto &buffer : materialStickingBuffer_) { buffer.free(); } @@ -749,6 +762,7 @@ template class Trace { std::vector> particles_; CudaBuffer dataPerParticleBuffer_; // same for all particles std::vector materialStickingBuffer_; // different for particles + CudaBuffer materialMapBuffer_; // sbt data CudaBuffer cellDataBuffer_;