Subversion Repositories Kolibri OS

Rev

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