ON_BOOL32 ON_InstanceRef::GetBBox( double* boxmin, double* boxmax, ON_BOOL32 bGrowBox ) const { if ( !boxmin || !boxmax ) { bGrowBox = false; } else if ( bGrowBox ) { bGrowBox = ON_BoundingBox(ON_3dPoint(boxmin),ON_3dPoint(boxmax)).IsValid(); } if( m_bbox.IsValid() ) { if( bGrowBox ) { if( boxmin[0] > m_bbox.m_min.x ) boxmin[0] = m_bbox.m_min.x; if( boxmin[1] > m_bbox.m_min.y ) boxmin[1] = m_bbox.m_min.y; if( boxmin[2] > m_bbox.m_min.z ) boxmin[2] = m_bbox.m_min.z; if( boxmax[0] < m_bbox.m_max.x ) boxmax[0] = m_bbox.m_max.x; if( boxmax[1] < m_bbox.m_max.y ) boxmax[1] = m_bbox.m_max.y; if( boxmax[2] < m_bbox.m_max.z ) boxmax[2] = m_bbox.m_max.z; } else { if( boxmin ) { boxmin[0] = m_bbox.m_min.x; boxmin[1] = m_bbox.m_min.y; boxmin[2] = m_bbox.m_min.z; } if( boxmax ) { boxmax[0] = m_bbox.m_max.x; boxmax[1] = m_bbox.m_max.y; boxmax[2] = m_bbox.m_max.z; } bGrowBox = true; } } return bGrowBox; }
void BBNode::BuildBBox() { if (m_children.size() > 0) { for (std::vector<BBNode *>::iterator childnode = m_children.begin(); childnode != m_children.end(); childnode++) { if (!(*childnode)->isLeaf()) { (*childnode)->BuildBBox(); } if (childnode == m_children.begin()) { m_node = ON_BoundingBox((*childnode)->m_node.m_min, (*childnode)->m_node.m_max); } else { for (int j = 0; j < 3; j++) { V_MIN(m_node.m_min[j], (*childnode)->m_node.m_min[j]); V_MAX(m_node.m_max[j], (*childnode)->m_node.m_max[j]); } } } } }