Simplify highlighting logic.
Fixes https://gitlab.com/kicad/code/kicad/issues/8410
This commit is contained in:
parent
69509c9dd1
commit
7e8f2cdb94
|
@ -419,10 +419,9 @@ void MODEL_3D::Draw( bool aTransparent, float aOpacity, bool aUseSelectedMateria
|
||||||
reinterpret_cast<const void*>( offsetof( VERTEX, m_nrm ) ) );
|
reinterpret_cast<const void*>( offsetof( VERTEX, m_nrm ) ) );
|
||||||
|
|
||||||
glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( VERTEX ),
|
glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( VERTEX ),
|
||||||
reinterpret_cast<const void*>(
|
reinterpret_cast<const void*>( m_materialMode == MATERIAL_MODE::CAD_MODE
|
||||||
m_materialMode == MATERIAL_MODE::CAD_MODE
|
? offsetof( VERTEX, m_cad_color )
|
||||||
? offsetof( VERTEX, m_cad_color )
|
: offsetof( VERTEX, m_color ) ) );
|
||||||
: offsetof( VERTEX, m_color ) ) );
|
|
||||||
|
|
||||||
glTexCoordPointer( 2, GL_FLOAT, sizeof( VERTEX ),
|
glTexCoordPointer( 2, GL_FLOAT, sizeof( VERTEX ),
|
||||||
reinterpret_cast<const void*>( offsetof( VERTEX, m_tex_uv ) ) );
|
reinterpret_cast<const void*>( offsetof( VERTEX, m_tex_uv ) ) );
|
||||||
|
@ -448,11 +447,12 @@ void MODEL_3D::Draw( bool aTransparent, float aOpacity, bool aUseSelectedMateria
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATERIAL_MODE::DIFFUSE_ONLY:
|
case MATERIAL_MODE::DIFFUSE_ONLY:
|
||||||
OglSetDiffuseMaterial( mat.m_Diffuse, aOpacity );
|
OglSetDiffuseMaterial( mat.m_Diffuse, aOpacity, aUseSelectedMaterial, aSelectionColor );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATERIAL_MODE::CAD_MODE:
|
case MATERIAL_MODE::CAD_MODE:
|
||||||
OglSetDiffuseMaterial( MaterialDiffuseToColorCAD( mat.m_Diffuse ), aOpacity );
|
OglSetDiffuseMaterial( MaterialDiffuseToColorCAD( mat.m_Diffuse ), aOpacity,
|
||||||
|
aUseSelectedMaterial, aSelectionColor );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -511,8 +511,8 @@ void MODEL_3D::DrawBboxes() const
|
||||||
glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( VERTEX ),
|
glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof( VERTEX ),
|
||||||
reinterpret_cast<const void*>( offsetof( VERTEX, m_color ) ) );
|
reinterpret_cast<const void*>( offsetof( VERTEX, m_color ) ) );
|
||||||
|
|
||||||
unsigned int idx_size = m_bbox_index_buffer_type == GL_UNSIGNED_SHORT
|
unsigned int idx_size = m_bbox_index_buffer_type == GL_UNSIGNED_SHORT ? sizeof( GLushort )
|
||||||
? sizeof( GLushort ) : sizeof( GLuint );
|
: sizeof( GLuint );
|
||||||
|
|
||||||
glDrawElements( GL_LINES, bbox_idx_count * m_meshes_bbox.size(), m_bbox_index_buffer_type,
|
glDrawElements( GL_LINES, bbox_idx_count * m_meshes_bbox.size(), m_bbox_index_buffer_type,
|
||||||
reinterpret_cast<const void*>(
|
reinterpret_cast<const void*>(
|
||||||
|
|
|
@ -1186,49 +1186,28 @@ void RENDER_3D_LEGACY::render3dModelsSelected( bool aRenderTopOrBot, bool aRende
|
||||||
// Go for all footprints
|
// Go for all footprints
|
||||||
for( FOOTPRINT* fp : m_boardAdapter.GetBoard()->Footprints() )
|
for( FOOTPRINT* fp : m_boardAdapter.GetBoard()->Footprints() )
|
||||||
{
|
{
|
||||||
const bool isIntersected = fp == m_currentRollOverItem;
|
|
||||||
bool highlight = false;
|
bool highlight = false;
|
||||||
|
|
||||||
if( m_boardAdapter.GetFlag( FL_USE_SELECTION ) )
|
if( m_boardAdapter.GetFlag( FL_USE_SELECTION ) )
|
||||||
{
|
{
|
||||||
if( isIntersected )
|
if( fp->IsSelected() )
|
||||||
{
|
highlight = true;
|
||||||
if( aRenderSelectedOnly )
|
|
||||||
highlight = m_boardAdapter.GetFlag( FL_HIGHLIGHT_ROLLOVER_ITEM );
|
|
||||||
}
|
|
||||||
else if( ( aRenderSelectedOnly && !fp->IsSelected() )
|
|
||||||
|| ( !aRenderSelectedOnly && fp->IsSelected() ) )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( highlight )
|
if( m_boardAdapter.GetFlag( FL_HIGHLIGHT_ROLLOVER_ITEM ) && fp == m_currentRollOverItem )
|
||||||
{
|
highlight = true;
|
||||||
glEnable( GL_POLYGON_OFFSET_LINE );
|
|
||||||
glPolygonOffset( 8.0, 1.0 );
|
if( aRenderSelectedOnly != highlight )
|
||||||
glPolygonMode( GL_FRONT, GL_LINE );
|
continue;
|
||||||
glLineWidth( 6 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !fp->Models().empty() )
|
if( !fp->Models().empty() )
|
||||||
{
|
{
|
||||||
if( m_boardAdapter.IsFootprintShown( (FOOTPRINT_ATTR_T) fp->GetAttributes() ) )
|
if( m_boardAdapter.IsFootprintShown( (FOOTPRINT_ATTR_T) fp->GetAttributes() ) )
|
||||||
{
|
{
|
||||||
if( ( aRenderTopOrBot && !fp->IsFlipped() )
|
if( aRenderTopOrBot == !fp->IsFlipped() )
|
||||||
|| ( !aRenderTopOrBot && fp->IsFlipped() ) )
|
renderFootprint( fp, aRenderTransparentOnly, highlight );
|
||||||
{
|
|
||||||
renderFootprint( fp, aRenderTransparentOnly, isIntersected );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( highlight )
|
|
||||||
{
|
|
||||||
// Restore
|
|
||||||
glDisable( GL_POLYGON_OFFSET_LINE );
|
|
||||||
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MODEL_3D::EndDrawMulti();
|
MODEL_3D::EndDrawMulti();
|
||||||
|
|
|
@ -124,7 +124,7 @@ void OglSetMaterial( const SMATERIAL& aMaterial, float aOpacity, bool aUseSelec
|
||||||
// !TODO: at this moment, diffuse color is added via
|
// !TODO: at this moment, diffuse color is added via
|
||||||
// glEnableClientState( GL_COLOR_ARRAY ) so this line may has no effect
|
// glEnableClientState( GL_COLOR_ARRAY ) so this line may has no effect
|
||||||
// but can be used for optimization
|
// but can be used for optimization
|
||||||
const SFVEC4F diffuse = SFVEC4F( aUseSelectedMaterial?aSelectionColor:aMaterial.m_Diffuse,
|
const SFVEC4F diffuse = SFVEC4F( aUseSelectedMaterial ? aSelectionColor : aMaterial.m_Diffuse,
|
||||||
( 1.0f - aMaterial.m_Transparency ) * aOpacity );
|
( 1.0f - aMaterial.m_Transparency ) * aOpacity );
|
||||||
const SFVEC4F specular = SFVEC4F( aMaterial.m_Specular, 1.0f );
|
const SFVEC4F specular = SFVEC4F( aMaterial.m_Specular, 1.0f );
|
||||||
const SFVEC4F emissive = SFVEC4F( aMaterial.m_Emissive, 1.0f );
|
const SFVEC4F emissive = SFVEC4F( aMaterial.m_Emissive, 1.0f );
|
||||||
|
@ -140,10 +140,12 @@ void OglSetMaterial( const SMATERIAL& aMaterial, float aOpacity, bool aUseSelec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void OglSetDiffuseMaterial( const SFVEC3F &aMaterialDiffuse, float aOpacity )
|
void OglSetDiffuseMaterial( const SFVEC3F &aMaterialDiffuse, float aOpacity,
|
||||||
|
bool aUseSelectedMaterial, SFVEC3F aSelectionColor )
|
||||||
{
|
{
|
||||||
const SFVEC4F ambient = SFVEC4F( 0.2f, 0.2f, 0.2f, 1.0f );
|
const SFVEC4F ambient = SFVEC4F( 0.2f, 0.2f, 0.2f, 1.0f );
|
||||||
const SFVEC4F diffuse = SFVEC4F( aMaterialDiffuse, aOpacity );
|
const SFVEC4F diffuse = SFVEC4F( aUseSelectedMaterial ? aSelectionColor : aMaterialDiffuse,
|
||||||
|
aOpacity );
|
||||||
const SFVEC4F specular = SFVEC4F( 0.0f, 0.0f, 0.0f, 1.0f );
|
const SFVEC4F specular = SFVEC4F( 0.0f, 0.0f, 0.0f, 1.0f );
|
||||||
const SFVEC4F emissive = SFVEC4F( 0.0f, 0.0f, 0.0f, 1.0f );
|
const SFVEC4F emissive = SFVEC4F( 0.0f, 0.0f, 0.0f, 1.0f );
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,9 @@ void OglSetMaterial( const SMATERIAL& aMaterial, float aOpacity,
|
||||||
*
|
*
|
||||||
* @param aMaterialDiffuse the diffuse color to assign to material properties.
|
* @param aMaterialDiffuse the diffuse color to assign to material properties.
|
||||||
*/
|
*/
|
||||||
void OglSetDiffuseMaterial( const SFVEC3F& aMaterialDiffuse, float aOpacity );
|
void OglSetDiffuseMaterial( const SFVEC3F& aMaterialDiffuse, float aOpacity,
|
||||||
|
bool aUseSelectedMaterial = false,
|
||||||
|
SFVEC3F aSelectionColor = SFVEC3F( 0.0f ) );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a new OpenGL texture.
|
* Generate a new OpenGL texture.
|
||||||
|
|
Loading…
Reference in New Issue