Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; Опции для функций:
  3. ;
  4. ;INTERP_Z - использование Z буфера (всегда включено)
  5. ;INTERP_RGB - сглажевание цветов
  6. ;INTERP_ST - наложение текстуры в ортогональной проэкции
  7. ;INTERP_STZ - наложение текстуры в перспективной проэкции
  8. ;
  9. ; Функции рисования треугольников:
  10. ;
  11. ;ZB_fillTriangleFlat - треугольник одного цвета
  12. ;ZB_fillTriangleSmooth - треугольник с разными цветами вершин
  13. ;ZB_fillTriangleMapping - треугольник с текстурой в ортогональной проэкции
  14. ;ZB_fillTriangleMappingPerspective - треугольник с текстурой в перспективной проэкции
  15. ;
  16.  
  17. macro calc_d1d2 f, r1, r2
  18. {
  19.         fld dword[fdy2]
  20.         fmul st0,st2
  21.         fld dword[fdy1]
  22.         fmul st0,st2
  23.         fsubp
  24.         f#stp dword[r1] ;r1 = (fdy2*d1 - fdy1*d2)
  25.         fld dword[fdx1]
  26.         fmulp
  27.         fld dword[fdx2]
  28.         fmul st0,st2
  29.         fsubp
  30.         f#stp dword[r2] ;r2 = (fdx1*d2 - fdx2*d1)
  31.         ffree st0 ;d1
  32.         fincstp
  33. }
  34.  
  35. INTERP_Z equ 1
  36.  
  37. macro DRAW_INIT
  38. {
  39. if TGL_FEATURE_RENDER_BITS eq 24
  40.         mov ecx,[p2]
  41.         mov eax,[ecx+ZBufferPoint.r]
  42.         mov [colorB],ah ;colorB=p2.r>>8
  43.         mov eax,[ecx+ZBufferPoint.g]
  44.         mov [colorG],ah ;colorG=p2.g>>8
  45.         mov eax,[ecx+ZBufferPoint.b]
  46.         mov [colorR],ah ;colorR=p2.b>>8
  47. ;else
  48. ;color=RGB_TO_PIXEL(p2.r,p2.g,p2.b)
  49. end if
  50. }
  51.  
  52. macro PUT_PIXEL _a
  53. {
  54. local .end_0
  55. if _a eq 0
  56.         mov ebx,[dzdx]
  57. end if
  58.         mov eax,[z]
  59.         shr eax,ZB_POINT_Z_FRAC_BITS
  60.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  61.         jl .end_0
  62.                 ;edi = pp
  63.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  64. if TGL_FEATURE_RENDER_BITS eq 24
  65.                 mov ax,word[colorB] ;сохраняем colorB и colorG
  66.                 mov word[edi+3*_a],ax
  67.                 mov al,[colorR]
  68.                 mov byte[edi+3*_a +2],al
  69. ;else
  70. ;pp[_a]=color
  71. end if
  72.         .end_0:
  73.         add [z],ebx
  74. }
  75.  
  76. align 16
  77. proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword
  78. locals
  79. if TGL_FEATURE_RENDER_BITS eq 24
  80.         colorB db ?
  81.         colorG db ?
  82.         colorR db ? ;unsigned char
  83. else
  84.         color dd ? ;int
  85. end if
  86. include 'ztriangle.inc'
  87.  
  88. ;
  89. ; Smooth filled triangle.
  90. ; The code below is very tricky :)
  91. ;
  92.  
  93. INTERP_Z equ 1
  94. INTERP_RGB equ 1
  95.  
  96. macro DRAW_INIT
  97. {
  98. }
  99.  
  100. macro PUT_PIXEL _a
  101. {
  102. local .end_0
  103.         mov eax,[z]
  104.         shr eax,ZB_POINT_Z_FRAC_BITS
  105.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  106.         jl .end_0
  107.                 ;edi = pp
  108.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  109. if TGL_FEATURE_RENDER_BITS eq 24
  110.                 mov eax,[og1]
  111.                 mov al,byte[or1+1]
  112.                 mov word[edi+3*_a],ax
  113.                 mov eax,[ob1]
  114.                 mov byte[edi+3*_a +2],ah
  115. end if
  116. ;if TGL_FEATURE_RENDER_BITS eq 32
  117. ;pp[_a] = RGB_TO_PIXEL(or1, og1, ob1)
  118. ;end if
  119.         .end_0:
  120. if _a eq 0
  121.         mov ebx,[dzdx]
  122.         mov ecx,[dgdx]
  123.         mov edx,[drdx]
  124. end if
  125.         add [z],ebx
  126.         add [og1],ecx
  127.         add [or1],edx
  128.         mov eax,[dbdx]
  129.         add [ob1],eax
  130. }
  131.  
  132. align 16
  133. proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword
  134. locals
  135. include 'ztriangle.inc'
  136.  
  137. align 16
  138. proc ZB_setTexture uses eax ebx, zb:dword, texture:dword,\
  139.         s_bound:dword, t_bound:dword, s_log2:dword
  140.         mov eax,[zb]
  141.         mov ebx,[texture]
  142.         mov dword[eax+ZBuffer.current_texture],ebx
  143.         mov ebx,[s_log2]
  144.         mov dword[eax+ZBuffer.s_log2],ebx
  145.         mov ebx,[s_bound]
  146.         mov dword[eax+ZBuffer.s_bound],ebx
  147.         mov ebx,[t_bound]
  148.         mov dword[eax+ZBuffer.t_bound],ebx
  149.         ret
  150. endp
  151.  
  152. INTERP_Z equ 1
  153. INTERP_ST equ 1
  154.  
  155. macro DRAW_INIT
  156. {
  157.         mov eax,[zb]
  158.         mov ebx,[eax+ZBuffer.current_texture]
  159.         mov [texture],ebx
  160.         mov ebx,[eax+ZBuffer.s_log2]
  161.         mov [s_log2],ebx ;s_log2 = zb.s_log2
  162.         mov ebx,[eax+ZBuffer.s_bound]
  163.         mov [s_bound],ebx ;s_bound = zb.s_bound
  164.         mov ebx,[eax+ZBuffer.t_bound]
  165.         mov [t_bound],ebx ;t_bound = zb.t_bound
  166. }
  167.  
  168. macro PUT_PIXEL _a
  169. {
  170. local .end_0
  171.         mov eax,[z]
  172.         shr eax,ZB_POINT_Z_FRAC_BITS
  173.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  174.         jl .end_0
  175.                 ;edi = pp
  176.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  177. if TGL_FEATURE_RENDER_BITS eq 24
  178.                 mov ebx,[t]
  179.                 and ebx,[t_bound]
  180.                 mov ecx,[s_log2]
  181.                 shr ebx,cl ;(t & t_bound) >> s_log2
  182.                 mov eax,[s]
  183.                 and eax,[s_bound]
  184.                 shr eax,ZB_POINT_TEXEL_SIZE
  185.                 or ebx,eax
  186.                 lea ebx,[ebx+2*ebx]
  187.                 add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
  188.                 mov ax,word[ebx]
  189.                 mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
  190.                 mov al,byte[ebx+2]
  191.                 mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
  192. else
  193. ;pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]
  194. end if
  195.         .end_0:
  196.         mov eax,[dzdx]
  197.         add [z],eax
  198.         mov eax,[dsdx]
  199.         add [s],eax
  200.         mov eax,[dtdx]
  201.         add [t],eax
  202. }
  203.  
  204. align 16
  205. proc ZB_fillTriangleMapping, zb:dword, p0:dword, p1:dword, p2:dword
  206. locals
  207.         texture dd ? ;PIXEL*
  208.         s_log2 dd ? ;unsigned int
  209.         s_bound dd ? ;unsigned int
  210.         t_bound dd ? ;unsigned int
  211. include 'ztriangle.inc'
  212.  
  213. ;
  214. ; Texture mapping with perspective correction.
  215. ; We use the gradient method to make less divisions.
  216. ; TODO: pipeline the division
  217. ;
  218.  
  219. INTERP_Z equ 1
  220. INTERP_STZ equ 1
  221.  
  222. NB_INTERP equ 8
  223.  
  224. macro DRAW_INIT
  225. {
  226.         mov eax,[zb]
  227.         mov ebx,[eax+ZBuffer.current_texture]
  228.         mov [texture],ebx
  229.         mov ebx,[eax+ZBuffer.s_log2]
  230.         mov [s_log2],ebx ;s_log2 = zb.s_log2
  231.         mov ebx,[eax+ZBuffer.s_bound]
  232.         mov [s_bound],ebx ;s_bound = zb.s_bound
  233.         mov ebx,[eax+ZBuffer.t_bound]
  234.         mov [t_bound],ebx ;t_bound = zb.t_bound
  235.         mov dword[esp-4],NB_INTERP
  236.         fild dword[esp-4]
  237.         fild dword[dzdx]
  238.         fst dword[fdzdx] ;fdzdx = (float)dzdx
  239.         fmul st0,st1
  240.         fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
  241.         fld dword[fdzdx]
  242.         fmul st0,st1
  243.         fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
  244.         fmul dword[dtzdx]
  245.         fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
  246. }
  247.  
  248. macro PUT_PIXEL _a
  249. {
  250. local .end_0
  251.         mov eax,[z]
  252.         shr eax,ZB_POINT_Z_FRAC_BITS
  253.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  254.         jl .end_0
  255.                 ;edi = pp
  256.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  257. if TGL_FEATURE_RENDER_BITS eq 24
  258.                 mov ebx,[t]
  259.                 and ebx,[t_bound]
  260.                 mov ecx,[s_log2]
  261.                 shr ebx,cl ;(t & t_bound) >> s_log2
  262.                 mov eax,[s]
  263.                 and eax,[s_bound]
  264.                 shr eax,ZB_POINT_TEXEL_SIZE
  265.                 or ebx,eax
  266.                 lea ebx,[ebx+2*ebx]
  267.                 add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
  268.                 mov ax,word[ebx]
  269.                 mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
  270.                 mov al,byte[ebx+2]
  271.                 mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
  272. else
  273. ;       pp[_a]=*(PIXEL *)((char *)texture+
  274. ;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
  275. end if
  276.         .end_0:
  277.         mov eax,[dzdx]
  278.         add [z],eax
  279.         mov eax,[dsdx]
  280.         add [s],eax
  281.         mov eax,[dtdx]
  282.         add [t],eax
  283. }
  284.  
  285. DRAW_LINE_M equ 1
  286.  
  287. macro DRAW_LINE
  288. {
  289. if TGL_FEATURE_RENDER_BITS eq 24
  290.         mov eax,[x2]
  291.         sar eax,16
  292.         mov edi,[x1]
  293.         sub eax,edi
  294.         mov [n],eax ;n = (x2 >> 16) - x1
  295.         fld1
  296.         fild dword[z1]
  297.         fst dword[f_z] ;fz = (float)z1
  298.         fdivp
  299.         fstp dword[zinv] ;zinv = 1.0 / fz
  300.         imul edi,PSZB
  301.         add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
  302.         mov esi,[x1]
  303.         shl esi,1
  304.         add esi,[pz1] ;pz = pz1 + x1
  305.         mov eax,[z1]
  306.         mov [z],eax ;z = z1
  307.         mov eax,[sz1]
  308.         mov [s_z],eax ;sz = sz1
  309.         mov eax,[tz1]
  310.         mov [t_z],eax ;tz = tz1
  311. align 4
  312.         .cycle_2: ;while (n>=(NB_INTERP-1))
  313.         cmp dword[n],NB_INTERP-1
  314.         jl .cycle_2_end
  315.                 fld dword[zinv]
  316.                 fld st0
  317.                 fmul dword[s_z] ;ss = (sz * zinv)
  318.                 fist dword[s] ;s = (int) ss
  319.                 fmul dword[fdzdx]
  320.                 fchs
  321.                 fadd dword[dszdx]
  322.                 fmul dword[zinv]
  323.                 fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
  324.                 fmul dword[t_z] ;tt = (tz * zinv)
  325.                 fist dword[t] ;t = (int) tt
  326.                 fmul dword[fdzdx]
  327.                 fchs
  328.                 fadd dword[dtzdx]
  329.                 fmul dword[zinv]
  330.                 fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
  331.                 fld1
  332.                 fld dword[f_z]
  333.                 fadd dword[fndzdx]
  334.                 fst dword[f_z] ;fz += fndzdx
  335.                 fdivp
  336.                 fstp dword[zinv] ;zinv = 1.0 / fz
  337.                 PUT_PIXEL 0
  338.                 PUT_PIXEL 1
  339.                 PUT_PIXEL 2
  340.                 PUT_PIXEL 3
  341.                 PUT_PIXEL 4
  342.                 PUT_PIXEL 5
  343.                 PUT_PIXEL 6
  344.                 PUT_PIXEL 7
  345.                 add esi,2*NB_INTERP ;pz += NB_INTERP
  346.                 add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
  347.                 sub dword[n],NB_INTERP ;n -= NB_INTERP
  348.                 fld dword[ndszdx]
  349.                 fadd dword[s_z]
  350.                 fstp dword[s_z] ;sz += ndszdx
  351.                 fld dword[ndtzdx]
  352.                 fadd dword[t_z]
  353.                 fstp dword[t_z] ;tz += ndtzdx
  354.                 jmp .cycle_2
  355. align 4
  356.         .cycle_2_end:
  357.         fld dword[zinv]
  358.         fld st0
  359.         fmul dword[s_z] ;ss = (sz * zinv)
  360.         fist dword[s] ;s = (int) ss
  361.         fmul dword[fdzdx]
  362.         fchs
  363.         fadd dword[dszdx]
  364.         fmul dword[zinv]
  365.         fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
  366.         fmul dword[t_z] ;tt = (tz * zinv)
  367.         fist dword[t] ;t = (int) tt
  368.         fmul dword[fdzdx]
  369.         fchs
  370.         fadd dword[dtzdx]
  371.         fmul dword[zinv]
  372.         fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
  373. align 4
  374.         .cycle_3: ;while (n>=0)
  375.         cmp dword[n],0
  376.         jl .cycle_3_end
  377.                 PUT_PIXEL 0
  378.                 add esi,2 ;pz += 1
  379.                 add edi,PSZB ;pp += PSZB
  380.                 dec dword[n]
  381.                 jmp .cycle_3
  382. align 4
  383.         .cycle_3_end:
  384. end if
  385. }
  386.  
  387. align 16
  388. proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
  389. locals
  390.         texture dd ? ;PIXEL *
  391.         fdzdx dd ? ;float
  392.         fndzdx dd ? ;float
  393.         ndszdx dd ? ;float
  394.         ndtzdx dd ? ;float
  395.         zinv dd ? ;float
  396.         f_z dd ? ;float - переменная отвечающая за геометрию текстуры
  397.         s_log2 dd ? ;unsigned int
  398.         s_bound dd ? ;unsigned int
  399.         t_bound dd ? ;unsigned int
  400. include 'ztriangle.inc'
  401.