Subversion Repositories Kolibri OS

Rev

Rev 6111 | Rev 6126 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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