From dd57c91bc70ac1ae0e7da0719912e46e6c5ef539 Mon Sep 17 00:00:00 2001 From: Daniel Dresser Date: Thu, 27 Jun 2024 16:57:33 -0700 Subject: [PATCH 1/2] VDBObject : Don't bake in automatic metadata when querying metadata --- Changes | 4 ++++ include/IECoreVDB/VDBObject.h | 2 +- src/IECoreVDB/VDBObject.cpp | 9 ++------- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Changes b/Changes index 69f92ae923..21cb9047f1 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,10 @@ 10.5.x.x (relative to 10.5.9.0) ======== +Fixes +----- + +VDBObject : metadata() now just returns existing metadata, without modifying it. 10.5.9.x (relative to 10.5.8.0) diff --git a/include/IECoreVDB/VDBObject.h b/include/IECoreVDB/VDBObject.h index ea2f7eb650..9a84a9bcbd 100644 --- a/include/IECoreVDB/VDBObject.h +++ b/include/IECoreVDB/VDBObject.h @@ -88,7 +88,7 @@ class IECOREVDB_API VDBObject : public IECoreScene::VisibleRenderable Imath::Box3f bound() const override; void render( IECoreScene::Renderer *renderer ) const override; - IECore::CompoundObjectPtr metadata( const std::string &name ); + IECore::CompoundObjectPtr metadata( const std::string &name ) const; //! Are the grids in this VDBObject unmodified from the vdb file in filename? //! Useful for passing VDB objects to renders by filename instead of memory buffer diff --git a/src/IECoreVDB/VDBObject.cpp b/src/IECoreVDB/VDBObject.cpp index 8a3d8244e0..82372a9c26 100644 --- a/src/IECoreVDB/VDBObject.cpp +++ b/src/IECoreVDB/VDBObject.cpp @@ -199,7 +199,7 @@ void VDBObject::render( IECoreScene::Renderer *renderer ) const { } -IECore::CompoundObjectPtr VDBObject::metadata( const std::string &name ) +IECore::CompoundObjectPtr VDBObject::metadata( const std::string &name ) const { CompoundObjectPtr metadata = new CompoundObject(); @@ -216,12 +216,7 @@ IECore::CompoundObjectPtr VDBObject::metadata( const std::string &name ) } else { - openvdb::GridBase::Ptr tmpGrid = findGrid ( name ); - if ( tmpGrid ) - { - tmpGrid->addStatsMetadata(); - } - grid = tmpGrid; + grid = findGrid ( name ); } if( !grid ) From 7f0610c51c93882317baca39136b293cf0fba976 Mon Sep 17 00:00:00 2001 From: Daniel Dresser Date: Thu, 27 Jun 2024 18:33:10 -0700 Subject: [PATCH 2/2] FIX : worldBound --- src/IECoreVDB/VDBObject.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/IECoreVDB/VDBObject.cpp b/src/IECoreVDB/VDBObject.cpp index 82372a9c26..aa73730ea6 100644 --- a/src/IECoreVDB/VDBObject.cpp +++ b/src/IECoreVDB/VDBObject.cpp @@ -57,11 +57,23 @@ namespace template Imath::Box > worldBound( const openvdb::GridBase *grid, float padding = 0.50f ) { - openvdb::Vec3i min = grid->metaValue( grid->META_FILE_BBOX_MIN ); - openvdb::Vec3i max = grid->metaValue( grid->META_FILE_BBOX_MAX ); + openvdb::CoordBBox vdbBbox; + try + { + vdbBbox.min() = openvdb::Coord( grid->metaValue( grid->META_FILE_BBOX_MIN ) ); + vdbBbox.max() = openvdb::Coord( grid->metaValue( grid->META_FILE_BBOX_MAX ) ); + } + catch( ... ) + { + // If we don't have metadata available, then hopefully it's because the vdb was freshly created and + // hasn't been saved to file yet, which should mean it's fully loaded, and we can call + // evalActiveVoxelBoundingBox. + // \todo : Can we guarantee that every VDB either is loaded, or has metadata? + vdbBbox = grid->evalActiveVoxelBoundingBox(); + } openvdb::Vec3d offset = openvdb::Vec3d( padding ); - openvdb::BBoxd indexBounds = openvdb::BBoxd( min - offset, max + offset ); + openvdb::BBoxd indexBounds = openvdb::BBoxd( vdbBbox.min() - offset, vdbBbox.max() + offset ); openvdb::BBoxd worldBounds = grid->transform().indexToWorld( indexBounds ); openvdb::Vec3d minBB = worldBounds.min(); openvdb::Vec3d maxBB = worldBounds.max();