0031431: Visualization, PrsMgr_PresentableObject - simplify HLR computing interface
[occt.git] / src / StdPrs / StdPrs_HLRPolyShape.cxx
1 // Created on: 1995-09-19
2 // Created by: Laurent PAINNOT
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <StdPrs_HLRPolyShape.hxx>
18
19 #include <BRepMesh_IncrementalMesh.hxx>
20 #include <Graphic3d_ArrayOfSegments.hxx>
21 #include <Graphic3d_Group.hxx>
22 #include <HLRAlgo_EdgeIterator.hxx>
23 #include <HLRAlgo_EdgeStatus.hxx>
24 #include <HLRBRep_BiPoint.hxx>
25 #include <HLRBRep_ListIteratorOfListOfBPoint.hxx>
26 #include <HLRBRep_ListOfBPoint.hxx>
27 #include <HLRBRep_PolyAlgo.hxx>
28 #include <Prs3d_LineAspect.hxx>
29 #include <Prs3d_Presentation.hxx>
30 #include <StdPrs_ToolTriangulatedShape.hxx>
31 #include <StdPrs_WFShape.hxx>
32 #include <TColgp_SequenceOfPnt.hxx>
33 #include <TopAbs.hxx>
34 #include <TopExp_Explorer.hxx>
35 #include <TopoDS_Shape.hxx>
36
37 #define PntX1 ((Standard_Real*)Coordinates)[0]
38 #define PntY1 ((Standard_Real*)Coordinates)[1]
39 #define PntZ1 ((Standard_Real*)Coordinates)[2]
40 #define PntX2 ((Standard_Real*)Coordinates)[3]
41 #define PntY2 ((Standard_Real*)Coordinates)[4]
42 #define PntZ2 ((Standard_Real*)Coordinates)[5]
43
44 IMPLEMENT_STANDARD_RTTIEXT(StdPrs_HLRPolyShape, StdPrs_HLRShapeI)
45
46 //=======================================================================
47 //function : Add
48 //purpose  :
49 //=======================================================================
50 void StdPrs_HLRPolyShape::ComputeHLR (const Handle(Prs3d_Presentation)& aPresentation,
51                                       const TopoDS_Shape& aShape,
52                                       const Handle(Prs3d_Drawer)& aDrawer,
53                                       const Handle(Graphic3d_Camera)& theProjector) const
54 {
55   gp_Dir aBackDir = -theProjector->Direction();
56   gp_Dir aXpers   = theProjector->Up().Crossed (aBackDir);
57   gp_Ax3 anAx3 (theProjector->Center(), aBackDir, aXpers);
58   gp_Trsf aTrsf;
59   aTrsf.SetTransformation (anAx3);
60   const HLRAlgo_Projector aProj (aTrsf, !theProjector->IsOrthographic(), theProjector->Scale());
61
62   Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(aPresentation);
63
64   TopExp_Explorer ex;
65
66   // find vertices not under ancestors.
67   TopAbs_ShapeEnum E = aShape.ShapeType();
68   if (E == TopAbs_COMPOUND) {
69     // it is necessary to present isolated vertexes instead of hiding them.
70     for (ex.Init(aShape, TopAbs_VERTEX, TopAbs_EDGE); ex.More(); ex.Next()) {
71       StdPrs_WFShape::Add(aPresentation, ex.Current(), aDrawer);
72     }
73   }
74
75   if (aDrawer->IsAutoTriangulation())
76   {
77     const Standard_Boolean aRel = aDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE;
78     Standard_Real aDef = aRel ? aDrawer->HLRDeviationCoefficient() : aDrawer->MaximalChordialDeviation();
79     IMeshTools_Parameters aMeshParams;
80     aMeshParams.Relative   = aRel;
81     aMeshParams.Angle      = aDrawer->HLRAngle();
82     aMeshParams.Deflection = aDef;
83     BRepMesh_IncrementalMesh mesh(aShape, aMeshParams);
84   }
85   
86   Handle(HLRBRep_PolyAlgo) hider = new HLRBRep_PolyAlgo(aShape);
87   hider->Projector (aProj);
88   hider->Angle(aDrawer->HLRAngle());
89   hider->Update();
90   Standard_Real sta,end,dx,dy,dz;
91   Standard_ShortReal tolsta, tolend;
92   HLRAlgo_EdgeStatus status;
93   HLRAlgo_EdgeIterator It;
94   Standard_Boolean reg1,regn,outl, intl;
95   Standard_Address Coordinates;
96   TopoDS_Shape S;
97
98   HLRBRep_ListOfBPoint BiPntVis, BiPntHid;
99   
100   for (hider->InitHide(); hider->MoreHide(); hider->NextHide())
101   {
102     Coordinates = &hider->Hide(status, S, reg1, regn, outl, intl);
103     
104     dx = PntX2 - PntX1;
105     dy = PntY2 - PntY1;
106     dz = PntZ2 - PntZ1;
107     
108     for (It.InitVisible(status); It.MoreVisible(); It.NextVisible())
109     {
110       It.Visible(sta,tolsta,end,tolend);
111       BiPntVis.Append
112         (HLRBRep_BiPoint
113            (PntX1 + sta * dx,PntY1 + sta * dy,PntZ1 + sta * dz,
114             PntX1 + end * dx,PntY1 + end * dy,PntZ1 + end * dz,
115             S,reg1,regn,outl,intl));
116     }
117     
118     for (It.InitHidden(status); It.MoreHidden(); It.NextHidden())
119     {
120       It.Hidden(sta,tolsta,end,tolend);
121       BiPntHid.Append
122         (HLRBRep_BiPoint
123            (PntX1 + sta * dx,PntY1 + sta * dy,PntZ1 + sta * dz,
124             PntX1 + end * dx,PntY1 + end * dy,PntZ1 + end * dz,
125             S,reg1,regn,outl,intl));    
126     }
127   }
128
129   // storage in the group
130   if (aDrawer->DrawHiddenLine())
131   {
132     Standard_Integer aNbHiddenSegments = 0;
133     for (HLRBRep_ListIteratorOfListOfBPoint aBPntHidIter (BiPntHid); aBPntHidIter.More(); aBPntHidIter.Next())
134     {
135       const HLRBRep_BiPoint& aBPnt = aBPntHidIter.Value();
136       if (!aBPnt.RgNLine()
137         || aBPnt.OutLine())
138       {
139         ++aNbHiddenSegments;
140       }
141     }
142     if (aNbHiddenSegments > 0)
143     {
144       Handle(Graphic3d_ArrayOfSegments) aHiddenArray = new Graphic3d_ArrayOfSegments (aNbHiddenSegments * 2);
145       for (HLRBRep_ListIteratorOfListOfBPoint aBPntHidIter (BiPntHid); aBPntHidIter.More(); aBPntHidIter.Next())
146       {
147         const HLRBRep_BiPoint& aBPnt = aBPntHidIter.Value();
148         if (!aBPnt.RgNLine()
149           || aBPnt.OutLine())
150         {
151           aHiddenArray->AddVertex (aBPnt.P1());
152           aHiddenArray->AddVertex (aBPnt.P2());
153         }
154       }
155
156       aGroup->SetPrimitivesAspect (aDrawer->HiddenLineAspect()->Aspect());
157       aGroup->AddPrimitiveArray (aHiddenArray);
158     }
159   }
160   {
161     Standard_Integer aNbSeenSegments = 0;
162     for (HLRBRep_ListIteratorOfListOfBPoint aBPntVisIter (BiPntVis); aBPntVisIter.More(); aBPntVisIter.Next())
163     {
164       const HLRBRep_BiPoint& aBPnt = aBPntVisIter.Value();
165       if (!aBPnt.RgNLine()
166         || aBPnt.OutLine())
167       {
168         ++aNbSeenSegments;
169       }
170     }
171     if (aNbSeenSegments > 0)
172     {
173       Handle(Graphic3d_ArrayOfSegments) aSeenArray = new Graphic3d_ArrayOfSegments (aNbSeenSegments * 2);
174       for (HLRBRep_ListIteratorOfListOfBPoint aBPntVisIter (BiPntVis); aBPntVisIter.More(); aBPntVisIter.Next())
175       {
176         const HLRBRep_BiPoint& aBPnt = aBPntVisIter.Value();
177         if (!aBPnt.RgNLine()
178           || aBPnt.OutLine())
179         {
180           aSeenArray->AddVertex (aBPnt.P1());
181           aSeenArray->AddVertex (aBPnt.P2());
182         }
183       }
184       aGroup->SetPrimitivesAspect (aDrawer->SeenLineAspect()->Aspect());
185       aGroup->AddPrimitiveArray (aSeenArray);
186     }
187   }
188 }