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