EgtGraphics 1.5k4 :
- mark e selezione cambia colore anche back di superfici - miglioramento selezione entità - miglioramento selezione punti notevoli.
This commit is contained in:
-167
@@ -758,173 +758,6 @@ Scene::Draw( void)
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
CompareSelRec( const void* pSr1, const void* pSr2)
|
||||
{
|
||||
if ( ((SelRec*)pSr1)->nZmin > ((SelRec*)pSr2)->nZmin)
|
||||
return 1 ;
|
||||
else if ( ((SelRec*)pSr1)->nZmin < ((SelRec*)pSr2)->nZmin)
|
||||
return - 1 ;
|
||||
else {
|
||||
if ( ((SelRec*)pSr1)->nId > ((SelRec*)pSr2)->nId)
|
||||
return 1 ;
|
||||
else if ( ((SelRec*)pSr1)->nId < ((SelRec*)pSr2)->nId)
|
||||
return - 1 ;
|
||||
else
|
||||
return 0 ;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Scene::Select( const Point3d& ptSelCenter, int nW, int nH, int& nSel)
|
||||
{
|
||||
// inizializzo selezione
|
||||
m_bSelect = true ;
|
||||
m_ptSelCent = ptSelCenter ;
|
||||
m_nSelW = abs( nW) ;
|
||||
m_nSelH = abs( nH) ;
|
||||
m_nSelNbr = 0 ;
|
||||
|
||||
// se una delle due dimensioni è nulla, non posso selezionare alcunché
|
||||
if ( m_nSelW == 0 || m_nSelH == 0) {
|
||||
m_bSelect = false ;
|
||||
nSel = m_nSelNbr ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
// sfondo e Zbuffer non interessano
|
||||
|
||||
// imposto la camera, riducendo la viewport all'area di selezione
|
||||
if ( ! Prepare()) {
|
||||
m_bSelect = false ;
|
||||
nSel = m_nSelNbr ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// imposto modalità di selezione
|
||||
glSelectBuffer( DIM_SEL_BUF, (GLuint*)m_nSelBuff) ;
|
||||
glRenderMode( GL_SELECT) ;
|
||||
|
||||
// inizializzo stack dei nomi
|
||||
glInitNames() ;
|
||||
glPushName( 0) ;
|
||||
|
||||
// eseguo disegno
|
||||
// disabilito illuminazione
|
||||
glDisable( GL_LIGHTING) ;
|
||||
// non imposto glPolygonMode secondo il tipo di rendering perchè ignorato in selezione
|
||||
// disegno le geometrie del DB in una sola passata
|
||||
DrawGroup( GDB_ID_ROOT, 1, MdStMk( GDB_MD_STD, GDB_ST_ON, GDB_MK_OFF)) ;
|
||||
|
||||
// pulisco stack nomi
|
||||
glPopName() ;
|
||||
|
||||
// chiudo modalità selezione, recupero buffer ripristino le matrici di OpenGL
|
||||
m_nSelNbr = glRenderMode( GL_RENDER) ;
|
||||
if ( m_nSelNbr < 0)
|
||||
m_nSelNbr = DIM_SEL_BUF ;
|
||||
m_bSelect = false ;
|
||||
Prepare() ;
|
||||
|
||||
// riordino il buffer di selezione secondo la Zdepth minima crescente
|
||||
qsort( m_nSelBuff, m_nSelNbr, sizeof( SelRec), CompareSelRec) ;
|
||||
|
||||
nSel = m_nSelNbr ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Scene::GetSelectedObjs( INTVECTOR& nIds)
|
||||
{
|
||||
// inizializzo vettore Id
|
||||
nIds.clear() ;
|
||||
try { nIds.reserve( m_nSelNbr) ; }
|
||||
catch(...) { return false ; }
|
||||
// inserisco l'Id degli oggetti selezionati
|
||||
for ( int i = 0 ; i < m_nSelNbr ; ++ i)
|
||||
nIds.push_back( m_nSelBuff[i].nId) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Scene::GetFirstSelectedObj( void)
|
||||
{
|
||||
m_nSelCurr = - 1 ;
|
||||
return GetNextSelectedObj() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
Scene::GetNextSelectedObj( void)
|
||||
{
|
||||
// fuori dal range
|
||||
m_nSelCurr ++ ;
|
||||
if ( m_nSelCurr < 0 || m_nSelCurr >= m_nSelNbr)
|
||||
return GDB_ID_NULL ;
|
||||
return m_nSelBuff[m_nSelCurr].nId ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
double
|
||||
Scene::GetSelectedObjWinZ( int nSel)
|
||||
{
|
||||
if ( nSel < 0)
|
||||
nSel = m_nSelCurr ;
|
||||
if ( nSel < 0 || nSel >= m_nSelNbr)
|
||||
return 0.5 ;
|
||||
return 0.5 * ( double( m_nSelBuff[nSel].nZmin) + double( m_nSelBuff[nSel].nZmax)) / UINT_MAX ;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------------------*/
|
||||
bool
|
||||
Scene::UnselectableAdd( int nId)
|
||||
{
|
||||
// non si ammettono radice e id negativi
|
||||
if ( nId <= GDB_ID_ROOT)
|
||||
return false ;
|
||||
// inserisco l'elemento
|
||||
m_Unsel.push_back( nId) ;
|
||||
// ordino in senso crescente
|
||||
stable_sort( m_Unsel.begin(), m_Unsel.end()) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------------------*/
|
||||
bool
|
||||
Scene::UnselectableRemove( int nId)
|
||||
{
|
||||
// non si ammettono radice e id negativi
|
||||
if ( nId <= GDB_ID_ROOT)
|
||||
return false ;
|
||||
// cerco l'elemento
|
||||
INTVECTOR::iterator Iter = find( m_Unsel.begin(), m_Unsel.end(), nId) ;
|
||||
if ( Iter == m_Unsel.end())
|
||||
return true ;
|
||||
m_Unsel.erase( Iter) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------------------*/
|
||||
bool
|
||||
Scene::UnselectableClearAll( void)
|
||||
{
|
||||
// cancello tutto
|
||||
m_Unsel.clear() ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------------------*/
|
||||
bool
|
||||
Scene::UnselectableFind( int nId)
|
||||
{
|
||||
// eseguo ricerca su vettore ordinato in senso crescente
|
||||
return binary_search( m_Unsel.begin(), m_Unsel.end(), nId) ;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------------------*/
|
||||
bool
|
||||
Scene::Project( const Point3d& ptWorld, Point3d& ptView)
|
||||
|
||||
Reference in New Issue
Block a user