dariahinz

Linus Open gl

Dec 18th, 2017
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <GL/glx.h>
  4. #include <GL/gl.h>
  5. #include <GL/glu.h>
  6. #include <X11/extensions/xf86vmode.h>
  7. #include <X11/keysym.h>
  8. #include "render.h"
  9.  
  10. // struktura parametrow okna
  11. typedef struct {
  12. Display *dpy;
  13. int screen;
  14. Window win;
  15. GLXContext ctx;
  16. XSetWindowAttributes attr;
  17. Bool fs;
  18. XF86VidModeModeInfo deskMode;
  19. int x, y;
  20. unsigned int width, height;
  21. unsigned int depth;
  22. } GLWindow;
  23.  
  24. // atrybuty dla trybu jednobuforowego w formacie RGBA
  25. // co najmniej 4 bity na kolor oraz 16 bitow bufor glebokosci
  26. static int attrListSgl[] = {GLX_RGBA,
  27. GLX_RED_SIZE, 4,
  28. GLX_GREEN_SIZE, 4,
  29. GLX_BLUE_SIZE, 4,
  30. GLX_DEPTH_SIZE, 16,
  31. None};
  32.  
  33. // atrybuty dla tryby podwojnego buforowego w formacie RGBA
  34. // co najmniej 4 bity na kolor oraz 16 bitow bufor glebokosci
  35. static int attrListDbl[] = { GLX_RGBA, GLX_DOUBLEBUFFER,
  36. GLX_RED_SIZE, 4,
  37. GLX_GREEN_SIZE, 4,
  38. GLX_BLUE_SIZE, 4,
  39. GLX_DEPTH_SIZE, 16,
  40. None };
  41.  
  42. GLWindow GLWin;
  43. int counter=0;
  44. //int iMx,iMy;
  45. Bool done;
  46.  
  47.  
  48. // funkcja do zwalniania uzywanych zasobow oraz przywracania starego pulpitu
  49. void killGLWindow(void)
  50. { if (GLWin.ctx)
  51. { if (!glXMakeCurrent(GLWin.dpy, None, NULL))
  52. printf("Could not release drawing context.\n");
  53. glXDestroyContext(GLWin.dpy, GLWin.ctx);
  54. GLWin.ctx = NULL;
  55. }
  56. // przywrocenie oryginalnej rozdzielczosci w przypadku trybu fullscreen
  57. if (GLWin.fs)
  58. { XF86VidModeSwitchToMode(GLWin.dpy, GLWin.screen, &GLWin.deskMode);
  59. XF86VidModeSetViewPort(GLWin.dpy, GLWin.screen, 0, 0);
  60. }
  61. XCloseDisplay(GLWin.dpy);
  62. }
  63.  
  64. // tworzenie okna o zadanych parametrach
  65. Bool createGLWindow(char* title, int width, int height, int bits,
  66. Bool fullscreenflag)
  67. { XVisualInfo *vi;
  68. Colormap cmap;
  69. int dpyWidth, dpyHeight;
  70. int i;
  71. int glxMajorVersion, glxMinorVersion;
  72. int vidModeMajorVersion, vidModeMinorVersion;
  73. XF86VidModeModeInfo **modes;
  74. int modeNum;
  75. int bestMode;
  76. Atom wmDelete;
  77. Window winDummy;
  78. unsigned int borderDummy;
  79.  
  80. GLWin.fs = fullscreenflag;
  81. bestMode = 0; // zaznaczenie obecnego trybu jako najlepszego
  82. GLWin.dpy = XOpenDisplay(0); // pobranie wyswietlacza
  83. GLWin.screen = DefaultScreen(GLWin.dpy);
  84.  
  85. // okreslenie wersji XF86VidModeExtension
  86. XF86VidModeQueryVersion(GLWin.dpy, &vidModeMajorVersion,
  87. &vidModeMinorVersion);
  88. printf("XF86VidModeExtension-Version %d.%d\n", vidModeMajorVersion,
  89. vidModeMinorVersion);
  90. XF86VidModeGetAllModeLines(GLWin.dpy, GLWin.screen, &modeNum, &modes);
  91. GLWin.deskMode = *modes[0]; // zapamietanie rozdzielczosci pulpitu
  92.  
  93. // przeszukiwanie trybow w celu odnalezienia zadanej rozdzielczosci okna
  94. for (i = 0; i < modeNum; i++)
  95. if ((modes[i]->hdisplay == width) && (modes[i]->vdisplay == height))
  96. bestMode = i;
  97.  
  98. // okreslenie trybu wizualizacji (jedno- czy dwubuforowy)
  99. vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListDbl);
  100. if (vi == NULL)
  101. { vi = glXChooseVisual(GLWin.dpy, GLWin.screen, attrListSgl);
  102. printf("Only Singlebuffered Visual!\n");
  103. }
  104. else printf("Got Doublebuffered Visual!\n");
  105.  
  106. // okreslenie wersji glX
  107. glXQueryVersion(GLWin.dpy, &glxMajorVersion, &glxMinorVersion);
  108. printf("glX-Version %d.%d\n", glxMajorVersion, glxMinorVersion);
  109.  
  110. // tworzenie kontekstu renderowania GLX i mapy kolorow
  111. GLWin.ctx = glXCreateContext(GLWin.dpy, vi, 0, GL_TRUE);
  112. cmap = XCreateColormap(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen),
  113. vi->visual, AllocNone);
  114. GLWin.attr.colormap = cmap;
  115. GLWin.attr.border_pixel = 0;
  116.  
  117. if (GLWin.fs)
  118. { XF86VidModeSwitchToMode(GLWin.dpy, GLWin.screen, modes[bestMode]);
  119. XF86VidModeSetViewPort(GLWin.dpy, GLWin.screen, 0, 0);
  120. dpyWidth = modes[bestMode]->hdisplay;
  121. dpyHeight = modes[bestMode]->vdisplay;
  122. printf("Resolution %dx%d\n", dpyWidth, dpyHeight);
  123. XFree(modes);
  124.  
  125. // tworzenie okna w trybie pelnoekranowym
  126. GLWin.attr.override_redirect = True;
  127. GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask |
  128. StructureNotifyMask | PointerMotionMask;
  129. GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen),
  130. 0, 0, dpyWidth, dpyHeight, 0, vi->depth, InputOutput, vi->visual,
  131. CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect,
  132. &GLWin.attr);
  133. XWarpPointer(GLWin.dpy, None, GLWin.win, 0, 0, 0, 0, 0, 0);
  134. XMapRaised(GLWin.dpy, GLWin.win);
  135. XGrabKeyboard(GLWin.dpy, GLWin.win, True, GrabModeAsync,
  136. GrabModeAsync, CurrentTime);
  137. XGrabPointer(GLWin.dpy, GLWin.win, True, ButtonPressMask,
  138. GrabModeAsync, GrabModeAsync, GLWin.win, None, CurrentTime);
  139. }
  140. else
  141. { // tworzenie okna w trybie okienkowym
  142. GLWin.attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask |
  143. StructureNotifyMask | PointerMotionMask;
  144. GLWin.win = XCreateWindow(GLWin.dpy, RootWindow(GLWin.dpy, vi->screen),
  145. 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual,
  146. CWBorderPixel | CWColormap | CWEventMask, &GLWin.attr);
  147. wmDelete = XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", True);
  148. XSetWMProtocols(GLWin.dpy, GLWin.win, &wmDelete, 1);
  149. XSetStandardProperties(GLWin.dpy, GLWin.win, title,
  150. title, None, NULL, 0, NULL);
  151. XMapRaised(GLWin.dpy, GLWin.win);
  152. }
  153.  
  154. // zaznaczenie kontekstu renderowania jako aktywnego
  155. glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx);
  156. XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y,
  157. &GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth);
  158. printf("Depth %d\n", GLWin.depth);
  159. if (glXIsDirect(GLWin.dpy, GLWin.ctx))
  160. printf("Congrats, you have Direct Rendering!\n");
  161. else
  162. printf("Sorry, no Direct Rendering possible!\n");
  163. if (!initGL()) // inicjacja OpenGL (render.cpp)
  164. { printf("Could not initialize OpenGL.\nAborting...\n");
  165. return False;
  166. }
  167. else resizeGLScene(GLWin.width, GLWin.height);
  168.  
  169. return True;
  170. }
  171.  
  172. // funkcja okreslajaca reakcje na wcisniecie klawisza
  173. void keyPressed(KeySym key)
  174. {
  175. switch (key)
  176. { case XK_Escape:
  177. done = True;
  178. break;
  179. case XK_F1:
  180. killGLWindow();
  181. GLWin.fs = !GLWin.fs;
  182. createGLWindow("X Window + OpenGL",640, 480, 24, GLWin.fs);
  183. CreateMaze(); // definicja list wyswietlania (render.cpp)
  184. break;
  185. }
  186. }
  187.  
  188. int main(int argc, char **argv)
  189. {
  190. XEvent event;
  191. KeySym key;
  192.  
  193. done = False;
  194.  
  195. GLWin.fs = False; // domyslne odpalenie trybu okienkowego
  196. if (!createGLWindow("X Window + OpenGL", 640, 480, 24, GLWin.fs))
  197. done = True;
  198. CreateMaze(); // definicja list wyswietlania (render.cpp)
  199.  
  200. // petla obslugi zdarzen
  201. while (!done)
  202. { // uchwyt do kolejki zdarzen
  203. while (XPending(GLWin.dpy) > 0)
  204. { XNextEvent(GLWin.dpy, &event);
  205. switch (event.type)
  206. { case Expose: // odswiezenia okna
  207. if (event.xexpose.count != 0) break;
  208. // drawGLScene(counter); // rysowanie przeniesione poza switch
  209. break;
  210. case ConfigureNotify: // zmiana rozmiaru okna
  211. if ((event.xconfigure.width !=int(GLWin.width)) ||
  212. (event.xconfigure.height !=int(GLWin.height)))
  213. { GLWin.width = event.xconfigure.width;
  214. GLWin.height = event.xconfigure.height;
  215. // printf("Resize event\n");
  216. resizeGLScene(event.xconfigure.width,
  217. event.xconfigure.height); // zmiana rozmiaru (render.cpp)
  218. }
  219. break;
  220. case MotionNotify: // wykrycie ruchu myszy
  221. // iMx=event.xmotion.x;
  222. // iMy=event.xmotion.y;
  223. break;
  224. case ButtonPress: // wcisniecie przycisku myszy
  225. break;
  226. case KeyPress: // wcisniecie klawisza
  227. key = XLookupKeysym(&event.xkey, 0);
  228. keyPressed(key);
  229. break;
  230. case ClientMessage:
  231. if (*XGetAtomName(GLWin.dpy, event.xclient.message_type)
  232. == *"WM_PROTOCOLS")
  233. { printf("Exiting sanely...\n");
  234. done = True;
  235. }
  236. break;
  237. default:
  238. break;
  239. }
  240. }
  241.  
  242. if (++counter >= 360) counter = 0;
  243.  
  244. drawGLScene(counter); // rysowanie sceny (render.cpp)
  245. glXSwapBuffers(GLWin.dpy,GLWin.win);
  246. }
  247. killGLWindow();
  248. return 0;
  249. }
Add Comment
Please, Sign In to add comment