Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.     Initial version was a Mesa example
  3.  
  4.     iadn
  5.     http://www.iadn.narod.ru
  6.     iadn@bk.ru
  7. */
  8.  
  9. /*
  10.  * 3-D gear wheels.  This program is in the public domain.
  11.  *
  12.  * Brian Paul
  13.  */
  14.  
  15. /*
  16.  * Newlib port by maxcodehack
  17.  */
  18.  
  19. #include <sys/ksys.h>
  20. #include <kosgl.h> // TinyGL
  21. #include <string.h>
  22. #include <math.h>
  23.  
  24. int Fps (long x, long y);
  25.  
  26. struct {
  27.     int x,y;
  28.     int dx,dy;
  29. } win;
  30.  
  31. #define KEY_ESC       1
  32. #define KEY_F        33
  33.  
  34. char *title = "Gears (F - full screen, ESC - exit)";
  35. char *fps    = "FPS:";
  36.  
  37. unsigned char FullScreen = 0;
  38. unsigned char skin = 0x34;
  39.  
  40. ksys_oskey_t key;
  41.  
  42. ksys_thread_t pri;
  43. KOSGLContext cgl;
  44.  
  45. static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
  46. static GLint gear1, gear2, gear3;
  47. static GLfloat angle = 0.0;
  48.  
  49. static GLuint limit;
  50. static GLuint count = 1;
  51.  
  52. /*
  53.  * Draw a gear wheel.  You'll probably want to call this function when
  54.  * building a display list since we do a lot of trig here.
  55.  *
  56.  * Input:  inner_radius - radius of hole at center
  57.  *         outer_radius - radius at center of teeth
  58.  *         width - width of gear
  59.  *         teeth - number of teeth
  60.  *         tooth_depth - depth of tooth
  61.  */
  62. static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
  63.           GLint teeth, GLfloat tooth_depth )
  64. {
  65.     GLint i;
  66.     GLfloat r0, r1, r2;
  67.     GLfloat angle, da;
  68.     GLfloat u, v, len;
  69.  
  70.     r0 = inner_radius;
  71.     r1 = outer_radius - tooth_depth/2.0;
  72.     r2 = outer_radius + tooth_depth/2.0;
  73.  
  74.     da = 2.0*M_PI / teeth / 4.0;
  75.  
  76.     glShadeModel( GL_FLAT );
  77.  
  78.     glNormal3f( 0.0, 0.0, 1.0 );
  79.  
  80.     /* draw front face */
  81.     glBegin( GL_QUAD_STRIP );
  82.     for (i=0;i<=teeth;i++) {
  83.       angle = i * 2.0*M_PI / teeth;
  84.       glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
  85.       glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
  86.       glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
  87.       glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
  88.     }
  89.     glEnd();
  90.  
  91.     /* draw front sides of teeth */
  92.     glBegin( GL_QUADS );
  93.     da = 2.0*M_PI / teeth / 4.0;
  94.     for (i=0;i<teeth;i++) {
  95.       angle = i * 2.0*M_PI / teeth;
  96.  
  97.       glVertex3f( r1*cos(angle),      r1*sin(angle),      width*0.5 );
  98.       glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),   width*0.5 );
  99.       glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 );
  100.       glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
  101.     }
  102.     glEnd();
  103.  
  104.     glNormal3f( 0.0, 0.0, -1.0 );
  105.  
  106.     /* draw back face */
  107.     glBegin( GL_QUAD_STRIP );
  108.     for (i=0;i<=teeth;i++) {
  109.       angle = i * 2.0*M_PI / teeth;
  110.       glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
  111.       glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
  112.       glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
  113.       glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
  114.     }
  115.     glEnd();
  116.  
  117.     /* draw back sides of teeth */
  118.     glBegin( GL_QUADS );
  119.     da = 2.0*M_PI / teeth / 4.0;
  120.     for (i=0;i<teeth;i++) {
  121.       angle = i * 2.0*M_PI / teeth;
  122.  
  123.       glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
  124.       glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
  125.       glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),   -width*0.5 );
  126.       glVertex3f( r1*cos(angle),      r1*sin(angle),      -width*0.5 );
  127.     }
  128.     glEnd();
  129.  
  130.     /* draw outward faces of teeth */
  131.     glBegin( GL_QUAD_STRIP );
  132.     for (i=0;i<teeth;i++) {
  133.       angle = i * 2.0*M_PI / teeth;
  134.  
  135.       glVertex3f( r1*cos(angle),      r1*sin(angle),       width*0.5 );
  136.       glVertex3f( r1*cos(angle),      r1*sin(angle),      -width*0.5 );
  137.       u = r2*cos(angle+da) - r1*cos(angle);
  138.       v = r2*sin(angle+da) - r1*sin(angle);
  139.       len = sqrt( u*u + v*v );
  140.       u /= len;
  141.       v /= len;
  142.       glNormal3f( v, -u, 0.0 );
  143.       glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),    width*0.5 );
  144.       glVertex3f( r2*cos(angle+da),   r2*sin(angle+da),   -width*0.5 );
  145.       glNormal3f( cos(angle), sin(angle), 0.0 );
  146.       glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da),  width*0.5 );
  147.       glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
  148.       u = r1*cos(angle+3*da) - r2*cos(angle+2*da);
  149.       v = r1*sin(angle+3*da) - r2*sin(angle+2*da);
  150.       glNormal3f( v, -u, 0.0 );
  151.       glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da),  width*0.5 );
  152.       glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
  153.       glNormal3f( cos(angle), sin(angle), 0.0 );
  154.     }
  155.  
  156.     glVertex3f( r1*cos(0.0), r1*sin(0.0), width*0.5 );
  157.     glVertex3f( r1*cos(0.0), r1*sin(0.0), -width*0.5 );
  158.  
  159.     glEnd();
  160.  
  161.     glShadeModel( GL_SMOOTH );
  162.  
  163.     /* draw inside radius cylinder */
  164.     glBegin( GL_QUAD_STRIP );
  165.     for (i=0;i<=teeth;i++) {
  166.       angle = i * 2.0*M_PI / teeth;
  167.       glNormal3f( -cos(angle), -sin(angle), 0.0 );
  168.       glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
  169.       glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
  170.     }
  171.     glEnd();
  172. }
  173.  
  174. void init()
  175. {
  176.     static GLfloat pos[4] = {5.0, 5.0, 10.0, 1.0 };
  177.     static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 };
  178.     static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 };
  179.     static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 };
  180.  
  181.     glLightfv( GL_LIGHT0, GL_POSITION, pos );
  182.     glEnable( GL_CULL_FACE );
  183.     glEnable( GL_LIGHTING );
  184.     glEnable( GL_LIGHT0 );
  185.     glEnable( GL_DEPTH_TEST );
  186.  
  187.     /* make the gears */
  188.     gear1 = glGenLists(1);
  189.     glNewList(gear1, GL_COMPILE);
  190.     glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red );
  191.     gear( 1.0, 4.0, 1.0, 20, 0.7 );
  192.     glEndList();
  193.  
  194.     gear2 = glGenLists(1);
  195.     glNewList(gear2, GL_COMPILE);
  196.     glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green );
  197.     gear( 0.5, 2.0, 2.0, 10, 0.7 );
  198.     glEndList();
  199.  
  200.     gear3 = glGenLists(1);
  201.     glNewList(gear3, GL_COMPILE);
  202.     glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue );
  203.     gear( 1.3, 2.0, 0.5, 10, 0.7 );
  204.     glEndList();
  205.  
  206.     glEnable( GL_NORMALIZE );
  207.  
  208.     glViewport(0, 0, (GLint)500, (GLint)480);
  209.     glMatrixMode(GL_PROJECTION);
  210.     glLoadIdentity();
  211.     glFrustum( -1.0, 1.0, -1, 1, 5.0, 60.0 );
  212.     glMatrixMode(GL_MODELVIEW);
  213.     glLoadIdentity();
  214.     glTranslatef( 0.0, 0.0, -40.0 );
  215.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  216. }
  217.  
  218. void reshape()
  219. {
  220.     _ksys_thread_info(&pri, -1);
  221.     glViewport(0, 0, pri.winx_size, pri.winy_size-20);
  222.     glMatrixMode(GL_PROJECTION);
  223.     glLoadIdentity();
  224.     gluPerspective(45.0, (GLfloat)pri.winx_size/pri.winy_size, 1.0, 60.0);
  225.     glTranslatef( 0.0, 0.0, 20.0 );
  226.     glMatrixMode(GL_MODELVIEW);
  227.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  228. }
  229.  
  230. void disabletgl()
  231. {
  232.     kosglDestroyContext(cgl);
  233. }
  234.  
  235. void kos_text(int x, int y, int color, const char* text, int len)
  236. {
  237.     asm volatile ("int $0x40"::"a"(4),"b"((x<<16) | y),"c"(color),"d"((unsigned long)text),"S"(len));
  238. };
  239.  
  240. void Title()
  241. {
  242.      kos_text(300,8,0x10ffffff,fps,strlen(fps));
  243.      /*kos_text(180,8,0x90ffffff,title2,strlen(title2));
  244.      kos_text(600,8,0x90ffffff,title3,strlen(title3));*/
  245. }
  246.  
  247. void draw_window()
  248. {
  249.     _ksys_start_draw();
  250.     _ksys_create_window(win.x, win.y, win.dx, win.dy, title, 0, skin);
  251.     _ksys_end_draw();
  252.     // display string
  253.     Title();
  254. }
  255.  
  256. int main()
  257. {
  258.     win.x = 100;
  259.     win.y = 100;
  260.     win.dx = 400;
  261.     win.dy = 400;
  262.  
  263.     draw_window();
  264.  
  265.     cgl = kosglCreateContext( 0, 0);
  266.     kosglMakeCurrent( 0, 0, win.dx, win.dy, cgl);
  267.  
  268.     init();
  269.  
  270.     _ksys_set_key_input_mode(KSYS_KEY_INPUT_MODE_SCANC);
  271.  
  272.     reshape();
  273.  
  274.     do {
  275.         glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  276.  
  277.         glPushMatrix();
  278.         glRotatef( view_rotx, 1.0, 0.0, 0.0 );
  279.         glRotatef( view_roty, 0.0, 1.0, 0.0 );
  280.         glRotatef( view_rotz, 0.0, 0.0, 1.0 );
  281.  
  282.         glPushMatrix();
  283.         glTranslatef( -2.0, -2.0, 0.0 );
  284.         glRotatef( angle, 0.0, 0.0, 1.0 );
  285.         glCallList(gear1);
  286.         glPopMatrix();
  287.  
  288.         glPushMatrix();
  289.         glTranslatef( 4.1, -2.0, 0.0 );
  290.         glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 );
  291.         glCallList(gear2);
  292.         glPopMatrix();
  293.  
  294.         glPushMatrix();
  295.         glTranslatef( -2.1, 4.2, 0.0 );
  296.         glRotatef( -2.0*angle-25.0, 0.0, 0.0, 1.0 );
  297.         glCallList(gear3);
  298.         glPopMatrix();
  299.  
  300.         glPopMatrix();
  301.  
  302.         kosglSwapBuffers();
  303.  
  304.         angle += 0.01 + 0.3 * Fps (330, 8);
  305.  
  306.         switch(_ksys_check_event())
  307.         {
  308.             case 1:
  309.                 draw_window();
  310.                 reshape();
  311.                 break;
  312.  
  313.             case 2:
  314.                    key = _ksys_get_key();
  315.                    switch(key.code) {
  316.                         case KEY_F:
  317.                             if(!FullScreen){
  318.                                 skin=0x01;
  319.                                 _ksys_change_window(0,0,_ksys_screen_size().x,_ksys_screen_size().y);
  320.                                 draw_window();
  321.                                 reshape();
  322.                                 FullScreen = 1;
  323.                             }
  324.                             else{
  325.                                 skin=0x34;
  326.                                 draw_window();
  327.                                 _ksys_change_window(win.x,win.y,win.dx,win.dy);
  328.                                 reshape();
  329.                                 FullScreen = 0;
  330.                             };
  331.                             break;
  332.  
  333.                        case KEY_ESC:
  334.                                 disabletgl();
  335.                                 return 0;
  336.                     }
  337.                     break;
  338.  
  339.               case 3:
  340.                     disabletgl();
  341.                     return 0;
  342.         }
  343.     } while(1);
  344. }
  345.