Added one-level undo system and sticky trackmodes.
This commit is contained in:
parent
5ac1f6fe1a
commit
74d325979b
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.19 2007/05/15 15:00:27 benedetti
|
||||||
|
Moved the drawing code to trackmodes, some other minor changes
|
||||||
|
|
||||||
Revision 1.18 2007/02/26 01:30:02 cignoni
|
Revision 1.18 2007/02/26 01:30:02 cignoni
|
||||||
Added reflection Name
|
Added reflection Name
|
||||||
|
|
||||||
|
@ -176,7 +179,7 @@ void Trackball::Translate(Point3f tr)
|
||||||
{
|
{
|
||||||
Matrix44f m;
|
Matrix44f m;
|
||||||
track.rot.ToMatrix(m);
|
track.rot.ToMatrix(m);
|
||||||
track.tra = last_track.tra + Inverse(m)*tr/track.sca;;
|
track.tra = last_track.tra + Inverse(m)*tr/track.sca;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
|
@ -293,6 +296,7 @@ void Trackball::DrawIcon() {
|
||||||
|
|
||||||
void Trackball::Reset() {
|
void Trackball::Reset() {
|
||||||
track.SetIdentity();
|
track.SetIdentity();
|
||||||
|
undo_track = track;
|
||||||
map<int, TrackMode *>::iterator i;
|
map<int, TrackMode *>::iterator i;
|
||||||
for(i = modes.begin(); i != modes.end(); i++){
|
for(i = modes.begin(); i != modes.end(); i++){
|
||||||
TrackMode * mode=(*i).second;
|
TrackMode * mode=(*i).second;
|
||||||
|
@ -305,11 +309,13 @@ void Trackball::Reset() {
|
||||||
|
|
||||||
//interface
|
//interface
|
||||||
void Trackball::MouseDown(int button) {
|
void Trackball::MouseDown(int button) {
|
||||||
|
undo_track = track;
|
||||||
current_button |= button;
|
current_button |= button;
|
||||||
SetCurrentAction();
|
SetCurrentAction();
|
||||||
Hits.clear();
|
Hits.clear();
|
||||||
}
|
}
|
||||||
void Trackball::MouseDown(int x, int y, int button) {
|
void Trackball::MouseDown(int x, int y, int button) {
|
||||||
|
undo_track = track;
|
||||||
current_button |= button;
|
current_button |= button;
|
||||||
SetCurrentAction();
|
SetCurrentAction();
|
||||||
last_point = Point3f((float)x, (float)y, 0);
|
last_point = Point3f((float)x, (float)y, 0);
|
||||||
|
@ -322,16 +328,19 @@ void Trackball::MouseMove(int x, int y) {
|
||||||
last_point = Point3f((float)x, (float)y, 0);
|
last_point = Point3f((float)x, (float)y, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
undo_track = track;
|
||||||
current_mode->Apply(this, Point3f(float(x), float(y), 0));
|
current_mode->Apply(this, Point3f(float(x), float(y), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Trackball::MouseUp(int /* x */, int /* y */, int button) {
|
void Trackball::MouseUp(int /* x */, int /* y */, int button) {
|
||||||
|
undo_track = track;
|
||||||
current_button &= (~button);
|
current_button &= (~button);
|
||||||
SetCurrentAction();
|
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 ) {
|
void Trackball::MouseWheel(float notch ) {
|
||||||
|
undo_track = track;
|
||||||
if(current_mode == NULL)
|
if(current_mode == NULL)
|
||||||
{
|
{
|
||||||
//SphereMode tm;
|
//SphereMode tm;
|
||||||
|
@ -345,6 +354,7 @@ void Trackball::MouseWheel(float notch ) {
|
||||||
|
|
||||||
void Trackball::MouseWheel (float notch, int button)
|
void Trackball::MouseWheel (float notch, int button)
|
||||||
{
|
{
|
||||||
|
undo_track = track;
|
||||||
current_button |= button;
|
current_button |= button;
|
||||||
SetCurrentAction ();
|
SetCurrentAction ();
|
||||||
if (current_mode == NULL) {
|
if (current_mode == NULL) {
|
||||||
|
@ -358,15 +368,42 @@ void Trackball::MouseWheel (float notch, int button)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Trackball::ButtonDown(Trackball::Button button) {
|
void Trackball::ButtonDown(Trackball::Button button) {
|
||||||
|
bool old_sticky=false, new_sticky=false;
|
||||||
|
assert (modes.count (0));
|
||||||
|
if ( ( modes.count (current_button) ) && ( modes[current_button] != NULL ) ) {
|
||||||
|
old_sticky = modes[current_button]->isSticky();
|
||||||
|
}
|
||||||
current_button |= button;
|
current_button |= button;
|
||||||
|
if ( ( modes.count (current_button) ) && ( modes[current_button] != NULL ) ) {
|
||||||
|
new_sticky = modes[current_button]->isSticky();
|
||||||
|
}
|
||||||
|
if ( old_sticky || new_sticky)
|
||||||
|
return;
|
||||||
SetCurrentAction();
|
SetCurrentAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Trackball::ButtonUp(Trackball::Button button) {
|
void Trackball::ButtonUp(Trackball::Button button) {
|
||||||
|
bool old_sticky=false, new_sticky=false;
|
||||||
|
assert ( modes.count (0) );
|
||||||
|
if ( ( modes.count (current_button) ) && ( modes[current_button] != NULL ) ) {
|
||||||
|
old_sticky = modes[current_button]->isSticky();
|
||||||
|
}
|
||||||
current_button &= (~button);
|
current_button &= (~button);
|
||||||
|
if ( ( modes.count (current_button) ) && ( modes[current_button] != NULL ) ) {
|
||||||
|
new_sticky = modes[current_button]->isSticky();
|
||||||
|
}
|
||||||
|
if ( old_sticky || new_sticky)
|
||||||
|
return;
|
||||||
SetCurrentAction();
|
SetCurrentAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Trackball::Undo(){
|
||||||
|
track = undo_track;
|
||||||
|
if(current_mode != NULL)
|
||||||
|
current_mode->Undo();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//spinning interface
|
//spinning interface
|
||||||
void Trackball::SetSpinnable(bool /* on*/ ){}
|
void Trackball::SetSpinnable(bool /* on*/ ){}
|
||||||
bool Trackball::IsSpinnable() {
|
bool Trackball::IsSpinnable() {
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.14 2007/05/15 15:00:47 benedetti
|
||||||
|
Moved the drawing code to trackmodes, some other minor changes
|
||||||
|
|
||||||
Revision 1.13 2007/02/26 01:30:02 cignoni
|
Revision 1.13 2007/02/26 01:30:02 cignoni
|
||||||
Added reflection Name
|
Added reflection Name
|
||||||
|
|
||||||
|
@ -199,6 +202,7 @@ namespace vcg {
|
||||||
void MouseWheel (float notch, /*Button */ int button);
|
void MouseWheel (float notch, /*Button */ int button);
|
||||||
void ButtonUp(Button button);
|
void ButtonUp(Button button);
|
||||||
void ButtonDown(Button button);
|
void ButtonDown(Button button);
|
||||||
|
void Undo();
|
||||||
|
|
||||||
//default sensitivity 1
|
//default sensitivity 1
|
||||||
void SetSensitivity(float s);
|
void SetSensitivity(float s);
|
||||||
|
@ -255,6 +259,10 @@ namespace vcg {
|
||||||
std::map<int, TrackMode *> modes;
|
std::map<int, TrackMode *> modes;
|
||||||
|
|
||||||
Similarityf last_track;
|
Similarityf last_track;
|
||||||
|
|
||||||
|
// undo_track and last_track have different meanings..
|
||||||
|
Similarityf undo_track;
|
||||||
|
|
||||||
Similarityf last_view;
|
Similarityf last_view;
|
||||||
Point3f last_point;
|
Point3f last_point;
|
||||||
std::vector<Point3f> Hits;
|
std::vector<Point3f> Hits;
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.22 2007/05/28 08:10:47 fiorin
|
||||||
|
Removed type cast warnings
|
||||||
|
|
||||||
Revision 1.21 2007/05/16 08:44:05 ganovelli
|
Revision 1.21 2007/05/16 08:44:05 ganovelli
|
||||||
added inclusion of glew.h
|
added inclusion of glew.h
|
||||||
|
|
||||||
|
@ -133,6 +136,12 @@ void TrackMode::SetAction (){}
|
||||||
|
|
||||||
void TrackMode::Reset (){}
|
void TrackMode::Reset (){}
|
||||||
|
|
||||||
|
bool TrackMode::isSticky() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackMode::Undo(){}
|
||||||
|
|
||||||
// draw an inactive trackball
|
// draw an inactive trackball
|
||||||
void InactiveMode::Draw(Trackball * tb){
|
void InactiveMode::Draw(Trackball * tb){
|
||||||
DrawSphereIcon(tb,false);
|
DrawSphereIcon(tb,false);
|
||||||
|
@ -407,6 +416,9 @@ void PathMode::GetPoints(float state, Point3f & point, Point3f & prev_point, Poi
|
||||||
|
|
||||||
void PathMode::Apply (Trackball * tb, float WheelNotch)
|
void PathMode::Apply (Trackball * tb, float WheelNotch)
|
||||||
{
|
{
|
||||||
|
undo_current_state=current_state;
|
||||||
|
undo_old_hitpoint=old_hitpoint;
|
||||||
|
|
||||||
const float STEP_COEFF = min_seg_length * 0.5f;
|
const float STEP_COEFF = min_seg_length * 0.5f;
|
||||||
float delta=(WheelNotch*STEP_COEFF)/path_length;
|
float delta=(WheelNotch*STEP_COEFF)/path_length;
|
||||||
Point3f old_point,new_point,prev_point,next_point;
|
Point3f old_point,new_point,prev_point,next_point;
|
||||||
|
@ -496,6 +508,9 @@ void PathMode::SetAction (){
|
||||||
|
|
||||||
void PathMode::Apply (Trackball * tb, Point3f new_point)
|
void PathMode::Apply (Trackball * tb, Point3f new_point)
|
||||||
{
|
{
|
||||||
|
undo_current_state=current_state;
|
||||||
|
undo_old_hitpoint=old_hitpoint;
|
||||||
|
|
||||||
Ray3fN ray = line2ray(tb->camera.ViewLineFromWindow (new_point));
|
Ray3fN ray = line2ray(tb->camera.ViewLineFromWindow (new_point));
|
||||||
Point3f hit_point;
|
Point3f hit_point;
|
||||||
float delta_state=HitPoint(current_state,ray,hit_point);
|
float delta_state=HitPoint(current_state,ray,hit_point);
|
||||||
|
@ -503,6 +518,15 @@ void PathMode::Apply (Trackball * tb, Point3f new_point)
|
||||||
tb->Translate (hit_point - old_hitpoint);
|
tb->Translate (hit_point - old_hitpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PathMode::isSticky() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PathMode::Undo(){
|
||||||
|
current_state=undo_current_state;
|
||||||
|
old_hitpoint=undo_old_hitpoint;
|
||||||
|
}
|
||||||
|
|
||||||
void PathMode::Draw(Trackball * tb){
|
void PathMode::Draw(Trackball * tb){
|
||||||
DrawSphereIcon(tb,true );
|
DrawSphereIcon(tb,true );
|
||||||
Point3f current_point,prev_point,next_point;
|
Point3f current_point,prev_point,next_point;
|
||||||
|
@ -568,6 +592,13 @@ void AreaMode::Reset()
|
||||||
|
|
||||||
void AreaMode::Apply (Trackball * tb, Point3f new_point)
|
void AreaMode::Apply (Trackball * tb, Point3f new_point)
|
||||||
{
|
{
|
||||||
|
undo_begin_action=begin_action;
|
||||||
|
undo_status=status;
|
||||||
|
undo_delta_mouse=delta_mouse;
|
||||||
|
undo_old_status=old_status;
|
||||||
|
undo_rubberband_handle=rubberband_handle;
|
||||||
|
undo_path_index=path.size();
|
||||||
|
|
||||||
if(begin_action){
|
if(begin_action){
|
||||||
delta_mouse=tb->camera.Project(status)-new_point;
|
delta_mouse=tb->camera.Project(status)-new_point;
|
||||||
begin_action=false;
|
begin_action=false;
|
||||||
|
@ -589,7 +620,6 @@ void AreaMode::SetAction ()
|
||||||
begin_action=true;
|
begin_action=true;
|
||||||
old_status=status;
|
old_status=status;
|
||||||
|
|
||||||
|
|
||||||
path.clear();
|
path.clear();
|
||||||
path.push_back(status);
|
path.push_back(status);
|
||||||
rubberband_handle=status;
|
rubberband_handle=status;
|
||||||
|
@ -698,6 +728,20 @@ Point3f AreaMode::SetStartNear(Point3f point)
|
||||||
return initial_status;
|
return initial_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AreaMode::isSticky() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AreaMode::Undo(){
|
||||||
|
begin_action=undo_begin_action;
|
||||||
|
status=undo_status;
|
||||||
|
delta_mouse=undo_delta_mouse;
|
||||||
|
old_status=undo_old_status;
|
||||||
|
rubberband_handle=undo_rubberband_handle;
|
||||||
|
for(unsigned int i=path.size() - 1; i > undo_path_index; --i)
|
||||||
|
path.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
void AreaMode::Draw(Trackball * tb)
|
void AreaMode::Draw(Trackball * tb)
|
||||||
{
|
{
|
||||||
DrawSphereIcon(tb,true );
|
DrawSphereIcon(tb,true );
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.11 2007/05/15 14:59:10 benedetti
|
||||||
|
Main restructuring. added many new modes
|
||||||
|
|
||||||
Revision 1.10 2007/02/26 01:30:02 cignoni
|
Revision 1.10 2007/02/26 01:30:02 cignoni
|
||||||
Added reflection Name
|
Added reflection Name
|
||||||
|
|
||||||
|
@ -83,6 +86,8 @@ public:
|
||||||
return "TrackMode";
|
return "TrackMode";
|
||||||
};
|
};
|
||||||
virtual void Draw (Trackball * trackball);
|
virtual void Draw (Trackball * trackball);
|
||||||
|
virtual bool isSticky();
|
||||||
|
virtual void Undo();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Inactive mode.
|
// Inactive mode.
|
||||||
|
@ -274,6 +279,8 @@ public:
|
||||||
void SetAction ();
|
void SetAction ();
|
||||||
void Reset ();
|
void Reset ();
|
||||||
Point3f SetStartNear(Point3f p);
|
Point3f SetStartNear(Point3f p);
|
||||||
|
bool isSticky();
|
||||||
|
void Undo();
|
||||||
private:
|
private:
|
||||||
void Init(const vector < Point3f > &points);
|
void Init(const vector < Point3f > &points);
|
||||||
void GetPoints(float state, Point3f & point, Point3f & prev_point, Point3f & next_point);
|
void GetPoints(float state, Point3f & point, Point3f & prev_point, Point3f & next_point);
|
||||||
|
@ -289,6 +296,8 @@ private:
|
||||||
float min_seg_length;
|
float min_seg_length;
|
||||||
Point3f old_hitpoint;
|
Point3f old_hitpoint;
|
||||||
|
|
||||||
|
float undo_current_state;
|
||||||
|
Point3f undo_old_hitpoint;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Area mode.
|
// Area mode.
|
||||||
|
@ -320,6 +329,8 @@ public:
|
||||||
void SetAction ();
|
void SetAction ();
|
||||||
void Reset ();
|
void Reset ();
|
||||||
Point3f SetStartNear(Point3f p);
|
Point3f SetStartNear(Point3f p);
|
||||||
|
bool isSticky();
|
||||||
|
void Undo();
|
||||||
private:
|
private:
|
||||||
void Init(const vector < Point3f > &pts);
|
void Init(const vector < Point3f > &pts);
|
||||||
bool Inside(Point3f point);
|
bool Inside(Point3f point);
|
||||||
|
@ -330,12 +341,22 @@ private:
|
||||||
int first_coord_kept;
|
int first_coord_kept;
|
||||||
int second_coord_kept;
|
int second_coord_kept;
|
||||||
float min_side_length;
|
float min_side_length;
|
||||||
Point3f status,delta_mouse,old_status,initial_status;
|
Point3f status;
|
||||||
|
Point3f delta_mouse;
|
||||||
|
Point3f old_status;
|
||||||
|
Point3f initial_status;
|
||||||
|
|
||||||
Plane3f plane;
|
Plane3f plane;
|
||||||
Point3f rubberband_handle ;
|
Point3f rubberband_handle ;
|
||||||
vector < Point3f > path;
|
vector < Point3f > path;
|
||||||
|
|
||||||
|
bool undo_begin_action;
|
||||||
|
Point3f undo_status;
|
||||||
|
Point3f undo_delta_mouse;
|
||||||
|
Point3f undo_old_status;
|
||||||
|
Point3f undo_rubberband_handle ;
|
||||||
|
unsigned int undo_path_index;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}//namespace
|
}//namespace
|
||||||
|
|
Loading…
Reference in New Issue