0027816: Visualization - provide an API for overriding clipping planes list
[occt.git] / src / V3d / V3d_View_2.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 /***********************************************************************
15      FONCTION :
16      ----------
17         Classe V3d_View_2.cxx :
18      HISTORIQUE DES MODIFICATIONS   :
19      --------------------------------
20       00-09-92 : GG  ; Creation.
21       24-12-97 : FMN ; Suppression de GEOMLITE
22       23-11-00 : GG  ; Add IsActiveLight() and IsActivePlane() methods
23 ************************************************************************/
24 /*
25  * Includes
26  */
27
28 #include <Aspect_GradientBackground.hxx>
29 #include <Aspect_Grid.hxx>
30 #include <Aspect_Window.hxx>
31 #include <Bnd_Box.hxx>
32 #include <gp_Ax3.hxx>
33 #include <gp_Dir.hxx>
34 #include <Graphic3d_Group.hxx>
35 #include <Graphic3d_GraphicDriver.hxx>
36 #include <Graphic3d_Structure.hxx>
37 #include <Graphic3d_TextureEnv.hxx>
38 #include <Graphic3d_Vector.hxx>
39 #include <Quantity_Color.hxx>
40 #include <Standard_MultiplyDefined.hxx>
41 #include <Standard_TypeMismatch.hxx>
42 #include <V3d.hxx>
43 #include <V3d_BadValue.hxx>
44 #include <V3d_Light.hxx>
45 #include <V3d_UnMapped.hxx>
46 #include <V3d_View.hxx>
47 #include <V3d_Viewer.hxx>
48
49 //=============================================================================
50 //function : SetLightOn
51 //purpose  :
52 //=============================================================================
53 void V3d_View::SetLightOn (const Handle(V3d_Light)& theLight)
54 {
55   if (!MyActiveLights.Contains (theLight))
56   {
57     V3d_BadValue_Raise_if (MyActiveLights.Extent() >= LightLimit(),
58                            "V3d_View::SetLightOn, "
59                            "too many lights");
60     MyActiveLights.Append (theLight);
61     UpdateLights();
62   }
63 }
64
65 //=============================================================================
66 //function : SetLightOff
67 //purpose  :
68 //=============================================================================
69 void V3d_View::SetLightOff (const Handle(V3d_Light)& theLight)
70 {
71   Standard_TypeMismatch_Raise_if (MyViewer->IsGlobalLight (theLight),
72                                   "V3d_View::SetLightOff, "
73                                   "the light is global");
74   MyActiveLights.Remove (theLight);
75   UpdateLights();
76 }
77
78 //=============================================================================
79 //function : IsActiveLight
80 //purpose  :
81 //=============================================================================
82 Standard_Boolean V3d_View::IsActiveLight (const Handle(V3d_Light)& theLight) const
83 {
84   if (theLight.IsNull())
85   {
86     return Standard_False;
87   }
88   return MyActiveLights.Contains(theLight);
89 }
90
91 //=============================================================================
92 //function : SetLightOn
93 //purpose  :
94 //=============================================================================
95 void V3d_View::SetLightOn()
96 {
97   for (MyViewer->InitDefinedLights(); MyViewer->MoreDefinedLights(); MyViewer->NextDefinedLights())
98   {
99     if (!MyActiveLights.Contains (MyViewer->DefinedLight()))
100     {
101       MyActiveLights.Append (MyViewer->DefinedLight());
102     }
103   }
104   UpdateLights();
105 }
106
107 //=============================================================================
108 //function : SetLightOff
109 //purpose  :
110 //=============================================================================
111 void V3d_View::SetLightOff()
112 {
113   InitActiveLights();
114   while(MoreActiveLights())
115   {
116     if (!MyViewer->IsGlobalLight (ActiveLight()))
117     {
118       MyActiveLights.Remove (ActiveLight());
119     }
120     else
121     {
122       NextActiveLights();
123     }
124   }
125   UpdateLights();
126 }
127
128 //=============================================================================
129 //function : InitActiveLights
130 //purpose  :
131 //=============================================================================
132 void V3d_View::InitActiveLights()
133 {
134   myActiveLightsIterator.Initialize(MyActiveLights);
135 }
136
137 //=============================================================================
138 //function : MoreActiveLights
139 //purpose  :
140 //=============================================================================
141 Standard_Boolean V3d_View::MoreActiveLights() const
142 {
143   return myActiveLightsIterator.More();
144 }
145
146 //=============================================================================
147 //function : NextActiveLights
148 //purpose  :
149 //=============================================================================
150 void V3d_View::NextActiveLights()
151 {
152   myActiveLightsIterator.Next();
153 }
154
155 //=============================================================================
156 //function : ActiveLight
157 //purpose  :
158 //=============================================================================
159 Handle(V3d_Light) V3d_View::ActiveLight() const
160 {
161   return (Handle(V3d_Light)&)(myActiveLightsIterator.Value());
162 }
163
164 //=============================================================================
165 //function : IfMoreLights
166 //purpose  :
167 //=============================================================================
168 Standard_Boolean V3d_View::IfMoreLights() const
169 {
170   return MyActiveLights.Extent() < LightLimit();
171 }
172
173 //=======================================================================
174 //function : LightLimit
175 //purpose  :
176 //=======================================================================
177 Standard_Integer V3d_View::LightLimit() const
178 {
179   return Viewer()->Driver()->InquireLightLimit();
180 }
181
182 //=======================================================================
183 //function : AddClipPlane
184 //purpose  :
185 //=======================================================================
186 void V3d_View::AddClipPlane (const Handle(Graphic3d_ClipPlane)& thePlane)
187 {
188   Handle(Graphic3d_SequenceOfHClipPlane) aSeqOfPlanes = ClipPlanes();
189   if (aSeqOfPlanes.IsNull())
190   {
191     aSeqOfPlanes = new Graphic3d_SequenceOfHClipPlane();
192   }
193
194   aSeqOfPlanes->Append (thePlane);
195   SetClipPlanes (aSeqOfPlanes);
196 }
197
198 //=======================================================================
199 //function : RemoveClipPlane
200 //purpose  :
201 //=======================================================================
202 void V3d_View::RemoveClipPlane (const Handle(Graphic3d_ClipPlane)& thePlane)
203 {
204   Handle(Graphic3d_SequenceOfHClipPlane) aSeqOfPlanes = ClipPlanes();
205   if (aSeqOfPlanes.IsNull())
206   {
207     return;
208   }
209
210   for (Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt(*aSeqOfPlanes); aPlaneIt.More(); aPlaneIt.Next())
211   {
212     const Handle(Graphic3d_ClipPlane)& aPlane = aPlaneIt.Value();
213     if (aPlane != thePlane)
214       continue;
215
216     aSeqOfPlanes->Remove (aPlaneIt);
217     SetClipPlanes (aSeqOfPlanes);
218     return;
219   }
220 }
221
222 //=======================================================================
223 //function : SetClipPlanes
224 //purpose  :
225 //=======================================================================
226 void V3d_View::SetClipPlanes (const Handle(Graphic3d_SequenceOfHClipPlane)& thePlanes)
227 {
228   myView->SetClipPlanes (thePlanes);
229 }
230
231 //=======================================================================
232 //function : ClipPlanes
233 //purpose  :
234 //=======================================================================
235 const Handle(Graphic3d_SequenceOfHClipPlane)& V3d_View::ClipPlanes() const
236 {
237   return myView->ClipPlanes();
238 }
239
240 //=======================================================================
241 //function : PlaneLimit
242 //purpose  :
243 //=======================================================================
244 Standard_Integer V3d_View::PlaneLimit() const
245 {
246   return Viewer()->Driver()->InquirePlaneLimit();
247 }