From 0fd4e977e5acce500e03ff28e2975e19f8a7dbd2 Mon Sep 17 00:00:00 2001 From: cnr-isti-vclab Date: Tue, 15 May 2007 15:00:47 +0000 Subject: [PATCH] Moved the dreawing code to trackmodes, some other minor changes --- wrap/gui/trackball.cpp | 149 ++++++++++++++++++++++++----------------- wrap/gui/trackball.h | 58 ++++++++-------- 2 files changed, 117 insertions(+), 90 deletions(-) diff --git a/wrap/gui/trackball.cpp b/wrap/gui/trackball.cpp index 3a151fa5..eccfadd4 100644 --- a/wrap/gui/trackball.cpp +++ b/wrap/gui/trackball.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.18 2007/02/26 01:30:02 cignoni +Added reflection Name + Revision 1.17 2007/01/15 15:04:15 tarini added "ToAscii" and "SetFromAscii" methods to load/store current trackball status from/to ascii strings (intended uses: clipboard operations and comments inside png snapshots!) @@ -86,9 +89,8 @@ Adding copyright. #include #include -using namespace vcg; -#include //debug! +using namespace vcg; using namespace std; Transform::Transform() { @@ -97,26 +99,32 @@ Transform::Transform() { center=Point3f(0,0,0); } -Trackball::Trackball(): current_button(0), current_mode(NULL), +Trackball::Trackball(): current_button(0), current_mode(NULL), inactive_mode(NULL), dragging(false), spinnable(true), spinning(false), - history_size(10) { - //here we add mode - modes[0] = NULL; - modes[BUTTON_LEFT] = new SphereMode(); - modes[BUTTON_LEFT | KEY_CTRL] = new PlaneMode(Plane3f(0, Point3f(1, 0, 0))); - modes[BUTTON_MIDDLE] = new PlaneMode(Plane3f(0, Point3f(1, 0, 0))); - modes[BUTTON_LEFT | KEY_SHIFT] = new ScaleMode(); - modes[BUTTON_LEFT | KEY_ALT ] = new ZMode(); - modes[WHEEL] = new ScaleMode(); - SetCurrentAction(); + history_size(10){ + setDefaultMapping (); } Trackball::~Trackball() { - map::iterator i; + //map::iterator i; //for(i = modes.begin(); i != modes.end(); i++) // delete (*i).second; } + +void Trackball::setDefaultMapping () { + inactive_mode = new InactiveMode (); + modes.clear (); + modes[0] = NULL; + modes[BUTTON_LEFT] = new SphereMode (); + modes[BUTTON_LEFT | KEY_CTRL] = new PanMode (); + modes[BUTTON_MIDDLE] = new PanMode (); + modes[BUTTON_LEFT | KEY_SHIFT] = new ScaleMode (); + modes[BUTTON_LEFT | KEY_ALT] = new ZMode (); + modes[WHEEL] = new ScaleMode (); + SetCurrentAction (); +} + void Trackball::SetIdentity() { track.SetIdentity(); Reset(); @@ -129,41 +137,30 @@ void Trackball::GetView() { camera.GetView(); } +// the drawing code has been moved to the trackmodes void Trackball::DrawPostApply() { - glPushMatrix(); + if(current_mode !=NULL){ + current_mode->Draw(this); + }else{ + assert(inactive_mode != NULL); + inactive_mode->Draw(this); + } +} - glTranslate(center); - glMultMatrix(track.InverseMatrix()); - Matrix44f r; - track.rot.ToMatrix(r); - glMultMatrix(r); - DrawIcon(); - - glTranslate(-center); -glMultMatrix(track.Matrix()); +void Trackball::Apply () { + glTranslate (center); + glMultMatrix (track.Matrix ()); + glTranslate (-center); } void Trackball::Apply(bool ToDraw) { - glTranslate(center); - if(ToDraw) - { - if(DH.DrawTrack) { - glBegin(GL_LINE_STRIP); - for(vector::iterator vi=Hits.begin();vi!=Hits.end();++vi) - glVertex(*vi); - glEnd(); - } - glPushMatrix(); - Matrix44f r; - track.rot.ToMatrix(r); - glMultMatrix(r); - DrawIcon(); - glPopMatrix(); + Apply(); + if(ToDraw){ + DrawPostApply(); } - glMultMatrix(track.Matrix()); - glTranslate(-center); } + void Trackball::ApplyInverse() { glTranslate(center); glMultMatrix(track.InverseMatrix()); @@ -183,7 +180,9 @@ void Trackball::Translate(Point3f tr) } /***************************************************************/ - +// DrawCircle () e DrawPlane() have been moved to trackutils.h +// the drawing code has been moved to the trackmodes +/* void Trackball::DrawCircle() { int nside=DH.CircleStep; const double pi2=3.14159265*2.0; @@ -210,6 +209,7 @@ void Trackball::DrawPlane() { } glEnd(); } +*/ void Trackball::ToAscii(char* result){ float * f = (float*) &track; @@ -226,6 +226,9 @@ bool Trackball::SetFromAscii(char * st){ } +// DrawPlaneHandle() e DrawIcon() have been moved to trackutils.h +// the drawing code has been moved to the trackmodes +/* void Trackball::DrawPlaneHandle() { float r=1.0; float dr=r/10.0f; @@ -286,10 +289,19 @@ void Trackball::DrawIcon() { glPopMatrix(); } +*/ void Trackball::Reset() { track.SetIdentity(); -} + map::iterator i; + for(i = modes.begin(); i != modes.end(); i++){ + TrackMode * mode=(*i).second; + if(mode!=NULL) + mode->Reset(); + } + assert(inactive_mode != NULL); + inactive_mode->Reset(); + } //interface void Trackball::MouseDown(int button) { @@ -317,14 +329,32 @@ void Trackball::MouseUp(int /* x */, int /* y */, int button) { current_button &= (~button); SetCurrentAction(); } - // it assumes that a notch of 1.0 is a single step of the wheel + +// it assumes that a notch of 1.0 is a single step of the wheel void Trackball::MouseWheel(float notch ) { if(current_mode == NULL) { - SphereMode tm; - tm.TrackMode::Apply(this, notch); - } else - current_mode->Apply(this, notch); + //SphereMode tm; + //tm.TrackMode::Apply(this, notch); + ScaleMode scalemode; + scalemode.Apply (this, notch); + } else{ + current_mode->Apply(this, notch); + } +} + +void Trackball::MouseWheel (float notch, int button) +{ + current_button |= button; + SetCurrentAction (); + if (current_mode == NULL) { + ScaleMode scalemode; + scalemode.Apply (this, notch); + } else { + current_mode->Apply (this, notch); + } + current_button &= (~button); + SetCurrentAction (); } void Trackball::ButtonDown(Trackball::Button button) { @@ -337,8 +367,6 @@ void Trackball::ButtonUp(Trackball::Button button) { SetCurrentAction(); } - - //spinning interface void Trackball::SetSpinnable(bool /* on*/ ){} bool Trackball::IsSpinnable() { @@ -350,23 +378,25 @@ bool Trackball::IsSpinning() { return spinning; } -//interfaccia navigation: +//navigation interface: void Trackball::Back(){} void Trackball::Forward(){} void Trackball::Home(){} -void Trackball::HistorySize(int /* lenght */){} +void Trackball::HistorySize(int /* length */){} -void Trackball::SetCurrentAction() { +void Trackball::SetCurrentAction () +{ //I use strict matching. - assert(modes.count(0)); - if(!modes.count(current_button)) + assert (modes.count (0)); + if (!modes.count (current_button)) { current_mode = NULL; - else + } else { current_mode = modes[current_button]; - - last_point = Point3f(0, 0, -1); + if(current_mode != NULL) + current_mode->SetAction(); + } + last_point = Point3f (0, 0, -1); last_track = track; - // last_view = view; } ////return center of trackball in Window coordinates. @@ -389,4 +419,3 @@ void Trackball::SetCurrentAction() { // return m; //} - diff --git a/wrap/gui/trackball.h b/wrap/gui/trackball.h index 7cba4d6c..c4b571bf 100644 --- a/wrap/gui/trackball.h +++ b/wrap/gui/trackball.h @@ -25,6 +25,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.13 2007/02/26 01:30:02 cignoni +Added reflection Name + Revision 1.12 2007/01/15 15:04:15 tarini added "ToAscii" and "SetFromAscii" methods to load/store current trackball status from/to ascii strings (intended uses: clipboard operations and comments inside png snapshots!) @@ -134,9 +137,9 @@ namespace vcg { Transform(); Similarityf track; - /// la posizione della track nello spazio di modello. il defgault e' 000 + /// track position in model space. default is 0,0,0 Point3f center; - /// size of the widget in spazio di modello. + /// size of the widget in model space. float radius; }; @@ -145,27 +148,10 @@ namespace vcg { class TrackMode; class Trackball: public Transform { public: - class DrawingHint - { - public: - DrawingHint() { - CircleStep=64; - HideStill=false; - DrawTrack=false; - LineWidthStill=0.5f; - LineWidthMoving=1.5f; - color=Color4b::LightBlue; - } +// the drawing code has been moved to the trackmodes +// class DrawingHint { - int CircleStep; - bool HideStill,DrawTrack; - Color4b color; - float LineWidthStill; - float LineWidthMoving; - }; - - - DrawingHint DH; +// DrawingHint DH; enum Button { BUTTON_NONE = 0x0000, @@ -183,23 +169,26 @@ namespace vcg { void SetIdentity(); void SetPosition(const Point3f &c, int millisec = 0); void SetScale(const float s) {radius=s;}; - void SetTransform(const Transform &transform, int miilisec = 0); + void SetTransform(const Transform &transform, int millisec = 0); void Translate(Point3f tr); void Scale(const float f); //operating void GetView(); - void Apply(bool Draw=true); + void Apply(bool Draw); + void Apply (); void DrawPostApply(); void ApplyInverse(); - void DrawIcon(); + // DrawIcon() has been moved to trackutils.h + //void DrawIcon(); void Reset(); - - // Internal Drawing stuff - void DrawCircle (); - void DrawPlane(); - void DrawPlaneHandle(); + + // DrawCircle (), DrawPlane(), DrawPlaneHandle() has been moved to trackutils.h + // the drawing code has been moved to the trackmodes + // void DrawCircle (); + // void DrawPlane(); + // void DrawPlaneHandle(); //interface void MouseDown(/*Button*/ int button); @@ -207,6 +196,7 @@ namespace vcg { void MouseMove(int x, int y); void MouseUp(int x, int y, /*Button */ int button); void MouseWheel(float notch); // it assumes that a notch of 1.0 is a single step of the wheel + void MouseWheel (float notch, /*Button */ int button); void ButtonUp(Button button); void ButtonDown(Button button); @@ -253,7 +243,15 @@ namespace vcg { int current_button; TrackMode *current_mode; + + // inactive_mode is used to draw the inactive trackball + // can be assigned, for example, to draw an area or a path + // even when the user is not interacting with it + TrackMode *inactive_mode; + // reset modes to default mapping. + void setDefaultMapping (); + std::map modes; Similarityf last_track;