3D-Viewer: add skip material to model loading

This commit is contained in:
Mario Luzeiro 2020-09-02 15:31:42 +01:00 committed by Jon Evans
parent 72b904a978
commit c7a546042e
2 changed files with 146 additions and 128 deletions

View File

@ -871,7 +871,7 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusReporter, REPORTER* aWarnin
#endif
load_3D_models();
load_3D_models( false );
#ifdef PRINT_STATISTICS_3D_VIEWER
@ -1250,7 +1250,7 @@ void C3D_RENDER_RAYTRACING::add_3D_vias_and_pads_to_container()
}
void C3D_RENDER_RAYTRACING::load_3D_models()
void C3D_RENDER_RAYTRACING::load_3D_models( bool aSkipMaterialInformation )
{
// Go for all modules
for( auto module : m_boardAdapter.GetBoard()->Modules() )
@ -1341,7 +1341,7 @@ void C3D_RENDER_RAYTRACING::load_3D_models()
sM->m_Scale.y,
sM->m_Scale.z ) );
add_3D_models( modelPtr, modelMatrix, (float)sM->m_Opacity );
add_3D_models( modelPtr, modelMatrix, (float)sM->m_Opacity, aSkipMaterialInformation );
}
}
@ -1351,34 +1351,8 @@ void C3D_RENDER_RAYTRACING::load_3D_models()
}
}
void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
const glm::mat4 &aModelMatrix,
float aModuleOpacity )
MODEL_MATERIALS *C3D_RENDER_RAYTRACING::get_3D_model_material( const S3DMODEL *a3DModel )
{
// Validate a3DModel pointers
wxASSERT( a3DModel != NULL );
if( a3DModel == NULL )
return;
wxASSERT( a3DModel->m_Materials != NULL );
wxASSERT( a3DModel->m_Meshes != NULL );
wxASSERT( a3DModel->m_MaterialsSize > 0 );
wxASSERT( a3DModel->m_MeshesSize > 0 );
wxASSERT( aModuleOpacity > 0.0f );
wxASSERT( aModuleOpacity <= 1.0f );
if( aModuleOpacity > 1.0f )
{
aModuleOpacity = 1.0f;
}
if( (a3DModel->m_Materials != NULL) && (a3DModel->m_Meshes != NULL) &&
(a3DModel->m_MaterialsSize > 0) && (a3DModel->m_MeshesSize > 0) )
{
MODEL_MATERIALS *materialVector;
// Try find if the materials already exists in the map list
@ -1485,6 +1459,44 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
}
}
return materialVector;
}
void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
const glm::mat4 &aModelMatrix,
float aModuleOpacity,
bool aSkipMaterialInformation )
{
// Validate a3DModel pointers
wxASSERT( a3DModel != NULL );
if( a3DModel == NULL )
return;
wxASSERT( a3DModel->m_Materials != NULL );
wxASSERT( a3DModel->m_Meshes != NULL );
wxASSERT( a3DModel->m_MaterialsSize > 0 );
wxASSERT( a3DModel->m_MeshesSize > 0 );
wxASSERT( aModuleOpacity > 0.0f );
wxASSERT( aModuleOpacity <= 1.0f );
if( aModuleOpacity > 1.0f )
{
aModuleOpacity = 1.0f;
}
if( (a3DModel->m_Materials != NULL) && (a3DModel->m_Meshes != NULL) &&
(a3DModel->m_MaterialsSize > 0) && (a3DModel->m_MeshesSize > 0) )
{
MODEL_MATERIALS *materialVector = NULL;
if( !aSkipMaterialInformation )
{
materialVector = get_3D_model_material( a3DModel );
}
const glm::mat3 normalMatrix = glm::transpose( glm::inverse( glm::mat3( aModelMatrix ) ) );
for( unsigned int mesh_i = 0;
@ -1551,8 +1563,10 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
nt0, nt2, nt1 );
m_object_container.Add( newTriangle );
newTriangle->SetMaterial( (const CMATERIAL *)&blinn_material );
if( !aSkipMaterialInformation )
{
newTriangle->SetMaterial( (const CMATERIAL *)&blinn_material );
newTriangle->SetModelTransparency( moduleTransparency );
if( mesh.m_Color == NULL )
@ -1581,4 +1595,5 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
}
}
}
}
}

View File

@ -201,10 +201,13 @@ private:
void add_3D_vias_and_pads_to_container();
void insert3DViaHole( const VIA* aVia );
void insert3DPadHole( const D_PAD* aPad );
void load_3D_models();
void load_3D_models( bool aSkipMaterialInformation );
void add_3D_models( const S3DMODEL *a3DModel,
const glm::mat4 &aModelMatrix,
float aModuleOpacity );
float aModuleOpacity,
bool aSkipMaterialInformation );
MODEL_MATERIALS *get_3D_model_material( const S3DMODEL *a3DModel );
/// Stores materials of the 3D models
MAP_MODEL_MATERIALS m_model_materials;