bool Gadget::visible( Gadget *relativeTo ) { Gadget *g = this; while( g && g != relativeTo ) { if( !g->getVisible() ) { return false; } g = g->parent<Gadget>(); } return true; }
void LinearContainer::calculateChildTransforms() const { if( m_clean ) { return; } int axis = m_orientation - 1; V3f size( 0 ); vector<Box3f> bounds; for( ChildContainer::const_iterator it=children().begin(); it!=children().end(); it++ ) { const Gadget *child = static_cast<const Gadget *>( it->get() ); if( !child->getVisible() ) { continue; } Box3f b = child->bound(); if( !b.isEmpty() ) { for( int a=0; a<3; a++ ) { if( a==axis ) { size[a] += b.size()[a]; } else { size[a] = max( size[a], b.size()[a] ); } } } bounds.push_back( b ); } size[axis] += (bounds.size() - 1) * m_spacing; float offset = size[axis] / 2.0f * ( m_direction==Increasing ? -1.0f : 1.0f ); int i = 0; for( ChildContainer::const_iterator it=children().begin(); it!=children().end(); it++ ) { Gadget *child = static_cast<Gadget *>( it->get() ); if( !child->getVisible() ) { continue; } const Box3f &b = bounds[i++]; V3f childOffset( 0 ); if( !b.isEmpty() ) { for( int a=0; a<3; a++ ) { if( a==axis ) { childOffset[a] = offset - ( m_direction==Increasing ? b.min[a] : b.max[a] ); } else { switch( m_alignment ) { case Min : childOffset[a] = -size[a]/2.0f - b.min[a]; break; case Centre : childOffset[a] = -b.center()[a]; break; default : // max childOffset[a] = size[a]/2.0f - b.max[a]; } } } offset += b.size()[axis] * ( m_direction==Increasing ? 1.0f : -1.0f ); } offset += m_spacing * ( m_direction==Increasing ? 1.0f : -1.0f ); M44f m; m.translate( childOffset ); child->setTransform( m ); } m_clean = true; }