0028107: Visualization - provide a flexible interface to set custom hatch styles
[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     const 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 (aMaterial.Color());
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   myPlane      (0.0, 0.0, 1.0, 0.0),
49   myEquation   (0.0, 0.0, 1.0, 0.0),
50   myFlags      (Graphic3d_CappingFlags_None),
51   myEquationMod(0),
52   myAspectMod  (0),
53   myIsOn       (Standard_True),
54   myIsCapping  (Standard_False)
55 {
56   makeId();
57 }
58
59 // =======================================================================
60 // function : Graphic3d_ClipPlane
61 // purpose  :
62 // =======================================================================
63 Graphic3d_ClipPlane::Graphic3d_ClipPlane(const Equation& theEquation)
64 : myAspect     (defaultAspect()),
65   myPlane      (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.w()),
66   myEquation   (theEquation),
67   myFlags      (Graphic3d_CappingFlags_None),
68   myEquationMod(0),
69   myAspectMod  (0),
70   myIsOn       (Standard_True),
71   myIsCapping  (Standard_False)
72 {
73   makeId();
74 }
75
76 // =======================================================================
77 // function : Graphic3d_ClipPlane
78 // purpose  :
79 // =======================================================================
80 Graphic3d_ClipPlane::Graphic3d_ClipPlane(const Graphic3d_ClipPlane& theOther)
81 : Standard_Transient(theOther),
82   myAspect     (defaultAspect()),
83   myPlane      (theOther.myPlane),
84   myEquation   (theOther.myEquation),
85   myFlags      (theOther.myFlags),
86   myEquationMod(0),
87   myAspectMod  (0),
88   myIsOn       (theOther.myIsOn),
89   myIsCapping  (theOther.myIsCapping)
90 {
91   makeId();
92   *myAspect = *theOther.CappingAspect();
93 }
94
95 // =======================================================================
96 // function : Graphic3d_ClipPlane
97 // purpose  :
98 // =======================================================================
99 Graphic3d_ClipPlane::Graphic3d_ClipPlane(const gp_Pln& thePlane)
100 : myAspect     (defaultAspect()),
101   myPlane      (thePlane),
102   myFlags      (Graphic3d_CappingFlags_None),
103   myEquationMod(0),
104   myAspectMod  (0),
105   myIsOn       (Standard_True),
106   myIsCapping  (Standard_False)
107 {
108   thePlane.Coefficients (myEquation[0], myEquation[1], myEquation[2], myEquation[3]);
109   makeId();
110 }
111
112 // =======================================================================
113 // function : SetEquation
114 // purpose  :
115 // =======================================================================
116 void Graphic3d_ClipPlane::SetEquation (const Equation& theEquation)
117 {
118   myPlane = gp_Pln (theEquation.x(), theEquation.y(), theEquation.z(), theEquation.w());
119   myEquation = theEquation;
120   myEquationMod++;
121 }
122
123 // =======================================================================
124 // function : SetPlane
125 // purpose  :
126 // =======================================================================
127 void Graphic3d_ClipPlane::SetEquation (const gp_Pln& thePlane)
128 {
129   myPlane = thePlane;
130   thePlane.Coefficients (myEquation[0],
131                          myEquation[1],
132                          myEquation[2],
133                          myEquation[3]);
134   myEquationMod++;
135 }
136
137 // =======================================================================
138 // function : SetOn
139 // purpose  :
140 // =======================================================================
141 void Graphic3d_ClipPlane::SetOn (const Standard_Boolean theIsOn)
142 {
143   myIsOn = theIsOn;
144 }
145
146 // =======================================================================
147 // function : SetCapping
148 // purpose  :
149 // =======================================================================
150 void Graphic3d_ClipPlane::SetCapping (const Standard_Boolean theIsOn)
151 {
152   myIsCapping = theIsOn;
153 }
154
155 // =======================================================================
156 // function : Clone
157 // purpose  :
158 // =======================================================================
159 Handle(Graphic3d_ClipPlane) Graphic3d_ClipPlane::Clone() const
160 {
161   return new Graphic3d_ClipPlane(*this);
162 }
163
164 // =======================================================================
165 // function : SetCappingMaterial
166 // purpose  :
167 // =======================================================================
168 void Graphic3d_ClipPlane::SetCappingMaterial (const Graphic3d_MaterialAspect& theMat)
169 {
170   myAspect->SetFrontMaterial (theMat);
171   myAspect->SetInteriorColor (theMat.Color());
172   ++myAspectMod;
173 }
174
175 // =======================================================================
176 // function : SetCappingTexture
177 // purpose  :
178 // =======================================================================
179 void Graphic3d_ClipPlane::SetCappingTexture (const Handle(Graphic3d_TextureMap)& theTexture)
180 {
181   myAspect->SetTextureMap (theTexture);
182   if (!theTexture.IsNull())
183   {
184     myAspect->SetTextureMapOn();
185   }
186   else
187   {
188     myAspect->SetTextureMapOff();
189   }
190   ++myAspectMod;
191 }
192
193 // =======================================================================
194 // function : SetCappingHatch
195 // purpose  :
196 // =======================================================================
197 void Graphic3d_ClipPlane::SetCappingHatch (const Aspect_HatchStyle theStyle)
198 {
199   myAspect->SetHatchStyle (theStyle);
200   ++myAspectMod;
201 }
202
203 // =======================================================================
204 // function : SetCappingCustomHatch
205 // purpose  :
206 // =======================================================================
207 void Graphic3d_ClipPlane::SetCappingCustomHatch (const Handle(Graphic3d_HatchStyle)& theStyle)
208 {
209   myAspect->SetHatchStyle (theStyle);
210   ++myAspectMod;
211 }
212
213 // =======================================================================
214 // function : SetCappingHatchOn
215 // purpose  :
216 // =======================================================================
217 void Graphic3d_ClipPlane::SetCappingHatchOn()
218 {
219   myAspect->SetInteriorStyle (Aspect_IS_HATCH);
220   ++myAspectMod;
221 }
222
223 // =======================================================================
224 // function : SetCappingHatchOff
225 // purpose  :
226 // =======================================================================
227 void Graphic3d_ClipPlane::SetCappingHatchOff()
228 {
229   myAspect->SetInteriorStyle (Aspect_IS_SOLID);
230   ++myAspectMod;
231 }
232
233 // =======================================================================
234 // function : SetCappingAspect
235 // purpose  :
236 // =======================================================================
237 void Graphic3d_ClipPlane::SetCappingAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect)
238 {
239   myAspect = theAspect;
240   ++myAspectMod;
241 }
242
243 // =======================================================================
244 // function : setCappingFlag
245 // purpose  :
246 // =======================================================================
247 void Graphic3d_ClipPlane::setCappingFlag (bool theToUse, int theFlag)
248 {
249   if (theToUse)
250   {
251     myFlags |= theFlag;
252   }
253   else
254   {
255     myFlags &= ~(theFlag);
256   }
257   ++myAspectMod;
258 }
259
260 // =======================================================================
261 // function : makeId
262 // purpose  :
263 // =======================================================================
264 void Graphic3d_ClipPlane::makeId()
265 {
266   myId = TCollection_AsciiString ("Graphic3d_ClipPlane_") //DynamicType()->Name()
267        + TCollection_AsciiString (Standard_Atomic_Increment (&THE_CLIP_PLANE_COUNTER));
268 }