diff --git a/Fltk/GUI_Projection.cpp b/Fltk/GUI_Projection.cpp index ab71c64ef1fa297054412b6793285e7176cfa107..4fcd04089ec106657f5c0d2b9f950522b4c5b5aa 100644 --- a/Fltk/GUI_Projection.cpp +++ b/Fltk/GUI_Projection.cpp @@ -19,30 +19,37 @@ uvPlot::uvPlot(int x, int y, int w, int h, const char *l) void uvPlot::fill(std::vector<double> &u, std::vector<double> &v, std::vector<double> &f) { - _u = u; _v = v; _f = f; - // compute min/max distance - if(_f.size()){ - _dmin = 1.e200; _dmax = 0.; - for(unsigned int i = 0; i < _f.size(); i++){ - // only compute min/max for valid projections - if(_u[i] >= 0. && _u[i] <= 1. && - _v[i] >= 0. && _v[i] <= 1.){ - _dmin = std::min(_dmin, _f[i]); - _dmax = std::max(_dmax, _f[i]); - } + _u.clear(); + _v.clear(); + _f.clear(); + + if(u.empty() || u.size() != v.size() || u.size() != f.size()) + return; + + _dmin = 1.e200; _dmax = 0.; + + for(unsigned int i = 0; i < u.size(); i++){ + // only store valid points + if(u[i] >= 0. && u[i] <= 1. && v[i] >= 0. && v[i] <= 1.){ + _u.push_back(u[i]); + _v.push_back(v[i]); + _f.push_back(f[i]); + _dmin = std::min(_dmin, f[i]); + _dmax = std::max(_dmax, f[i]); } } + + if(_u.empty()) _dmin = _dmax = 0.; redraw(); } void uvPlot::color(double d) { - int numcol = _colorTable.size; int index; if(_dmin == _dmax) - index = numcol / 2; + index = _colorTable.size / 2; else - index = (int)((d - _dmin) * (numcol - 1) / (_dmax - _dmin)); + index = (int)((d - _dmin) * (_colorTable.size - 1) / (_dmax - _dmin)); unsigned int color = _colorTable.table[index]; int r = CTX.UNPACK_RED(color); int g = CTX.UNPACK_GREEN(color); @@ -56,22 +63,18 @@ void uvPlot::draw() fl_color(FL_WHITE); fl_rectf(0, 0, w(), h()); - // draw points - if(_u.size() != _v.size()) return; - + // draw points in u,v space, colored by their distance to the + // projection surface int pw = w(); - int ph = h() - 30; - + int ph = h() - (2 * GetFontSize() + 5); for(unsigned int i = 0; i < _u.size(); i++){ - if(_u[i] >= 0. && _u[i] <= 1. && - _v[i] >= 0. && _v[i] <= 1.){ - int x = (int)(_u[i] * pw); - int y = (int)(_v[i] * ph); - color(_f[i]); - fl_rect(x, y, 3, 3); - } + int x = (int)(_u[i] * pw); + int y = (int)(_v[i] * ph); + color(_f[i]); + fl_rect(x, y, 3, 3); } + // draw color bar for(int i = 0; i < w(); i++){ int index = (int)(i * (_colorTable.size - 1) / w()); unsigned int color = _colorTable.table[index]; @@ -82,12 +85,15 @@ void uvPlot::draw() fl_line(i, ph, i, ph + 10); } + // draw labels fl_color(FL_BLACK); - fl_font(FL_HELVETICA, 13); - static char min[256], max[256]; + fl_font(FL_HELVETICA, GetFontSize()); + static char min[256], max[256], pts[256]; sprintf(min, "%g", _dmin); sprintf(max, "%g", _dmax); + sprintf(pts, "[%d pts]", _f.size()); fl_draw(min, 5, h() - 5); + fl_draw(pts, pw / 2 - fl_width(pts) / 2, h() - 5); fl_draw(max, pw - fl_width(max) - 5, h() - 5); } @@ -190,25 +196,28 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces) } int hard = 8; - new Fl_Toggle_Button(WB, 3 * WB + 8 * BH + hard, - hard, height - 5 * WB - 12 * BH - 2 * hard); - new Fl_Toggle_Button(width - WB - hard, 3 * WB + 8 * BH + hard, - hard, height - 5 * WB - 12 * BH - 2 * hard); - new Fl_Toggle_Button(WB + hard, 3 * WB + 8 * BH, - width - 2 * WB - 2 * hard, hard); - new Fl_Toggle_Button(WB + hard, 3 * WB + 8 * BH + height - 5 * WB - 12 * BH - hard, - width - 2 * WB - 2 * hard, hard); + hardEdges[0] = new Fl_Toggle_Button(WB, 3 * WB + 8 * BH + hard, + hard, height - 7 * WB - 11 * BH - 2 * hard); + hardEdges[1] = new Fl_Toggle_Button(width - WB - hard, 3 * WB + 8 * BH + hard, + hard, height - 7 * WB - 11 * BH - 2 * hard); + hardEdges[2] = new Fl_Toggle_Button(WB + hard, 3 * WB + 8 * BH, + width - 2 * WB - 2 * hard, hard); + hardEdges[3] = new Fl_Toggle_Button(WB + hard, -4 * WB - 3 * BH + height - hard, + width - 2 * WB - 2 * hard, hard); + for(int i = 0; i < 4; i++){ + hardEdges[i]->tooltip("Push to mark edge as `hard'"); + } _uvPlot = new uvPlot(WB + hard, 3 * WB + 8 * BH + hard, - width - 2 * WB - 2 * hard, height - 5 * WB - 12 * BH - 2 * hard); + width - 2 * WB - 2 * hard, height - 7 * WB - 11 * BH - 2 * hard); _uvPlot->end(); - modes[0] = new Fl_Value_Input(WB, height - WB - 4 * BH, BB / 2, BH); - modes[1] = new Fl_Value_Input(WB + BB / 2, height - WB - 4 * BH, BB / 2, BH, + modes[0] = new Fl_Value_Input(WB, height - 3 * WB - 3 * BH, BB / 2, BH); + modes[1] = new Fl_Value_Input(WB + BB / 2, height - 3 * WB - 3 * BH, BB / 2, BH, "Fourier modes along u and v"); - modes[2] = new Fl_Value_Input(WB, height - WB - 3 * BH, BB / 2, BH); - modes[3] = new Fl_Value_Input(WB + BB / 2, height - WB - 3 * BH, BB / 2, BH, + modes[2] = new Fl_Value_Input(WB, height - 3 * WB - 2 * BH, BB / 2, BH); + modes[3] = new Fl_Value_Input(WB + BB / 2, height - 3 * WB - 2 * BH, BB / 2, BH, "Chebychev modes along u and v"); for(int i = 0; i < 4; i++){ modes[i]->maximum(128); @@ -560,7 +569,8 @@ void compute_cb(Fl_Widget *w, void *data) color[0] = 0; color[1] = 0; color[2] = 1; plotSceneViewer(0,"patch.iv",color,x,y,z,nU,nV,mask); } - //Msg(GERROR, "Compute!"); + + Draw(); } void mesh_parameterize_cb(Fl_Widget* w, void* data) diff --git a/Fltk/GUI_Projection.h b/Fltk/GUI_Projection.h index ac1366e453c70c239a07f73ea967e6e9cb6a8abc..4e72b33389e6775638761ba333504d7639111d9f 100644 --- a/Fltk/GUI_Projection.h +++ b/Fltk/GUI_Projection.h @@ -71,6 +71,7 @@ class projectionEditor { void show(){ _window->show(); select_cb(0, this); } uvPlot *uv() { return _uvPlot; } Fl_Value_Input* modes[4]; + Fl_Toggle_Button* hardEdges[4]; std::vector<MElement*> &getElements() { return _elements; } std::vector<GEntity*> &getEntities() { return _entities; } std::vector<projection*> &getProjections() { return _projections; }