00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035
00036
00037
00038
00039
00040
00041 #ifndef OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITETRAITS_HH
00042 #define OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITETRAITS_HH
00043
00044
00045
00046
00047 #include <map>
00048 #include <OpenMesh/Core/Mesh/Traits.hh>
00049
00050
00051
00052 namespace OpenMesh {
00053 namespace Subdivider {
00054 namespace Adaptive {
00055
00056
00057
00058
00062
00063
00064
00065
00068 struct CompositeTraits : public OpenMesh::DefaultTraits
00069 {
00070 typedef int state_t;
00071 typedef bool final_t;
00072
00073
00075 struct State
00076 {
00077 int state : 31;
00078 unsigned final : 1;
00079 };
00080
00081
00082
00083
00084 FaceAttributes( OpenMesh::Attributes::Normal );
00085
00086
00087 VertexAttributes( OpenMesh::Attributes::Normal );
00088
00089
00090 HalfedgeAttributes( OpenMesh::Attributes::PrevHalfedge );
00091
00092
00093
00094 FaceTraits
00095 {
00096
00097 private:
00098
00099 typedef typename Refs::Point Point;
00100 typedef typename Refs::HalfedgeHandle HalfedgeHandle;
00101 typedef std::map<state_t, Point> PositionHistory;
00102
00103 State state_;
00104 HalfedgeHandle red_halfedge_;
00105
00106 PositionHistory pos_map_;
00107
00108 public:
00109
00110
00111 state_t state() const { return state_t(state_.state); }
00112 void set_state(const state_t _s) { state_.state = _s; }
00113 void inc_state() { ++state_.state; }
00114
00115
00116 final_t final() const { return final_t(state_.final); }
00117 void set_final() { state_.final = true; }
00118 void set_not_final() { state_.final = false; }
00119
00120
00121 const HalfedgeHandle& red_halfedge() const { return red_halfedge_; }
00122 void set_red_halfedge(const HalfedgeHandle& _h) { red_halfedge_ = _h; }
00123
00124
00125 void set_position(const int& _i, const Point& _p) { pos_map_[_i] = _p; }
00126 const Point position(const int& _i) {
00127 if (pos_map_.find(_i) != pos_map_.end())
00128 return pos_map_[_i];
00129 else {
00130
00131 if (_i <= 0) {
00132 return Point(0.0, 0.0, 0.0);
00133 }
00134
00135 return position(_i - 1);
00136 }
00137 }
00138 };
00139
00140
00141 EdgeTraits
00142 {
00143
00144 private:
00145
00146 typedef typename Refs::Point Point;
00147 typedef std::map<state_t, Point> PositionHistory;
00148
00149 State state_;
00150 PositionHistory pos_map_;
00151
00152 public:
00153
00154 typedef typename Refs::Scalar Scalar;
00155
00156
00157
00158
00159 state_t state() const { return state_t(state_.state); }
00160 void set_state(const state_t _s) { state_.state = _s; }
00161 void inc_state() { ++state_.state; }
00162
00163
00164 final_t final() const { return final_t(state_.final); }
00165 void set_final() { state_.final = true; }
00166 void set_not_final() { state_.final = false; }
00167
00168
00169 void set_position(const int& _i, const Point& _p) { pos_map_[_i] = _p; }
00170
00171 const Point position(const int& _i) {
00172
00173 if (pos_map_.find(_i) != pos_map_.end())
00174 return pos_map_[_i];
00175 else
00176 {
00177 if (_i <= 0)
00178 {
00179 const Point zero_point(0.0, 0.0, 0.0);
00180 return zero_point;
00181 }
00182
00183 return position(_i - 1);
00184 }
00185 }
00186 };
00187
00188
00189 VertexTraits
00190 {
00191
00192 private:
00193
00194 typedef typename Refs::Point Point;
00195 typedef std::map<state_t, Point> PositionHistory;
00196
00197 State state_;
00198 PositionHistory pos_map_;
00199
00200 public:
00201
00202
00203 state_t state() const { return state_.state; }
00204 void set_state(const state_t _s) { state_.state = _s; }
00205 void inc_state() { ++state_.state; }
00206
00207
00208
00209 final_t final() const { return state_.final; }
00210 void set_final() { state_.final = true; }
00211 void set_not_final() { state_.final = false; }
00212
00213
00214 void set_position(const int& _i, const Point& _p) { pos_map_[_i] = _p; }
00215 const Point position(const int& _i) {
00216
00217 if (pos_map_.find(_i) != pos_map_.end())
00218
00219 return pos_map_[_i];
00220
00221 else {
00222
00223 if (_i <= 0) {
00224
00225 const Point zero_point(0.0, 0.0, 0.0);
00226 return zero_point;
00227 }
00228
00229 return position(_i - 1);
00230 }
00231 }
00232 };
00233 };
00234
00235
00236
00237 typedef CompositeTraits::state_t state_t;
00238 typedef CompositeTraits::final_t final_t;
00239 typedef CompositeTraits::State State;
00240
00241
00242 }
00243 }
00244 }
00245
00246 #endif // OPENMESH_SUBDIVIDER_ADAPTIVE_COMPOSITETRAITS_HH defined
00247