Subversion Repositories Kolibri OS

Rev

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

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