Subversion Repositories Kolibri OS

Rev

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