22c96645480fe988fda62bcac616c04d5d64cc6f
[occt.git] / src / XCAFPrs / XCAFPrs_Style.hxx
1 // Created on: 2000-08-11
2 // Created by: Andrey BETENEV
3 // Copyright (c) 2000-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 #ifndef _XCAFPrs_Style_HeaderFile
17 #define _XCAFPrs_Style_HeaderFile
18
19 #include <Standard.hxx>
20 #include <Standard_DefineAlloc.hxx>
21 #include <Standard_Handle.hxx>
22 #include <Quantity_ColorRGBAHasher.hxx>
23 #include <XCAFDoc_VisMaterial.hxx>
24
25 //! Represents a set of styling settings applicable to a (sub)shape
26 class XCAFPrs_Style 
27 {
28 public:
29
30   DEFINE_STANDARD_ALLOC
31
32   //! Empty constructor - colors are unset, visibility is TRUE.
33   Standard_EXPORT XCAFPrs_Style();
34
35   //! Return TRUE if style is empty - does not override any properties.
36   Standard_Boolean IsEmpty() const
37   {
38     return !myHasColorSurf
39         && !myHasColorCurv
40         &&  myMaterial.IsNull()
41         &&  myIsVisible;
42   }
43
44   //! Return material.
45   const Handle(XCAFDoc_VisMaterial)& Material() const { return myMaterial; }
46
47   //! Set material.
48   void SetMaterial (const Handle(XCAFDoc_VisMaterial)& theMaterial) { myMaterial = theMaterial; }
49
50   //! Return TRUE if surface color has been defined.
51   Standard_Boolean IsSetColorSurf() const { return myHasColorSurf; }
52
53   //! Return surface color.
54   const Quantity_Color& GetColorSurf() const { return myColorSurf.GetRGB(); }
55
56   //! Set surface color.
57   void SetColorSurf (const Quantity_Color& theColor) { SetColorSurf  (Quantity_ColorRGBA (theColor)); }
58
59   //! Return surface color.
60   const Quantity_ColorRGBA& GetColorSurfRGBA() const { return myColorSurf; }
61
62   //! Set surface color.
63   Standard_EXPORT void SetColorSurf  (const Quantity_ColorRGBA& theColor);
64
65   //! Manage surface color setting
66   Standard_EXPORT void UnSetColorSurf();
67   
68   //! Return TRUE if curve color has been defined.
69   Standard_Boolean IsSetColorCurv() const { return myHasColorCurv; }
70
71   //! Return curve color.
72   const Quantity_Color& GetColorCurv() const { return myColorCurv; }
73
74   //! Set curve color.
75   Standard_EXPORT void SetColorCurv (const Quantity_Color& col);
76   
77   //! Manage curve color setting
78   Standard_EXPORT void UnSetColorCurv();
79
80   //! Assign visibility.
81   void SetVisibility (const Standard_Boolean theVisibility) { myIsVisible = theVisibility; }
82
83   //! Manage visibility.
84   Standard_Boolean IsVisible() const { return myIsVisible; }
85
86   //! Return base color texture.
87   const Handle(Image_Texture)& BaseColorTexture() const
88   {
89     static const Handle(Image_Texture) THE_NULL_TEXTURE;
90     if (myMaterial.IsNull())
91     {
92       return THE_NULL_TEXTURE;
93     }
94     else if (myMaterial->HasPbrMaterial()
95          && !myMaterial->PbrMaterial().BaseColorTexture.IsNull())
96     {
97       return myMaterial->PbrMaterial().BaseColorTexture;
98     }
99     else if (myMaterial->HasCommonMaterial()
100          && !myMaterial->CommonMaterial().DiffuseTexture.IsNull())
101     {
102       return myMaterial->CommonMaterial().DiffuseTexture;
103     }
104     return THE_NULL_TEXTURE;
105   }
106
107   //! Returns True if styles are the same
108   //! Methods for using Style as key in maps
109   Standard_Boolean IsEqual (const XCAFPrs_Style& theOther) const
110   {
111     if (myIsVisible != theOther.myIsVisible)
112     {
113       return false;
114     }
115     else if (!myIsVisible)
116     {
117       return true;
118     }
119
120     return myHasColorSurf == theOther.myHasColorSurf
121         && myHasColorCurv == theOther.myHasColorCurv
122         && myMaterial == theOther.myMaterial
123         && (!myHasColorSurf || myColorSurf == theOther.myColorSurf)
124         && (!myHasColorCurv || myColorCurv == theOther.myColorCurv);
125   }
126
127   //! Returns True if styles are the same.
128   Standard_Boolean operator== (const XCAFPrs_Style& theOther) const
129   {
130     return IsEqual (theOther);
131   }
132
133   //! Computes a hash code for the given set of styling settings, in the range [1, theUpperBound]
134   //! @param theStyle the set of styling settings which hash code is to be computed
135   //! @param theUpperBound the upper bound of the range a computing hash code must be within
136   //! @return a computed hash code, in the range [1, theUpperBound]
137   static Standard_Integer HashCode (const XCAFPrs_Style& theStyle, const Standard_Integer theUpperBound)
138   {
139     if (!theStyle.myIsVisible)
140     {
141       return 1;
142     }
143
144     Standard_Integer aHashCode = 0;
145     if (theStyle.myHasColorSurf)
146     {
147       aHashCode = aHashCode ^ Quantity_ColorRGBAHasher::HashCode (theStyle.myColorSurf, theUpperBound);
148     }
149     if (theStyle.myHasColorCurv)
150     {
151       aHashCode = aHashCode ^ Quantity_ColorHasher::HashCode (theStyle.myColorCurv, theUpperBound);
152     }
153     if (!theStyle.myMaterial.IsNull())
154     {
155       aHashCode = aHashCode ^ ::HashCode (theStyle.myMaterial, theUpperBound);
156     }
157     return ::HashCode (aHashCode, theUpperBound);
158   }
159
160   //! Returns True when the two keys are the same.
161   static Standard_Boolean IsEqual (const XCAFPrs_Style& theS1, const XCAFPrs_Style& theS2)
162   {
163     return theS1.IsEqual (theS2);
164   }
165
166   //! Dumps the content of me into the stream
167   Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;
168
169 protected:
170
171   Handle(XCAFDoc_VisMaterial) myMaterial;
172   Quantity_ColorRGBA myColorSurf;
173   Quantity_Color     myColorCurv;
174   Standard_Boolean   myHasColorSurf;
175   Standard_Boolean   myHasColorCurv;
176   Standard_Boolean   myIsVisible;
177
178 };
179
180 #endif // _XCAFPrs_Style_HeaderFile