Subversion Repositories Kolibri OS

Rev

Rev 6286 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. struct GLUquadricObj
  2.         DrawStyle   dd ? ; GLU_FILL, LINE, SILHOUETTE, or POINT
  3.         Orientation dd ? ; GLU_INSIDE or GLU_OUTSIDE
  4.         TextureFlag dd ? ; Generate texture coords?
  5.         Normals     dd ? ; GLU_NONE, GLU_FLAT, or GLU_SMOOTH
  6.         ErrorFunc   dd ? ; Error handler callback function
  7. ends
  8.  
  9. offs_qobj_DrawStyle equ 0
  10. offs_qobj_Orientation equ 4
  11. offs_qobj_TextureFlag equ 8
  12. offs_qobj_Normals equ 12
  13. offs_qobj_ErrorFunc equ 16
  14.  
  15. ;Так как некоторые извращенческие функции OpenGL воспринимают только параметры
  16. ;типа double (8 байт) то придется пихать их в стек макросом glpush
  17. macro glpush GLDoubleVar {
  18.         push dword[GLDoubleVar+4]
  19.         push dword[GLDoubleVar]
  20. }
  21.  
  22. ;void drawTorus(float rc, int numc, float rt, int numt)
  23. ;{
  24. ;}
  25.  
  26. ;static void normal3f(GLfloat x, GLfloat y, GLfloat z )
  27. ;{
  28. ;}
  29.  
  30. align 4
  31. an360f dd 360.0
  32.  
  33. align 16
  34. proc gluPerspective, fovy:qword, aspect:qword, zNear:qword, zFar:qword
  35. locals
  36.         mfW dq ?
  37.         fW dq ?
  38.         mfH dq ?
  39.         fH dq ?
  40. endl
  41.         fldpi
  42.         fmul qword[fovy]
  43.         fdiv dword[an360f]
  44.         fptan
  45.         ffree st0 ;выкидываем 1.0 которая осталось после вычисления тангенса
  46.         fincstp
  47.         fmul qword[zNear]
  48.         fld st0
  49.         fchs
  50.         fstp qword[mfH]
  51.         fst qword[fH]
  52.         fmul qword[aspect]
  53.         fld st0
  54.         fchs
  55.         fstp qword[mfW]
  56.         fstp qword[fW]
  57.  
  58.         glpush zFar
  59.         glpush zNear
  60.         glpush fH
  61.         glpush mfH
  62.         glpush fW
  63.         glpush mfW
  64.         call glFrustum
  65.         ret
  66. endp
  67.  
  68. ;void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,
  69. ;         GLdouble centerx, GLdouble centery, GLdouble centerz,
  70. ;         GLdouble upx, GLdouble upy, GLdouble upz)
  71. ;{
  72. ;}
  73.  
  74. align 16
  75. gluNewQuadric:
  76.         stdcall gl_malloc, sizeof.GLUquadricObj
  77.         or eax,eax
  78.         jz @f
  79.                 mov dword[eax+offs_qobj_DrawStyle],GLU_FILL
  80.                 mov dword[eax+offs_qobj_Orientation],GLU_OUTSIDE
  81.                 mov dword[eax+offs_qobj_TextureFlag],GL_FALSE
  82.                 mov dword[eax+offs_qobj_Normals],GLU_SMOOTH
  83.                 mov dword[eax+offs_qobj_ErrorFunc],0 ;NULL
  84.         @@:
  85.         ret
  86.  
  87. align 16
  88. proc gluDeleteQuadric, state:dword
  89.         cmp dword[state],0
  90.         je @f
  91.                 stdcall gl_free,[state]
  92.         @@:
  93.         ret
  94. endp
  95.  
  96. ;
  97. ; Set the drawing style to be GLU_FILL, GLU_LINE, GLU_SILHOUETTE,
  98. ; or GLU_POINT.
  99. ;
  100. align 16
  101. proc gluQuadricDrawStyle uses eax ebx, qobj:dword, drawStyle:dword
  102.         mov eax,[qobj]
  103.         or eax,eax
  104.         jz .err_q
  105.         mov ebx,[drawStyle]
  106.         cmp ebx,GLU_FILL
  107.         je @f
  108.         cmp ebx,GLU_LINE
  109.         je @f
  110.         cmp ebx,GLU_SILHOUETTE
  111.         je @f
  112.         cmp ebx,GLU_POINT
  113.         je @f
  114.         jmp .err_q
  115. align 4
  116.         @@:
  117.                 mov dword[eax+offs_qobj_DrawStyle],ebx
  118.                 jmp @f
  119. align 4
  120.         .err_q:
  121.                 stdcall dbg_print,sz_gluQuadricDrawStyle,err_9
  122.         @@:
  123.         ret
  124. endp
  125.  
  126. ;
  127. ; Set the orientation to GLU_INSIDE or GLU_OUTSIDE.
  128. ;
  129. align 16
  130. proc gluQuadricOrientation uses eax ebx, qobj:dword, orientation:dword
  131.         mov eax,[qobj]
  132.         or eax,eax
  133.         jz .err_q
  134.         mov ebx,[orientation]
  135.         cmp ebx,GLU_INSIDE
  136.         je @f
  137.         cmp ebx,GLU_OUTSIDE
  138.         je @f
  139.         jmp .err_q
  140. align 4
  141.         @@:
  142.                 mov dword[eax+offs_qobj_Orientation],ebx
  143.                 jmp @f
  144. align 4
  145.         .err_q:
  146.                 stdcall dbg_print,sz_gluQuadricOrientation,err_9
  147.         @@:
  148.         ret
  149. endp
  150.  
  151. align 16
  152. proc gluQuadricTexture uses eax ebx, qobj:dword, texture:dword
  153.         mov eax,[qobj]
  154.         or eax,eax
  155.         jz .err_q
  156.         mov ebx,[texture]
  157.         cmp ebx,GL_TRUE
  158.         je @f
  159.         cmp ebx,GL_FALSE
  160.         je @f
  161.         @@:
  162.                 mov dword[eax+offs_qobj_TextureFlag],ebx
  163.                 jmp @f
  164. align 4
  165.         .err_q:
  166.                 stdcall dbg_print,sz_gluQuadricTexture,err_9
  167.         @@:
  168.         ret
  169. endp
  170.  
  171. align 16
  172. proc gluCylinder qobj:dword, baseRadius:dword, topRadius:dword, height:dword,\
  173.         slices:dword, stacks:dword
  174. locals
  175.         da dq ? ;double
  176.         r dq ? ;double
  177.         dr dq ? ;double
  178.         dz dq ? ;double
  179.         x dd ? ;float
  180.         y dd ? ;float
  181.         z dd ? ;float
  182.         nz dd ? ;float
  183.         nsign dd ? ;float
  184.         i dd ? ;GLint
  185.         j dd ? ;GLint
  186.         du dd ? ;float
  187.         dv dd ? ;float
  188.         tcx dd ? ;float
  189.         tcy dd ? ;float
  190.         x2 dd ? ;float
  191.         y2 dd ? ;float
  192. endl
  193. pushad
  194.         mov edx,[qobj]
  195.         fld1
  196.         cmp dword[edx+offs_qobj_Orientation],GLU_INSIDE
  197.         jne @f
  198.                 fchs
  199.         @@:
  200.         fstp dword[nsign]
  201.  
  202.         fldpi
  203.         fadd st0,st0
  204.         fidiv dword[slices]
  205.         fstp qword[da] ;da = 2.0*M_PI / slices
  206.         mov ebx,[topRadius]
  207.         fld qword[ebx]
  208.         mov ecx,[baseRadius]
  209.         fsub qword[ecx]
  210.         fld st0 ;copy: topRadius-baseRadius
  211.         fidiv dword[stacks]
  212.         fstp qword[dr] ;dr = (topRadius-baseRadius) / stacks
  213.         mov eax,[height]
  214.         fld qword[eax]
  215.         fidiv dword[stacks]
  216.         fstp qword[dz] ;dz = height / stacks
  217.         fchs
  218.         fdiv qword[eax]
  219.         fstp dword[nz] ;nz = (baseRadius-topRadius) / height ; Z component of normal vectors
  220.  
  221.         cmp dword[edx+offs_qobj_DrawStyle],GLU_POINT
  222.         jne .else0
  223.                 stdcall glBegin,GL_POINTS
  224.                 mov ebx,[slices]
  225.                 mov dword[i],0
  226. align 4
  227.                 .cycle_0: ;for (i=0;i<slices;i++)
  228.                         cmp [i],ebx
  229.                         jge .cycle_0_end
  230.                         fild dword[i]
  231.                         fmul qword[da]
  232.                         fld st0
  233.                         fcos
  234.                         fst dword[x] ;x = cos(i*da)
  235.                         fmul dword[nsign]
  236.                         fstp dword[esp-12]
  237.                         fsin
  238.                         fst dword[y] ;y = sin(i*da)
  239.                         fmul dword[nsign]
  240.                         fstp dword[esp-8]
  241.                         fld dword[nz]
  242.                         fmul dword[nsign]
  243.                         fstp dword[esp-4]
  244.                         sub esp,12
  245.                         call glNormal3f ;x*nsign, y*nsign, nz*nsign
  246.  
  247.                         mov dword[z],0.0
  248.                         mov ecx,[baseRadius]
  249.                         fld qword[ecx]
  250.                         fstp qword[r] ;r = baseRadius
  251.                         mov ecx,[stacks]
  252.                         inc ecx
  253. align 4
  254.                         .cycle_1: ;for (j=0;j<=stacks;j++)
  255.                                 mov eax,[z]
  256.                                 mov [esp-4],eax
  257.                                 fld qword[r]
  258.                                 fld st0
  259.                                 fmul dword[y]
  260.                                 fstp dword[esp-8]
  261.                                 fmul dword[x]
  262.                                 fstp dword[esp-12]
  263.                                 sub esp,12
  264.                                 call glVertex3f ;x*r, y*r, z
  265.                                 fld dword[z]
  266.                                 fadd qword[dz]
  267.                                 fstp dword[z] ;z += dz
  268.                                 fld qword[r]
  269.                                 fadd qword[dr]
  270.                                 fstp qword[r] ;r += dr
  271.                                 dec ecx
  272.                                 jnz .cycle_1
  273.                         inc dword[i]
  274.                         jmp .cycle_0
  275. align 4
  276.                 .cycle_0_end:
  277.                 call glEnd
  278.                 jmp .end_f
  279.         .else0:
  280.         cmp dword[edx+offs_qobj_DrawStyle],GLU_LINE
  281.         je @f
  282.         cmp dword[edx+offs_qobj_DrawStyle],GLU_SILHOUETTE
  283.         je .else2
  284.                 jmp .else1
  285.         @@:
  286.                 ; Draw rings
  287.                 mov dword[z],0.0
  288.                 mov ecx,[baseRadius]
  289.                 fld qword[ecx]
  290.                 fstp qword[r] ;r = baseRadius
  291.                 mov ecx,[stacks]
  292.                 inc ecx
  293. align 4
  294.                 .cycle_2: ;for (j=0;j<=stacks;j++)
  295.                         stdcall glBegin,GL_LINE_LOOP
  296.                         mov ebx,[slices]
  297.                         mov dword[i],0
  298. align 4
  299.                         .cycle_3: ;for (i=0;i<slices;i++)
  300.                                 cmp [i],ebx
  301.                                 jge .cycle_3_end
  302.                                 fild dword[i]
  303.                                 fmul qword[da]
  304.                                 fld st0
  305.                                 fcos
  306.                                 fst dword[x] ;x = cos(i*da)
  307.                                 fmul dword[nsign]
  308.                                 fstp dword[esp-12]
  309.                                 fsin
  310.                                 fst dword[y] ;y = sin(i*da)
  311.                                 fmul dword[nsign]
  312.                                 fstp dword[esp-8]
  313.                                 fld dword[nz]
  314.                                 fmul dword[nsign]
  315.                                 fstp dword[esp-4]
  316.                                 sub esp,12
  317.                                 call glNormal3f ;x*nsign, y*nsign, nz*nsign
  318.                                 mov eax,[z]
  319.                                 mov [esp-4],eax
  320.                                 fld qword[r]
  321.                                 fld st0
  322.                                 fmul dword[y]
  323.                                 fstp dword[esp-8]
  324.                                 fmul dword[x]
  325.                                 fstp dword[esp-12]
  326.                                 sub esp,12
  327.                                 call glVertex3f ;x*r, y*r, z
  328.                                 inc dword[i]
  329.                                 jmp .cycle_3
  330. align 4
  331.                         .cycle_3_end:
  332.                         call glEnd
  333.                         fld dword[z]
  334.                         fadd qword[dz]
  335.                         fstp dword[z] ;z += dz
  336.                         fld qword[r]
  337.                         fadd qword[dr]
  338.                         fstp qword[r] ;r += dr
  339.                         dec ecx
  340.                         jnz .cycle_2
  341.                         jmp .else2_end
  342. align 4
  343.                 .else2:
  344.                 ; draw one ring at each end
  345. ;     if (baseRadius!=0.0) {
  346.                         stdcall glBegin,GL_LINE_LOOP
  347. align 4
  348.                         .cycle_4: ;for (i=0;i<slices;i++)
  349. ;               {
  350. ;           x = cos(i*da);
  351. ;           y = sin(i*da);
  352. ;           normal3f( x*nsign, y*nsign, nz*nsign );
  353. ;           glVertex3f( x*baseRadius, y*baseRadius, 0.0 );
  354. ;        }
  355.                         call glEnd
  356.                         stdcall glBegin,GL_LINE_LOOP
  357. align 4
  358.                         .cycle_5: ;for (i=0;i<slices;i++)
  359. ;               {
  360. ;           x = cos(i*da);
  361. ;           y = sin(i*da);
  362. ;           normal3f( x*nsign, y*nsign, nz*nsign );
  363. ;           glVertex3f( x*topRadius, y*topRadius, height );
  364. ;        }
  365.                         call glEnd
  366. ;     }
  367.                 .else2_end:
  368.                 ; draw length lines
  369.                 stdcall glBegin,GL_LINES
  370.                 mov ebx,[slices]
  371.                 mov dword[i],0
  372. align 4
  373.                 .cycle_6: ;for (i=0;i<slices;i++)
  374.                         cmp [i],ebx
  375.                         jge .cycle_6_end
  376.                         fild dword[i]
  377.                         fmul qword[da]
  378.                         fld st0
  379.                         fcos
  380.                         fst dword[x] ;x = cos(i*da)
  381.                         fmul dword[nsign]
  382.                         fstp dword[esp-12]
  383.                         fsin
  384.                         fst dword[y] ;y = sin(i*da)
  385.                         fmul dword[nsign]
  386.                         fstp dword[esp-8]
  387.                         fld dword[nz]
  388.                         fmul dword[nsign]
  389.                         fstp dword[esp-4]
  390.                         sub esp,12
  391.                         call glNormal3f ;x*nsign, y*nsign, nz*nsign
  392.                         mov dword[esp-4],0.0
  393.                         mov ecx,[baseRadius]
  394.                         fld qword[ecx]
  395.                         fld st0
  396.                         fmul dword[y]
  397.                         fstp dword[esp-8]
  398.                         fmul dword[x]
  399.                         fstp dword[esp-12]
  400.                         sub esp,12
  401.                         call glVertex3f ;x*baseRadius, y*baseRadius, 0.0
  402.                         mov eax,[height]
  403.                         fld qword[eax]
  404.                         fstp dword[esp-4]
  405.                         mov ecx,[topRadius]
  406.                         fld qword[ecx]
  407.                         fld st0
  408.                         fmul dword[y]
  409.                         fstp dword[esp-8]
  410.                         fmul dword[x]
  411.                         fstp dword[esp-12]
  412.                         sub esp,12
  413.                         call glVertex3f ;x*topRadius, y*topRadius, height
  414.                         inc dword[i]
  415.                         jmp .cycle_6
  416. align 4
  417.                 .cycle_6_end:
  418.                 call glEnd
  419.                 jmp .end_f
  420. align 4
  421.         .else1:
  422.         cmp dword[edx+offs_qobj_DrawStyle],GLU_FILL
  423.         jne .end_f
  424.                 fld1
  425.                 fidiv dword[slices]
  426.                 fstp dword[du] ;du = 1.0 / slices
  427.                 fld1
  428.                 fidiv dword[stacks]
  429.                 fstp dword[dv] ;dv = 1.0 / stacks
  430.                 mov dword[tcx],0.0
  431.                 mov dword[tcy],0.0
  432.                 mov ebx,[slices]
  433.                 mov dword[i],0
  434. align 4
  435.                 .cycle_7: ;for (i=0;i<slices;i++)
  436.                         cmp [i],ebx
  437.                         jge .cycle_7_end
  438.                         fild dword[i]
  439.                         fmul qword[da]
  440.                         fld st0
  441.                         fcos
  442.                         fstp dword[y] ;y1 = cos(i*da)
  443.                         fsin
  444.                         fchs
  445.                         fstp dword[x] ;x1 = -sin(i*da)
  446.                         inc dword[i]
  447.                         fild dword[i]
  448.                         fmul qword[da]
  449.                         fld st0
  450.                         fcos
  451.                         fstp dword[y2] ;y2 = cos((i+1)*da)
  452.                         fsin
  453.                         fchs
  454.                         fstp dword[x2] ;x2 = -sin((i+1)*da)
  455.                         mov dword[z],0.0
  456.                         mov ecx,[baseRadius]
  457.                         fld qword[ecx]
  458.                         fstp qword[r] ;r = baseRadius
  459.                         mov dword[tcy],0.0
  460.                         stdcall glBegin,GL_QUAD_STRIP
  461.                         mov ecx,[stacks]
  462.                         inc ecx
  463. align 4
  464.                         .cycle_8: ;for (j=0;j<=stacks;j++)
  465.  
  466.                                 fld dword[nsign]
  467.                                 ftst
  468.                                 fstsw ax
  469.                                 sahf
  470.                                 jbe .else3
  471.                                         ;if (nsign>0.0)
  472.                                         fld st0
  473.                                         fmul dword[nz]
  474.                                         fstp dword[esp-4]
  475.                                         fld st0
  476.                                         fmul dword[y]
  477.                                         fstp dword[esp-8]
  478.                                         fmul dword[x]
  479.                                         fstp dword[esp-12]
  480.                                         sub esp,12
  481.                                         call glNormal3f ;x1*nsign, y1*nsign, nz*nsign
  482.                                         cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  483.                                         je @f
  484.                                                 stdcall glTexCoord2f, [tcx],[tcy]
  485.                                         @@:
  486.                                         mov eax,[z]
  487.                                         mov [esp-4],eax
  488.                                         fld qword[r]
  489.                                         fld st0
  490.                                         fmul dword[y]
  491.                                         fstp dword[esp-8]
  492.                                         fmul dword[x]
  493.                                         fstp dword[esp-12]
  494.                                         sub esp,12
  495.                                         call glVertex3f ;x1*r, y1*r, z
  496.                                         fld dword[nsign]
  497.                                         fld st0
  498.                                         fmul dword[nz]
  499.                                         fstp dword[esp-4]
  500.                                         fld st0
  501.                                         fmul dword[y2]
  502.                                         fstp dword[esp-8]
  503.                                         fmul dword[x2]
  504.                                         fstp dword[esp-12]
  505.                                         sub esp,12
  506.                                         call glNormal3f ;x2*nsign, y2*nsign, nz*nsign
  507.                                         cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  508.                                         je @f
  509.                                                 push dword[tcy]
  510.                                                 fld dword[tcx]
  511.                                                 fadd dword[du]
  512.                                                 fstp dword[esp-4]
  513.                                                 sub esp,4
  514.                                                 call glTexCoord2f ;tcx+du, tcy
  515.                                         @@:
  516.                                         mov eax,[z]
  517.                                         mov [esp-4],eax
  518.                                         fld qword[r]
  519.                                         fld st0
  520.                                         fmul dword[y2]
  521.                                         fstp dword[esp-8]
  522.                                         fmul dword[x2]
  523.                                         fstp dword[esp-12]
  524.                                         sub esp,12
  525.                                         call glVertex3f ;x2*r, y2*r, z
  526.                                         jmp .else3_end
  527.                                 .else3:
  528.                                         fld st0
  529.                                         fmul dword[nz]
  530.                                         fstp dword[esp-4]
  531.                                         fld st0
  532.                                         fmul dword[y2]
  533.                                         fstp dword[esp-8]
  534.                                         fmul dword[x2]
  535.                                         fstp dword[esp-12]
  536.                                         sub esp,12
  537.                                         call glNormal3f ;x2*nsign, y2*nsign, nz*nsign
  538.                                         cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  539.                                         je @f
  540.                                                 stdcall glTexCoord2f, [tcx],[tcy]
  541.                                         @@:
  542.                                         mov eax,[z]
  543.                                         mov [esp-4],eax
  544.                                         fld qword[r]
  545.                                         fld st0
  546.                                         fmul dword[y2]
  547.                                         fstp dword[esp-8]
  548.                                         fmul dword[x2]
  549.                                         fstp dword[esp-12]
  550.                                         sub esp,12
  551.                                         call glVertex3f ;x2*r, y2*r, z
  552.                                         fld dword[nsign]
  553.                                         fld st0
  554.                                         fmul dword[nz]
  555.                                         fstp dword[esp-4]
  556.                                         fld st0
  557.                                         fmul dword[y]
  558.                                         fstp dword[esp-8]
  559.                                         fmul dword[x]
  560.                                         fstp dword[esp-12]
  561.                                         sub esp,12
  562.                                         call glNormal3f ;x1*nsign, y1*nsign, nz*nsign
  563.                                         cmp dword[edx+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  564.                                         je @f
  565.                                                 push dword[tcy]
  566.                                                 fld dword[tcx]
  567.                                                 fadd dword[du]
  568.                                                 fstp dword[esp-4]
  569.                                                 sub esp,4
  570.                                                 call glTexCoord2f ;tcx+du, tcy
  571.                                         @@:
  572.                                         mov eax,[z]
  573.                                         mov [esp-4],eax
  574.                                         fld qword[r]
  575.                                         fld st0
  576.                                         fmul dword[y]
  577.                                         fstp dword[esp-8]
  578.                                         fmul dword[x]
  579.                                         fstp dword[esp-12]
  580.                                         sub esp,12
  581.                                         call glVertex3f ;x1*r, y1*r, z
  582.                                 .else3_end:
  583.                                 fld dword[z]
  584.                                 fadd qword[dz]
  585.                                 fstp dword[z] ;z += dz
  586.                                 fld qword[r]
  587.                                 fadd qword[dr]
  588.                                 fstp qword[r] ;r += dr
  589.                                 fld dword[tcy]
  590.                                 fadd dword[dv]
  591.                                 fstp dword[tcy] ;tcy += dv
  592.                                 dec ecx
  593.                                 jnz .cycle_8
  594.                         call glEnd
  595.                         fld dword[tcx]
  596.                         fadd dword[du]
  597.                         fstp dword[tcx] ;tcx += du
  598.                         jmp .cycle_7
  599. align 4
  600.                 .cycle_7_end:
  601.         .end_f:
  602. popad
  603.         ret
  604. endp
  605.  
  606. ; Disk (adapted from Mesa)
  607.  
  608. ;void gluDisk(GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops )
  609. ;{
  610. ;}
  611.  
  612. ;
  613. ; Sphere (adapted from Mesa)
  614. ;
  615.  
  616. ;input:
  617. ; float radius, int slices, int stacks
  618. align 16
  619. proc gluSphere qobj:dword, radius:dword, slices:dword, stacks:dword
  620. locals
  621.         rho dd ? ;float
  622.         drho dd ?
  623.         theta dd ?
  624.         dtheta dd ?
  625.         x dd ? ;float
  626.         y dd ? ;float
  627.         z dd ? ;float
  628.         s dd ? ;float
  629.         t dd ? ;float
  630.         d_s dd ? ;float
  631.         d_t dd ? ;float
  632.         i dd ? ;int
  633.         j dd ? ;int
  634.         imax dd ? ;int
  635.         normals dd ? ;int
  636.         nsign dd ? ;float
  637. endl
  638. pushad
  639.  
  640.         mov eax,[qobj]
  641.         cmp dword[eax+offs_qobj_Normals],GLU_NONE ;if (qobj.Normals==GLU_NONE)
  642.         jne .els_0
  643.                 mov dword[normals],GL_FALSE
  644.                 jmp @f
  645. align 4
  646.         .els_0:
  647.                 mov dword[normals],GL_TRUE
  648.         @@:
  649.         cmp dword[eax+offs_qobj_Orientation],GLU_INSIDE ;if (qobj.Orientation==GLU_INSIDE)
  650.         jne .els_1
  651.                 mov dword[nsign],-1.0
  652.                 jmp @f
  653. align 4
  654.         .els_1:
  655.                 mov dword[nsign],1.0
  656.         @@:
  657.  
  658.         fldpi
  659.         fidiv dword[stacks]
  660.         fstp dword[drho]
  661.         fld1
  662.         fldpi
  663.         fscale
  664.         fidiv dword[slices]
  665.         fstp dword[dtheta]
  666.         ffree st0
  667.         fincstp
  668.  
  669.         cmp dword[eax+offs_qobj_DrawStyle],GLU_FILL ;if (qobj.DrawStyle==GLU_FILL)
  670.         jne .if_glu_line
  671.  
  672.         ; draw +Z end as a triangle fan
  673.         stdcall glBegin,GL_TRIANGLE_FAN
  674.         cmp dword[normals],GL_TRUE
  675.         jne @f
  676.                 stdcall glNormal3f, 0.0, 0.0, 1.0
  677.         @@:
  678.         cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  679.         je @f
  680.                 stdcall glTexCoord2f, 0.5,1.0
  681.         @@:
  682.         sub esp,4
  683.         fld dword[nsign]
  684.         fmul dword[radius]
  685.         fstp dword[esp]
  686.         stdcall glVertex3f, 0.0, 0.0 ;, nsign * radius
  687.         fld dword[drho]
  688.         fcos
  689.         fmul dword[nsign]
  690.         fstp dword[z] ;z = nsign * cos(drho)
  691.         mov dword[j],0
  692.         mov ecx,[slices]
  693. align 4
  694.         .cycle_0: ;for (j=0;j<=slices;j++)
  695.                 cmp dword[j],ecx
  696.                 jg .cycle_0_end
  697.                 fld dword[drho]
  698.                 fsin
  699.                 je @f
  700.                         fild dword[j]
  701.                         fmul dword[dtheta]
  702.                         jmp .t0_end
  703. align 4
  704.                 @@:
  705.                         fldz
  706.                 .t0_end:
  707.                 fst dword[theta] ;theta = (j==slices) ? 0.0 : j * dtheta
  708.                 fsin
  709.                 fchs
  710.                 fmul st0,st1
  711.                 fstp dword[x] ;x = -sin(theta) * sin(drho)
  712.                 fld dword[theta]
  713.                 fcos
  714.                 fmulp
  715.                 fstp dword[y] ;y = cos(theta) * sin(drho)
  716.                 cmp dword[normals],GL_TRUE
  717.                 jne @f
  718.                         fld dword[nsign]
  719.                         fld dword[z]
  720.                         fmul st0,st1
  721.                         fstp dword[esp-4]
  722.                         fld dword[y]
  723.                         fmul st0,st1
  724.                         fstp dword[esp-8]
  725.                         fld dword[x]
  726.                         fmulp
  727.                         fstp dword[esp-12]
  728.                         sub esp,12
  729.                         stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
  730.                 @@:
  731.                 fld dword[radius]
  732.                 fld dword[z]
  733.                 fmul st0,st1
  734.                 fstp dword[esp-4]
  735.                 fld dword[y]
  736.                 fmul st0,st1
  737.                 fstp dword[esp-8]
  738.                 fld dword[x]
  739.                 fmulp
  740.                 fstp dword[esp-12]
  741.                 sub esp,12
  742.                 call glVertex3f ;x*radius, y*radius, z*radius
  743.                 inc dword[j]
  744.                 jmp .cycle_0
  745. align 4
  746.         .cycle_0_end:
  747.         call glEnd
  748.  
  749.         fld1
  750.         fidiv dword[slices]
  751.         fstp dword[d_s] ;1.0 / slices
  752.         fld1
  753.         fidiv dword[stacks]
  754.         fstp dword[d_t] ;1.0 / stacks
  755.         mov dword[t],1.0 ; because loop now runs from 0
  756.         mov ebx,[stacks]
  757.         cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  758.         je .els_2
  759.                 mov dword[i],0
  760.                 mov [imax],ebx
  761.                 jmp @f
  762. align 4
  763.         .els_2:
  764.                 mov dword[i],1
  765.                 dec ebx
  766.                 mov [imax],ebx
  767.         @@:
  768.  
  769.         ; draw intermediate stacks as quad strips
  770.         mov ebx,[imax]
  771. align 4
  772.         .cycle_1: ;for (i=imin;i<imax;i++)
  773.         cmp dword[i],ebx
  774.         jge .cycle_1_end
  775.         fild dword[i]
  776.         fmul dword[drho]
  777.         fstp dword[rho] ;rho = i * drho
  778.         stdcall glBegin,GL_QUAD_STRIP
  779.         mov dword[s],0.0
  780.         mov dword[j],0
  781. align 4
  782.         .cycle_2: ;for (j=0;j<=slices;j++)
  783.                 cmp dword[j],ecx
  784.                 jg .cycle_2_end
  785.                 fld dword[rho]
  786.                 fsin
  787.                 je @f
  788.                         fild dword[j]
  789.                         fmul dword[dtheta]
  790.                         jmp .t1_end
  791. align 4
  792.                 @@:
  793.                         fldz
  794.                 .t1_end:
  795.                 fst dword[theta] ;theta = (j==slices) ? 0.0 : j * dtheta
  796.                 fsin
  797.                 fchs
  798.                 fmul st0,st1
  799.                 fstp dword[x] ;x = -sin(theta) * sin(rho)
  800.                 fld dword[theta]
  801.                 fcos
  802.                 fmulp
  803.                 fstp dword[y] ;y = cos(theta) * sin(rho)
  804.                 fld dword[rho]
  805.                 fcos
  806.                 fmul dword[nsign]
  807.                 fstp dword[z] ;z = nsign * cos(rho)
  808.                 cmp dword[normals],GL_TRUE
  809.                 jne @f
  810.                         fld dword[nsign]
  811.                         fld dword[z]
  812.                         fmul st0,st1
  813.                         fstp dword[esp-4]
  814.                         fld dword[y]
  815.                         fmul st0,st1
  816.                         fstp dword[esp-8]
  817.                         fld dword[x]
  818.                         fmulp
  819.                         fstp dword[esp-12]
  820.                         sub esp,12
  821.                         stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
  822.                 @@:
  823.                 cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  824.                 je @f
  825.                         stdcall glTexCoord2f, [s],[t]
  826.                 @@:
  827.                 fld dword[radius]
  828.                 fld dword[z]
  829.                 fmul st0,st1
  830.                 fstp dword[esp-4]
  831.                 fld dword[y]
  832.                 fmul st0,st1
  833.                 fstp dword[esp-8]
  834.                 fld dword[x]
  835.                 fmulp
  836.                 fstp dword[esp-12]
  837.                 sub esp,12
  838.                 call glVertex3f ;x*radius, y*radius, z*radius
  839.                 fld dword[rho]
  840.                 fadd dword[drho]
  841.                 fsin ;st0 = sin(rho+drho)
  842.                 fld dword[theta]
  843.                 fsin
  844.                 fchs
  845.                 fmul st0,st1
  846.                 fstp dword[x] ;x = -sin(theta) * sin(rho+drho)
  847.                 fld dword[theta]
  848.                 fcos
  849.                 fmulp
  850.                 fstp dword[y] ;y = cos(theta) * sin(rho+drho)
  851.                 fld dword[rho]
  852.                 fadd dword[drho]
  853.                 fcos
  854.                 fmul dword[nsign]
  855.                 fstp dword[z] ;z = nsign * cos(rho+drho)
  856.                 cmp dword[normals],GL_TRUE
  857.                 jne @f
  858.                         fld dword[nsign]
  859.                         fld dword[z]
  860.                         fmul st0,st1
  861.                         fstp dword[esp-4]
  862.                         fld dword[y]
  863.                         fmul st0,st1
  864.                         fstp dword[esp-8]
  865.                         fld dword[x]
  866.                         fmulp
  867.                         fstp dword[esp-12]
  868.                         sub esp,12
  869.                         stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
  870.                 @@:
  871.                 cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  872.                 je @f
  873.                         fld dword[t]
  874.                         fsub dword[d_t]
  875.                         fstp dword[esp-4]
  876.                         sub esp,4
  877.                         stdcall glTexCoord2f, [s] ;,t-dt
  878.                         fld dword[s]
  879.                         fadd dword[d_s]
  880.                         fstp dword[s]
  881.                 @@:
  882.                 fld dword[radius]
  883.                 fld dword[z]
  884.                 fmul st0,st1
  885.                 fstp dword[esp-4]
  886.                 fld dword[y]
  887.                 fmul st0,st1
  888.                 fstp dword[esp-8]
  889.                 fld dword[x]
  890.                 fmulp
  891.                 fstp dword[esp-12]
  892.                 sub esp,12
  893.                 call glVertex3f ;x*radius, y*radius, z*radius
  894.                 inc dword[j]
  895.                 jmp .cycle_2
  896. align 4
  897.                 .cycle_2_end:
  898.         call glEnd
  899.         fld dword[t]
  900.         fsub dword[d_t]
  901.         fstp dword[t]
  902.         inc dword[i]
  903.         jmp .cycle_1
  904. align 4
  905.         .cycle_1_end:
  906.  
  907.         ; draw -Z end as a triangle fan
  908.         stdcall glBegin,GL_TRIANGLE_FAN
  909.         cmp dword[normals],GL_TRUE
  910.         jne @f
  911.                 stdcall glNormal3f, 0.0, 0.0, -1.0
  912.         @@:
  913.         cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  914.         je @f
  915.                 stdcall glTexCoord2f, 0.5,0.0
  916.                 mov dword[s],1.0
  917.                 mov ebx,[d_t]
  918.                 mov [t],ebx
  919.         @@:
  920.         sub esp,4
  921.         fld dword[radius]
  922.         fchs
  923.         fmul dword[nsign]
  924.         fstp dword[esp]
  925.         stdcall glVertex3f, 0.0, 0.0 ;, -radius*nsign
  926.         fldpi
  927.         fsub dword[drho]
  928.         fst dword[rho]
  929.         fcos
  930.         fmul dword[nsign]
  931.         fstp dword[z] ;z = nsign * cos(rho)
  932.         mov [j],ecx
  933. align 4
  934.         .cycle_3: ;for (j=slices;j>=0;j--)
  935.                 cmp dword[j],0
  936.                 jl .cycle_3_end
  937.                 fld dword[rho]
  938.                 fsin
  939.                 je @f
  940.                         fild dword[j]
  941.                         fmul dword[dtheta]
  942.                         jmp .t2_end
  943. align 4
  944.                 @@:
  945.                         fldz
  946.                 .t2_end:
  947.                 fst dword[theta] ;theta = (j==slices) ? 0.0 : j * dtheta
  948.                 fsin
  949.                 fchs
  950.                 fmul st0,st1
  951.                 fstp dword[x] ;x = -sin(theta) * sin(rho)
  952.                 fld dword[theta]
  953.                 fcos
  954.                 fmulp
  955.                 fstp dword[y] ;y = cos(theta) * sin(rho)
  956.                 cmp dword[normals],GL_TRUE
  957.                 jne @f
  958.                         fld dword[nsign]
  959.                         fld dword[z]
  960.                         fmul st0,st1
  961.                         fstp dword[esp-4]
  962.                         fld dword[y]
  963.                         fmul st0,st1
  964.                         fstp dword[esp-8]
  965.                         fld dword[x]
  966.                         fmul st0,st1
  967.                         fstp dword[esp-12]
  968.                         sub esp,12
  969.                         ffree st0
  970.                         fincstp
  971.                         stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
  972.                 @@:
  973.                 cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
  974.                 je @f
  975.                         stdcall glTexCoord2f, [s],[t]
  976.                         fld dword[s]
  977.                         fsub dword[d_s]
  978.                         fstp dword[s]
  979.                 @@:
  980.                 fld dword[radius]
  981.                 fld dword[z]
  982.                 fmul st0,st1
  983.                 fstp dword[esp-4]
  984.                 fld dword[y]
  985.                 fmul st0,st1
  986.                 fstp dword[esp-8]
  987.                 fld dword[x]
  988.                 fmulp
  989.                 fstp dword[esp-12]
  990.                 sub esp,12
  991.                 call glVertex3f ;x*radius, y*radius, z*radius
  992.                 dec dword[j]
  993.                 jmp .cycle_3
  994. align 4
  995.         .cycle_3_end:
  996.         call glEnd
  997.         jmp .end_f
  998.  
  999. align 4
  1000.         .if_glu_line:
  1001.         cmp dword[eax+offs_qobj_DrawStyle],GLU_LINE ;if (qobj.DrawStyle==GLU_LINE)
  1002.         je @f
  1003.         cmp dword[eax+offs_qobj_DrawStyle],GLU_SILHOUETTE ;if (qobj.DrawStyle==GLU_SILHOUETTE)
  1004.         je @f
  1005.         jmp .if_glu_point
  1006. align 4
  1007.         @@:
  1008.  
  1009.         ; draw stack lines
  1010.         mov dword[i],1
  1011.         mov ebx,[stacks]
  1012.         mov ecx,[slices]
  1013. align 4
  1014.         .cycle_4: ;for (i=1;i<stacks;i++)
  1015.                 cmp dword[i],ebx
  1016.                 jge .cycle_4_end
  1017.                 ; stack line at i==stacks-1 was missing here
  1018.  
  1019.                 fild dword[i]
  1020.                 fmul dword[drho]
  1021.                 fstp dword[rho] ;rho = i * drho
  1022.                 stdcall glBegin,GL_LINE_LOOP
  1023.                 mov dword[j],0
  1024. align 4
  1025.                 .cycle_5: ;for (j=0;j<slices;j++)
  1026.                         cmp dword[j],ecx
  1027.                         jge .cycle_5_end
  1028.                         fild dword[j]
  1029.                         fmul dword[dtheta]
  1030.                         fst dword[theta] ;theta = j * dtheta;
  1031.                         fcos
  1032.                         fld dword[rho]
  1033.                         fsin
  1034.                         fxch ;толкаем sin(rho) в st1
  1035.                         fmul st0,st1
  1036.                         fstp dword[x] ;x = cos(theta) * sin(rho)
  1037.                         fld dword[theta]
  1038.                         fsin
  1039.                         fmulp ;множим на sin(rho) ранее записанный в st1
  1040.                         fstp dword[y] ;y = sin(theta) * sin(rho)
  1041.                         fld dword[rho]
  1042.                         fcos
  1043.                         fstp dword[z] ;z = cos(rho)
  1044.                         cmp dword[normals],GL_TRUE
  1045.                         jne @f
  1046.                                 fld dword[nsign]
  1047.                                 fld dword[z]
  1048.                                 fmul st0,st1
  1049.                                 fstp dword[esp-4]
  1050.                                 fld dword[y]
  1051.                                 fmul st0,st1
  1052.                                 fstp dword[esp-8]
  1053.                                 fld dword[x]
  1054.                                 fmulp
  1055.                                 fstp dword[esp-12]
  1056.                                 sub esp,12
  1057.                                 stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
  1058.                         @@:
  1059.                         fld dword[radius]
  1060.                         fld dword[z]
  1061.                         fmul st0,st1
  1062.                         fstp dword[esp-4]
  1063.                         fld dword[y]
  1064.                         fmul st0,st1
  1065.                         fstp dword[esp-8]
  1066.                         fld dword[x]
  1067.                         fmulp
  1068.                         fstp dword[esp-12]
  1069.                         sub esp,12
  1070.                         call glVertex3f ;x*radius, y*radius, z*radius
  1071.                         inc dword[j]
  1072.                         jmp .cycle_5
  1073. align 4
  1074.                 .cycle_5_end:
  1075.                 call glEnd
  1076.                 inc dword[i]
  1077.                 jmp .cycle_4
  1078. align 4
  1079.         .cycle_4_end:
  1080.  
  1081.         ; draw slice lines
  1082.         mov dword[j],0
  1083. align 4
  1084.         .cycle_6: ;for (j=0;j<slices;j++)
  1085.                 cmp dword[j],ecx
  1086.                 jge .cycle_6_end
  1087.                 fild dword[j]
  1088.                 fmul dword[dtheta]
  1089.                 fstp dword[theta] ;theta = j * dtheta;
  1090.                 stdcall glBegin,GL_LINE_STRIP
  1091.                 mov dword[i],0
  1092. align 4
  1093.                 .cycle_7: ;for (i=0;i<=stacks;i++)
  1094.                         cmp dword[i],ebx
  1095.                         jg .cycle_7_end
  1096.                         fild dword[i]
  1097.                         fmul dword[drho]
  1098.                         fst dword[rho] ;rho = i * drho
  1099.                         fsin
  1100.                         fld dword[theta]
  1101.                         fcos
  1102.                         fmul st0,st1
  1103.                         fstp dword[x] ;x = cos(theta) * sin(rho)
  1104.                         fld dword[theta]
  1105.                         fsin
  1106.                         fmulp
  1107.                         fstp dword[y] ;y = sin(theta) * sin(rho)
  1108.                         fld dword[rho]
  1109.                         fcos
  1110.                         fstp dword[z] ;z = cos(rho)
  1111.                         cmp dword[normals],GL_TRUE
  1112.                         jne @f
  1113.                                 fld dword[nsign]
  1114.                                 fld dword[z]
  1115.                                 fmul st0,st1
  1116.                                 fstp dword[esp-4]
  1117.                                 fld dword[y]
  1118.                                 fmul st0,st1
  1119.                                 fstp dword[esp-8]
  1120.                                 fld dword[x]
  1121.                                 fmulp
  1122.                                 fstp dword[esp-12]
  1123.                                 sub esp,12
  1124.                                 stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
  1125.                         @@:
  1126.                         fld dword[radius]
  1127.                         fld dword[z]
  1128.                         fmul st0,st1
  1129.                         fstp dword[esp-4]
  1130.                         fld dword[y]
  1131.                         fmul st0,st1
  1132.                         fstp dword[esp-8]
  1133.                         fld dword[x]
  1134.                         fmulp
  1135.                         fstp dword[esp-12]
  1136.                         sub esp,12
  1137.                         call glVertex3f ;x*radius, y*radius, z*radius
  1138.                         inc dword[i]
  1139.                         jmp .cycle_7
  1140. align 4
  1141.                 .cycle_7_end:
  1142.                 call glEnd
  1143.                 inc dword[j]
  1144.                 jmp .cycle_6
  1145. align 4
  1146.         .cycle_6_end:
  1147.         jmp .end_f
  1148.  
  1149. align 4
  1150.         .if_glu_point:
  1151.         cmp dword[eax+offs_qobj_DrawStyle],GLU_POINT ;if (qobj.DrawStyle==GLU_POINT)
  1152.         jne .end_f
  1153.  
  1154.         ; top and bottom-most points
  1155.         stdcall glBegin,GL_POINTS
  1156.         cmp dword[normals],GL_TRUE
  1157.         jne @f
  1158.                 stdcall glNormal3f, 0.0,0.0,dword[nsign]
  1159.         @@:
  1160.         stdcall glVertex3f, 0.0,0.0,dword[radius]
  1161.         cmp dword[normals],GL_TRUE
  1162.         jne @f
  1163.                 sub esp,4
  1164.                 fld dword[nsign]
  1165.                 fchs
  1166.                 fstp dword[esp]
  1167.                 stdcall glNormal3f, 0.0,0.0 ;,-nsign
  1168.         @@:
  1169.         sub esp,4
  1170.         fld dword[radius]
  1171.         fchs
  1172.         fstp dword[esp]
  1173.         stdcall glVertex3f, 0.0,0.0 ;,-radius
  1174.  
  1175.         ; loop over stacks
  1176.         mov dword[i],1
  1177.         mov ebx,[stacks]
  1178.         mov ecx,[slices]
  1179. align 4
  1180.         .cycle_8: ;for (i=1;i<stacks;i++)
  1181.                 cmp dword[i],ebx
  1182.                 jge .cycle_8_end
  1183.                 fild dword[i]
  1184.                 fmul dword[drho]
  1185.                 fstp dword[rho] ;rho = i * drho
  1186.  
  1187.                 mov dword[j],0
  1188. align 4
  1189.                 .cycle_9: ;for (j=0;j<slices;j++)
  1190.                         cmp dword[j],ecx
  1191.                         jge .cycle_9_end
  1192.                         fild dword[j]
  1193.                         fmul dword[dtheta]
  1194.                         fst dword[theta] ;theta = j * dtheta;
  1195.                         fcos
  1196.                         fld dword[rho]
  1197.                         fsin
  1198.                         fxch ;толкаем sin(rho) в st1
  1199.                         fmul st0,st1
  1200.                         fstp dword[x] ;x = cos(theta) * sin(rho)
  1201.                         fld dword[theta]
  1202.                         fsin
  1203.                         fmulp ;множим на sin(rho) ранее записанный в st1
  1204.                         fstp dword[y] ;y = sin(theta) * sin(rho)
  1205.                         fld dword[rho]
  1206.                         fcos
  1207.                         fstp dword[z] ;z = cos(rho)
  1208.                         cmp dword[normals],GL_TRUE
  1209.                         jne @f
  1210.                                 fld dword[nsign]
  1211.                                 fld dword[z]
  1212.                                 fmul st0,st1
  1213.                                 fstp dword[esp-4]
  1214.                                 fld dword[y]
  1215.                                 fmul st0,st1
  1216.                                 fstp dword[esp-8]
  1217.                                 fld dword[x]
  1218.                                 fmulp
  1219.                                 fstp dword[esp-12]
  1220.                                 sub esp,12
  1221.                                 stdcall glNormal3f ;x*nsign, y*nsign, z*nsign
  1222.                         @@:
  1223.                         fld dword[radius]
  1224.                         fld dword[z]
  1225.                         fmul st0,st1
  1226.                         fstp dword[esp-4]
  1227.                         fld dword[y]
  1228.                         fmul st0,st1
  1229.                         fstp dword[esp-8]
  1230.                         fld dword[x]
  1231.                         fmulp
  1232.                         fstp dword[esp-12]
  1233.                         sub esp,12
  1234.                         call glVertex3f ;x*radius, y*radius, z*radius
  1235.                         inc dword[j]
  1236.                         jmp .cycle_9
  1237. align 4
  1238.                 .cycle_9_end:
  1239.                 inc dword[i]
  1240.                 jmp .cycle_8
  1241. align 4
  1242.         .cycle_8_end:
  1243.         call glEnd
  1244.  
  1245.         .end_f:
  1246. popad
  1247.         ret
  1248. endp
  1249.