Subversion Repositories Kolibri OS

Rev

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