1 /* This file is part of Dilay
2  * Copyright © 2015-2018 Alexander Bau
3  * Use and redistribute under the terms of the GNU General Public License
4  */
5 #ifndef DILAY_TOOL_SCULPT_BRUSH
6 #define DILAY_TOOL_SCULPT_BRUSH
7 
8 #include <glm/glm.hpp>
9 #include "macro.hpp"
10 #include "maybe.hpp"
11 
12 class DynamicFaces;
13 class DynamicMesh;
14 class PrimPlane;
15 class PrimSphere;
16 class SculptBrush;
17 
18 class SBParameters
19 {
20 public:
~SBParameters()21   virtual ~SBParameters () {}
22 
intensity() const23   virtual float intensity () const { return 0.0f; }
24 
intensity(float)25   virtual void intensity (float) {}
26 
useLastPos() const27   virtual bool useLastPos () const { return false; }
28 
discardBack() const29   virtual bool discardBack () const { return true; }
30 
reduce() const31   virtual bool reduce () const { return false; }
32 
mirror(const PrimPlane &)33   virtual void mirror (const PrimPlane&) {}
34 
35   virtual void sculpt (const SculptBrush&, const DynamicFaces&) const = 0;
36 };
37 
38 class SBIntensityParameter : virtual public SBParameters
39 {
40 public:
SBIntensityParameter()41   SBIntensityParameter ()
42     : _intensity (0.0f)
43   {
44   }
45 
46   MEMBER_GETTER_SETTER (float, intensity);
47 };
48 
49 class SBInvertParameter : virtual public SBParameters
50 {
51 public:
SBInvertParameter()52   SBInvertParameter ()
53     : _invert (false)
54   {
55   }
56 
toggleInvert()57   void toggleInvert () { this->_invert = !this->_invert; }
58 
invert(const glm::vec3 & v) const59   glm::vec3 invert (const glm::vec3& v) const { return this->_invert ? -v : v; }
60 
61   MEMBER_GETTER_SETTER (bool, invert);
62 };
63 
64 class SBDiscardBackParameter : virtual public SBParameters
65 {
66 public:
SBDiscardBackParameter()67   SBDiscardBackParameter ()
68     : _discardBack (true)
69   {
70   }
71 
discardBack() const72   bool discardBack () const override { return this->_discardBack; }
discardBack(bool d)73   void discardBack (bool d) { this->_discardBack = d; }
74 
75 private:
76   bool _discardBack;
77 };
78 
79 class SBDrawParameters : public SBIntensityParameter, public SBInvertParameter
80 {
81 public:
SBDrawParameters()82   SBDrawParameters ()
83     : _flat (true)
84   {
85   }
86 
87   void sculpt (const SculptBrush&, const DynamicFaces&) const;
88 
89   MEMBER_GETTER_SETTER (bool, flat);
90   MEMBER_GETTER_SETTER (bool, constantHeight);
91 };
92 
93 class SBGrablikeParameters : public SBDiscardBackParameter
94 {
95 public:
96   void sculpt (const SculptBrush&, const DynamicFaces&) const override;
97 
useLastPos() const98   bool useLastPos () const override { return true; }
99 };
100 
101 class SBSmoothParameters : public SBIntensityParameter
102 {
103 public:
104   void sculpt (const SculptBrush&, const DynamicFaces&) const;
105 };
106 
107 class SBReduceParameters : public SBIntensityParameter
108 {
109 public:
reduce() const110   bool reduce () const override { return true; }
111 
112   void sculpt (const SculptBrush&, const DynamicFaces&) const override;
113 };
114 
115 class SBFlattenParameters : public SBIntensityParameter
116 {
117 public:
118   SBFlattenParameters ();
119 
120   void sculpt (const SculptBrush&, const DynamicFaces&) const override;
121 
122   bool             hasLockedPlane () const;
123   const PrimPlane& lockedPlane () const;
124   void             lockedPlane (const PrimPlane& p);
125   void             resetLockedPlane ();
126   void             mirror (const PrimPlane&) override;
127 
128   MEMBER_GETTER_SETTER (bool, lockPlane);
129 
130 private:
131   Maybe<PrimPlane> _lockedPlane;
132 };
133 
134 class SBCreaseParameters : public SBIntensityParameter, public SBInvertParameter
135 {
136 public:
137   void sculpt (const SculptBrush&, const DynamicFaces&) const;
138 };
139 
140 class SBPinchParameters : public SBInvertParameter
141 {
142 public:
143   void sculpt (const SculptBrush&, const DynamicFaces&) const;
144 };
145 
146 class SculptBrush
147 {
148 public:
149   DECLARE_BIG3 (SculptBrush)
150 
151   float        radius () const;
152   float        detailFactor () const;
153   float        stepWidthFactor () const;
154   bool         subdivide () const;
155   bool         hasMesh () const;
156   DynamicMesh& mesh () const;
157 
158   void radius (float);
159   void detailFactor (float);
160   void stepWidthFactor (float);
161   void subdivide (bool);
162 
163   float            subdivThreshold () const;
164   const glm::vec3& lastPosition () const;
165   const glm::vec3& position () const;
166   const glm::vec3& normal () const;
167   glm::vec3        delta () const;
168   PrimSphere       sphere () const;
169   float            stepWidth () const;
170   bool             hasPointOfAction () const;
171   void             setPointOfAction (DynamicMesh&, const glm::vec3&, const glm::vec3&);
172   void             resetPointOfAction ();
173   void             mirror (const PrimPlane&);
174 
175   DynamicFaces getAffectedFaces () const;
176   void         sculpt (const DynamicFaces&) const;
177 
initParameters()178   template <typename T> T& initParameters ()
179   {
180     this->parametersPointer (new T ());
181     return this->parameters<T> ();
182   }
183 
parameters()184   template <typename T> T& parameters () { return dynamic_cast<T&> (*this->parametersPointer ()); }
185 
parameters() const186   const SBParameters& parameters () const { return *this->parametersPointer (); }
187 
188 private:
189   SBParameters* parametersPointer () const;
190   void          parametersPointer (SBParameters*);
191 
192   IMPLEMENTATION
193 };
194 
195 #endif
196