Rev 6388 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6506 | leency | 1 | MAX_SPHERES = 4 ;8 |
2 | MAX_LIGHTS = 6 |
||
6387 | leency | 3 | |
4 | main_loop: |
||
6506 | leency | 5 | call normalize_surface |
6387 | leency | 6 | xor eax,eax ; y |
7 | .next_line: |
||
8 | xor ebx,ebx ; x |
||
9 | |||
10 | @@: |
||
11 | push eax |
||
12 | push ebx |
||
6506 | leency | 13 | |
14 | |||
15 | |||
6387 | leency | 16 | call find_intersection |
17 | pop ebx |
||
18 | pop eax |
||
19 | add ebx,1 |
||
20 | cmp ebx,XRES |
||
21 | jnz @b |
||
22 | |||
23 | add eax,1 |
||
24 | cmp eax,YRES |
||
25 | jnz .next_line |
||
26 | |||
27 | ret |
||
28 | |||
6506 | leency | 29 | normalize_surface: |
30 | movss xmm0,[surface+8] |
||
31 | movlhps xmm0,xmm0 |
||
32 | movlps xmm0,[surface] |
||
33 | movaps xmm1,xmm0 |
||
34 | mulps xmm0,xmm0 |
||
35 | haddps xmm0,xmm0 |
||
36 | haddps xmm0,xmm0 |
||
37 | sqrtss xmm0,xmm0 |
||
38 | shufps xmm0,xmm0,0 |
||
39 | divps xmm1,xmm0 |
||
40 | movaps xmm2,xmm1 |
||
41 | pslldq xmm2,4 |
||
42 | psrldq xmm2,4 |
||
43 | movaps [surface_without_d],xmm2 |
||
44 | movlps [surface],xmm1 |
||
45 | movhlps xmm1,xmm1 |
||
46 | movss [surface+8],xmm1 |
||
6387 | leency | 47 | ret |
48 | |||
6506 | leency | 49 | find_intersection: |
6387 | leency | 50 | ; eax - y |
51 | ; ebx - x |
||
52 | push ebp |
||
53 | mov ebp,esp |
||
6506 | leency | 54 | sub esp,256 |
6387 | leency | 55 | and ebp,0xfffffff0 |
56 | .dz equ dword[ebp-8] |
||
57 | .dy equ dword[ebp-12] |
||
58 | .dx equ [ebp-16] |
||
59 | .a equ dword[ebp-20] |
||
60 | .b equ dword[ebp-24] |
||
61 | .c equ dword[ebp-28] |
||
62 | .delta equ dword[ebp-32] |
||
63 | .iy equ dword[ebp-36] |
||
64 | .ix equ [ebp-40] |
||
65 | .t1 equ [ebp-44] |
||
66 | .t2 equ [ebp-48] |
||
67 | .n equ [ebp-64] |
||
68 | .sph_xyz equ [ebp-80] |
||
69 | .one_write equ byte [ebp-81] ;tells if sth written in 'nearest' data |
||
70 | .sph_counter equ dword [ebp-85] |
||
6506 | leency | 71 | .dx_sh equ [ebp-96] |
72 | .a_sh equ [ebp-100] |
||
73 | .b_sh equ [ebp-104] |
||
74 | .c_sh equ [ebp-108] |
||
75 | .delta_sh equ [ebp-112] |
||
76 | .sph_counter_sh equ dword[ebp-116] |
||
77 | .shadow_mark equ dword [ebp-120] |
||
78 | .nearest_surface equ [ebp-144] |
||
79 | .vd equ [ebp-148] ; denominator in plane inters. equation |
||
6387 | leency | 80 | |
81 | mov .iy,eax |
||
82 | mov .ix,ebx |
||
83 | |||
84 | mov .one_write,0 |
||
6506 | leency | 85 | mov .shadow_mark,0 |
6387 | leency | 86 | xorps xmm0,xmm0 |
87 | cvtpi2ps xmm0,.ix |
||
88 | mov ecx,XRES |
||
89 | cvtsi2ss xmm2,ecx |
||
90 | shufps xmm2,xmm2,0 |
||
91 | divps xmm0,xmm2 |
||
92 | subps xmm0,[camera] |
||
93 | movaps .dx,xmm0 |
||
94 | movaps xmm1,xmm0 |
||
95 | mulps xmm1,xmm0 |
||
96 | haddps xmm1,xmm1 |
||
97 | haddps xmm1,xmm1 |
||
98 | movss .a,xmm1 |
||
99 | mov .sph_counter,0 |
||
6506 | leency | 100 | .next_sph: ; intersection with sphere |
6387 | leency | 101 | movaps xmm5,[camera] |
102 | mov edx,.sph_counter |
||
103 | shl edx,4 |
||
104 | add edx,sphere |
||
6506 | leency | 105 | subps xmm5,[edx] |
6387 | leency | 106 | mulps xmm5,[float2] |
6506 | leency | 107 | mulps xmm5,.dx |
6387 | leency | 108 | haddps xmm5,xmm5 |
109 | haddps xmm5,xmm5 |
||
110 | movss .b,xmm5 |
||
111 | |||
112 | |||
6506 | leency | 113 | movaps xmm4,[edx] |
6387 | leency | 114 | mulps xmm4,xmm4 |
115 | movaps xmm5,[camera] |
||
116 | mulps xmm5,xmm5 |
||
117 | addps xmm4,xmm5 |
||
118 | haddps xmm4,xmm4 |
||
119 | haddps xmm4,xmm4 |
||
120 | movaps xmm5,[edx] ;;[sphere] ;; [edx] |
||
121 | mulps xmm5,[camera] |
||
122 | haddps xmm5,xmm5 |
||
123 | haddps xmm5,xmm5 |
||
124 | mulss xmm5,[float2] |
||
125 | subss xmm4,xmm5 |
||
126 | mov ebx,.sph_counter |
||
127 | shl ebx,2 |
||
128 | add ebx,sph_radius |
||
129 | movss xmm5,[ebx] ;[R] ; [ebx] |
||
130 | mulss xmm5,xmm5 |
||
131 | subss xmm4,xmm5 |
||
132 | movss .c,xmm4 |
||
133 | |||
134 | movss xmm5,.b |
||
135 | mulss xmm5,xmm5 |
||
136 | mulss xmm4,.a |
||
137 | mulss xmm4,[float4] |
||
138 | subss xmm5,xmm4 |
||
139 | movss .delta,xmm5 |
||
140 | xorps xmm6,xmm6 |
||
141 | cmpnltss xmm5,xmm6 |
||
6506 | leency | 142 | movd ecx,xmm5 ; ecx = -1 => greater than 0.0 |
6387 | leency | 143 | cmp ecx,0 |
144 | jnz @f |
||
145 | jmp .next_s ; no intersection |
||
146 | |||
147 | |||
148 | @@: |
||
149 | movss xmm5,.delta |
||
150 | sqrtss xmm5,xmm5 |
||
151 | movss xmm4,xmm5 |
||
152 | subss xmm6,.b |
||
153 | movss xmm7,xmm6 |
||
154 | subss xmm6,xmm5 |
||
155 | divss xmm6,[float2] |
||
156 | divss xmm6,.a |
||
157 | movss .t1,xmm6 |
||
158 | addss xmm4,xmm7 |
||
159 | divss xmm4,[float2] |
||
160 | divss xmm4,.a |
||
161 | movss .t2,xmm4 |
||
6506 | leency | 162 | maxss xmm6,xmm4 |
6387 | leency | 163 | cmp .one_write,0 ; test if sth in 'nearest' data is written |
164 | jz @f |
||
6506 | leency | 165 | movss xmm4,xmm6 ;5 |
6387 | leency | 166 | cmpnltss xmm4,[smalest_t] |
167 | movd ecx,xmm4 |
||
168 | or ecx,ecx |
||
169 | jz .next_s |
||
170 | @@: |
||
6506 | leency | 171 | movss [smalest_t],xmm6 ;5 |
6387 | leency | 172 | movaps xmm0,[edx] |
173 | movaps [nearest_sphere],xmm0 |
||
174 | push dword[ebx] |
||
175 | pop dword[nearest_radius] |
||
6506 | leency | 176 | mov .one_write,1 ; one_write - object index -> 1 = sphere |
6387 | leency | 177 | .next_s: |
178 | add .sph_counter,1 |
||
179 | cmp .sph_counter,MAX_SPHERES |
||
180 | jnz .next_sph |
||
181 | |||
6506 | leency | 182 | if 1 |
183 | movaps xmm0,[surface_without_d] ; find with plane intersection |
||
184 | mulps xmm0,[camera] ; only one surface is computed |
||
185 | haddps xmm0,xmm0 |
||
186 | haddps xmm0,xmm0 |
||
187 | addss xmm0,[surface+12] |
||
188 | movaps xmm1,[surface_without_d] |
||
189 | mulps xmm1,.dx |
||
190 | haddps xmm1,xmm1 |
||
191 | haddps xmm1,xmm1 |
||
192 | xorps xmm2,xmm2 |
||
193 | cmpnless xmm2,xmm1 |
||
194 | movd ecx,xmm2 |
||
195 | cmp ecx,0 ;-1 |
||
196 | je .put_pixel ; denominator equal 'zero' - no intersection |
||
197 | xorps xmm2,xmm2 ; denominator > 0 -> inters. not in screen area |
||
198 | movss .vd,xmm1 ; write to memory this denom. |
||
199 | divss xmm0,xmm1 |
||
200 | subss xmm2,xmm0 |
||
201 | cmp .one_write,0 |
||
202 | jz @f |
||
203 | movss xmm0,xmm2 |
||
204 | cmpnltss xmm2,[smalest_t] |
||
205 | movd ecx,xmm2 |
||
206 | cmp ecx,0 |
||
207 | je .put_pixel |
||
208 | @@: |
||
209 | movss [smalest_t],xmm0 |
||
210 | ; test [smalest_t],0x80000000 |
||
211 | ; jz @f |
||
212 | ; and [smalest_t],0x7fffffff |
||
213 | ; @@: |
||
214 | movaps xmm2,[surface] |
||
215 | movaps .nearest_surface,xmm2 |
||
216 | mov .one_write,2 ; nearest object -> 2 = flat plane |
||
217 | |||
218 | end if |
||
219 | |||
6387 | leency | 220 | .put_pixel: |
6506 | leency | 221 | cmp .one_write,0 ; end if no intersection |
6387 | leency | 222 | je .end |
223 | |||
224 | movss xmm5,[smalest_t] |
||
225 | shufps xmm5,xmm5,0 ; calc and put pixel |
||
226 | movaps xmm6,.dx |
||
227 | mulps xmm6,xmm5 |
||
228 | movaps xmm4,[camera] |
||
6506 | leency | 229 | addps xmm4,xmm6 ; xmm4 - x,y,z on the sphere or on surface |
230 | movaps .sph_xyz,xmm4 |
||
231 | if 1 |
||
232 | cmp .one_write,2 |
||
233 | jne .shadow |
||
234 | ; movaps xmm4,.sph_xyz |
||
6387 | leency | 235 | movaps xmm7,xmm4 |
6506 | leency | 236 | lea ebx,.nearest_surface |
237 | movss xmm4,[ebx+8] |
||
238 | movlhps xmm4,xmm4 |
||
239 | movlps xmm4,[ebx] ; xmm4 - normal to surface vector |
||
240 | test dword .vd,0x80000000 |
||
241 | jz @f |
||
242 | andps xmm4,[positive_mask] ;0x7fffffff |
||
243 | @@: |
||
244 | |||
245 | jmp .calc_pix |
||
246 | |||
247 | end if |
||
248 | .shadow: |
||
249 | if 1 |
||
250 | ; to find shadow intersect: |
||
251 | ; P0 - point on sphere |
||
252 | ; P1 - light |
||
253 | ; with every other sphere in scene if any intersection occured - |
||
254 | ; - point is in shadow |
||
255 | ; next_sph_shad: |
||
256 | mov ecx,MAX_LIGHTS |
||
257 | .next_light_sh: |
||
258 | push ecx |
||
259 | shl ecx,4 |
||
260 | movaps xmm0,[ecx+light] ;xmm4 - point on nearest sphere |
||
261 | subps xmm0,xmm4 |
||
262 | movaps .dx_sh,xmm0 |
||
263 | |||
264 | mulps xmm0,xmm0 |
||
265 | haddps xmm0,xmm0 |
||
266 | haddps xmm0,xmm0 |
||
267 | movss .a_sh,xmm0 |
||
268 | |||
269 | mov .sph_counter_sh,0 |
||
270 | .next_sph_sh: ; be sure you not intersect nearest sphere with itself |
||
271 | movaps xmm5,.sph_xyz ;[light] |
||
272 | mov edx,.sph_counter_sh |
||
273 | shl edx,4 |
||
274 | add edx,sphere |
||
275 | movaps xmm7,[edx] |
||
276 | cmpeqps xmm7,[nearest_sphere] |
||
277 | movmskps ecx,xmm7 |
||
278 | and ecx,0111b |
||
279 | cmp ecx,0 |
||
280 | jne .next_s_sh |
||
281 | |||
282 | subps xmm5,[edx] ; [edx] - cur sph |
||
283 | mulps xmm5,[float2] |
||
284 | mulps xmm5,.dx_sh |
||
285 | haddps xmm5,xmm5 |
||
286 | haddps xmm5,xmm5 |
||
287 | movss .b_sh,xmm5 |
||
288 | |||
289 | movaps xmm4,[edx] |
||
290 | mulps xmm4,xmm4 |
||
291 | movaps xmm5,.sph_xyz |
||
292 | mulps xmm5,xmm5 |
||
293 | addps xmm4,xmm5 |
||
294 | haddps xmm4,xmm4 |
||
295 | haddps xmm4,xmm4 |
||
296 | movaps xmm5,.sph_xyz |
||
297 | mulps xmm5,[edx] |
||
298 | haddps xmm5,xmm5 |
||
299 | haddps xmm5,xmm5 |
||
300 | mulss xmm5,[float2] |
||
301 | subss xmm4,xmm5 |
||
302 | mov ebx,.sph_counter_sh |
||
303 | shl ebx,2 |
||
304 | add ebx,sph_radius |
||
305 | movss xmm5,[ebx] |
||
306 | mulss xmm5,xmm5 |
||
307 | subss xmm4,xmm5 |
||
308 | movss .c_sh,xmm4 |
||
309 | |||
310 | movss xmm5,.b_sh |
||
311 | mulss xmm5,xmm5 |
||
312 | mulss xmm4,.a_sh |
||
313 | mulss xmm4,[float4] |
||
314 | subss xmm5,xmm4 |
||
315 | movss .delta_sh,xmm5 |
||
316 | xorps xmm6,xmm6 |
||
317 | cmpnltss xmm5,xmm6 |
||
318 | movd ecx,xmm5 ; ecx = -1 greater than 0.0 |
||
319 | cmp ecx,0 |
||
320 | jnz @f |
||
321 | jmp .next_s_sh ; no intersection |
||
322 | @@: |
||
323 | add .shadow_mark,1 ; mark ->point in shadow |
||
324 | pop ecx |
||
325 | sub ecx,1 |
||
326 | jnz .next_light_sh |
||
327 | jmp .put_pix |
||
328 | .next_s_sh: |
||
329 | add .sph_counter_sh,1 |
||
330 | cmp .sph_counter_sh,MAX_SPHERES |
||
331 | jnz .next_sph_sh |
||
332 | pop ecx |
||
333 | sub ecx,1 |
||
334 | jnz .next_light_sh |
||
335 | |||
336 | end if |
||
337 | |||
338 | |||
339 | |||
340 | |||
341 | |||
342 | |||
343 | .put_pix: |
||
344 | movaps xmm4,.sph_xyz |
||
345 | movaps xmm7,xmm4 |
||
6387 | leency | 346 | subps xmm4,[nearest_sphere] |
347 | |||
348 | movss xmm0,[nearest_radius] |
||
349 | shufps xmm0,xmm0,0 |
||
350 | divps xmm4,xmm0 ; xmm4 - normal to surface vector |
||
6506 | leency | 351 | .calc_pix: ; normal computed |
6387 | leency | 352 | movaps xmm1,xmm4 ; copy of normal in xmm1 |
353 | xor eax,eax |
||
354 | xorps xmm3,xmm3 |
||
6506 | leency | 355 | ; movss xmm2,[light_factor] ; other model of lighting |
356 | ; shufps xmm2,xmm2,0 |
||
6387 | leency | 357 | |
358 | .next_light: |
||
359 | mov ebx,eax |
||
360 | shl ebx,4 |
||
6506 | leency | 361 | movaps xmm5,[light+ebx] |
6387 | leency | 362 | subps xmm5,xmm7 ; calc light unit vector |
363 | movaps xmm6,xmm5 |
||
364 | mulps xmm5,xmm5 |
||
365 | haddps xmm5,xmm5 |
||
366 | haddps xmm5,xmm5 |
||
367 | sqrtss xmm5,xmm5 |
||
6506 | leency | 368 | shufps xmm5,xmm5,0 |
6387 | leency | 369 | divps xmm6,xmm5 ; xmm6 - normalized light vector |
370 | ; dot_product |
||
371 | movaps xmm4,xmm1 ; xmm4 - normal to surface |
||
372 | mulps xmm4,xmm6 |
||
373 | haddps xmm4,xmm4 |
||
374 | haddps xmm4,xmm4 |
||
375 | shufps xmm4,xmm4,0 |
||
376 | mulps xmm4,[lights_color+ebx] ; xmm4 - computed col. light vector dep. |
||
6506 | leency | 377 | |
378 | ; mulps xmm4,xmm2 ; other model of lighting |
||
379 | ; addps xmm3,xmm4 |
||
380 | |||
381 | maxps xmm3,xmm4 ; will be this better ? |
||
382 | |||
6387 | leency | 383 | add eax,1 |
384 | cmp eax,MAX_LIGHTS |
||
385 | jnz .next_light |
||
386 | |||
6506 | leency | 387 | minps xmm3,[float255] |
388 | cmp .shadow_mark,0 |
||
389 | je @f |
||
390 | cvtsi2ss xmm2,.shadow_mark |
||
391 | shufps xmm2,xmm2,0 |
||
392 | mulps xmm2,[shadow_factor] |
||
393 | subps xmm3,xmm2 |
||
394 | xorps xmm0,xmm0 |
||
395 | maxps xmm3,xmm0 |
||
396 | @@: |
||
6387 | leency | 397 | |
398 | cvtps2dq xmm3,xmm3 |
||
399 | packssdw xmm3,xmm3 |
||
400 | packuswb xmm3,xmm3 |
||
6506 | leency | 401 | paddusb xmm3,[ambient_col] |
6387 | leency | 402 | |
6506 | leency | 403 | if 1 |
404 | cmp .one_write,2 |
||
405 | jne .perspective |
||
406 | movaps xmm0,xmm3 ; calc texture on plane |
||
407 | movaps xmm1,.sph_xyz |
||
408 | mov ecx,XRES |
||
409 | cvtsi2ss xmm4,ecx |
||
410 | shufps xmm4,xmm4,0 |
||
411 | mulps xmm1,xmm4 |
||
412 | cvtps2dq xmm1,xmm1 |
||
413 | movd ecx,xmm1 |
||
414 | test ecx,0x8 |
||
415 | jz @f |
||
416 | mov ecx,0xffffffff |
||
417 | jmp .next_tex_test |
||
418 | @@: |
||
419 | xor ecx,ecx |
||
420 | .next_tex_test: |
||
421 | psrldq xmm1,8 |
||
422 | movd ebx,xmm1 |
||
423 | test ebx,0x20 |
||
424 | jz @f |
||
425 | mov ebx,0xffffffff |
||
426 | jmp .set_tex |
||
427 | @@: |
||
428 | xor ebx,ebx |
||
429 | .set_tex: |
||
430 | xor ebx,ecx |
||
431 | shr ebx,28 |
||
432 | mov bh,bl |
||
433 | movd xmm7,ebx |
||
434 | paddusb xmm3,xmm7 |
||
6387 | leency | 435 | |
6506 | leency | 436 | end if |
6387 | leency | 437 | |
438 | |||
6506 | leency | 439 | .perspective: |
440 | movaps xmm0,.sph_xyz ; perspective correction |
||
441 | subps xmm0,[camera] |
||
442 | movss xmm1,[camera] |
||
443 | movss xmm2,xmm0 |
||
444 | movaps xmm4,xmm0 |
||
445 | shufps xmm4,xmm4,00000010b |
||
446 | divss xmm2,xmm4 |
||
447 | mulss xmm2,[camera+8] |
||
448 | subss xmm1,xmm2 ; xmm1 - x |
||
449 | |||
450 | movaps xmm2,xmm0 |
||
451 | shufps xmm2,xmm2,00000001b |
||
452 | movaps xmm4,xmm0 |
||
453 | shufps xmm4,xmm4,00000010b |
||
454 | divss xmm2,xmm4 |
||
455 | mulss xmm2,[camera+8] |
||
456 | movss xmm4,[camera+4] |
||
457 | subss xmm4,xmm2 ; xmm4 - y |
||
458 | |||
459 | mov ebx,XRES |
||
460 | cvtsi2ss xmm2,ebx |
||
461 | mulss xmm1,xmm2 |
||
462 | mulss xmm4,xmm2 |
||
463 | cvtss2si ecx,xmm1 |
||
464 | mov .ix,ecx |
||
465 | cvtss2si edx,xmm4 |
||
466 | mov .iy,edx |
||
467 | |||
6387 | leency | 468 | mov edi,screen |
469 | mov ecx,XRES |
||
470 | imul ecx,.iy |
||
471 | add ecx,.ix |
||
472 | lea ecx,[ecx*3] |
||
473 | add edi,ecx |
||
474 | movd [edi],xmm3 |
||
475 | .end: |
||
6506 | leency | 476 | add esp,256 |
6387 | leency | 477 | pop ebp |
478 | |||
479 | ret |
||
480 |