Imath::Box3d HoudiniScene::readBound( double time ) const { OP_Node *node = retrieveNode( true ); Imath::Box3d bounds; UT_BoundingBox box; OP_Context context( time ); /// \todo: this doesn't account for SOPs containing multiple shapes /// if we fix it, we need to fix the condition below as well if ( node->getBoundingBox( box, context ) ) { bounds = IECore::convert<Imath::Box3d>( box ); } // paths embedded within a sop already have bounds accounted for if ( m_contentIndex ) { return bounds; } NameList children; childNames( children ); for ( NameList::iterator it=children.begin(); it != children.end(); ++it ) { ConstSceneInterfacePtr childScene = child( *it ); Imath::Box3d childBound = childScene->readBound( time ); if ( !childBound.isEmpty() ) { bounds.extendBy( Imath::transform( childBound, childScene->readTransformAsMatrix( time ) ) ); } } return bounds; }
MBoundingBox convert( const Imath::Box3d &from ) { if( from.isEmpty() ) { return MBoundingBox(); } return MBoundingBox( convert<MPoint>( from.min ), convert<MPoint>( from.max ) ); }
static Imath::Box3d getBoundingBox(const V3d& offset, const std::vector<float>& vertices) { Imath::Box3d bbox; for (size_t i = 0; i < vertices.size(); i+=3) bbox.extendBy(V3d(vertices[i], vertices[i+1], vertices[i+2])); if (!bbox.isEmpty()) { bbox.min += offset; bbox.max += offset; } return bbox; }