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(
"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();
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 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);
414 const std::vector<double>& rots,
415 const std::vector<double>& lengths,
417 int minS = (int)
MIN4(rots.size(), lengths.size(), geom1.size(), geom2.size());
418 for (
int i = 0; i < minS; i++) {
426 int e = (int) geom.size() - 1;
427 for (
int i = 0; i < e; i++) {
441 glTranslated(beg.
x(), beg.
y(), 0);
442 glRotated(rot, 0, 0, 1);
445 glVertex2d(0, -visLength);
448 #ifdef CHECK_ELEMENTCOUNTER
456 double rot,
double visLength) {
458 glTranslated((beg2.
x() + beg1.
x())*.5, (beg2.
y() + beg1.
y())*.5, 0);
459 glRotated(rot, 0, 0, 1);
462 glVertex2d(0, -visLength);
465 #ifdef CHECK_ELEMENTCOUNTER
475 int e = (int) v.size() - 1;
476 for (
int i = 0; i < e; ++i) {
477 glVertex2d(v[i].x(), v[i].y());
478 glVertex2d(v[i + 1].x(), v[i + 1].y());
479 #ifdef CHECK_ELEMENTCOUNTER
490 int e = (int) v.size() - 1;
491 for (
int i = 0; i < e; ++i) {
493 glVertex2d(v[i].x(), v[i].y());
494 glVertex2d(v[i + 1].x(), v[i + 1].y());
495 #ifdef CHECK_ELEMENTCOUNTER
506 glVertex2d(beg.
x(), beg.
y());
507 glVertex2d(end.
x(), end.
y());
509 #ifdef CHECK_ELEMENTCOUNTER
517 double beg,
double end) {
556 glVertex2d(-radius, radius);
557 glVertex2d(-radius, -radius);
558 glVertex2d(radius, -radius);
559 glVertex2d(radius, radius);
562 #ifdef CHECK_ELEMENTCOUNTER
577 const double inc = (end - beg) / (
double)steps;
578 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
581 for (
int i = 0; i <= steps; ++i) {
583 glBegin(GL_TRIANGLES);
584 glVertex2d(p1.first * radius, p1.second * radius);
585 glVertex2d(p2.first * radius, p2.second * radius);
589 #ifdef CHECK_ELEMENTCOUNTER
604 double beg,
double end) {
605 const double inc = (end - beg) / (
double)steps;
606 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
609 for (
int i = 0; i <= steps; ++i) {
611 glBegin(GL_TRIANGLES);
612 glVertex2d(p1.first * radius, p1.second * radius);
613 glVertex2d(p2.first * radius, p2.second * radius);
614 glVertex2d(p2.first * iRadius, p2.second * iRadius);
616 glVertex2d(p2.first * iRadius, p2.second * iRadius);
617 glVertex2d(p1.first * iRadius, p1.second * iRadius);
618 glVertex2d(p1.first * radius, p1.second * radius);
622 #ifdef CHECK_ELEMENTCOUNTER
631 double tWidth,
const double extraOffset) {
633 if (length < tLength) {
634 tWidth *= length / tLength;
639 glTranslated(rl.
x(), rl.
y(), 0);
641 glTranslated(0, extraOffset, 0);
642 glBegin(GL_TRIANGLES);
643 glVertex2d(0, tLength);
644 glVertex2d(-tWidth, 0);
645 glVertex2d(+tWidth, 0);
648 #ifdef CHECK_ELEMENTCOUNTER
663 glGetDoublev(GL_CURRENT_COLOR, current);
664 return RGBColor(
static_cast<unsigned char>(current[0] * 255. + 0.5),
665 static_cast<unsigned char>(current[1] * 255. + 0.5),
666 static_cast<unsigned char>(current[2] * 255. + 0.5),
667 static_cast<unsigned char>(current[3] * 255. + 0.5));
686 const double width,
const double length,
const bool vehicle) {
689 const RGBColor green(0, 255, 0, 255);
692 const double w = width / 2. - 0.1 * exaggeration;
693 const double h = length;
695 geom.push_back(
Position(-w, +0, 0.));
696 geom.push_back(
Position(+w, +0, 0.));
697 geom.push_back(
Position(+w, +h, 0.));
698 geom.push_back(
Position(-w, +h, 0.));
699 geom.push_back(
Position(-w, +0, 0.));
710 glTranslated(pos.
x(), pos.
y(), pos.
z());
712 glRotated(rotation, 0, 0, 1);
736 const std::vector<RGBColor>&
758 const RGBColor& col,
const double angle,
const int align,
double width) {
766 glAlphaFunc(GL_GREATER, 0.5);
767 glEnable(GL_ALPHA_TEST);
770 glRasterPos3d(pos.
x(), pos.
y(), layer);
771 GLfloat color[] = {col.
red() / 255.f, col.
green() / 255.f, col.
blue() / 255.f, col.
alpha() / 255.f};
772 gl2psTextOptColor(text.c_str(),
"Roboto", 10, align == 0 ? GL2PS_TEXT_C : align, (GLfloat) - angle, color);
777 glTranslated(pos.
x(), pos.
y(), layer);
779 glRotated(-angle, 0, 0, 1);
790 const std::string& text,
const Position& pos,
800 angle, 0, 0.2, align);
806 const double layer,
const double size,
809 const double relBorder,
810 const double relMargin,
815 if (bgColor.
alpha() != 0) {
816 const double boxAngle = 90;
818 const double borderWidth = size * relBorder;
819 const double boxHeight = size * (0.32 + 0.6 * relMargin);
820 const double boxWidth = stringWidth + size * relMargin;
822 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
823 glTranslated(pos.
x(), pos.
y(), layer);
824 glRotated(-angle, 0, 0, 1);
828 left.
add(borderWidth * 1.5, 0);
830 glTranslated(0, 0, 0.01);
831 drawBoxLine(left, boxAngle, boxWidth - 3 * borderWidth, boxHeight - 2 * borderWidth);
834 drawText(text, pos, layer + 0.02, size, txtColor, angle, align);
844 const double rot =
RAD2DEG(atan2((end.
x() - f.
x()), (f.
y() - end.
y())));
845 glTranslated(end.
x(), end.
y(), 0);
846 glRotated(rot, 0, 0, 1);
859 const std::vector<double>& lengths,
double length,
double spacing,
860 double halfWidth,
double offset,
bool lessDetail) {
863 glTranslated(0, 0, 0.1);
864 int e = (int) geom.size() - 1;
865 for (
int i = 0; i < e; ++i) {
867 glTranslated(geom[i].x(), geom[i].y(), 0.0);
868 glRotated(rots[i], 0, 0, 1);
871 for (
double t = 0; t < lengths[i]; t += spacing) {
873 glVertex2d(-halfWidth - offset, -t);
874 glVertex2d(-halfWidth - offset, -t - length);
875 glVertex2d(halfWidth - offset, -t - length);
876 glVertex2d(halfWidth - offset, -t);
878 #ifdef CHECK_ELEMENTCOUNTER
885 glVertex2d(-halfWidth - offset, 0);
886 glVertex2d(-halfWidth - offset, -lengths.back());
887 glVertex2d(halfWidth - offset, -lengths.back());
888 glVertex2d(halfWidth - offset, 0);
890 #ifdef CHECK_ELEMENTCOUNTER
902 const std::vector<double>& rots,
903 const std::vector<double>& lengths,
904 double maxLength,
double spacing,
905 double halfWidth,
bool cl,
bool cr,
bool lefthand,
double scale) {
914 int e = (int) geom.size() - 1;
916 for (
int i = 0; i < e; ++i) {
918 glTranslated(geom[i].x(), geom[i].y(), 2.1);
919 glRotated(rots[i], 0, 0, 1);
921 for (t = offset; t < lengths[i]; t += spacing) {
922 const double length =
MIN2((
double)maxLength, lengths[i] - t);
925 glVertex2d(-mw, -t - length);
926 glVertex2d(-mw2, -t - length);
927 glVertex2d(-mw2, -t);
929 #ifdef CHECK_ELEMENTCOUNTER
934 const double length2 =
MIN2((
double)6, lengths[i] - t);
936 glVertex2d(-halfWidth + 0.02, -t - length2);
937 glVertex2d(-halfWidth + 0.02, -t - length);
938 glVertex2d(-halfWidth - 0.02, -t - length);
939 glVertex2d(-halfWidth - 0.02, -t - length2);
941 #ifdef CHECK_ELEMENTCOUNTER
946 offset = t - lengths[i] - spacing;
956 for (
int i = 0; i < (int)shape.size(); ++i) {
973 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 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 (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
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