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