3D-Viewer: add skip material to model loading
This commit is contained in:
parent
72b904a978
commit
c7a546042e
|
@ -871,7 +871,7 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER* aStatusReporter, REPORTER* aWarnin
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
load_3D_models();
|
load_3D_models( false );
|
||||||
|
|
||||||
|
|
||||||
#ifdef PRINT_STATISTICS_3D_VIEWER
|
#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
|
// Go for all modules
|
||||||
for( auto module : m_boardAdapter.GetBoard()->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.y,
|
||||||
sM->m_Scale.z ) );
|
sM->m_Scale.z ) );
|
||||||
|
|
||||||
add_3D_models( modelPtr, modelMatrix, (float)sM->m_Opacity );
|
add_3D_models( modelPtr, modelMatrix, (float)sM->m_Opacity, aSkipMaterialInformation );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1351,10 +1351,121 @@ void C3D_RENDER_RAYTRACING::load_3D_models()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MODEL_MATERIALS *C3D_RENDER_RAYTRACING::get_3D_model_material( const S3DMODEL *a3DModel )
|
||||||
|
{
|
||||||
|
MODEL_MATERIALS *materialVector;
|
||||||
|
|
||||||
|
// Try find if the materials already exists in the map list
|
||||||
|
if( m_model_materials.find( a3DModel ) != m_model_materials.end() )
|
||||||
|
{
|
||||||
|
// Found it, so get the pointer
|
||||||
|
materialVector = &m_model_materials[a3DModel];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Materials was not found in the map, so it will create a new for
|
||||||
|
// this model.
|
||||||
|
|
||||||
|
m_model_materials[a3DModel] = MODEL_MATERIALS();
|
||||||
|
materialVector = &m_model_materials[a3DModel];
|
||||||
|
|
||||||
|
materialVector->resize( a3DModel->m_MaterialsSize );
|
||||||
|
|
||||||
|
for( unsigned int imat = 0;
|
||||||
|
imat < a3DModel->m_MaterialsSize;
|
||||||
|
++imat )
|
||||||
|
{
|
||||||
|
if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::NORMAL )
|
||||||
|
{
|
||||||
|
const SMATERIAL &material = a3DModel->m_Materials[imat];
|
||||||
|
|
||||||
|
// http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiJtaW4oc3FydCh4LTAuMzUpKjAuNDAtMC4wNSwxLjApIiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiMC4wNzA3NzM2NzMyMzY1OTAxMiIsIjEuNTY5NTcxNjI5MjI1NDY5OCIsIi0wLjI3NDYzNTMyMTc1OTkyOTMiLCIwLjY0NzcwMTg4MTkyNTUzNjIiXSwic2l6ZSI6WzY0NCwzOTRdfV0-
|
||||||
|
|
||||||
|
float reflectionFactor = 0.0f;
|
||||||
|
|
||||||
|
if( (material.m_Shininess - 0.35f) > FLT_EPSILON )
|
||||||
|
{
|
||||||
|
reflectionFactor = glm::clamp( glm::sqrt( (material.m_Shininess - 0.35f) ) *
|
||||||
|
0.40f - 0.05f,
|
||||||
|
0.0f,
|
||||||
|
0.5f );
|
||||||
|
}
|
||||||
|
|
||||||
|
CBLINN_PHONG_MATERIAL &blinnMaterial = (*materialVector)[imat];
|
||||||
|
|
||||||
|
blinnMaterial = CBLINN_PHONG_MATERIAL(
|
||||||
|
ConvertSRGBToLinear( material.m_Ambient ),
|
||||||
|
ConvertSRGBToLinear( material.m_Emissive ),
|
||||||
|
ConvertSRGBToLinear( material.m_Specular ),
|
||||||
|
material.m_Shininess * 180.0f,
|
||||||
|
material.m_Transparency,
|
||||||
|
reflectionFactor );
|
||||||
|
|
||||||
|
if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) )
|
||||||
|
{
|
||||||
|
// Guess material type and apply a normal perturbator
|
||||||
|
|
||||||
|
if( ( RGBtoGray(material.m_Diffuse) < 0.3f ) &&
|
||||||
|
( material.m_Shininess < 0.36f ) &&
|
||||||
|
( material.m_Transparency == 0.0f ) &&
|
||||||
|
( (glm::abs( material.m_Diffuse.r - material.m_Diffuse.g ) < 0.15f) &&
|
||||||
|
(glm::abs( material.m_Diffuse.b - material.m_Diffuse.g ) < 0.15f) &&
|
||||||
|
(glm::abs( material.m_Diffuse.r - material.m_Diffuse.b ) < 0.15f) ) )
|
||||||
|
{
|
||||||
|
// This may be a black plastic..
|
||||||
|
|
||||||
|
if( material.m_Shininess < 0.26f )
|
||||||
|
blinnMaterial.SetNormalPerturbator( &m_plastic_normal_perturbator );
|
||||||
|
else
|
||||||
|
blinnMaterial.SetNormalPerturbator( &m_plastic_shine_normal_perturbator );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( ( RGBtoGray(material.m_Diffuse) > 0.3f ) &&
|
||||||
|
( material.m_Shininess < 0.30f ) &&
|
||||||
|
( material.m_Transparency == 0.0f ) &&
|
||||||
|
( (glm::abs( material.m_Diffuse.r - material.m_Diffuse.g ) > 0.25f) ||
|
||||||
|
(glm::abs( material.m_Diffuse.b - material.m_Diffuse.g ) > 0.25f) ||
|
||||||
|
(glm::abs( material.m_Diffuse.r - material.m_Diffuse.b ) > 0.25f) ) )
|
||||||
|
{
|
||||||
|
// This may be a color plastic ...
|
||||||
|
blinnMaterial.SetNormalPerturbator( &m_plastic_shine_normal_perturbator );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( ( RGBtoGray(material.m_Diffuse) > 0.6f ) &&
|
||||||
|
( material.m_Shininess > 0.35f ) &&
|
||||||
|
( material.m_Transparency == 0.0f ) &&
|
||||||
|
( (glm::abs( material.m_Diffuse.r - material.m_Diffuse.g ) < 0.40f) &&
|
||||||
|
(glm::abs( material.m_Diffuse.b - material.m_Diffuse.g ) < 0.40f) &&
|
||||||
|
(glm::abs( material.m_Diffuse.r - material.m_Diffuse.b ) < 0.40f) ) )
|
||||||
|
{
|
||||||
|
// This may be a brushed metal
|
||||||
|
blinnMaterial.SetNormalPerturbator( &m_brushed_metal_normal_perturbator );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*materialVector)[imat] = CBLINN_PHONG_MATERIAL( SFVEC3F( 0.2f ),
|
||||||
|
SFVEC3F( 0.0f ),
|
||||||
|
SFVEC3F( 0.0f ),
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return materialVector;
|
||||||
|
}
|
||||||
|
|
||||||
void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
|
void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
|
||||||
const glm::mat4 &aModelMatrix,
|
const glm::mat4 &aModelMatrix,
|
||||||
float aModuleOpacity )
|
float aModuleOpacity,
|
||||||
|
bool aSkipMaterialInformation )
|
||||||
{
|
{
|
||||||
|
|
||||||
// Validate a3DModel pointers
|
// Validate a3DModel pointers
|
||||||
|
@ -1379,110 +1490,11 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
|
||||||
(a3DModel->m_MaterialsSize > 0) && (a3DModel->m_MeshesSize > 0) )
|
(a3DModel->m_MaterialsSize > 0) && (a3DModel->m_MeshesSize > 0) )
|
||||||
{
|
{
|
||||||
|
|
||||||
MODEL_MATERIALS *materialVector;
|
MODEL_MATERIALS *materialVector = NULL;
|
||||||
|
|
||||||
// Try find if the materials already exists in the map list
|
if( !aSkipMaterialInformation )
|
||||||
if( m_model_materials.find( a3DModel ) != m_model_materials.end() )
|
|
||||||
{
|
{
|
||||||
// Found it, so get the pointer
|
materialVector = get_3D_model_material( a3DModel );
|
||||||
materialVector = &m_model_materials[a3DModel];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Materials was not found in the map, so it will create a new for
|
|
||||||
// this model.
|
|
||||||
|
|
||||||
m_model_materials[a3DModel] = MODEL_MATERIALS();
|
|
||||||
materialVector = &m_model_materials[a3DModel];
|
|
||||||
|
|
||||||
materialVector->resize( a3DModel->m_MaterialsSize );
|
|
||||||
|
|
||||||
for( unsigned int imat = 0;
|
|
||||||
imat < a3DModel->m_MaterialsSize;
|
|
||||||
++imat )
|
|
||||||
{
|
|
||||||
if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::NORMAL )
|
|
||||||
{
|
|
||||||
const SMATERIAL &material = a3DModel->m_Materials[imat];
|
|
||||||
|
|
||||||
// http://www.fooplot.com/#W3sidHlwZSI6MCwiZXEiOiJtaW4oc3FydCh4LTAuMzUpKjAuNDAtMC4wNSwxLjApIiwiY29sb3IiOiIjMDAwMDAwIn0seyJ0eXBlIjoxMDAwLCJ3aW5kb3ciOlsiMC4wNzA3NzM2NzMyMzY1OTAxMiIsIjEuNTY5NTcxNjI5MjI1NDY5OCIsIi0wLjI3NDYzNTMyMTc1OTkyOTMiLCIwLjY0NzcwMTg4MTkyNTUzNjIiXSwic2l6ZSI6WzY0NCwzOTRdfV0-
|
|
||||||
|
|
||||||
float reflectionFactor = 0.0f;
|
|
||||||
|
|
||||||
if( (material.m_Shininess - 0.35f) > FLT_EPSILON )
|
|
||||||
{
|
|
||||||
reflectionFactor = glm::clamp( glm::sqrt( (material.m_Shininess - 0.35f) ) *
|
|
||||||
0.40f - 0.05f,
|
|
||||||
0.0f,
|
|
||||||
0.5f );
|
|
||||||
}
|
|
||||||
|
|
||||||
CBLINN_PHONG_MATERIAL &blinnMaterial = (*materialVector)[imat];
|
|
||||||
|
|
||||||
blinnMaterial = CBLINN_PHONG_MATERIAL(
|
|
||||||
ConvertSRGBToLinear( material.m_Ambient ),
|
|
||||||
ConvertSRGBToLinear( material.m_Emissive ),
|
|
||||||
ConvertSRGBToLinear( material.m_Specular ),
|
|
||||||
material.m_Shininess * 180.0f,
|
|
||||||
material.m_Transparency,
|
|
||||||
reflectionFactor );
|
|
||||||
|
|
||||||
if( m_boardAdapter.GetFlag( FL_RENDER_RAYTRACING_PROCEDURAL_TEXTURES ) )
|
|
||||||
{
|
|
||||||
// Guess material type and apply a normal perturbator
|
|
||||||
|
|
||||||
if( ( RGBtoGray(material.m_Diffuse) < 0.3f ) &&
|
|
||||||
( material.m_Shininess < 0.36f ) &&
|
|
||||||
( material.m_Transparency == 0.0f ) &&
|
|
||||||
( (glm::abs( material.m_Diffuse.r - material.m_Diffuse.g ) < 0.15f) &&
|
|
||||||
(glm::abs( material.m_Diffuse.b - material.m_Diffuse.g ) < 0.15f) &&
|
|
||||||
(glm::abs( material.m_Diffuse.r - material.m_Diffuse.b ) < 0.15f) ) )
|
|
||||||
{
|
|
||||||
// This may be a black plastic..
|
|
||||||
|
|
||||||
if( material.m_Shininess < 0.26f )
|
|
||||||
blinnMaterial.SetNormalPerturbator( &m_plastic_normal_perturbator );
|
|
||||||
else
|
|
||||||
blinnMaterial.SetNormalPerturbator( &m_plastic_shine_normal_perturbator );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( ( RGBtoGray(material.m_Diffuse) > 0.3f ) &&
|
|
||||||
( material.m_Shininess < 0.30f ) &&
|
|
||||||
( material.m_Transparency == 0.0f ) &&
|
|
||||||
( (glm::abs( material.m_Diffuse.r - material.m_Diffuse.g ) > 0.25f) ||
|
|
||||||
(glm::abs( material.m_Diffuse.b - material.m_Diffuse.g ) > 0.25f) ||
|
|
||||||
(glm::abs( material.m_Diffuse.r - material.m_Diffuse.b ) > 0.25f) ) )
|
|
||||||
{
|
|
||||||
// This may be a color plastic ...
|
|
||||||
blinnMaterial.SetNormalPerturbator( &m_plastic_shine_normal_perturbator );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( ( RGBtoGray(material.m_Diffuse) > 0.6f ) &&
|
|
||||||
( material.m_Shininess > 0.35f ) &&
|
|
||||||
( material.m_Transparency == 0.0f ) &&
|
|
||||||
( (glm::abs( material.m_Diffuse.r - material.m_Diffuse.g ) < 0.40f) &&
|
|
||||||
(glm::abs( material.m_Diffuse.b - material.m_Diffuse.g ) < 0.40f) &&
|
|
||||||
(glm::abs( material.m_Diffuse.r - material.m_Diffuse.b ) < 0.40f) ) )
|
|
||||||
{
|
|
||||||
// This may be a brushed metal
|
|
||||||
blinnMaterial.SetNormalPerturbator( &m_brushed_metal_normal_perturbator );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
(*materialVector)[imat] = CBLINN_PHONG_MATERIAL( SFVEC3F( 0.2f ),
|
|
||||||
SFVEC3F( 0.0f ),
|
|
||||||
SFVEC3F( 0.0f ),
|
|
||||||
0.0f,
|
|
||||||
0.0f,
|
|
||||||
0.0f );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const glm::mat3 normalMatrix = glm::transpose( glm::inverse( glm::mat3( aModelMatrix ) ) );
|
const glm::mat3 normalMatrix = glm::transpose( glm::inverse( glm::mat3( aModelMatrix ) ) );
|
||||||
|
@ -1551,30 +1563,33 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
|
||||||
nt0, nt2, nt1 );
|
nt0, nt2, nt1 );
|
||||||
|
|
||||||
m_object_container.Add( newTriangle );
|
m_object_container.Add( newTriangle );
|
||||||
newTriangle->SetMaterial( (const CMATERIAL *)&blinn_material );
|
|
||||||
|
|
||||||
newTriangle->SetModelTransparency( moduleTransparency );
|
if( !aSkipMaterialInformation )
|
||||||
|
|
||||||
if( mesh.m_Color == NULL )
|
|
||||||
{
|
{
|
||||||
const SFVEC3F diffuseColor =
|
newTriangle->SetMaterial( (const CMATERIAL *)&blinn_material );
|
||||||
a3DModel->m_Materials[mesh.m_MaterialIdx].m_Diffuse;
|
newTriangle->SetModelTransparency( moduleTransparency );
|
||||||
|
|
||||||
if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE )
|
if( mesh.m_Color == NULL )
|
||||||
newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( diffuseColor ) ) );
|
{
|
||||||
|
const SFVEC3F diffuseColor =
|
||||||
|
a3DModel->m_Materials[mesh.m_MaterialIdx].m_Diffuse;
|
||||||
|
|
||||||
|
if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE )
|
||||||
|
newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( diffuseColor ) ) );
|
||||||
|
else
|
||||||
|
newTriangle->SetColor( ConvertSRGBToLinear( diffuseColor ) );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
newTriangle->SetColor( ConvertSRGBToLinear( diffuseColor ) );
|
{
|
||||||
}
|
if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE )
|
||||||
else
|
newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx0] ) ),
|
||||||
{
|
ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx1] ) ),
|
||||||
if( m_boardAdapter.MaterialModeGet() == MATERIAL_MODE::CAD_MODE )
|
ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx2] ) ) );
|
||||||
newTriangle->SetColor( ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx0] ) ),
|
else
|
||||||
ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx1] ) ),
|
newTriangle->SetColor( ConvertSRGBToLinear( mesh.m_Color[idx0] ),
|
||||||
ConvertSRGBToLinear( MaterialDiffuseToColorCAD( mesh.m_Color[idx2] ) ) );
|
ConvertSRGBToLinear( mesh.m_Color[idx1] ),
|
||||||
else
|
ConvertSRGBToLinear( mesh.m_Color[idx2] ) );
|
||||||
newTriangle->SetColor( ConvertSRGBToLinear( mesh.m_Color[idx0] ),
|
}
|
||||||
ConvertSRGBToLinear( mesh.m_Color[idx1] ),
|
|
||||||
ConvertSRGBToLinear( mesh.m_Color[idx2] ) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,10 +201,13 @@ private:
|
||||||
void add_3D_vias_and_pads_to_container();
|
void add_3D_vias_and_pads_to_container();
|
||||||
void insert3DViaHole( const VIA* aVia );
|
void insert3DViaHole( const VIA* aVia );
|
||||||
void insert3DPadHole( const D_PAD* aPad );
|
void insert3DPadHole( const D_PAD* aPad );
|
||||||
void load_3D_models();
|
void load_3D_models( bool aSkipMaterialInformation );
|
||||||
void add_3D_models( const S3DMODEL *a3DModel,
|
void add_3D_models( const S3DMODEL *a3DModel,
|
||||||
const glm::mat4 &aModelMatrix,
|
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
|
/// Stores materials of the 3D models
|
||||||
MAP_MODEL_MATERIALS m_model_materials;
|
MAP_MODEL_MATERIALS m_model_materials;
|
||||||
|
|
Loading…
Reference in New Issue