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..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(); @@ -199,7 +211,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 +228,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 )