0029516: Visualization - eliminate redundant property Graphic3d_MaterialAspect::Refle...
[occt.git] / src / Graphic3d / Graphic3d_ClipPlane.cxx
1 // Created on: 2013-07-12
2 // Created by: Anton POLETAEV
3 // Copyright (c) 2013-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <Graphic3d_ClipPlane.hxx>
17
18 #include <Graphic3d_AspectFillArea3d.hxx>
19 #include <gp_Pln.hxx>
20 #include <Standard_Atomic.hxx>
21
22 IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_ClipPlane,Standard_Transient)
23
24 namespace
25 {
26   static volatile Standard_Integer THE_CLIP_PLANE_COUNTER = 0;
27
28   static Handle(Graphic3d_AspectFillArea3d) defaultAspect()
29   {
30     Graphic3d_MaterialAspect aMaterial (Graphic3d_NOM_DEFAULT);
31     Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d();
32     anAspect->SetDistinguishOff();
33     anAspect->SetFrontMaterial (aMaterial);
34     anAspect->SetHatchStyle (Aspect_HS_HORIZONTAL);
35     anAspect->SetInteriorStyle (Aspect_IS_SOLID);
36     anAspect->SetInteriorColor (Quantity_NOC_GRAY20);
37     anAspect->SetSuppressBackFaces (false);
38     return anAspect;
39   }
40 }
41
42 // =======================================================================
43 // function : Graphic3d_ClipPlane
44 // purpose  :
45 // =======================================================================
46 Graphic3d_ClipPlane::Graphic3d_ClipPlane()
47 : myAspect     (defaultAspect()),
48   myPrevInChain(NULL),
49   myPlane      (0.0, 0.0, 1.0, 0.0),
50   myEquation   (0.0, 0.0, 1.0, 0.0),
51   myEquationRev(0.0, 0.0,-1.0, 0.0),
52   myChainLenFwd(1),
53   myFlags      (Graphic3d_CappingFlags_None),
54   myEquationMod(0),
55   myAspectMod  (0),
56   myIsOn       (Standard_True),
57   myIsCapping  (Standard_False)
58 {
59   makeId();
60 }
61
62 // =======================================================================
63 // function : Graphic3d_ClipPlane
64 // purpose  :
65 // =======================================================================
66 Graphic3d_ClipPlane::Graphic3d_ClipPlane (const Graphic3d_Vec4d& theEquation)
67 : myAspect     (defaultAspect()),
68   myPrevInChain(NULL),
69   myPlane      (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.w()),
70   myEquation   (theEquation),
71   myEquationRev(0.0, 0.0,-1.0, 0.0),
72   myChainLenFwd(1),
73   myFlags      (Graphic3d_CappingFlags_None),
74   myEquationMod(0),
75   myAspectMod  (0),
76   myIsOn       (Standard_True),
77   myIsCapping  (Standard_False)
78 {
79   makeId();
80   updateInversedPlane();
81 }
82
83 // =======================================================================
84 // function : Graphic3d_ClipPlane
85 // purpose  :
86 // =======================================================================
87 Graphic3d_ClipPlane::Graphic3d_ClipPlane(const Graphic3d_ClipPlane& theOther)
88 : Standard_Transient(theOther),
89   myAspect     (defaultAspect()),
90   myPrevInChain(NULL),
91   myPlane      (theOther.myPlane),
92   myEquation   (theOther.myEquation),
93   myEquationRev(theOther.myEquationRev),
94   myChainLenFwd(1),
95   myFlags      (theOther.myFlags),
96   myEquationMod(0),
97   myAspectMod  (0),
98   myIsOn       (theOther.myIsOn),
99   myIsCapping  (theOther.myIsCapping)
100 {
101   makeId();
102   *myAspect = *theOther.CappingAspect();
103 }
104
105 // =======================================================================
106 // function : Graphic3d_ClipPlane
107 // purpose  :
108 // =======================================================================
109 Graphic3d_ClipPlane::Graphic3d_ClipPlane(const gp_Pln& thePlane)
110 : myAspect     (defaultAspect()),
111   myPrevInChain(NULL),
112   myPlane      (thePlane),
113   myChainLenFwd(1),
114   myFlags      (Graphic3d_CappingFlags_None),
115   myEquationMod(0),
116   myAspectMod  (0),
117   myIsOn       (Standard_True),
118   myIsCapping  (Standard_False)
119 {
120   thePlane.Coefficients (myEquation[0], myEquation[1], myEquation[2], myEquation[3]);
121   updateInversedPlane();
122   makeId();
123 }
124
125 // =======================================================================
126 // function : SetEquation
127 // purpose  :
128 // =======================================================================
129 void Graphic3d_ClipPlane::SetEquation (const Graphic3d_Vec4d& theEquation)
130 {
131   myPlane = gp_Pln (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.w());
132   myEquation = theEquation;
133   updateInversedPlane();
134   myEquationMod++;
135 }
136
137 // =======================================================================
138 // function : SetPlane
139 // purpose  :
140 // =======================================================================
141 void Graphic3d_ClipPlane::SetEquation (const gp_Pln& thePlane)
142 {
143   myPlane = thePlane;
144   thePlane.Coefficients (myEquation[0], myEquation[1], myEquation[2], myEquation[3]);
145   updateInversedPlane();
146   myEquationMod++;
147 }
148
149 // =======================================================================
150 // function : SetOn
151 // purpose  :
152 // =======================================================================
153 void Graphic3d_ClipPlane::SetOn (const Standard_Boolean theIsOn)
154 {
155   if (myPrevInChain != NULL)
156   {
157     throw Standard_ProgramError ("Graphic3d_ClipPlane::SetOn() - undefined operation for a plane in Union");
158   }
159   myIsOn = theIsOn;
160 }
161
162 // =======================================================================
163 // function : SetCapping
164 // purpose  :
165 // =======================================================================
166 void Graphic3d_ClipPlane::SetCapping (const Standard_Boolean theIsOn)
167 {
168   myIsCapping = theIsOn;
169 }
170
171 // =======================================================================
172 // function : Clone
173 // purpose  :
174 // =======================================================================
175 Handle(Graphic3d_ClipPlane) Graphic3d_ClipPlane::Clone() const
176 {
177   return new Graphic3d_ClipPlane(*this);
178 }
179
180 // =======================================================================
181 // function : SetCappingColor
182 // purpose  :
183 // =======================================================================
184 void Graphic3d_ClipPlane::SetCappingColor (const Quantity_Color& theColor)
185 {
186   myAspect->SetInteriorColor (theColor);
187   myAspect->ChangeFrontMaterial().SetColor (theColor);
188   ++myAspectMod;
189 }
190
191 // =======================================================================
192 // function : SetCappingMaterial
193 // purpose  :
194 // =======================================================================
195 void Graphic3d_ClipPlane::SetCappingMaterial (const Graphic3d_MaterialAspect& theMat)
196 {
197   myAspect->SetFrontMaterial (theMat);
198   if (myAspect->FrontMaterial().MaterialType() != Graphic3d_MATERIAL_ASPECT)
199   {
200     myAspect->SetInteriorColor (theMat.Color());
201   }
202   ++myAspectMod;
203 }
204
205 // =======================================================================
206 // function : SetCappingTexture
207 // purpose  :
208 // =======================================================================
209 void Graphic3d_ClipPlane::SetCappingTexture (const Handle(Graphic3d_TextureMap)& theTexture)
210 {
211   if (!theTexture.IsNull())
212   {
213     myAspect->SetTextureMapOn();
214     Handle(Graphic3d_TextureSet) aTextureSet = myAspect->TextureSet();
215     if (aTextureSet.IsNull() || aTextureSet->Size() != 1)
216     {
217       aTextureSet = new Graphic3d_TextureSet (theTexture);
218     }
219     else
220     {
221       aTextureSet->SetFirst (theTexture);
222     }
223     myAspect->SetTextureSet (aTextureSet);
224   }
225   else
226   {
227     myAspect->SetTextureMapOff();
228     myAspect->SetTextureSet (Handle(Graphic3d_TextureSet)());
229   }
230   ++myAspectMod;
231 }
232
233 // =======================================================================
234 // function : SetCappingHatch
235 // purpose  :
236 // =======================================================================
237 void Graphic3d_ClipPlane::SetCappingHatch (const Aspect_HatchStyle theStyle)
238 {
239   myAspect->SetHatchStyle (theStyle);
240   ++myAspectMod;
241 }
242
243 // =======================================================================
244 // function : SetCappingCustomHatch
245 // purpose  :
246 // =======================================================================
247 void Graphic3d_ClipPlane::SetCappingCustomHatch (const Handle(Graphic3d_HatchStyle)& theStyle)
248 {
249   myAspect->SetHatchStyle (theStyle);
250   ++myAspectMod;
251 }
252
253 // =======================================================================
254 // function : SetCappingHatchOn
255 // purpose  :
256 // =======================================================================
257 void Graphic3d_ClipPlane::SetCappingHatchOn()
258 {
259   myAspect->SetInteriorStyle (Aspect_IS_HATCH);
260   ++myAspectMod;
261 }
262
263 // =======================================================================
264 // function : SetCappingHatchOff
265 // purpose  :
266 // =======================================================================
267 void Graphic3d_ClipPlane::SetCappingHatchOff()
268 {
269   myAspect->SetInteriorStyle (Aspect_IS_SOLID);
270   ++myAspectMod;
271 }
272
273 // =======================================================================
274 // function : SetCappingAspect
275 // purpose  :
276 // =======================================================================
277 void Graphic3d_ClipPlane::SetCappingAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect)
278 {
279   myAspect = theAspect;
280   ++myAspectMod;
281 }
282
283 // =======================================================================
284 // function : setCappingFlag
285 // purpose  :
286 // =======================================================================
287 void Graphic3d_ClipPlane::setCappingFlag (bool theToUse, int theFlag)
288 {
289   if (theToUse)
290   {
291     myFlags |= theFlag;
292   }
293   else
294   {
295     myFlags &= ~(theFlag);
296   }
297   ++myAspectMod;
298 }
299
300 // =======================================================================
301 // function : makeId
302 // purpose  :
303 // =======================================================================
304 void Graphic3d_ClipPlane::makeId()
305 {
306   myId = TCollection_AsciiString ("Graphic3d_ClipPlane_") //DynamicType()->Name()
307        + TCollection_AsciiString (Standard_Atomic_Increment (&THE_CLIP_PLANE_COUNTER));
308 }
309
310 // =======================================================================
311 // function : updateChainLen
312 // purpose  :
313 // =======================================================================
314 void Graphic3d_ClipPlane::updateChainLen()
315 {
316   myChainLenFwd = !myNextInChain.IsNull() ? (myNextInChain->myChainLenFwd + 1) : 1;
317   if (myPrevInChain != NULL)
318   {
319     myPrevInChain->updateChainLen();
320   }
321 }
322
323 // =======================================================================
324 // function : SetChainNextPlane
325 // purpose  :
326 // =======================================================================
327 void Graphic3d_ClipPlane::SetChainNextPlane (const Handle(Graphic3d_ClipPlane)& thePlane)
328 {
329   ++myEquationMod;
330   if (!myNextInChain.IsNull())
331   {
332     myNextInChain->myPrevInChain = NULL;
333   }
334   myNextInChain = thePlane;
335   if (!myNextInChain.IsNull())
336   {
337     myNextInChain->myPrevInChain = this;
338   }
339   updateChainLen();
340 }