void GLHelper::drawTextBox(const std::string& text, const Position& pos, const double layer, const double size, const RGBColor& txtColor, const RGBColor& bgColor, const RGBColor& borderColor, const double angle, const double relBorder, const double relMargin) { if (!initFont()) { return; }; if (bgColor.alpha() != 0) { const double boxAngle = 90; const double stringWidth = size / myFontSize * fonsTextBounds(myFont, 0, 0, text.c_str(), nullptr, nullptr); const double borderWidth = size * relBorder; const double boxHeight = size * (0.32 + 0.6 * relMargin); const double boxWidth = stringWidth + size * relMargin; glPushMatrix(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glTranslated(pos.x(), pos.y(), layer); glRotated(-angle, 0, 0, 1); Position left(-boxWidth * 0.5, 0); setColor(borderColor); drawBoxLine(left, boxAngle, boxWidth, boxHeight); left.add(borderWidth * 1.5, 0); setColor(bgColor); glTranslated(0, 0, 0.01); drawBoxLine(left, boxAngle, boxWidth - 3 * borderWidth, boxHeight - 2 * borderWidth); glPopMatrix(); } drawText(text, pos, layer + 0.02, size, txtColor, angle); }
void GLHelper::drawBoxLines(const PositionVector& geom, double width) { int e = (int) geom.size() - 1; for (int i = 0; i < e; i++) { const Position& f = geom[i]; const Position& s = geom[i + 1]; drawBoxLine(f, RAD2DEG(atan2((s.x() - f.x()), (f.y() - s.y()))), f.distanceTo(s), width); } }
void GLHelper::drawTextBox(const std::string& text, const Position& pos, const SUMOReal layer, const SUMOReal size, const RGBColor& txtColor, const RGBColor& bgColor, const RGBColor& borderColor, const SUMOReal angle) { SUMOReal boxAngle = angle + 90; if (boxAngle > 360) { boxAngle -= 360; } pfSetScale(size); const SUMOReal stringWidth = pfdkGetStringWidth(text.c_str()); const SUMOReal borderWidth = size / 20; const SUMOReal boxHeight = size * 0.8; const SUMOReal boxWidth = stringWidth + size / 2; glPushMatrix(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glTranslated(0, 0, layer); setColor(borderColor); Position left = pos; left.sub(boxWidth / 2, -boxHeight / 2.7); drawBoxLine(left, boxAngle, boxWidth, boxHeight); left.add(borderWidth * 1.5, 0); setColor(bgColor); glTranslated(0, 0, 0.01); drawBoxLine(left, boxAngle, boxWidth - 3 * borderWidth, boxHeight - 2 * borderWidth); // actually we should be able to use drawText here. however, there's // something about the constant 0.4 offset which causes trouble //drawText(text, pos, layer+0.02, size, txtColor, angle); setColor(txtColor); glTranslated(pos.x(), pos.y(), 0.01); pfSetPosition(0, 0); pfSetScale(size); glRotated(180, 1, 0, 0); glRotated(angle, 0, 0, 1); glTranslated(-stringWidth / 2., 0, 0); pfDrawString(text.c_str()); glPopMatrix(); }
void GLHelper::drawBoxLines(const PositionVector& geom, const std::vector<SUMOReal>& rots, const std::vector<SUMOReal>& lengths, SUMOReal width, int cornerDetail, SUMOReal offset) { // draw the lane int e = (int) geom.size() - 1; for (int i = 0; i < e; i++) { drawBoxLine(geom[i], rots[i], lengths[i], width, offset); } // draw the corner details if (cornerDetail > 0) { for (int i = 1; i < e; i++) { glPushMatrix(); glTranslated(geom[i].x(), geom[i].y(), 0.1); if (rightTurn(rots[i - 1], rots[i])) { // inside corner drawFilledCircle(MIN2(lengths[i], width - offset), cornerDetail); } else { // outside corner, make sure to only draw a segment of the circle SUMOReal angleBeg = -rots[i - 1]; SUMOReal angleEnd = 180 - rots[i]; // avoid drawing more than 360 degrees if (angleEnd - angleBeg > 360) { angleBeg += 360; } if (angleEnd - angleBeg < -360) { angleEnd += 360; } // for a left tur, draw the right way around if (angleEnd > angleBeg) { angleEnd -= 360; } drawFilledCircle(MIN2(lengths[i], width + offset), cornerDetail, angleBeg, angleEnd); } glEnd(); glPopMatrix(); } } }
void GLHelper::drawBoxLines(const PositionVector& geom, const std::vector<double>& rots, const std::vector<double>& lengths, const std::vector<RGBColor>& cols, double width, int cornerDetail, double offset) { int e = (int) geom.size() - 1; for (int i = 0; i < e; i++) { setColor(cols[i]); drawBoxLine(geom[i], rots[i], lengths[i], width, offset); } if (cornerDetail > 0) { for (int i = 1; i < e; i++) { glPushMatrix(); setColor(cols[i]); glTranslated(geom[i].x(), geom[i].y(), 0); drawFilledCircle(width, cornerDetail); glEnd(); glPopMatrix(); } } }
void GLHelper::drawBoxLines(const PositionVector& geom, const std::vector<double>& rots, const std::vector<double>& lengths, double width, int cornerDetail, double offset) { // draw the lane int e = (int) geom.size() - 1; for (int i = 0; i < e; i++) { drawBoxLine(geom[i], rots[i], lengths[i], width, offset); } // draw the corner details if (cornerDetail > 0) { for (int i = 1; i < e; i++) { glPushMatrix(); glTranslated(geom[i].x(), geom[i].y(), 0.1); double angleBeg = -rots[i - 1]; double angleEnd = 180 - rots[i]; if (rightTurn(rots[i - 1], rots[i])) { std::swap(angleBeg, angleEnd); } // only draw the missing piece angleBeg -= 90; angleEnd += 90; // avoid drawing more than 360 degrees if (angleEnd - angleBeg > 360) { angleBeg += 360; } if (angleEnd - angleBeg < -360) { angleEnd += 360; } // draw the right way around if (angleEnd > angleBeg) { angleEnd -= 360; } drawFilledCircle(width + offset, cornerDetail, angleBeg, angleEnd); glPopMatrix(); } } }