Main.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "Header.h"
  2. //Prototypes
  3. void bindFuncOpenGL(void);
  4. void configureOpenGL(void);
  5. void loadModels(void);
  6. static int Width;
  7. static int Height;
  8. float lastFrameTime = 0;
  9. bool keys[255];
  10. vector<ObjModel*> models;
  11. int currentModel = 0;
  12. struct Camera
  13. {
  14. float posX = -30;
  15. float posY = -30;
  16. float posZ = -30;
  17. float rotX = 0;
  18. float rotY = 0;
  19. } camera;
  20. void display()
  21. {
  22. glClearColor(0.6f, 0.6f, 1, 1);
  23. glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
  24. glMatrixMode(GL_PROJECTION);
  25. glLoadIdentity();
  26. gluPerspective(60.0f, (float)Width / Height, 0.5, 300);
  27. glMatrixMode(GL_MODELVIEW);
  28. glLoadIdentity();
  29. glRotatef(camera.rotX, 1, 0, 0);
  30. glRotatef(camera.rotY, 0, 1, 0);
  31. glTranslatef(camera.posX, camera.posY, camera.posZ);
  32. //Draw here
  33. models[currentModel]->draw();
  34. glDisable(GL_TEXTURE_2D);
  35. glutSwapBuffers();
  36. }
  37. void move(float angle, float fac, bool heigth)
  38. {
  39. camera.posX += (float)cos((camera.rotY + angle) / 180 * M_PI) * fac;
  40. camera.posZ += (float)sin((camera.rotY + angle) / 180 * M_PI) * fac;
  41. if(heigth)
  42. camera.posY += (float)sin((camera.rotX + angle) / 180 * M_PI) * fac;
  43. }
  44. void idle()
  45. {
  46. float frameTime = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
  47. float deltaTime = frameTime - lastFrameTime;
  48. lastFrameTime = frameTime;
  49. float speed = 10;
  50. if (keys['a']) move(0, deltaTime*speed, false);
  51. if (keys['d']) move(180, deltaTime*speed, false);
  52. if (keys['w']) move(90, deltaTime*speed, true);
  53. if (keys['s']) move(270, deltaTime*speed, true);
  54. glutPostRedisplay();
  55. }
  56. void mousemotion(int x, int y)
  57. {
  58. int dx = x - Width / 2;
  59. int dy = y - Height / 2;
  60. if ((dx != 0 || dy != 0) && abs(dx) < 400 && abs(dy) < 400)
  61. {
  62. camera.rotY += dx / 10.0f;
  63. camera.rotX += dy / 10.0f;
  64. glutWarpPointer(Width / 2, Height / 2);
  65. }
  66. }
  67. void keyboard(unsigned char key, int, int)
  68. {
  69. if (key == 27)
  70. exit(0);
  71. keys[key] = true;
  72. }
  73. void keyboardup(unsigned char key, int, int)
  74. {
  75. keys[key] = false;
  76. }
  77. int main(int argc, char* argv[])
  78. {
  79. //Init GLUT
  80. glutInit(&argc, argv);
  81. //Configre OpenGL and FreeGLut
  82. configureOpenGL();
  83. //Bind functions
  84. bindFuncOpenGL();
  85. //Init models
  86. loadModels();
  87. //Start the main loop
  88. glutMainLoop();
  89. return 0;
  90. }
  91. void bindFuncOpenGL()
  92. {
  93. glutDisplayFunc(display);
  94. glutIdleFunc(idle);
  95. glutReshapeFunc([](int w, int h) { Width = w; Height= h; glViewport(0, 0, w, h); });
  96. //Keyboard
  97. glutKeyboardFunc(keyboard);
  98. glutKeyboardUpFunc(keyboardup);
  99. //Mouse
  100. //glutMouseFunc(mouse);
  101. glutPassiveMotionFunc(mousemotion);
  102. }
  103. void configureOpenGL()
  104. {
  105. //Init window and glut display mode
  106. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  107. glutInitWindowSize(800, 600);
  108. glutCreateWindow("Crystal Point");
  109. glutFullScreen();
  110. //Depth testing
  111. glEnable(GL_DEPTH_TEST);
  112. //Alpha blending
  113. glEnable(GL_BLEND);
  114. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  115. //Alpha testing
  116. glEnable(GL_ALPHA_TEST);
  117. glAlphaFunc(GL_GREATER, 0.01f);
  118. //Lighting
  119. GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  120. GLfloat mat_shininess[] = { 50.0 };
  121. GLfloat light_position[] = { 30.0, 30.0, 30.0, 0.0 };
  122. glClearColor(0.0, 0.0, 0.0, 0.0);
  123. glShadeModel(GL_SMOOTH);
  124. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  125. glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
  126. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  127. glEnable(GL_LIGHTING);
  128. glEnable(GL_LIGHT0);
  129. //Cursor
  130. glutWarpPointer(Width / 2, Height / 2);
  131. glutSetCursor(GLUT_CURSOR_NONE);
  132. }
  133. void loadModels()
  134. {
  135. models.push_back(new ObjModel("models/ship/shipA_OBJ.obj"));
  136. }