0025973: Visualization, TKOpenGl - support EAGLContext as alternative to NSOpenGLContext
[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   #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
449     UIView* TheSpecifiedWindowId = THEWindow->HView();
450   #else
451     NSView* TheSpecifiedWindowId = THEWindow->HView();
452   #endif
453 #elif defined(__ANDROID__)
454   int TheSpecifiedWindowId = -1;
455 #else
456   const Handle(Xw_Window) THEWindow = Handle(Xw_Window)::DownCast (AWindow);
457   int TheSpecifiedWindowId = int (THEWindow->XWindow ());
458 #endif
459
460   for(int i=1; (!Exist) && i<=MyDefinedView.Length(); i++)
461   {
462     if ( ((MyDefinedView.Value(i))->IsDefined ()) && ((MyDefinedView.Value(i))->IsActive ()) )
463     {
464       const Handle(Aspect_Window) AspectWindow = (MyDefinedView.Value(i))->Window();
465
466 #if defined(_WIN32)
467       const Handle(WNT_Window) theWindow = Handle(WNT_Window)::DownCast (AspectWindow);
468       Aspect_Handle TheWindowIdOfView = theWindow->HWindow ();
469 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
470       const Handle(Cocoa_Window) theWindow = Handle(Cocoa_Window)::DownCast (AspectWindow);
471       #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
472         UIView* TheWindowIdOfView = theWindow->HView();
473       #else
474         NSView* TheWindowIdOfView = theWindow->HView();
475       #endif
476 #elif defined(__ANDROID__)
477       int TheWindowIdOfView = 0;
478 #else
479       const Handle(Xw_Window) theWindow = Handle(Xw_Window)::DownCast (AspectWindow);
480       int TheWindowIdOfView = int (theWindow->XWindow ());
481 #endif  // WNT
482       // Comparaison on window IDs
483       if (TheWindowIdOfView == TheSpecifiedWindowId)
484       {
485         Exist = Standard_True;
486         TheCView = *(Graphic3d_CView* )(MyDefinedView.Value(i))->CView();
487       }
488     }
489   }
490
491   return (Exist);
492 }
493
494 void Visual3d_ViewManager::Activate ()
495 {
496   //
497   // Activates all deactivated views
498   //
499   for(int i=1; i<=MyDefinedView.Length(); i++)
500   {
501     if (! (MyDefinedView.Value(i))->IsActive())
502     {
503       (MyDefinedView.Value(i))->Activate();
504     }
505   }
506 }
507
508 void Visual3d_ViewManager::Deactivate ()
509 {
510   //
511   // Deactivates all activated views
512   //
513   for(int i=1; i<=MyDefinedView.Length(); i++)
514   {
515     if ((MyDefinedView.Value(i))->IsActive())
516     {
517       (MyDefinedView.Value(i))->Deactivate();
518     }
519   }
520
521 }
522
523 Standard_Integer Visual3d_ViewManager::MaxNumOfViews () const {
524
525         // Retourne the planned of definable views for the current
526         // Visual3d_ViewManager.
527         return
528 (Standard_Integer ((View_IDMAX-View_IDMIN+1)/Visual3d_ViewManager::Limit ()));
529
530 }
531
532 Handle(Graphic3d_Structure) Visual3d_ViewManager::Identification (const Standard_Integer AId) const {
533
534         return (Graphic3d_StructureManager::Identification (AId));
535
536 }
537
538 Standard_Integer Visual3d_ViewManager::Identification () const {
539
540         return (Graphic3d_StructureManager::Identification ());
541
542 }
543
544 Standard_Integer Visual3d_ViewManager::Identification (const Handle(Visual3d_View)& AView)
545 {
546   MyDefinedView.Append(AView);
547   return (MyViewGenId.Next ());
548 }
549
550 void Visual3d_ViewManager::UnIdentification (const Standard_Integer aViewId)
551 {
552   for(int i=1; i<=MyDefinedView.Length(); i++)
553   {
554     if ((MyDefinedView.Value(i))->Identification() == aViewId)
555     {
556       //remove the view from the list
557       MyDefinedView.Remove(i);
558       break;
559     }
560   }
561
562   MyViewGenId.Free(aViewId);
563 }
564
565 void Visual3d_ViewManager::SetZBufferAuto (const Standard_Boolean AFlag)
566 {
567   if (MyZBufferAuto && AFlag) return;
568   if (! MyZBufferAuto && ! AFlag) return;
569
570   // if pass from False to True :
571   // no problem, at the next view update, it
572   // will properly ask questions to answer (SetVisualisation)
573   // if pass from True to False :
574   // it is necessary to modify ZBufferActivity at each view so that
575   // zbuffer could be active only if required by context.
576   // In this case -1 is passed so that the view ask itself the question
577   // Note : 0 forces the desactivation, 1 forces the activation
578   if (! AFlag)
579   {
580     for(int i=1; i<=MyDefinedView.Length(); i++)
581     {
582       (MyDefinedView.Value(i))->SetZBufferActivity(-1);
583     }
584   }
585   MyZBufferAuto = AFlag;
586 }
587
588 Standard_Boolean Visual3d_ViewManager::ZBufferAuto () const
589 {
590   return (MyZBufferAuto);
591 }
592
593 void Visual3d_ViewManager::SetLayer (const Handle(Visual3d_Layer)& ALayer) {
594         if (ALayer->Type () == Aspect_TOL_OVERLAY) {
595                 MyOverLayer = ALayer;
596         }
597         else {
598                 MyUnderLayer = ALayer;
599         }
600
601 }
602
603 const Handle(Visual3d_Layer)& Visual3d_ViewManager::UnderLayer () const {
604
605         return (MyUnderLayer);
606
607 }
608
609 const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const {
610
611         return (MyOverLayer);
612
613 }
614
615 //=======================================================================
616 //function : ChangeZLayer
617 //purpose  :
618 //=======================================================================
619
620 void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
621                                          const Graphic3d_ZLayerId           theLayerId)
622 {
623   if (!myLayerIds.Contains (theLayerId)
624    || !MyDisplayedStructure.Contains (theStructure))
625   {
626     return;
627   }
628
629   // change display layer for structure in all views
630   for (int aViewIter = 1; aViewIter <= MyDefinedView.Length(); ++aViewIter)
631   {
632     MyDefinedView.Value (aViewIter)->ChangeZLayer (theStructure, theLayerId);
633   }
634 }
635
636 //=======================================================================
637 //function : SetZLayerSettings
638 //purpose  :
639 //=======================================================================
640 void Visual3d_ViewManager::SetZLayerSettings (const Graphic3d_ZLayerId        theLayerId,
641                                               const Graphic3d_ZLayerSettings& theSettings)
642 {
643   // tell all managed views to set zlayer settings
644   for(int i=1; i<=MyDefinedView.Length(); i++)
645   {
646     (MyDefinedView.Value(i))->SetZLayerSettings (theLayerId, theSettings);
647   }
648
649   if (myMapOfZLayerSettings.IsBound (theLayerId))
650   {
651     myMapOfZLayerSettings.ChangeFind (theLayerId) = theSettings;
652   }
653   else
654   {
655     myMapOfZLayerSettings.Bind (theLayerId, theSettings);
656   }
657   
658 }
659
660 //=======================================================================
661 //function : ZLayerSettings
662 //purpose  :
663 //=======================================================================
664 Graphic3d_ZLayerSettings Visual3d_ViewManager::ZLayerSettings (const Graphic3d_ZLayerId theLayerId)
665 {
666   if (!myLayerIds.Contains (theLayerId))
667   {
668     return Graphic3d_ZLayerSettings();
669   }
670
671   return myMapOfZLayerSettings.Find (theLayerId);
672 }
673
674 //=======================================================================
675 //function : AddZLayer
676 //purpose  :
677 //=======================================================================
678
679 Standard_Boolean Visual3d_ViewManager::AddZLayer (Graphic3d_ZLayerId& theLayerId)
680 {
681   try
682   {
683     OCC_CATCH_SIGNALS
684     theLayerId = myZLayerGenId.Next();
685     myLayerIds.Add    (theLayerId);
686     myLayerSeq.Append (theLayerId);
687   }
688   catch (Aspect_IdentDefinitionError)
689   {
690     // new index can't be generated
691     return Standard_False;
692   }
693
694   // default z-layer settings
695   myMapOfZLayerSettings.Bind (theLayerId, Graphic3d_ZLayerSettings());
696
697   // tell all managed views to remove display layers
698   for(int i=1; i<=MyDefinedView.Length(); i++)
699   {
700     (MyDefinedView.Value(i))->AddZLayer(theLayerId);
701   }
702
703   return Standard_True;
704 }
705
706 //=======================================================================
707 //function : RemoveZLayer
708 //purpose  :
709 //=======================================================================
710
711 Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Graphic3d_ZLayerId theLayerId)
712 {
713   if (!myLayerIds.Contains (theLayerId)
714     || theLayerId < myZLayerGenId.Lower()
715     || theLayerId > myZLayerGenId.Upper())
716   {
717     return Standard_False;
718   }
719
720   // tell all managed views to remove display layers
721   for(int i=1; i<=MyDefinedView.Length(); i++)
722   {
723     (MyDefinedView.Value(i))->RemoveZLayer (theLayerId);
724   }
725
726   MyGraphicDriver->UnsetZLayer (theLayerId);
727
728   // remove index
729   for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
730   {
731     if (myLayerSeq (aIdx) == theLayerId)
732     {
733       myLayerSeq.Remove (aIdx);
734       break;
735     }
736   }
737
738   myMapOfZLayerSettings.UnBind (theLayerId);
739
740   myLayerIds.Remove  (theLayerId);
741   myZLayerGenId.Free (theLayerId);
742
743   return Standard_True;
744 }
745
746 //=======================================================================
747 //function : GetAllZLayers
748 //purpose  :
749 //=======================================================================
750
751 void Visual3d_ViewManager::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq) const
752 {
753   theLayerSeq.Assign (myLayerSeq);
754 }
755
756 //=======================================================================
757 //function : InstallZLayers
758 //purpose  :
759 //=======================================================================
760
761 void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView) const
762 {
763   Standard_Boolean isContainsView = Standard_False;
764   for(int i=1; i<=MyDefinedView.Length(); i++)
765   {
766     if(MyDefinedView.Value(i) == theView)
767     {
768       isContainsView = Standard_True;
769       break;
770     }
771   }
772   if (!isContainsView)
773     return;
774
775   // erase and insert layers iteratively to provide the same layer order as
776   // in the view manager's sequence. This approach bases on the layer insertion
777   // order: the new layers are always appended to the end of the list
778   // inside of view, while layer remove operation doesn't affect the order.
779   // Starting from second layer : no need to change the default z layer.
780   for (Standard_Integer aSeqIdx = 1; aSeqIdx <= myLayerSeq.Length(); ++aSeqIdx)
781   {
782     const Graphic3d_ZLayerId        aLayerID  = myLayerSeq.Value (aSeqIdx);
783     const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID);
784     if (aLayerID < myZLayerGenId.Lower()
785      || aLayerID > myZLayerGenId.Upper())
786     {
787       theView->SetZLayerSettings (aLayerID, aSettings);
788       continue;
789     }
790
791     theView->RemoveZLayer      (aLayerID);
792     theView->AddZLayer         (aLayerID);
793     theView->SetZLayerSettings (aLayerID, aSettings);
794   }
795 }