acc6cfee52040e25c9b236a58302f32ddec7e2c3
[occt.git] / src / Visual3d / Visual3d_ViewManager.cxx
1 // Copyright (c) 1995-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 /***********************************************************************
16
17      FONCTION :
18      ----------
19         Classe Visual3d_ViewManager.cxx :
20
21         Declaration of variables specific to visualisers
22
23      HISTORIQUE DES MODIFICATIONS   :
24      --------------------------------
25       Mars 1992 : NW,JPB,CAL ; Creation.
26       19-06-96  : FMN ; Suppression variables inutiles
27       04-02-97  : FMN ; Suppression de PSOutput, XWDOutput ...
28       06-05-97  : CAL ; Ajout du Clear sur les TOS_COMPUTED.
29       19-09-97  : CAL ; Remplacement de Window->Position par Window->Size;
30       24-10-97  : CAL ; Retrait de DownCast.
31       20-11-97  : CAL ; Disparition de la dependance avec math
32       01-12-97  : CAL ; Retrait du test IsActive sur l'Update et le Redraw
33       31-12-97  : CAL ; Disparition de MathGra
34       16-01-98  : CAL ; Ajout du SetTransform sur une TOS_COMPUTED
35       11-03-98  : CAL ; Visual3d_ViewManager::Remove ()
36       20-05-98  : CAL ; Perfs. Connection entre structures COMPUTED.
37       10-06-98  : CAL ; Modification des signatures de xxProjectRaster.
38       10-06-98  : CAL ; Modification de la signature de ViewExists.
39       01-12-98  : CAL ; S4062. Ajout des layers.
40       02-12-98  : CAL ; Remove () ne detruit plus les vues.
41
42 ************************************************************************/
43
44 /*----------------------------------------------------------------------*/
45 /*
46  * Constants
47  */
48
49 #define NO_DOWNCAST
50 #define NO_DESTROY
51
52 /*----------------------------------------------------------------------*/
53 /*
54  * Includes
55  */
56
57 // for the class
58 #include <Visual3d_ViewManager.ixx>
59
60 #include <Standard_ErrorHandler.hxx>
61
62 #include <Aspect_IdentDefinitionError.hxx>
63
64 #include <Graphic3d_GraphicDriver.hxx>
65 #include <Graphic3d_MapOfStructure.hxx>
66 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
67
68
69 #if defined (_WIN32) || defined(__WIN32__)
70 # include <WNT_Window.hxx>
71 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
72 # include <Cocoa_Window.hxx>
73 #else
74 # include <Xw_Window.hxx>
75 #endif
76
77 // views identifiers : possible range
78 #define View_IDMIN      1
79 #define View_IDMAX      10000
80
81 Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Graphic3d_GraphicDriver)& theDriver):
82 Graphic3d_StructureManager (theDriver),
83 MyDefinedView (),
84 MyViewGenId (0, 31),
85 MyZBufferAuto (Standard_False),
86 myZLayerGenId (1, IntegerLast())
87 {
88   MyGraphicDriver = theDriver;
89
90   // default layers are always presented in display layer sequence it can not be removed
91   Graphic3d_ZLayerSettings aDefSettings;
92   aDefSettings.Flags = Graphic3d_ZLayerDepthTest
93                      | Graphic3d_ZLayerDepthWrite;
94   aDefSettings.IsImmediate = false;
95   myLayerIds.Add             (Graphic3d_ZLayerId_Default);
96   myLayerSeq.Append          (Graphic3d_ZLayerId_Default);
97   myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Default, aDefSettings);
98
99   Graphic3d_ZLayerSettings aTopSettings;
100   aTopSettings.Flags = Graphic3d_ZLayerDepthTest
101                      | Graphic3d_ZLayerDepthWrite;
102   aTopSettings.IsImmediate = true;
103   myLayerIds.Add             (Graphic3d_ZLayerId_Top);
104   myLayerSeq.Append          (Graphic3d_ZLayerId_Top);
105   myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Top, aTopSettings);
106
107   Graphic3d_ZLayerSettings aTopmostSettings;
108   aTopmostSettings.Flags = Graphic3d_ZLayerDepthTest
109                          | Graphic3d_ZLayerDepthWrite
110                          | Graphic3d_ZLayerDepthClear;
111   aTopmostSettings.IsImmediate = true;
112   myLayerIds.Add             (Graphic3d_ZLayerId_Topmost);
113   myLayerSeq.Append          (Graphic3d_ZLayerId_Topmost);
114   myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_Topmost, aTopmostSettings);
115
116   Graphic3d_ZLayerSettings anOsdSettings;
117   anOsdSettings.Flags = 0;
118   anOsdSettings.IsImmediate = true;
119   myLayerIds.Add             (Graphic3d_ZLayerId_TopOSD);
120   myLayerSeq.Append          (Graphic3d_ZLayerId_TopOSD);
121   myMapOfZLayerSettings.Bind (Graphic3d_ZLayerId_TopOSD, anOsdSettings);
122 }
123
124 //-Destructors
125
126 void Visual3d_ViewManager::Destroy () {
127
128         Remove ();
129 }
130
131 //-Methods, in order
132
133 void Visual3d_ViewManager::Remove () {
134
135         //
136         // Destroy all defined views
137         //
138
139   // clear all structures whilst views are alive for correct GPU memory management
140   MyDisplayedStructure.Clear();
141   MyHighlightedStructure.Clear();
142
143   // clear list of managed views
144   MyDefinedView.Clear();
145 }
146
147 void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority)
148 {
149   //
150   // Change structure priority in all defined views
151   //
152   for(int i=1; i<=MyDefinedView.Length(); i++)
153   {
154     (MyDefinedView.Value(i))->ChangeDisplayPriority(AStructure, OldPriority, NewPriority);
155   }
156 }
157
158 void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure) {
159
160   //Standard_Integer LengthD    = MyDisplayedStructure.Extent() ();
161
162   // Even if physically the structure cannot
163   // be displayed (pb of visualisation type)
164   // it has status Displayed.
165
166   if (!MyDisplayedStructure.Contains(AStructure))
167     return;
168
169   //
170   // Recompute structure in all activated views
171   //
172   for(int i=1; i<=MyDefinedView.Length(); i++)
173   {
174     (MyDefinedView.Value(i))->ReCompute(AStructure);
175   }
176 }
177
178 void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure,
179                                       const Handle(Graphic3d_DataStructureManager)& AProjector)
180 {
181
182   if (! AProjector->IsKind (STANDARD_TYPE (Visual3d_View))) return;
183
184 #ifdef DOWNCAST
185   Handle(Visual3d_View) theView = Handle(Visual3d_View)::DownCast (AProjector);
186 #else
187   Handle(Visual3d_View) theView = *(Handle(Visual3d_View) *) &AProjector;
188 #endif
189   Standard_Integer ViewId = theView->Identification ();
190
191   // Even if physically the structure cannot
192   // be displayed (pb of visualisation type)
193   // it has status Displayed.
194   if (!MyDisplayedStructure.Contains(AStructure))
195     return;
196
197   //
198   // Recompute structure in all activated views
199   //
200   for(int i=1; i<=MyDefinedView.Length(); i++)
201   {
202     if ((MyDefinedView.Value(i))->Identification () == ViewId)
203     {
204       theView->ReCompute (AStructure);
205     }
206   }
207 }
208
209 void Visual3d_ViewManager::Clear (const Handle(Graphic3d_Structure)& AStructure, const Standard_Boolean WithDestruction)
210 {
211   for(int i=1; i<=MyDefinedView.Length(); i++)
212   {
213     (MyDefinedView.Value(i))->Clear(AStructure, WithDestruction);
214   }
215 }
216
217 void Visual3d_ViewManager::Connect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter)
218 {
219   for(int i=1; i<=MyDefinedView.Length(); i++)
220   {
221     (MyDefinedView.Value(i))->Connect (AMother, ADaughter);
222   }
223 }
224
225 void Visual3d_ViewManager::Disconnect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter)
226 {
227   for(int i=1; i<=MyDefinedView.Length(); i++)
228   {
229     (MyDefinedView.Value(i))->Disconnect (AMother, ADaughter);
230   }
231 }
232
233 void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure)
234 {
235   // Even if physically the structure cannot
236   // be displayed (pb of visualisation type)
237   // it has status Displayed.
238
239   MyDisplayedStructure.Add(AStructure);
240   
241   for(int i=1; i<=MyDefinedView.Length(); i++)
242   {
243     (MyDefinedView.Value(i))->Display(AStructure);
244   }
245 }
246
247 void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure)
248 {
249   // Even if physically the structure cannot
250   // be displayed (pb of visualisation type)
251   // it has status Displayed.
252
253   MyDisplayedStructure.Remove(AStructure);
254
255   //
256   // Erase structure in all defined views
257   //
258   for(int i=1; i<=MyDefinedView.Length(); i++)
259   {
260     (MyDefinedView.Value(i))->Erase (AStructure);
261   }
262
263   MyHighlightedStructure.Remove (AStructure);
264 }
265
266 void Visual3d_ViewManager::Erase () {
267
268  Graphic3d_MapIteratorOfMapOfStructure it( MyDisplayedStructure);
269
270  for (; it.More(); it.Next()) {
271    Handle(Graphic3d_Structure) SG = it.Key();
272    SG->Erase();
273  }
274
275 }
276
277 void Visual3d_ViewManager::Highlight (const Handle(Graphic3d_Structure)& AStructure, const Aspect_TypeOfHighlightMethod AMethod)
278 {
279   MyHighlightedStructure.Add(AStructure);
280   
281   //
282   // Highlight in all activated views
283   //
284   
285   for(int i=1; i<=MyDefinedView.Length(); i++)
286   {
287     (MyDefinedView.Value(i))->Highlight (AStructure, AMethod);
288   }
289 }
290
291 void Visual3d_ViewManager::SetTransform (const Handle(Graphic3d_Structure)& AStructure, const TColStd_Array2OfReal& ATrsf)
292 {
293   for(int i=1; i<=MyDefinedView.Length(); i++)
294   {
295     (MyDefinedView.Value(i))->SetTransform (AStructure, ATrsf);
296   }
297 }
298
299 void Visual3d_ViewManager::UnHighlight () {
300
301   Graphic3d_MapIteratorOfMapOfStructure it(MyHighlightedStructure);
302
303   for (; it.More(); it.Next()) {
304     Handle(Graphic3d_Structure) SG = it.Key();
305     SG->UnHighlight ();
306   }
307
308
309 }
310
311 void Visual3d_ViewManager::UnHighlight (const Handle(Graphic3d_Structure)& AStructure)
312 {
313   MyHighlightedStructure.Remove(AStructure);
314
315   //
316   // UnHighlight in all activated views
317   //
318
319   for(int i=1; i<=MyDefinedView.Length(); i++)
320   {
321     (MyDefinedView.Value(i))->UnHighlight (AStructure);
322   }
323 }
324
325 void Visual3d_ViewManager::Redraw() const
326 {
327   // redraw all activated views
328   if (MyDefinedView.Length() == 0)
329   {
330     return;
331   }
332
333   if (!MyUnderLayer.IsNull() || !MyOverLayer.IsNull())
334   {
335     Standard_Integer aWidth = 0, aHeight = 0;
336     Standard_Integer aWidthMax  = 0;
337     Standard_Integer aHeightMax = 0;
338
339     for(int i=1; i<=MyDefinedView.Length(); i++)
340     {
341       MyDefinedView.Value(i)->Window()->Size (aWidth, aHeight);
342       aWidthMax  = Max (aWidthMax,  aWidth);
343       aHeightMax = Max (aHeightMax, aHeight);
344     }
345
346     if (!MyUnderLayer.IsNull())
347     {
348       MyUnderLayer->SetViewport (aWidthMax, aHeightMax);
349     }
350     if (!MyOverLayer.IsNull())
351     {
352       MyOverLayer->SetViewport (aWidthMax, aHeightMax);
353     }
354   }
355
356   for(int i=1; i<=MyDefinedView.Length(); i++)
357   {
358     MyDefinedView.Value(i)->Redraw (MyUnderLayer, MyOverLayer);
359   }
360 }
361
362 void Visual3d_ViewManager::Update() const
363 {
364   Redraw();
365 }
366
367 void Visual3d_ViewManager::RedrawImmediate() const
368 {
369   if (MyDefinedView.Length() == 0)
370   {
371     return;
372   }
373
374   // update all activated views
375   for(int i=1; i<=MyDefinedView.Length(); i++)
376   {
377     MyDefinedView.Value(i)->RedrawImmediate (MyUnderLayer, MyOverLayer);
378   }
379 }
380
381 void Visual3d_ViewManager::Invalidate() const
382 {
383   if (MyDefinedView.Length() == 0)
384   {
385     return;
386   }
387
388   // update all activated views
389   for(int i=1; i<=MyDefinedView.Length(); i++)
390   {
391     MyDefinedView.Value(i)->Invalidate();
392   }
393 }
394
395 Handle(Visual3d_HSequenceOfView) Visual3d_ViewManager::ActivatedView () const
396 {
397
398   Handle(Visual3d_HSequenceOfView) SG = new Visual3d_HSequenceOfView();
399
400   for(int i=1; i<=MyDefinedView.Length(); i++)
401   {
402     if ((MyDefinedView.Value(i))->IsActive ())
403     {
404       SG->Append(MyDefinedView.Value(i));
405     }
406   }
407
408   return (SG);
409 }
410
411 #ifdef IMPLEMENTED
412 Standard_Boolean Visual3d_ViewManager::ContainsComputedStructure () const
413 {
414   Standard_Boolean Result = Standard_False;
415
416   //
417   // Check all activated views
418   //
419   for(int i=1; (!Result) && i<=MyDefinedView.Length(); i++)
420   {
421     if ((MyDefinedView.Value(i))->IsActive())
422     {
423       Result = (MyDefinedView.Value(i))->ContainsComputedStructure();
424     }
425   }
426
427   return Result;
428 }
429 #endif
430
431 const Visual3d_SequenceOfView& Visual3d_ViewManager::DefinedViews() const
432 {
433   return MyDefinedView;
434 }
435
436 Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const
437 {
438   Standard_Boolean Exist = Standard_False;
439
440   // Parse the list of views to find
441   // a view with the specified window
442
443 #if defined(_WIN32)
444   const Handle(WNT_Window) THEWindow = Handle(WNT_Window)::DownCast (AWindow);
445   Aspect_Handle TheSpecifiedWindowId = THEWindow->HWindow ();
446 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
447   const Handle(Cocoa_Window) THEWindow = Handle(Cocoa_Window)::DownCast (AWindow);
448   NSView* TheSpecifiedWindowId = THEWindow->HView();
449 #elif defined(__ANDROID__)
450   int TheSpecifiedWindowId = -1;
451 #else
452   const Handle(Xw_Window) THEWindow = Handle(Xw_Window)::DownCast (AWindow);
453   int TheSpecifiedWindowId = int (THEWindow->XWindow ());
454 #endif
455
456   for(int i=1; (!Exist) && i<=MyDefinedView.Length(); i++)
457   {
458     if ( ((MyDefinedView.Value(i))->IsDefined ()) && ((MyDefinedView.Value(i))->IsActive ()) )
459     {
460       const Handle(Aspect_Window) AspectWindow = (MyDefinedView.Value(i))->Window();
461
462 #if defined(_WIN32)
463       const Handle(WNT_Window) theWindow = Handle(WNT_Window)::DownCast (AspectWindow);
464       Aspect_Handle TheWindowIdOfView = theWindow->HWindow ();
465 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
466       const Handle(Cocoa_Window) theWindow = Handle(Cocoa_Window)::DownCast (AspectWindow);
467       NSView* TheWindowIdOfView = theWindow->HView();
468 #elif defined(__ANDROID__)
469       int TheWindowIdOfView = 0;
470 #else
471       const Handle(Xw_Window) theWindow = Handle(Xw_Window)::DownCast (AspectWindow);
472       int TheWindowIdOfView = int (theWindow->XWindow ());
473 #endif  // WNT
474       // Comparaison on window IDs
475       if (TheWindowIdOfView == TheSpecifiedWindowId)
476       {
477         Exist = Standard_True;
478         TheCView = *(Graphic3d_CView* )(MyDefinedView.Value(i))->CView();
479       }
480     }
481   }
482
483   return (Exist);
484 }
485
486 void Visual3d_ViewManager::Activate ()
487 {
488   //
489   // Activates all deactivated views
490   //
491   for(int i=1; i<=MyDefinedView.Length(); i++)
492   {
493     if (! (MyDefinedView.Value(i))->IsActive())
494     {
495       (MyDefinedView.Value(i))->Activate();
496     }
497   }
498 }
499
500 void Visual3d_ViewManager::Deactivate ()
501 {
502   //
503   // Deactivates all activated views
504   //
505   for(int i=1; i<=MyDefinedView.Length(); i++)
506   {
507     if ((MyDefinedView.Value(i))->IsActive())
508     {
509       (MyDefinedView.Value(i))->Deactivate();
510     }
511   }
512
513 }
514
515 Standard_Integer Visual3d_ViewManager::MaxNumOfViews () const {
516
517         // Retourne the planned of definable views for the current
518         // Visual3d_ViewManager.
519         return
520 (Standard_Integer ((View_IDMAX-View_IDMIN+1)/Visual3d_ViewManager::Limit ()));
521
522 }
523
524 Handle(Graphic3d_Structure) Visual3d_ViewManager::Identification (const Standard_Integer AId) const {
525
526         return (Graphic3d_StructureManager::Identification (AId));
527
528 }
529
530 Standard_Integer Visual3d_ViewManager::Identification () const {
531
532         return (Graphic3d_StructureManager::Identification ());
533
534 }
535
536 Standard_Integer Visual3d_ViewManager::Identification (const Handle(Visual3d_View)& AView)
537 {
538   MyDefinedView.Append(AView);
539   return (MyViewGenId.Next ());
540 }
541
542 void Visual3d_ViewManager::UnIdentification (const Standard_Integer aViewId)
543 {
544   for(int i=1; i<=MyDefinedView.Length(); i++)
545   {
546     if ((MyDefinedView.Value(i))->Identification() == aViewId)
547     {
548       //remove the view from the list
549       MyDefinedView.Remove(i);
550       break;
551     }
552   }
553
554   MyViewGenId.Free(aViewId);
555 }
556
557 void Visual3d_ViewManager::SetZBufferAuto (const Standard_Boolean AFlag)
558 {
559   if (MyZBufferAuto && AFlag) return;
560   if (! MyZBufferAuto && ! AFlag) return;
561
562   // if pass from False to True :
563   // no problem, at the next view update, it
564   // will properly ask questions to answer (SetVisualisation)
565   // if pass from True to False :
566   // it is necessary to modify ZBufferActivity at each view so that
567   // zbuffer could be active only if required by context.
568   // In this case -1 is passed so that the view ask itself the question
569   // Note : 0 forces the desactivation, 1 forces the activation
570   if (! AFlag)
571   {
572     for(int i=1; i<=MyDefinedView.Length(); i++)
573     {
574       (MyDefinedView.Value(i))->SetZBufferActivity(-1);
575     }
576   }
577   MyZBufferAuto = AFlag;
578 }
579
580 Standard_Boolean Visual3d_ViewManager::ZBufferAuto () const
581 {
582   return (MyZBufferAuto);
583 }
584
585 void Visual3d_ViewManager::SetLayer (const Handle(Visual3d_Layer)& ALayer) {
586         if (ALayer->Type () == Aspect_TOL_OVERLAY) {
587                 MyOverLayer = ALayer;
588         }
589         else {
590                 MyUnderLayer = ALayer;
591         }
592
593 }
594
595 const Handle(Visual3d_Layer)& Visual3d_ViewManager::UnderLayer () const {
596
597         return (MyUnderLayer);
598
599 }
600
601 const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const {
602
603         return (MyOverLayer);
604
605 }
606
607 //=======================================================================
608 //function : ChangeZLayer
609 //purpose  :
610 //=======================================================================
611
612 void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
613                                          const Graphic3d_ZLayerId           theLayerId)
614 {
615   if (!myLayerIds.Contains (theLayerId)
616    || !MyDisplayedStructure.Contains (theStructure))
617   {
618     return;
619   }
620
621   // change display layer for structure in all views
622   for (int aViewIter = 1; aViewIter <= MyDefinedView.Length(); ++aViewIter)
623   {
624     MyDefinedView.Value (aViewIter)->ChangeZLayer (theStructure, theLayerId);
625   }
626 }
627
628 //=======================================================================
629 //function : SetZLayerSettings
630 //purpose  :
631 //=======================================================================
632 void Visual3d_ViewManager::SetZLayerSettings (const Graphic3d_ZLayerId        theLayerId,
633                                               const Graphic3d_ZLayerSettings& theSettings)
634 {
635   // tell all managed views to set zlayer settings
636   for(int i=1; i<=MyDefinedView.Length(); i++)
637   {
638     (MyDefinedView.Value(i))->SetZLayerSettings (theLayerId, theSettings);
639   }
640
641   if (myMapOfZLayerSettings.IsBound (theLayerId))
642   {
643     myMapOfZLayerSettings.ChangeFind (theLayerId) = theSettings;
644   }
645   else
646   {
647     myMapOfZLayerSettings.Bind (theLayerId, theSettings);
648   }
649   
650 }
651
652 //=======================================================================
653 //function : ZLayerSettings
654 //purpose  :
655 //=======================================================================
656 Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Graphic3d_ZLayerId theLayerId)
657 {
658   if (!myLayerIds.Contains (theLayerId))
659   {
660     return Graphic3d_ZLayerSettings();
661   }
662
663   return myMapOfZLayerSettings.Find (theLayerId);
664 }
665
666 //=======================================================================
667 //function : AddZLayer
668 //purpose  :
669 //=======================================================================
670
671 Standard_Boolean Visual3d_ViewManager::AddZLayer (Graphic3d_ZLayerId& theLayerId)
672 {
673   try
674   {
675     OCC_CATCH_SIGNALS
676     theLayerId = myZLayerGenId.Next();
677     myLayerIds.Add    (theLayerId);
678     myLayerSeq.Append (theLayerId);
679   }
680   catch (Aspect_IdentDefinitionError)
681   {
682     // new index can't be generated
683     return Standard_False;
684   }
685
686   // default z-layer settings
687   myMapOfZLayerSettings.Bind (theLayerId, Graphic3d_ZLayerSettings());
688
689   // tell all managed views to remove display layers
690   for(int i=1; i<=MyDefinedView.Length(); i++)
691   {
692     (MyDefinedView.Value(i))->AddZLayer(theLayerId);
693   }
694
695   return Standard_True;
696 }
697
698 //=======================================================================
699 //function : RemoveZLayer
700 //purpose  :
701 //=======================================================================
702
703 Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Graphic3d_ZLayerId theLayerId)
704 {
705   if (!myLayerIds.Contains (theLayerId)
706     || theLayerId < myZLayerGenId.Lower()
707     || theLayerId > myZLayerGenId.Upper())
708   {
709     return Standard_False;
710   }
711
712   // tell all managed views to remove display layers
713   for(int i=1; i<=MyDefinedView.Length(); i++)
714   {
715     (MyDefinedView.Value(i))->RemoveZLayer (theLayerId);
716   }
717
718   MyGraphicDriver->UnsetZLayer (theLayerId);
719
720   // remove index
721   for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
722   {
723     if (myLayerSeq (aIdx) == theLayerId)
724     {
725       myLayerSeq.Remove (aIdx);
726       break;
727     }
728   }
729
730   myMapOfZLayerSettings.UnBind (theLayerId);
731
732   myLayerIds.Remove  (theLayerId);
733   myZLayerGenId.Free (theLayerId);
734
735   return Standard_True;
736 }
737
738 //=======================================================================
739 //function : GetAllZLayers
740 //purpose  :
741 //=======================================================================
742
743 void Visual3d_ViewManager::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq) const
744 {
745   theLayerSeq.Assign (myLayerSeq);
746 }
747
748 //=======================================================================
749 //function : InstallZLayers
750 //purpose  :
751 //=======================================================================
752
753 void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView) const
754 {
755   Standard_Boolean isContainsView = Standard_False;
756   for(int i=1; i<=MyDefinedView.Length(); i++)
757   {
758     if(MyDefinedView.Value(i) == theView)
759     {
760       isContainsView = Standard_True;
761       break;
762     }
763   }
764   if (!isContainsView)
765     return;
766
767   // erase and insert layers iteratively to provide the same layer order as
768   // in the view manager's sequence. This approach bases on the layer insertion
769   // order: the new layers are always appended to the end of the list
770   // inside of view, while layer remove operation doesn't affect the order.
771   // Starting from second layer : no need to change the default z layer.
772   for (Standard_Integer aSeqIdx = 1; aSeqIdx <= myLayerSeq.Length(); ++aSeqIdx)
773   {
774     const Graphic3d_ZLayerId        aLayerID  = myLayerSeq.Value (aSeqIdx);
775     const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID);
776     if (aLayerID < myZLayerGenId.Lower()
777      || aLayerID > myZLayerGenId.Upper())
778     {
779       theView->SetZLayerSettings (aLayerID, aSettings);
780       continue;
781     }
782
783     theView->RemoveZLayer      (aLayerID);
784     theView->AddZLayer         (aLayerID);
785     theView->SetZLayerSettings (aLayerID, aSettings);
786   }
787 }