Rev 6108 | Rev 6113 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6108 | Rev 6111 | ||
---|---|---|---|
Line 32... | Line 32... | ||
32 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
32 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
33 | jl .end_0 |
33 | jl .end_0 |
34 | ;edi = pp |
34 | ;edi = pp |
35 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
35 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
36 | if TGL_FEATURE_RENDER_BITS eq 24 |
36 | if TGL_FEATURE_RENDER_BITS eq 24 |
37 | mov cl,[colorR] |
37 | mov al,[colorR] |
38 | mov ch,[colorG] |
38 | mov ah,[colorG] |
39 | mov word[edi+3*_a],cx |
39 | mov word[edi+3*_a],ax |
40 | mov cl,[colorB] |
40 | mov al,[colorB] |
41 | mov byte[edi+3*_a +2],cl |
41 | mov byte[edi+3*_a +2],al |
42 | ;else |
42 | ;else |
43 | ; pp[_a]=color; |
43 | ; pp[_a]=color; |
44 | end if |
44 | end if |
45 | .end_0: |
45 | .end_0: |
46 | mov eax,[dzdx] |
46 | mov eax,[dzdx] |
Line 67... | Line 67... | ||
67 | INTERP_Z equ 1 |
67 | INTERP_Z equ 1 |
68 | INTERP_RGB equ 1 |
68 | INTERP_RGB equ 1 |
Line 69... | Line 69... | ||
69 | 69 | ||
70 | macro DRAW_INIT |
70 | macro DRAW_INIT |
71 | { |
- | |
72 | if TGL_FEATURE_RENDER_BITS eq 16 |
- | |
73 | ; _drgbdx=((drdx / (1<<6)) << 22) & 0xFFC00000; |
- | |
74 | ; _drgbdx|=(dgdx / (1<<5)) & 0x000007FF; |
- | |
75 | ; _drgbdx|=((dbdx / (1<<7)) << 12) & 0x001FF000; |
- | |
76 | end if |
71 | { |
Line 77... | Line 72... | ||
77 | } |
72 | } |
78 | 73 | ||
79 | macro PUT_PIXEL _a |
74 | macro PUT_PIXEL _a |
Line 86... | Line 81... | ||
86 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
81 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
87 | jl .end_0 |
82 | jl .end_0 |
88 | ;edi = pp |
83 | ;edi = pp |
89 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
84 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
90 | if TGL_FEATURE_RENDER_BITS eq 24 |
85 | if TGL_FEATURE_RENDER_BITS eq 24 |
91 | mov ecx,[og1] |
86 | mov ebx,[or1] |
92 | mov eax,[or1] |
87 | mov eax,[og1] |
93 | mov cl,ah |
88 | mov al,bh |
94 | mov word[edi+3*_a],cx |
89 | mov word[edi+3*_a],ax |
95 | mov eax,[ob1] |
90 | mov eax,[ob1] |
96 | mov byte[edi+3*_a +2],ah |
91 | mov byte[edi+3*_a +2],ah |
97 | end if |
92 | end if |
98 | if TGL_FEATURE_RENDER_BITS eq 16 |
93 | ;if TGL_FEATURE_RENDER_BITS eq 32 |
99 | ; tmp=rgb & 0xF81F07E0; |
- | |
100 | ; pp[_a]=tmp | (tmp >> 16); |
- | |
101 | ;else |
- | |
102 | ; pp[_a] = RGB_TO_PIXEL(or1, og1, ob1); |
94 | ; pp[_a] = RGB_TO_PIXEL(or1, og1, ob1); |
103 | end if |
95 | ;end if |
104 | .end_0: |
96 | .end_0: |
105 | mov eax,[dzdx] |
97 | mov eax,[dzdx] |
106 | add [z],eax |
98 | add [z],eax |
107 | if TGL_FEATURE_RENDER_BITS eq 16 |
- | |
108 | ; rgb=(rgb+drgbdx) & ( ~ 0x00200800); |
- | |
109 | end if |
- | |
110 | if TGL_FEATURE_RENDER_BITS <> 16 |
- | |
111 | mov eax,[dgdx] |
99 | mov eax,[dgdx] |
112 | add [og1],eax |
100 | add [og1],eax |
113 | mov eax,[drdx] |
101 | mov eax,[drdx] |
114 | add [or1],eax |
102 | add [or1],eax |
115 | mov eax,[dbdx] |
103 | mov eax,[dbdx] |
116 | add [ob1],eax |
104 | add [ob1],eax |
117 | end if |
- | |
118 | } |
- | |
119 | - | ||
120 | macro DRAW_LINE code |
- | |
121 | { |
- | |
122 | local .cycle_0 |
- | |
123 | local .cycle_1 |
- | |
124 | if TGL_FEATURE_RENDER_BITS eq 16 |
- | |
125 | if code eq 0 |
- | |
126 | tmp dd ? ;uint |
- | |
127 | rgb dd ? ;uint |
- | |
128 | drgbdx dd ? ;uint |
- | |
129 | end if |
- | |
130 | if code eq 1 |
- | |
131 | mov eax,[x2] |
- | |
132 | sar eax,16 |
- | |
133 | sub eax,[x1] |
- | |
134 | mov [n],eax ;n = (x2 >> 16) - x1 |
- | |
135 | mov edi,[pp1] |
- | |
136 | add edi,[x1] ;pp = pp1 + x1 |
- | |
137 | mov eax,[pz1] |
- | |
138 | add eax,[x1] |
- | |
139 | mov [pz],eax ;pz = pz1 + x1 |
- | |
140 | mov eax,[z1] |
- | |
141 | mov [z],eax ;z = z1 |
- | |
142 | mov eax,[r1] |
- | |
143 | shl eax,16 |
- | |
144 | and eax,0xFFC00000 |
- | |
145 | mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000 |
- | |
146 | mov eax,[g1] |
- | |
147 | shr eax,5 |
- | |
148 | and eax,0x000007FF |
- | |
149 | or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF |
- | |
150 | mov eax,[b1] |
- | |
151 | shl eax,5 |
- | |
152 | and eax,0x001FF000 |
- | |
153 | or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000 |
- | |
154 | mov eax,[_drgbdx] |
- | |
155 | mov [drgbdx],eax ;drgbdx = _drgbdx |
- | |
156 | align 4 |
- | |
157 | .cycle_0: ;while (n>=3) |
- | |
158 | cmp dword[n],3 |
- | |
159 | jl .cycle_1 |
- | |
160 | PUT_PIXEL 0 |
- | |
161 | PUT_PIXEL 1 |
- | |
162 | PUT_PIXEL 2 |
- | |
163 | PUT_PIXEL 3 |
- | |
164 | add dword[pz],8 |
- | |
165 | add edi,4*3 |
- | |
166 | sub [n],4 |
- | |
167 | jmp .cycle_0 |
- | |
168 | .cycle_1: ;while (n>=0) |
- | |
169 | cmp dword[n],0 |
- | |
170 | jl .cycle_1_end |
- | |
171 | PUT_PIXEL 0 |
- | |
172 | add dword[pz],2 |
- | |
173 | add edi,3 |
- | |
174 | dec dword[n] |
- | |
175 | jmp .cycle_1 |
- | |
176 | .cycle_1_end: |
- | |
177 | end if |
- | |
178 | end if |
- | |
179 | } |
105 | } |
Line 180... | Line 106... | ||
180 | 106 | ||
181 | align 4 |
107 | align 4 |
182 | proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword |
108 | proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword |
183 | locals |
- | |
184 | if TGL_FEATURE_RENDER_BITS eq 16 |
- | |
185 | _drgbdx dd ? ;int |
- | |
186 | end if |
109 | locals |
Line 187... | Line 110... | ||
187 | include 'ztriangle.inc' |
110 | include 'ztriangle.inc' |
188 | 111 | ||
189 | align 4 |
112 | align 4 |
Line 317... | Line 240... | ||
317 | { |
240 | { |
318 | if TGL_FEATURE_RENDER_BITS eq 24 |
241 | if TGL_FEATURE_RENDER_BITS eq 24 |
319 | if code eq 0 |
242 | if code eq 0 |
320 | s dd ? ;uint |
243 | s dd ? ;uint |
321 | t dd ? ;uint |
244 | t dd ? ;uint |
322 | n1 dd ? ;int - длинна горизонтальной линии в пикселях |
- | |
323 | dsdx dd ? ;int |
245 | dsdx dd ? ;int |
324 | dtdx dd ? ;int |
246 | dtdx dd ? ;int |
325 | fz dd ? ;float |
247 | fz dd ? ;float |
326 | zinv dd ? ;float |
248 | zinv dd ? ;float |
327 | end if |
249 | end if |
328 | if code eq 1 |
250 | if code eq 1 |
329 | mov eax,[x2] |
251 | mov eax,[x2] |
330 | sar eax,16 |
252 | sar eax,16 |
331 | sub eax,[x1] |
253 | sub eax,[x1] |
332 | mov [n1],eax ;n1 = (x2 >> 16) - x1 |
254 | mov [n],eax ;n = (x2 >> 16) - x1 |
333 | fld1 |
255 | fld1 |
334 | fild dword[z1] |
256 | fild dword[z1] |
335 | fst dword[fz] ;fz = (float)z1 |
257 | fst dword[fz] ;fz = (float)z1 |
336 | ;fld1 |
258 | ;fld1 |
337 | fdivp |
259 | fdivp |
338 | fstp dword[zinv] ;zinv = 1.0 / fz |
260 | fstp dword[zinv] ;zinv = 1.0 / fz |
339 | mov edi,[x1] |
261 | mov edi,[x1] |
340 | imul edi,PSZB |
262 | imul edi,PSZB |
341 | add edi,[pp1] ;pp = (pp1 + x1 * PSZB) |
263 | add edi,[pp1] ;pp = (pp1 + x1 * PSZB) |
342 | mov eax,[pz1] |
264 | mov eax,[x1] |
- | 265 | shl eax,1 |
|
343 | add eax,[x1] |
266 | add eax,[pz1] |
344 | mov [pz],eax ;pz = pz1 + x1 |
267 | mov [pz],eax ;pz = pz1 + x1 |
345 | mov eax,[z1] |
268 | mov eax,[z1] |
346 | mov [z],eax ;z = z1 |
269 | mov [z],eax ;z = z1 |
347 | mov eax,[sz1] |
270 | mov eax,[sz1] |
348 | mov [s_z],eax ;sz = sz1 |
271 | mov [s_z],eax ;sz = sz1 |
349 | mov eax,[tz1] |
272 | mov eax,[tz1] |
350 | mov [t_z],eax ;tz = tz1 |
273 | mov [t_z],eax ;tz = tz1 |
351 | align 4 |
274 | align 4 |
352 | .cycle_2: ;while (n1>=(NB_INTERP-1)) |
275 | .cycle_2: ;while (n>=(NB_INTERP-1)) |
353 | cmp dword[n1],NB_INTERP-1 |
276 | cmp dword[n],NB_INTERP-1 |
354 | jl .cycle_2_end |
277 | jl .cycle_2_end |
355 | fld dword[zinv] |
278 | fld dword[zinv] |
356 | fld st0 |
279 | fld st0 |
357 | fmul dword[s_z] ;ss = (sz * zinv) |
280 | fmul dword[s_z] ;ss = (sz * zinv) |
358 | fist dword[s] ;s = (int) ss |
281 | fist dword[s] ;s = (int) ss |
Line 383... | Line 306... | ||
383 | PUT_PIXEL 5 |
306 | PUT_PIXEL 5 |
384 | PUT_PIXEL 6 |
307 | PUT_PIXEL 6 |
385 | PUT_PIXEL 7 |
308 | PUT_PIXEL 7 |
386 | add dword[pz],2*NB_INTERP ;pz += NB_INTERP |
309 | add dword[pz],2*NB_INTERP ;pz += NB_INTERP |
387 | add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB |
310 | add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB |
388 | sub dword[n1],NB_INTERP ;n1 -= NB_INTERP |
311 | sub dword[n],NB_INTERP ;n -= NB_INTERP |
389 | fld dword[ndszdx] |
312 | fld dword[ndszdx] |
390 | fadd dword[s_z] |
313 | fadd dword[s_z] |
391 | fstp dword[s_z] ;s_z += ndszdx |
314 | fstp dword[s_z] ;sz += ndszdx |
392 | fld dword[ndtzdx] |
315 | fld dword[ndtzdx] |
393 | fadd dword[t_z] |
316 | fadd dword[t_z] |
394 | fstp dword[t_z] ;tz += ndtzdx |
317 | fstp dword[t_z] ;tz += ndtzdx |
395 | jmp .cycle_2 |
318 | jmp .cycle_2 |
396 | .cycle_2_end: |
319 | .cycle_2_end: |
Line 409... | Line 332... | ||
409 | fchs |
332 | fchs |
410 | fadd dword[dtzdx] |
333 | fadd dword[dtzdx] |
411 | fmul dword[zinv] |
334 | fmul dword[zinv] |
412 | fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv ) |
335 | fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv ) |
413 | align 4 |
336 | align 4 |
414 | .cycle_3: ;while (n1>=0) |
337 | .cycle_3: ;while (n>=0) |
415 | cmp dword[n1],0 |
338 | cmp dword[n],0 |
416 | jl .cycle_3_end |
339 | jl .cycle_3_end |
417 | PUT_PIXEL 0 |
340 | PUT_PIXEL 0 |
418 | add dword[pz],2 ;pz += 1 |
341 | add dword[pz],2 ;pz += 1 |
419 | add edi,PSZB ;pp += PSZB |
342 | add edi,PSZB ;pp += PSZB |
420 | dec dword[n1] |
343 | dec dword[n] |
421 | jmp .cycle_3 |
344 | jmp .cycle_3 |
422 | .cycle_3_end: |
345 | .cycle_3_end: |
423 | end if |
346 | end if |
424 | end if |
347 | end if |
425 | } |
348 | } |
Line 464... | Line 387... | ||
464 | ;edi = pp |
387 | ;edi = pp |
465 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
388 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
466 | fild dword[z] |
389 | fild dword[z] |
467 | fld dword[s_z] |
390 | fld dword[s_z] |
468 | fdiv st0,st1 |
391 | fdiv st0,st1 |
469 | ;fistp dword[...s...] ;s = (int) (s_z / (float) z) |
392 | fistp dword[esp-4] ;s = (int) (s_z / (float) z) |
- | 393 | fld dword[t_z] |
|
- | 394 | fdiv st0,st1 |
|
470 | ; t= (int) (t_z / (float) z); |
395 | fistp dword[esp-8] ;t = (int) (t_z / (float) z) |
- | 396 | mov eax,dword[esp-8] |
|
- | 397 | and eax,0x3FC00000 |
|
- | 398 | or eax,dword[esp-4] |
|
- | 399 | shr eax,12 ;14 |
|
- | 400 | add eax,[texture] |
|
- | 401 | mov eax,[eax] |
|
471 | ; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; |
402 | stosd ;pp[_a] = texture[((t & 0x3FC00000) | s) >> 14] |
- | 403 | sub edi,4 |
|
472 | .end_0: |
404 | .end_0: |
473 | mov eax,[dzdx] |
405 | mov eax,[dzdx] |
474 | add [z],eax |
406 | add [z],eax |
475 | fld dword[dszdx] |
407 | fld dword[dszdx] |
476 | fadd dword[s_z] |
408 | fadd dword[s_z] |