3D-Viewer: render 3D shapes in green if footprint is selected
This commit is contained in:
parent
c7a546042e
commit
fe51cc947c
|
@ -310,10 +310,10 @@ void C3D_MODEL_VIEWER::OnPaint( wxPaintEvent &event )
|
||||||
|
|
||||||
glTranslatef( -model_center.x, -model_center.y, -model_center.z );
|
glTranslatef( -model_center.x, -model_center.y, -model_center.z );
|
||||||
|
|
||||||
m_ogl_3dmodel->BeginDrawMulti();
|
m_ogl_3dmodel->BeginDrawMulti( true );
|
||||||
|
|
||||||
m_ogl_3dmodel->Draw_opaque();
|
m_ogl_3dmodel->Draw_opaque( false );
|
||||||
m_ogl_3dmodel->Draw_transparent( 1.0f );
|
m_ogl_3dmodel->Draw_transparent( 1.0f, false );
|
||||||
|
|
||||||
m_ogl_3dmodel->EndDrawMulti();
|
m_ogl_3dmodel->EndDrawMulti();
|
||||||
|
|
||||||
|
|
|
@ -1233,15 +1233,18 @@ void C3D_RENDER_OGL_LEGACY::render_solder_mask_layer(PCB_LAYER_ID aLayerID,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void C3D_RENDER_OGL_LEGACY::render_3D_models_selected( bool aRenderTopOrBot, bool aRenderTransparentOnly, bool aRenderSelectedOnly )
|
||||||
void C3D_RENDER_OGL_LEGACY::render_3D_models( bool aRenderTopOrBot,
|
|
||||||
bool aRenderTransparentOnly )
|
|
||||||
{
|
{
|
||||||
C_OGL_3DMODEL::BeginDrawMulti();
|
|
||||||
|
C_OGL_3DMODEL::BeginDrawMulti( !aRenderSelectedOnly );
|
||||||
|
|
||||||
// Go for all modules
|
// Go for all modules
|
||||||
for( auto module : m_boardAdapter.GetBoard()->Modules() )
|
for( auto module : m_boardAdapter.GetBoard()->Modules() )
|
||||||
{
|
{
|
||||||
|
if( ( aRenderSelectedOnly && !module->IsSelected() ) ||
|
||||||
|
( !aRenderSelectedOnly && module->IsSelected() ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
if( !module->Models().empty() )
|
if( !module->Models().empty() )
|
||||||
if( m_boardAdapter.ShouldModuleBeDisplayed((MODULE_ATTR_T) module->GetAttributes() ) )
|
if( m_boardAdapter.ShouldModuleBeDisplayed((MODULE_ATTR_T) module->GetAttributes() ) )
|
||||||
if( ( aRenderTopOrBot && !module->IsFlipped() )
|
if( ( aRenderTopOrBot && !module->IsFlipped() )
|
||||||
|
@ -1252,6 +1255,13 @@ void C3D_RENDER_OGL_LEGACY::render_3D_models( bool aRenderTopOrBot,
|
||||||
C_OGL_3DMODEL::EndDrawMulti();
|
C_OGL_3DMODEL::EndDrawMulti();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void C3D_RENDER_OGL_LEGACY::render_3D_models( bool aRenderTopOrBot,
|
||||||
|
bool aRenderTransparentOnly )
|
||||||
|
{
|
||||||
|
render_3D_models_selected( aRenderTopOrBot, aRenderTransparentOnly, true );
|
||||||
|
render_3D_models_selected( aRenderTopOrBot, aRenderTransparentOnly, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module,
|
void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module,
|
||||||
bool aRenderTransparentOnly )
|
bool aRenderTransparentOnly )
|
||||||
|
@ -1318,9 +1328,9 @@ 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 );
|
modelPtr->Draw_transparent( sM.m_Opacity, module->IsSelected() );
|
||||||
else
|
else
|
||||||
modelPtr->Draw_opaque();
|
modelPtr->Draw_opaque( module->IsSelected() );
|
||||||
|
|
||||||
if( m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) )
|
if( m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -190,6 +190,8 @@ private:
|
||||||
*/
|
*/
|
||||||
void render_3D_models( bool aRenderTopOrBot, bool aRenderTransparentOnly );
|
void render_3D_models( bool aRenderTopOrBot, bool aRenderTransparentOnly );
|
||||||
|
|
||||||
|
void render_3D_models_selected( bool aRenderTopOrBot, bool aRenderTransparentOnly, bool aRenderSelectedOnly );
|
||||||
|
|
||||||
void render_3D_module( const MODULE* module, bool aRenderTransparentOnly );
|
void render_3D_module( const MODULE* module, bool aRenderTransparentOnly );
|
||||||
|
|
||||||
void setLight_Front( bool enabled );
|
void setLight_Front( bool enabled );
|
||||||
|
|
|
@ -367,14 +367,18 @@ C_OGL_3DMODEL::C_OGL_3DMODEL( const S3DMODEL &a3DModel,
|
||||||
end_time - start_time).count() );
|
end_time - start_time).count() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void C_OGL_3DMODEL::BeginDrawMulti()
|
void C_OGL_3DMODEL::BeginDrawMulti( bool aUseColorInformation )
|
||||||
{
|
{
|
||||||
glEnableClientState( GL_VERTEX_ARRAY );
|
glEnableClientState( GL_VERTEX_ARRAY );
|
||||||
glEnableClientState( GL_NORMAL_ARRAY );
|
glEnableClientState( GL_NORMAL_ARRAY );
|
||||||
glEnableClientState( GL_COLOR_ARRAY );
|
|
||||||
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
|
|
||||||
|
|
||||||
glEnable( GL_COLOR_MATERIAL );
|
if( aUseColorInformation )
|
||||||
|
{
|
||||||
|
glEnableClientState( GL_COLOR_ARRAY );
|
||||||
|
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
|
||||||
|
glEnable( GL_COLOR_MATERIAL );
|
||||||
|
}
|
||||||
|
|
||||||
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
|
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -391,7 +395,7 @@ void C_OGL_3DMODEL::EndDrawMulti()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void C_OGL_3DMODEL::Draw( bool aTransparent, float aOpacity ) const
|
void C_OGL_3DMODEL::Draw( bool aTransparent, float aOpacity, bool aUseSelectedMaterial ) const
|
||||||
{
|
{
|
||||||
if( aOpacity <= FLT_EPSILON )
|
if( aOpacity <= FLT_EPSILON )
|
||||||
return;
|
return;
|
||||||
|
@ -414,35 +418,44 @@ void C_OGL_3DMODEL::Draw( bool aTransparent, float aOpacity ) const
|
||||||
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;
|
||||||
|
|
||||||
switch( m_material_mode )
|
if( !aUseSelectedMaterial )
|
||||||
{
|
{
|
||||||
case MATERIAL_MODE::NORMAL:
|
switch( m_material_mode )
|
||||||
OGL_SetMaterial( mat, aOpacity );
|
{
|
||||||
break;
|
case MATERIAL_MODE::NORMAL:
|
||||||
|
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 ) );
|
||||||
|
|
|
@ -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() const { Draw( false, 1.0f ); }
|
void Draw_opaque( bool aUseSelectedMaterial ) const { Draw( false, 1.0f, aUseSelectedMaterial ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @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 ) const { Draw( true, aOpacity ); }
|
void Draw_transparent( float aOpacity, bool aUseSelectedMaterial ) const { Draw( true, aOpacity, aUseSelectedMaterial ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Have_opaque - return true if have opaque meshs to render
|
* @brief Have_opaque - return true if have opaque meshs to render
|
||||||
|
@ -89,7 +89,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @brief BeginDrawMulti - set some basic render states before drawing multiple models
|
* @brief BeginDrawMulti - set some basic render states before drawing multiple models
|
||||||
*/
|
*/
|
||||||
static void BeginDrawMulti();
|
static void BeginDrawMulti( bool aUseColorInformation );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief EndDrawMulti - cleanup render states after drawing multiple models
|
* @brief EndDrawMulti - cleanup render states after drawing multiple models
|
||||||
|
@ -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 ) const;
|
void Draw( bool aTransparent, float aOpacity, bool aUseSelectedMaterial ) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _C_OGL_3DMODEL_H_
|
#endif // _C_OGL_3DMODEL_H_
|
||||||
|
|
Loading…
Reference in New Issue