diff --git a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp index 88ff01cb4d..1d53dc8a31 100644 --- a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp +++ b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp @@ -1203,56 +1203,62 @@ void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module, modelunit_to_3d_units_factor ); // Get the list of model files for this model - for (auto& sM : module->Models ()) + for( auto& sM : module->Models () ) { - if( !sM.m_Filename.empty() ) + if( sM.m_Filename.empty() ) + continue; + + // Check if the model is present in our cache map + auto cache_i = m_3dmodel_map.find( sM.m_Filename ); + + if( cache_i == m_3dmodel_map.end() ) + continue; + + if( const C_OGL_3DMODEL *modelPtr = cache_i->second ) { - // Check if the model is present in our cache map - auto cache_i = m_3dmodel_map.find( sM.m_Filename ); - if( cache_i != m_3dmodel_map.end() ) + bool opaque = sM.m_Opacity >= 1.0; + + if( ( !aRenderTransparentOnly && modelPtr->Have_opaque() && opaque ) || + ( aRenderTransparentOnly && ( modelPtr->Have_transparent() || !opaque ) ) ) { - if( const C_OGL_3DMODEL *modelPtr = cache_i->second ) + glPushMatrix(); + + // FIXME: don't do this over and over again unless the + // values have changed. cache the matrix somewhere. + glm::mat4 mtx( 1 ); + mtx = glm::translate( mtx, { sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z } ); + mtx = glm::rotate( + mtx, glm::radians( (float) -sM.m_Rotation.z ), { 0.0f, 0.0f, 1.0f } ); + mtx = glm::rotate( + mtx, glm::radians( (float) -sM.m_Rotation.y ), { 0.0f, 1.0f, 0.0f } ); + mtx = glm::rotate( + mtx, glm::radians( (float) -sM.m_Rotation.x ), { 1.0f, 0.0f, 0.0f } ); + mtx = glm::scale( mtx, { sM.m_Scale.x, sM.m_Scale.y, sM.m_Scale.z } ); + glMultMatrixf( glm::value_ptr( mtx ) ); + + if( aRenderTransparentOnly ) + modelPtr->Draw_transparent( sM.m_Opacity ); + else + modelPtr->Draw_opaque(); + + if( m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) ) { - if( ( (!aRenderTransparentOnly) && modelPtr->Have_opaque() && (sM.m_Opacity >= 1.0 ) ) || - ( aRenderTransparentOnly && ( modelPtr->Have_transparent() || (sM.m_Opacity < 1.0 ) ) ) ) - { - glPushMatrix(); + glEnable( GL_BLEND ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - // FIXME: don't do this over and over again unless the - // values have changed. cache the matrix somewhere. - glm::mat4 mtx( 1 ); - mtx = glm::translate( mtx, { sM.m_Offset.x, sM.m_Offset.y, sM.m_Offset.z } ); - mtx = glm::rotate( mtx, glm::radians( (float)-sM.m_Rotation.z ), { 0.0f, 0.0f, 1.0f } ); - mtx = glm::rotate( mtx, glm::radians( (float)-sM.m_Rotation.y ), { 0.0f, 1.0f, 0.0f } ); - mtx = glm::rotate( mtx, glm::radians( (float)-sM.m_Rotation.x ), { 1.0f, 0.0f, 0.0f } ); - mtx = glm::scale( mtx, { sM.m_Scale.x, sM.m_Scale.y, sM.m_Scale.z } ); - glMultMatrixf( glm::value_ptr( mtx ) ); + glDisable( GL_LIGHTING ); - if( aRenderTransparentOnly ) - modelPtr->Draw_transparent( sM.m_Opacity ); - else - modelPtr->Draw_opaque(); + glLineWidth( 1 ); + modelPtr->Draw_bboxes(); - if( m_boardAdapter.GetFlag( FL_RENDER_OPENGL_SHOW_MODEL_BBOX ) ) - { - glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glLineWidth( 4 ); + modelPtr->Draw_bbox(); - glDisable( GL_LIGHTING ); - - glLineWidth( 1 ); - modelPtr->Draw_bboxes(); - - glLineWidth( 4 ); - modelPtr->Draw_bbox(); - - glEnable( GL_LIGHTING ); - glDisable( GL_BLEND ); - } - - glPopMatrix(); - } + glEnable( GL_LIGHTING ); + glDisable( GL_BLEND ); } + + glPopMatrix(); } } } diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp index c53c1ac3b1..ec6bde8eb4 100644 --- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp +++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp @@ -1335,7 +1335,7 @@ void C3D_RENDER_RAYTRACING::load_3D_models() while( sM != eM ) { - if( ( (float)sM->m_Opacity > FLT_EPSILON ) && + if( ( static_cast( sM->m_Opacity ) > FLT_EPSILON ) && ( sM->m_Show && !sM->m_Filename.empty() ) ) { // get it from cache diff --git a/3d-viewer/common_ogl/ogl_utils.cpp b/3d-viewer/common_ogl/ogl_utils.cpp index edac752db5..5e974026b6 100644 --- a/3d-viewer/common_ogl/ogl_utils.cpp +++ b/3d-viewer/common_ogl/ogl_utils.cpp @@ -208,6 +208,7 @@ void OGL_DrawBackground( const SFVEC3F &aTopColor, const SFVEC3F &aBotColor ) glEnd(); } + void OGL_ResetTextureStateDefaults() { glActiveTexture( GL_TEXTURE0 ); @@ -218,5 +219,5 @@ void OGL_ResetTextureStateDefaults() const SFVEC4F zero = SFVEC4F( 0.0f ); - glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (const float*)&zero.x ); + glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, static_cast( &zero.x ) ); }