Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

GLString.cpp 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. /*!
  2. * \file test/GLString.cpp
  3. * \brief Open GL rendering font/string Unit Test
  4. *
  5. * \author Mongoose
  6. */
  7. #include <math.h>
  8. #include <SDL/SDL.h>
  9. #ifdef __APPLE__
  10. #include <OpenGL/glu.h>
  11. #else
  12. #include <GL/glu.h>
  13. #endif
  14. #include <Texture.h>
  15. #include <GLString.h>
  16. GLString *TEXT;
  17. SDL_Surface *SDL_WINDOW = NULL;
  18. Texture gTexture;
  19. void swap_buffers();
  20. void event_resize(int width, int height) {
  21. glMatrixMode(GL_PROJECTION);
  22. GLfloat aspect = (GLfloat)width/(GLfloat)height;
  23. // Mongoose 2002.01.01, Setup view volume, with a nice FOV
  24. // xythobuz:
  25. // gluPerspective is deprecated!
  26. // gluPerspective(40.0, aspect, 1, 2000);
  27. // fix: http://stackoverflow.com/a/2417756
  28. GLfloat fH = tanf(40.0f / 360.0f * 3.14159f);
  29. GLfloat fW = fH * aspect;
  30. glFrustum(-fW, fW, -fH, fH, 1, 2000);
  31. glMatrixMode(GL_MODELVIEW);
  32. }
  33. void event_display(int width, int height) {
  34. static float x = 0.0f, y = 0.0f, z = -150.0f, r = 0.0f;
  35. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  36. glLoadIdentity();
  37. glTranslatef(0.0f, 0.0f, -20.0f);
  38. glRotatef((float)cosf(r)*180.0f, 0.0f, 0.0f, 1.0f);
  39. r += 0.01f;
  40. // Mongoose 2002.01.01, Render color quad
  41. glDisable(GL_TEXTURE_2D);
  42. glBegin(GL_TRIANGLE_STRIP);
  43. glColor3f(1.0, 0.0, 0.0);
  44. glVertex3f(x + 50, y + 50, z);
  45. glColor3f(0.0, 1.0, 0.0);
  46. glVertex3f(x - 50, y + 50, z);
  47. glColor3f(0.0, 0.0, 1.0);
  48. glVertex3f(x + 50, y - 50, z);
  49. glColor3f(0.5, 0.5, 0.5);
  50. glVertex3f(x - 50, y - 50, z);
  51. glEnd();
  52. // Mongoose 2002.01.01, Render text
  53. glDisable(GL_CULL_FACE);
  54. glEnable(GL_BLEND);
  55. glEnable(GL_TEXTURE_2D);
  56. glColor3f(0.75, 0.5, 1.0);
  57. glEnterMode2d(width, height);
  58. TEXT->Render();
  59. glExitMode2d();
  60. glFlush();
  61. swap_buffers();
  62. }
  63. void swap_buffers() {
  64. SDL_GL_SwapBuffers();
  65. }
  66. void shutdown_gl() {
  67. SDL_Quit();
  68. }
  69. void init_gl(unsigned int width, unsigned int height) {
  70. int i;
  71. const char *errorText = "TEXT->glPrintf> ERROR code %i\n";
  72. // Setup GL
  73. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  74. glShadeModel(GL_SMOOTH);
  75. glEnable(GL_DEPTH_TEST);
  76. glDepthFunc(GL_LESS);
  77. glEnable(GL_BLEND);
  78. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  79. event_resize(width, height);
  80. // Mongoose 2002.01.01, Texture setup
  81. gTexture.reset();
  82. gTexture.setFlag(Texture::fUseMipmaps);
  83. gTexture.setMaxTextureCount(32);
  84. gTexture.loadFontTTF("data/test.ttf", 32, 126 - 32); // ASCII
  85. TEXT->Init(4);
  86. i = TEXT->glPrintf((width/2)-50, height/2-32, "OpenRaider");
  87. if (i) {
  88. printf(errorText, i);
  89. }
  90. i = TEXT->glPrintf((width/2)-50, height/2, "GLString");
  91. if (i) {
  92. printf(errorText, i);
  93. }
  94. TEXT->Scale(1.2f);
  95. i = TEXT->glPrintf((width/2)-100, height/2+32, "Unit Test by Mongoose");
  96. if (i) {
  97. printf(errorText, i);
  98. }
  99. i = TEXT->glPrintf((width/2)-100, height/2+64, "ported to TTF by xythobuz");
  100. if (i) {
  101. printf(errorText, i);
  102. }
  103. TEXT->setActive(0, true);
  104. TEXT->setActive(1, true);
  105. TEXT->setActive(2, true);
  106. TEXT->setActive(3, true);
  107. }
  108. [[noreturn]] void main_gl() {
  109. SDL_Event event;
  110. unsigned int mkeys, mod, key;
  111. int flags;
  112. unsigned int width = 640;
  113. unsigned int height = 480;
  114. bool fullscreen = false;
  115. #ifndef __APPLE__
  116. char *driver = NULL;
  117. #endif
  118. // Setup clean up on exit
  119. atexit(shutdown_gl);
  120. // Create GL context
  121. SDL_Init(SDL_INIT_VIDEO);
  122. #ifndef __APPLE__
  123. if (!driver || !driver[0] || SDL_GL_LoadLibrary(driver) < 0) {
  124. SDL_ClearError();
  125. // Fallback 1
  126. if (SDL_GL_LoadLibrary("libGL.so") < 0) {
  127. SDL_ClearError();
  128. // Fallback 2
  129. if (SDL_GL_LoadLibrary("libGL.so.1") < 0) {
  130. fprintf(stderr, "main_gl> SDL_GL_LoadLibrary failed!\n");
  131. fprintf(stderr, "main_gl> Error is [%s].\n", SDL_GetError());
  132. exit(1);
  133. }
  134. }
  135. }
  136. #endif
  137. flags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER;
  138. if (fullscreen) {
  139. flags |= SDL_FULLSCREEN;
  140. SDL_ShowCursor(SDL_DISABLE);
  141. }
  142. SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
  143. SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
  144. SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
  145. SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
  146. SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  147. SDL_WINDOW = SDL_SetVideoMode(width, height, 16, flags);
  148. SDL_WM_SetCaption("GLString Test", "GLString Test");
  149. SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
  150. // Init rendering
  151. init_gl(width, height);
  152. for (;;) {
  153. // Pause for 10-20 ms
  154. SDL_Delay(10);
  155. event_display(width, height);
  156. while (SDL_PollEvent(&event)) {
  157. switch (event.type) {
  158. case SDL_QUIT:
  159. exit(0);
  160. case SDL_MOUSEMOTION:
  161. break;
  162. case SDL_MOUSEBUTTONDOWN:
  163. case SDL_MOUSEBUTTONUP:
  164. break;
  165. case SDL_KEYDOWN:
  166. mkeys = (unsigned int)SDL_GetModState();
  167. mod = 0;
  168. if (mkeys & KMOD_LSHIFT)
  169. mod |= KMOD_LSHIFT;
  170. if (mkeys & KMOD_RSHIFT)
  171. mod |= KMOD_RSHIFT;
  172. if (mkeys & KMOD_LCTRL)
  173. mod |= KMOD_LCTRL;
  174. if (mkeys & KMOD_RCTRL)
  175. mod |= KMOD_RCTRL;
  176. if (mkeys & KMOD_LALT)
  177. mod |= KMOD_LALT;
  178. if (mkeys & KMOD_RALT)
  179. mod |= KMOD_RALT;
  180. if (mkeys & KMOD_LMETA)
  181. mod |= KMOD_LMETA;
  182. if (mkeys & KMOD_RMETA)
  183. mod |= KMOD_RMETA;
  184. key = event.key.keysym.sym;
  185. switch (key)
  186. {
  187. case 0x1B: // 27d, ESC
  188. exit(0);
  189. #ifdef __APPLE__
  190. case 113: // q
  191. if ((mod & KMOD_RMETA) || (mod & KMOD_LMETA))
  192. exit(0);
  193. break;
  194. #endif
  195. case 114: // r
  196. break;
  197. }
  198. break;
  199. case SDL_KEYUP:
  200. break;
  201. case SDL_VIDEORESIZE:
  202. width = event.resize.w;
  203. height = event.resize.h;
  204. event_resize(width, height);
  205. event_display(width, height);
  206. break;
  207. }
  208. }
  209. }
  210. }
  211. int main(int argc, char *argv[]) {
  212. if (argc == 1) {
  213. TEXT = new GLString();
  214. main_gl();
  215. } else {
  216. printf("Usage:\n\t%s\n", argv[0]);
  217. return 1;
  218. }
  219. }