0028105: HLR rendering crash in MFC sample
[occt.git] / samples / mfc / standard / Common / User_Cylinder.cxx
index 7048c01..11ff4d4 100755 (executable)
@@ -4,7 +4,7 @@
 
 // Implementation of Handle and type mgt
 //
-IMPLEMENT_STANDARD_HANDLE(User_Cylinder,AIS_InteractiveObject)
+
 IMPLEMENT_STANDARD_RTTIEXT(User_Cylinder,AIS_InteractiveObject)
 
 #include "ColoredMeshDlg.h"
@@ -12,16 +12,15 @@ IMPLEMENT_STANDARD_RTTIEXT(User_Cylinder,AIS_InteractiveObject)
 #include <Graphic3d_ArrayOfTriangles.hxx>
 #include <Graphic3d_StructureManager.hxx>
 #include <PrsMgr_PresentationManager3d.hxx>
-#include <BRepMesh.hxx>
-#include <StdPrs_ToolShadedShape.hxx>
+#include <StdPrs_ToolTriangulatedShape.hxx>
 #include <Poly_Connect.hxx>
 #include <TColgp_Array1OfPnt.hxx>
 #include <Poly_Triangulation.hxx>
 #include <TColgp_Array1OfDir.hxx>
 #include <GProp_PGProps.hxx>
-#include <Graphic3d_Array1OfVertex.hxx>
-#include <Aspect_Array1OfEdge.hxx>
 #include <Quantity_Color.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
+#include <Prs3d.hxx>
 
 #include <AIS_GraphicTool.hxx>
 
@@ -34,10 +33,8 @@ AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
   BRepPrimAPI_MakeCylinder S(R,H);
   myShape = S.Shape();
   SetHilightMode(0);
-  SetSelectionMode(0);
   myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
-  myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
-  myCylindricalFaceColor = Quantity_NOC_GRAY;
+  myColor = Quantity_NOC_GRAY;
 }
 
 User_Cylinder::User_Cylinder(const gp_Ax2 CylAx2, const Standard_Real R, const Standard_Real H) :
@@ -48,45 +45,29 @@ AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
   BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
   myShape = aNurbsConvert.Shape();
   SetHilightMode(0);
-  SetSelectionMode(0);
   myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
-  myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
-  myCylindricalFaceColor = Quantity_NOC_KHAKI4;
+  myColor = Quantity_NOC_KHAKI4;
 }
 
-void User_Cylinder::Compute(const Handle_PrsMgr_PresentationManager3d& /*aPresentationManager*/,
-                            const Handle_Prs3d_Presentation& aPresentation,
+void User_Cylinder::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
+                            const Handle(Prs3d_Presentation)& aPresentation,
                             const Standard_Integer aMode ) 
 {
   switch (aMode) {
-case 0:
-  StdPrs_WFDeflectionShape::Add(aPresentation,myShape, myDrawer );
-  break;
-case 1:
+case AIS_WireFrame:
+  {
+    StdPrs_WFShape::Add(aPresentation,myShape, myDrawer );
+    break;
+  }
+case AIS_Shaded:
   {
-
     Standard_Real aTransparency = Transparency();
     Graphic3d_NameOfMaterial aMaterial = Material();
-    myDrawer->SetShadingAspectGlobal(Standard_False);
-    TopExp_Explorer Ex;
-    Handle(Geom_Surface) Surface;
-
-    for (Ex.Init(myShape,TopAbs_FACE); Ex.More(); Ex.Next())
-    {
-
-      Surface = BRep_Tool::Surface(TopoDS::Face(Ex.Current()));
-      myDrawer->ShadingAspect()->SetMaterial(aMaterial);
-      if (Surface->IsKind(STANDARD_TYPE(Geom_Plane)))
-        myDrawer->ShadingAspect()->SetColor(myPlanarFaceColor);
-      else
-        myDrawer->ShadingAspect()->SetColor(myCylindricalFaceColor);
-
-
-      myDrawer->ShadingAspect()->SetTransparency (aTransparency);
-      StdPrs_ShadedShape::Add(aPresentation,Ex.Current(), myDrawer);
-    }
+    myDrawer->ShadingAspect()->SetMaterial(aMaterial);
+    myDrawer->ShadingAspect()->SetColor(myColor);
+    myDrawer->ShadingAspect()->SetTransparency (aTransparency);
+    StdPrs_ShadedShape::Add(aPresentation,myShape, myDrawer);
     break;
-
   }
 case 6: //color
   {
@@ -107,8 +88,8 @@ case 6: //color
     mygroup->SetPrimitivesAspect(myAspect);
     myAspect->SetEdgeOn();
 
-    myDeflection = AIS_Shape::GetDeflection(myShape,myDrawer);
-    BRepMesh::Mesh(myShape,myDeflection);
+    myDeflection = Prs3d::GetDeflection(myShape,myDrawer);
+    BRepMesh_IncrementalMesh(myShape,myDeflection);
 
     myX1OnOff = Standard_False;
     myXBlueOnOff = Standard_False;
@@ -128,21 +109,21 @@ case 6: //color
 
     myX1OnOff = Dlg.X1OnOff;
 
-    myXBlueOnOff = Dlg.m_CheckXBlueOnOff;
-    myXGreenOnOff = Dlg.m_CheckXGreenOnOff;
-    myXRedOnOff = Dlg.m_CheckXRedOnOff;
+    myXBlueOnOff  = Dlg.m_CheckXBlueOnOff  != 0;
+    myXGreenOnOff = Dlg.m_CheckXGreenOnOff != 0;
+    myXRedOnOff   = Dlg.m_CheckXRedOnOff   != 0;
 
     myY1OnOff = Dlg.Y1OnOff;
 
-    myYBlueOnOff = Dlg.m_CheckYBlueOnOff;
-    myYGreenOnOff = Dlg.m_CheckYGreenOnOff;
-    myYRedOnOff = Dlg.m_CheckYRedOnOff;
+    myYBlueOnOff  = Dlg.m_CheckYBlueOnOff  != 0;
+    myYGreenOnOff = Dlg.m_CheckYGreenOnOff != 0;
+    myYRedOnOff   = Dlg.m_CheckYRedOnOff   != 0;
 
     myZ1OnOff = Dlg.Z1OnOff;
 
-    myZBlueOnOff = Dlg.m_CheckZBlueOnOff;
-    myZGreenOnOff = Dlg.m_CheckZGreenOnOff;
-    myZRedOnOff = Dlg.m_CheckZRedOnOff;
+    myZBlueOnOff  = Dlg.m_CheckZBlueOnOff  != 0;
+    myZGreenOnOff = Dlg.m_CheckZGreenOnOff != 0;
+    myZRedOnOff   = Dlg.m_CheckZRedOnOff   != 0;
 
     // Adds a triangulation of the shape myShape to its topological data structure.
     // This triangulation is computed with the deflection myDeflection.
@@ -151,8 +132,6 @@ case 6: //color
     cout <<"Deflection = " << myDeflection << "\n" << endl;
 #endif
 
-    StdPrs_ToolShadedShape SST;
-
     Standard_Integer NumFace;
     TopExp_Explorer ExpFace;
 
@@ -191,7 +170,7 @@ case 6: //color
       {
         // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
 
-        if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
+        if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed"
           triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
         else
           triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
@@ -242,7 +221,7 @@ case 6: //color
       const Poly_Array1OfTriangle& triangles = myT->Triangles();
       TColgp_Array1OfDir myNormal(Nodes.Lower(), Nodes.Upper());
 
-      SST.Normal(myFace, pc, myNormal);
+      StdPrs_ToolTriangulatedShape::Normal(myFace, pc, myNormal);
       BRepTools::UVBounds(myFace,Umin, Umax, Vmin, Vmax);
       dUmax = (Umax - Umin);
       dVmax = (Vmax - Vmin);
@@ -258,7 +237,7 @@ case 6: //color
       for (nt = 1; nt <= nnn; nt++)
       {
         // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
-        if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
+        if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed"
           triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
         else
           triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
@@ -278,7 +257,7 @@ case 6: //color
 #ifdef DEBUG
         cout << "On traite actuellement le triangle : "<< nt <<"\n";
 #endif
-        if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
+        if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed"
           triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
         else
           triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
@@ -312,14 +291,18 @@ case 6: //color
   }
 }
 
-void User_Cylinder::Compute(const Handle_Prs3d_Projector& aProjector,
-                            const Handle_Prs3d_Presentation& aPresentation)
+void User_Cylinder::Compute(const Handle(Prs3d_Projector)& aProjector,
+                            const Handle(Prs3d_Presentation)& aPresentation)
 {
-  myDrawer->EnableDrawHiddenLine();
+  Handle (Prs3d_Drawer) aDefDrawer = GetContext()->DefaultDrawer();
+  if (aDefDrawer->DrawHiddenLine())
+    myDrawer->EnableDrawHiddenLine();
+  else
+    myDrawer->DisableDrawHiddenLine();
   StdPrs_HLRPolyShape::Add(aPresentation,myShape,myDrawer,aProjector);
 }
 
-void User_Cylinder::ComputeSelection(const Handle_SelectMgr_Selection& aSelection,
+void User_Cylinder::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
                                     const Standard_Integer aMode)
 {
   switch(aMode)
@@ -343,16 +326,6 @@ Standard_Boolean User_Cylinder::AcceptShapeDecomposition() const
   return Standard_True;
 }
 
-void User_Cylinder::SetPlanarFaceColor(const Quantity_Color acolor)
-{
-  myPlanarFaceColor = acolor;
-}
-
-void User_Cylinder::SetCylindricalFaceColor(const Quantity_Color acolor)
-{
-  myCylindricalFaceColor = acolor;
-}
-
 Standard_Boolean User_Cylinder::TriangleIsValid(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3) const
 { 
   gp_Vec V1(P1,P2);// V1=(P1,P2)
@@ -502,6 +475,5 @@ Quantity_Color User_Cylinder::Color(gp_Pnt& thePoint,Standard_Real AltMin,Standa
 void User_Cylinder::SetColor(const Quantity_Color &aColor)
 {
   AIS_InteractiveObject::SetColor(aColor);
-  SetPlanarFaceColor(aColor);
-  SetCylindricalFaceColor(aColor);
+  myColor = aColor;
 }