Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions tsd/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ option(TSD_USE_TORCH "Use PyTorch for importing neural geometries" OFF)
option(TSD_USE_VTK "Use VTK for importing VTK file formats" OFF)
option(TSD_USE_SILO "Use Silo for importing Silo file formats" OFF)
option(TSD_USE_MPI "Enable MPI support" OFF)
option(TSD_NANOVDB_SKIP_INVALID_VOLUMES
"Skip NanoVDB volumes with zero active voxels" OFF)
option(TSD_USE_NETWORKING "Enable networking support via boost.asio" OFF)

if (APPLE)
Expand Down
6 changes: 6 additions & 0 deletions tsd/src/tsd/io/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,9 @@ if (TSD_USE_SILO)
else()
project_compile_definitions(PRIVATE -DTSD_USE_SILO=0)
endif()

if (TSD_NANOVDB_SKIP_INVALID_VOLUMES)
project_compile_definitions(PRIVATE -DTSD_NANOVDB_SKIP_INVALID_VOLUMES=1)
else()
project_compile_definitions(PRIVATE -DTSD_NANOVDB_SKIP_INVALID_VOLUMES=0)
endif()
32 changes: 32 additions & 0 deletions tsd/src/tsd/io/importers/import_NVDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,38 @@ SpatialFieldRef import_NVDB(Scene &scene, const char *filepath)
try {
auto grid = nanovdb::io::readGrid(filepath);
auto metadata = grid.gridMetaData();

bool hasActiveVoxels = false;
switch (metadata->gridType()) {
case nanovdb::GridType::Fp4:
hasActiveVoxels = grid.grid<nanovdb::Fp4>()->activeVoxelCount() > 0;
break;
case nanovdb::GridType::Fp8:
hasActiveVoxels = grid.grid<nanovdb::Fp8>()->activeVoxelCount() > 0;
break;
case nanovdb::GridType::Fp16:
hasActiveVoxels = grid.grid<nanovdb::Fp16>()->activeVoxelCount() > 0;
break;
case nanovdb::GridType::FpN:
hasActiveVoxels = grid.grid<nanovdb::FpN>()->activeVoxelCount() > 0;
break;
case nanovdb::GridType::Float:
hasActiveVoxels = grid.grid<float>()->activeVoxelCount() > 0;
break;
default:
break;
}

if (!hasActiveVoxels) {
logWarning("[import_NVDB] no active voxels in '%s'", filepath);
if (TSD_NANOVDB_SKIP_INVALID_VOLUMES) {
logStatus(
"[import_NVDB] skipping due to TSD_NANOVDB_SKIP_INVALID_VOLUMES");
scene.removeObject(field.data());
return {};
}
}

if (!metadata->hasMinMax()) {
switch (metadata->gridType()) {
case nanovdb::GridType::Fp4: {
Expand Down
6 changes: 4 additions & 2 deletions tsd/src/tsd/io/importers/import_USD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -910,7 +910,8 @@ static void import_usd_volume(Scene &scene,
VolumeTransferFunction tf = get_volume_transfer_function(prim);

ArrayRef colorArray;
math::float2 valueRange;
// Default to the field's value range to avoid undefined ranges.
math::float2 valueRange = field->computeValueRange();

// Create a volume node and assign the field, color map, and value range
auto [inst, volume] = scene.insertNewChildObjectNode<Volume>(
Expand All @@ -922,7 +923,8 @@ static void import_usd_volume(Scene &scene,
// Use transfer function from USD material
colorArray = scene.createArray(ANARI_FLOAT32_VEC4, tf.colors.size());
colorArray->setData(tf.colors.data(), tf.colors.size());
valueRange = tf.domain;
if (tf.domain.x < tf.domain.y)
valueRange = tf.domain;

// Create opacity control points from USD transfer function
std::vector<math::float2> opacityControlPoints;
Expand Down