* increased Patch::Calculate_AvgNormal() robustness; affects Patch::CapTexture() & Patch::ProjectTexture()

This commit is contained in:
Garux 2017-10-18 15:02:55 +03:00
parent a2406ea3d7
commit 4ecd635bfc

View File

@ -609,6 +609,26 @@ Vector3 Patch::Calculate_AvgNormal(){
for ( std::size_t i = 0; i < m_width; ++i ){ for ( std::size_t i = 0; i < m_width; ++i ){
hDir += ctrlAt( m_height - 1, i ).m_vertex - ctrlAt( 0, i ).m_vertex; hDir += ctrlAt( m_height - 1, i ).m_vertex - ctrlAt( 0, i ).m_vertex;
} }
/* fallback */
if ( vector3_equal_epsilon( wDir, g_vector3_identity, 1e-3f ) || vector3_equal_epsilon( hDir, g_vector3_identity, 1e-3f ) ) {
for ( std::size_t i = 0; i < m_height; ++i ){
for ( std::size_t j = 0; j < m_width - 1; ++j ){
wDir = ctrlAt( i, j + 1 ).m_vertex - ctrlAt( i, j ).m_vertex;
if ( !vector3_equal_epsilon( wDir, g_vector3_identity, 1e-3f ) )
goto break1;
}
}
break1:
for ( std::size_t i = 0; i < m_width; ++i ){
for ( std::size_t j = 0; j < m_height; ++j ){
hDir = ctrlAt( j + 1, i ).m_vertex - ctrlAt( j, i ).m_vertex;
if ( !vector3_equal_epsilon( hDir, g_vector3_identity, 1e-3f ) )
goto break2;
}
}
}
break2:
Vector3 normal( vector3_cross( wDir, hDir ) ); Vector3 normal( vector3_cross( wDir, hDir ) );
if ( vector3_equal( normal, g_vector3_identity ) ) { if ( vector3_equal( normal, g_vector3_identity ) ) {
normal = Vector3( 0, 0, 1 ); normal = Vector3( 0, 0, 1 );