0023525: Disappearing of highlight in screenshot
[occt.git] / src / Visual3d / Visual3d_TransientManager.cxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 //
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
8 //
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 //
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
18
19 /***********************************************************************
20
21      FONCTION :
22      ----------
23         Classe Visual3d_TransientManager :
24
25
26         Declaration des variables specifiques au mode transient.
27
28         Une vue est definie par :
29                 - un ViewManager
30                 - un ContextView
31                 - un ViewMapping
32                 - une ViewOrientation
33
34      HISTORIQUE DES MODIFICATIONS   :
35      --------------------------------
36       October 1995 : GG : Creation.
37       20-11-97  : CAL ; Disparition de la dependance avec math
38       01-05-97 : CAL ; Ajout du Clear sur les TOS_COMPUTED.
39       18-12-97 : FMN ; Ajout mode AJOUT.
40       27-12-98 : FMN ; PERF: OPTIMISATION LOADER (LOPTIM)
41       10-06-98 : CAL ; Modification de la signature de DrawStructure.
42       25-09-98 : CAL ; Mise a jour de theCView = *(CALL_DEF_VIEW *)AView->CView ();
43       10-11-98 : CAL ; PRO16361. theCView dans ClearImmediatMode.
44       30-11-98 : FMN ; S4069 : Textes toujours visibles.
45       01-12-98 : CAL ; S4062. Ajout des layers.
46
47 ************************************************************************/
48
49 // for the class
50 #include <Visual3d_TransientManager.ixx>
51 #include <Visual3d_ViewPtr.hxx>
52 #include <Visual3d_View.pxx>
53
54 #include <Aspect_CLayer2d.hxx>
55 #include <Graphic3d_CView.hxx>
56 #include <Graphic3d_GraphicDriver.hxx>
57 #include <Graphic3d_TypeOfPrimitive.hxx>
58 #include <Visual3d_Layer.hxx>
59
60 enum TypeOfImmediat {
61  Immediat_None,
62  Immediat_Transient,
63  Immediat_Ajout
64 };
65
66 //-Global data definitions
67 static Standard_Integer theDrawingState = 0;
68 static TypeOfImmediat theImmediatState = Immediat_None;
69
70 static Handle(Graphic3d_GraphicDriver)& _theGraphicDriver() {
71     static Handle(Graphic3d_GraphicDriver) theGraphicDriver;
72 return theGraphicDriver;
73 }
74 #define theGraphicDriver _theGraphicDriver()
75
76 static Graphic3d_CView& _theCView() {
77     static Graphic3d_CView theCView;
78 return theCView;
79 }
80 #define theCView _theCView()
81
82 static Aspect_CLayer2d UnderCLayer;
83 static Aspect_CLayer2d OverCLayer;
84
85 //
86 //-Constructors
87 //
88
89 Visual3d_TransientManager::Visual3d_TransientManager () {
90 }
91
92 //
93 //-Destructors
94 //
95
96 void Visual3d_TransientManager::Destroy () {
97 }
98
99 //-Methods, in order
100
101 Standard_Boolean Visual3d_TransientManager::BeginDraw (const Handle(Visual3d_View)& AView, const Standard_Boolean DoubleBuffer, const Standard_Boolean RetainMode) {
102
103         if (theDrawingState > 0) {
104           Graphic3d_CView* pview = (Graphic3d_CView*) AView->CView();
105           if( theImmediatState == Immediat_Transient &&
106               pview->ViewId == theCView.ViewId ) {
107             theDrawingState++;
108             return theDrawingState;
109           } else
110                 Visual3d_TransientDefinitionError::Raise
111                         ("Drawing in progress !");
112         }
113
114 Handle(Visual3d_Layer) OverLayer = AView->OverLayer ();
115 Handle(Visual3d_Layer) UnderLayer = AView->UnderLayer ();
116   OverCLayer.ptrLayer = UnderCLayer.ptrLayer = NULL;
117   theCView = *(Graphic3d_CView* )AView->CView ();
118
119         if (! UnderLayer.IsNull ()){
120                 UnderCLayer = UnderLayer->CLayer();
121                 theCView.ptrUnderLayer = (CALL_DEF_LAYER *) &UnderCLayer;
122         }
123         if (! OverLayer.IsNull ()){
124                 OverCLayer = OverLayer->CLayer();
125                 theCView.ptrOverLayer = (CALL_DEF_LAYER *) &OverCLayer;
126         }
127
128         // Begin rendering
129         Handle(Aspect_GraphicDriver) agd = AView->GraphicDriver ();
130
131         theGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
132
133         if (theGraphicDriver->BeginImmediatMode
134                 (theCView, UnderCLayer, OverCLayer, DoubleBuffer, RetainMode))
135   {
136                 theDrawingState++;
137                 theImmediatState = Immediat_Transient;
138         }
139
140         return theDrawingState;
141 }
142
143 void Visual3d_TransientManager::EndDraw (const Standard_Boolean Synchronize) {
144
145         if( theDrawingState <= 0 )
146           Visual3d_TransientDefinitionError::Raise ("Drawing not started !");
147
148         theDrawingState--;
149         if( theDrawingState > 0 ) return;
150         theImmediatState = Immediat_None;
151
152                         // Flush all graphics
153         theGraphicDriver->EndImmediatMode(Synchronize);
154 }
155
156 void Visual3d_TransientManager::ClearDraw (const Handle(Visual3d_View)& AView,
157                                            const Standard_Boolean aFlush)
158 {
159         if (theDrawingState > 0)
160                 Visual3d_TransientDefinitionError::Raise
161                         ("Drawing in progress !");
162
163         // Begin rendering
164         theCView        = *(Graphic3d_CView* )AView->CView ();
165   if (!AView->UnderLayer().IsNull()) {
166     UnderCLayer = AView->UnderLayer()->CLayer();
167     theCView.ptrUnderLayer = (CALL_DEF_LAYER *) &UnderCLayer;
168   }
169   if (!AView->OverLayer().IsNull()) {
170     OverCLayer = AView->OverLayer()->CLayer();
171     theCView.ptrOverLayer = (CALL_DEF_LAYER *) &OverCLayer;
172   }
173         Handle(Aspect_GraphicDriver) agd = AView->GraphicDriver ();
174
175         theGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
176
177         theGraphicDriver->ClearImmediatMode (theCView, aFlush);
178 }
179
180 //
181 //-Mode Ajout
182 //
183
184 Standard_Boolean Visual3d_TransientManager::BeginAddDraw (const Handle(Visual3d_View)& AView)
185 {
186         if (theDrawingState > 0)
187   {
188           Graphic3d_CView* pview = (Graphic3d_CView* )AView->CView();
189           if( theImmediatState == Immediat_Ajout &&
190               pview->ViewId == theCView.ViewId ) {
191             theDrawingState++;
192             return theDrawingState;
193           } else
194                 Visual3d_TransientDefinitionError::Raise
195                         ("Drawing in progress !");
196         }
197
198         // Begin rendering
199         theCView        = *(Graphic3d_CView* )AView->CView ();
200   if (!AView->UnderLayer().IsNull()) {
201     UnderCLayer = AView->UnderLayer()->CLayer();
202     theCView.ptrUnderLayer = (CALL_DEF_LAYER *) &UnderCLayer;
203   }
204   if (!AView->OverLayer().IsNull()) {
205     OverCLayer = AView->OverLayer()->CLayer();
206     theCView.ptrOverLayer = (CALL_DEF_LAYER *) &OverCLayer;
207   }
208         Handle(Aspect_GraphicDriver) agd = AView->GraphicDriver ();
209
210         theGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
211
212         if (theGraphicDriver->BeginAddMode (theCView))
213   {
214                 theDrawingState++;
215                 theImmediatState = Immediat_Ajout;
216         }
217
218         return theDrawingState;
219 }
220
221 void Visual3d_TransientManager::EndAddDraw () {
222
223         if( theDrawingState <= 0 )
224           Visual3d_TransientDefinitionError::Raise ("Drawing not started !");
225
226         theDrawingState--;
227         if( theDrawingState > 0 ) return;
228         theImmediatState = Immediat_None;
229                         // Flush all graphics
230         theGraphicDriver->EndAddMode();
231 }
232
233
234 //
235 //-Graphic definition methods
236 //
237
238 void Visual3d_TransientManager::DrawStructure (const Handle(Graphic3d_Structure)& theStructure)
239 {
240         if (!theDrawingState)
241   {
242                 Visual3d_TransientDefinitionError::Raise ("Drawing is not open !");
243   }
244   else if (!theStructure->IsEmpty())
245   {
246                 theGraphicDriver->DrawStructure (*theStructure->CStructure());
247         }
248 }