Rev 8047 | Rev 9237 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
8666 | dunkaist | 1 | ; Glass like rendering triangle by Maciej Guba. |
2 | ; http://macgub.hekko.pl, macgub3@wp.pl |
||
8047 | leency | 3 | |
4 | ROUND2 equ 10 |
||
8666 | dunkaist | 5 | glass_tri: |
6 | ;----procedure render glass like triangle with z coord -- |
||
8047 | leency | 7 | ;----interpolation ( Catmull alghoritm )----------------- |
8 | ;----I normalize normal vector in every pixel ----------- |
||
9 | ;------------------in - eax - x1 shl 16 + y1 ------------ |
||
10 | ;---------------------- ebx - x2 shl 16 + y2 ------------ |
||
11 | ;---------------------- ecx - x3 shl 16 + y3 ------------ |
||
8666 | dunkaist | 12 | ;---------------------- edx - ptr to stencil_buff ------- |
8047 | leency | 13 | ;---------------------- esi - pointer to Z-buffer filled- |
14 | ;---------------------- with dd float variables-------- |
||
15 | ;---------------------- edi - pointer to screen buffer--- |
||
16 | ;---------------------- xmm0 - 1st normal vector -------- |
||
17 | ;---------------------- xmm1 - 2cond normal vector ------ |
||
18 | ;---------------------- xmm2 - 3rd normal vector -------- |
||
19 | ;---------------------- xmm3 - normalized light vector -- |
||
20 | ;---------------------- xmm4 - lo -> hi z1, z2, z3 coords |
||
21 | ;---------------------- as dwords floats --------------- |
||
22 | ;---------------------- xmm5 - lo -> hi y_min, y_max, --- |
||
23 | ;---------------------- x_min, x_max as dword integers - |
||
24 | ;---------------------- stack - no parameters ----------- |
||
25 | ;-------------------------------------------------------- |
||
26 | ;----------------- procedure don't save registers !! ---- |
||
27 | |||
28 | |||
29 | |||
30 | |||
31 | push ebp |
||
32 | mov ebp,esp |
||
33 | sub esp,512 |
||
34 | sub ebp,16 |
||
35 | and ebp,0xfffffff0 |
||
36 | |||
37 | .1_nv equ [ebp-16] |
||
38 | .2_nv equ [ebp-32] |
||
39 | .3_nv equ [ebp-48] |
||
40 | .l_v equ [ebp-64] |
||
41 | .z3 equ [ebp-72] |
||
42 | .z2 equ [ebp-76] |
||
43 | .z1 equ [ebp-80] |
||
44 | .x1 equ [ebp-82] |
||
45 | .y1 equ [ebp-84] |
||
46 | .x2 equ [ebp-86] |
||
47 | .y2 equ [ebp-88] |
||
48 | .x3 equ [ebp-90] |
||
49 | .y3 equ [ebp-92] |
||
50 | .Zbuf equ [ebp-96] |
||
51 | .x_max equ [ebp-100] |
||
52 | .x_min equ [ebp-104] |
||
53 | .y_max equ [ebp-108] |
||
54 | .y_min equ [ebp-112] |
||
55 | .screen equ [ebp-116] |
||
56 | .dx12 equ [ebp-120] |
||
57 | .dx13 equ [ebp-124] |
||
58 | .dx23 equ [ebp-128] |
||
59 | .dn12 equ [ebp-144] |
||
60 | .dn13 equ [ebp-160] |
||
61 | .dn23 equ [ebp-176] |
||
62 | .dz12 equ [ebp-180] |
||
63 | .dz13 equ [ebp-184] |
||
64 | .dz23 equ [ebp-188] |
||
65 | |||
66 | .cnv1 equ [ebp-208] ; cur normal vectors |
||
67 | .cnv2 equ [ebp-224] |
||
68 | .cz2 equ [ebp-228] |
||
69 | .cz1 equ [ebp-232] |
||
8666 | dunkaist | 70 | .stencil_buff equ [ebp-236] |
8047 | leency | 71 | |
72 | |||
73 | |||
74 | |||
75 | .sort3: ; sort triangle coordinates... |
||
76 | cmp ax,bx |
||
77 | jle .sort1 |
||
78 | xchg eax,ebx |
||
79 | shufps xmm4,xmm4,11100001b |
||
80 | movaps xmm6,xmm0 |
||
81 | movaps xmm0,xmm1 |
||
82 | movaps xmm1,xmm6 |
||
83 | |||
84 | |||
85 | .sort1: |
||
86 | cmp bx,cx |
||
87 | jle .sort2 |
||
88 | xchg ebx,ecx |
||
89 | shufps xmm4,xmm4,11011000b |
||
90 | movaps xmm6,xmm1 |
||
91 | movaps xmm1,xmm2 |
||
92 | movaps xmm2,xmm6 |
||
93 | |||
94 | jmp .sort3 |
||
95 | |||
96 | .sort2: |
||
97 | |||
98 | movaps .z1,xmm4 |
||
99 | mov .y1,eax |
||
100 | mov .y2,ebx |
||
101 | mov .y3,ecx |
||
8666 | dunkaist | 102 | mov .stencil_buff, edx |
8047 | leency | 103 | |
104 | movdqa .y_min,xmm5 |
||
105 | if 1 ; check if at last only fragment |
||
106 | packssdw xmm5,xmm5 ; of triangle is in visable area |
||
107 | pshuflw xmm5,xmm5,11011000b |
||
108 | movdqu xmm7,.y3 |
||
109 | movdqa xmm6,xmm5 |
||
110 | pshufd xmm5,xmm5,0 ; xmm5 lo-hi -> broadcasted y_min, x_min |
||
111 | pshufd xmm6,xmm6,01010101b ;xmm6 -> brd y_max x_max |
||
112 | movdqa xmm4,xmm7 |
||
113 | pcmpgtw xmm7,xmm5 |
||
114 | pcmpgtw xmm4,xmm6 |
||
115 | pxor xmm7,xmm4 |
||
116 | pmovmskb eax,xmm7 |
||
117 | and eax,0x00aaaaaa |
||
118 | or eax,eax |
||
119 | jz .rpt_loop2_end |
||
120 | end if |
||
121 | movaps .1_nv,xmm0 |
||
122 | movaps .2_nv,xmm1 |
||
123 | movaps .3_nv,xmm2 |
||
124 | movaps .l_v,xmm3 |
||
8666 | dunkaist | 125 | ; mov .Zbuf,esi |
8047 | leency | 126 | mov .screen,edi |
127 | |||
128 | |||
129 | |||
130 | mov bx,.y2 ; calc deltas |
||
131 | sub bx,.y1 |
||
132 | jnz .rpt_dx12_make |
||
133 | |||
134 | xorps xmm7,xmm7 |
||
135 | mov dword .dx12,0 |
||
136 | mov dword .dz12,0 |
||
137 | movaps .dn12,xmm7 |
||
138 | jmp .rpt_dx12_done |
||
139 | |||
140 | .rpt_dx12_make: |
||
141 | mov ax,.x2 |
||
142 | sub ax,.x1 |
||
143 | cwde |
||
144 | movsx ebx,bx |
||
145 | shl eax,ROUND2 |
||
146 | cdq |
||
147 | idiv ebx |
||
148 | mov .dx12,eax |
||
149 | |||
150 | cvtsi2ss xmm6,ebx |
||
151 | movss xmm5,.z2 |
||
152 | subss xmm5,.z1 |
||
153 | divss xmm5,xmm6 |
||
154 | movss .dz12,xmm5 |
||
155 | |||
156 | movaps xmm0,.2_nv |
||
157 | subps xmm0,.1_nv |
||
158 | shufps xmm6,xmm6,0 |
||
159 | divps xmm0,xmm6 |
||
160 | movaps .dn12,xmm0 |
||
161 | |||
162 | |||
163 | .rpt_dx12_done: |
||
164 | |||
165 | mov bx,.y3 ; calc deltas |
||
166 | sub bx,.y1 |
||
167 | jnz .rpt_dx13_make |
||
168 | |||
169 | xorps xmm7,xmm7 |
||
170 | mov dword .dx13,0 |
||
171 | mov dword .dz13,0 |
||
172 | movaps .dn13,xmm7 |
||
173 | jmp .rpt_dx13_done |
||
174 | |||
175 | .rpt_dx13_make: |
||
176 | mov ax,.x3 |
||
177 | sub ax,.x1 |
||
178 | cwde |
||
179 | movsx ebx,bx |
||
180 | shl eax,ROUND2 |
||
181 | cdq |
||
182 | idiv ebx |
||
183 | mov .dx13,eax |
||
184 | |||
185 | cvtsi2ss xmm6,ebx |
||
186 | movss xmm5,.z3 |
||
187 | subss xmm5,.z1 |
||
188 | divss xmm5,xmm6 |
||
189 | movss .dz13,xmm5 |
||
190 | |||
191 | movaps xmm0,.3_nv |
||
192 | subps xmm0,.1_nv |
||
193 | shufps xmm6,xmm6,0 |
||
194 | divps xmm0,xmm6 |
||
195 | movaps .dn13,xmm0 |
||
196 | |||
197 | .rpt_dx13_done: |
||
198 | |||
199 | mov bx,.y3 ; calc deltas |
||
200 | sub bx,.y2 |
||
201 | jnz .rpt_dx23_make |
||
202 | |||
203 | xorps xmm7,xmm7 |
||
204 | mov dword .dx23,0 |
||
205 | mov dword .dz23,0 |
||
206 | movaps .dn23,xmm7 |
||
207 | jmp .rpt_dx23_done |
||
208 | |||
209 | .rpt_dx23_make: |
||
210 | mov ax,.x3 |
||
211 | sub ax,.x2 |
||
212 | cwde |
||
213 | movsx ebx,bx |
||
214 | shl eax,ROUND2 |
||
215 | cdq |
||
216 | idiv ebx |
||
217 | mov .dx23,eax |
||
218 | |||
219 | cvtsi2ss xmm6,ebx |
||
220 | movss xmm5,.z3 |
||
221 | subss xmm5,.z2 |
||
222 | divss xmm5,xmm6 |
||
223 | movss .dz23,xmm5 |
||
224 | |||
225 | movaps xmm0,.3_nv |
||
226 | subps xmm0,.2_nv |
||
227 | shufps xmm6,xmm6,0 |
||
228 | divps xmm0,xmm6 |
||
229 | movaps .dn23,xmm0 |
||
230 | |||
231 | .rpt_dx23_done: |
||
232 | |||
233 | |||
234 | movsx eax,word .x1 |
||
235 | shl eax,ROUND2 |
||
236 | mov ebx,eax |
||
237 | mov edx,.z1 |
||
238 | mov .cz1,edx |
||
239 | mov .cz2,edx |
||
240 | movaps xmm0,.1_nv |
||
241 | movaps .cnv1,xmm0 |
||
242 | movaps .cnv2,xmm0 |
||
243 | |||
244 | |||
245 | movsx ecx,word .y1 |
||
246 | cmp cx,.y2 |
||
247 | |||
248 | jge .rpt_loop1_end |
||
249 | |||
250 | .rpt_loop1: |
||
251 | pushad |
||
252 | |||
253 | movaps xmm2,.y_min |
||
254 | movaps xmm0,.cnv1 |
||
255 | movaps xmm1,.cnv2 |
||
256 | movlps xmm3,.cz1 |
||
257 | movaps xmm4,.l_v |
||
258 | sar ebx,ROUND2 |
||
259 | sar eax,ROUND2 |
||
8666 | dunkaist | 260 | mov edx,.stencil_buff |
8047 | leency | 261 | mov edi,.screen |
8666 | dunkaist | 262 | ; mov esi,.Zbuf |
8047 | leency | 263 | |
8666 | dunkaist | 264 | call glass_line |
8047 | leency | 265 | |
266 | popad |
||
267 | movaps xmm0,.cnv1 |
||
268 | movaps xmm1,.cnv2 |
||
269 | movss xmm2,.cz1 |
||
270 | movss xmm3,.cz2 |
||
271 | addps xmm0,.dn13 |
||
272 | addps xmm1,.dn12 |
||
273 | addss xmm2,.dz13 |
||
274 | addss xmm3,.dz12 |
||
275 | add eax,.dx13 |
||
276 | add ebx,.dx12 |
||
277 | |||
278 | movaps .cnv1,xmm0 |
||
279 | movaps .cnv2,xmm1 |
||
280 | movss .cz1,xmm2 |
||
281 | movss .cz2,xmm3 |
||
282 | |||
283 | add ecx,1 |
||
284 | cmp cx,.y2 |
||
285 | jl .rpt_loop1 |
||
286 | |||
287 | |||
288 | |||
289 | |||
290 | |||
291 | .rpt_loop1_end: |
||
292 | movsx ecx,word .y2 |
||
293 | cmp cx,.y3 |
||
294 | jge .rpt_loop2_end |
||
295 | |||
296 | movsx ebx,word .x2 ; eax - cur x1 |
||
297 | shl ebx,ROUND2 ; ebx - cur x2 |
||
298 | push dword .z2 |
||
299 | pop dword .cz2 |
||
300 | movaps xmm0,.2_nv |
||
301 | movaps .cnv2,xmm0 |
||
302 | |||
303 | |||
304 | .rpt_loop2: |
||
305 | pushad |
||
306 | |||
307 | movaps xmm2,.y_min |
||
308 | movaps xmm0,.cnv1 |
||
309 | movaps xmm1,.cnv2 |
||
310 | movlps xmm3,.cz1 |
||
311 | movaps xmm4,.l_v |
||
312 | sar ebx,ROUND2 |
||
313 | sar eax,ROUND2 |
||
8666 | dunkaist | 314 | mov edx,.stencil_buff |
8047 | leency | 315 | mov edi,.screen |
8666 | dunkaist | 316 | ; mov esi,.Zbuf |
8047 | leency | 317 | |
8666 | dunkaist | 318 | call glass_line |
8047 | leency | 319 | |
320 | popad |
||
321 | movaps xmm0,.cnv1 |
||
322 | movaps xmm1,.cnv2 |
||
323 | movss xmm2,.cz1 |
||
324 | movss xmm3,.cz2 |
||
325 | addps xmm0,.dn13 |
||
326 | addps xmm1,.dn23 |
||
327 | addss xmm2,.dz13 |
||
328 | addss xmm3,.dz23 |
||
329 | add eax,.dx13 |
||
330 | add ebx,.dx23 |
||
331 | |||
332 | movaps .cnv1,xmm0 |
||
333 | movaps .cnv2,xmm1 |
||
334 | movss .cz1,xmm2 |
||
335 | movss .cz2,xmm3 |
||
336 | |||
337 | add ecx,1 |
||
338 | cmp cx,.y3 |
||
339 | jl .rpt_loop2 |
||
340 | |||
341 | .rpt_loop2_end: |
||
342 | |||
343 | add esp,512 |
||
344 | pop ebp |
||
345 | |||
346 | ret |
||
347 | align 16 |
||
8666 | dunkaist | 348 | glass_line: |
8047 | leency | 349 | ; in: |
350 | ; xmm0 - normal vector 1 |
||
351 | ; xmm1 - normal vect 2 |
||
352 | ; xmm3 - lo -> hi z1, z2 coords as dwords floats |
||
353 | ; xmm2 - lo -> hi y_min, y_max, x_min, x_max |
||
354 | ; as dword integers |
||
355 | ; xmm4 - normalized light vector |
||
356 | ; eax - x1 |
||
357 | ; ebx - x2 |
||
358 | ; ecx - y |
||
8666 | dunkaist | 359 | ; edx - stencil buff ptr |
8047 | leency | 360 | ; edi - screen buffer |
8666 | dunkaist | 361 | ; esi - z buffer ===> not needed in glass rendering |
8047 | leency | 362 | |
363 | push ebp |
||
364 | mov ebp,esp |
||
8666 | dunkaist | 365 | sub esp,256 |
8047 | leency | 366 | sub ebp,16 |
367 | and ebp,0xfffffff0 |
||
368 | |||
369 | .n1 equ [ebp-16] |
||
370 | .n2 equ [ebp-32] |
||
371 | .lv equ [ebp-48] |
||
372 | .lx1 equ [ebp-52] |
||
373 | .lx2 equ [ebp-56] |
||
374 | .z2 equ [ebp-60] |
||
375 | .z1 equ [ebp-64] |
||
376 | .screen equ [ebp-68] |
||
377 | .zbuff equ [ebp-72] |
||
378 | .x_max equ [ebp-74] |
||
379 | .x_min equ [ebp-76] |
||
380 | .y_max equ [ebp-78] |
||
381 | .y_min equ [ebp-80] |
||
382 | .dn equ [ebp-96] |
||
383 | .dz equ [ebp-100] |
||
384 | .y equ [ebp-104] |
||
385 | .cnv equ [ebp-128] |
||
8666 | dunkaist | 386 | .col_sum_b equ [ebp-136] |
387 | .col_sum_g equ [ebp-140] |
||
388 | .col_sum_r equ [ebp-144] |
||
389 | .cur_col equ [ebp-160] |
||
390 | .stencil_buf equ [ebp-164] |
||
8047 | leency | 391 | |
392 | mov .y,ecx |
||
393 | packssdw xmm2,xmm2 |
||
394 | movq .y_min,xmm2 |
||
395 | cmp cx,.y_min |
||
396 | jl .end_rp_line |
||
397 | cmp cx,.y_max |
||
398 | jge .end_rp_line ; |
||
399 | |||
400 | cmp eax,ebx |
||
401 | je .end_rp_line |
||
402 | jl @f |
||
403 | xchg eax,ebx |
||
404 | movaps xmm7,xmm0 |
||
405 | movaps xmm0,xmm1 |
||
406 | movaps xmm1,xmm7 |
||
407 | shufps xmm3,xmm3,11100001b |
||
408 | @@: |
||
409 | |||
410 | cmp ax,.x_max |
||
411 | jge .end_rp_line |
||
412 | cmp bx,.x_min |
||
413 | jle .end_rp_line |
||
414 | movaps .lv,xmm4 |
||
415 | movaps .n1,xmm0 |
||
416 | movaps .n2,xmm1 |
||
417 | mov .lx1,eax |
||
418 | mov .lx2,ebx |
||
8666 | dunkaist | 419 | mov .stencil_buf,edx |
8047 | leency | 420 | movlps .z1,xmm3 |
421 | |||
422 | sub ebx,eax |
||
423 | cvtsi2ss xmm7,ebx |
||
424 | shufps xmm7,xmm7,0 |
||
425 | subps xmm1,xmm0 |
||
426 | divps xmm1,xmm7 |
||
427 | movaps .dn,xmm1 |
||
428 | psrldq xmm3,4 |
||
429 | subss xmm3,.z1 |
||
430 | divss xmm3,xmm7 |
||
431 | movss .dz,xmm3 |
||
432 | |||
433 | mov ebx,.lx1 |
||
434 | cmp bx,.x_min ; clipping on function4 |
||
435 | jge @f |
||
436 | movzx eax,word .x_min |
||
437 | sub eax,ebx |
||
438 | cvtsi2ss xmm7,eax |
||
439 | shufps xmm7,xmm7,0 |
||
440 | mulss xmm3,xmm7 |
||
441 | mulps xmm1,xmm7 |
||
442 | addss xmm3,.z1 |
||
443 | addps xmm1,.n1 |
||
444 | movsx eax,word .x_min |
||
445 | movss .z1,xmm3 |
||
446 | movaps .n1,xmm1 |
||
447 | mov dword .lx1,eax |
||
448 | |||
449 | @@: |
||
450 | movzx eax,word .x_max |
||
451 | cmp .lx2,eax |
||
452 | jl @f |
||
453 | mov .lx2,eax |
||
454 | @@: |
||
8666 | dunkaist | 455 | movzx eax,word[xres_var] |
8047 | leency | 456 | mul dword .y |
8666 | dunkaist | 457 | |
8047 | leency | 458 | add eax,.lx1 |
459 | shl eax,2 |
||
460 | add edi,eax |
||
8666 | dunkaist | 461 | mov ebx,eax |
462 | add ebx,.stencil_buf |
||
8047 | leency | 463 | |
8666 | dunkaist | 464 | |
8047 | leency | 465 | mov ecx,.lx2 |
466 | sub ecx,.lx1 |
||
8666 | dunkaist | 467 | |
8047 | leency | 468 | movaps xmm0,.n1 |
469 | movss xmm2,.z1 |
||
470 | align 16 |
||
471 | .ddraw: |
||
472 | movaps xmm7,xmm0 |
||
473 | mulps xmm7,xmm7 ; normalize |
||
8666 | dunkaist | 474 | andps xmm7,[zero_hgst_dd] |
8047 | leency | 475 | haddps xmm7,xmm7 |
476 | haddps xmm7,xmm7 |
||
477 | rsqrtps xmm7,xmm7 |
||
478 | mulps xmm7,xmm0 |
||
8666 | dunkaist | 479 | ; maxps xmm7,[the_zero] |
8047 | leency | 480 | movaps .cnv,xmm7 |
481 | |||
8666 | dunkaist | 482 | mov edx,lights_aligned ; lights_aligned - global variable |
483 | xorps xmm1,xmm1 ; instead global can be used .lv - light vect. |
||
484 | .again_col: |
||
485 | movaps xmm3,.cnv |
||
486 | mulps xmm3,[edx] |
||
487 | haddps xmm3,xmm3 |
||
488 | haddps xmm3,xmm3 ; xmm3 - dot pr |
||
8047 | leency | 489 | |
8666 | dunkaist | 490 | ; cmp [bump_flag],1 ; on/off temporaly |
491 | ; depend on bump button |
||
492 | ; je @f |
||
493 | ; stencil |
||
494 | movss xmm5,xmm2 |
||
495 | movss xmm6,xmm2 |
||
496 | addss xmm5,[aprox] |
||
497 | subss xmm6,[aprox] |
||
498 | cmpnltss xmm5,dword[ebx] |
||
499 | cmpnltss xmm6,dword[ebx] |
||
500 | xorps xmm5,xmm6 |
||
501 | movd eax,xmm5 |
||
502 | or eax,eax |
||
503 | jz .no_reflective |
||
504 | @@: |
||
505 | movaps xmm6,xmm3 ;xmm7 |
||
506 | mulps xmm6,xmm6 |
||
507 | mulps xmm6,xmm6 |
||
508 | mulps xmm6,xmm6 |
||
509 | mulps xmm6,xmm6 |
||
510 | mulps xmm6,xmm6 |
||
511 | mulps xmm6,[edx+48] |
||
512 | .no_reflective: |
||
513 | movaps xmm7,xmm3 |
||
514 | mulps xmm7,[edx+16] |
||
515 | addps xmm7,xmm6 |
||
516 | addps xmm7,[edx+32] |
||
517 | minps xmm7,[mask_255f] ; global |
||
8047 | leency | 518 | |
8666 | dunkaist | 519 | maxps xmm1,xmm7 |
520 | add edx,64 ; size of one light in aligned list |
||
521 | cmp edx,lights_aligned_end |
||
522 | jl .again_col |
||
523 | cvtps2dq xmm1,xmm1 |
||
524 | movd xmm6,[edi] |
||
525 | packssdw xmm1,xmm1 |
||
526 | packuswb xmm1,xmm1 |
||
527 | paddusb xmm1,xmm6 |
||
528 | movd [edi],xmm1 |
||
8047 | leency | 529 | |
530 | |||
531 | .skip: |
||
532 | add edi,4 |
||
8666 | dunkaist | 533 | add ebx,4 ; stencil_buff |
8047 | leency | 534 | addps xmm0,.dn |
535 | addss xmm2,.dz |
||
536 | sub ecx,1 |
||
537 | jnz .ddraw |
||
538 | |||
539 | .end_rp_line: |
||
8666 | dunkaist | 540 | add esp,256 |
8047 | leency | 541 | pop ebp |
542 | |||
543 | ret |