0031431: Visualization, PrsMgr_PresentableObject - simplify HLR computing interface
[occt.git] / src / PrsMgr / PrsMgr_Presentation.cxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <PrsMgr_Presentation.hxx>
16
17 #include <Geom_Transformation.hxx>
18 #include <Graphic3d_DataStructureManager.hxx>
19 #include <Precision.hxx>
20 #include <Prs3d_Drawer.hxx>
21 #include <PrsMgr_PresentableObject.hxx>
22 #include <PrsMgr_PresentationManager.hxx>
23 #include <Quantity_Color.hxx>
24 #include <Graphic3d_CView.hxx>
25
26 IMPLEMENT_STANDARD_RTTIEXT(PrsMgr_Presentation, Graphic3d_Structure)
27
28 namespace
29 {
30   enum BeforeHighlightState
31   {
32     State_Empty,
33     State_Hidden,
34     State_Visible
35   };
36
37   static BeforeHighlightState StructureState (const Graphic3d_Structure* theStructure)
38   {
39     return !theStructure->IsDisplayed() ?
40       State_Empty : !theStructure->IsVisible() ?
41         State_Hidden : State_Visible;
42   }
43 }
44
45 //=======================================================================
46 //function : PrsMgr_Presentation
47 //purpose  :
48 //=======================================================================
49 PrsMgr_Presentation::PrsMgr_Presentation (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
50                                           const Handle(PrsMgr_PresentableObject)& thePrsObject,
51                                           const Standard_Integer theMode)
52 : Graphic3d_Structure (thePrsMgr->StructureManager()),
53   myPresentationManager  (thePrsMgr),
54   myPresentableObject    (thePrsObject.get()),
55   myBeforeHighlightState (State_Empty),
56   myMode                 (theMode),
57   myMustBeUpdated        (Standard_False)
58 {
59   if (thePrsObject->TypeOfPresentation3d() == PrsMgr_TOP_ProjectorDependant)
60   {
61     SetVisual (Graphic3d_TOS_COMPUTED);
62   }
63   SetOwner (myPresentableObject);
64   SetMutable (myPresentableObject->IsMutable());
65 }
66
67 //=======================================================================
68 //function : Display
69 //purpose  :
70 //=======================================================================
71 void PrsMgr_Presentation::Display()
72 {
73   display (Standard_False);
74   myBeforeHighlightState = State_Visible;
75 }
76
77 //=======================================================================
78 //function : display
79 //purpose  :
80 //=======================================================================
81 void PrsMgr_Presentation::display (const Standard_Boolean theIsHighlight)
82 {
83   if (!base_type::IsDisplayed())
84   {
85     base_type::SetIsForHighlight (theIsHighlight); // optimization - disable frustum culling for this presentation
86     base_type::Display();
87   }
88   else if (!base_type::IsVisible())
89   {
90     base_type::SetVisible (Standard_True);
91   }
92 }
93
94 //=======================================================================
95 //function : Erase
96 //purpose  :
97 //=======================================================================
98 void PrsMgr_Presentation::Erase()
99 {
100   if (IsDeleted())
101   {
102     return;
103   }
104
105   // Erase structure from structure manager
106   base_type::Erase();
107   base_type::Clear();
108   // Disconnect other structures
109   base_type::DisconnectAll (Graphic3d_TOC_DESCENDANT);
110   // Clear groups and remove graphic structure
111   base_type::Remove();
112 }
113
114 //=======================================================================
115 //function : Highlight
116 //purpose  :
117 //=======================================================================
118 void PrsMgr_Presentation::Highlight (const Handle(Prs3d_Drawer)& theStyle)
119 {
120   if (!IsHighlighted())
121   {
122     myBeforeHighlightState = StructureState (this);
123   }
124
125   display (Standard_True);
126   base_type::Highlight (theStyle);
127 }
128
129 //=======================================================================
130 //function : Unhighlight
131 //purpose  :
132 //=======================================================================
133 void PrsMgr_Presentation::Unhighlight()
134 {
135   base_type::UnHighlight();
136   switch (myBeforeHighlightState)
137   {
138     case State_Visible:
139       return;
140     case State_Hidden:
141       base_type::SetVisible (Standard_False);
142       break;
143     case State_Empty:
144       base_type::Erase();
145       break;
146   }
147 }
148
149 //=======================================================================
150 //function : Clear
151 //purpose  :
152 //=======================================================================
153 void PrsMgr_Presentation::Clear (const Standard_Boolean theWithDestruction)
154 {
155   // This modification remove the contain of the structure:
156   // Consequence:
157   //    1. The memory zone of the group is reused
158   //    2. The speed for animation is constant
159   //myPresentableObject = NULL;
160   SetUpdateStatus (Standard_True);
161   if (IsDeleted())
162   {
163     return;
164   }
165
166   base_type::Clear (theWithDestruction);
167   base_type::DisconnectAll (Graphic3d_TOC_DESCENDANT);
168 }
169
170 //=======================================================================
171 //function : Compute
172 //purpose  :
173 //=======================================================================
174 void PrsMgr_Presentation::Compute()
175 {
176   Standard_Integer aDispMode = 0;
177   for (PrsMgr_Presentations::Iterator aPrsIter (myPresentableObject->myPresentations); aPrsIter.More(); aPrsIter.Next())
178   {
179     const Handle(PrsMgr_Presentation)& aModedPresentation = aPrsIter.Value();
180     if (aModedPresentation == this)
181     {
182       aDispMode = aModedPresentation->Mode();
183       break;
184     }
185   }
186
187   myPresentableObject->Compute (myPresentationManager, this, aDispMode);
188 }
189
190 //=======================================================================
191 //function : Compute
192 //purpose  :
193 //=======================================================================
194 void PrsMgr_Presentation::computeHLR (const Handle(Graphic3d_Camera)& theProjector,
195                                       Handle(Graphic3d_Structure)& theStructToFill)
196 {
197   if (theStructToFill.IsNull())
198   {
199     theStructToFill = new Prs3d_Presentation (myPresentationManager->StructureManager());
200   }
201   Handle(Graphic3d_Structure) aPrs = theStructToFill;
202   theStructToFill->Clear();
203   myPresentableObject->computeHLR (theProjector, Transformation(), aPrs);
204 }
205
206 //=======================================================================
207 //function : ~PrsMgr_Presentation
208 //purpose  :
209 //=======================================================================
210 PrsMgr_Presentation::~PrsMgr_Presentation()
211 {
212   Erase();
213 }
214
215 // =======================================================================
216 // function : DumpJson
217 // purpose  :
218 // =======================================================================
219 void PrsMgr_Presentation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
220 {
221   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
222   OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_Structure)
223
224   OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myPresentableObject)
225
226   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBeforeHighlightState)
227   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMode)
228   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMustBeUpdated)
229 }