Subversion Repositories Kolibri OS

Rev

Rev 8059 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. use32
  2.         org 0
  3.         db 'MENUET01'
  4.         dd 1,start,i_end,mem,stacktop,0,cur_dir_path
  5.  
  6. include '../../../../../proc32.inc'
  7. include '../../../../../macros.inc'
  8. include '../../../../../KOSfuncs.inc'
  9. include '../../../../../develop/libraries/box_lib/load_lib.mac'
  10. include '../../../../../dll.inc'
  11. include '../opengl_const.inc'
  12. include 'fps.inc'
  13.  
  14. @use_library
  15.  
  16. macro matr_cell c_funct,c_param,funct,param, dia
  17. {
  18.         dia dword[esp-4*(c_param*(c_funct-funct)+(1+c_param-param))]
  19. }
  20.  
  21. ;Так как некоторые извращенческие функции OpenGL воспринимают только параметры
  22. ;типа double (8 байт) то придется пихать их в стек макросом glpush
  23. macro glpush GLDoubleVar {
  24.         push dword[GLDoubleVar+4]
  25.         push dword[GLDoubleVar]
  26. }
  27.  
  28. align 4
  29. start:
  30.         load_library name_tgl, cur_dir_path, library_path, system_path, \
  31.                 err_message_found_lib, head_f_l, import_lib_tinygl, err_message_import, head_f_i
  32.         cmp eax,SF_TERMINATE_PROCESS
  33.         jz button.exit
  34.  
  35.         mcall SF_SET_EVENTS_MASK,0x27
  36.  
  37.         stdcall [kosglMakeCurrent], 0,15,400,380,ctx1
  38.         stdcall reshape, 400,380
  39.  
  40. ; *** init ***
  41.         stdcall [glLightfv], GL_LIGHT0, GL_POSITION, pos
  42.         stdcall [glEnable], GL_CULL_FACE
  43.         stdcall [glEnable], GL_LIGHTING
  44.         stdcall [glEnable], GL_LIGHT0
  45.         stdcall [glEnable], GL_DEPTH_TEST
  46.  
  47.         ; make the gears
  48.         stdcall [glGenLists],1
  49.         mov [gear1],eax
  50.         stdcall [glNewList], eax, GL_COMPILE
  51.         stdcall [glMaterialfv], GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red
  52.         stdcall gear, 1.0, 4.0, 1.0, 20, 0.7
  53.         call [glEndList]
  54.  
  55.         stdcall [glGenLists],1
  56.         mov [gear2],eax
  57.         stdcall [glNewList], eax, GL_COMPILE
  58.         stdcall [glMaterialfv], GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green
  59.         stdcall gear, 0.5, 2.0, 2.0, 10, 0.7
  60.         call [glEndList]
  61.  
  62.         stdcall [glGenLists],1
  63.         mov [gear3],eax
  64.         stdcall [glNewList], eax, GL_COMPILE
  65.         stdcall [glMaterialfv], GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue
  66.         stdcall gear, 1.3, 2.0, 0.5, 10, 0.7
  67.         call [glEndList]
  68.  
  69.         stdcall [glEnable], GL_NORMALIZE
  70. ; *** end init ***
  71.  
  72. align 4
  73. red_win:
  74.         call draw_window
  75.         mcall SF_THREAD_INFO,procinfo,-1
  76.         mov eax,dword[procinfo.box.height]
  77.         cmp eax,120
  78.         jge @f
  79.                 mov eax,120 ;min size
  80.         @@:
  81.         sub eax,43
  82.         mov ebx,dword[procinfo.box.width]
  83.         cmp ebx,200
  84.         jge @f
  85.                 mov ebx,200
  86.         @@:
  87.         sub ebx,10
  88.                 stdcall reshape, ebx,eax
  89.         .end0:
  90.  
  91. align 16
  92. still:
  93.         call draw_3d
  94.         cmp dword[stop],1
  95.         je @f
  96.                 stdcall Fps, 365,4
  97.  
  98.                 mov dword[esp-4],eax
  99.                 fild dword[esp-4]
  100.                 fmul dword[a2]
  101.                 fadd dword[a1]
  102.                 fadd dword[angle]
  103.                 fstp dword[angle]
  104.  
  105.                 mcall SF_CHECK_EVENT
  106.                 jmp .end0
  107. align 4
  108.         @@:
  109.                 mcall SF_WAIT_EVENT
  110.         .end0:
  111.         cmp al,1
  112.         jz red_win
  113.         cmp al,2
  114.         jz key
  115.         cmp al,3
  116.         jz button
  117.         jmp still
  118.  
  119. align 4
  120. a1 dd 0.01
  121. a2 dd 0.3
  122.  
  123. ; new window size or exposure
  124. align 4
  125. proc reshape, width:dword, height:dword
  126. locals
  127.         h dq ?
  128.         mh dq ?
  129. endl
  130.         stdcall [glViewport], 0, 0, [width], [height]
  131.         stdcall [glMatrixMode], GL_PROJECTION
  132.         stdcall [glLoadIdentity]
  133.         fild dword[height]
  134.         fidiv dword[width]
  135.         fst qword[h] ;h = height / width
  136.         fchs
  137.         fstp qword[mh]
  138.        
  139.         glpush p6
  140.         glpush p5
  141.         glpush h
  142.         glpush mh
  143.         glpush p2
  144.         glpush p1
  145.         call [glFrustum]
  146.        
  147.         stdcall [glMatrixMode], GL_MODELVIEW
  148.         stdcall [glLoadIdentity]
  149.         stdcall [glTranslatef], 0.0, 0.0, -40.0
  150.         stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
  151.         ret
  152. endp
  153.  
  154. align 4
  155. p1 dq -1.0
  156. p2 dq  1.0
  157. p5 dq  5.0
  158. p6 dq 60.0
  159.  
  160. align 4
  161. draw_window:
  162.         pushad
  163.         mcall SF_REDRAW,SSF_BEGIN_DRAW
  164.  
  165.         mcall SF_CREATE_WINDOW,(50 shl 16)+409,(30 shl 16)+425,0x33404040,,title1
  166.         call [kosglSwapBuffers]
  167.  
  168.         ;Title
  169.         mcall SF_DRAW_TEXT,(338 shl 16)+4,0xc0c0c0,fps,   fps.end-fps
  170.         mcall SF_DRAW_TEXT,(8 shl 16)+4,0xc0c0c0,title3,title3.end-title3
  171.         ;mcall SF_DRAW_TEXT,(180 shl 16)+4,0xc0c0c0,title2,title2.end-title2
  172.  
  173.         mcall SF_REDRAW,SSF_END_DRAW
  174.         popad
  175.         ret
  176.  
  177. align 4
  178. key:
  179.         mcall SF_GET_KEY
  180.  
  181.         cmp ah,27 ;Esc
  182.         je button.exit
  183.  
  184.         cmp ah,43 ;+
  185.         jne @f
  186.                 fld dword[scale]
  187.                 fdiv dword[delt_sc]
  188.                 fstp dword[scale]
  189.                 jmp still
  190.         @@:
  191.         cmp ah,61 ;=
  192.         jne @f
  193.                 fld dword[scale]
  194.                 fdiv dword[delt_sc]
  195.                 fstp dword[scale]
  196.                 jmp still
  197.         @@:
  198.         cmp ah,45 ;-
  199.         jne @f
  200.                 fld dword[scale]
  201.                 fmul dword[delt_sc]
  202.                 fstp dword[scale]
  203.                 jmp still
  204.         @@:
  205.         cmp ah,112 ;P
  206.         jne @f
  207.                 xor dword[stop],1
  208.                 jmp still
  209.         @@:
  210.         cmp ah,178 ;Up
  211.         jne @f
  212.                 fld dword[view_rotx]
  213.                 fadd dword[delt_size]
  214.                 fstp dword[view_rotx]
  215.                 jmp still
  216.         @@:
  217.         cmp ah,177 ;Down
  218.         jne @f
  219.                 fld dword[view_rotx]
  220.                 fsub dword[delt_size]
  221.                 fstp dword[view_rotx]
  222.                 jmp still
  223.         @@:
  224.         cmp ah,176 ;Left
  225.         jne @f
  226.                 fld dword[view_roty]
  227.                 fadd dword[delt_size]
  228.                 fstp dword[view_roty]
  229.                 jmp still
  230.         @@:
  231.         cmp ah,179 ;Right
  232.         jne @f
  233.                 fld dword[view_roty]
  234.                 fsub dword[delt_size]
  235.                 fstp dword[view_roty]
  236.                 jmp still
  237.         @@:
  238.         jmp still
  239.  
  240. align 4
  241. button:
  242.         mcall SF_GET_BUTTON
  243.         cmp ah,1
  244.         jne still
  245. .exit:
  246.         mcall SF_TERMINATE_PROCESS
  247.  
  248.  
  249. align 4
  250. title1: db 'TinyGL in KolibriOS'
  251. .end: db 0
  252. ;title2: db 'F full screen'
  253. ;.end: db 0
  254. title3: db 'ESC - exit, Arrow keys - rotate, +/- zoom, P - pause'
  255. .end: db 0
  256. fps:    db 'FPS:'
  257. .end: db 0
  258.  
  259. align 16
  260. draw_3d:
  261.         stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
  262.  
  263.         call [glPushMatrix]
  264.         stdcall [glScalef],  [scale], [scale], [scale]
  265.         stdcall [glRotatef], [view_rotx], 1.0, 0.0, 0.0
  266.         stdcall [glRotatef], [view_roty], 0.0, 1.0, 0.0
  267.         stdcall [glRotatef], [view_rotz], 0.0, 0.0, 1.0
  268.  
  269.         call [glPushMatrix]
  270.         stdcall [glTranslatef], -3.0, -2.0, 0.0
  271.         stdcall [glRotatef], [angle], 0.0, 0.0, 1.0
  272.         stdcall [glCallList],[gear1]
  273.         call [glPopMatrix]
  274.  
  275.         call [glPushMatrix]
  276.         stdcall [glTranslatef], 3.1, -2.0, 0.0
  277.         push dword 1.0
  278.         push dword 0.0
  279.         push dword 0.0
  280.         finit
  281.         fld1
  282.         fld1
  283.         faddp
  284.         fchs
  285.         fld dword[angle]
  286.         fmulp
  287.         fsub dword[an_9]
  288.         fstp dword[esp-4]
  289.         sub esp,4
  290.         call [glRotatef] ;, -2.0*angle-9.0, 0.0, 0.0, 1.0
  291.         stdcall [glCallList],[gear2]
  292.         call [glPopMatrix]
  293.  
  294.         call [glPushMatrix]
  295.         stdcall [glTranslatef], -3.1, 4.2, 0.0
  296.         push dword 1.0
  297.         push dword 0.0
  298.         push dword 0.0
  299.         finit
  300.         fld1
  301.         fld1
  302.         faddp
  303.         fchs
  304.         fld dword[angle]
  305.         fmulp
  306.         fsub dword[an_25]
  307.         fstp dword[esp-4]
  308.         sub esp,4
  309.         call [glRotatef] ;, -2.0*angle-25.0, 0.0, 0.0, 1.0
  310.         stdcall [glCallList],[gear3]
  311.         call [glPopMatrix]
  312.  
  313.         call [glPopMatrix]
  314.  
  315.         call [kosglSwapBuffers]
  316.  
  317. ;   count++;
  318. ;   if (count==limit) {
  319. ;       exit(0);
  320.         ret
  321.  
  322. align 4
  323. an_9 dd 9.0
  324. an_25 dd 25.0
  325. scale dd 1.0 ;???
  326. delt_sc dd 0.85 ;???
  327. delt_size dd 5.0
  328.  
  329. align 4
  330. pos dd 5.0, 5.0, 10.0, 0.0
  331. red dd 0.8, 0.1, 0.0, 1.0
  332. green dd 0.0, 0.8, 0.2, 1.0
  333. blue  dd 0.2, 0.2, 1.0, 1.0
  334.  
  335. view_rotx dd 20.0
  336. view_roty dd 30.0
  337. view_rotz dd  0.0
  338. gear1 dd ?
  339. gear2 dd ?
  340. gear3 dd ?
  341. angle dd 0.0
  342.  
  343. limit dd ?
  344. count dd 1
  345. stop  dd 0 ;пауза
  346.  
  347. ;
  348. ;  Draw a gear wheel.  You'll probably want to call this function when
  349. ;  building a display list since we do a lot of trig here.
  350. ;
  351. ;  Input:  inner_radius - radius of hole at center
  352. ;          outer_radius - radius at center of teeth
  353. ;          width - width of gear
  354. ;          teeth - number of teeth
  355. ;          tooth_depth - depth of tooth
  356. ;
  357. align 4
  358. proc gear uses eax ebx, inner_radius:dword, outer_radius:dword, width:dword, teeth:dword, tooth_depth:dword
  359. locals
  360.         i dd ?
  361.         r0 dd ?
  362.         r1 dd ?
  363.         r2 dd ?
  364.         angle dd ?
  365.         da dd ?
  366.         u dd ?
  367.         v dd ?
  368. endl
  369.  
  370.         finit
  371.         mov eax,[inner_radius]
  372.         mov [r0],eax
  373.         fld1
  374.         fld1
  375.         faddp
  376.         fld dword[tooth_depth]
  377.         fdiv st0,st1
  378.         fld dword[outer_radius]
  379.         fsub st0,st1
  380.         fst  dword[r1] ;r1 = outer_radius - tooth_depth/2.0
  381.         fadd dword[tooth_depth]
  382.         fstp dword[r2] ;r2 = outer_radius + tooth_depth/2.0
  383.         ffree st0 ;st0 = tooth_depth/2.0
  384.         fincstp
  385.         ;st0 = 2.0
  386.  
  387.         fldpi
  388.         fidiv dword[teeth]
  389.         fdiv st0,st1
  390.         fstp dword[da] ;da = M_PI / teeth / 2.0
  391.  
  392.         stdcall [glShadeModel], GL_FLAT
  393.  
  394.         stdcall [glNormal3f], 0.0, 0.0, 1.0
  395.  
  396.         mov ebx,[teeth]
  397.  
  398.         ; draw front face
  399.         stdcall [glBegin], GL_QUAD_STRIP
  400.         mov dword[i],0
  401.         @@:
  402.         cmp dword[i],ebx
  403.         jg @f
  404.                 finit
  405.                 fld1
  406.                 fld1
  407.                 faddp
  408.  
  409.                 fldpi
  410.                 fmul st0,st1
  411.                 fimul dword[i]
  412.                 fidiv dword[teeth]
  413.                 fst dword[angle] ;angle = i * 2.0*M_PI / teeth
  414.  
  415.                 fld dword[width]
  416.                 fdiv st0,st2
  417.                 matr_cell 4,3,1,3,fst
  418.                 matr_cell 4,3,2,3,fst
  419.                 matr_cell 4,3,3,3,fst
  420.                 matr_cell 4,3,4,3,fstp
  421.  
  422.                 fld st0
  423.                 fsin
  424.                 fmul dword[r0]
  425.                 matr_cell 4,3,1,2,fst
  426.                 matr_cell 4,3,3,2,fstp
  427.                 fld st0
  428.                 fcos
  429.                 fmul dword[r0]
  430.                 matr_cell 4,3,1,1,fst
  431.                 matr_cell 4,3,3,1,fstp
  432.  
  433.                 fld st0
  434.                 fsin
  435.                 fmul dword[r1]
  436.                 matr_cell 4,3,2,2,fstp
  437.                 fld st0
  438.                 fcos
  439.                 fmul dword[r1]
  440.                 matr_cell 4,3,2,1,fstp
  441.  
  442.                 ;st0 = angle
  443.                 fadd dword[da]
  444.                 fadd dword[da]
  445.                 fadd dword[da]
  446.                 fld st0
  447.                 fsin
  448.                 fmul dword[r1]
  449.                 matr_cell 4,3,4,2,fstp
  450.                 fcos
  451.                 fmul dword[r1]
  452.                 matr_cell 4,3,4,1,fstp
  453.  
  454.                 sub esp,48 ;12*4
  455.  
  456.                 call [glVertex3f] ;, r0*cos(angle), r0*sin(angle), width*0.5
  457.                 call [glVertex3f] ;, r1*cos(angle), r1*sin(angle), width*0.5
  458.                 call [glVertex3f] ;, r0*cos(angle), r0*sin(angle), width*0.5
  459.                 call [glVertex3f] ;, r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5
  460.                 inc dword[i]
  461.                 jmp @b
  462.         @@:
  463.         call [glEnd]
  464.  
  465.         ; draw front sides of teeth
  466.         stdcall [glBegin], GL_QUADS
  467.         mov dword[i],0
  468.         @@:
  469.         cmp dword[i],ebx
  470.         jg @f
  471.                 finit
  472.                 fld1
  473.                 fld1
  474.                 faddp
  475.  
  476.                 fldpi
  477.                 fmul st0,st1
  478.                 fimul dword[i]
  479.                 fidiv dword[teeth]
  480.                 fst dword[angle] ;angle = i * 2.0*M_PI / teeth
  481.  
  482.                 fld dword[width]
  483.                 fdiv st0,st2
  484.                 matr_cell 4,3,1,3,fst
  485.                 matr_cell 4,3,2,3,fst
  486.                 matr_cell 4,3,3,3,fst
  487.                 matr_cell 4,3,4,3,fstp
  488.  
  489.                 fld st0
  490.                 fcos
  491.                 fmul dword[r1]
  492.                 matr_cell 4,3,1,1,fstp
  493.                 fld st0
  494.                 fsin
  495.                 fmul dword[r1]
  496.                 matr_cell 4,3,1,2,fstp
  497.  
  498.                 fadd dword[da] ;st0 = angle+da
  499.                 fld st0
  500.                 fcos
  501.                 fmul dword[r2]
  502.                 matr_cell 4,3,2,1,fstp
  503.                 fld st0
  504.                 fsin
  505.                 fmul dword[r2]
  506.                 matr_cell 4,3,2,2,fstp
  507.  
  508.                 fadd dword[da] ;st0 = angle+2*da
  509.                 fld st0
  510.                 fcos
  511.                 fmul dword[r2]
  512.                 matr_cell 4,3,3,1,fstp
  513.                 fld st0
  514.                 fsin
  515.                 fmul dword[r2]
  516.                 matr_cell 4,3,3,2,fstp
  517.  
  518.                 fadd dword[da] ;st0 = angle+3*da
  519.                 fld st0
  520.                 fcos
  521.                 fmul dword[r1]
  522.                 matr_cell 4,3,4,1,fstp
  523.                 fsin
  524.                 fmul dword[r1]
  525.                 matr_cell 4,3,4,2,fstp
  526.  
  527.                 sub esp,48 ;12*4
  528.  
  529.                 call [glVertex3f];, r1*cos(angle),      r1*sin(angle),      width*0.5
  530.                 call [glVertex3f];, r2*cos(angle+da),   r2*sin(angle+da),   width*0.5
  531.                 call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5
  532.                 call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5
  533.                 inc dword[i]
  534.                 jmp @b
  535.         @@:
  536.         call [glEnd]
  537.  
  538.         stdcall [glNormal3f], 0.0, 0.0, -1.0
  539.  
  540.         ; draw back face
  541.         stdcall [glBegin], GL_QUAD_STRIP
  542.         mov dword[i],0
  543.         @@:
  544.         cmp dword[i],ebx
  545.         jg @f
  546.                 finit
  547.                 fld1
  548.                 fld1
  549.                 faddp
  550.  
  551.                 fldpi
  552.                 fmul st0,st1
  553.                 fimul dword[i]
  554.                 fidiv dword[teeth]
  555.                 fst dword[angle] ;angle = i * 2.0*M_PI / teeth
  556.  
  557.                 fld dword[width]
  558.                 fdiv st0,st2
  559.                 fchs
  560.                 matr_cell 4,3,1,3,fst
  561.                 matr_cell 4,3,2,3,fst
  562.                 matr_cell 4,3,3,3,fst
  563.                 matr_cell 4,3,4,3,fstp
  564.  
  565.                 fld st0
  566.                 fsin
  567.                 fld st0
  568.                 fmul dword[r1]
  569.                 matr_cell 4,3,1,2,fstp
  570.                 fmul dword[r0]
  571.                 matr_cell 4,3,2,2,fst
  572.                 matr_cell 4,3,4,2,fstp
  573.  
  574.                 fld st0
  575.                 fcos
  576.                 fld st0
  577.                 fmul dword[r1]
  578.                 matr_cell 4,3,1,1,fstp
  579.                 fmul dword[r0]
  580.                 matr_cell 4,3,2,1,fst
  581.                 matr_cell 4,3,4,1,fstp
  582.  
  583.                 ;st0 = angle
  584.                 fadd dword[da]
  585.                 fadd dword[da]
  586.                 fadd dword[da]
  587.                 fld st0
  588.                 fsin
  589.                 fmul dword[r1]
  590.                 matr_cell 4,3,3,2,fstp
  591.                 fcos
  592.                 fmul dword[r1]
  593.                 matr_cell 4,3,3,1,fstp
  594.  
  595.                 sub esp,48 ;12*4
  596.  
  597.                 call [glVertex3f];, r1*cos(angle), r1*sin(angle), -width*0.5
  598.                 call [glVertex3f];, r0*cos(angle), r0*sin(angle), -width*0.5
  599.                 call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5
  600.                 call [glVertex3f];, r0*cos(angle), r0*sin(angle), -width*0.5
  601.                 inc dword[i]
  602.                 jmp @b
  603.         @@:
  604.         call [glEnd]
  605.  
  606.         ; draw back sides of teeth
  607.         stdcall [glBegin], GL_QUADS
  608.         mov dword[i],0
  609.         @@:
  610.         cmp dword[i],ebx
  611.         jg @f
  612.                 finit
  613.                 fld1
  614.                 fld1
  615.                 faddp
  616.  
  617.                 fldpi
  618.                 fmul st0,st1
  619.                 fimul dword[i]
  620.                 fidiv dword[teeth]
  621.                 fst dword[angle] ;angle = i * 2.0*M_PI / teeth
  622.  
  623.                 fld dword[width]
  624.                 fdiv st0,st2
  625.                 fchs
  626.                 matr_cell 4,3,1,3,fst
  627.                 matr_cell 4,3,2,3,fst
  628.                 matr_cell 4,3,3,3,fst
  629.                 matr_cell 4,3,4,3,fstp
  630.  
  631.                 fld st0
  632.                 fcos
  633.                 fmul dword[r1]
  634.                 matr_cell 4,3,4,1,fstp
  635.                 fld st0
  636.                 fsin
  637.                 fmul dword[r1]
  638.                 matr_cell 4,3,4,2,fstp
  639.  
  640.                 fadd dword[da] ;st0 = angle+da
  641.                 fld st0
  642.                 fcos
  643.                 fmul dword[r2]
  644.                 matr_cell 4,3,3,1,fstp
  645.                 fld st0
  646.                 fsin
  647.                 fmul dword[r2]
  648.                 matr_cell 4,3,3,2,fstp
  649.  
  650.                 fadd dword[da] ;st0 = angle+2*da
  651.                 fld st0
  652.                 fcos
  653.                 fmul dword[r2]
  654.                 matr_cell 4,3,2,1,fstp
  655.                 fld st0
  656.                 fsin
  657.                 fmul dword[r2]
  658.                 matr_cell 4,3,2,2,fstp
  659.  
  660.                 fadd dword[da] ;st0 = angle+3*da
  661.                 fld st0
  662.                 fcos
  663.                 fmul dword[r1]
  664.                 matr_cell 4,3,1,1,fstp
  665.                 fsin
  666.                 fmul dword[r1]
  667.                 matr_cell 4,3,1,2,fstp
  668.  
  669.                 sub esp,48 ;12*4
  670.  
  671.                 call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5
  672.                 call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5
  673.                 call [glVertex3f];, r2*cos(angle+da),   r2*sin(angle+da),   -width*0.5
  674.                 call [glVertex3f];, r1*cos(angle),      r1*sin(angle),      -width*0.5
  675.                 inc dword[i]
  676.                 jmp @b
  677.         @@:
  678.         call [glEnd]
  679.  
  680.         ; draw outward faces of teeth
  681.         stdcall [glBegin], GL_QUAD_STRIP
  682.         mov dword[i],0
  683.         @@:
  684.         cmp dword[i],ebx
  685.         jg @f
  686.                 finit
  687.                 fld1
  688.                 fld1
  689.                 faddp
  690.  
  691.                 fldpi
  692.                 fmul st0,st1
  693.                 fimul dword[i]
  694.                 fidiv dword[teeth]
  695.                 fst dword[angle] ;angle = i * 2.0*M_PI / teeth
  696.  
  697.                 fld dword[width]
  698.                 fdiv st0,st2
  699.                 matr_cell 12,3, 1,3,fst
  700.                 matr_cell 12,3, 4,3,fst
  701.                 matr_cell 12,3, 7,3,fst
  702.                 matr_cell 12,3,10,3,fst
  703.                 fchs
  704.                 matr_cell 12,3, 2,3,fst
  705.                 matr_cell 12,3, 5,3,fst
  706.                 matr_cell 12,3, 8,3,fst
  707.                 matr_cell 12,3,11,3,fstp
  708.                 fldz
  709.                 matr_cell 12,3, 3,3,fst
  710.                 matr_cell 12,3, 6,3,fst
  711.                 matr_cell 12,3, 9,3,fst
  712.                 matr_cell 12,3,12,3,fstp
  713.  
  714.                 fld st0
  715.                 fsin
  716.                 matr_cell 12,3, 6,2,fst
  717.                 matr_cell 12,3,12,2,fst
  718.                 fmul dword[r1]
  719.                 matr_cell 12,3, 1,2,fst
  720.                 matr_cell 12,3, 2,2,fstp
  721.  
  722.                 fld st0
  723.                 fcos
  724.                 matr_cell 12,3, 6,1,fst
  725.                 matr_cell 12,3,12,1,fst
  726.                 fmul dword[r1]
  727.                 matr_cell 12,3, 1,1,fst
  728.                 matr_cell 12,3, 2,1,fstp
  729.  
  730.                 fadd dword[da] ;st0 = angle+da
  731.                 fld st0
  732.                 fcos
  733.                 fmul dword[r2]
  734.                 matr_cell 12,3, 4,1,fst
  735.                 matr_cell 12,3, 5,1,fst
  736.                 matr_cell 12,3, 1,1,fsub
  737.                 fstp dword[u]
  738.  
  739.                 fld st0
  740.                 fsin
  741.                 fmul dword[r2]
  742.                 matr_cell 12,3, 4,2,fst
  743.                 matr_cell 12,3, 5,2,fst
  744.                 matr_cell 12,3, 1,2,fsub
  745.                 fst  dword[v]
  746.  
  747.                 fmul st0,st0
  748.                 fld  dword[u]
  749.                 fmul st0,st0
  750.                 faddp
  751.                 fsqrt ;st0 = len
  752.                 fld  dword[u]
  753.                 fdiv st0,st1
  754.                 fchs
  755.                 matr_cell 12,3, 3,2,fstp
  756.                 fld  dword[v]
  757.                 fdiv st0,st1
  758.                 matr_cell 12,3, 3,1,fstp
  759.                 ffree st0 ;len
  760.                 fincstp
  761.  
  762.                 fadd dword[da] ;st0 = angle+2*da
  763.                 fld st0
  764.                 fcos
  765.                 fmul dword[r2]
  766.                 matr_cell 12,3, 7,1,fst
  767.                 matr_cell 12,3, 8,1,fstp
  768.                 fld st0
  769.                 fsin
  770.                 fmul dword[r2]
  771.                 matr_cell 12,3, 7,2,fst
  772.                 matr_cell 12,3, 8,2,fstp
  773.  
  774.                 fadd dword[da] ;st0 = angle+3*da
  775.                 fld st0
  776.                 fcos
  777.                 fmul dword[r1]
  778.                 matr_cell 12,3,10,1,fst
  779.                 matr_cell 12,3,11,1,fst
  780.                 matr_cell 12,3, 7,1,fsub
  781.                 fchs
  782.                 matr_cell 12,3, 9,2,fstp ;-u
  783.  
  784.                 fsin
  785.                 fmul dword[r1]
  786.                 matr_cell 12,3,10,2,fst
  787.                 matr_cell 12,3,11,2,fst
  788.                 matr_cell 12,3, 7,2,fsub
  789.                 matr_cell 12,3, 9,1,fstp ;v
  790.  
  791.                 sub esp,144 ;12*12
  792.  
  793.                 call [glVertex3f];, r1*cos(angle), r1*sin(angle), width*0.5
  794.                 call [glVertex3f];, r1*cos(angle), r1*sin(angle), -width*0.5
  795. ;u = r2*cos(angle+da) - r1*cos(angle)
  796. ;v = r2*sin(angle+da) - r1*sin(angle)
  797. ;len = sqrt( u*u + v*v )
  798. ;u /= len
  799. ;v /= len
  800.                 call [glNormal3f];, v, -u, 0.0
  801.                 call [glVertex3f];, r2*cos(angle+da),   r2*sin(angle+da),    width*0.5
  802.                 call [glVertex3f];, r2*cos(angle+da),   r2*sin(angle+da),   -width*0.5
  803.                 call [glNormal3f];, cos(angle), sin(angle), 0.0
  804.                 call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da),  width*0.5
  805.                 call [glVertex3f];, r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5
  806. ;u = r1*cos(angle+3*da) - r2*cos(angle+2*da)
  807. ;v = r1*sin(angle+3*da) - r2*sin(angle+2*da)
  808.                 call [glNormal3f];, v, -u, 0.0
  809.                 call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da),  width*0.5
  810.                 call [glVertex3f];, r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5
  811.                 call [glNormal3f];, cos(angle), sin(angle), 0.0
  812.                 inc dword[i]
  813.                 jmp @b
  814.         @@:
  815.  
  816.         finit
  817.         fld1
  818.         fld1
  819.         faddp
  820.  
  821.         fld dword[width]
  822.         fdiv st0,st1
  823.         matr_cell 2,3,1,3,fst
  824.         fchs
  825.         matr_cell 2,3,2,3,fstp
  826.         fldz
  827.         matr_cell 2,3,1,2,fst
  828.         matr_cell 2,3,2,2,fstp
  829.         fldz
  830.         fcos
  831.         fmul dword[r1]
  832.         matr_cell 2,3,1,1,fst
  833.         matr_cell 2,3,2,1,fstp
  834.  
  835.         sub esp,24
  836.  
  837.         call [glVertex3f];, r1*cos(0), r1*sin(0), width*0.5
  838.         call [glVertex3f];, r1*cos(0), r1*sin(0), -width*0.5
  839.  
  840.         call [glEnd]
  841.  
  842.  
  843.         stdcall [glShadeModel], GL_SMOOTH
  844.  
  845.         ; draw inside radius cylinder
  846.         stdcall [glBegin], GL_QUAD_STRIP
  847.         mov dword[i],0
  848.         finit
  849.         @@:
  850.         cmp dword[i],ebx
  851.         jg @f
  852.                 fld1
  853.                 fld1
  854.                 faddp
  855.  
  856.                 fldpi
  857.                 fmul st0,st1
  858.                 fimul dword[i]
  859.                 fidiv dword[teeth]
  860.                 fst dword[angle] ;angle = i * 2.0*M_PI / teeth
  861.  
  862.                 fldz
  863.                 matr_cell 3,3,1,3,fstp
  864.                 fld dword[width]
  865.                 fdiv st0,st2
  866.                 matr_cell 3,3,3,3,fst
  867.                 fchs
  868.                 matr_cell 3,3,2,3,fstp
  869.  
  870.                 fld st0
  871.                 fsin
  872.                 fchs
  873.                 matr_cell 3,3,1,2,fst
  874.                 fchs
  875.                 fmul dword[r0]
  876.                 matr_cell 3,3,2,2,fst
  877.                 matr_cell 3,3,3,2,fstp
  878.  
  879.                 fcos
  880.                 fchs
  881.                 matr_cell 3,3,1,1,fst
  882.                 fchs
  883.                 fmul dword[r0]
  884.                 matr_cell 3,3,2,1,fst
  885.                 matr_cell 3,3,3,1,fstp
  886.  
  887.                 sub esp,36 ;12*3
  888.  
  889.                 call [glNormal3f];, -cos(angle), -sin(angle), 0.0
  890.                 call [glVertex3f];, r0*cos(angle), r0*sin(angle), -width*0.5
  891.                 call [glVertex3f];, r0*cos(angle), r0*sin(angle), width*0.5
  892.                 ffree st0 ;2.0
  893.                 fincstp
  894.                 inc dword[i]
  895.                 jmp @b
  896.         @@:
  897.         call [glEnd]
  898.  
  899.         ret      
  900. endp
  901.  
  902.  
  903.  
  904. ;--------------------------------------------------
  905. align 4
  906. import_lib_tinygl:
  907.  
  908. macro E_LIB n
  909. {
  910.         n dd sz_#n
  911. }
  912. include '../export.inc'
  913.         dd 0,0
  914. macro E_LIB n
  915. {
  916.         sz_#n db `n,0
  917. }
  918. include '../export.inc'
  919.  
  920. ;--------------------------------------------------
  921. system_path db '/sys/lib/'
  922. name_tgl db 'tinygl.obj',0
  923.  
  924. head_f_i:
  925. head_f_l db '"System error',0
  926. err_message_import db 'Error on load import library ',39,'tinygl.obj',39,'" -tE',0
  927. err_message_found_lib db 'Sorry I cannot load library ',39,'tinygl.obj',39,'" -tE',0
  928. ;--------------------------------------------------
  929.  
  930. align 16
  931. i_end:
  932. ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
  933. ;sizeof.TinyGLContext = 28
  934. procinfo process_information
  935.         rb 4096
  936. stacktop:
  937. cur_dir_path:
  938.         rb 4096
  939. library_path:
  940.         rb 4096
  941. mem:
  942.