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];
90const std::vector<std::pair<double, double> >&
120#ifdef CHECK_ELEMENTCOUNTER
184 WRITE_WARNING(
"invalid matrix counter. Check that number of pushMatrix and popMatrix functions calls are the same");
195 WRITE_WARNING(
"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();
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 const double halfWidth = width * 0.5;
279 const double halfHeight = height * 0.5;
281 glTranslated(center.
x(), center.
y(), 0);
283 glVertex2d(-halfWidth, halfHeight);
284 glVertex2d(-halfWidth, -halfHeight);
285 glVertex2d(halfWidth, -halfHeight);
286 glVertex2d(halfWidth, halfHeight);
289#ifdef CHECK_ELEMENTCOUNTER
296 double width,
double offset) {
298 glTranslated(beg.
x(), beg.
y(), 0);
299 glRotated(rot, 0, 0, 1);
301 glVertex2d(-width - offset, 0);
302 glVertex2d(-width - offset, -visLength);
303 glVertex2d(width - offset, -visLength);
304 glVertex2d(width - offset, 0);
307#ifdef CHECK_ELEMENTCOUNTER
315 double rot,
double visLength,
318 glTranslated((beg2.
x() + beg1.
x())*.5, (beg2.
y() + beg1.
y())*.5, 0);
319 glRotated(rot, 0, 0, 1);
321 glVertex2d(-width, 0);
322 glVertex2d(-width, -visLength);
323 glVertex2d(width, -visLength);
324 glVertex2d(width, 0);
327#ifdef CHECK_ELEMENTCOUNTER
335 double delta = angle2 - angle1;
336 while (delta > 180) {
339 while (delta < -180) {
348 const std::vector<double>& rots,
349 const std::vector<double>& lengths,
350 double width,
int cornerDetail,
double offset) {
352 int e = (int) geom.size() - 1;
353 for (
int i = 0; i < e; i++) {
354 drawBoxLine(geom[i], rots[i], lengths[i], width, offset);
357 if (cornerDetail > 0) {
358 for (
int i = 1; i < e; i++) {
360 glTranslated(geom[i].x(), geom[i].y(), 0.1);
361 double angleBeg = -rots[i - 1];
362 double angleEnd = 180 - rots[i];
370 if (angleEnd - angleBeg > 360) {
373 if (angleEnd - angleBeg < -360) {
377 if (angleEnd > angleBeg) {
389 const std::vector<double>& rots,
390 const std::vector<double>& lengths,
391 const std::vector<RGBColor>& cols,
392 double width,
int cornerDetail,
double offset) {
393 int e = (int) geom.size() - 1;
394 for (
int i = 0; i < e; i++) {
396 drawBoxLine(geom[i], rots[i], lengths[i], width, offset);
398 if (cornerDetail > 0) {
399 for (
int i = 1; i < e; i++) {
402 glTranslated(geom[i].x(), geom[i].y(), 0);
413 const std::vector<double>& rots,
414 const std::vector<double>& lengths,
416 int minS = (int)
MIN4(rots.size(), lengths.size(), geom1.size(), geom2.size());
417 for (
int i = 0; i < minS; i++) {
425 int e = (int) geom.size() - 1;
426 for (
int i = 0; i < e; i++) {
440 glTranslated(beg.
x(), beg.
y(), 0);
441 glRotated(rot, 0, 0, 1);
444 glVertex2d(0, -visLength);
447#ifdef CHECK_ELEMENTCOUNTER
455 double rot,
double visLength) {
457 glTranslated((beg2.
x() + beg1.
x())*.5, (beg2.
y() + beg1.
y())*.5, 0);
458 glRotated(rot, 0, 0, 1);
461 glVertex2d(0, -visLength);
464#ifdef CHECK_ELEMENTCOUNTER
474 int e = (int) v.size() - 1;
475 for (
int i = 0; i < e; ++i) {
476 glVertex2d(v[i].x(), v[i].y());
477 glVertex2d(v[i + 1].x(), v[i + 1].y());
478#ifdef CHECK_ELEMENTCOUNTER
489 int e = (int) v.size() - 1;
490 for (
int i = 0; i < e; ++i) {
492 glVertex2d(v[i].x(), v[i].y());
493 glVertex2d(v[i + 1].x(), v[i + 1].y());
494#ifdef CHECK_ELEMENTCOUNTER
505 glVertex2d(beg.
x(), beg.
y());
506 glVertex2d(end.
x(), end.
y());
508#ifdef CHECK_ELEMENTCOUNTER
516 double beg,
double end) {
555 glVertex2d(-radius, radius);
556 glVertex2d(-radius, -radius);
557 glVertex2d(radius, -radius);
558 glVertex2d(radius, radius);
561#ifdef CHECK_ELEMENTCOUNTER
576 const double inc = (end - beg) / (
double)steps;
577 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
580 for (
int i = 0; i <= steps; ++i) {
582 glBegin(GL_TRIANGLES);
583 glVertex2d(p1.first * radius, p1.second * radius);
584 glVertex2d(p2.first * radius, p2.second * radius);
588#ifdef CHECK_ELEMENTCOUNTER
603 double beg,
double end) {
604 const double inc = (end - beg) / (
double)steps;
605 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
608 for (
int i = 0; i <= steps; ++i) {
610 glBegin(GL_TRIANGLES);
611 glVertex2d(p1.first * radius, p1.second * radius);
612 glVertex2d(p2.first * radius, p2.second * radius);
613 glVertex2d(p2.first * iRadius, p2.second * iRadius);
615 glVertex2d(p2.first * iRadius, p2.second * iRadius);
616 glVertex2d(p1.first * iRadius, p1.second * iRadius);
617 glVertex2d(p1.first * radius, p1.second * radius);
621#ifdef CHECK_ELEMENTCOUNTER
630 double tWidth,
const double extraOffset) {
632 if (length < tLength) {
633 tWidth *= length / tLength;
638 glTranslated(rl.
x(), rl.
y(), 0);
640 glTranslated(0, extraOffset, 0);
641 glBegin(GL_TRIANGLES);
642 glVertex2d(0, tLength);
643 glVertex2d(-tWidth, 0);
644 glVertex2d(+tWidth, 0);
647#ifdef CHECK_ELEMENTCOUNTER
662 glGetDoublev(GL_CURRENT_COLOR, current);
663 return RGBColor(
static_cast<unsigned char>(current[0] * 255. + 0.5),
664 static_cast<unsigned char>(current[1] * 255. + 0.5),
665 static_cast<unsigned char>(current[2] * 255. + 0.5),
666 static_cast<unsigned char>(current[3] * 255. + 0.5));
685 const double width,
const double length,
const bool vehicle) {
688 const RGBColor green(0, 255, 0, 255);
691 const double w = width / 2. - 0.1 * exaggeration;
692 const double h = length;
694 geom.push_back(
Position(-w, +0, 0.));
695 geom.push_back(
Position(+w, +0, 0.));
696 geom.push_back(
Position(+w, +h, 0.));
697 geom.push_back(
Position(-w, +h, 0.));
698 geom.push_back(
Position(-w, +0, 0.));
709 glTranslated(pos.
x(), pos.
y(), pos.
z());
711 glRotated(rotation, 0, 0, 1);
735const std::vector<RGBColor>&
757 const RGBColor& col,
const double angle,
const int align,
double width) {
765 glAlphaFunc(GL_GREATER, 0.5);
766 glEnable(GL_ALPHA_TEST);
769 glRasterPos3d(pos.
x(), pos.
y(), layer);
770 GLfloat color[] = {col.
red() / 255.f, col.
green() / 255.f, col.
blue() / 255.f, col.
alpha() / 255.f};
771 gl2psTextOptColor(text.c_str(),
"Roboto", 10, align == 0 ? GL2PS_TEXT_C : align, (GLfloat) - angle, color);
776 glTranslated(pos.
x(), pos.
y(), layer);
778 glRotated(-angle, 0, 0, 1);
789 const std::string& text,
const Position& pos,
799 angle, 0, 0.2, align);
805 const double layer,
const double size,
808 const double relBorder,
809 const double relMargin,
814 if (bgColor.
alpha() != 0) {
815 const double boxAngle = 90;
817 const double borderWidth = size * relBorder;
818 const double boxHeight = size * (0.32 + 0.6 * relMargin);
819 const double boxWidth = stringWidth + size * relMargin;
821 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
822 glTranslated(pos.
x(), pos.
y(), layer);
823 glRotated(-angle, 0, 0, 1);
827 left.
add(borderWidth * 1.5, 0);
829 glTranslated(0, 0, 0.01);
830 drawBoxLine(left, boxAngle, boxWidth - 3 * borderWidth, boxHeight - 2 * borderWidth);
833 drawText(text, pos, layer + 0.02, size, txtColor, angle, align);
843 const double rot =
RAD2DEG(atan2((end.
x() - f.
x()), (f.
y() - end.
y())));
844 glTranslated(end.
x(), end.
y(), 0);
845 glRotated(rot, 0, 0, 1);
858 const std::vector<double>& lengths,
double length,
double spacing,
859 double halfWidth,
double offset,
bool lessDetail) {
862 glTranslated(0, 0, 0.1);
863 int e = (int) geom.size() - 1;
864 for (
int i = 0; i < e; ++i) {
866 glTranslated(geom[i].x(), geom[i].y(), 0.0);
867 glRotated(rots[i], 0, 0, 1);
870 for (
double t = 0; t < lengths[i]; t += spacing) {
872 glVertex2d(-halfWidth - offset, -t);
873 glVertex2d(-halfWidth - offset, -t - length);
874 glVertex2d(halfWidth - offset, -t - length);
875 glVertex2d(halfWidth - offset, -t);
877#ifdef CHECK_ELEMENTCOUNTER
884 glVertex2d(-halfWidth - offset, 0);
885 glVertex2d(-halfWidth - offset, -lengths.back());
886 glVertex2d(halfWidth - offset, -lengths.back());
887 glVertex2d(halfWidth - offset, 0);
889#ifdef CHECK_ELEMENTCOUNTER
901 const std::vector<double>& rots,
902 const std::vector<double>& lengths,
903 double maxLength,
double spacing,
904 double halfWidth,
bool cl,
bool cr,
bool lefthand,
double scale) {
913 int e = (int) geom.size() - 1;
915 for (
int i = 0; i < e; ++i) {
917 glTranslated(geom[i].x(), geom[i].y(), 2.1);
918 glRotated(rots[i], 0, 0, 1);
920 for (t = offset; t < lengths[i]; t += spacing) {
921 const double length =
MIN2((
double)maxLength, lengths[i] - t);
924 glVertex2d(-mw, -t - length);
925 glVertex2d(-mw2, -t - length);
926 glVertex2d(-mw2, -t);
928#ifdef CHECK_ELEMENTCOUNTER
933 const double length2 =
MIN2((
double)6, lengths[i] - t);
935 glVertex2d(-halfWidth + 0.02, -t - length2);
936 glVertex2d(-halfWidth + 0.02, -t - length);
937 glVertex2d(-halfWidth - 0.02, -t - length);
938 glVertex2d(-halfWidth - 0.02, -t - length2);
940#ifdef CHECK_ELEMENTCOUNTER
945 offset = t - lengths[i] - spacing;
954 for (
int i = 0; i < (int)shape.size(); ++i) {
971 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 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.
unsigned char blue() const
Returns the blue-amount of the color.
static const RGBColor BLACK
static const RGBColor MAGENTA
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