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.

uglgears.c 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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. uglMesaSwapBuffers ();
  181. #ifdef COUNT_FRAMES
  182. if (count > limit)
  183. {
  184. tickStop = tickGet ();
  185. time = (tickStop-tickStart)/tickBySec;
  186. printf (" %i fps\n", count/time);
  187. tickStart = tickStop;
  188. count = 0;
  189. }
  190. else
  191. count++;
  192. #endif
  193. }
  194. UGL_LOCAL void initGL (GLsizei width, GLsizei height)
  195. {
  196. UGL_LOCAL GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 };
  197. UGL_LOCAL GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 };
  198. UGL_LOCAL GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 };
  199. UGL_LOCAL GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 };
  200. glLightfv (GL_LIGHT0, GL_POSITION, pos);
  201. glEnable (GL_CULL_FACE);
  202. glEnable (GL_LIGHTING);
  203. glEnable (GL_LIGHT0);
  204. glEnable (GL_DEPTH_TEST);
  205. /* make the gears */
  206. gear1 = glGenLists (1);
  207. glNewList (gear1, GL_COMPILE);
  208. glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
  209. gear (1.0, 4.0, 1.0, 20, 0.7);
  210. glEndList ();
  211. gear2 = glGenLists (1);
  212. glNewList (gear2, GL_COMPILE);
  213. glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
  214. gear (0.5, 2.0, 2.0, 10, 0.7);
  215. glEndList ();
  216. gear3 = glGenLists (1);
  217. glNewList (gear3, GL_COMPILE);
  218. glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
  219. gear (1.3, 2.0, 0.5, 10, 0.7);
  220. glEndList ();
  221. glEnable (GL_NORMALIZE);
  222. glViewport (0, 0, width, height);
  223. glMatrixMode (GL_PROJECTION);
  224. glLoadIdentity ();
  225. if (width>height)
  226. {
  227. GLfloat w = (GLfloat) width / (GLfloat) height;
  228. glFrustum (-w, w, -1.0, 1.0, 5.0, 60.0);
  229. }
  230. else
  231. {
  232. GLfloat h = (GLfloat) height / (GLfloat) width;
  233. glFrustum (-1.0, 1.0, -h, h, 5.0, 60.0);
  234. }
  235. glMatrixMode (GL_MODELVIEW);
  236. glLoadIdentity ();
  237. glTranslatef (0.0, 0.0, -40.0);
  238. #ifdef COUNT_FRAMES
  239. tickStart = tickGet ();
  240. tickBySec = sysClkRateGet ();
  241. #endif
  242. }
  243. UGL_LOCAL void echoUse(void)
  244. {
  245. printf("tGears keys:\n");
  246. printf(" z Counter clockwise rotation (z-axis)\n");
  247. printf(" Z Clockwise rotation (z-axis)\n");
  248. printf(" Up Counter clockwise rotation (x-axis)\n");
  249. printf(" Down Clockwise rotation (x-axis)\n");
  250. printf(" Left Counter clockwise rotation (y-axis)\n");
  251. printf(" Right Clockwise rotation (y-axis)\n");
  252. printf(" ESC Exit\n");
  253. }
  254. UGL_LOCAL void readKey (UGL_WCHAR key)
  255. {
  256. switch(key)
  257. {
  258. case 'z':
  259. view_rotz += 5.0;
  260. break;
  261. case 'Z':
  262. view_rotz -= 5.0;
  263. break;
  264. case UGL_UNI_UP_ARROW:
  265. view_rotx += 5.0;
  266. break;
  267. case UGL_UNI_DOWN_ARROW:
  268. view_rotx -= 5.0;
  269. break;
  270. case UGL_UNI_LEFT_ARROW:
  271. view_roty += 5.0;
  272. break;
  273. case UGL_UNI_RIGHT_ARROW:
  274. view_roty -= 5.0;
  275. break;
  276. case UGL_UNI_ESCAPE:
  277. stopWex = UGL_TRUE;
  278. break;
  279. }
  280. }
  281. UGL_LOCAL void loopEvent(void)
  282. {
  283. UGL_EVENT event;
  284. UGL_INPUT_EVENT * pInputEvent;
  285. UGL_FOREVER
  286. {
  287. if (uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT)
  288. != UGL_STATUS_Q_EMPTY)
  289. {
  290. pInputEvent = (UGL_INPUT_EVENT *)&event;
  291. if (pInputEvent->header.type == UGL_EVENT_TYPE_KEYBOARD &&
  292. pInputEvent->modifiers & UGL_KEYBOARD_KEYDOWN)
  293. readKey(pInputEvent->type.keyboard.key);
  294. }
  295. drawGL();
  296. if (stopWex)
  297. break;
  298. }
  299. }
  300. void windMLGears (void);
  301. void uglgears (void)
  302. {
  303. taskSpawn ("tGears", 210, VX_FP_TASK, 100000, (FUNCPTR)windMLGears,
  304. 0,1,2,3,4,5,6,7,8,9);
  305. }
  306. void windMLGears (void)
  307. {
  308. GLsizei width, height;
  309. UGL_INPUT_DEVICE_ID keyboardDevId;
  310. view_rotx=20.0;
  311. view_roty=30.0;
  312. view_rotz=0.0;
  313. angle = 0.0;
  314. limit = 100;
  315. count = 1;
  316. uglInitialize ();
  317. uglDriverFind (UGL_KEYBOARD_TYPE, 0,
  318. (UGL_UINT32 *)&keyboardDevId);
  319. uglDriverFind (UGL_EVENT_SERVICE_TYPE, 0, (UGL_UINT32 *)&eventServiceId);
  320. qId = uglEventQCreate (eventServiceId, 100);
  321. /* Double buffering */
  322. umc = uglMesaCreateNewContext (UGL_MESA_DOUBLE, NULL);
  323. if (umc == NULL)
  324. {
  325. uglDeinitialize ();
  326. return;
  327. }
  328. /* Fullscreen */
  329. uglMesaMakeCurrentContext (umc, 0, 0, UGL_MESA_FULLSCREEN_WIDTH,
  330. UGL_MESA_FULLSCREEN_HEIGHT);
  331. uglMesaGetIntegerv(UGL_MESA_WIDTH, &width);
  332. uglMesaGetIntegerv(UGL_MESA_HEIGHT, &height);
  333. initGL (width, height);
  334. echoUse();
  335. stopWex = UGL_FALSE;
  336. loopEvent();
  337. uglEventQDestroy (eventServiceId, qId);
  338. uglMesaDestroyContext();
  339. uglDeinitialize ();
  340. return;
  341. }