Subversion Repositories Kolibri OS

Rev

Rev 6134 | Rev 6243 | Go to most recent revision | 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+offs_zbup_r]
  42.         mov [colorR],ah ;colorR=p2.r>>8
  43.         mov eax,[ecx+offs_zbup_g]
  44.         mov [colorG],ah ;colorG=p2.g>>8
  45.         mov eax,[ecx+offs_zbup_b]
  46.         mov [colorB],ah ;colorB=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.         mov eax,[z]
  56.         shr eax,ZB_POINT_Z_FRAC_BITS
  57.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  58.         jl .end_0
  59.                 ;edi = pp
  60.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  61. if TGL_FEATURE_RENDER_BITS eq 24
  62.                 mov al,[colorR]
  63.                 mov ah,[colorG]
  64.                 mov word[edi+3*_a],ax
  65.                 mov al,[colorB]
  66.                 mov byte[edi+3*_a +2],al
  67. ;else
  68. ;pp[_a]=color
  69. end if
  70.         .end_0:
  71.         mov eax,[dzdx]
  72.         add [z],eax
  73. }
  74.  
  75. align 16
  76. proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword
  77. locals
  78. if TGL_FEATURE_RENDER_BITS eq 24
  79.         colorR db ?
  80.         colorG db ?
  81.         colorB db ? ;unsigned char
  82. else
  83.         color dd ? ;int
  84. end if
  85. include 'ztriangle.inc'
  86.  
  87. ;
  88. ; Smooth filled triangle.
  89. ; The code below is very tricky :)
  90. ;
  91.  
  92. INTERP_Z equ 1
  93. INTERP_RGB equ 1
  94.  
  95. macro DRAW_INIT
  96. {
  97. }
  98.  
  99. macro PUT_PIXEL _a
  100. {
  101. local .end_0
  102.         mov eax,[z]
  103.         shr eax,ZB_POINT_Z_FRAC_BITS
  104.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  105.         jl .end_0
  106.                 ;edi = pp
  107.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  108. if TGL_FEATURE_RENDER_BITS eq 24
  109.                 mov ebx,[or1]
  110.                 mov eax,[og1]
  111.                 mov al,bh
  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.         mov eax,[dzdx]
  121.         add [z],eax
  122.         mov eax,[dgdx]
  123.         add [og1],eax
  124.         mov eax,[drdx]
  125.         add [or1],eax
  126.         mov eax,[dbdx]
  127.         add [ob1],eax
  128. }
  129.  
  130. align 16
  131. proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword
  132. locals
  133. include 'ztriangle.inc'
  134.  
  135. align 16
  136. proc ZB_setTexture uses eax ebx, zb:dword, texture:dword
  137.         mov eax,[zb]
  138.         mov ebx,[texture]
  139.         mov dword[eax+offs_zbuf_current_texture],ebx
  140.         ret
  141. endp
  142.  
  143. INTERP_Z equ 1
  144. INTERP_ST equ 1
  145.  
  146. macro DRAW_INIT
  147. {
  148.         mov eax,[zb]
  149.         mov eax,[eax+offs_zbuf_current_texture]
  150.         mov [texture],eax
  151. }
  152.  
  153. macro PUT_PIXEL _a
  154. {
  155. local .end_0
  156.         mov eax,[z]
  157.         shr eax,ZB_POINT_Z_FRAC_BITS
  158.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  159.         jl .end_0
  160.                 ;edi = pp
  161.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  162. if TGL_FEATURE_RENDER_BITS eq 24
  163.                 mov ebx,[t]
  164.                 and ebx,0x3fc00000
  165.                 mov eax,[s]
  166.                 and eax,0x003fc000
  167.                 or ebx,eax
  168.                 shr ebx,14
  169.                 imul ebx,3
  170.                 add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
  171.                 mov ax,word[ebx]
  172.                 mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
  173.                 mov al,byte[ebx+2]
  174.                 mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
  175. else
  176. ;pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]
  177. end if
  178.         .end_0:
  179.         mov eax,[dzdx]
  180.         add [z],eax
  181.         mov eax,[dsdx]
  182.         add [s],eax
  183.         mov eax,[dtdx]
  184.         add [t],eax
  185. }
  186.  
  187. align 16
  188. proc ZB_fillTriangleMapping, zb:dword, p0:dword, p1:dword, p2:dword
  189. locals
  190.         texture dd ? ;PIXEL*
  191. include 'ztriangle.inc'
  192.  
  193. ;
  194. ; Texture mapping with perspective correction.
  195. ; We use the gradient method to make less divisions.
  196. ; TODO: pipeline the division
  197. ;
  198. if 1
  199.  
  200. INTERP_Z equ 1
  201. INTERP_STZ equ 1
  202.  
  203. NB_INTERP equ 8
  204.  
  205. macro DRAW_INIT
  206. {
  207.         mov eax,[zb]
  208.         mov eax,[eax+offs_zbuf_current_texture]
  209.         mov [texture],eax
  210.         mov dword[esp-4],NB_INTERP
  211.         fild dword[esp-4]
  212.         fild dword[dzdx]
  213.         fst dword[fdzdx] ;fdzdx = (float)dzdx
  214.         fmul st0,st1
  215.         fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
  216.         fld dword[fdzdx]
  217.         fmul st0,st1
  218.         fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
  219.         fmul dword[dtzdx]
  220.         fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
  221. }
  222.  
  223. macro PUT_PIXEL _a
  224. {
  225. local .end_0
  226.         mov eax,[z]
  227.         shr eax,ZB_POINT_Z_FRAC_BITS
  228.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  229.         jl .end_0
  230.                 ;edi = pp
  231.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  232. if TGL_FEATURE_RENDER_BITS eq 24
  233.                 mov ebx,[t]
  234.                 and ebx,0x3fc00000
  235.                 mov eax,[s]
  236.                 and eax,0x003fc000
  237.                 or ebx,eax
  238.                 shr ebx,14
  239.                 imul ebx,3
  240.                 add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
  241.                 mov ax,word[ebx]
  242.                 mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
  243.                 mov al,byte[ebx+2]
  244.                 mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
  245. else
  246. ;       pp[_a]=*(PIXEL *)((char *)texture+
  247. ;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
  248. end if
  249.         .end_0:
  250.         mov eax,[dzdx]
  251.         add [z],eax
  252.         mov eax,[dsdx]
  253.         add [s],eax
  254.         mov eax,[dtdx]
  255.         add [t],eax
  256. }
  257.  
  258. DRAW_LINE_M equ 1
  259.  
  260. macro DRAW_LINE
  261. {
  262. if TGL_FEATURE_RENDER_BITS eq 24
  263.         mov eax,[x2]
  264.         sar eax,16
  265.         mov edi,[x1]
  266.         sub eax,edi
  267.         mov [n],eax ;n = (x2 >> 16) - x1
  268.         fld1
  269.         fild dword[z1]
  270.         fst dword[f_z] ;fz = (float)z1
  271.         fdivp
  272.         fstp dword[zinv] ;zinv = 1.0 / fz
  273.         imul edi,PSZB
  274.         add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
  275.         mov esi,[x1]
  276.         shl esi,1
  277.         add esi,[pz1] ;pz = pz1 + x1
  278.         mov eax,[z1]
  279.         mov [z],eax ;z = z1
  280.         mov eax,[sz1]
  281.         mov [s_z],eax ;sz = sz1
  282.         mov eax,[tz1]
  283.         mov [t_z],eax ;tz = tz1
  284. align 4
  285.         .cycle_2: ;while (n>=(NB_INTERP-1))
  286.         cmp dword[n],NB_INTERP-1
  287.         jl .cycle_2_end
  288.                 fld dword[zinv]
  289.                 fld st0
  290.                 fmul dword[s_z] ;ss = (sz * zinv)
  291.                 fist dword[s] ;s = (int) ss
  292.                 fmul dword[fdzdx]
  293.                 fchs
  294.                 fadd dword[dszdx]
  295.                 fmul dword[zinv]
  296.                 fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
  297.                 fmul dword[t_z] ;tt = (tz * zinv)
  298.                 fist dword[t] ;t = (int) tt
  299.                 fmul dword[fdzdx]
  300.                 fchs
  301.                 fadd dword[dtzdx]
  302.                 fmul dword[zinv]
  303.                 fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
  304.                 fld1
  305.                 fld dword[f_z]
  306.                 fadd dword[fndzdx]
  307.                 fst dword[f_z] ;fz += fndzdx
  308.                 fdivp
  309.                 fstp dword[zinv] ;zinv = 1.0 / fz
  310.                 PUT_PIXEL 0
  311.                 PUT_PIXEL 1
  312.                 PUT_PIXEL 2
  313.                 PUT_PIXEL 3
  314.                 PUT_PIXEL 4
  315.                 PUT_PIXEL 5
  316.                 PUT_PIXEL 6
  317.                 PUT_PIXEL 7
  318.                 add esi,2*NB_INTERP ;pz += NB_INTERP
  319.                 add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
  320.                 sub dword[n],NB_INTERP ;n -= NB_INTERP
  321.                 fld dword[ndszdx]
  322.                 fadd dword[s_z]
  323.                 fstp dword[s_z] ;sz += ndszdx
  324.                 fld dword[ndtzdx]
  325.                 fadd dword[t_z]
  326.                 fstp dword[t_z] ;tz += ndtzdx
  327.                 jmp .cycle_2
  328. align 4
  329.         .cycle_2_end:
  330.         fld dword[zinv]
  331.         fld st0
  332.         fmul dword[s_z] ;ss = (sz * zinv)
  333.         fist dword[s] ;s = (int) ss
  334.         fmul dword[fdzdx]
  335.         fchs
  336.         fadd dword[dszdx]
  337.         fmul dword[zinv]
  338.         fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
  339.         fmul dword[t_z] ;tt = (tz * zinv)
  340.         fist dword[t] ;t = (int) tt
  341.         fmul dword[fdzdx]
  342.         fchs
  343.         fadd dword[dtzdx]
  344.         fmul dword[zinv]
  345.         fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
  346. align 4
  347.         .cycle_3: ;while (n>=0)
  348.         cmp dword[n],0
  349.         jl .cycle_3_end
  350.                 PUT_PIXEL 0
  351.                 add esi,2 ;pz += 1
  352.                 add edi,PSZB ;pp += PSZB
  353.                 dec dword[n]
  354.                 jmp .cycle_3
  355. align 4
  356.         .cycle_3_end:
  357. end if
  358. }
  359.  
  360. align 16
  361. proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
  362. locals
  363.         texture dd ? ;PIXEL *
  364.         fdzdx dd ? ;float
  365.         fndzdx dd ? ;float
  366.         ndszdx dd ? ;float
  367.         ndtzdx dd ? ;float
  368.         zinv dd ? ;float
  369.         f_z dd ? ;float - переменная отвечающая за геометрию текстуры
  370. include 'ztriangle.inc'
  371.  
  372. end if
  373.  
  374. if 0
  375.  
  376. ; slow but exact version (only there for reference, incorrect for 24
  377. ; bits)
  378.  
  379. INTERP_Z equ 1
  380. INTERP_STZ equ 1
  381.  
  382. macro DRAW_INIT
  383. {
  384.         mov eax,[zb]
  385.         mov eax,[eax+offs_zbuf_current_texture]
  386.         mov [texture],eax
  387. }
  388.  
  389. macro PUT_PIXEL _a
  390. {
  391. local .end_0
  392.         mov eax,[z]
  393.         shr eax,ZB_POINT_Z_FRAC_BITS
  394.         cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
  395.         jl .end_0
  396.                 ;edi = pp
  397.                 mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
  398.                 fild dword[z]
  399.                 fld dword[s_z]
  400.                 fdiv st0,st1
  401.                 fistp dword[esp-4] ;s = (int) (s_z / (float) z)
  402.                 fld dword[t_z]
  403.                 fdiv st0,st1
  404.                 fistp dword[esp-8] ;t = (int) (t_z / (float) z)
  405.                 mov eax,dword[esp-8]
  406.                 and eax,0x3FC00000
  407.                 or eax,dword[esp-4]
  408.                 shr eax,12 ;14
  409.                 add eax,[texture]
  410.                 mov eax,[eax]
  411.                 stosd ;pp[_a] = texture[((t & 0x3FC00000) | s) >> 14]
  412.                 sub edi,4
  413.         .end_0:
  414.         mov eax,[dzdx]
  415.         add [z],eax
  416.         fld dword[dszdx]
  417.         fadd dword[s_z]
  418.         fstp dword[s_z]
  419.         fld dword,[dtzdx]
  420.         fadd dword[t_z]
  421.         fstp dword[t_z]
  422. }
  423.  
  424. align 16
  425. proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
  426. locals
  427.         texture dd ? ;PIXEL*
  428. include 'ztriangle.inc'
  429.  
  430. end if
  431.