0024732: OpenGl_Context - retrieve functions up to GL4.4
[occt.git] / src / Visual3d / Visual3d_TransientManager.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_TransientManager :
20
21
22         Declaration des variables specifiques au mode transient.
23
24         Une vue est definie par :
25                 - un ViewManager
26                 - un ContextView
27                 - un ViewMapping
28                 - une ViewOrientation
29
30      HISTORIQUE DES MODIFICATIONS   :
31      --------------------------------
32       October 1995 : GG : Creation.
33       20-11-97  : CAL ; Disparition de la dependance avec math
34       01-05-97 : CAL ; Ajout du Clear sur les TOS_COMPUTED.
35       18-12-97 : FMN ; Ajout mode AJOUT.
36       27-12-98 : FMN ; PERF: OPTIMISATION LOADER (LOPTIM)
37       10-06-98 : CAL ; Modification de la signature de DrawStructure.
38       25-09-98 : CAL ; Mise a jour de theCView = *(CALL_DEF_VIEW *)AView->CView ();
39       10-11-98 : CAL ; PRO16361. theCView dans ClearImmediatMode.
40       30-11-98 : FMN ; S4069 : Textes toujours visibles.
41       01-12-98 : CAL ; S4062. Ajout des layers.
42
43 ************************************************************************/
44
45 // for the class
46 #include <Visual3d_TransientManager.ixx>
47 #include <Visual3d_ViewPtr.hxx>
48 #include <Visual3d_View.pxx>
49
50 #include <Aspect_CLayer2d.hxx>
51 #include <Graphic3d_CView.hxx>
52 #include <Graphic3d_GraphicDriver.hxx>
53 #include <Graphic3d_TypeOfPrimitive.hxx>
54 #include <Visual3d_Layer.hxx>
55
56 enum TypeOfImmediat {
57  Immediat_None,
58  Immediat_Transient,
59  Immediat_Ajout
60 };
61
62 //-Global data definitions
63 static Standard_Integer theDrawingState = 0;
64 static TypeOfImmediat theImmediatState = Immediat_None;
65
66 static Handle(Graphic3d_GraphicDriver)& _theGraphicDriver() {
67     static Handle(Graphic3d_GraphicDriver) theGraphicDriver;
68 return theGraphicDriver;
69 }
70 #define theGraphicDriver _theGraphicDriver()
71
72 static Graphic3d_CView& _theCView() {
73     static Graphic3d_CView theCView;
74 return theCView;
75 }
76 #define theCView _theCView()
77
78 static Aspect_CLayer2d UnderCLayer;
79 static Aspect_CLayer2d OverCLayer;
80
81 //
82 //-Constructors
83 //
84
85 Visual3d_TransientManager::Visual3d_TransientManager () {
86 }
87
88 //
89 //-Destructors
90 //
91
92 void Visual3d_TransientManager::Destroy () {
93 }
94
95 //-Methods, in order
96
97 Standard_Boolean Visual3d_TransientManager::BeginDraw (const Handle(Visual3d_View)& AView, const Standard_Boolean DoubleBuffer, const Standard_Boolean RetainMode) {
98
99         if (theDrawingState > 0) {
100           Graphic3d_CView* pview = (Graphic3d_CView*) AView->CView();
101           if( theImmediatState == Immediat_Transient &&
102               pview->ViewId == theCView.ViewId ) {
103             theDrawingState++;
104             return theDrawingState;
105           } else
106                 Visual3d_TransientDefinitionError::Raise
107                         ("Drawing in progress !");
108         }
109
110 Handle(Visual3d_Layer) OverLayer = AView->OverLayer ();
111 Handle(Visual3d_Layer) UnderLayer = AView->UnderLayer ();
112   OverCLayer.ptrLayer = UnderCLayer.ptrLayer = NULL;
113   theCView = *(Graphic3d_CView* )AView->CView ();
114
115         if (! UnderLayer.IsNull ()){
116                 UnderCLayer = UnderLayer->CLayer();
117                 theCView.ptrUnderLayer = (CALL_DEF_LAYER *) &UnderCLayer;
118         }
119         if (! OverLayer.IsNull ()){
120                 OverCLayer = OverLayer->CLayer();
121                 theCView.ptrOverLayer = (CALL_DEF_LAYER *) &OverCLayer;
122         }
123
124         // Begin rendering
125         theGraphicDriver = AView->GraphicDriver();
126
127         if (theGraphicDriver->BeginImmediatMode
128                 (theCView, UnderCLayer, OverCLayer, DoubleBuffer, RetainMode))
129   {
130                 theDrawingState++;
131                 theImmediatState = Immediat_Transient;
132         }
133
134         return theDrawingState;
135 }
136
137 void Visual3d_TransientManager::EndDraw (const Standard_Boolean Synchronize) {
138
139         if( theDrawingState <= 0 )
140           Visual3d_TransientDefinitionError::Raise ("Drawing not started !");
141
142         theDrawingState--;
143         if( theDrawingState > 0 ) return;
144         theImmediatState = Immediat_None;
145
146                         // Flush all graphics
147         theGraphicDriver->EndImmediatMode(Synchronize);
148 }
149
150 void Visual3d_TransientManager::ClearDraw (const Handle(Visual3d_View)& AView,
151                                            const Standard_Boolean aFlush)
152 {
153         if (theDrawingState > 0)
154                 Visual3d_TransientDefinitionError::Raise
155                         ("Drawing in progress !");
156
157         // Begin rendering
158         theCView        = *(Graphic3d_CView* )AView->CView ();
159   if (!AView->UnderLayer().IsNull()) {
160     UnderCLayer = AView->UnderLayer()->CLayer();
161     theCView.ptrUnderLayer = (CALL_DEF_LAYER *) &UnderCLayer;
162   }
163   if (!AView->OverLayer().IsNull()) {
164     OverCLayer = AView->OverLayer()->CLayer();
165     theCView.ptrOverLayer = (CALL_DEF_LAYER *) &OverCLayer;
166   }
167
168         theGraphicDriver = AView->GraphicDriver();
169         theGraphicDriver->ClearImmediatMode (theCView, aFlush);
170 }
171
172 //
173 //-Mode Ajout
174 //
175
176 Standard_Boolean Visual3d_TransientManager::BeginAddDraw (const Handle(Visual3d_View)& AView)
177 {
178         if (theDrawingState > 0)
179   {
180           Graphic3d_CView* pview = (Graphic3d_CView* )AView->CView();
181           if( theImmediatState == Immediat_Ajout &&
182               pview->ViewId == theCView.ViewId ) {
183             theDrawingState++;
184             return theDrawingState;
185           } else
186                 Visual3d_TransientDefinitionError::Raise
187                         ("Drawing in progress !");
188         }
189
190         // Begin rendering
191         theCView        = *(Graphic3d_CView* )AView->CView ();
192   if (!AView->UnderLayer().IsNull()) {
193     UnderCLayer = AView->UnderLayer()->CLayer();
194     theCView.ptrUnderLayer = (CALL_DEF_LAYER *) &UnderCLayer;
195   }
196   if (!AView->OverLayer().IsNull()) {
197     OverCLayer = AView->OverLayer()->CLayer();
198     theCView.ptrOverLayer = (CALL_DEF_LAYER *) &OverCLayer;
199   }
200
201         theGraphicDriver = AView->GraphicDriver ();
202
203         if (theGraphicDriver->BeginAddMode (theCView))
204   {
205                 theDrawingState++;
206                 theImmediatState = Immediat_Ajout;
207         }
208
209         return theDrawingState;
210 }
211
212 void Visual3d_TransientManager::EndAddDraw () {
213
214         if( theDrawingState <= 0 )
215           Visual3d_TransientDefinitionError::Raise ("Drawing not started !");
216
217         theDrawingState--;
218         if( theDrawingState > 0 ) return;
219         theImmediatState = Immediat_None;
220                         // Flush all graphics
221         theGraphicDriver->EndAddMode();
222 }
223
224
225 //
226 //-Graphic definition methods
227 //
228
229 void Visual3d_TransientManager::DrawStructure (const Handle(Graphic3d_Structure)& theStructure)
230 {
231         if (!theDrawingState)
232   {
233                 Visual3d_TransientDefinitionError::Raise ("Drawing is not open !");
234   }
235   else if (!theStructure->IsEmpty())
236   {
237                 theGraphicDriver->DrawStructure (*theStructure->CStructure());
238         }
239 }