35#define FONTSTASH_IMPLEMENTATION
37#pragma warning(disable: 4505 5219)
40#pragma GCC diagnostic push
41#pragma GCC diagnostic ignored "-Wunused-function"
45#define GLFONTSTASH_IMPLEMENTATION
54#define CIRCLE_RESOLUTION (double)10
77 GLdouble* vertex_data[4],
78 GLfloat weight[4], GLdouble** dataOut) {
83 vertex = (GLdouble*)malloc(7 *
sizeof(GLdouble));
85 vertex[0] = coords[0];
86 vertex[1] = coords[1];
87 vertex[2] = coords[2];
95const std::vector<std::pair<double, double> >&
125#ifdef CHECK_ELEMENTCOUNTER
189 WRITE_WARNING(
"invalid matrix counter. Check that number of pushMatrix and popMatrix functions calls are the same");
200 WRITE_WARNING(
"invalid Name counter. Check that number of pushName and popName functions calls are the same");
212 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
214 for (PositionVector::const_iterator i = v.begin(); i != v.end(); i++) {
216 glVertex2d(p.
x(), p.
y());
217#ifdef CHECK_ELEMENTCOUNTER
223 glVertex2d(p.
x(), p.
y());
224#ifdef CHECK_ELEMENTCOUNTER
237 GLUtesselator* tobj = gluNewTess();
240#pragma warning(disable: 4191)
242#if defined(__GNUC__) && __GNUC__ >= 8
243#pragma GCC diagnostic push
244#pragma GCC diagnostic ignored "-Wcast-function-type"
246 gluTessCallback(tobj, GLU_TESS_VERTEX, (GLvoid(
CALLBACK*)()) &glVertex3dv);
247 gluTessCallback(tobj, GLU_TESS_BEGIN, (GLvoid(
CALLBACK*)()) &glBegin);
248 gluTessCallback(tobj, GLU_TESS_END, (GLvoid(
CALLBACK*)()) &glEnd);
250#if defined(__GNUC__) && __GNUC__ >= 8
251#pragma GCC diagnostic pop
256 gluTessProperty(tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
257 gluTessBeginPolygon(tobj,
nullptr);
258 gluTessBeginContour(tobj);
259 double* points =
new double[(v.size() + int(close)) * 3];
261 for (
int i = 0; i != (int)v.size(); ++i) {
262 points[3 * i] = v[i].x();
263 points[3 * i + 1] = v[i].y();
264 points[3 * i + 2] = 0;
265 gluTessVertex(tobj, points + 3 * i, points + 3 * i);
268 const int i = (int)v.size();
269 points[3 * i] = v[0].x();
270 points[3 * i + 1] = v[0].y();
271 points[3 * i + 2] = 0;
272 gluTessVertex(tobj, points + 3 * i, points + 3 * i);
274 gluTessEndContour(tobj);
275 gluTessEndPolygon(tobj);
283 const double halfWidth = width * 0.5;
284 const double halfHeight = height * 0.5;
286 glTranslated(center.
x(), center.
y(), 0);
288 glVertex2d(-halfWidth, halfHeight);
289 glVertex2d(-halfWidth, -halfHeight);
290 glVertex2d(halfWidth, -halfHeight);
291 glVertex2d(halfWidth, halfHeight);
294#ifdef CHECK_ELEMENTCOUNTER
301 double width,
double offset) {
303 glTranslated(beg.
x(), beg.
y(), 0);
304 glRotated(rot, 0, 0, 1);
306 glVertex2d(-width - offset, 0);
307 glVertex2d(-width - offset, -visLength);
308 glVertex2d(width - offset, -visLength);
309 glVertex2d(width - offset, 0);
312#ifdef CHECK_ELEMENTCOUNTER
320 double rot,
double visLength,
323 glTranslated((beg2.
x() + beg1.
x())*.5, (beg2.
y() + beg1.
y())*.5, 0);
324 glRotated(rot, 0, 0, 1);
326 glVertex2d(-width, 0);
327 glVertex2d(-width, -visLength);
328 glVertex2d(width, -visLength);
329 glVertex2d(width, 0);
332#ifdef CHECK_ELEMENTCOUNTER
340 double delta = angle2 - angle1;
341 while (delta > 180) {
344 while (delta < -180) {
353 const std::vector<double>& rots,
354 const std::vector<double>& lengths,
355 double width,
int cornerDetail,
double offset) {
357 int e = (int) geom.size() - 1;
358 for (
int i = 0; i < e; i++) {
359 drawBoxLine(geom[i], rots[i], lengths[i], width, offset);
362 if (cornerDetail > 0) {
363 for (
int i = 1; i < e; i++) {
365 glTranslated(geom[i].x(), geom[i].y(), 0.1);
366 double angleBeg = -rots[i - 1];
367 double angleEnd = 180 - rots[i];
375 if (angleEnd - angleBeg > 360) {
378 if (angleEnd - angleBeg < -360) {
382 if (angleEnd > angleBeg) {
394 const std::vector<double>& rots,
395 const std::vector<double>& lengths,
396 const std::vector<RGBColor>& cols,
397 double width,
int cornerDetail,
double offset) {
398 int e = (int) geom.size() - 1;
399 for (
int i = 0; i < e; i++) {
401 drawBoxLine(geom[i], rots[i], lengths[i], width, offset);
403 if (cornerDetail > 0) {
404 for (
int i = 1; i < e; i++) {
407 glTranslated(geom[i].x(), geom[i].y(), 0);
418 const std::vector<double>& rots,
419 const std::vector<double>& lengths,
421 int minS = (int)
MIN4(rots.size(), lengths.size(), geom1.size(), geom2.size());
422 for (
int i = 0; i < minS; i++) {
432 drawBoxLines(geometry.getShape(), geometry.getShapeRotations(), geometry.getShapeLengths(), width);
439 glTranslated(beg.
x(), beg.
y(), 0);
440 glRotated(rot, 0, 0, 1);
443 glVertex2d(0, -visLength);
446#ifdef CHECK_ELEMENTCOUNTER
454 double rot,
double visLength) {
456 glTranslated((beg2.
x() + beg1.
x())*.5, (beg2.
y() + beg1.
y())*.5, 0);
457 glRotated(rot, 0, 0, 1);
460 glVertex2d(0, -visLength);
463#ifdef CHECK_ELEMENTCOUNTER
473 int e = (int) v.size() - 1;
474 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 int e = (int) v.size() - 1;
489 for (
int i = 0; i < e; ++i) {
491 glVertex2d(v[i].x(), v[i].y());
492 glVertex2d(v[i + 1].x(), v[i + 1].y());
493#ifdef CHECK_ELEMENTCOUNTER
504 glVertex2d(beg.
x(), beg.
y());
505 glVertex2d(end.
x(), end.
y());
507#ifdef CHECK_ELEMENTCOUNTER
515 double beg,
double end) {
554 glVertex2d(-radius, radius);
555 glVertex2d(-radius, -radius);
556 glVertex2d(radius, -radius);
557 glVertex2d(radius, radius);
560#ifdef CHECK_ELEMENTCOUNTER
575 const double inc = (end - beg) / (
double)steps;
576 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
579 for (
int i = 0; i <= steps; ++i) {
581 glBegin(GL_TRIANGLES);
582 glVertex2d(p1.first * radius, p1.second * radius);
583 glVertex2d(p2.first * radius, p2.second * radius);
587#ifdef CHECK_ELEMENTCOUNTER
602 double beg,
double end) {
603 const double inc = (end - beg) / (
double)steps;
604 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
607 for (
int i = 0; i <= steps; ++i) {
609 glBegin(GL_TRIANGLES);
610 glVertex2d(p1.first * radius, p1.second * radius);
611 glVertex2d(p2.first * radius, p2.second * radius);
612 glVertex2d(p2.first * iRadius, p2.second * iRadius);
614 glVertex2d(p2.first * iRadius, p2.second * iRadius);
615 glVertex2d(p1.first * iRadius, p1.second * iRadius);
616 glVertex2d(p1.first * radius, p1.second * radius);
620#ifdef CHECK_ELEMENTCOUNTER
629 double tWidth,
const double extraOffset) {
631 if (length < tLength) {
632 tWidth *= length / tLength;
637 glTranslated(rl.
x(), rl.
y(), 0);
639 glTranslated(0, extraOffset, 0);
640 glBegin(GL_TRIANGLES);
641 glVertex2d(0, tLength);
642 glVertex2d(-tWidth, 0);
643 glVertex2d(+tWidth, 0);
646#ifdef CHECK_ELEMENTCOUNTER
661 glGetDoublev(GL_CURRENT_COLOR, current);
662 return RGBColor(
static_cast<unsigned char>(current[0] * 255. + 0.5),
663 static_cast<unsigned char>(current[1] * 255. + 0.5),
664 static_cast<unsigned char>(current[2] * 255. + 0.5),
665 static_cast<unsigned char>(current[3] * 255. + 0.5));
684 const double width,
const double length,
const bool vehicle) {
687 const double w = width / 2. - 0.1 * exaggeration;
688 const double h = length;
690 geom.push_back(
Position(-w, +0, 0.));
691 geom.push_back(
Position(+w, +0, 0.));
692 geom.push_back(
Position(+w, +h, 0.));
693 geom.push_back(
Position(-w, +h, 0.));
694 geom.push_back(
Position(-w, +0, 0.));
699 glTranslated(pos.
x(), pos.
y(), pos.
z());
701 glRotated(rotation, 0, 0, 1);
726const std::vector<RGBColor>&
748 const RGBColor& col,
const double angle,
const int align,
double width) {
756 glAlphaFunc(GL_GREATER, 0.5);
757 glEnable(GL_ALPHA_TEST);
760 glRasterPos3d(pos.
x(), pos.
y(), layer);
761 GLfloat color[] = {col.
red() / 255.f, col.
green() / 255.f, col.
blue() / 255.f, col.
alpha() / 255.f};
762 gl2psTextOptColor(text.c_str(),
"Roboto", 10, align == 0 ? GL2PS_TEXT_C : align, (GLfloat) - angle, color);
767 glTranslated(pos.
x(), pos.
y(), layer);
769 glRotated(-angle, 0, 0, 1);
780 const std::string& text,
const Position& pos,
790 angle, 0, 0.2, align);
796 const double layer,
const double size,
799 const double relBorder,
800 const double relMargin,
805 if (bgColor.
alpha() != 0) {
806 const double boxAngle = 90;
808 const double borderWidth = size * relBorder;
809 const double boxHeight = size * (0.32 + 0.6 * relMargin);
810 const double boxWidth = stringWidth + size * relMargin;
812 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
813 glTranslated(pos.
x(), pos.
y(), layer);
814 glRotated(-angle, 0, 0, 1);
818 left.
add(borderWidth * 1.5, 0);
820 glTranslated(0, 0, 0.01);
821 drawBoxLine(left, boxAngle, boxWidth - 3 * borderWidth, boxHeight - 2 * borderWidth);
824 drawText(text, pos, layer + 0.02, size, txtColor, angle, align);
834 const double rot =
RAD2DEG(atan2((end.
x() - f.
x()), (f.
y() - end.
y())));
835 glTranslated(end.
x(), end.
y(), 0);
836 glRotated(rot, 0, 0, 1);
849 const std::vector<double>& lengths,
double length,
double spacing,
850 double halfWidth,
double offset,
bool lessDetail) {
853 glTranslated(0, 0, 0.1);
854 int e = (int) geom.size() - 1;
855 for (
int i = 0; i < e; ++i) {
857 glTranslated(geom[i].x(), geom[i].y(), 0.0);
858 glRotated(rots[i], 0, 0, 1);
861 for (
double t = 0; t < lengths[i]; t += spacing) {
863 glVertex2d(-halfWidth - offset, -t);
864 glVertex2d(-halfWidth - offset, -t - length);
865 glVertex2d(halfWidth - offset, -t - length);
866 glVertex2d(halfWidth - offset, -t);
868#ifdef CHECK_ELEMENTCOUNTER
875 glVertex2d(-halfWidth - offset, 0);
876 glVertex2d(-halfWidth - offset, -lengths.back());
877 glVertex2d(halfWidth - offset, -lengths.back());
878 glVertex2d(halfWidth - offset, 0);
880#ifdef CHECK_ELEMENTCOUNTER
892 const std::vector<double>& rots,
893 const std::vector<double>& lengths,
894 double maxLength,
double spacing,
895 double halfWidth,
bool cl,
bool cr,
bool lefthand,
double scale) {
904 int e = (int) geom.size() - 1;
906 for (
int i = 0; i < e; ++i) {
908 glTranslated(geom[i].x(), geom[i].y(), 2.1);
909 glRotated(rots[i], 0, 0, 1);
911 for (t = offset; t < lengths[i]; t += spacing) {
912 const double length =
MIN2((
double)maxLength, lengths[i] - t);
915 glVertex2d(-mw, -t - length);
916 glVertex2d(-mw2, -t - length);
917 glVertex2d(-mw2, -t);
919#ifdef CHECK_ELEMENTCOUNTER
924 const double length2 =
MIN2((
double)6, lengths[i] - t);
926 glVertex2d(-halfWidth + 0.02, -t - length2);
927 glVertex2d(-halfWidth + 0.02, -t - length);
928 glVertex2d(-halfWidth - 0.02, -t - length);
929 glVertex2d(-halfWidth - 0.02, -t - length2);
931#ifdef CHECK_ELEMENTCOUNTER
936 offset = t - lengths[i] - spacing;
945 for (
int i = 0; i < (int)shape.size(); ++i) {
962 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)
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 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 drawOutlineCircle(double radius, double iRadius, int steps=8)
Draws an unfilled 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 drawFilledCircle(const double widradiusth, const int steps=8)
Draws a filled 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 void drawBoundary(const GUIVisualizationSettings &s, const Boundary &b)
Draw a boundary (used for debugging)
static RGBColor getColor()
gets the gl-color
static int getMatrixCounter()
get matrix counter
static void drawRectangle(const Position ¢er, const double width, const double height)
Draws a rectangle line.
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 drawFilledCircleDetailled(const GUIVisualizationSettings::Detail d, const double radius)
Draws a filled circle around (0,0) depending of level of detail.
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 drawCrossTies(const PositionVector &geom, const std::vector< double > &rots, const std::vector< double > &lengths, double length, double spacing, double halfWidth, double offset, bool lessDetail)
draw crossties for railroads or pedestrian crossings
static void resetMatrixCounter()
reset matrix counter
Stores the information about how to visualize structures.
bool drawBoundaries
enable or disable draw boundaries
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 dimensions
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 (in radians bet...
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.
static const RGBColor GREEN
unsigned char blue() const
Returns the blue-amount of the color.
static const RGBColor BLACK
static const RGBColor MAGENTA
static const RGBColor RED
named colors
#define UNUSED_PARAMETER(x)
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
FONScontext * glfonsCreate(int width, int height, int flags)
unsigned int glfonsRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
void glfonsDelete(FONScontext *ctx)
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