4269bd1b |
1 | // Created on: 2013-07-12 |
2 | // Created by: Anton POLETAEV |
d5f74e42 |
3 | // Copyright (c) 2013-2014 OPEN CASCADE SAS |
4269bd1b |
4 | // |
973c2be1 |
5 | // This file is part of Open CASCADE Technology software library. |
4269bd1b |
6 | // |
d5f74e42 |
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 |
973c2be1 |
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. |
4269bd1b |
12 | // |
973c2be1 |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
4269bd1b |
15 | |
16 | #ifndef _Graphic3d_ClipPlane_HeaderFile |
17 | #define _Graphic3d_ClipPlane_HeaderFile |
18 | |
7c3ef2f7 |
19 | #include <gp_Pln.hxx> |
3e05329c |
20 | #include <Graphic3d_AspectFillArea3d.hxx> |
25c35042 |
21 | #include <Graphic3d_BndBox3d.hxx> |
3e05329c |
22 | #include <Graphic3d_CappingFlags.hxx> |
4269bd1b |
23 | #include <Graphic3d_TextureMap.hxx> |
7c3ef2f7 |
24 | #include <NCollection_Vec4.hxx> |
25 | #include <Standard_Macro.hxx> |
26 | #include <Standard_TypeDef.hxx> |
27 | #include <Standard_Transient.hxx> |
4269bd1b |
28 | |
25c35042 |
29 | //! Clipping state. |
30 | enum Graphic3d_ClipState |
31 | { |
32 | Graphic3d_ClipState_Out, //!< fully outside (clipped) - should be discarded |
33 | Graphic3d_ClipState_In, //!< fully inside (NOT clipped) - should NOT be discarded |
34 | Graphic3d_ClipState_On, //!< on (not clipped / partially clipped) - should NOT be discarded |
35 | }; |
36 | |
37 | //! Container for properties describing either a Clipping halfspace (single Clipping Plane), |
38 | //! or a chain of Clipping Planes defining logical AND (conjunction) operation. |
b859a34d |
39 | //! The plane equation is specified in "world" coordinate system. |
4269bd1b |
40 | class Graphic3d_ClipPlane : public Standard_Transient |
41 | { |
25c35042 |
42 | DEFINE_STANDARD_RTTIEXT(Graphic3d_ClipPlane,Standard_Transient) |
4269bd1b |
43 | public: |
44 | |
25c35042 |
45 | //! Type defining XYZW (ABCD) plane equation - left for compatibility with old code using Graphic3d_ClipPlane::Equation type. |
46 | typedef Graphic3d_Vec4d Equation; |
47 | |
48 | public: |
4269bd1b |
49 | |
50 | //! Default constructor. |
51 | //! Initializes clip plane container with the following properties: |
52 | //! - Equation (0.0, 0.0, 1.0, 0) |
53 | //! - IsOn (True), |
54 | //! - IsCapping (False), |
a966542b |
55 | //! - Material (Graphic3d_NameOfMaterial_DEFAULT), |
4269bd1b |
56 | //! - Texture (NULL), |
57 | //! - HatchStyle (Aspect_HS_HORIZONTAL), |
58 | //! - IsHatchOn (False) |
59 | Standard_EXPORT Graphic3d_ClipPlane(); |
60 | |
61 | //! Copy constructor. |
62 | //! @param theOther [in] the copied plane. |
63 | Standard_EXPORT Graphic3d_ClipPlane(const Graphic3d_ClipPlane& theOther); |
64 | |
65 | //! Construct clip plane for the passed equation. |
66 | //! By default the plane is on, capping is turned off. |
67 | //! @param theEquation [in] the plane equation. |
25c35042 |
68 | Standard_EXPORT Graphic3d_ClipPlane (const Graphic3d_Vec4d& theEquation); |
4269bd1b |
69 | |
b859a34d |
70 | //! Construct clip plane from the passed geometrical definition. |
4269bd1b |
71 | //! By default the plane is on, capping is turned off. |
72 | //! @param thePlane [in] the plane. |
73 | Standard_EXPORT Graphic3d_ClipPlane (const gp_Pln& thePlane); |
74 | |
75 | //! Set plane equation by its geometrical definition. |
b859a34d |
76 | //! The equation is specified in "world" coordinate system. |
4269bd1b |
77 | //! @param thePlane [in] the plane. |
78 | Standard_EXPORT void SetEquation (const gp_Pln& thePlane); |
79 | |
80 | //! Set 4-component equation vector for clipping plane. |
b859a34d |
81 | //! The equation is specified in "world" coordinate system. |
4269bd1b |
82 | //! @param theEquation [in] the XYZW (or "ABCD") equation vector. |
25c35042 |
83 | Standard_EXPORT void SetEquation (const Graphic3d_Vec4d& theEquation); |
4269bd1b |
84 | |
85 | //! Get 4-component equation vector for clipping plane. |
86 | //! @return clipping plane equation vector. |
25c35042 |
87 | const Graphic3d_Vec4d& GetEquation() const { return myEquation; } |
88 | |
89 | //! Get 4-component equation vector for clipping plane. |
90 | //! @return clipping plane equation vector. |
91 | const Graphic3d_Vec4d& ReversedEquation() const { return myEquationRev; } |
4269bd1b |
92 | |
93 | //! Check that the clipping plane is turned on. |
94 | //! @return boolean flag indicating whether the plane is in on or off state. |
95 | Standard_Boolean IsOn() const |
96 | { |
97 | return myIsOn; |
98 | } |
99 | |
100 | //! Change state of the clipping plane. |
101 | //! @param theIsOn [in] the flag specifying whether the graphic driver |
102 | //! clipping by this plane should be turned on or off. |
103 | Standard_EXPORT void SetOn(const Standard_Boolean theIsOn); |
104 | |
105 | //! Change state of capping surface rendering. |
106 | //! @param theIsOn [in] the flag specifying whether the graphic driver should |
107 | //! perform rendering of capping surface produced by this plane. The graphic |
108 | //! driver produces this surface for convex graphics by means of stencil-test |
b859a34d |
109 | //! and multi-pass rendering. |
4269bd1b |
110 | Standard_EXPORT void SetCapping(const Standard_Boolean theIsOn); |
111 | |
112 | //! Check state of capping surface rendering. |
113 | //! @return true (turned on) or false depending on the state. |
114 | Standard_Boolean IsCapping() const |
115 | { |
116 | return myIsCapping; |
117 | } |
118 | |
7c3ef2f7 |
119 | //! Get geometrical definition. |
120 | //! @return geometrical definition of clipping plane |
121 | const gp_Pln& ToPlane() const { return myPlane; } |
4269bd1b |
122 | |
123 | //! Clone plane. Virtual method to simplify copying procedure if plane |
124 | //! class is redefined at application level to add specific fields to it |
125 | //! e.g. id, name, etc. |
126 | //! @return new instance of clipping plane with same properties and attributes. |
127 | Standard_EXPORT virtual Handle(Graphic3d_ClipPlane) Clone() const; |
128 | |
25c35042 |
129 | public: |
130 | |
131 | //! Return TRUE if this item defines a conjunction (logical AND) between a set of Planes. |
132 | //! Graphic3d_ClipPlane item defines either a Clipping halfspace (single Clipping Plane) |
133 | //! or a Clipping volume defined by a logical AND (conjunction) operation between a set of Planes defined as a Chain |
134 | //! (so that the volume cuts a space only in case if check fails for ALL Planes in the Chain). |
135 | //! |
136 | //! Note that Graphic3d_ClipPlane item cannot: |
137 | //! - Define a Chain with logical OR (disjunction) operation; |
138 | //! this should be done through Graphic3d_SequenceOfHClipPlane. |
139 | //! - Define nested Chains. |
140 | //! - Disable Chain items; only entire Chain can be disabled (by disabled a head of Chain). |
141 | //! |
142 | //! The head of a Chain defines all visual properties of the Chain, |
143 | //! so that Graphic3d_ClipPlane of next items in a Chain merely defines only geometrical definition of the plane. |
144 | Standard_Boolean IsChain() const { return !myNextInChain.IsNull(); } |
145 | |
146 | //! Return the previous plane in a Chain of Planes defining logical AND operation, |
147 | //! or NULL if there is no Chain or it is a first element in Chain. |
148 | //! When clipping is defined by a Chain of Planes, |
149 | //! it cuts a space only in case if check fails for all Planes in Chain. |
150 | Handle(Graphic3d_ClipPlane) ChainPreviousPlane() const { return myPrevInChain; } |
151 | |
152 | //! Return the next plane in a Chain of Planes defining logical AND operation, |
153 | //! or NULL if there is no chain or it is a last element in chain. |
154 | |
155 | const Handle(Graphic3d_ClipPlane)& ChainNextPlane() const { return myNextInChain; } |
156 | |
157 | //! Return the number of chains in forward direction (including this item, so it is always >= 1). |
158 | //! For a head of Chain - returns the length of entire Chain. |
159 | Standard_Integer NbChainNextPlanes() const { return myChainLenFwd; } |
160 | |
161 | //! Set the next plane in a Chain of Planes. |
162 | //! This operation also updates relationship between chains (Previous/Next items), |
163 | //! so that the previously set Next plane is cut off. |
164 | Standard_EXPORT void SetChainNextPlane (const Handle(Graphic3d_ClipPlane)& thePlane); |
165 | |
4269bd1b |
166 | public: // @name user-defined graphical attributes |
167 | |
61168418 |
168 | //! Return color for rendering capping surface. |
169 | Quantity_Color CappingColor() const { return myAspect->FrontMaterial().MaterialType() == Graphic3d_MATERIAL_ASPECT ? myAspect->FrontMaterial().Color() : myAspect->InteriorColor(); } |
170 | |
171 | //! Set color for rendering capping surface. |
172 | Standard_EXPORT void SetCappingColor (const Quantity_Color& theColor); |
173 | |
4269bd1b |
174 | //! Set material for rendering capping surface. |
175 | //! @param theMat [in] the material. |
176 | Standard_EXPORT void SetCappingMaterial (const Graphic3d_MaterialAspect& theMat); |
177 | |
178 | //! @return capping material. |
3e05329c |
179 | const Graphic3d_MaterialAspect& CappingMaterial() const { return myAspect->FrontMaterial(); } |
4269bd1b |
180 | |
181 | //! Set texture to be applied on capping surface. |
182 | //! @param theTexture [in] the texture. |
183 | Standard_EXPORT void SetCappingTexture (const Handle(Graphic3d_TextureMap)& theTexture); |
184 | |
185 | //! @return capping texture map. |
cc8cbabe |
186 | Handle(Graphic3d_TextureMap) CappingTexture() const { return !myAspect->TextureSet().IsNull() && !myAspect->TextureSet()->IsEmpty() |
187 | ? myAspect->TextureSet()->First() |
188 | : Handle(Graphic3d_TextureMap)(); } |
4269bd1b |
189 | |
190 | //! Set hatch style (stipple) and turn hatching on. |
191 | //! @param theStyle [in] the hatch style. |
192 | Standard_EXPORT void SetCappingHatch (const Aspect_HatchStyle theStyle); |
193 | |
194 | //! @return hatching style. |
640d5fe2 |
195 | Aspect_HatchStyle CappingHatch() const { return (Aspect_HatchStyle)myAspect->HatchStyle()->HatchType(); } |
196 | |
197 | //! Set custom hatch style (stipple) and turn hatching on. |
198 | //! @param theStyle [in] the hatch pattern. |
199 | Standard_EXPORT void SetCappingCustomHatch (const Handle(Graphic3d_HatchStyle)& theStyle); |
200 | |
201 | //! @return hatching style. |
202 | const Handle(Graphic3d_HatchStyle)& CappingCustomHatch() const { return myAspect->HatchStyle(); } |
4269bd1b |
203 | |
204 | //! Turn on hatching. |
205 | Standard_EXPORT void SetCappingHatchOn(); |
206 | |
207 | //! Turn off hatching. |
208 | Standard_EXPORT void SetCappingHatchOff(); |
209 | |
210 | //! @return True if hatching mask is turned on. |
3e05329c |
211 | Standard_Boolean IsHatchOn() const { return myAspect->InteriorStyle() == Aspect_IS_HATCH; } |
4269bd1b |
212 | |
213 | //! This ID is used for managing associated resources in graphical driver. |
214 | //! The clip plane can be assigned within a range of IO which can be |
215 | //! displayed in separate OpenGl contexts. For each of the context an associated |
216 | //! OpenGl resource for graphical aspects should be created and kept. |
217 | //! The resources are stored in graphical driver for each of individual groups |
218 | //! of shared context under the clip plane identifier. |
219 | //! @return clip plane resource identifier string. |
220 | const TCollection_AsciiString& GetId() const |
221 | { |
222 | return myId; |
223 | } |
224 | |
3e05329c |
225 | public: |
226 | |
227 | //! Return capping aspect. |
4269bd1b |
228 | //! @return capping surface rendering aspect. |
3e05329c |
229 | const Handle(Graphic3d_AspectFillArea3d)& CappingAspect() const { return myAspect; } |
230 | |
231 | //! Assign capping aspect. |
232 | Standard_EXPORT void SetCappingAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect); |
233 | |
234 | //! Flag indicating whether material for capping plane should be taken from object. |
235 | //! Default value: FALSE (use dedicated capping plane material). |
236 | bool ToUseObjectMaterial() const { return (myFlags & Graphic3d_CappingFlags_ObjectMaterial) != 0; } |
237 | |
238 | //! Set flag for controlling the source of capping plane material. |
239 | void SetUseObjectMaterial (bool theToUse) { setCappingFlag (theToUse, Graphic3d_CappingFlags_ObjectMaterial); } |
240 | |
241 | //! Flag indicating whether texture for capping plane should be taken from object. |
242 | //! Default value: FALSE. |
243 | bool ToUseObjectTexture() const { return (myFlags & Graphic3d_CappingFlags_ObjectTexture) != 0; } |
244 | |
245 | //! Set flag for controlling the source of capping plane texture. |
246 | void SetUseObjectTexture (bool theToUse) { setCappingFlag (theToUse, Graphic3d_CappingFlags_ObjectTexture); } |
247 | |
248 | //! Flag indicating whether shader program for capping plane should be taken from object. |
249 | //! Default value: FALSE. |
250 | bool ToUseObjectShader() const { return (myFlags & Graphic3d_CappingFlags_ObjectShader) != 0; } |
251 | |
252 | //! Set flag for controlling the source of capping plane shader program. |
253 | void SetUseObjectShader(bool theToUse) { setCappingFlag (theToUse, Graphic3d_CappingFlags_ObjectShader); } |
254 | |
255 | //! Return true if some fill area aspect properties should be taken from object. |
256 | bool ToUseObjectProperties() const { return myFlags != Graphic3d_CappingFlags_None; } |
4269bd1b |
257 | |
25c35042 |
258 | public: |
259 | |
260 | //! Check if the given point is outside / inside / on section. |
261 | Graphic3d_ClipState ProbePoint (const Graphic3d_Vec4d& thePoint) const |
262 | { |
6f26baa0 |
263 | Graphic3d_ClipState aState = Graphic3d_ClipState_Out; |
25c35042 |
264 | for (const Graphic3d_ClipPlane* aPlaneIter = this; aPlaneIter != NULL; aPlaneIter = aPlaneIter->myNextInChain.get()) |
265 | { |
266 | Graphic3d_ClipState aPlnState = aPlaneIter->ProbePointHalfspace (thePoint); |
6f26baa0 |
267 | if (aPlnState == Graphic3d_ClipState_In) |
25c35042 |
268 | { |
6f26baa0 |
269 | return Graphic3d_ClipState_In; |
25c35042 |
270 | } |
6f26baa0 |
271 | else if (aPlnState != Graphic3d_ClipState_Out) |
25c35042 |
272 | { |
6f26baa0 |
273 | aState = Graphic3d_ClipState_On; |
25c35042 |
274 | } |
275 | } |
6f26baa0 |
276 | return aState; |
25c35042 |
277 | } |
278 | |
279 | //! Check if the given bounding box is fully outside / fully inside. |
280 | Graphic3d_ClipState ProbeBox (const Graphic3d_BndBox3d& theBox) const |
281 | { |
6f26baa0 |
282 | Graphic3d_ClipState aState = Graphic3d_ClipState_Out; |
25c35042 |
283 | for (const Graphic3d_ClipPlane* aPlaneIter = this; aPlaneIter != NULL; aPlaneIter = aPlaneIter->myNextInChain.get()) |
284 | { |
6f26baa0 |
285 | if (aPlaneIter->IsBoxFullInHalfspace (theBox)) |
25c35042 |
286 | { |
6f26baa0 |
287 | // within union operation, if box is entirely inside at least one half-space, others can be ignored |
288 | return Graphic3d_ClipState_In; |
25c35042 |
289 | } |
6f26baa0 |
290 | else if (!aPlaneIter->IsBoxFullOutHalfspace (theBox)) |
25c35042 |
291 | { |
6f26baa0 |
292 | // if at least one full out test fail, clipping state is inconclusive (partially clipped) |
293 | aState = Graphic3d_ClipState_On; |
25c35042 |
294 | } |
295 | } |
6f26baa0 |
296 | return aState; |
25c35042 |
297 | } |
298 | |
8996b449 |
299 | //! Check if the given bounding box is In and touch the clipping planes |
300 | Standard_Boolean ProbeBoxTouch (const Graphic3d_BndBox3d& theBox) const |
301 | { |
302 | for (const Graphic3d_ClipPlane* aPlaneIter = this; aPlaneIter != NULL; aPlaneIter = aPlaneIter->myNextInChain.get()) |
303 | { |
304 | if (aPlaneIter->IsBoxFullInHalfspace (theBox)) |
305 | { |
306 | // within union operation, if box is entirely inside at least one half-space, others can be ignored |
307 | return Standard_False; |
308 | } |
309 | else if (!aPlaneIter->IsBoxFullOutHalfspace (theBox)) |
310 | { |
311 | // the box is not fully out, and not fully in, check is it on (but not intersect) |
312 | if (ProbeBoxMaxPointHalfspace (theBox) != Graphic3d_ClipState_Out) |
313 | { |
314 | return Standard_True; |
315 | } |
316 | } |
317 | } |
318 | return Standard_False; |
319 | } |
320 | |
25c35042 |
321 | public: |
322 | |
323 | //! Check if the given point is outside of the half-space (e.g. should be discarded by clipping plane). |
324 | Graphic3d_ClipState ProbePointHalfspace (const Graphic3d_Vec4d& thePoint) const |
325 | { |
326 | const Standard_Real aVal = myEquation.Dot (thePoint); |
327 | return aVal < 0.0 |
328 | ? Graphic3d_ClipState_Out |
329 | : (aVal == 0.0 |
330 | ? Graphic3d_ClipState_On |
331 | : Graphic3d_ClipState_In); |
332 | } |
333 | |
334 | //! Check if the given bounding box is fully outside / fully inside the half-space. |
335 | Graphic3d_ClipState ProbeBoxHalfspace (const Graphic3d_BndBox3d& theBox) const |
336 | { |
337 | if (IsBoxFullOutHalfspace (theBox)) |
338 | { |
339 | return Graphic3d_ClipState_Out; |
340 | } |
341 | return IsBoxFullInHalfspace (theBox) |
342 | ? Graphic3d_ClipState_In |
343 | : Graphic3d_ClipState_On; |
344 | } |
345 | |
346 | //! Check if the given point is outside of the half-space (e.g. should be discarded by clipping plane). |
347 | bool IsPointOutHalfspace (const Graphic3d_Vec4d& thePoint) const { return ProbePointHalfspace (thePoint) == Graphic3d_ClipState_Out; } |
348 | |
349 | //! Check if the given bounding box is fully outside of the half-space (e.g. should be discarded by clipping plane). |
350 | bool IsBoxFullOutHalfspace (const Graphic3d_BndBox3d& theBox) const |
351 | { |
352 | const Graphic3d_Vec4d aMaxPnt (myEquation.x() > 0.0 ? theBox.CornerMax().x() : theBox.CornerMin().x(), |
353 | myEquation.y() > 0.0 ? theBox.CornerMax().y() : theBox.CornerMin().y(), |
354 | myEquation.z() > 0.0 ? theBox.CornerMax().z() : theBox.CornerMin().z(), |
355 | 1.0); |
356 | return IsPointOutHalfspace (aMaxPnt); |
357 | } |
358 | |
8996b449 |
359 | //! Check if the given bounding box is fully outside of the half-space (e.g. should be discarded by clipping plane). |
360 | Graphic3d_ClipState ProbeBoxMaxPointHalfspace (const Graphic3d_BndBox3d& theBox) const |
361 | { |
362 | const Graphic3d_Vec4d aMaxPnt (myEquation.x() > 0.0 ? theBox.CornerMax().x() : theBox.CornerMin().x(), |
363 | myEquation.y() > 0.0 ? theBox.CornerMax().y() : theBox.CornerMin().y(), |
364 | myEquation.z() > 0.0 ? theBox.CornerMax().z() : theBox.CornerMin().z(), |
365 | 1.0); |
366 | return ProbePointHalfspace (aMaxPnt); |
367 | } |
368 | |
25c35042 |
369 | //! Check if the given bounding box is fully inside (or touches from inside) the half-space (e.g. NOT discarded by clipping plane). |
370 | bool IsBoxFullInHalfspace (const Graphic3d_BndBox3d& theBox) const |
371 | { |
372 | const Graphic3d_Vec4d aMinPnt (myEquation.x() > 0.0 ? theBox.CornerMin().x() : theBox.CornerMax().x(), |
373 | myEquation.y() > 0.0 ? theBox.CornerMin().y() : theBox.CornerMax().y(), |
374 | myEquation.z() > 0.0 ? theBox.CornerMin().z() : theBox.CornerMax().z(), |
375 | 1.0); |
376 | return !IsPointOutHalfspace (aMinPnt); |
377 | } |
378 | |
bc73b006 |
379 | //! Dumps the content of me into the stream |
380 | Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; |
381 | |
b859a34d |
382 | public: // @name modification counters |
4269bd1b |
383 | |
384 | //! @return modification counter for equation. |
385 | unsigned int MCountEquation() const |
386 | { |
387 | return myEquationMod; |
388 | } |
389 | |
390 | //! @return modification counter for aspect. |
391 | unsigned int MCountAspect() const |
392 | { |
393 | return myAspectMod; |
394 | } |
395 | |
396 | private: |
397 | |
3e05329c |
398 | //! Generate unique object id for OpenGL graphic resource manager. |
399 | void makeId(); |
400 | |
401 | //! Set capping flag. |
402 | Standard_EXPORT void setCappingFlag (bool theToUse, int theFlag); |
4269bd1b |
403 | |
25c35042 |
404 | //! Update chain length in backward direction. |
405 | void updateChainLen(); |
406 | |
407 | //! Update inversed plane definition from main plane. |
408 | void updateInversedPlane() |
409 | { |
410 | gp_Pln aPlane = myPlane; |
411 | aPlane.SetAxis (aPlane.Axis().Reversed()); |
412 | aPlane.Coefficients (myEquationRev[0], myEquationRev[1], myEquationRev[2], myEquationRev[3]); |
413 | } |
414 | |
4269bd1b |
415 | private: |
416 | |
3e05329c |
417 | Handle(Graphic3d_AspectFillArea3d) myAspect; //!< fill area aspect |
25c35042 |
418 | Handle(Graphic3d_ClipPlane) myNextInChain; //!< next plane in a chain of planes defining logical AND operation |
419 | Graphic3d_ClipPlane* myPrevInChain; //!< previous plane in a chain of planes defining logical AND operation |
3e05329c |
420 | TCollection_AsciiString myId; //!< resource id |
7c3ef2f7 |
421 | gp_Pln myPlane; //!< plane definition |
25c35042 |
422 | Graphic3d_Vec4d myEquation; //!< plane equation vector |
423 | Graphic3d_Vec4d myEquationRev; //!< reversed plane equation |
424 | Standard_Integer myChainLenFwd; //!< chain length in forward direction (including this item) |
3e05329c |
425 | unsigned int myFlags; //!< capping flags |
3e05329c |
426 | unsigned int myEquationMod; //!< modification counter for equation |
427 | unsigned int myAspectMod; //!< modification counter of aspect |
7c3ef2f7 |
428 | Standard_Boolean myIsOn; //!< state of the clipping plane |
429 | Standard_Boolean myIsCapping; //!< state of graphic driver capping |
4269bd1b |
430 | |
4269bd1b |
431 | }; |
432 | |
494782f6 |
433 | DEFINE_STANDARD_HANDLE (Graphic3d_ClipPlane, Standard_Transient) |
434 | |
4269bd1b |
435 | #endif |