From: vro Date: Fri, 15 Feb 2013 12:52:07 +0000 (+0400) Subject: 0023743: AIS_Triangulation crashes if Poly_Triangulation has no normals X-Git-Tag: V6_6_0_beta~78 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=16e65a03471870ea8124435f64db2e72fad00d35;ds=inline 0023743: AIS_Triangulation crashes if Poly_Triangulation has no normals A crash on absent normals is avoided. AIS_Triangulation::Compute() is corrected so that it is much faster, Adding test case for this fix --- diff --git a/src/AIS/AIS_Triangulation.cxx b/src/AIS/AIS_Triangulation.cxx index 248ff48d83..8ad9d3ace6 100755 --- a/src/AIS/AIS_Triangulation.cxx +++ b/src/AIS/AIS_Triangulation.cxx @@ -56,14 +56,9 @@ void AIS_Triangulation::Compute(const Handle(PrsMgr_PresentationManager3d)& aPre case 0: const TColgp_Array1OfPnt& nodes = myTriangulation->Nodes(); //Nodes const Poly_Array1OfTriangle& triangles = myTriangulation->Triangles(); //Triangle - const TShort_Array1OfShortReal& normals = myTriangulation->Normals(); //Normal - Standard_Boolean hasVNormals = Standard_False; - Standard_Boolean hasVColors = Standard_False; - if( normals.Length() > 0 ) - hasVNormals = Standard_True; - if( myFlagColor == 1 ) - hasVColors = Standard_True; + Standard_Boolean hasVNormals = myTriangulation->HasNormals(); + Standard_Boolean hasVColors = (myFlagColor == 1); Handle(Graphic3d_ArrayOfTriangles) anArray = new Graphic3d_ArrayOfTriangles ( myNbNodes, //maxVertexs @@ -80,13 +75,46 @@ void AIS_Triangulation::Compute(const Handle(PrsMgr_PresentationManager3d)& aPre Standard_Integer j; Standard_Real ambient = aspect->FrontMaterial().Ambient(); - for ( i = nodes.Lower(); i<= nodes.Upper(); i++ ){ - if( myFlagColor == 1 ) - anArray->AddVertex( nodes(i), AttenuateColor(myColor->Value(i),ambient)); - if( myFlagColor == 0 ) - anArray->AddVertex( nodes(i) ); - j = (i - nodes.Lower()) * 3; - anArray->SetVertexNormal(i, normals(j+1), normals(j+2), normals(j+3)); + if (hasVNormals) + { + const TShort_Array1OfShortReal& normals = myTriangulation->Normals(); + if (hasVColors) + { + const TColStd_Array1OfInteger& colors = myColor->Array1(); + for ( i = nodes.Lower(); i <= nodes.Upper(); i++ ) + { + j = (i - nodes.Lower()) * 3; + anArray->AddVertex(nodes(i), AttenuateColor(colors(i), ambient)); + anArray->SetVertexNormal(i, normals(j+1), normals(j+2), normals(j+3)); + } + } + else // !hasVColors + { + for ( i = nodes.Lower(); i <= nodes.Upper(); i++ ) + { + j = (i - nodes.Lower()) * 3; + anArray->AddVertex(nodes(i)); + anArray->SetVertexNormal(i, normals(j+1), normals(j+2), normals(j+3)); + } + } + } + else // !hasVNormals + { + if (hasVColors) + { + const TColStd_Array1OfInteger& colors = myColor->Array1(); + for ( i = nodes.Lower(); i <= nodes.Upper(); i++ ) + { + anArray->AddVertex(nodes(i), AttenuateColor(colors(i), ambient)); + } + } + else // !hasVColors + { + for ( i = nodes.Lower(); i <= nodes.Upper(); i++ ) + { + anArray->AddVertex(nodes(i)); + } + } } Standard_Integer indexTriangle[3] = {0,0,0}; diff --git a/tests/bugs/vis/bug23743 b/tests/bugs/vis/bug23743 new file mode 100755 index 0000000000..cccb340ec1 --- /dev/null +++ b/tests/bugs/vis/bug23743 @@ -0,0 +1,13 @@ +puts "================" +puts "CR23743" +puts "================" +puts "" +####################################################################### +# AIS_Triangulation crashes if Poly_Triangulation has no normals +####################################################################### + +vinit +vdrawsphere result 100 +vfit + +set only_screen 1