int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_Window* displayWindow = SDL_CreateWindow("", 100, 100, 800, 600, SDL_WINDOW_OPENGL); SDL_GL_CreateContext(displayWindow); Display_InitGL(); Display_SetViewport(800, 600); Display_Render(displayWindow); SDL_Delay(2000); SDL_Quit(); return 0; }
OpenGLWindow::OpenGLWindow(int width, int height) { SDL_Init(SDL_INIT_VIDEO); // Ask for OpenGL 3.2 context SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); SDL_RendererInfo displayRendererInfo; SDL_CreateWindowAndRenderer(width, height, SDL_WINDOW_OPENGL, &displayWindow, &displayRenderer); SDL_GLContext glContext = SDL_GL_CreateContext(displayWindow); SDL_GetRendererInfo(displayRenderer, &displayRendererInfo); // Check that we have OpenGL glewExperimental = GL_TRUE; GLenum err = glewInit(); if (GLEW_OK != err) { fprintf(stdout, "Error: %s\n", glewGetErrorString(err)); } fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); if (glewIsSupported("GL_VERSION_3_2")) { fprintf(stdout, "OpenGl 3.2 supported.\n"); } if ((displayRendererInfo.flags & SDL_RENDERER_ACCELERATED) == 0 || (displayRendererInfo.flags & SDL_RENDERER_TARGETTEXTURE) == 0) { /*TODO: Handle this. We have no render surface and not accelerated. */ } while ((err = glGetError()) != GL_NO_ERROR) { std::cerr << err; } Display_InitGL(); while ((err = glGetError()) != GL_NO_ERROR) { std::cerr << err; } Display_SetViewport(width, height); while ((err = glGetError()) != GL_NO_ERROR) { std::cerr << err; } }
int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 8); SDL_CreateWindowAndRenderer(1920, 1200, SDL_WINDOW_OPENGL, &displayWindow, &displayRenderer); SDL_GetRendererInfo(displayRenderer, &displayRendererInfo); Display_InitGL(); Display_SetViewport(1920, 1200); bool quit = false; for(int i = 0; i < NUM_MOTORS; i++) { motors[i].setAngle(180); } while(!quit) { SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: { quit = true; break; } case SDL_MOUSEBUTTONDOWN: { if(event.button.button == SDL_BUTTON_LEFT) { if(zoomed == -1) { int x = event.motion.x / 192; int y = event.motion.y / 109; zoomed = x + y * 10; printf("p:%f,i:%f,d:%f\t\tovershoot:%f steady_error:%f\n", motors[zoomed].getP(), motors[zoomed].getI(), motors[zoomed].getD(), motors[zoomed].getOverShoot(), motors[zoomed].getSteadyState()); } else { zoomed = -1; } } break; } } } const unsigned char* state = SDL_GetKeyboardState(0); if(state[SDL_SCANCODE_ESCAPE]) { quit = true; } static bool space_held = false; if(state[SDL_SCANCODE_SPACE] && !space_held) { space_held = true; sortMotors(); breedMotors(); } else if(state[SDL_SCANCODE_SPACE] != true) { space_held = false; } SDL_GetMouseState(&mouse_x, &mouse_y); long now = SDL_GetTicks(); static long last = now; deltatime = ((float)(now - last)) / 1000.0; last = now; abstime += deltatime; static float lastsetTime = abstime + 0.2; if(abstime >= lastsetTime) { lastsetTime = abstime + 0.2; if(zoomed == -1) { sortMotors(); breedMotors(); planner.motors[0].setPid(motors[0].getP(), motors[0].getI(), motors[0].getD()); planner.motors[1].setPid(motors[0].getP(), motors[0].getI(), motors[0].getD()); } } static float kp = 3; static float ki = 0.5; static float kd = 0.5; if(state[SDL_SCANCODE_U]) { kp += deltatime; } if(state[SDL_SCANCODE_J]) { kp -= deltatime; if(kp < 0) { kp = 0; } } if(state[SDL_SCANCODE_I]) { ki += deltatime; } if(state[SDL_SCANCODE_K]) { ki -= deltatime; if(ki < 0) { ki = 0; } } if(state[SDL_SCANCODE_O]) { kd += deltatime; } if(state[SDL_SCANCODE_L]) { kd -= deltatime; if(kd < 0) { kd = 0; } } if(zoomed == -1) { #pragma omp parallel #pragma omp for for(int i = 0; i < NUM_MOTORS; i++) { for(int k = 0; k < 10000; k++) { motors[i].update(deltatime); } } } else { float angle = motors[zoomed].getAngle(); if(state[SDL_SCANCODE_LEFT]) { angle += deltatime * 20; motors[zoomed].setAngle(angle, false); } if(state[SDL_SCANCODE_RIGHT]) { angle -= deltatime * 20; motors[zoomed].setAngle(angle, false); } motors[zoomed].update(deltatime, 0.05); } glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 1920 , 1200, 0 , -100, 100); glMatrixMode(GL_MODELVIEW); Display_Render(); SDL_RenderPresent(displayRenderer); } SDL_Quit(); return 0; }
int main(int argc, char *argv[]) { SDL_Window *window; // Declare a pointer, main window GLfloat dx = 0; GLfloat dy = 0; GLfloat zoom = 1.0; min_x = 0; max_x = width; min_y = 0; max_y = height; // Initialize SDL2 if (SDL_Init(SDL_INIT_VIDEO) != 0) { fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } // Create an application window with the following settings: window = SDL_CreateWindow("Drawing - OpenGL", // window title SDL_WINDOWPOS_UNDEFINED, // initial x position SDL_WINDOWPOS_UNDEFINED, // initial y position width, // width, in pixels height, // height, in pixels SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE // flags ); // Check that the window was successfully created if (window == NULL) { // In the case that the window could not be made... fprintf(stderr, "SDL_CreateWindow failed: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } SDL_Renderer *displayRenderer = NULL; SDL_RendererInfo displayRendererInfo; displayRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_GetRendererInfo(displayRenderer, &displayRendererInfo); if ((displayRendererInfo.flags & SDL_RENDERER_ACCELERATED) == 0 || (displayRendererInfo.flags & SDL_RENDERER_TARGETTEXTURE) == 0) { fprintf(stderr, "We have no render surface and not accelerated.\n"); } Display_InitGL(); Display_SetViewport(width, height, dx, dy, zoom); int fullscreen = 0; int drag = 0; int xcursor = 0; int ycursor = 0; SDL_Event event; int quit = 0; time_t t = time(NULL); time_t ctime = time(NULL); int frames = 0; Display_Render(displayRenderer, width, height, dx, dy, zoom); while (!quit) { Display_SetViewport(width, height, dx, dy, zoom); Display_Render(displayRenderer, width, height, dx, dy, zoom); while (SDL_PollEvent(&event)) // User's actions { switch (event.type) { case SDL_QUIT: // Close button quit = 1; break; case SDL_KEYUP: // Key release if (event.key.keysym.sym == SDLK_f) // F key { if (fullscreen == 0) { fullscreen = 1; SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN); } else if (fullscreen == 1) { fullscreen = 0; SDL_SetWindowFullscreen(window, 0); } } if (event.key.keysym.sym == SDLK_KP_PLUS) { if (zoom > 0.1) { dx = dx + 0.1 * pixelsize * (xcursor - width / 2); dy = dy - 0.1 * pixelsize * (ycursor - height / 2); } if (zoom > 0.1) zoom -= 0.1; } if (event.key.keysym.sym == SDLK_KP_MINUS) { dx = dx - 0.1 * pixelsize * (xcursor - width / 2); dy = dy + 0.1 * pixelsize * (ycursor - height / 2); zoom += 0.1; } if (event.key.keysym.sym == SDLK_r) { zoom = 1.0; dx = 0.0; dy = 0.0; } break; case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: width = event.window.data1; height = event.window.data2; break; case SDL_WINDOWEVENT_SIZE_CHANGED: width = event.window.data1; height = event.window.data2; break; default: // printf("Window %d got unknown event %d\n", event.window.windowID, event.window.event); break; } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) drag = 1; break; case SDL_MOUSEBUTTONUP: if (event.button.button == SDL_BUTTON_LEFT) drag = 0; break; case SDL_MOUSEMOTION: xcursor = event.motion.x; ycursor = event.motion.y; if (drag != 0) { dx -= pixelsize * event.motion.xrel * zoom; dy += pixelsize * event.motion.yrel * zoom; } break; case SDL_MOUSEWHEEL: if (zoom > 0.03) { dx = dx + 0.03 * pixelsize * event.wheel.y * (xcursor - width / 2); dy = dy - 0.03 * pixelsize * event.wheel.y * (ycursor - height / 2); } if (event.wheel.y > 0 && zoom > 0.01) zoom -= 0.03; else if (event.wheel.y < 0) zoom += 0.03; break; default: //printf("unknown event"); break; } } frames++; ctime = time(NULL); if (t != ctime) { t = ctime; fprintf(stdout, "%d fps\n", frames); frames = 0; } } // Close and destroy the window SDL_DestroyWindow(window); // Clean up SDL_Quit(); return EXIT_SUCCESS; }
int Display_Application(int argc, char *argv[]) { SDL_Window *window; // Declare a pointer, main window int width = 640; int height = 480; GLdouble dx = 0; GLdouble dy = 0; GLdouble zoom = 1.0; initNodesBounds(argv[1]); min_x = minx; max_x = maxx; min_y = miny; max_y = maxy; // Initialize SDL2 if (SDL_Init(SDL_INIT_VIDEO) != 0) { fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } // Create an application window with the following settings: window = SDL_CreateWindow("OSM Renderer", // window title SDL_WINDOWPOS_UNDEFINED, // initial x position SDL_WINDOWPOS_UNDEFINED, // initial y position width, // width, in pixels height, // height, in pixels SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE // flags ); // Check that the window was successfully created if (window == NULL) { // In the case that the window could not be made... fprintf(stderr, "SDL_CreateWindow failed: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } fprintf(stdout, "Press the 'F' key to switch fullscreen.\n"); fprintf(stdout, "Press the 'R' key to reset the view.\n"); fprintf(stdout, "Press the [x] button to close the window.\n"); SDL_Renderer *displayRenderer = NULL; SDL_RendererInfo displayRendererInfo; displayRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_GetRendererInfo(displayRenderer, &displayRendererInfo); if ((displayRendererInfo.flags & SDL_RENDERER_ACCELERATED) == 0 || (displayRendererInfo.flags & SDL_RENDERER_TARGETTEXTURE) == 0) { fprintf(stderr, "We have no render surface and not accelerated.\n"); } Display_InitGL(); Display_SetViewport(width, height, dx, dy, zoom); int fullscreen = 0; int drag = 0; int xcursor = 0; int ycursor = 0; SDL_Event event; int quit = 0; time_t t = time(NULL); time_t ctime = time(NULL); int frames = 0; GList *l; for (l = g_hash_table_get_values(ways_hashtable); l != NULL; l = l->next) { way *w = l->data; w->glist = tessellate(*w); } g_list_free(l); while (!quit) { Display_SetViewport(width, height, dx, dy, zoom); Display_Render(displayRenderer, width, height, dx, dy, zoom); while (SDL_PollEvent(&event)) // User's actions { switch (event.type) { case SDL_QUIT: // Close button quit = 1; break; case SDL_KEYUP: // Key release if (event.key.keysym.sym == SDLK_f) // F key { if (fullscreen == 0) { fullscreen = 1; SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN); } else if (fullscreen == 1) { fullscreen = 0; SDL_SetWindowFullscreen(window, 0); } } if (event.key.keysym.sym == SDLK_KP_PLUS) { if (zoom > 0.1) { dx = dx + 0.1 * pixelsize * (xcursor - width / 2); dy = dy - 0.1 * pixelsize * (ycursor - height / 2); } if (zoom > 0.1) zoom -= 0.1; } if (event.key.keysym.sym == SDLK_KP_MINUS) { dx = dx - 0.1 * pixelsize * (xcursor - width / 2); dy = dy + 0.1 * pixelsize * (ycursor - height / 2); zoom += 0.1; } if (event.key.keysym.sym == SDLK_r) { zoom = 1.0; dx = 0.0; dy = 0.0; } if (event.key.keysym.sym == SDLK_s) { if (showFrame) showFrame = 0; else showFrame = 1; } if (event.key.keysym.sym == SDLK_c) { screenshoot = 1; } if (event.key.keysym.sym == SDLK_p) { projection = !projection; if (projection) { min_x = minx; max_x = maxx; min_y = miny; max_y = maxy; } else { min_x = minlon; max_x = maxlon; min_y = minlat; max_y = maxlat; } } break; case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: width = event.window.data1; height = event.window.data2; break; case SDL_WINDOWEVENT_SIZE_CHANGED: width = event.window.data1; height = event.window.data2; break; default: // printf("Window %d got unknown event %d\n", event.window.windowID, event.window.event); break; } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) drag = 1; break; case SDL_MOUSEBUTTONUP: if (event.button.button == SDL_BUTTON_LEFT) drag = 0; break; case SDL_MOUSEMOTION: xcursor = event.motion.x; ycursor = event.motion.y; if (drag != 0) { dx -= pixelsize * event.motion.xrel * zoom; dy += pixelsize * event.motion.yrel * zoom; } break; case SDL_MOUSEWHEEL: if (zoom > 0.01) { dx = dx + 0.02 * pixelsize * event.wheel.y * (xcursor - width / 2); dy = dy - 0.02 * pixelsize * event.wheel.y * (ycursor - height / 2); } if (event.wheel.y > 0 && zoom > 0.01) zoom -= 0.02; else if (event.wheel.y < 0) zoom += 0.02; break; default: //printf("unknown event"); break; } } frames++; ctime = time(NULL); if (t != ctime) { t = ctime; //fprintf(stdout, "%d fps\n", frames); frames = 0; } } // Close and destroy the window SDL_DestroyWindow(window); // Clean up SDL_Quit(); return EXIT_SUCCESS; }