Subversion Repositories Kolibri OS

Rev

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