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