0024637: Visualization - clean up implementation of rendering in immediate mode
[occt.git] / src / V3d / V3d_Viewer.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <V3d.hxx>
15 #include <Visual3d_View.hxx>
16 #include <Visual3d_Light.hxx>
17 #include <V3d_Viewer.ixx>
18 #include <V3d_View.hxx>
19 #include <V3d_BadValue.hxx>
20
21 /*----------------------------------------------------------------------*/
22
23 //-Constructor:
24 V3d_Viewer::V3d_Viewer (const Handle(Graphic3d_GraphicDriver)& theDriver,
25                         const Standard_ExtString      theName,
26                         const Standard_CString        theDomain,
27                         const Standard_Real           theViewSize,
28                         const V3d_TypeOfOrientation   theViewProj,
29                         const Quantity_NameOfColor    theViewBackground,
30                         const V3d_TypeOfVisualization theVisualization,
31                         const V3d_TypeOfShadingModel  theShadingModel,
32                         const V3d_TypeOfUpdate        theUpdateMode,
33                         const Standard_Boolean        theComputedMode,
34                         const Standard_Boolean        theDefaultComputedMode,
35                         const V3d_TypeOfSurfaceDetail theSurfaceDetail)  
36 :myNextCount (-1),
37 myDriver (theDriver),
38 myName (TCollection_ExtendedString (theName)),
39 myDomain (TCollection_AsciiString (theDomain)),
40 MyDefinedViews(),
41 MyActiveViews(),
42 MyDefinedLights(),
43 MyActiveLights(),
44 myActiveViewsIterator(),
45 myDefinedViewsIterator(),
46 myActiveLightsIterator(),
47 myDefinedLightsIterator(),
48 myComputedMode (theComputedMode),
49 myDefaultComputedMode (theDefaultComputedMode),
50 myPrivilegedPlane (gp_Ax3 (gp_Pnt (0.,0.,0), gp_Dir (0.,0.,1.), gp_Dir (1.,0.,0.))),
51 myDisplayPlane (Standard_False),
52 myDisplayPlaneLength (theViewSize),
53 myGridEcho (Standard_True),
54 myGridEchoLastVert (ShortRealLast(), ShortRealLast(), ShortRealLast())
55 {
56   MyViewer = new Visual3d_ViewManager (theDriver);
57   // san (16/09/2010): It has been decided to turn depth test ON
58   // by default, as this is important for new font rendering
59   // (without it, there are numerous texture rendering artefacts)
60   MyViewer->SetZBufferAuto (Standard_False);
61   SetUpdateMode (theUpdateMode);
62   SetDefaultViewSize (theViewSize);
63   SetDefaultViewProj (theViewProj);
64   SetDefaultBackgroundColor (theViewBackground);
65   SetDefaultVisualization (theVisualization);
66   SetDefaultShadingModel (theShadingModel);
67   SetDefaultSurfaceDetail (theSurfaceDetail); 
68   SetDefaultAngle (M_PI / 2.);
69   SetDefaultTypeOfView (V3d_ORTHOGRAPHIC);
70
71   Quantity_Color Color1 (Quantity_NOC_GRAY50);
72   Quantity_Color Color2 (Quantity_NOC_GRAY70);
73 //  Quantity_Color White (Quantity_NOC_WHITE);
74   myRGrid = new V3d_RectangularGrid (this, Color1, Color2);
75   myCGrid = new V3d_CircularGrid (this, Color1, Color2);
76   myGridType = Aspect_GT_Rectangular;
77 }
78
79 //-Methods, in order
80
81
82 Handle(V3d_View) V3d_Viewer::CreateView ()
83 {
84   return new V3d_View(this, MyDefaultTypeOfView);
85 }
86
87 void V3d_Viewer::SetViewOn( ) {
88
89   for (InitDefinedViews();MoreDefinedViews();NextDefinedViews()){
90     SetViewOn(ActiveView());};
91 }
92
93 void V3d_Viewer::SetViewOff( ) {
94
95   for (InitDefinedViews();MoreDefinedViews();NextDefinedViews()){
96     SetViewOff(ActiveView());};
97 }
98
99 void V3d_Viewer::SetViewOn( const Handle(V3d_View)& TheView ) {
100
101   Handle(Visual3d_View) MyView = TheView->View() ;
102   if( MyView->IsDefined() && !IsActive(TheView)) {
103     MyActiveViews.Append(TheView) ;
104     MyView->Activate();
105     for (InitActiveLights();MoreActiveLights();NextActiveLights()){
106       TheView->SetLightOn(ActiveLight());}
107     // Grid
108     TheView->SetGrid (myPrivilegedPlane, Grid ());
109     TheView->SetGridActivity (Grid ()->IsActive ());
110     // Update
111     MyView->Redraw() ;
112   }
113 }
114
115 void V3d_Viewer::SetViewOff( const Handle(V3d_View)& TheView ) {
116
117   Handle(Visual3d_View) MyView =TheView->View(); 
118   if( MyView->IsDefined() && IsActive(TheView) ) {
119     MyActiveViews.Remove(TheView);
120     MyView->Deactivate() ;
121   }
122 }
123
124 Standard_Boolean V3d_Viewer::ComputedMode() const {
125   return myComputedMode;
126 }
127
128 Standard_Boolean V3d_Viewer::DefaultComputedMode() const {
129   return myDefaultComputedMode;
130 }
131
132 void V3d_Viewer::Update()
133 {
134   MyViewer->Update();
135 }
136
137 void V3d_Viewer::Redraw()const
138 {
139   MyViewer->Redraw();
140 }
141
142 void V3d_Viewer::RedrawImmediate() const
143 {
144   MyViewer->RedrawImmediate();
145 }
146
147 void V3d_Viewer::Invalidate() const
148 {
149   MyViewer->Invalidate();
150 }
151
152 void V3d_Viewer::Remove() {
153
154   MyViewer->Remove();
155 }
156
157 void V3d_Viewer::Erase() const {
158   
159   MyViewer->Erase();
160 }
161
162 void V3d_Viewer::UnHighlight() const {
163
164   //FMN MyViewer->UnHighlight();
165 }
166
167 void V3d_Viewer::SetDefaultBackgroundColor(const Quantity_TypeOfColor Type, const Standard_Real v1, const Standard_Real v2, const Standard_Real v3) {
168   Standard_Real V1 = v1 ;
169   Standard_Real V2 = v2 ;
170   Standard_Real V3 = v3 ;
171
172   if( V1 < 0. ) V1 = 0. ; else if( V1 > 1. ) V1 = 1. ;
173   if( V2 < 0. ) V2 = 0. ; else if( V2 > 1. ) V2 = 1. ;
174   if( V3 < 0. ) V3 = 0. ; else if( V3 > 1. ) V3 = 1. ;
175
176   Quantity_Color C(V1,V2,V3,Type) ;
177   SetDefaultBackgroundColor(C);
178 }
179
180 void V3d_Viewer::SetDefaultBackgroundColor(const Quantity_NameOfColor Name)
181 {
182   Quantity_Color C(Name) ;
183   SetDefaultBackgroundColor(C);
184 }
185
186 void V3d_Viewer::SetDefaultBackgroundColor(const Quantity_Color &Color)
187 {
188   MyBackground.SetColor(Color) ;
189 }
190
191 void V3d_Viewer::SetDefaultBgGradientColors( const Quantity_NameOfColor Name1,
192                                              const Quantity_NameOfColor Name2,
193                                              const Aspect_GradientFillMethod FillStyle){
194
195   Quantity_Color C1(Name1) ;
196   Quantity_Color C2(Name2) ;
197   MyGradientBackground.SetColors(C1, C2, FillStyle);
198
199
200
201 void V3d_Viewer::SetDefaultBgGradientColors( const Quantity_Color& Color1,
202                                              const Quantity_Color& Color2,
203                                              const Aspect_GradientFillMethod FillStyle ){
204
205   MyGradientBackground.SetColors(Color1, Color2, FillStyle);
206
207 }  
208
209
210 void V3d_Viewer::SetDefaultViewSize(const Standard_Real Size) {
211
212   V3d_BadValue_Raise_if( Size <= 0. ,"V3d_Viewer::SetDefaultViewSize, bad size");
213   MyViewSize = Size ;
214 }
215
216 void V3d_Viewer::SetDefaultViewProj(const V3d_TypeOfOrientation Orientation) {
217
218   MyViewProj = Orientation ;
219 }
220
221 void V3d_Viewer::SetDefaultVisualization(const V3d_TypeOfVisualization Type) {
222
223   MyVisualization = Type ;
224 }
225 void V3d_Viewer::SetZBufferManagment(const Standard_Boolean Automatic) {
226   MyViewer->SetZBufferAuto (Automatic);
227 }
228 Standard_Boolean V3d_Viewer::ZBufferManagment() const {
229   return MyViewer->ZBufferAuto();
230 }
231
232 void V3d_Viewer::SetDefaultShadingModel(const V3d_TypeOfShadingModel Type) {
233
234   MyShadingModel = Type ;
235 }
236
237 void V3d_Viewer::SetDefaultSurfaceDetail(const V3d_TypeOfSurfaceDetail Type) {
238
239   MySurfaceDetail = Type ;
240 }
241
242 void V3d_Viewer::SetDefaultAngle(const Quantity_PlaneAngle Angle) {
243   MyDefaultAngle = Angle;
244 }
245
246 void V3d_Viewer::SetDefaultTypeOfView(const V3d_TypeOfView Type) {
247   MyDefaultTypeOfView = Type;}
248
249
250 void V3d_Viewer::SetUpdateMode(const V3d_TypeOfUpdate Mode) {
251   
252   MyViewer->SetUpdateMode((Aspect_TypeOfUpdate)Mode) ;
253 }
254
255 void V3d_Viewer::DefaultBackgroundColor(const Quantity_TypeOfColor Type,Standard_Real &V1,Standard_Real &V2,Standard_Real &V3) const
256 {
257   Quantity_Color C = DefaultBackgroundColor();
258   C.Values(V1,V2,V3,Type) ;
259 }
260
261 Quantity_Color V3d_Viewer::DefaultBackgroundColor() const
262 {
263   return MyBackground.Color() ;
264 }
265
266 void V3d_Viewer::DefaultBgGradientColors(Quantity_Color& Color1,Quantity_Color& Color2) const
267 {
268   MyGradientBackground.Colors(Color1,Color2);     
269 }
270
271 Standard_Real V3d_Viewer::DefaultViewSize() const {
272   return MyViewSize ;
273 }
274
275 V3d_TypeOfOrientation V3d_Viewer::DefaultViewProj() const {
276   return MyViewProj ;
277 }
278
279 V3d_TypeOfVisualization V3d_Viewer::DefaultVisualization() const {
280   return MyVisualization ;
281 }
282
283 V3d_TypeOfShadingModel V3d_Viewer::DefaultShadingModel() const {
284   return MyShadingModel ;
285 }
286
287 V3d_TypeOfSurfaceDetail V3d_Viewer::DefaultSurfaceDetail() const {
288   return MySurfaceDetail ;
289 }
290
291 Quantity_PlaneAngle V3d_Viewer::DefaultAngle() const {
292   return MyDefaultAngle;
293 }
294
295 V3d_TypeOfUpdate V3d_Viewer::UpdateMode() const {
296
297   V3d_TypeOfUpdate Mode = (V3d_TypeOfUpdate) MyViewer->UpdateMode() ;
298   return Mode ;
299 }
300
301 Standard_Boolean V3d_Viewer::IfMoreViews() const {
302   Standard_Boolean TheStatus = Standard_False ;
303
304 #ifdef NEW
305   if( MyActiveViews->Length() < Visual3d_View::Limit() )
306 #endif /*NEW*/
307     TheStatus = Standard_True ;
308   return TheStatus ;
309 }
310
311 Handle(Visual3d_ViewManager) V3d_Viewer::Viewer() const {
312   return MyViewer ;
313 }
314
315 Aspect_Background V3d_Viewer::GetBackgroundColor() const {
316   return MyBackground ;
317 }
318
319 Aspect_GradientBackground V3d_Viewer::GetGradientBackground() const {
320   return MyGradientBackground;
321 }   
322
323 void V3d_Viewer::AddView( const Handle(V3d_View)& TheView ) {
324
325   MyDefinedViews.Append(TheView);
326   IncrCount();
327 }
328
329 void V3d_Viewer::DelView( const Handle(V3d_View)& TheView ) {
330
331   MyActiveViews.Remove(TheView);
332   MyDefinedViews.Remove(TheView);
333 }
334
335 //=======================================================================
336 //function : AddZLayer
337 //purpose  :
338 //=======================================================================
339
340 Standard_Boolean V3d_Viewer::AddZLayer (Standard_Integer& theLayerId)
341 {
342   return MyViewer->AddZLayer (theLayerId);
343 }
344
345 //=======================================================================
346 //function : RemoveZLayer
347 //purpose  : 
348 //=======================================================================
349
350 Standard_Boolean V3d_Viewer::RemoveZLayer (const Standard_Integer theLayerId)
351 {
352   return MyViewer->RemoveZLayer (theLayerId);
353 }
354
355 //=======================================================================
356 //function : GetAllZLayers
357 //purpose  :
358 //=======================================================================
359
360 void V3d_Viewer::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq) const
361 {
362   MyViewer->GetAllZLayers (theLayerSeq);
363 }
364
365 //=======================================================================
366 //function : Domain
367 //purpose  :
368 //=======================================================================
369
370 Standard_CString V3d_Viewer::Domain() const
371 {
372   return myDomain.ToCString();
373 }
374
375 //=======================================================================
376 //function : Driver
377 //purpose  :
378 //=======================================================================
379
380 const Handle(Graphic3d_GraphicDriver)& V3d_Viewer::Driver() const
381 {
382   return myDriver;
383 }
384
385 //=======================================================================
386 //function : NextName
387 //purpose  :
388 //=======================================================================
389
390 Standard_ExtString V3d_Viewer::NextName() const
391 {
392   TCollection_ExtendedString aNextName = TCollection_ExtendedString (myName.ToExtString());
393   aNextName.AssignCat (TCollection_ExtendedString (myNextCount));
394   
395   return aNextName.ToExtString();
396 }
397
398 //=======================================================================
399 //function : IncrCount
400 //purpose  :
401 //=======================================================================
402
403 void V3d_Viewer::IncrCount()
404 {
405   myNextCount++;
406 }