Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. /* uglgears.c - WindML/Mesa example program */
  2. /*
  3. * 3-D gear wheels. This program is in the public domain.
  4. *
  5. * Brian Paul
  6. *
  7. * Conversion to GLUT by Mark J. Kilgard
  8. * Conversion to UGL/Mesa from GLUT by Stephane Raimbault
  9. */
  10. /*
  11. DESCRIPTION
  12. Spinning gears demo
  13. */
  14. #include <stdio.h>
  15. #include <math.h>
  16. #include <tickLib.h>
  17. #include <ugl/ugl.h>
  18. #include <ugl/uglucode.h>
  19. #include <ugl/uglevent.h>
  20. #include <ugl/uglinput.h>
  21. #include <GL/uglmesa.h>
  22. #include <GL/glu.h>
  23. #ifndef M_PI
  24. #define M_PI 3.14159265358979323846
  25. #endif
  26. #define COUNT_FRAMES
  27. UGL_LOCAL UGL_EVENT_SERVICE_ID eventServiceId;
  28. UGL_LOCAL UGL_EVENT_Q_ID qId;
  29. UGL_LOCAL volatile UGL_BOOL stopWex;
  30. UGL_LOCAL UGL_MESA_CONTEXT umc;
  31. UGL_LOCAL GLfloat view_rotx, view_roty, view_rotz;
  32. UGL_LOCAL GLint gear1, gear2, gear3;
  33. UGL_LOCAL GLfloat angle;
  34. UGL_LOCAL GLuint limit;
  35. UGL_LOCAL GLuint count;
  36. UGL_LOCAL GLuint tickStart, tickStop, tickBySec;
  37. /*
  38. * Draw a gear wheel. You'll probably want to call this function when
  39. * building a display list since we do a lot of trig here.
  40. *
  41. * Input: inner_radius - radius of hole at center
  42. * outer_radius - radius at center of teeth
  43. * width - width of gear
  44. * teeth - number of teeth
  45. * tooth_depth - depth of tooth
  46. */
  47. UGL_LOCAL void gear
  48. (
  49. GLfloat inner_radius,
  50. GLfloat outer_radius,
  51. GLfloat width,
  52. GLint teeth,
  53. GLfloat tooth_depth
  54. )
  55. {
  56. GLint i;
  57. GLfloat r0, r1, r2;
  58. GLfloat angle, da;
  59. GLfloat u, v, len;
  60. r0 = inner_radius;
  61. r1 = outer_radius - tooth_depth/2.0;
  62. r2 = outer_radius + tooth_depth/2.0;
  63. da = 2.0*M_PI / teeth / 4.0;
  64. glShadeModel (GL_FLAT);
  65. glNormal3f (0.0, 0.0, 1.0);
  66. /* draw front face */
  67. glBegin (GL_QUAD_STRIP);
  68. for (i=0;i<=teeth;i++)
  69. {
  70. angle = i * 2.0*M_PI / teeth;
  71. glVertex3f (r0*cos (angle), r0*sin (angle), width*0.5);
  72. glVertex3f (r1*cos (angle), r1*sin (angle), width*0.5);
  73. glVertex3f (r0*cos (angle), r0*sin (angle), width*0.5);
  74. glVertex3f (r1*cos (angle+3*da), r1*sin (angle+3*da), width*0.5);
  75. }
  76. glEnd ();
  77. /* draw front sides of teeth */
  78. glBegin (GL_QUADS);
  79. da = 2.0*M_PI / teeth / 4.0;
  80. for (i=0; i<teeth; i++)
  81. {
  82. angle = i * 2.0*M_PI / teeth;
  83. glVertex3f (r1*cos (angle), r1*sin (angle), width*0.5);
  84. glVertex3f (r2*cos (angle+da), r2*sin (angle+da), width*0.5);
  85. glVertex3f (r2*cos (angle+2*da), r2*sin (angle+2*da), width*0.5);
  86. glVertex3f (r1*cos (angle+3*da), r1*sin (angle+3*da), width*0.5);
  87. }
  88. glEnd ();
  89. glNormal3f (0.0, 0.0, -1.0);
  90. /* draw back face */
  91. glBegin (GL_QUAD_STRIP);
  92. for (i=0; i<=teeth ;i++)
  93. {
  94. angle = i * 2.0*M_PI / teeth;
  95. glVertex3f (r1*cos (angle), r1*sin (angle), -width*0.5);
  96. glVertex3f (r0*cos (angle), r0*sin (angle), -width*0.5);
  97. glVertex3f (r1*cos (angle+3*da), r1*sin (angle+3*da), -width*0.5);
  98. glVertex3f (r0*cos (angle), r0*sin (angle), -width*0.5);
  99. }
  100. glEnd ();
  101. /* draw back sides of teeth */
  102. glBegin (GL_QUADS);
  103. da = 2.0*M_PI / teeth / 4.0;
  104. for (i=0;i<teeth;i++)
  105. {
  106. angle = i * 2.0*M_PI / teeth;
  107. glVertex3f (r1*cos (angle+3*da), r1*sin (angle+3*da), -width*0.5);
  108. glVertex3f (r2*cos (angle+2*da), r2*sin (angle+2*da), -width*0.5);
  109. glVertex3f (r2*cos (angle+da), r2*sin (angle+da), -width*0.5);
  110. glVertex3f (r1*cos (angle), r1*sin (angle), -width*0.5);
  111. }
  112. glEnd ();
  113. /* draw outward faces of teeth */
  114. glBegin (GL_QUAD_STRIP);
  115. for (i=0;i<teeth;i++)
  116. {
  117. angle = i * 2.0*M_PI / teeth;
  118. glVertex3f (r1*cos (angle), r1*sin (angle), width*0.5);
  119. glVertex3f (r1*cos (angle), r1*sin (angle), -width*0.5);
  120. u = r2*cos (angle+da) - r1*cos (angle);
  121. v = r2*sin (angle+da) - r1*sin (angle);
  122. len = sqrt (u*u + v*v);
  123. u /= len;
  124. v /= len;
  125. glNormal3f (v, -u, 0.0);
  126. glVertex3f (r2*cos (angle+da), r2*sin (angle+da), width*0.5);
  127. glVertex3f (r2*cos (angle+da), r2*sin (angle+da), -width*0.5);
  128. glNormal3f (cos (angle), sin (angle), 0.0);
  129. glVertex3f (r2*cos (angle+2*da), r2*sin (angle+2*da), width*0.5);
  130. glVertex3f (r2*cos (angle+2*da), r2*sin (angle+2*da), -width*0.5);
  131. u = r1*cos (angle+3*da) - r2*cos (angle+2*da);
  132. v = r1*sin (angle+3*da) - r2*sin (angle+2*da);
  133. glNormal3f (v, -u, 0.0);
  134. glVertex3f (r1*cos (angle+3*da), r1*sin (angle+3*da), width*0.5);
  135. glVertex3f (r1*cos (angle+3*da), r1*sin (angle+3*da), -width*0.5);
  136. glNormal3f (cos (angle), sin (angle), 0.0);
  137. }
  138. glVertex3f (r1*cos (0), r1*sin (0), width*0.5);
  139. glVertex3f (r1*cos (0), r1*sin (0), -width*0.5);
  140. glEnd ();
  141. glShadeModel (GL_SMOOTH);
  142. /* draw inside radius cylinder */
  143. glBegin (GL_QUAD_STRIP);
  144. for (i=0;i<=teeth;i++)
  145. {
  146. angle = i * 2.0*M_PI / teeth;
  147. glNormal3f (-cos (angle), -sin (angle), 0.0);
  148. glVertex3f (r0*cos (angle), r0*sin (angle), -width*0.5);
  149. glVertex3f (r0*cos (angle), r0*sin (angle), width*0.5);
  150. }
  151. glEnd ();
  152. }
  153. UGL_LOCAL void drawGL (void)
  154. {
  155. #ifdef COUNT_FRAMES
  156. int time;
  157. #endif
  158. angle += 2.0;
  159. glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  160. glPushMatrix ();
  161. glRotatef (view_rotx, 1.0, 0.0, 0.0);
  162. glRotatef (view_roty, 0.0, 1.0, 0.0);
  163. glRotatef (view_rotz, 0.0, 0.0, 1.0);
  164. glPushMatrix ();
  165. glTranslatef (-3.0, -2.0, 0.0);
  166. glRotatef (angle, 0.0, 0.0, 1.0);
  167. glCallList (gear1);
  168. glPopMatrix ();
  169. glPushMatrix ();
  170. glTranslatef (3.1, -2.0, 0.0);
  171. glRotatef (-2.0*angle-9.0, 0.0, 0.0, 1.0);
  172. glCallList (gear2);
  173. glPopMatrix ();
  174. glPushMatrix ();
  175. glTranslatef (-3.1, 4.2, 0.0);
  176. glRotatef (-2.0*angle-25.0, 0.0, 0.0, 1.0);
  177. glCallList (gear3);
  178. glPopMatrix ();
  179. glPopMatrix ();
  180. glFlush();
  181. uglMesaSwapBuffers ();
  182. #ifdef COUNT_FRAMES
  183. if (count > limit)
  184. {
  185. tickStop = tickGet ();
  186. time = (tickStop-tickStart)/tickBySec;
  187. printf (" %i fps\n", count/time);
  188. tickStart = tickStop;
  189. count = 0;
  190. }
  191. else
  192. count++;
  193. #endif
  194. }
  195. UGL_LOCAL void initGL (GLsizei width, GLsizei height)
  196. {
  197. UGL_LOCAL GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 };
  198. UGL_LOCAL GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 };
  199. UGL_LOCAL GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 };
  200. UGL_LOCAL GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 };
  201. glLightfv (GL_LIGHT0, GL_POSITION, pos);
  202. glEnable (GL_CULL_FACE);
  203. glEnable (GL_LIGHTING);
  204. glEnable (GL_LIGHT0);
  205. glEnable (GL_DEPTH_TEST);
  206. /* make the gears */
  207. gear1 = glGenLists (1);
  208. glNewList (gear1, GL_COMPILE);
  209. glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
  210. gear (1.0, 4.0, 1.0, 20, 0.7);
  211. glEndList ();
  212. gear2 = glGenLists (1);
  213. glNewList (gear2, GL_COMPILE);
  214. glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
  215. gear (0.5, 2.0, 2.0, 10, 0.7);
  216. glEndList ();
  217. gear3 = glGenLists (1);
  218. glNewList (gear3, GL_COMPILE);
  219. glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
  220. gear (1.3, 2.0, 0.5, 10, 0.7);
  221. glEndList ();
  222. glEnable (GL_NORMALIZE);
  223. glViewport (0, 0, width, height);
  224. glMatrixMode (GL_PROJECTION);
  225. glLoadIdentity ();
  226. if (width>height)
  227. {
  228. GLfloat w = (GLfloat) width / (GLfloat) height;
  229. glFrustum (-w, w, -1.0, 1.0, 5.0, 60.0);
  230. }
  231. else
  232. {
  233. GLfloat h = (GLfloat) height / (GLfloat) width;
  234. glFrustum (-1.0, 1.0, -h, h, 5.0, 60.0);
  235. }
  236. glMatrixMode (GL_MODELVIEW);
  237. glLoadIdentity ();
  238. glTranslatef (0.0, 0.0, -40.0);
  239. #ifdef COUNT_FRAMES
  240. tickStart = tickGet ();
  241. tickBySec = sysClkRateGet ();
  242. #endif
  243. }
  244. UGL_LOCAL void echoUse(void)
  245. {
  246. printf("tGears keys:\n");
  247. printf(" z Counter clockwise rotation (z-axis)\n");
  248. printf(" Z Clockwise rotation (z-axis)\n");
  249. printf(" Up Counter clockwise rotation (x-axis)\n");
  250. printf(" Down Clockwise rotation (x-axis)\n");
  251. printf(" Left Counter clockwise rotation (y-axis)\n");
  252. printf(" Right Clockwise rotation (y-axis)\n");
  253. printf(" ESC Exit\n");
  254. }
  255. UGL_LOCAL void readKey (UGL_WCHAR key)
  256. {
  257. switch(key)
  258. {
  259. case 'z':
  260. view_rotz += 5.0;
  261. break;
  262. case 'Z':
  263. view_rotz -= 5.0;
  264. break;
  265. case UGL_UNI_UP_ARROW:
  266. view_rotx += 5.0;
  267. break;
  268. case UGL_UNI_DOWN_ARROW:
  269. view_rotx -= 5.0;
  270. break;
  271. case UGL_UNI_LEFT_ARROW:
  272. view_roty += 5.0;
  273. break;
  274. case UGL_UNI_RIGHT_ARROW:
  275. view_roty -= 5.0;
  276. break;
  277. case UGL_UNI_ESCAPE:
  278. stopWex = UGL_TRUE;
  279. break;
  280. }
  281. }
  282. UGL_LOCAL void loopEvent(void)
  283. {
  284. UGL_EVENT event;
  285. UGL_INPUT_EVENT * pInputEvent;
  286. UGL_FOREVER
  287. {
  288. if (uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT)
  289. != UGL_STATUS_Q_EMPTY)
  290. {
  291. pInputEvent = (UGL_INPUT_EVENT *)&event;
  292. if (pInputEvent->header.type == UGL_EVENT_TYPE_KEYBOARD &&
  293. pInputEvent->modifiers & UGL_KEYBOARD_KEYDOWN)
  294. readKey(pInputEvent->type.keyboard.key);
  295. }
  296. drawGL();
  297. if (stopWex)
  298. break;
  299. }
  300. }
  301. void windMLGears (UGL_BOOL windMLMode);
  302. void uglgears (void)
  303. {
  304. taskSpawn ("tGears", 210, VX_FP_TASK, 100000, (FUNCPTR)windMLGears,
  305. UGL_FALSE,1,2,3,4,5,6,7,8,9);
  306. }
  307. void windMLGears (UGL_BOOL windMLMode)
  308. {
  309. GLsizei width, height;
  310. UGL_INPUT_DEVICE_ID keyboardDevId;
  311. view_rotx=20.0;
  312. view_roty=30.0;
  313. view_rotz=0.0;
  314. angle = 0.0;
  315. limit = 100;
  316. count = 1;
  317. uglInitialize ();
  318. uglDriverFind (UGL_KEYBOARD_TYPE, 0,
  319. (UGL_UINT32 *)&keyboardDevId);
  320. uglDriverFind (UGL_EVENT_SERVICE_TYPE, 0, (UGL_UINT32 *)&eventServiceId);
  321. qId = uglEventQCreate (eventServiceId, 100);
  322. /* Double buffering */
  323. if (windMLMode)
  324. umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE
  325. | UGL_MESA_WINDML_EXCLUSIVE, NULL);
  326. else
  327. umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE, NULL);
  328. if (umc == NULL)
  329. {
  330. uglDeinitialize ();
  331. return;
  332. }
  333. /* Fullscreen */
  334. uglMesaMakeCurrentContext (umc, 0, 0, UGL_MESA_FULLSCREEN_WIDTH,
  335. UGL_MESA_FULLSCREEN_HEIGHT);
  336. uglMesaGetIntegerv(UGL_MESA_WIDTH, &width);
  337. uglMesaGetIntegerv(UGL_MESA_HEIGHT, &height);
  338. initGL (width, height);
  339. echoUse();
  340. stopWex = UGL_FALSE;
  341. loopEvent();
  342. uglEventQDestroy (eventServiceId, qId);
  343. uglMesaDestroyContext();
  344. uglDeinitialize ();
  345. return;
  346. }