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