0023710: Simplification of presentation managment classes
[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.ixx>
16 #include <PrsMgr_PresentationManager.hxx>
17 #include <PrsMgr_Prs.hxx>
18 #include <PrsMgr_ModedPresentation.hxx>
19
20 #include <Graphic3d_Structure.hxx>
21 #include <Visual3d_View.hxx>
22 #include <Precision.hxx>
23
24 //=======================================================================
25 //function : PrsMgr_Presentation
26 //purpose  :
27 //=======================================================================
28 PrsMgr_Presentation::PrsMgr_Presentation (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
29                                           const Handle(PrsMgr_PresentableObject)&     thePrsObject)
30 : myPresentationManager (thePrsMgr),
31   myPresentableObject   (thePrsObject.operator->()),
32   myMustBeUpdated       (Standard_False),
33   myDisplayReason       (Standard_False)
34 {
35   myStructure = new PrsMgr_Prs (thePrsMgr->StructureManager(),
36                                 this, thePrsObject->TypeOfPresentation3d());
37   myStructure->SetOwner (myPresentableObject);
38 }
39
40 //=======================================================================
41 //function : Display
42 //purpose  :
43 //=======================================================================
44 void PrsMgr_Presentation::Display()
45 {
46   Display (Standard_False);
47   myDisplayReason = Standard_False;
48 }
49
50 //=======================================================================
51 //function : Display
52 //purpose  :
53 //=======================================================================
54 void PrsMgr_Presentation::Display (const Standard_Boolean theIsHighlight)
55 {
56   if (!myStructure->IsDisplayed())
57   {
58     myStructure->Display();
59     myDisplayReason = theIsHighlight;
60   }
61   else if (!myStructure->IsVisible())
62   {
63     myStructure->SetVisible (Standard_True);
64     myDisplayReason = theIsHighlight;
65   }
66 }
67
68 //=======================================================================
69 //function : Erase
70 //purpose  :
71 //=======================================================================
72 void PrsMgr_Presentation::Erase()
73 {
74   if (myStructure.IsNull())
75   {
76     return;
77   }
78
79   // Erase structure from structure manager
80   myStructure->Erase();
81   myStructure->Clear();
82   // Disconnect other structures
83   myStructure->DisconnectAll (Graphic3d_TOC_DESCENDANT);
84   // Clear groups and remove graphic structure
85   myStructure.Nullify();
86 }
87
88 //=======================================================================
89 //function : SetVisible
90 //purpose  :
91 //=======================================================================
92 void PrsMgr_Presentation::SetVisible (const Standard_Boolean theValue)
93 {
94   myStructure->SetVisible (theValue);
95 }
96
97 //=======================================================================
98 //function : Highlight
99 //purpose  :
100 //=======================================================================
101 void PrsMgr_Presentation::Highlight()
102 {
103   Display (Standard_True);
104   myStructure->Highlight();
105 }
106
107 //=======================================================================
108 //function : Unhighlight
109 //purpose  :
110 //=======================================================================
111 void PrsMgr_Presentation::Unhighlight() const
112 {
113   myStructure->UnHighlight();
114   if (myDisplayReason)
115   {
116     myStructure->SetVisible (Standard_False);
117   }
118 }
119
120 //=======================================================================
121 //function : Clear
122 //purpose  :
123 //=======================================================================
124 void PrsMgr_Presentation::Clear()
125 {
126   // This modification remove the contain of the structure:
127   // Consequence:
128   //    1. The memory zone of the group is reused
129   //    2. The speed for animation is constant
130   //myPresentableObject = NULL;
131   SetUpdateStatus (Standard_True);
132   if (myStructure.IsNull())
133   {
134     return;
135   }
136
137   myStructure->Clear (Standard_True);
138   //  myStructure->Clear(Standard_False);
139   myStructure->RemoveAll();
140 }
141
142 //=======================================================================
143 //function : Color
144 //purpose  :
145 //=======================================================================
146 void PrsMgr_Presentation::Color (const Quantity_NameOfColor theColor)
147 {
148   Display (Standard_True);
149   myStructure->Color (theColor);
150 }
151
152 //=======================================================================
153 //function : BoundBox
154 //purpose  :
155 //=======================================================================
156 void PrsMgr_Presentation::BoundBox() const
157 {
158   myStructure->BoundBox();
159 }
160
161 //=======================================================================
162 //function : IsDisplayed
163 //purpose  :
164 //=======================================================================
165 Standard_Boolean PrsMgr_Presentation::IsDisplayed() const
166 {
167   return  myStructure->IsDisplayed()
168       &&  myStructure->IsVisible()
169       && !myDisplayReason;
170 }
171
172 //=======================================================================
173 //function : IsHighlighted
174 //purpose  :
175 //=======================================================================
176 Standard_Boolean PrsMgr_Presentation::IsHighlighted() const
177 {
178   return myStructure->IsHighlighted();
179 }
180
181 //=======================================================================
182 //function : DisplayPriority
183 //purpose  :
184 //=======================================================================
185 Standard_Integer PrsMgr_Presentation::DisplayPriority() const
186 {
187   return myStructure->DisplayPriority();
188 }
189
190 //=======================================================================
191 //function : SetDisplayPriority
192 //purpose  :
193 //=======================================================================
194 void PrsMgr_Presentation::SetDisplayPriority (const Standard_Integer theNewPrior)
195 {
196   myStructure->SetDisplayPriority (theNewPrior);
197 }
198
199 //=======================================================================
200 //function : Connect
201 //purpose  :
202 //=======================================================================
203 void PrsMgr_Presentation::Connect (const Handle(PrsMgr_Presentation)& theOther) const
204 {
205   myStructure->Connect (theOther->Presentation());
206 }
207
208 //=======================================================================
209 //function : Transform
210 //purpose  :
211 //=======================================================================
212 void PrsMgr_Presentation::Transform (const Handle(Geom_Transformation)& theTrsf) const
213 {
214   myStructure->Transform (theTrsf);
215 }
216
217 //=======================================================================
218 //function : Place
219 //purpose  :
220 //=======================================================================
221 void PrsMgr_Presentation::Place (const Quantity_Length theX,
222                                  const Quantity_Length theY,
223                                  const Quantity_Length theZ) const
224 {
225   myStructure->Place (theX, theY, theZ);
226 }
227
228 //=======================================================================
229 //function : Multiply
230 //purpose  :
231 //=======================================================================
232 void PrsMgr_Presentation::Multiply (const Handle(Geom_Transformation)& theTrsf) const
233 {
234   myStructure->Multiply (theTrsf);
235 }
236
237 //=======================================================================
238 //function : Move
239 //purpose  :
240 //=======================================================================
241 void PrsMgr_Presentation::Move (const Quantity_Length theX,
242                                 const Quantity_Length theY,
243                                 const Quantity_Length theZ) const
244 {
245   myStructure->Move (theX, theY, theZ);
246 }
247
248 //=======================================================================
249 //function : SetShadingAspect
250 //purpose  :
251 //=======================================================================
252 void PrsMgr_Presentation::SetShadingAspect (const Handle(Prs3d_ShadingAspect)& theShadingAspect) const
253 {
254   myStructure->SetShadingAspect (theShadingAspect);
255 }
256
257 //=======================================================================
258 //function : Compute
259 //purpose  : Methods for hidden parts...
260 //=======================================================================
261 Handle(Graphic3d_Structure) PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector)
262 {
263   Handle(Prs3d_Presentation) aPrs = new Prs3d_Presentation (myPresentationManager->StructureManager());
264   myPresentableObject->Compute (Projector (theProjector), aPrs);
265   return aPrs;
266 }
267
268 //=======================================================================
269 //function : Compute
270 //purpose  :
271 //=======================================================================
272 void PrsMgr_Presentation::Compute (const Handle(Graphic3d_Structure)& theStructure)
273 {
274   Standard_Integer aDispMode = 0;
275   Standard_Integer aPresentationsNumber = myPresentableObject->myPresentations.Length();
276   for (Standard_Integer anIter = 1; anIter <= aPresentationsNumber; ++anIter)
277   {
278     const PrsMgr_ModedPresentation& aModedPresentation = myPresentableObject->myPresentations.Value (anIter);
279     if (aModedPresentation.Presentation().operator->() == this)
280     {
281       aDispMode = aModedPresentation.Mode();
282       break;
283     }
284   }
285
286   Handle(Prs3d_Presentation) aPrs3d = Handle(Prs3d_Presentation)::DownCast (theStructure);
287   myPresentableObject->Compute (myPresentationManager, aPrs3d, aDispMode);
288 }
289
290 //=======================================================================
291 //function : Compute
292 //purpose  :
293 //=======================================================================
294 void PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector,
295                                    const Handle(Graphic3d_Structure)&            theStructToFill)
296 {
297   theStructToFill->Clear();
298   const Handle(Prs3d_Presentation)& aPrs = *((Handle(Prs3d_Presentation)* )&theStructToFill);
299   myPresentableObject->Compute (Projector (theProjector), aPrs);
300 }
301
302 //=======================================================================
303 //function : Compute
304 //purpose  :
305 //=======================================================================
306 Handle(Graphic3d_Structure) PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector,
307                                                           const Handle(Geom_Transformation)&            theTrsf)
308 {
309   Handle(Prs3d_Presentation) aPrs3d = new Prs3d_Presentation (myPresentationManager->StructureManager());
310   if (theTrsf->Form() == gp_Translation)
311   {
312     myPresentableObject->Compute (Projector (theProjector), aPrs3d);
313     aPrs3d->Transform (theTrsf);
314     return aPrs3d;
315   }
316
317   // waiting that something is done in gp_Trsf...rob
318   for (Standard_Integer i = 1; i <= 3; ++i)
319   {
320     for (Standard_Integer j = 1; j <= 3; ++j)
321     {
322       if (i != j)
323       {
324         if (Abs (theTrsf->Value (i, j)) > Precision::Confusion())
325         {
326           myPresentableObject->Compute (Projector (theProjector), theTrsf, aPrs3d);
327           return aPrs3d;
328         }
329       }
330     }
331   }
332
333   myPresentableObject->Compute (Projector (theProjector), aPrs3d);
334   aPrs3d->Transform (theTrsf);
335   return aPrs3d;
336 }
337
338 //=======================================================================
339 //function : Compute
340 //purpose  :
341 //=======================================================================
342 void PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector,
343                                    const Handle(Geom_Transformation)&            theTrsf,
344                                    const Handle(Graphic3d_Structure)&            theStructToFill)
345 {
346   // recompute HLR after transformation in all the case
347   Handle(Prs3d_Presentation) aPrs = *((Handle(Prs3d_Presentation)*)&theStructToFill);
348   theStructToFill->Clear();
349   myPresentableObject->Compute (Projector (theProjector), theTrsf, aPrs);
350 }
351
352 //=======================================================================
353 //function : Projector
354 //purpose  :
355 //=======================================================================
356 Handle(Prs3d_Projector) PrsMgr_Presentation::Projector (const Handle(Graphic3d_DataStructureManager)& theProjector)
357 {
358   const Handle(Graphic3d_Camera)& aCamera = Handle(Visual3d_View)::DownCast (theProjector)->Camera();
359   const gp_Dir aDir = aCamera->Direction().Reversed();
360   const gp_Pnt anAt = aCamera->Center();
361   const gp_Dir anUp = aCamera->Up();
362   Handle(Prs3d_Projector) aProj = new Prs3d_Projector (!aCamera->IsOrthographic(),
363                                                        aCamera->Scale(),
364                                                        aDir.X(), aDir.Y(), aDir.Z(),
365                                                        anAt.X(), anAt.Y(), anAt.Z(),
366                                                        anUp.X(), anUp.Y(), anUp.Z());
367   return aProj;
368 }
369
370 //=======================================================================
371 //function : Destroy
372 //purpose  :
373 //=======================================================================
374 void PrsMgr_Presentation::Destroy()
375 {
376   if (!myStructure.IsNull())
377   {
378     myStructure->Clear();
379     myStructure.Nullify();
380   }
381 }
382
383 //=======================================================================
384 //function : SetZLayer
385 //purpose  :
386 //=======================================================================
387 void PrsMgr_Presentation::SetZLayer (Standard_Integer theLayerId)
388 {
389   myStructure->SetZLayer (theLayerId);
390 }
391
392 //=======================================================================
393 //function : GetZLayer
394 //purpose  :
395 //=======================================================================
396 Standard_Integer PrsMgr_Presentation::GetZLayer() const
397 {
398   return myStructure->GetZLayer();
399 }