00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __SURFACE_WIDGET_DOT_H
00021 #define __SURFACE_WIDGET_DOT_H
00022
00023 #include <signalGutz.h>
00024 #include "WidgetBase.h"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 class SurfaceWidget : public WidgetItem {
00046 public:
00047
00048 enum SURFACE_W_BEHAVIORS {
00049 PICK = WB_LAST + 1,
00050 SW_LAST
00051 };
00052
00053 SurfaceWidget(WidgetItem *parent, float border = 0, bool drawBorder = false);
00054 virtual ~SurfaceWidget() {}
00055
00056
00057
00058
00059
00060
00061 WidgetItem *clone() const
00062 { return cloneSurface(); }
00063
00064
00065
00066 virtual SurfaceWidget *cloneSurface() const = 0;
00067
00068
00069
00070
00071
00072 virtual void setChanged()
00073 {
00074 for(int i=0; i<NODE_LAST; ++i)
00075 pointChanged(i,_corners[i]);
00076 }
00077
00078
00079 SurfaceWidget &operator=(const SurfaceWidget &sw)
00080 {
00081 for(int i=0; i<NODE_LAST; ++i) setPoint(i,sw.getPoint(i));
00082 return *this;
00083 }
00084
00085
00086 enum SURFACE_POINTS {
00087 LL,
00088 LR,
00089 UL,
00090 UR,
00091 NODE_LAST
00092 };
00093
00094 HAS_SLOTS;
00095
00096
00097
00098
00099 gutz::vec3f getPoint(int ptIdx) const
00100 { return _manip->getWorldPosLocal(_corners[ptIdx]); }
00101 void setPoint(int ptIdx, const gutz::vec3f &pt)
00102 {
00103 _invalidate();
00104 {
00105 _corners[ptIdx] = _manip->getLocalPosWorld(pt);
00106 }
00107 _update();
00108 pointChanged(ptIdx, getPoint(ptIdx));
00109 }
00110
00111 gutz::planef getPlane() const
00112 { return gutz::planef(getPoint(LL),
00113 getPoint(LR),
00114 getPoint(UL));
00115 }
00116
00117
00118
00119
00120
00121
00122 void setLL(const gutz::vec3f &ll) { setPoint(LL,ll); }
00123 void setLR(const gutz::vec3f &lr) { setPoint(LR,lr); }
00124 void setUL(const gutz::vec3f &ul) { setPoint(UL,ul); }
00125 void setUR(const gutz::vec3f &ur) { setPoint(UR,ur); }
00126
00127
00128
00129
00130
00131
00132
00133
00134 gutz::Signal<int, const gutz::vec3f &> pointChanged;
00135
00136
00137 gutz::Signal<const gutz::vec3f &> surfacePicked;
00138
00139
00140 gutz::Signal<const gutz::vec3f &> surfacePickMoved;
00141
00142
00143
00144
00145
00146
00147
00148 virtual void applyXform(gutz::mat4f xf)
00149 { for(int i=0; i<NODE_LAST; ++i) _corners[i] = xf * _corners[i]; }
00150
00151
00152
00153
00154
00155 virtual bool mouseDef(const gutz::MouseEvent &me);
00156 virtual bool moveDef(const gutz::MouseMoveEvent &mme);
00157
00158
00159
00160 protected:
00161 gutz::vec3f intersectPlane(const gutz::MouseEvent &me) const;
00162
00163
00164
00165
00166
00167 SurfaceWidget(const SurfaceWidget &sw)
00168 : WidgetItem(sw)
00169 {
00170 for(int i=0; i<NODE_LAST; ++i)
00171 _corners[i] = sw._corners[i];
00172 }
00173
00174
00175 gutz::vec3f _corners[NODE_LAST];
00176
00177
00178 gutz::vec3f _lastPick;
00179
00180 };
00181 typedef gutz::SmartPtr<SurfaceWidget> SurfaceWidgetSP;
00182
00183
00184 #endif
00185
00186