Clone of mesa.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

uglbounce.c 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /*
  2. * Bouncing ball demo.
  3. *
  4. * This program is in the public domain
  5. *
  6. * Brian Paul
  7. *
  8. * Conversion to GLUT by Mark J. Kilgard
  9. *
  10. * Conversion to UGL/Mesa by Stephane Raimbault
  11. */
  12. #include <math.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <ugl/ugl.h>
  16. #include <ugl/uglevent.h>
  17. #include <ugl/uglinput.h>
  18. #include <GL/uglmesa.h>
  19. #define COS(X) cos( (X) * 3.14159/180.0 )
  20. #define SIN(X) sin( (X) * 3.14159/180.0 )
  21. #define RED 1
  22. #define WHITE 2
  23. #define CYAN 3
  24. UGL_LOCAL UGL_EVENT_SERVICE_ID eventServiceId;
  25. UGL_LOCAL UGL_EVENT_Q_ID qId;
  26. UGL_LOCAL UGL_MESA_CONTEXT umc;
  27. UGL_LOCAL GLuint Ball;
  28. UGL_LOCAL GLfloat Zrot, Zstep;
  29. UGL_LOCAL GLfloat Xpos, Ypos;
  30. UGL_LOCAL GLfloat Xvel, Yvel;
  31. UGL_LOCAL GLfloat Xmin, Xmax;
  32. UGL_LOCAL GLfloat Ymin;
  33. /* UGL_LOCAL GLfloat Ymax = 4.0; */
  34. UGL_LOCAL GLfloat G;
  35. UGL_LOCAL GLuint make_ball(void)
  36. {
  37. GLuint list;
  38. GLfloat a, b;
  39. GLfloat da = 18.0, db = 18.0;
  40. GLfloat radius = 1.0;
  41. GLuint color;
  42. GLfloat x, y, z;
  43. list = glGenLists(1);
  44. glNewList(list, GL_COMPILE);
  45. color = 0;
  46. for (a = -90.0; a + da <= 90.0; a += da)
  47. {
  48. glBegin(GL_QUAD_STRIP);
  49. for (b = 0.0; b <= 360.0; b += db)
  50. {
  51. if (color)
  52. {
  53. glIndexi(RED);
  54. glColor3f(1, 0, 0);
  55. }
  56. else
  57. {
  58. glIndexi(WHITE);
  59. glColor3f(1, 1, 1);
  60. }
  61. x = radius * COS(b) * COS(a);
  62. y = radius * SIN(b) * COS(a);
  63. z = radius * SIN(a);
  64. glVertex3f(x, y, z);
  65. x = radius * COS(b) * COS(a + da);
  66. y = radius * SIN(b) * COS(a + da);
  67. z = radius * SIN(a + da);
  68. glVertex3f(x, y, z);
  69. color = 1 - color;
  70. }
  71. glEnd();
  72. }
  73. glEndList();
  74. return list;
  75. }
  76. UGL_LOCAL void initGL(GLsizei width, GLsizei height)
  77. {
  78. float aspect = (float) width / (float) height;
  79. glViewport(0, 0, (GLint) width, (GLint) height);
  80. uglMesaSetColor(RED, 1.0, 0.0, 0.0);
  81. uglMesaSetColor(WHITE, 1.0, 1.0, 1.0);
  82. uglMesaSetColor(CYAN, 0.0, 1.0, 1.0);
  83. glMatrixMode(GL_PROJECTION);
  84. glLoadIdentity();
  85. glOrtho(-6.0 * aspect, 6.0 * aspect, -6.0, 6.0, -6.0, 6.0);
  86. glMatrixMode(GL_MODELVIEW);
  87. }
  88. UGL_LOCAL void drawGL(void)
  89. {
  90. GLint i;
  91. static float vel0 = -100.0;
  92. glClear(GL_COLOR_BUFFER_BIT);
  93. glIndexi(CYAN);
  94. glColor3f(0, 1, 1);
  95. glBegin(GL_LINES);
  96. for (i = -5; i <= 5; i++)
  97. {
  98. glVertex2i(i, -5);
  99. glVertex2i(i, 5);
  100. }
  101. for (i = -5; i <= 5; i++)
  102. {
  103. glVertex2i(-5, i);
  104. glVertex2i(5, i);
  105. }
  106. for (i = -5; i <= 5; i++)
  107. {
  108. glVertex2i(i, -5);
  109. glVertex2f(i * 1.15, -5.9);
  110. }
  111. glVertex2f(-5.3, -5.35);
  112. glVertex2f(5.3, -5.35);
  113. glVertex2f(-5.75, -5.9);
  114. glVertex2f(5.75, -5.9);
  115. glEnd();
  116. glPushMatrix();
  117. glTranslatef(Xpos, Ypos, 0.0);
  118. glScalef(2.0, 2.0, 2.0);
  119. glRotatef(8.0, 0.0, 0.0, 1.0);
  120. glRotatef(90.0, 1.0, 0.0, 0.0);
  121. glRotatef(Zrot, 0.0, 0.0, 1.0);
  122. glCallList(Ball);
  123. glPopMatrix();
  124. glFlush();
  125. uglMesaSwapBuffers();
  126. Zrot += Zstep;
  127. Xpos += Xvel;
  128. if (Xpos >= Xmax)
  129. {
  130. Xpos = Xmax;
  131. Xvel = -Xvel;
  132. Zstep = -Zstep;
  133. }
  134. if (Xpos <= Xmin)
  135. {
  136. Xpos = Xmin;
  137. Xvel = -Xvel;
  138. Zstep = -Zstep;
  139. }
  140. Ypos += Yvel;
  141. Yvel += G;
  142. if (Ypos < Ymin)
  143. {
  144. Ypos = Ymin;
  145. if (vel0 == -100.0)
  146. vel0 = fabs(Yvel);
  147. Yvel = vel0;
  148. }
  149. }
  150. UGL_LOCAL int getEvent(void)
  151. {
  152. UGL_EVENT event;
  153. UGL_STATUS status;
  154. int retVal = 0;
  155. status = uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT);
  156. while (status != UGL_STATUS_Q_EMPTY)
  157. {
  158. UGL_INPUT_EVENT * pInputEvent = (UGL_INPUT_EVENT *)&event;
  159. if (pInputEvent->modifiers & UGL_KEYBOARD_KEYDOWN)
  160. retVal = 1;
  161. status = uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT);
  162. }
  163. return(retVal);
  164. }
  165. void windMLBounce (void);
  166. void uglbounce (void)
  167. {
  168. taskSpawn("tBounce", 210, VX_FP_TASK, 100000, (FUNCPTR)windMLBounce,
  169. 0,1,2,3,4,5,6,7,8,9);
  170. }
  171. void windMLBounce(void)
  172. {
  173. GLsizei width, height;
  174. UGL_INPUT_DEVICE_ID keyboardDevId;
  175. Zrot = 0.0;
  176. Zstep = 6.0;
  177. Xpos = 0.0;
  178. Ypos = 1.0;
  179. Xvel = 0.2;
  180. Yvel = 0.0;
  181. Xmin = -4.0;
  182. Xmax = 4.0;
  183. Ymin = -3.8;
  184. G = -0.1;
  185. uglInitialize();
  186. uglDriverFind (UGL_KEYBOARD_TYPE, 0, (UGL_UINT32 *)&keyboardDevId);
  187. uglDriverFind (UGL_EVENT_SERVICE_TYPE, 0, (UGL_UINT32 *)&eventServiceId);
  188. qId = uglEventQCreate (eventServiceId, 100);
  189. umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE, NULL);
  190. if (umc == NULL)
  191. {
  192. uglDeinitialize();
  193. return;
  194. }
  195. /* Fullscreen */
  196. uglMesaMakeCurrentContext(umc, 0, 0, UGL_MESA_FULLSCREEN_WIDTH,
  197. UGL_MESA_FULLSCREEN_HEIGHT);
  198. Ball = make_ball();
  199. glCullFace(GL_BACK);
  200. glEnable(GL_CULL_FACE);
  201. glDisable(GL_DITHER);
  202. glShadeModel(GL_FLAT);
  203. uglMesaGetIntegerv(UGL_MESA_WIDTH, &width);
  204. uglMesaGetIntegerv(UGL_MESA_HEIGHT, &height);
  205. initGL(width, height);
  206. while(!getEvent())
  207. drawGL();
  208. uglEventQDestroy (eventServiceId, qId);
  209. uglMesaDestroyContext();
  210. uglDeinitialize ();
  211. return;
  212. }