int main(int argc, char** argv) { --argc; ++argv; const int WIDTH = 800; const int HEIGHT = 600; /* * Create window */ sf::RenderWindow window(sf::VideoMode(WIDTH, HEIGHT), "Window", sf::Style::Default, sf::ContextSettings(32)); /* * Initialize GLEW */ GLenum status = glewInit(); if(status != GLEW_OK) { std::cerr << "[F] GLEW NOT INITIALIZED: "; std::cerr << glewGetErrorString(status) << std::endl; window.close(); return -1; } glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); //glFrontFace(GL_CW); //glCullFace(GL_BACK); //glEnable(GL_CULL_FACE); glClearDepth(1.f); glShadeModel(GL_SMOOTH); /* * Create GUI */ tgui::Gui gui(window); tgui::Gui gui2(window); gui.setGlobalFont("fonts/DejaVuSans.ttf"); loadWidgets(gui, gui2, window); char* args[argc + 1]; /* * load geometry */ Model cube; getArgs(argc, argv, ".obj", args); if (!args[0]) { std::cerr << "[F] MUST SUPPLY 1+ OBJ FILES IN COMMAND LINE ARGS <filename.obj>" << std::endl; exit(-1); } //if cube.mesh = loadMesh(args[0]); if (!cube.mesh) { exit(-1); } //if getArgs(argc, argv, ".scale", args); if (args[0]) { cube.scale = glm::vec3(strtof(args[0], NULL)); } //if else { cube.scale = glm::vec3(1.0f); } //else /* * load shaders */ Shader vertexShader(GL_VERTEX_SHADER); getArgs(argc, argv, ".vs", args); vertexShader.loadFromFile(args[0]? args[0] : ".vs"); vertexShader.compile(); Shader fragmentShader(GL_FRAGMENT_SHADER); getArgs(argc, argv, ".fs", args); fragmentShader.loadFromFile(args[0]? args[0] : ".fs"); fragmentShader.compile(); /* * create program */ ShaderProgram program; program.attachShader(vertexShader); program.attachShader(fragmentShader); program.linkProgram(); program.addAttribute("vertexPosition_modelspace"); program.addAttribute("vertexUV"); //program.addAttribute("vertexNormal_modelspace"); program.addUniform("MVP"); program.addUniform("sampler"); Camera camera; sf::Event event; tgui::Callback callback; Planet p(&cube); /* * main loop */ while (window.isOpen()) { while (window.pollEvent(event)) { switch (event.type) { case sf::Event::Closed: window.close(); break; case sf::Event::Resized: glViewport(0, 0, event.size.width, event.size.height); camera.projection = glm::perspective(45.0f, float(event.size.width)/float(event.size.height), 0.01f, 100.0f); break; default: break; } //switch gui.handleEvent(event); } //if while (gui.pollCallback(callback)) { gui.handleEvent(event); } //if window.clear(); guiDraw(window, gui2); glClear(GL_DEPTH_BUFFER_BIT); /* * render OpenGL here */ //glValidateProgram(program.program); for (Planet* planet : planets) { render(*planet, camera, program); } //for guiDraw(window, gui); window.display(); } //while // Clean up after ourselves if (window.isOpen()) { window.close(); } //if return EXIT_SUCCESS; } //main
void eoMainLoop() { while ( ! engVarDone ) { tickStartFrame(); //Keep track of time SDL_Event event; while ( SDL_PollEvent(&event) ) { switch(event.type) { case SDL_QUIT: engVarDone = 1; break; case SDL_KEYDOWN: inputKeyDown( event.key.keysym ); break; case SDL_KEYUP: inputKeyUp( event.key.keysym ); break; case SDL_MOUSEMOTION: inputMouseMove( event.motion ); break; case SDL_MOUSEBUTTONDOWN: inputMouseButton( event.button ); break; case SDL_MOUSEBUTTONUP: inputMouseButton( event.button ); break; case SDL_JOYAXISMOTION: inputJoyMove( event.jaxis ); break; case SDL_JOYBUTTONDOWN: inputJoyButton( event.jbutton ); break; case SDL_JOYBUTTONUP: inputJoyButton( event.jbutton ); break; } } //Run keys inputRunKeys(); engRender(); gameRun(); //Render 2D overlays. guiDraw(); //Music sndRun(); tickStopLogic(); SDL_GL_SwapBuffers(); //If we don't have vsync on, or if we are above 60 fps. int dt = ticksLogic(); if( !(dt>0 && dt < 16) ) dt=0; #ifndef WIN32 usleep(16666-dt*1000); #else Sleep(16-dt); #endif if( engVarShowTimes ) eoPrint("Frame time: %i ms. Code time: %i ms.", eoTicks(), dt ); } }