#include "camera/Camera.h" #include "Xml.h" #include "Track.h" #include #include #include #include #include #include // fmod #include #include GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0}; /* Red diffuse light. */ GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; /* Infinite light location. */ Camera camera; // TODO(dev): // As per https://www.opengl.org/resources/libraries/glut/spec3/node11.html // "Therefore, GLUT programs should not assume the window was created at the specified size or position. // A GLUT program should use the window's reshape callback to determine the true size of the window." void draw_origin() { // X: glBegin(GL_LINE_STRIP); glColor3d(0, 0, 0); glVertex3f(-10.0f, 0.0f, 0.0f); glColor3d(255, 0, 0); glVertex3f(0.0f, 0.0f, 0.0f); glColor3d(0, 0, 0); glVertex3f(10.0f, 0.0f, 0.0f); glEnd(); // Y: glBegin(GL_LINE_STRIP); glVertex3f(0.0f, -10.0f, 0.0f); glColor3d(0, 255, 0); glVertex3f(0.0f, 0.0f, 0.0f); glColor3d(0, 0, 0); glVertex3f(0.0f, 10.0f, 0.0f); glEnd(); // Z: glBegin(GL_LINE_STRIP); glVertex3f(0.0f, 0.0f, -10.0f); glColor3d(0, 0, 255); glVertex3f(0.0f, 0.0f, 0.0f); glColor3d(0, 0, 0); glVertex3f(0.0f, 0.0f, 10.0f); glEnd(); } void display() { // RESET: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glLineWidth(1.0f); //camera.RotateYaw(0.01); static double asdf = -10.0; asdf += 0.02; if(asdf > 15.0) asdf = -15.0; gluLookAt(-15.0, 30.0, -asdf, /* eye is at */ 0.0, 5.0, 0.0, /* center is at */ 0.0, 1.0, 0.0); /* up is in positive Y direction */ draw_origin(); // DRAW TRACKS: for(auto track : tracks) draw(track); glutSwapBuffers(); } void init() { // dvereb: srand(time(NULL)); glColor3d(1.0, 1.0, 1.0); /* Enable a single OpenGL light. */ // glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); // glLightfv(GL_LIGHT0, GL_POSITION, light_position); // glEnable(GL_LIGHT0); // glEnable(GL_LIGHTING); /* Use depth buffering for hidden surface elimination. */ glEnable(GL_DEPTH_TEST); /* Setup the view of the cube. */ glMatrixMode(GL_PROJECTION); gluPerspective( /* field of view in degree */ 70.0, /* aspect ratio */ 1.0, /* Z near */ 1.0, /* Z far */ 1000.0); glMatrixMode(GL_MODELVIEW); gluLookAt(-10.0, 25.0, -10.0, /* eye is at */ 0.0, 0.0, 0.0, /* center is at */ 0.0, 1.0, 0.0); /* up is in positive Y direction */ } int main(int argc, char *argv[]) { if(argc != 2) { std::cerr << "You pust pass the folder which contains gpx files." << std::endl; return -1; } std::vector files; for(const auto& entry : std::experimental::filesystem::directory_iterator(argv[1])) { auto extension = entry.path().extension(); if(extension == ".gpx") files.push_back(entry.path().string()); } for(auto file : files) ParseFile(tracks, file); // NORMALIZE TRACKS TO VIEWPORT: bool first = true; float min_lat, min_lon, min_ele, max_lat, max_lon, max_ele; for(auto &track : tracks) { for(auto &p : track.points) { if(first) { first = false; min_lat = max_lat = p.lat; min_lon = max_lon = p.lon; min_ele = max_ele = p.ele; } else { if(p.lat < min_lat) min_lat = p.lat; else if(p.lat > max_lat) max_lat = p.lat; if(p.lon < min_lon) min_lon = p.lon; else if(p.lon > max_lon) max_lon = p.lon; if(p.ele < min_ele) min_ele = p.ele; else if(p.ele > max_ele) max_ele = p.ele; } } } auto lat_diff = min_lat + ((max_lat - min_lat) / 2.0); auto lon_diff = min_lon + ((max_lon - min_lon) / 2.0); auto ele_diff = min_ele; for(auto &track : tracks) { for(auto &p : track.points) { p.lat -= lat_diff; p.lon -= lon_diff; p.ele -= ele_diff; } } glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA | GLUT_MULTISAMPLE); glutInit(&argc, argv); glutCreateWindow("3D GPX Viewer"); glutDisplayFunc(display); // NOTE(dev): lmfao: // glutSetCursor(GLUT_CURSOR_SPRAY); glutSetCursor(GLUT_CURSOR_FULL_CROSSHAIR); init(); camera.Init(); camera.Fly(50); camera.RotatePitch(-89 * M_PI / 180.0); glutMainLoop(); return 0; }