diff --git a/Fltk/openglWindow.cpp b/Fltk/openglWindow.cpp index 8d557778600233dd8480eeed9c3175eb90efcd00..5c194b9925567c4e398b248190649b4ec1db3d0e 100644 --- a/Fltk/openglWindow.cpp +++ b/Fltk/openglWindow.cpp @@ -17,7 +17,8 @@ #include "FlGui.h" #include "drawContext.h" #include "Context.h" - +#include <FL/Fl_Tooltip.H> + static void lassoZoom(drawContext *ctx, mousePosition &click1, mousePosition &click2) { if(click1.win[0] == click2.win[0] || click1.win[1] == click2.win[1]) return; @@ -25,7 +26,7 @@ static void lassoZoom(drawContext *ctx, mousePosition &click1, mousePosition &cl ctx->s[0] *= (double)ctx->viewport[2] / (click2.win[0] - click1.win[0]); ctx->s[1] *= (double)ctx->viewport[3] / (click2.win[1] - click1.win[1]); ctx->s[2] = std::min(ctx->s[0], ctx->s[1]); // bof... - + // recenter around the center of the lasso rectangle mousePosition tmp(click1); tmp.wnr[0] = 0.5 * (click1.wnr[0] + click2.wnr[0]); @@ -34,7 +35,7 @@ static void lassoZoom(drawContext *ctx, mousePosition &click1, mousePosition &cl ctx->initPosition(); drawContext::global()->draw(); - FlGui::instance()->manip->update(); + FlGui::instance()->manip->update(); } openglWindow::openglWindow(int x, int y, int w, int h, const char *l) @@ -51,24 +52,24 @@ openglWindow::openglWindow(int x, int y, int w, int h, const char *l) } openglWindow::~openglWindow() -{ +{ delete _ctx; } void openglWindow::_drawScreenMessage() { - if(screenMessage[0].empty() && screenMessage[1].empty()) + if(screenMessage[0].empty() && screenMessage[1].empty()) return; glColor4ubv((GLubyte *) & CTX::instance()->color.text); - drawContext::global()->setFont(CTX::instance()->glFontEnum, + drawContext::global()->setFont(CTX::instance()->glFontEnum, CTX::instance()->glFontSize); double h = drawContext::global()->getStringHeight(); - + if(screenMessage[0].size()){ const char *txt = screenMessage[0].c_str(); double w = drawContext::global()->getStringWidth(txt); - glRasterPos2d(_ctx->viewport[2] / 2. - w / 2., + glRasterPos2d(_ctx->viewport[2] / 2. - w / 2., _ctx->viewport[3] - 1.2 * h); drawContext::global()->drawString(txt); } @@ -124,7 +125,7 @@ void openglWindow::draw() glViewport(_ctx->viewport[0], _ctx->viewport[1], _ctx->viewport[2], _ctx->viewport[3]); - if(lassoMode) { + if(lassoMode) { // draw the zoom or selection lasso on top of the current scene // (without using overlays!) glMatrixMode(GL_PROJECTION); @@ -163,21 +164,21 @@ void openglWindow::draw() glEnable(GL_DEPTH_TEST); glDrawBuffer(GL_BACK); } - else if(addPointMode) { + else if(addPointMode) { // draw the whole scene and the point to add if(CTX::instance()->fastRedraw) { CTX::instance()->mesh.draw = 0; CTX::instance()->post.draw = 0; } - + glClearColor ((GLclampf)(CTX::instance()->unpackRed(CTX::instance()->color.bg) / 255.), (GLclampf)(CTX::instance()->unpackGreen(CTX::instance()->color.bg) / 255.), - (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), + (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), 0.0F); - + glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - + _ctx->draw3d(); glColor4ubv((GLubyte *) & CTX::instance()->color.fg); glPointSize((float)CTX::instance()->geom.pointSize); @@ -198,18 +199,18 @@ void openglWindow::draw() glClearColor ((GLclampf)(CTX::instance()->unpackRed(CTX::instance()->color.bg) / 255.), (GLclampf)(CTX::instance()->unpackGreen(CTX::instance()->color.bg) / 255.), - (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), + (GLclampf)(CTX::instance()->unpackBlue(CTX::instance()->color.bg) / 255.), 0.0F); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - + if(CTX::instance()->camera && !CTX::instance()->stereo){ Camera *cam = &(_ctx->camera); if (!cam->on) cam->init(); - cam->giveViewportDimension(_ctx->viewport[2],_ctx->viewport[3]); + cam->giveViewportDimension(_ctx->viewport[2],_ctx->viewport[3]); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(cam->glFleft, cam->glFright, cam->glFbottom, - cam->glFtop, cam->glFnear, cam->glFfar); + cam->glFtop, cam->glFnear, cam->glFfar); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glDrawBuffer(GL_BACK); @@ -217,7 +218,7 @@ void openglWindow::draw() glLoadIdentity(); gluLookAt(cam->position.x,cam->position.y,cam->position.z, cam->target.x,cam->target.y,cam->target.z, - cam->up.x,cam->up.y,cam->up.z); + cam->up.x,cam->up.y,cam->up.z); _ctx->draw3d(); _ctx->draw2d(); _drawScreenMessage(); @@ -243,7 +244,7 @@ void openglWindow::draw() glLoadIdentity(); gluLookAt(cam->position.x+eye.x, cam->position.y+eye.y, cam->position.z+eye.z, cam->target.x+eye.x, cam->target.y+eye.y, cam->target.z+eye.z, - cam->up.x, cam->up.y, cam->up.z); + cam->up.x, cam->up.y, cam->up.z); _ctx->draw3d(); _ctx->draw2d(); _drawScreenMessage(); @@ -256,14 +257,14 @@ void openglWindow::draw() top = cam->wd2; bottom = - cam->wd2; glFrustum(left, right, bottom, top, cam->glFnear, cam->glFfar); - + glMatrixMode(GL_MODELVIEW); glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(cam->position.x-eye.x, cam->position.y-eye.y, cam->position.z-eye.z, cam->target.x-eye.x, cam->target.y-eye.y, cam->target.z-eye.z, - cam->up.x, cam->up.y, cam->up.z); + cam->up.x, cam->up.y, cam->up.z); _ctx->draw3d(); _ctx->draw2d(); _drawScreenMessage(); @@ -301,12 +302,12 @@ int openglWindow::handle(int event) if(FlGui::instance()->testArrowShortcuts()) return 1; return Fl_Gl_Window::handle(event); - + case FL_PUSH: _setLastHandled(this); take_focus(); // force keyboard focus when we click in the window _curr.set(_ctx, Fl::event_x(), Fl::event_y()); - if(Fl::event_button() == 1 && + if(Fl::event_button() == 1 && !Fl::event_state(FL_SHIFT) && !Fl::event_state(FL_ALT)) { if(!lassoMode && Fl::event_state(FL_CTRL)) { lassoMode = true; @@ -325,7 +326,7 @@ int openglWindow::handle(int event) } else{ if (CTX::instance()->camera){ - Camera * cam = &(_ctx->camera); + Camera * cam = &(_ctx->camera); double dy = fabs(-_click.win[1] + _curr.win[1]); double dx = fabs(-_click.win[0] + _curr.win[0]); double factx = w() / fabs(dx); @@ -335,8 +336,8 @@ int openglWindow::handle(int event) double y_med = (_click.win[1] + _curr.win[1]) / 2.; double theta_x = .96 * cam->radians * (w() / 2 - x_med) * 2. / h(); double theta_y = .96 * cam->radians * (h() / 2 - y_med) * 2. / h(); - cam->moveRight(theta_x); - cam->moveUp(theta_y); + cam->moveRight(theta_x); + cam->moveUp(theta_y); _ctx->camera.zoom(fact); _ctx->camera.update(); redraw(); @@ -355,7 +356,7 @@ int openglWindow::handle(int event) _trySelectionXYWH[3] = 5; } } - else if(Fl::event_button() == 2 || + else if(Fl::event_button() == 2 || (Fl::event_button() == 1 && Fl::event_state(FL_SHIFT))) { if(!lassoMode && Fl::event_state(FL_CTRL)) { // make zoom isotropic @@ -424,14 +425,14 @@ int openglWindow::handle(int event) fact = ((dy > 0) ? fact : 1. / fact); _ctx->camera.zoom(fact); _ctx->camera.update(); - redraw(); + redraw(); } else{ _ctx->s[0] *= ((dy > 0) ? fact : 1./fact); _ctx->s[1] = _ctx->s[0]; _ctx->s[2] = _ctx->s[0]; _prev.recenter(_ctx); - redraw(); + redraw(); } } FlGui::instance()->manip->update(); @@ -448,14 +449,14 @@ int openglWindow::handle(int event) else { if(Fl::event_state(FL_META)) { // will try to select or unselect entities on the fly - _trySelection = Fl::event_state(FL_SHIFT) ? -1 : 1; + _trySelection = Fl::event_state(FL_SHIFT) ? -1 : 1; _trySelectionXYWH[0] = (int)_curr.win[0]; _trySelectionXYWH[1] = (int)_curr.win[1]; _trySelectionXYWH[2] = 5; _trySelectionXYWH[3] = 5; } // (m1) and (!shift) and (!alt) => rotation - else if(Fl::event_button() == 1 && + else if(Fl::event_button() == 1 && !Fl::event_state(FL_SHIFT) && !Fl::event_state(FL_ALT)) { if(CTX::instance()->useTrackball) _ctx->addQuaternion((2. * _prev.win[0] - w()) / w(), @@ -480,8 +481,8 @@ int openglWindow::handle(int event) _ctx->camera.zoom(fact); _ctx->camera.update(); redraw(); - } - else{ + } + else{ // move in y greater than move in x if(fabs(dy) > fabs(dx)) { double fact = (CTX::instance()->zoomFactor * fabs(dy) + h()) / (double)h(); @@ -497,15 +498,15 @@ int openglWindow::handle(int event) // other case => translation else { if (CTX::instance()->camera){ - Camera * cam= &(_ctx->camera); - double theta_x = cam->radians * (-(double)_prev.win[0] + + Camera * cam= &(_ctx->camera); + double theta_x = cam->radians * (-(double)_prev.win[0] + (double)_curr.win[0]) * 2. / h(); double theta_y = cam->radians * (-(double)_prev.win[1] + (double)_curr.win[1]) * 2. / h(); - cam->moveRight(theta_x); - cam->moveUp(theta_y); - } - else{ + cam->moveRight(theta_x); + cam->moveUp(theta_y); + } + else{ _ctx->t[0] += (_curr.wnr[0] - _click.wnr[0]); _ctx->t[1] += (_curr.wnr[1] - _click.wnr[1]); _ctx->t[2] = 0.; @@ -534,7 +535,7 @@ int openglWindow::handle(int event) double p[3], d[3]; _ctx->unproject(_curr.win[0], _curr.win[1], p, d); // find closest point to the center of gravity - double r[3] = {CTX::instance()->cg[0] - p[0], CTX::instance()->cg[1] - p[1], + double r[3] = {CTX::instance()->cg[0] - p[0], CTX::instance()->cg[1] - p[1], CTX::instance()->cg[2] - p[2]}, t; prosca(r, d, &t); for(int i = 0; i < 3; i++){ @@ -548,11 +549,11 @@ int openglWindow::handle(int event) } } char str[32]; - sprintf(str, "%g", _point[0]); + sprintf(str, "%g", _point[0]); FlGui::instance()->geoContext->input[2]->value(str); - sprintf(str, "%g", _point[1]); + sprintf(str, "%g", _point[1]); FlGui::instance()->geoContext->input[3]->value(str); - sprintf(str, "%g", _point[2]); + sprintf(str, "%g", _point[2]); FlGui::instance()->geoContext->input[4]->value(str); redraw(); } @@ -563,12 +564,12 @@ int openglWindow::handle(int event) std::vector<GFace*> faces; std::vector<GRegion*> regions; std::vector<MElement*> elements; - bool res = _select(_selection, false, CTX::instance()->mouseHoverMeshes, + bool res = _select(_selection, false, CTX::instance()->mouseHoverMeshes, (int)_curr.win[0], (int)_curr.win[1], 5, 5, vertices, edges, faces, regions, elements); if((_selection == ENT_ALL && res) || (_selection == ENT_POINT && vertices.size()) || - (_selection == ENT_LINE && edges.size()) || + (_selection == ENT_LINE && edges.size()) || (_selection == ENT_SURFACE && faces.size()) || (_selection == ENT_VOLUME && regions.size())) cursor(FL_CURSOR_CROSS, FL_BLACK, FL_WHITE); @@ -580,9 +581,22 @@ int openglWindow::handle(int event) else if(faces.size()) ge = faces[0]; else if(regions.size()) ge = regions[0]; MElement *me = elements.size() ? elements[0] : 0; - Msg::StatusBar(2, false, "%s %s", - ge ? ge->getInfoString().c_str() : "", - me ? me->getInfoString().c_str() : ""); + static char text[1024] = ""; + sprintf(text, "%s %s", ge ? ge->getInfoString().c_str() : "", + me ? me->getInfoString().c_str() : ""); +#if 0 + Fl_Tooltip::exit(0); + double d1 = Fl_Tooltip::delay(); + double d2 = Fl_Tooltip::hoverdelay(); + Fl_Tooltip::delay(0); + Fl_Tooltip::hoverdelay(0); + if(strlen(text) > 3) + Fl_Tooltip::enter_area(this, _curr.win[0], _curr.win[1], 100, 50, text); + Fl_Tooltip::delay(d1); + Fl_Tooltip::hoverdelay(d2); +#else + Msg::StatusBar(2, false, text); +#endif } } _prev.set(_ctx, Fl::event_x(), Fl::event_y()); @@ -593,7 +607,7 @@ int openglWindow::handle(int event) } } -bool openglWindow::_select(int type, bool multiple, bool mesh, +bool openglWindow::_select(int type, bool multiple, bool mesh, int x, int y, int w, int h, std::vector<GVertex*> &vertices, std::vector<GEdge*> &edges, @@ -607,20 +621,20 @@ bool openglWindow::_select(int type, bool multiple, bool mesh, if(_lock) return false; _lock = true; make_current(); - bool ret = _ctx->select(type, multiple, mesh, x, y, w, h, + bool ret = _ctx->select(type, multiple, mesh, x, y, w, h, vertices, edges, faces, regions, elements); _lock = false; return ret; } -char openglWindow::selectEntity(int type, +char openglWindow::selectEntity(int type, std::vector<GVertex*> &vertices, std::vector<GEdge*> &edges, std::vector<GFace*> &faces, std::vector<GRegion*> ®ions, std::vector<MElement*> &elements) { - // force keyboard focus in GL window + // force keyboard focus in GL window take_focus(); _selection = type; _trySelection = 0; @@ -668,7 +682,7 @@ char openglWindow::selectEntity(int type, } else if(_select(_selection, multi, true, _trySelectionXYWH[0], _trySelectionXYWH[1], _trySelectionXYWH[2], - _trySelectionXYWH[3], vertices, edges, faces, + _trySelectionXYWH[3], vertices, edges, faces, regions, elements)){ _selection = ENT_NONE; selectionMode = false;