static void drawScaleValues(drawContext *ctx, PView *p, double xmin, double ymin, double width, double height, double tic, int horizontal) { PViewOptions *opt = p->getOptions(); if(!opt->nbIso) return; drawContext::global()->setFont(CTX::instance()->glFontEnum, CTX::instance()->glFontSize); double font_h = drawContext::global()->getStringHeight(); // total font height double font_a = drawContext::global()->getStringHeight() - drawContext::global()->getStringDescent(); // height above ref pt char label[1024]; sprintf(label, opt->format.c_str(), -M_PI * 1.e-4); double maxw = drawContext::global()->getStringWidth(label); int nbv = opt->nbIso; double f = (opt->intervalsType == PViewOptions::Discrete || opt->intervalsType == PViewOptions::Numeric || opt->intervalsType == PViewOptions::Continuous) ? 2 : 2.5; if(horizontal && width < nbv * maxw){ if(width < f * maxw) nbv = 1; else nbv = 2; } else if(!horizontal && height < nbv * font_h){ if(height < f * font_h) nbv = 1; else nbv = 2; } double box = (horizontal ? width : height) / opt->nbIso; double vbox = (horizontal ? width : height) / nbv; glColor4ubv((GLubyte *) & CTX::instance()->color.text); if(opt->intervalsType == PViewOptions::Discrete || opt->intervalsType == PViewOptions::Numeric || opt->intervalsType == PViewOptions::Continuous){ for(int i = 0; i < nbv + 1; i++) { double v = opt->getScaleValue(i, nbv + 1, opt->tmpMin, opt->tmpMax); sprintf(label, opt->format.c_str(), v); if(horizontal){ glRasterPos2d(xmin + i * vbox, ymin + height + tic); ctx->drawStringCenter(label); } else{ glRasterPos2d(xmin + width + tic, ymin + i * vbox - font_a / 3.); ctx->drawString(label); } } } else{ if(opt->nbIso > 2 && (nbv == 1 || nbv == 2)){ vbox = (vbox * nbv - box) / nbv; nbv++; } for(int i = 0; i < nbv; i++) { double v = opt->getScaleValue(i, nbv, opt->tmpMin, opt->tmpMax); sprintf(label, opt->format.c_str(), v); if(horizontal){ glRasterPos2d(xmin + box / 2. + i * vbox, ymin + height + tic); ctx->drawStringCenter(label); } else{ glRasterPos2d(xmin + width + tic, ymin + box / 2. + i * vbox - font_a / 3.); ctx->drawString(label); } } } }
void drawContext::drawScale() { glPushMatrix(); glLoadIdentity(); double size = std::max(_right -_left, _top - _bottom); double width = size / 3.5; double height = size / 10.; double dh = height / 5; // Draw the scale bar int nPview = 0; for(int i=0; i<PView::list.size();i++){ PView *p = PView::list[i]; PViewOptions *opt = p->getOptions(); if(!opt->visible) continue; PViewData *data = p->getData(); double box = width / (opt->nbIso ? opt->nbIso : 1); double xmin = _left + (_right - _left - width)/2.; double ymin = _bottom + 0.7 * height + height * nPview; std::vector<GLfloat> vertex(opt->nbIso*3*4); std::vector<GLubyte> color(opt->nbIso*4*4); for(int i = 0; i < opt->nbIso; i++){ if(opt->intervalsType == PViewOptions::Discrete || opt->intervalsType == PViewOptions::Numeric){ unsigned int col = opt->getColor(i, opt->nbIso); color[i*4*4+0] = color[i*4*4+4] = color[i*4*4+8] = color[i*4*4+12] = (GLubyte)CTX::instance()->unpackRed(col); color[i*4*4+1] = color[i*4*4+5] = color[i*4*4+9] = color[i*4*4+13] = (GLubyte)CTX::instance()->unpackGreen(col); color[i*4*4+2] = color[i*4*4+6] = color[i*4*4+10] = color[i*4*4+14] = (GLubyte)CTX::instance()->unpackBlue(col); color[i*4*4+3] = color[i*4*4+7] = color[i*4*4+11] = color[i*4*4+15] = (GLubyte)CTX::instance()->unpackAlpha(col); vertex[i*3*4+0] = xmin + i * box; vertex[i*3*4+1] = ymin; vertex[i*3*4+2] = 0.; vertex[i*3*4+3] = xmin + i * box; vertex[i*3*4+4] = ymin + dh; vertex[i*3*4+5] = 0.; vertex[i*3*4+6] = xmin + (i + 1) * box; vertex[i*3*4+7] = ymin; vertex[i*3*4+8] = 0.; vertex[i*3*4+9] = xmin + (i + 1) * box; vertex[i*3*4+10] = ymin + dh; vertex[i*3*4+11] = 0.; } else if(opt->intervalsType == PViewOptions::Continuous){ double dv = (opt->tmpMax - opt->tmpMin) / (opt->nbIso ? opt->nbIso : 1); double v1 = opt->tmpMin + i * dv; unsigned int col1 = opt->getColor(v1, opt->tmpMin, opt->tmpMax, true); color[i*4*4+0] = color[i*4*4+4] = (GLubyte)CTX::instance()->unpackRed(col1); color[i*4*4+1] = color[i*4*4+5] = (GLubyte)CTX::instance()->unpackGreen(col1); color[i*4*4+2] = color[i*4*4+6] = (GLubyte)CTX::instance()->unpackBlue(col1); color[i*4*4+3] = color[i*4*4+7] = (GLubyte)CTX::instance()->unpackAlpha(col1); vertex[i*3*4+0] = xmin + i * box; vertex[i*3*4+1] = ymin; vertex[i*3*4+2] = 0.; vertex[i*3*4+3] = xmin + i * box; vertex[i*3*4+4] = ymin + dh; vertex[i*3*4+5] = 0.; double v2 = opt->tmpMin + (i + 1) * dv; unsigned int col2 = opt->getColor(v2, opt->tmpMin, opt->tmpMax, true); color[i*4*4+8] = color[i*4*4+12] = (GLubyte)CTX::instance()->unpackRed(col2); color[i*4*4+9] = color[i*4*4+13] = (GLubyte)CTX::instance()->unpackGreen(col2); color[i*4*4+10] = color[i*4*4+14] = (GLubyte)CTX::instance()->unpackBlue(col2); color[i*4*4+11] = color[i*4*4+15] = (GLubyte)CTX::instance()->unpackAlpha(col2); vertex[i*3*4+6] = xmin + (i + 1) * box; vertex[i*3*4+7] = ymin; vertex[i*3*4+8] = 0.; vertex[i*3*4+9] = xmin + (i + 1) * box; vertex[i*3*4+10] = ymin + dh; vertex[i*3*4+11] = 0.; } else{ unsigned int col = opt->getColor(i, opt->nbIso); color[i*4*4+0] = color[i*4*4+4] = color[i*4*4+8] = color[i*4*4+12] = (GLubyte)CTX::instance()->unpackRed(col); color[i*4*4+1] = color[i*4*4+5] = color[i*4*4+9] = color[i*4*4+13] = (GLubyte)CTX::instance()->unpackGreen(col); color[i*4*4+2] = color[i*4*4+6] = color[i*4*4+10] = color[i*4*4+14] = (GLubyte)CTX::instance()->unpackBlue(col); color[i*4*4+3] = color[i*4*4+7] = color[i*4*4+11] = color[i*4*4+15] = (GLubyte)CTX::instance()->unpackAlpha(col); vertex[i*3*4+0] = xmin + i * box; vertex[i*3*4+1] = ymin; vertex[i*3*4+2] = 0.; vertex[i*3*4+3] = xmin + i * box; vertex[i*3*4+4] = ymin + dh; vertex[i*3*4+5] = 0.; vertex[i*3*4+6] = xmin + (i + 1) * box; vertex[i*3*4+7] = ymin; vertex[i*3*4+8] = 0.; vertex[i*3*4+9] = xmin + (i + 1) * box; vertex[i*3*4+10] = ymin + dh; vertex[i*3*4+11] = 0.; } } glVertexPointer(3, GL_FLOAT, 0, &vertex[0]); glEnableClientState(GL_VERTEX_ARRAY); glColorPointer(4, GL_UNSIGNED_BYTE, 0, &color[0]); glEnableClientState(GL_COLOR_ARRAY); if(opt->intervalsType == PViewOptions::Discrete || opt->intervalsType == PViewOptions::Numeric || opt->intervalsType == PViewOptions::Continuous) glDrawArrays(GL_TRIANGLE_STRIP, 0, opt->nbIso*4); else glDrawArrays(GL_LINES, 0, opt->nbIso*4); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); char label[1024]; int nt = data->getNumTimeSteps(); if((opt->showTime == 1 && nt > 1) || opt->showTime == 2){ char tmp[256]; sprintf(tmp, opt->format.c_str(), data->getTime(opt->timeStep)); sprintf(label, "%s (%s)", data->getName().c_str(), tmp); } else if((opt->showTime == 3 && nt > 1) || opt->showTime == 4){ sprintf(label, "%s (%d/%d)", data->getName().c_str(), opt->timeStep, data->getNumTimeSteps() - 1); } else{ sprintf(label, "%s", data->getName().c_str()); } drawString lbl(label, 20 * _fontFactor); lbl.draw(xmin + width / 2, ymin + 2.8 * dh, 0., _width/(_right-_left), _height/(_top-_bottom)); drawString val(data->getName().c_str(), 15 * _fontFactor); for(int i = 0; i < 3; i++) { double v = opt->getScaleValue(i, 3, opt->tmpMin, opt->tmpMax); sprintf(label, opt->format.c_str(), v); val.setText(label); val.draw(xmin + i * width/ 2, ymin + 1.5 * dh, 0., _width/(_right-_left), _height/(_top-_bottom)); } nPview++; } glPopMatrix(); }
static void drawScaleBar(PView *p, double xmin, double ymin, double width, double height, double tic, int horizontal) { PViewOptions *opt = p->getOptions(); double box = (horizontal ? width : height) / (opt->nbIso ? opt->nbIso : 1); for(int i = 0; i < opt->nbIso; i++) { if(opt->intervalsType == PViewOptions::Discrete || opt->intervalsType == PViewOptions::Numeric){ unsigned int col = opt->getColor(i, opt->nbIso); glColor4ubv((GLubyte *) &col); glBegin(GL_QUADS); if(horizontal){ glVertex2d(xmin + i * box, ymin); glVertex2d(xmin + (i + 1) * box, ymin); glVertex2d(xmin + (i + 1) * box, ymin + height); glVertex2d(xmin + i * box, ymin + height); } else{ glVertex2d(xmin, ymin + i * box); glVertex2d(xmin + width, ymin + i * box); glVertex2d(xmin + width, ymin + (i + 1) * box); glVertex2d(xmin, ymin + (i + 1) * box); } glEnd(); } else if(opt->intervalsType == PViewOptions::Continuous){ glBegin(GL_QUADS); double dv = (opt->tmpMax - opt->tmpMin) / (opt->nbIso ? opt->nbIso : 1); double v1 = opt->tmpMin + i * dv; unsigned int col1 = opt->getColor(v1, opt->tmpMin, opt->tmpMax, true); glColor4ubv((GLubyte *) &col1); if(horizontal){ glVertex2d(xmin + i * box, ymin + height); glVertex2d(xmin + i * box, ymin); } else{ glVertex2d(xmin, ymin + i * box); glVertex2d(xmin + width, ymin + i * box); } double v2 = opt->tmpMin + (i + 1) * dv; unsigned int col2 = opt->getColor(v2, opt->tmpMin, opt->tmpMax, true); glColor4ubv((GLubyte *) &col2); if(horizontal){ glVertex2d(xmin + (i + 1) * box, ymin); glVertex2d(xmin + (i + 1) * box, ymin + height); } else{ glVertex2d(xmin + width, ymin + (i + 1) * box); glVertex2d(xmin, ymin + (i + 1) * box); } glEnd(); } else{ unsigned int col = opt->getColor(i, opt->nbIso); glColor4ubv((GLubyte *) &col); glBegin(GL_LINES); if(horizontal){ glVertex2d(xmin + box / 2. + i * box, ymin); glVertex2d(xmin + box / 2. + i * box, ymin + height); } else{ glVertex2d(xmin, ymin + box / 2. + i * box); glVertex2d(xmin + width, ymin + box / 2. + i * box); } glEnd(); } } }