3D-Viewer: use LAYER_SELECT_OVERLAY color for selection
preserve material transparency while rendering as selected
This commit is contained in:
parent
10676eb926
commit
5205709399
|
@ -890,6 +890,8 @@ bool C3D_RENDER_OGL_LEGACY::Redraw(
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_selectionColor = m_boardAdapter.GetItemColor( LAYER_SELECT_OVERLAY );
|
||||||
|
|
||||||
// Render 3D Models (Non-transparent)
|
// Render 3D Models (Non-transparent)
|
||||||
// /////////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////////
|
||||||
render_3D_models( false, false );
|
render_3D_models( false, false );
|
||||||
|
@ -1349,9 +1351,12 @@ void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module,
|
||||||
glMultMatrixf( glm::value_ptr( mtx ) );
|
glMultMatrixf( glm::value_ptr( mtx ) );
|
||||||
|
|
||||||
if( aRenderTransparentOnly )
|
if( aRenderTransparentOnly )
|
||||||
modelPtr->Draw_transparent( sM.m_Opacity, module->IsSelected() || aIsSelected );
|
modelPtr->Draw_transparent( sM.m_Opacity,
|
||||||
|
module->IsSelected() || aIsSelected,
|
||||||
|
m_selectionColor );
|
||||||
else
|
else
|
||||||
modelPtr->Draw_opaque( module->IsSelected() || aIsSelected );
|
modelPtr->Draw_opaque( module->IsSelected() || aIsSelected,
|
||||||
|
m_selectionColor );
|
||||||
|
|
||||||
if( m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) )
|
if( m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -228,6 +228,8 @@ private:
|
||||||
|
|
||||||
void set_layer_material( PCB_LAYER_ID aLayerID );
|
void set_layer_material( PCB_LAYER_ID aLayerID );
|
||||||
SFVEC4F get_layer_color( PCB_LAYER_ID aLayerID );
|
SFVEC4F get_layer_color( PCB_LAYER_ID aLayerID );
|
||||||
|
|
||||||
|
SFVEC3F m_selectionColor;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // C3D_RENDER_OGL_LEGACY_H_
|
#endif // C3D_RENDER_OGL_LEGACY_H_
|
||||||
|
|
|
@ -395,7 +395,7 @@ void C_OGL_3DMODEL::EndDrawMulti()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void C_OGL_3DMODEL::Draw( bool aTransparent, float aOpacity, bool aUseSelectedMaterial ) const
|
void C_OGL_3DMODEL::Draw(bool aTransparent, float aOpacity, bool aUseSelectedMaterial , SFVEC3F aSelectionColor ) const
|
||||||
{
|
{
|
||||||
if( aOpacity <= FLT_EPSILON )
|
if( aOpacity <= FLT_EPSILON )
|
||||||
return;
|
return;
|
||||||
|
@ -418,47 +418,38 @@ void C_OGL_3DMODEL::Draw( bool aTransparent, float aOpacity, bool aUseSelectedMa
|
||||||
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 ) ) );
|
||||||
|
|
||||||
if( aUseSelectedMaterial )
|
|
||||||
aOpacity = aOpacity * 0.75f;
|
|
||||||
|
|
||||||
const SFVEC4F param = SFVEC4F( 1.0f, 1.0f, 1.0f, aOpacity );
|
const SFVEC4F param = SFVEC4F( 1.0f, 1.0f, 1.0f, aOpacity );
|
||||||
|
|
||||||
glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (const float*)¶m.x );
|
glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (const float*)¶m.x );
|
||||||
|
|
||||||
// BeginDrawMulti();
|
// BeginDrawMulti();
|
||||||
|
|
||||||
if( aUseSelectedMaterial )
|
|
||||||
OGL_SetDiffuseOnlyMaterial( SFVEC3F( 0.0f, 1.0f, 0.0f ), aOpacity );
|
|
||||||
|
|
||||||
for( auto& mat : m_materials )
|
for( auto& mat : m_materials )
|
||||||
{
|
{
|
||||||
if( ( mat.IsTransparent() != aTransparent ) &&
|
if( ( mat.IsTransparent() != aTransparent ) &&
|
||||||
( aOpacity >= 1.0f ) )
|
( aOpacity >= 1.0f ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( !aUseSelectedMaterial )
|
switch( m_material_mode )
|
||||||
{
|
{
|
||||||
switch( m_material_mode )
|
case MATERIAL_MODE::NORMAL:
|
||||||
{
|
OGL_SetMaterial( mat, aOpacity, aUseSelectedMaterial, aSelectionColor );
|
||||||
case MATERIAL_MODE::NORMAL:
|
break;
|
||||||
OGL_SetMaterial( mat, aOpacity );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MATERIAL_MODE::DIFFUSE_ONLY:
|
case MATERIAL_MODE::DIFFUSE_ONLY:
|
||||||
OGL_SetDiffuseOnlyMaterial( mat.m_Diffuse, aOpacity );
|
OGL_SetDiffuseOnlyMaterial( mat.m_Diffuse, aOpacity );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MATERIAL_MODE::CAD_MODE:
|
case MATERIAL_MODE::CAD_MODE:
|
||||||
OGL_SetDiffuseOnlyMaterial( MaterialDiffuseToColorCAD( mat.m_Diffuse ), aOpacity );
|
OGL_SetDiffuseOnlyMaterial( MaterialDiffuseToColorCAD( mat.m_Diffuse ), aOpacity );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glDrawElements( GL_TRIANGLES, mat.m_render_idx_count, m_index_buffer_type,
|
glDrawElements( GL_TRIANGLES, mat.m_render_idx_count, m_index_buffer_type,
|
||||||
reinterpret_cast<const void*>( mat.m_render_idx_buffer_offset ) );
|
reinterpret_cast<const void*>( mat.m_render_idx_buffer_offset ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// EndDrawMulti();
|
// EndDrawMulti();
|
||||||
|
|
|
@ -53,12 +53,12 @@ public:
|
||||||
/**
|
/**
|
||||||
* @brief Draw_opaque - render the model into the current context
|
* @brief Draw_opaque - render the model into the current context
|
||||||
*/
|
*/
|
||||||
void Draw_opaque( bool aUseSelectedMaterial ) const { Draw( false, 1.0f, aUseSelectedMaterial ); }
|
void Draw_opaque( bool aUseSelectedMaterial, SFVEC3F aSelectionColor = SFVEC3F( 0.0f ) ) const { Draw( false, 1.0f, aUseSelectedMaterial, aSelectionColor ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Draw_transparent - render the model into the current context
|
* @brief Draw_transparent - render the model into the current context
|
||||||
*/
|
*/
|
||||||
void Draw_transparent( float aOpacity, bool aUseSelectedMaterial ) const { Draw( true, aOpacity, aUseSelectedMaterial ); }
|
void Draw_transparent( float aOpacity, bool aUseSelectedMaterial, SFVEC3F aSelectionColor = SFVEC3F( 0.0f ) ) const { Draw( true, aOpacity, aUseSelectedMaterial, aSelectionColor ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Have_opaque - return true if have opaque meshs to render
|
* @brief Have_opaque - return true if have opaque meshs to render
|
||||||
|
@ -155,7 +155,7 @@ private:
|
||||||
VERTEX *aVtxOut, GLuint *aIdxOut,
|
VERTEX *aVtxOut, GLuint *aIdxOut,
|
||||||
const glm::vec4 &aColor );
|
const glm::vec4 &aColor );
|
||||||
|
|
||||||
void Draw( bool aTransparent, float aOpacity, bool aUseSelectedMaterial ) const;
|
void Draw( bool aTransparent, float aOpacity, bool aUseSelectedMaterial, SFVEC3F aSelectionColor ) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _C_OGL_3DMODEL_H_
|
#endif // _C_OGL_3DMODEL_H_
|
||||||
|
|
|
@ -142,14 +142,14 @@ GLuint OGL_LoadTexture( const CIMAGE &aImage )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void OGL_SetMaterial( const SMATERIAL & aMaterial, float aOpacity )
|
void OGL_SetMaterial( const SMATERIAL & aMaterial, float aOpacity, bool aUseSelectedMaterial, SFVEC3F aSelectionColor )
|
||||||
{
|
{
|
||||||
const SFVEC4F ambient = SFVEC4F( aMaterial.m_Ambient, 1.0f );
|
const SFVEC4F ambient = SFVEC4F( aMaterial.m_Ambient, 1.0f );
|
||||||
|
|
||||||
// !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( 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 );
|
||||||
|
|
|
@ -39,8 +39,10 @@
|
||||||
* @brief OGL_SetMaterial - Set OpenGL materials
|
* @brief OGL_SetMaterial - Set OpenGL materials
|
||||||
* @param aMaterial: a material structure with parameters to set
|
* @param aMaterial: a material structure with parameters to set
|
||||||
* @param aOpacity: main model opacity 0.0 full transparente, 1.0 full opaque
|
* @param aOpacity: main model opacity 0.0 full transparente, 1.0 full opaque
|
||||||
|
* @param aUseSelectedMaterial: if material should be set for selection mode
|
||||||
|
* @param aSelectionColor: material to use for selection in case it is enabled
|
||||||
*/
|
*/
|
||||||
void OGL_SetMaterial( const SMATERIAL & aMaterial, float aOpacity );
|
void OGL_SetMaterial( const SMATERIAL & aMaterial, float aOpacity, bool aUseSelectedMaterial = false, SFVEC3F aSelectionColor = SFVEC3F( 0.0f ) );
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue