30 #define FONTSTASH_IMPLEMENTATION
32 #pragma warning(disable: 4505 5219)
35 #pragma GCC diagnostic push
36 #pragma GCC diagnostic ignored "-Wunused-function"
40 #define GLFONTSTASH_IMPLEMENTATION
49 #define CIRCLE_RESOLUTION (double)10
72 GLdouble* vertex_data[4],
73 GLfloat weight[4], GLdouble** dataOut) {
78 vertex = (GLdouble*)malloc(7 *
sizeof(GLdouble));
80 vertex[0] = coords[0];
81 vertex[1] = coords[1];
82 vertex[2] = coords[2];
90 const std::vector<std::pair<double, double> >&
120 #ifdef CHECK_ELEMENTCOUNTER
184 WRITE_WARNING(
TL(
"invalid matrix counter. Check that number of pushMatrix and popMatrix functions calls are the same"));
195 WRITE_WARNING(
TL(
"invalid Name counter. Check that number of pushName and popName functions calls are the same"));
207 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
209 for (PositionVector::const_iterator i = v.begin(); i != v.end(); i++) {
211 glVertex2d(p.
x(), p.
y());
212 #ifdef CHECK_ELEMENTCOUNTER
218 glVertex2d(p.
x(), p.
y());
219 #ifdef CHECK_ELEMENTCOUNTER
232 GLUtesselator* tobj = gluNewTess();
234 #pragma warning(push)
235 #pragma warning(disable: 4191)
237 #if defined(__GNUC__) && __GNUC__ >= 8
238 #pragma GCC diagnostic push
239 #pragma GCC diagnostic ignored "-Wcast-function-type"
241 gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid(
CALLBACK*)()) &glVertex3dv);
242 gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid(
CALLBACK*)()) &glBegin);
243 gluTessCallback(tobj, GLU_TESS_END, (GLvoid(
CALLBACK*)()) &glEnd);
245 #if defined(__GNUC__) && __GNUC__ >= 8
246 #pragma GCC diagnostic pop
251 gluTessProperty(tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
252 gluTessBeginPolygon(tobj,
nullptr);
253 gluTessBeginContour(tobj);
254 double* points =
new double[(v.size() + int(close)) * 3];
256 for (
int i = 0; i != (int)v.size(); ++i) {
257 points[3 * i] = v[i].x();
258 points[3 * i + 1] = v[i].y();
259 points[3 * i + 2] = 0;
260 gluTessVertex(tobj, points + 3 * i, points + 3 * i);
263 const int i = (int)v.size();
264 points[3 * i] = v[0].x();
265 points[3 * i + 1] = v[0].y();
266 points[3 * i + 2] = 0;
267 gluTessVertex(tobj, points + 3 * i, points + 3 * i);
269 gluTessEndContour(tobj);
270 gluTessEndPolygon(tobj);
278 double width,
double offset) {
280 glTranslated(beg.
x(), beg.
y(), 0);
281 glRotated(rot, 0, 0, 1);
283 glVertex2d(-width - offset, 0);
284 glVertex2d(-width - offset, -visLength);
285 glVertex2d(width - offset, -visLength);
286 glVertex2d(width - offset, 0);
289 #ifdef CHECK_ELEMENTCOUNTER
297 double rot,
double visLength,
300 glTranslated((beg2.
x() + beg1.
x())*.5, (beg2.
y() + beg1.
y())*.5, 0);
301 glRotated(rot, 0, 0, 1);
303 glVertex2d(-width, 0);
304 glVertex2d(-width, -visLength);
305 glVertex2d(width, -visLength);
306 glVertex2d(width, 0);
309 #ifdef CHECK_ELEMENTCOUNTER
317 double delta = angle2 - angle1;
318 while (delta > 180) {
321 while (delta < -180) {
330 const std::vector<double>& rots,
331 const std::vector<double>& lengths,
332 double width,
int cornerDetail,
double offset) {
334 int e = (int) geom.size() - 1;
335 for (
int i = 0; i < e; i++) {
336 drawBoxLine(geom[i], rots[i], lengths[i], width, offset);
339 if (cornerDetail > 0) {
340 for (
int i = 1; i < e; i++) {
342 glTranslated(geom[i].x(), geom[i].y(), 0.1);
343 double angleBeg = -rots[i - 1];
344 double angleEnd = 180 - rots[i];
352 if (angleEnd - angleBeg > 360) {
355 if (angleEnd - angleBeg < -360) {
359 if (angleEnd > angleBeg) {
371 const std::vector<double>& rots,
372 const std::vector<double>& lengths,
373 const std::vector<RGBColor>& cols,
374 double width,
int cornerDetail,
double offset) {
375 int e = (int) geom.size() - 1;
376 for (
int i = 0; i < e; i++) {
378 drawBoxLine(geom[i], rots[i], lengths[i], width, offset);
380 if (cornerDetail > 0) {
381 for (
int i = 1; i < e; i++) {
384 glTranslated(geom[i].x(), geom[i].y(), 0);
396 const std::vector<double>& rots,
397 const std::vector<double>& lengths,
399 int minS = (int)
MIN4(rots.size(), lengths.size(), geom1.size(), geom2.size());
400 for (
int i = 0; i < minS; i++) {
408 int e = (int) geom.size() - 1;
409 for (
int i = 0; i < e; i++) {
423 glTranslated(beg.
x(), beg.
y(), 0);
424 glRotated(rot, 0, 0, 1);
427 glVertex2d(0, -visLength);
430 #ifdef CHECK_ELEMENTCOUNTER
438 double rot,
double visLength) {
440 glTranslated((beg2.
x() + beg1.
x())*.5, (beg2.
y() + beg1.
y())*.5, 0);
441 glRotated(rot, 0, 0, 1);
444 glVertex2d(0, -visLength);
447 #ifdef CHECK_ELEMENTCOUNTER
457 int e = (int) v.size() - 1;
458 for (
int i = 0; i < e; ++i) {
459 glVertex2d(v[i].x(), v[i].y());
460 glVertex2d(v[i + 1].x(), v[i + 1].y());
461 #ifdef CHECK_ELEMENTCOUNTER
472 int e = (int) v.size() - 1;
473 for (
int i = 0; i < e; ++i) {
475 glVertex2d(v[i].x(), v[i].y());
476 glVertex2d(v[i + 1].x(), v[i + 1].y());
477 #ifdef CHECK_ELEMENTCOUNTER
488 glVertex2d(beg.
x(), beg.
y());
489 glVertex2d(end.
x(), end.
y());
491 #ifdef CHECK_ELEMENTCOUNTER
505 const double inc = (end - beg) / (
double)steps;
506 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
509 for (
int i = 0; i <= steps; ++i) {
511 glBegin(GL_TRIANGLES);
512 glVertex2d(p1.first * width, p1.second * width);
513 glVertex2d(p2.first * width, p2.second * width);
517 #ifdef CHECK_ELEMENTCOUNTER
532 double beg,
double end) {
533 const double inc = (end - beg) / (
double)steps;
534 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
537 for (
int i = 0; i <= steps; ++i) {
539 glBegin(GL_TRIANGLES);
540 glVertex2d(p1.first * width, p1.second * width);
541 glVertex2d(p2.first * width, p2.second * width);
542 glVertex2d(p2.first * iwidth, p2.second * iwidth);
544 glVertex2d(p2.first * iwidth, p2.second * iwidth);
545 glVertex2d(p1.first * iwidth, p1.second * iwidth);
546 glVertex2d(p1.first * width, p1.second * width);
550 #ifdef CHECK_ELEMENTCOUNTER
559 double tWidth,
const double extraOffset) {
561 if (length < tLength) {
562 tWidth *= length / tLength;
567 glTranslated(rl.
x(), rl.
y(), 0);
569 glTranslated(0, extraOffset, 0);
570 glBegin(GL_TRIANGLES);
571 glVertex2d(0, tLength);
572 glVertex2d(-tWidth, 0);
573 glVertex2d(+tWidth, 0);
576 #ifdef CHECK_ELEMENTCOUNTER
591 glGetDoublev(GL_CURRENT_COLOR, current);
592 return RGBColor(
static_cast<unsigned char>(current[0] * 255. + 0.5),
593 static_cast<unsigned char>(current[1] * 255. + 0.5),
594 static_cast<unsigned char>(current[2] * 255. + 0.5),
595 static_cast<unsigned char>(current[3] * 255. + 0.5));
614 const double width,
const double length,
const bool vehicle) {
617 const RGBColor green(0, 255, 0, 255);
620 const double w = width / 2. - 0.1 * exaggeration;
621 const double h = length;
623 geom.push_back(
Position(-w, +0, 0.));
624 geom.push_back(
Position(+w, +0, 0.));
625 geom.push_back(
Position(+w, +h, 0.));
626 geom.push_back(
Position(-w, +h, 0.));
627 geom.push_back(
Position(-w, +0, 0.));
638 glTranslated(pos.
x(), pos.
y(), pos.
z());
640 glRotated(rotation, 0, 0, 1);
664 const std::vector<RGBColor>&
686 const RGBColor& col,
const double angle,
const int align,
double width) {
694 glAlphaFunc(GL_GREATER, 0.5);
695 glEnable(GL_ALPHA_TEST);
698 glRasterPos3d(pos.
x(), pos.
y(), layer);
699 GLfloat color[] = {col.
red() / 255.f, col.
green() / 255.f, col.
blue() / 255.f, col.
alpha() / 255.f};
700 gl2psTextOptColor(text.c_str(),
"Roboto", 10, align == 0 ? GL2PS_TEXT_C : align, (GLfloat) - angle, color);
705 glTranslated(pos.
x(), pos.
y(), layer);
707 glRotated(-angle, 0, 0, 1);
718 const std::string& text,
const Position& pos,
728 angle, 0, 0.2, align);
734 const double layer,
const double size,
737 const double relBorder,
738 const double relMargin,
743 if (bgColor.
alpha() != 0) {
744 const double boxAngle = 90;
746 const double borderWidth = size * relBorder;
747 const double boxHeight = size * (0.32 + 0.6 * relMargin);
748 const double boxWidth = stringWidth + size * relMargin;
750 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
751 glTranslated(pos.
x(), pos.
y(), layer);
752 glRotated(-angle, 0, 0, 1);
756 left.
add(borderWidth * 1.5, 0);
758 glTranslated(0, 0, 0.01);
759 drawBoxLine(left, boxAngle, boxWidth - 3 * borderWidth, boxHeight - 2 * borderWidth);
762 drawText(text, pos, layer + 0.02, size, txtColor, angle, align);
772 const double rot =
RAD2DEG(atan2((end.
x() - f.
x()), (f.
y() - end.
y())));
773 glTranslated(end.
x(), end.
y(), 0);
774 glRotated(rot, 0, 0, 1);
786 const std::vector<double>& rots,
787 const std::vector<double>& lengths,
788 double length,
double spacing,
789 double halfWidth,
bool drawForSelection) {
792 glTranslated(0, 0, 0.1);
793 int e = (int) geom.size() - 1;
794 for (
int i = 0; i < e; ++i) {
796 glTranslated(geom[i].x(), geom[i].y(), 0.0);
797 glRotated(rots[i], 0, 0, 1);
799 if (!drawForSelection) {
800 for (
double t = 0; t < lengths[i]; t += spacing) {
802 glVertex2d(-halfWidth, -t);
803 glVertex2d(-halfWidth, -t - length);
804 glVertex2d(halfWidth, -t - length);
805 glVertex2d(halfWidth, -t);
807 #ifdef CHECK_ELEMENTCOUNTER
814 glVertex2d(-halfWidth, 0);
815 glVertex2d(-halfWidth, -lengths.back());
816 glVertex2d(halfWidth, -lengths.back());
817 glVertex2d(halfWidth, 0);
819 #ifdef CHECK_ELEMENTCOUNTER
831 const std::vector<double>& rots,
832 const std::vector<double>& lengths,
833 double maxLength,
double spacing,
834 double halfWidth,
bool cl,
bool cr,
bool lefthand,
double scale) {
843 int e = (int) geom.size() - 1;
844 for (
int i = 0; i < e; ++i) {
846 glTranslated(geom[i].x(), geom[i].y(), 2.1);
847 glRotated(rots[i], 0, 0, 1);
848 for (
double t = 0; t < lengths[i]; t += spacing) {
849 const double length =
MIN2((
double)maxLength, lengths[i] - t);
852 glVertex2d(-mw, -t - length);
853 glVertex2d(-mw2, -t - length);
854 glVertex2d(-mw2, -t);
856 #ifdef CHECK_ELEMENTCOUNTER
861 const double length2 =
MIN2((
double)6, lengths[i] - t);
863 glVertex2d(-halfWidth + 0.02, -t - length2);
864 glVertex2d(-halfWidth + 0.02, -t - length);
865 glVertex2d(-halfWidth - 0.02, -t - length);
866 glVertex2d(-halfWidth - 0.02, -t - length2);
868 #ifdef CHECK_ELEMENTCOUNTER
882 for (
int i = 0; i < (int)shape.size(); ++i) {
898 glTranslated(0, 0, 1024);
void CALLBACK combCallback(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **dataOut)
#define CIRCLE_RESOLUTION
#define WRITE_WARNING(msg)
static unsigned int data_font_Roboto_Medium_ttf_len
static unsigned char data_font_Roboto_Medium_ttf[]
T MIN4(T a, T b, T c, T d)
#define UNUSED_PARAMETER(x)
const double SUMO_const_laneMarkWidth
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
double ymin() const
Returns minimum y-coordinate.
double xmin() const
Returns minimum x-coordinate.
double ymax() const
Returns maximum y-coordinate.
double xmax() const
Returns maximum x-coordinate.
static void drawFilledPoly(const PositionVector &v, bool close)
Draws a filled polygon described by the list of points.
static void drawBoundary(const Boundary &b)
Draw a boundary (used for debugging)
static void drawFilledPolyTesselated(const PositionVector &v, bool close)
Draws a filled polygon described by the list of points.
static void drawTextBox(const std::string &text, const Position &pos, const double layer, const double size, const RGBColor &txtColor=RGBColor::BLACK, const RGBColor &bgColor=RGBColor::WHITE, const RGBColor &borderColor=RGBColor::BLACK, const double angle=0, const double relBorder=0.05, const double relMargin=0.5, const int align=0)
draw Text box with given parameters
static void resetVertexCounter()
reset vertex counter
static std::vector< std::pair< double, double > > myCircleCoords
Storage for precomputed sin/cos-values describing a circle.
static void drawLine(const Position &beg, double rot, double visLength)
Draws a thin line.
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
static void drawFilledCircle(double width, int steps=8)
Draws a filled circle around (0,0)
static struct FONScontext * myFont
Font context.
static void drawTriangleAtEnd(const Position &p1, const Position &p2, double tLength, double tWidth, const double extraOffset=0)
Draws a triangle at the end of the given line.
static void drawTextAtEnd(const std::string &text, const PositionVector &shape, double x, const GUIVisualizationTextSettings &settings, const double scale)
draw text and the end of shape
static void resetFont()
to be called when the font context is invalidated
static void pushName(unsigned int name)
push Name
static void checkCounterMatrix()
check counter matrix (for debug purposes)
static void drawOutlineCircle(double width, double iwidth, int steps=8)
Draws an unfilled circle around (0,0)
static const std::vector< RGBColor > & getDottedcontourColors(const int size)
get dotted contour colors (black and white). Vector will be automatically increased if current size i...
static std::vector< RGBColor > myDottedcontourColors
static vector with a list of alternated black/white colors (used for contours)
static int angleLookup(double angleDeg)
normalize angle for lookup in myCircleCoords
static double getTextWidth(const std::string &text, double size)
get required width of text
static int myMatrixCounter
matrix counter (for debug purposes)
static void popMatrix()
pop matrix
static void drawBoxLines(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double width, int cornerDetail=0, double offset=0)
Draws thick lines.
static int myMatrixCounterDebug
matrix counter (for debug purposes)
static RGBColor getColor()
gets the gl-color
static int getMatrixCounter()
get matrix counter
static void drawCrossTies(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double length, double spacing, double halfWidth, bool drawForSelection)
draw crossties for railroads or pedestrian crossings
static const std::vector< std::pair< double, double > > & getCircleCoords()
Storage for precomputed sin/cos-values describing a circle.
static void drawBoxLine(const Position &beg, double rot, double visLength, double width, double offset=0)
Draws a thick line.
static void checkCounterName()
check counter name (for debug purposes)
static void debugVertices(const PositionVector &shape, const GUIVisualizationTextSettings &settings, double scale, double layer=1024)
draw vertex numbers for the given shape (in a random color)
static void popName()
pop Name
static bool rightTurn(double angle1, double angle2)
whether the road makes a right turn (or goes straight)
static int myNameCounter
name counter
static void pushMatrix()
push matrix
static void setGL2PS(bool active=true)
set GL2PS
static int getVertexCounter()
get vertex counter
static void drawInverseMarkings(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double maxLength, double spacing, double halfWidth, bool cl, bool cr, bool lefthand, double scale)
@bried draw the space between markings (in road color)
static bool myGL2PSActive
whether we are currently rendering for gl2ps
static void drawText(const std::string &text, const Position &pos, const double layer, const double size, const RGBColor &col=RGBColor::BLACK, const double angle=0, const int align=0, double width=-1)
static void drawSpaceOccupancies(const double exaggeration, const Position &pos, const double rotation, const double width, const double length, const bool vehicle)
draw
static bool initFont()
init myFont
static int myVertexCounter
matrix counter (for debug purposes)
static void drawTextSettings(const GUIVisualizationTextSettings &settings, const std::string &text, const Position &pos, const double scale, const double angle=0, const double layer=2048, const int align=0)
static void resetMatrixCounter()
reset matrix counter
static double naviDegree(const double angle)
A point in 2D or 3D with translation and scaling methods.
double distanceTo(const Position &p2) const
returns the euclidean distance in 3 dimension
double x() const
Returns the x-position.
void add(const Position &pos)
Adds the given position to this one.
double z() const
Returns the z-position.
double angleTo2D(const Position &other) const
returns the angle in the plane of the vector pointing from here to the other position
double y() const
Returns the y-position.
Position positionAtOffset(double pos, double lateralOffset=0) const
Returns the position at the given length.
static const RGBColor WHITE
unsigned char red() const
Returns the red-amount of the color.
unsigned char alpha() const
Returns the alpha-amount of the color.
static const RGBColor INVISIBLE
unsigned char green() const
Returns the green-amount of the color.
unsigned char blue() const
Returns the blue-amount of the color.
static const RGBColor BLACK
static const RGBColor MAGENTA
static RGBColor randomHue(double s=1, double v=1)
Return color with random hue.
FONS_DEF void fonsSetSize(FONScontext *s, float size)
FONS_DEF float fonsDrawText(FONScontext *s, float x, float y, const char *string, const char *end)
FONS_DEF float fonsTextBounds(FONScontext *s, float x, float y, const char *string, const char *end, float *bounds)
FONS_DEF void fonsSetColor(FONScontext *s, unsigned int color)
FONS_DEF void fonsSetAlign(FONScontext *s, int align)
FONS_DEF int fonsAddFontMem(FONScontext *s, const char *name, unsigned char *data, int ndata, int freeData)
FONS_DEF void fonsSetFont(FONScontext *s, int font)
struct FONScontext FONScontext
unsigned int glfonsRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
void glfonsDelete(FONScontext *ctx)
FONScontext * glfonsCreate(int width, int height, int flags)
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
RGBColor bgColor
background text color
double scaledSize(double scale, double constFactor=0.1) const
get scale size