0029419: Make V3d_Viewer::PrivilegedPlane() return const reference rather than a...
[occt.git] / src / V3d / V3d_Viewer.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <V3d_Viewer.hxx>
15
16 #include <Aspect_Grid.hxx>
17 #include <Aspect_IdentDefinitionError.hxx>
18 #include <Graphic3d_ArrayOfSegments.hxx>
19 #include <Graphic3d_AspectLine3d.hxx>
20 #include <Graphic3d_AspectMarker3d.hxx>
21 #include <Graphic3d_AspectText3d.hxx>
22 #include <Graphic3d_GraphicDriver.hxx>
23 #include <Graphic3d_Group.hxx>
24 #include <Graphic3d_Structure.hxx>
25 #include <Standard_ErrorHandler.hxx>
26 #include <Standard_Type.hxx>
27 #include <V3d.hxx>
28 #include <V3d_BadValue.hxx>
29 #include <V3d_CircularGrid.hxx>
30 #include <V3d_AmbientLight.hxx>
31 #include <V3d_DirectionalLight.hxx>
32 #include <V3d_RectangularGrid.hxx>
33 #include <V3d_View.hxx>
34
35 IMPLEMENT_STANDARD_RTTIEXT(V3d_Viewer, Standard_Transient)
36
37 // ========================================================================
38 // function : V3d_Viewer
39 // purpose  :
40 // ========================================================================
41 V3d_Viewer::V3d_Viewer (const Handle(Graphic3d_GraphicDriver)& theDriver)
42 : myDriver (theDriver),
43   myStructureManager (new Graphic3d_StructureManager (theDriver)),
44   myZLayerGenId (1, IntegerLast()),
45   myBackground (Quantity_NOC_GRAY30),
46   myViewSize (1000.0),
47   myViewProj (V3d_XposYnegZpos),
48   myVisualization (V3d_ZBUFFER),
49   myShadingModel (V3d_GOURAUD),
50   myDefaultTypeOfView (V3d_ORTHOGRAPHIC),
51   myComputedMode (Standard_True),
52   myDefaultComputedMode (Standard_False),
53   myPrivilegedPlane (gp_Ax3 (gp_Pnt (0.,0.,0), gp_Dir (0.,0.,1.), gp_Dir (1.,0.,0.))),
54   myDisplayPlane (Standard_False),
55   myDisplayPlaneLength (1000.0),
56   myGridType (Aspect_GT_Rectangular),
57   myGridEcho (Standard_True),
58   myGridEchoLastVert (ShortRealLast(), ShortRealLast(), ShortRealLast())
59 {
60   myRGrid = new V3d_RectangularGrid (this, Quantity_Color (Quantity_NOC_GRAY50), Quantity_Color (Quantity_NOC_GRAY70));
61   myCGrid = new V3d_CircularGrid    (this, Quantity_Color (Quantity_NOC_GRAY50), Quantity_Color (Quantity_NOC_GRAY70));
62 }
63
64 // ========================================================================
65 // function : V3d_Viewer
66 // purpose  :
67 // ========================================================================
68 V3d_Viewer::V3d_Viewer (const Handle(Graphic3d_GraphicDriver)& theDriver,
69                         const Standard_ExtString ,
70                         const Standard_CString ,
71                         const Standard_Real           theViewSize,
72                         const V3d_TypeOfOrientation   theViewProj,
73                         const Quantity_Color&         theViewBackground,
74                         const V3d_TypeOfVisualization theVisualization,
75                         const V3d_TypeOfShadingModel  theShadingModel,
76                         const Standard_Boolean        theComputedMode,
77                         const Standard_Boolean        theDefaultComputedMode)
78 : myDriver (theDriver),
79   myStructureManager (new Graphic3d_StructureManager (theDriver)),
80   myZLayerGenId (1, IntegerLast()),
81   myBackground (theViewBackground),
82   myViewSize (theViewSize),
83   myViewProj (theViewProj),
84   myVisualization (theVisualization),
85   myShadingModel (theShadingModel),
86   myDefaultTypeOfView (V3d_ORTHOGRAPHIC),
87   myComputedMode (theComputedMode),
88   myDefaultComputedMode (theDefaultComputedMode),
89   myPrivilegedPlane (gp_Ax3 (gp_Pnt (0.,0.,0), gp_Dir (0.,0.,1.), gp_Dir (1.,0.,0.))),
90   myDisplayPlane (Standard_False),
91   myDisplayPlaneLength (theViewSize),
92   myGridType (Aspect_GT_Rectangular),
93   myGridEcho (Standard_True),
94   myGridEchoLastVert (ShortRealLast(), ShortRealLast(), ShortRealLast())
95 {
96   myRGrid = new V3d_RectangularGrid (this, Quantity_Color (Quantity_NOC_GRAY50), Quantity_Color (Quantity_NOC_GRAY70));
97   myCGrid = new V3d_CircularGrid    (this, Quantity_Color (Quantity_NOC_GRAY50), Quantity_Color (Quantity_NOC_GRAY70));
98   SetDefaultViewSize (theViewSize);
99 }
100
101 // ========================================================================
102 // function : CreateView
103 // purpose  :
104 // ========================================================================
105 Handle(V3d_View) V3d_Viewer::CreateView ()
106 {
107   return new V3d_View(this, myDefaultTypeOfView);
108 }
109
110 // ========================================================================
111 // function : SetViewOn
112 // purpose  :
113 // ========================================================================
114 void V3d_Viewer::SetViewOn()
115 {
116   for (V3d_ListOfView::Iterator aDefViewIter (myDefinedViews); aDefViewIter.More(); aDefViewIter.Next())
117   {
118     SetViewOn (aDefViewIter.Value());
119   }
120 }
121
122 // ========================================================================
123 // function : SetViewOff
124 // purpose  :
125 // ========================================================================
126 void V3d_Viewer::SetViewOff()
127 {
128   for (V3d_ListOfView::Iterator aDefViewIter (myDefinedViews); aDefViewIter.More(); aDefViewIter.Next())
129   {
130     SetViewOff (aDefViewIter.Value());
131   }
132 }
133
134 // ========================================================================
135 // function : SetViewOn
136 // purpose  :
137 // ========================================================================
138 void V3d_Viewer::SetViewOn (const Handle(V3d_View)& theView)
139 {
140   Handle(Graphic3d_CView) aViewImpl = theView->View();
141   if (!aViewImpl->IsDefined() || myActiveViews.Contains (theView))
142   {
143     return;
144   }
145
146   myActiveViews.Append (theView);
147   aViewImpl->Activate();
148   for (V3d_ListOfLight::Iterator anActiveLightIter (myActiveLights); anActiveLightIter.More(); anActiveLightIter.Next())
149   {
150     theView->SetLightOn (anActiveLightIter.Value());
151   }
152
153   theView->SetGrid (myPrivilegedPlane, Grid ());
154   theView->SetGridActivity (Grid ()->IsActive ());
155   theView->Redraw();
156 }
157
158 // ========================================================================
159 // function : SetViewOff
160 // purpose  :
161 // ========================================================================
162 void V3d_Viewer::SetViewOff (const Handle(V3d_View)& theView)
163 {
164   Handle(Graphic3d_CView) aViewImpl = theView->View();
165   if (aViewImpl->IsDefined() && myActiveViews.Contains (theView))
166   {
167     myActiveViews.Remove (theView);
168     aViewImpl->Deactivate() ;
169   }
170 }
171
172 // ========================================================================
173 // function : Redraw
174 // purpose  :
175 // ========================================================================
176 void V3d_Viewer::Redraw() const
177 {
178   for (V3d_ListOfView::Iterator aDefViewIter (myDefinedViews); aDefViewIter.More(); aDefViewIter.Next())
179   {
180     aDefViewIter.Value()->Redraw();
181   }
182 }
183
184 // ========================================================================
185 // function : RedrawImmediate
186 // purpose  :
187 // ========================================================================
188 void V3d_Viewer::RedrawImmediate() const
189 {
190   for (V3d_ListOfView::Iterator aDefViewIter (myDefinedViews); aDefViewIter.More(); aDefViewIter.Next())
191   {
192     aDefViewIter.Value()->RedrawImmediate();
193   }
194 }
195
196 // ========================================================================
197 // function : Invalidate
198 // purpose  :
199 // ========================================================================
200 void V3d_Viewer::Invalidate() const
201 {
202   for (V3d_ListOfView::Iterator aDefViewIter (myDefinedViews); aDefViewIter.More(); aDefViewIter.Next())
203   {
204     aDefViewIter.Value()->Invalidate();
205   }
206 }
207
208 // ========================================================================
209 // function : Remove
210 // purpose  :
211 // ========================================================================
212 void V3d_Viewer::Remove()
213 {
214   myStructureManager->Remove();
215 }
216
217 // ========================================================================
218 // function : Erase
219 // purpose  :
220 // ========================================================================
221 void V3d_Viewer::Erase() const
222 {
223   myStructureManager->Erase();
224 }
225
226 // ========================================================================
227 // function : UnHighlight
228 // purpose  :
229 // ========================================================================
230 void V3d_Viewer::UnHighlight() const
231 {
232   myStructureManager->UnHighlight();
233 }
234
235 void V3d_Viewer::SetDefaultViewSize (const Standard_Real theSize)
236 {
237   if (theSize <= 0.0)
238     throw V3d_BadValue("V3d_Viewer::SetDefaultViewSize, bad size");
239   myViewSize = theSize;
240 }
241
242 // ========================================================================
243 // function : IfMoreViews
244 // purpose  :
245 // ========================================================================
246 Standard_Boolean V3d_Viewer::IfMoreViews() const
247 {
248   return myDefinedViews.Size() < myStructureManager->MaxNumOfViews();
249 }
250
251 // ========================================================================
252 // function : AddView
253 // purpose  :
254 // ========================================================================
255 void V3d_Viewer::AddView (const Handle(V3d_View)& theView)
256 {
257   if (!myDefinedViews.Contains (theView))
258   {
259     myDefinedViews.Append (theView);
260   }
261 }
262
263 // ========================================================================
264 // function : DelView
265 // purpose  :
266 // ========================================================================
267 void V3d_Viewer::DelView (const Handle(V3d_View)& theView)
268 {
269   myActiveViews.Remove (theView);
270   myDefinedViews.Remove (theView);
271 }
272
273 //=======================================================================
274 //function : AddZLayer
275 //purpose  :
276 //=======================================================================
277 Standard_Boolean V3d_Viewer::AddZLayer (Standard_Integer& theLayerId)
278 {
279   try
280   {
281     OCC_CATCH_SIGNALS
282     theLayerId = myZLayerGenId.Next();
283   }
284   catch (Aspect_IdentDefinitionError)
285   {
286     // new index can't be generated
287     return Standard_False;
288   }
289
290   myLayerIds.Add (theLayerId);
291   myDriver->AddZLayer (theLayerId);
292
293   return Standard_True;
294 }
295
296 //=======================================================================
297 //function : RemoveZLayer
298 //purpose  : 
299 //=======================================================================
300 Standard_Boolean V3d_Viewer::RemoveZLayer (const Standard_Integer theLayerId)
301 {
302   if (!myLayerIds.Contains (theLayerId)
303     || theLayerId < myZLayerGenId.Lower()
304     || theLayerId > myZLayerGenId.Upper())
305   {
306     return Standard_False;
307   }
308
309   myDriver->RemoveZLayer (theLayerId);
310   myLayerIds.Remove  (theLayerId);
311   myZLayerGenId.Free (theLayerId);
312
313   return Standard_True;
314 }
315
316 //=======================================================================
317 //function : GetAllZLayers
318 //purpose  :
319 //=======================================================================
320 void V3d_Viewer::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq) const
321 {
322   myDriver->ZLayers (theLayerSeq);
323 }
324
325 //=======================================================================
326 //function : SetZLayerSettings
327 //purpose  :
328 //=======================================================================
329 void V3d_Viewer::SetZLayerSettings (const Standard_Integer theLayerId, const Graphic3d_ZLayerSettings& theSettings)
330 {
331   myDriver->SetZLayerSettings (theLayerId, theSettings);
332 }
333
334 //=======================================================================
335 //function : ZLayerSettings
336 //purpose  :
337 //=======================================================================
338 Graphic3d_ZLayerSettings V3d_Viewer::ZLayerSettings (const Standard_Integer theLayerId)
339 {
340   return myDriver->ZLayerSettings (theLayerId);
341 }
342
343 //=======================================================================
344 //function : UpdateLights
345 //purpose  :
346 //=======================================================================
347 void V3d_Viewer::UpdateLights()
348 {
349   for (V3d_ListOfView::Iterator anActiveViewIter (myActiveViews); anActiveViewIter.More(); anActiveViewIter.Next())
350   {
351     anActiveViewIter.Value()->UpdateLights();
352   }
353 }
354
355 //=======================================================================
356 //function : SetLightOn
357 //purpose  :
358 //=======================================================================
359 void V3d_Viewer::SetLightOn (const Handle(V3d_Light)& theLight)
360 {
361   if (!myActiveLights.Contains (theLight))
362   {
363     myActiveLights.Append (theLight);
364   }
365
366   for (V3d_ListOfView::Iterator anActiveViewIter (myActiveViews); anActiveViewIter.More(); anActiveViewIter.Next())
367   {
368     anActiveViewIter.Value()->SetLightOn (theLight);
369   }
370 }
371
372 //=======================================================================
373 //function : SetLightOff
374 //purpose  :
375 //=======================================================================
376 void V3d_Viewer::SetLightOff (const Handle(V3d_Light)& theLight)
377 {
378   myActiveLights.Remove (theLight);
379   for (V3d_ListOfView::Iterator anActiveViewIter (myActiveViews); anActiveViewIter.More(); anActiveViewIter.Next())
380   {
381     anActiveViewIter.Value()->SetLightOff (theLight);
382   }
383 }
384
385 //=======================================================================
386 //function : SetLightOn
387 //purpose  :
388 //=======================================================================
389 void V3d_Viewer::SetLightOn()
390 {
391   for (V3d_ListOfLight::Iterator aDefLightIter (myDefinedLights); aDefLightIter.More(); aDefLightIter.Next())
392   {
393     if (!myActiveLights.Contains (aDefLightIter.Value()))
394     {
395       myActiveLights.Append (aDefLightIter.Value());
396       for (V3d_ListOfView::Iterator anActiveViewIter (myActiveViews); anActiveViewIter.More(); anActiveViewIter.Next())
397       {
398         anActiveViewIter.Value()->SetLightOn (aDefLightIter.Value());
399       }
400     }
401   }
402 }
403
404 //=======================================================================
405 //function : SetLightOff
406 //purpose  :
407 //=======================================================================
408 void V3d_Viewer::SetLightOff()
409 {
410   for (V3d_ListOfLight::Iterator anActiveLightIter (myActiveLights); anActiveLightIter.More(); anActiveLightIter.Next())
411   {
412     for (V3d_ListOfView::Iterator anActiveViewIter (myActiveViews); anActiveViewIter.More(); anActiveViewIter.Next())
413     {
414       anActiveViewIter.Value()->SetLightOff (anActiveLightIter.Value());
415     }
416   }
417   myActiveLights.Clear();
418 }
419
420 //=======================================================================
421 //function : IsGlobalLight
422 //purpose  :
423 //=======================================================================
424 Standard_Boolean V3d_Viewer::IsGlobalLight (const Handle(V3d_Light)& theLight) const
425 {
426   return myActiveLights.Contains (theLight);
427 }
428
429 //=======================================================================
430 //function : AddLight
431 //purpose  :
432 //=======================================================================
433 void V3d_Viewer::AddLight (const Handle(V3d_Light)& theLight)
434 {
435   if (!myDefinedLights.Contains (theLight))
436   {
437     myDefinedLights.Append (theLight);
438   }
439 }
440
441 //=======================================================================
442 //function : DelLight
443 //purpose  :
444 //=======================================================================
445 void V3d_Viewer::DelLight (const Handle(V3d_Light)& theLight)
446 {
447   SetLightOff (theLight);
448   myDefinedLights.Remove (theLight);
449 }
450
451 //=======================================================================
452 //function : SetDefaultLights
453 //purpose  :
454 //=======================================================================
455 void V3d_Viewer::SetDefaultLights()
456 {
457   while (!myDefinedLights.IsEmpty())
458   {
459     Handle(V3d_Light) aLight = myDefinedLights.First();
460     DelLight (aLight);
461   }
462
463   Handle(V3d_DirectionalLight) aDirLight  = new V3d_DirectionalLight (V3d_Zneg, Quantity_NOC_WHITE, Standard_True);
464   Handle(V3d_AmbientLight)     anAmbLight = new V3d_AmbientLight (Quantity_NOC_WHITE);
465   AddLight (aDirLight);
466   AddLight (anAmbLight);
467   SetLightOn (aDirLight);
468   SetLightOn (anAmbLight);
469 }
470
471 //=======================================================================
472 //function : SetPrivilegedPlane
473 //purpose  :
474 //=======================================================================
475 void V3d_Viewer::SetPrivilegedPlane (const gp_Ax3& thePlane)
476 {
477   myPrivilegedPlane = thePlane;
478   Grid()->SetDrawMode(Grid()->DrawMode());
479   for (V3d_ListOfView::Iterator anActiveViewIter (myActiveViews); anActiveViewIter.More(); anActiveViewIter.Next())
480   {
481     anActiveViewIter.Value()->SetGrid (myPrivilegedPlane, Grid());
482   }
483
484   if (myDisplayPlane)
485   {
486     DisplayPrivilegedPlane (Standard_True, myDisplayPlaneLength);
487   }
488 }
489
490 //=======================================================================
491 //function : DisplayPrivilegedPlane
492 //purpose  :
493 //=======================================================================
494 void V3d_Viewer::DisplayPrivilegedPlane (const Standard_Boolean theOnOff, const Standard_Real theSize)
495 {
496   myDisplayPlane = theOnOff;
497   myDisplayPlaneLength = theSize;
498
499   if (!myDisplayPlane)
500   {
501     if (!myPlaneStructure.IsNull())
502         {
503       myPlaneStructure->Erase();
504     }
505     return;
506   }
507
508   if (myPlaneStructure.IsNull())
509   {
510     myPlaneStructure = new Graphic3d_Structure (StructureManager());
511     myPlaneStructure->SetInfiniteState (Standard_True);
512     myPlaneStructure->Display();
513   }
514   else
515   {
516     myPlaneStructure->Clear();
517   }
518
519   Handle(Graphic3d_Group) aGroup = myPlaneStructure->NewGroup();
520
521   Handle(Graphic3d_AspectLine3d) aLineAttrib = new Graphic3d_AspectLine3d (Quantity_NOC_GRAY60, Aspect_TOL_SOLID, 1.0);
522   aGroup->SetGroupPrimitivesAspect (aLineAttrib);
523
524   Handle(Graphic3d_AspectText3d) aTextAttrib = new Graphic3d_AspectText3d();
525   aTextAttrib->SetColor (Quantity_Color (Quantity_NOC_ROYALBLUE1));
526   aGroup->SetGroupPrimitivesAspect (aTextAttrib);
527
528   Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments (6);
529
530   const gp_Pnt& p0 = myPrivilegedPlane.Location();
531
532   const gp_Pnt pX (p0.XYZ() + myDisplayPlaneLength * myPrivilegedPlane.XDirection().XYZ());
533   aPrims->AddVertex (p0);
534   aPrims->AddVertex (pX);
535   aGroup->Text ("X", Graphic3d_Vertex (pX.X(), pX.Y(), pX.Z()), 1.0 / 81.0);
536
537   const gp_Pnt pY (p0.XYZ() + myDisplayPlaneLength * myPrivilegedPlane.YDirection().XYZ());
538   aPrims->AddVertex (p0);
539   aPrims->AddVertex (pY);
540   aGroup->Text ("Y", Graphic3d_Vertex (pY.X(), pY.Y(), pY.Z()), 1.0 / 81.0);
541
542   const gp_Pnt pZ (p0.XYZ() + myDisplayPlaneLength * myPrivilegedPlane.Direction().XYZ());
543   aPrims->AddVertex (p0);
544   aPrims->AddVertex (pZ);
545   aGroup->Text ("Z", Graphic3d_Vertex (pZ.X(), pZ.Y(), pZ.Z()), 1.0 / 81.0);
546
547   aGroup->AddPrimitiveArray (aPrims);
548
549   myPlaneStructure->Display();
550 }