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