Rev 8232 | Rev 8719 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1245 | hidnplayr | 1 | ;init_envmap_cub2: |
2 | ; mov esi,envmap |
||
3 | ; mov edi,envmap_cub ;take cubic env. map from |
||
4 | ; xor eax,eax ;spherical env. map |
||
5 | ; @@: |
||
6 | ; add esi,eax |
||
7 | ; movsd |
||
8 | ; dec edi |
||
9 | ; dec esi |
||
10 | ; add esi,511*3 |
||
11 | ; add eax,3 |
||
12 | ; cmp eax,511*3 |
||
13 | ; jl @b |
||
14 | ;ret |
||
8014 | leency | 15 | init_envmap_cub: ; create 512x512 env map |
1245 | hidnplayr | 16 | .temp equ word [ebp-2] |
8014 | leency | 17 | push ebp |
18 | mov ebp,esp |
||
19 | sub esp,2 |
||
20 | mov edi,envmap_cub |
||
21 | fninit |
||
1245 | hidnplayr | 22 | |
8014 | leency | 23 | mov cx,-256 |
1245 | hidnplayr | 24 | .ie_hor: |
8014 | leency | 25 | mov .temp,cx |
26 | fild .temp |
||
27 | fabs |
||
1245 | hidnplayr | 28 | ; fmul st,st0 |
29 | ; fsqrt |
||
8014 | leency | 30 | mov .temp,255 |
31 | fisubr .temp |
||
32 | fmul [env_const] |
||
33 | fistp .temp |
||
34 | mov ax,.temp |
||
1245 | hidnplayr | 35 | |
8014 | leency | 36 | or ax,ax |
37 | jge .ie_ok1 |
||
38 | xor ax,ax |
||
39 | jmp .ie_ok2 |
||
1245 | hidnplayr | 40 | .ie_ok1: |
8014 | leency | 41 | cmp ax,255 |
42 | jle .ie_ok2 |
||
43 | mov ax,255 |
||
1245 | hidnplayr | 44 | .ie_ok2: |
8014 | leency | 45 | stosb |
46 | stosb |
||
47 | stosb |
||
1245 | hidnplayr | 48 | |
8014 | leency | 49 | inc cx |
50 | cmp cx,256 |
||
51 | jne .ie_hor |
||
1245 | hidnplayr | 52 | |
8014 | leency | 53 | mov esp,ebp |
54 | pop ebp |
||
1245 | hidnplayr | 55 | ret |
56 | |||
57 | calc_one_col: |
||
58 | ; procedure don't save registers !!! |
||
59 | ; in - st - dot_product |
||
60 | ; stack - other parameters |
||
61 | ; out - eax - 0x00rrggbb |
||
8014 | leency | 62 | .dot_prd equ dword[ebp+4] ; dot product - cos x - not now |
8666 | dunkaist | 63 | .min_col_r equ [ebp+8] ; minimum color - ambient |
1245 | hidnplayr | 64 | .min_col_g equ word[ebp+10] |
65 | .min_col_b equ word[ebp+12] |
||
8666 | dunkaist | 66 | .max_col_r equ [ebp+14] ; maximum color - specular |
1245 | hidnplayr | 67 | .max_col_g equ word[ebp+16] |
68 | .max_col_b equ word[ebp+18] |
||
8666 | dunkaist | 69 | .org_col_r equ [ebp+20] ; orginal color - diffuse |
1245 | hidnplayr | 70 | .org_col_g equ word[ebp+22] |
71 | .org_col_b equ word[ebp+24] |
||
8014 | leency | 72 | .n equ word[ebp+26] ; shines - not implemented |
73 | .temp equ word[ebp-2] |
||
8666 | dunkaist | 74 | .color_sum_r equ [ebp-6] |
75 | .color_sum_g equ [ebp-10] |
||
76 | .color_sum_b equ [ebp-14] |
||
1245 | hidnplayr | 77 | ; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular |
8014 | leency | 78 | mov ebp,esp |
79 | sub esp,14 |
||
1245 | hidnplayr | 80 | |
8666 | dunkaist | 81 | |
8014 | leency | 82 | mov ax,.min_col_r |
83 | add ax,.max_col_r |
||
84 | add ax,.org_col_r |
||
85 | cwde |
||
86 | mov .color_sum_r,eax |
||
1245 | hidnplayr | 87 | |
8014 | leency | 88 | mov ax,.min_col_g |
89 | add ax,.max_col_g |
||
90 | add ax,.org_col_g |
||
91 | cwde |
||
92 | mov .color_sum_g,eax |
||
1245 | hidnplayr | 93 | |
8014 | leency | 94 | mov ax,.min_col_b |
95 | add ax,.max_col_b |
||
96 | add ax,.org_col_b |
||
97 | cwde |
||
98 | mov .color_sum_b,eax |
||
8666 | dunkaist | 99 | if 0 |
1245 | hidnplayr | 100 | |
101 | |||
8666 | dunkaist | 102 | movq xmm0,.min_col_r |
103 | movq xmm1,.max_col_r |
||
104 | movq xmm2,.org_col_r |
||
105 | packuswb xmm0,[the_zero] |
||
106 | packuswb xmm1,[the_zero] |
||
107 | packuswb xmm2,[the_zero] |
||
108 | punpcklbw xmm0,xmm1 |
||
109 | punpcklbw xmm2,[the_zero] |
||
110 | packusdw xmm2,[the_zero] |
||
111 | cvtdq2ps xmm0,xmm0 |
||
112 | cvtdq2ps xmm1,xmm1 |
||
113 | cvtdq2ps xmm2,xmm2 |
||
114 | haddps xmm0,xmm0 |
||
115 | haddps xmm1,xmm1 |
||
116 | haddps xmm2,xmm2 |
||
117 | haddps xmm0,xmm0 |
||
118 | haddps xmm1,xmm1 |
||
119 | haddps xmm2,xmm2 |
||
120 | |||
121 | cvtss2si eax,xmm0 |
||
122 | cvtss2si ebx,xmm1 |
||
123 | cvtss2si ecx,xmm2 |
||
124 | mov .color_sum_r,eax |
||
125 | mov .color_sum_g,ebx |
||
126 | mov .color_sum_b,ecx |
||
127 | |||
128 | |||
129 | end if |
||
130 | |||
1245 | hidnplayr | 131 | ; fld .dot_prd |
132 | ; fild .n |
||
133 | ; fxch st1 |
||
134 | ; fabs |
||
135 | ; fyl2x ; |
||
136 | ; f2xm1 |
||
137 | ; fld1 |
||
138 | ; faddp ; st = dot_product ^ n |
||
139 | |||
8014 | leency | 140 | fld st ; copy dot pr |
141 | fmul st,st0 |
||
142 | fmul st,st0 |
||
143 | fmul st,st0 |
||
144 | cmp .n,255 ; .n = 255 -> spot light |
||
145 | jne @f |
||
146 | fmul st,st0 |
||
147 | fmul st,st0 |
||
148 | fmul st,st0 |
||
1245 | hidnplayr | 149 | @@: |
8014 | leency | 150 | fld st ; st0=st1=dot_pr^n, st2=dot_pr |
151 | fimul .max_col_b |
||
152 | fild .org_col_b |
||
153 | fmul st,st3 |
||
154 | faddp ; st0=first piece of col, st1=dot_pr^n.. |
||
155 | fiadd .min_col_b |
||
156 | fimul .max_col_b |
||
8666 | dunkaist | 157 | fidiv dword .color_sum_b |
8014 | leency | 158 | fistp .temp |
159 | movzx eax,.temp |
||
160 | shl eax,16 |
||
1245 | hidnplayr | 161 | |
8014 | leency | 162 | fld st |
163 | fimul .max_col_g |
||
164 | fild .org_col_g |
||
165 | fmul st,st3 |
||
166 | faddp |
||
167 | fiadd .min_col_g |
||
168 | fimul .max_col_g |
||
8666 | dunkaist | 169 | fidiv dword .color_sum_g |
8014 | leency | 170 | fistp .temp |
171 | mov ax,.temp |
||
172 | mov ah,al |
||
173 | shl eax,8 |
||
1245 | hidnplayr | 174 | |
8666 | dunkaist | 175 | fimul word .max_col_r |
176 | fild word .org_col_r |
||
8014 | leency | 177 | fmulp st2,st |
178 | faddp |
||
8666 | dunkaist | 179 | fiadd word .min_col_r |
180 | fimul word .max_col_r |
||
181 | fidiv dword .color_sum_r |
||
8014 | leency | 182 | fistp .temp |
183 | mov ax,.temp ;eax - 0xbbgg00rr |
||
1245 | hidnplayr | 184 | ; mov ah,al |
8014 | leency | 185 | ror eax,16 |
186 | xchg al,ah ; eax - 0x00rrggbb |
||
187 | mov esp,ebp |
||
1245 | hidnplayr | 188 | ret 24 |
189 | |||
8014 | leency | 190 | calc_bumpmap: ; calculate random bumpmap |
1245 | hidnplayr | 191 | ;--------------in edi _ pointer to TEX_X x TEX_Y bumpmap |
192 | |||
8014 | leency | 193 | push edi |
1245 | hidnplayr | 194 | |
8014 | leency | 195 | cmp [bumps_flag],0 |
196 | je .random_bump_map |
||
197 | ; else bumps according to texture |
||
198 | mov esi,texmap |
||
199 | mov ecx,TEXTURE_SIZE |
||
1245 | hidnplayr | 200 | @@: |
8014 | leency | 201 | movzx ax,byte[esi] |
202 | movzx bx,byte[esi+1] |
||
203 | movzx dx,byte[esi+2] |
||
204 | add ax,bx |
||
205 | add ax,dx |
||
206 | cwd |
||
207 | div [i3] |
||
208 | stosb |
||
209 | add esi,3 |
||
210 | loop @b |
||
211 | jmp .blur_map |
||
1245 | hidnplayr | 212 | ; push ecx |
213 | ; mov eax,0x88888888 |
||
214 | ; mov ecx,16/4 |
||
215 | ; rep stosd |
||
216 | ; mov eax,0xffffffff |
||
217 | ; mov ecx,16/4 |
||
218 | ; rep stosd |
||
219 | ; pop ecx |
||
220 | ; loop @b |
||
221 | .random_bump_map: |
||
222 | |||
8014 | leency | 223 | mov ecx,TEXTURE_SIZE |
1245 | hidnplayr | 224 | @@: |
8014 | leency | 225 | push ecx |
226 | xor ecx,ecx |
||
227 | mov edx,255 |
||
228 | call random |
||
229 | stosb |
||
230 | pop ecx |
||
231 | loop @b |
||
1245 | hidnplayr | 232 | |
233 | .blur_map: |
||
8014 | leency | 234 | pop edi |
235 | movzx ecx,[bumps_deep_flag] |
||
236 | inc cx |
||
1245 | hidnplayr | 237 | .blur: |
8014 | leency | 238 | xor esi,esi |
239 | mov edx,TEXTURE_SIZE |
||
240 | xor eax,eax |
||
241 | xor ebx,ebx |
||
1245 | hidnplayr | 242 | @@: |
8014 | leency | 243 | mov ebp,esi |
244 | dec ebp |
||
245 | and ebp,TEXTURE_SIZE |
||
246 | mov al,byte[ebp+edi] |
||
1245 | hidnplayr | 247 | |
8014 | leency | 248 | mov ebp,esi |
249 | inc ebp |
||
250 | and ebp,TEXTURE_SIZE |
||
251 | mov bl,byte[ebp+edi] |
||
252 | add eax,ebx |
||
1245 | hidnplayr | 253 | |
8014 | leency | 254 | mov ebp,esi |
255 | sub ebp,TEX_X |
||
256 | and ebp,TEXTURE_SIZE |
||
257 | mov bl,byte[ebp+edi] |
||
258 | add eax,ebx |
||
1245 | hidnplayr | 259 | |
8014 | leency | 260 | mov ebp,esi |
261 | add ebp,TEX_X |
||
262 | and ebp,TEXTURE_SIZE |
||
263 | mov bl,byte[ebp+edi] |
||
264 | add eax,ebx |
||
1245 | hidnplayr | 265 | |
8014 | leency | 266 | shr eax,2 |
267 | mov byte[esi+edi],al |
||
1245 | hidnplayr | 268 | |
8014 | leency | 269 | inc esi |
270 | dec edx |
||
271 | jnz @b |
||
1245 | hidnplayr | 272 | |
8014 | leency | 273 | loop .blur |
1245 | hidnplayr | 274 | ret |
275 | random: |
||
276 | ; in - ecx - min |
||
277 | ; edx - max |
||
278 | ; out - eax - random number |
||
8014 | leency | 279 | mov bx,[rand_seed] |
280 | add bx,0x9248 |
||
281 | ror bx,3 |
||
282 | mov [rand_seed],bx |
||
1245 | hidnplayr | 283 | |
8014 | leency | 284 | mov ax,dx |
285 | sub ax,cx |
||
286 | mul bx |
||
287 | mov ax,dx |
||
288 | add ax,cx |
||
289 | cwde |
||
1245 | hidnplayr | 290 | ret |
291 | |||
8014 | leency | 292 | optimize_object1: ; setting point (0,0,0) in center of object |
293 | ; recalculate all coords , scale object, |
||
294 | ;the coords in <-1.0,1.0> |
||
1245 | hidnplayr | 295 | ;in : real_points - table filled of real float dd coordinates (x,y,z), end mark dd -1 |
296 | ; _ global variable |
||
297 | ; points_count_var - dw integer variable with exactly points count |
||
298 | ; - global variable |
||
299 | ; SIZE_X, SIZE_Y must be defined |
||
300 | |||
301 | .max equ dword[ebp-4] |
||
302 | .min equ dword[ebp-8] |
||
303 | .maxxx equ dword[ebp-12] |
||
304 | .center equ dword[ebp-16] |
||
305 | |||
8014 | leency | 306 | mov ebp,esp |
307 | sub esp,16 |
||
308 | fninit |
||
309 | mov .maxxx,0 |
||
310 | mov ecx,3 |
||
311 | xor ebx,ebx ; ebx - x,y,z coord in real_points list |
||
312 | .next_c: ; max/min/center x,y,z |
||
313 | mov edi,[points_ptr] ; in real_point list minimum two points |
||
314 | mov edx,[points_count_var] |
||
315 | fld dword[edi+ebx] |
||
316 | fst .max |
||
317 | fstp .min |
||
318 | add edi,12 |
||
319 | dec edx |
||
320 | .next_coord: ; next coord from real_points list |
||
321 | fld dword [edi+ebx] ; real_points -> x,y,z |
||
322 | fcom .max ; max_x,y,z |
||
323 | fstsw ax |
||
324 | sahf |
||
325 | jbe @f ; jmp less equal |
||
326 | fstp .max ; new max_x,y,z |
||
327 | jmp .end_coords |
||
1245 | hidnplayr | 328 | @@: |
8014 | leency | 329 | fcom .min ; min_x,y,z |
330 | fstsw ax |
||
331 | sahf |
||
332 | jnbe @f ; jmp greater |
||
333 | fst .min ; new min_x |
||
1245 | hidnplayr | 334 | @@: |
8014 | leency | 335 | ffree st |
1245 | hidnplayr | 336 | .end_coords: |
8014 | leency | 337 | add edi,12 |
1245 | hidnplayr | 338 | ; cmp dword[edi],-1 ; cmp with end mark |
8014 | leency | 339 | dec edx |
340 | jnz .next_coord |
||
341 | ; ok after this we found max_coord and min_coord |
||
342 | fld .max ; find center point |
||
343 | fadd .min |
||
344 | fld1 |
||
345 | fld1 |
||
346 | faddp |
||
347 | fdivp st1,st ; st0 - center coord |
||
348 | fstp .center |
||
1245 | hidnplayr | 349 | |
8014 | leency | 350 | fld .max |
351 | fsub .center ; st = .max - .center |
||
352 | fcom .maxxx ; maximum of all .max |
||
353 | fstsw ax |
||
354 | sahf |
||
355 | jbe @f ; jmp lower |
||
356 | fst .maxxx ; new maxx |
||
1245 | hidnplayr | 357 | @@: |
8014 | leency | 358 | ffree st |
359 | mov edi,[points_ptr] |
||
360 | mov edx,[points_count_var] ; substraction all coords - center point |
||
1245 | hidnplayr | 361 | @@: |
8014 | leency | 362 | fld dword[edi+ebx] |
363 | fsub .center |
||
364 | fstp dword[edi+ebx] |
||
365 | add edi,12 |
||
1245 | hidnplayr | 366 | ; cmp dword[edi],-1 |
367 | ; jne @b |
||
8014 | leency | 368 | dec edx |
369 | jnz @b |
||
1245 | hidnplayr | 370 | |
8014 | leency | 371 | add ebx,4 ; ebx - x,y,z cooficientes in list real_points |
372 | dec ecx |
||
373 | jnz .next_c |
||
1245 | hidnplayr | 374 | |
8014 | leency | 375 | fld .maxxx |
376 | mov edi,[points_ptr] ; create all coords in <-1.0,1.0> |
||
377 | mov ecx,[points_count_var] |
||
1245 | hidnplayr | 378 | @@: |
8014 | leency | 379 | fld dword[edi] |
380 | fdiv .maxxx |
||
381 | fstp dword[edi] |
||
382 | fld dword[edi+4] |
||
383 | fdiv .maxxx |
||
384 | fstp dword[edi+4] |
||
385 | fld dword[edi+8] |
||
386 | fdiv .maxxx |
||
387 | fstp dword[edi+8] |
||
388 | add edi,12 |
||
389 | loop @b |
||
1245 | hidnplayr | 390 | ; cmp dword[edi],-1 |
391 | |||
392 | ; jne @b |
||
393 | |||
8014 | leency | 394 | mov esp,ebp |
1245 | hidnplayr | 395 | ret |
396 | |||
8014 | leency | 397 | generate_object: ; generate node |
398 | .N equ 32 |
||
399 | .x equ word[ebp-2] |
||
400 | .Ndiv2 equ word[ebp-10] |
||
1245 | hidnplayr | 401 | .MthickSqr equ dword[ebp-14] ; diameter^2 |
8014 | leency | 402 | .temp equ dword[ebp-18] ; variable for x <-1;1> |
1245 | hidnplayr | 403 | .Hthick equ dword[ebp-22] |
404 | .cos_temp equ dword[ebp-26] |
||
405 | .next_const equ dword[ebp-30] |
||
8014 | leency | 406 | .a equ dword[ebp-34] |
407 | .Pi2 equ ebp-38 |
||
1245 | hidnplayr | 408 | |
409 | |||
410 | |||
8014 | leency | 411 | mov ebp,esp |
412 | sub esp,42 |
||
1245 | hidnplayr | 413 | |
8014 | leency | 414 | mov .Ndiv2,.N/2 |
1245 | hidnplayr | 415 | fninit |
416 | fldpi |
||
8014 | leency | 417 | fadd st,st |
418 | fst dword[.Pi2] |
||
419 | fidiv .Ndiv2 |
||
420 | fst .a ; .Ndiv2*.a=2Pi => .a=2pi/.Ndiv2 |
||
1245 | hidnplayr | 421 | |
8014 | leency | 422 | fld [.Mthick] ; inside diameter, (outside daiameter = 1) |
423 | fmul st,st0 |
||
424 | fstp .MthickSqr |
||
1245 | hidnplayr | 425 | fld1 |
426 | |||
8014 | leency | 427 | fsub [.Mthick] |
1245 | hidnplayr | 428 | |
8014 | leency | 429 | fst .Hthick ; Hthick = 1 - Mthick |
430 | fld st |
||
431 | fadd st,st |
||
1245 | hidnplayr | 432 | faddp |
8014 | leency | 433 | fstp .next_const ; next_const = Hthick * 3 |
1245 | hidnplayr | 434 | |
435 | |||
436 | ;init triangles list |
||
8014 | leency | 437 | mov edi,[triangles_ptr] |
1245 | hidnplayr | 438 | |
8014 | leency | 439 | xor esi,esi |
440 | xor eax,eax |
||
441 | mov ebx,.N+1 |
||
442 | mov ecx,(.N*2)+2 ;-- |
||
443 | mov edx,(.N*3)+3 ;--- |
||
444 | mov [triangles_count_var],0 |
||
1245 | hidnplayr | 445 | .again_tri: |
8014 | leency | 446 | stosd ; main wave |
447 | mov dword[edi],ebx |
||
448 | inc eax |
||
449 | add edi,4 |
||
450 | stosd |
||
451 | stosd |
||
452 | mov dword[edi],ebx |
||
453 | inc ebx |
||
454 | mov dword[edi+4],ebx |
||
1245 | hidnplayr | 455 | |
456 | |||
8014 | leency | 457 | add edi,8 |
1245 | hidnplayr | 458 | |
8014 | leency | 459 | mov dword[edi],ecx ;---- ; n2+2 ; xor ax,ax |
460 | inc ecx ; n2+3 ; mov bx,.N+1 |
||
461 | mov dword[edi+4],edx ; ; mov cx,(.N*2)+2 ;-- |
||
462 | mov dword[edi+8],ecx ; n3+3 ; mov dx,(.N*3)+3 ;--- |
||
463 | mov dword[edi+12],edx ; n3+3 ; |
||
464 | inc edx ; ; |
||
465 | mov dword[edi+16],edx ; n2+3 ; |
||
466 | mov dword[edi+20],ecx ; n3+4 |
||
467 | add edi,24 ;---- |
||
1245 | hidnplayr | 468 | |
8014 | leency | 469 | dec eax ; border of wave |
470 | dec ebx |
||
471 | dec ecx |
||
472 | dec edx |
||
1245 | hidnplayr | 473 | |
8014 | leency | 474 | stosd ; first border |
475 | inc eax |
||
476 | stosd |
||
477 | mov dword[edi],edx |
||
478 | add edi,4 |
||
1245 | hidnplayr | 479 | |
8014 | leency | 480 | mov dword[edi],edx |
481 | add edi,4 |
||
482 | stosd |
||
483 | inc edx |
||
484 | mov dword[edi],edx |
||
1245 | hidnplayr | 485 | |
8014 | leency | 486 | mov dword[edi+4],ebx ; second border |
487 | mov dword[edi+8],ecx |
||
488 | inc ebx |
||
489 | mov dword[edi+12],ebx |
||
1245 | hidnplayr | 490 | |
8014 | leency | 491 | mov dword[edi+16],ebx |
492 | mov dword[edi+20],ecx |
||
493 | inc ecx |
||
494 | mov dword[edi+24],ecx |
||
495 | add edi,28 |
||
1245 | hidnplayr | 496 | |
8014 | leency | 497 | add [triangles_count_var],8 ;10 |
498 | inc esi |
||
499 | cmp esi,.N |
||
500 | jne .again_tri |
||
1245 | hidnplayr | 501 | |
8014 | leency | 502 | add eax,((.N+1)*3)+1 |
503 | add ebx,((.N+1)*3)+1 |
||
504 | add ecx,((.N+1)*3)+1 |
||
505 | add edx,((.N+1)*3)+1 |
||
506 | xor esi,esi |
||
507 | cmp eax,(.N*13)+13 ;;;(.N*23)+23 ; ax,(.N*13)+13 |
||
1245 | hidnplayr | 508 | jl .again_tri |
509 | |||
8014 | leency | 510 | ; mov dword[edi],-1 ; <--- end mark not always in use |
1245 | hidnplayr | 511 | |
512 | ; init real points list |
||
8014 | leency | 513 | mov .x,-(.N/2) |
514 | mov edi,[points_ptr] |
||
515 | lea esi,[edi+(12*(.N+1))] |
||
516 | mov eax,[points_ptr] |
||
517 | mov ebx,eax |
||
518 | add eax,2*12*(.N+1) ;--- |
||
519 | add ebx,3*12*(.N+1) ;--- |
||
520 | mov [points_count_var],0 |
||
1245 | hidnplayr | 521 | |
522 | |||
523 | .R_P4 equ edi+(4*12*(.N+1)) |
||
524 | .R_P5 equ edi+(5*12*(.N+1)) |
||
525 | .R_P6 equ edi+(6*12*(.N+1)) |
||
526 | .R_P7 equ edi+(7*12*(.N+1)) |
||
527 | |||
528 | .R_P8 equ edi+(8*12*(.N+1)) |
||
529 | .R_P9 equ edi+(9*12*(.N+1)) |
||
530 | .R_P10 equ edi+(10*12*(.N+1)) |
||
531 | .R_P11 equ edi+(11*12*(.N+1)) |
||
532 | |||
533 | .R_P12 equ edi+(12*12*(.N+1)) |
||
534 | .R_P13 equ edi+(13*12*(.N+1)) |
||
535 | .R_P14 equ edi+(14*12*(.N+1)) |
||
536 | .R_P15 equ edi+(15*12*(.N+1)) |
||
537 | |||
538 | @@: |
||
539 | ; x coordinate |
||
8014 | leency | 540 | fild .x |
541 | fld st |
||
1245 | hidnplayr | 542 | ;; fmul .a ; st = <-2pi;2pi> when mul .a |
8014 | leency | 543 | fidiv .Ndiv2 |
544 | fst .temp ; temporary x in <-1.0;1.0> |
||
1245 | hidnplayr | 545 | |
8014 | leency | 546 | fst dword[edi] ;x coordinate of point |
547 | fst dword[esi] |
||
548 | fst dword[eax] ;-- |
||
1245 | hidnplayr | 549 | |
550 | |||
8014 | leency | 551 | fst dword[.R_P4] |
552 | fst dword[.R_P5] |
||
553 | fst dword[.R_P6] |
||
554 | fst dword[.R_P7] |
||
1245 | hidnplayr | 555 | |
8014 | leency | 556 | fst dword[.R_P8] |
557 | fst dword[.R_P9] |
||
558 | fst dword[.R_P10] |
||
559 | fst dword[.R_P11] |
||
1245 | hidnplayr | 560 | |
8014 | leency | 561 | fst dword[.R_P12] |
562 | fst dword[.R_P13] |
||
563 | fst dword[.R_P14] |
||
564 | fst dword[.R_P15] |
||
1245 | hidnplayr | 565 | |
8014 | leency | 566 | fstp dword[ebx] ;pop |
1245 | hidnplayr | 567 | ;*******y coord dword[offset + 4] |
8014 | leency | 568 | fmul .a ; st = <-2pi;2pi> |
1245 | hidnplayr | 569 | fsincos |
8014 | leency | 570 | fmul .next_const |
571 | fst dword[edi+4] ; y coordinate of point |
||
572 | fst dword[esi+4] |
||
573 | fst dword[.R_P4+4] |
||
574 | fst dword[.R_P5+4] |
||
575 | fld .Hthick |
||
1245 | hidnplayr | 576 | faddp |
8014 | leency | 577 | fst dword[.R_P6+4] |
578 | fst dword[.R_P7+4] |
||
579 | fst dword[eax+4] |
||
580 | fst dword[ebx+4] |
||
1245 | hidnplayr | 581 | |
582 | fchs |
||
8014 | leency | 583 | fst dword[.R_P10+4] |
584 | fst dword[.R_P11+4] |
||
585 | fst dword[.R_P14+4] |
||
586 | fst dword[.R_P15+4] |
||
587 | fadd .Hthick |
||
588 | fadd .Hthick |
||
589 | fst dword[.R_P8+4] |
||
590 | fst dword[.R_P9+4] |
||
591 | fst dword[.R_P12+4] |
||
592 | fstp dword[.R_P13+4] |
||
1245 | hidnplayr | 593 | |
594 | |||
8014 | leency | 595 | fmul .Hthick |
596 | fmul .next_const |
||
597 | fstp .cos_temp ; cos_temp = Hthick^2 * 3 |
||
1245 | hidnplayr | 598 | |
599 | ;***************z coord |
||
8014 | leency | 600 | fld .temp |
601 | fld st |
||
602 | fmul st,st0 ; z coords |
||
1245 | hidnplayr | 603 | fchs |
604 | fld1 |
||
605 | faddp |
||
606 | fabs |
||
607 | fsqrt |
||
608 | ; fld st |
||
609 | ; fsub |
||
8014 | leency | 610 | fld st |
611 | fsub .cos_temp |
||
612 | fst dword[esi+8] |
||
613 | fstp dword[eax+8] ;-- |
||
614 | fld st |
||
615 | fadd .cos_temp |
||
616 | fst dword[.R_P9+8] |
||
617 | fstp dword[.R_P10+8] |
||
1245 | hidnplayr | 618 | fchs |
8014 | leency | 619 | fld st |
620 | fsub .cos_temp |
||
621 | fst dword[.R_P6+8] |
||
622 | fstp dword[.R_P5+8] |
||
623 | fadd .cos_temp |
||
624 | fst dword[.R_P13+8] |
||
625 | fstp dword[.R_P14+8] |
||
1245 | hidnplayr | 626 | |
8014 | leency | 627 | fmul [.Mthick] |
628 | fmul st,st0 |
||
1245 | hidnplayr | 629 | fchs |
8014 | leency | 630 | fld .MthickSqr |
1245 | hidnplayr | 631 | faddp |
632 | fabs |
||
633 | fsqrt |
||
8014 | leency | 634 | fld st |
635 | fsub .cos_temp |
||
636 | fst dword[edi+8] ; z coordinate |
||
637 | fstp dword[ebx+8] ;-- |
||
638 | fld st |
||
639 | fadd .cos_temp |
||
640 | fst dword[.R_P8+8] |
||
641 | fstp dword[.R_P11+8] |
||
1245 | hidnplayr | 642 | fchs |
8014 | leency | 643 | fld st |
644 | fsub .cos_temp |
||
645 | fst dword[.R_P7+8] |
||
646 | fstp dword[.R_P4+8] |
||
647 | fadd .cos_temp |
||
648 | fst dword[.R_P12+8] |
||
649 | fstp dword[.R_P15+8] |
||
1245 | hidnplayr | 650 | |
8014 | leency | 651 | add edi,12 |
652 | add esi,12 |
||
653 | add eax,12 ;-- |
||
654 | add ebx,12 ;--- |
||
655 | add [points_count_var],24 ;16 |
||
656 | inc .x |
||
657 | cmp .x,.N/2 |
||
658 | jng @b |
||
1245 | hidnplayr | 659 | ; mov dword[esi],-1 ; <-- end mark |
8014 | leency | 660 | mov [culling_flag],0 |
1245 | hidnplayr | 661 | mov esp,ebp |
662 | ret |
||
663 | .Mthick dd 0.85 ; size-thickness |
||
664 | |||
665 | make_random_lights: |
||
666 | .temp1 equ ebp-4 |
||
8014 | leency | 667 | .temp2 equ ebp-8 ; - light vector generate variables |
1245 | hidnplayr | 668 | .temp3 equ ebp-12 |
669 | .max equ 800 |
||
8014 | leency | 670 | RDTSC |
671 | mov [rand_seed],ax |
||
672 | push ebp |
||
673 | mov ebp,esp |
||
674 | sub esp,12 |
||
675 | mov edi,lights |
||
676 | fninit |
||
677 | mov dword[.temp2],.max |
||
678 | mov dword[.temp3],.max/2 |
||
1245 | hidnplayr | 679 | |
680 | .again: |
||
8014 | leency | 681 | xor esi,esi |
1245 | hidnplayr | 682 | @@: |
8014 | leency | 683 | mov edx,.max |
684 | xor ecx,ecx |
||
685 | call random |
||
686 | sub eax,.max/2 |
||
687 | mov dword[.temp1],eax |
||
688 | fild dword[.temp1] |
||
689 | fidiv dword[.temp3] |
||
690 | fstp dword[edi+esi*4] |
||
691 | inc esi |
||
692 | cmp esi,2 |
||
693 | jne @b |
||
1245 | hidnplayr | 694 | |
695 | .max1 equ 1000 |
||
8014 | leency | 696 | mov dword[.temp2],.max1/2 |
697 | mov edx,.max1 |
||
698 | xor ecx,ecx |
||
699 | call random |
||
700 | mov dword[.temp1],eax |
||
701 | fild dword[.temp1] |
||
702 | fchs |
||
703 | fidiv dword[.temp2] |
||
704 | fstp dword[edi+8] |
||
1245 | hidnplayr | 705 | |
8014 | leency | 706 | xor esi,esi |
1245 | hidnplayr | 707 | @@: |
8014 | leency | 708 | mov ecx,220 ; max colors and shine , ecx = 200 - more bright shading |
709 | mov edx,255 |
||
710 | call random |
||
711 | mov byte[edi+18+esi],al |
||
712 | inc esi |
||
713 | cmp esi,4 |
||
714 | jne @b |
||
1245 | hidnplayr | 715 | |
716 | |||
8014 | leency | 717 | xor esi,esi |
1245 | hidnplayr | 718 | @@: |
8014 | leency | 719 | mov ecx,100 ; orginal colors |
720 | movzx edx,byte[edi+18+esi] |
||
721 | call random |
||
722 | mov byte[edi+12+esi],al |
||
723 | inc esi |
||
724 | cmp esi,3 |
||
725 | jne @b |
||
1245 | hidnplayr | 726 | |
8014 | leency | 727 | xor esi,esi |
1245 | hidnplayr | 728 | @@: |
8014 | leency | 729 | mov ecx,1 ; min cols |
730 | movzx edx,byte[edi+12+esi] |
||
731 | call random |
||
732 | mov byte[edi+15+esi],al |
||
733 | inc esi |
||
734 | cmp esi,3 |
||
735 | jne @b |
||
1245 | hidnplayr | 736 | |
8014 | leency | 737 | add edi,LIGHT_SIZE ;22 |
738 | cmp edi,lightsend ; see file View3ds,asm |
||
739 | jne .again |
||
1245 | hidnplayr | 740 | |
8014 | leency | 741 | mov esp,ebp |
742 | pop ebp |
||
1245 | hidnplayr | 743 | ret |
744 | |||
745 | generate_texture2: |
||
746 | .const equ 32 |
||
8014 | leency | 747 | mov edi,texmap |
748 | xor bx,bx |
||
1245 | hidnplayr | 749 | .next_line: |
8014 | leency | 750 | xor dx,dx |
1245 | hidnplayr | 751 | .next2stripes: |
8014 | leency | 752 | mov eax,-1 |
753 | mov ecx,(TEX_X/.const)*3/4 |
||
754 | rep stosd |
||
755 | mov eax,0x00ff0000 |
||
756 | mov ecx,(TEX_X/.const) |
||
1245 | hidnplayr | 757 | @@: |
8014 | leency | 758 | stosd |
759 | dec edi |
||
760 | loop @b |
||
761 | inc dx |
||
762 | cmp dx,.const/2 |
||
763 | jl .next2stripes |
||
764 | inc bx |
||
765 | cmp bx,TEX_Y |
||
766 | jl .next_line |
||
1245 | hidnplayr | 767 | ret |
768 | |||
8014 | leency | 769 | blur_screen: ;blur n times ; blur or fire |
1245 | hidnplayr | 770 | ;in - ecx times count |
771 | ;.counter equ dword[esp-4] |
||
772 | .counter1 equ dword[esp-8] |
||
1979 | yogev_ezra | 773 | if Ext>=SSE2 |
8014 | leency | 774 | push ebp |
775 | mov ebp,esp |
||
776 | push dword 0x01010101 |
||
777 | movss xmm5,[esp] |
||
778 | shufps xmm5,xmm5,0 |
||
1979 | yogev_ezra | 779 | .again_blur: |
8014 | leency | 780 | push ecx |
781 | mov edi,[screen_ptr] |
||
782 | movzx ecx,word[size_x_var] ;SIZE_X*3/4 |
||
8047 | leency | 783 | |
784 | cmp [dr_flag],12 |
||
8232 | leency | 785 | jge @f |
8014 | leency | 786 | lea ecx,[ecx*3+1] |
787 | shr ecx,2 |
||
8047 | leency | 788 | @@: |
6648 | leency | 789 | |
8014 | leency | 790 | xor eax,eax |
791 | rep stosd |
||
6619 | leency | 792 | if 1 |
8014 | leency | 793 | movzx ebx,word[size_x_var] |
794 | movzx ecx,word[size_y_var] |
||
795 | sub ecx,3 |
||
796 | imul ecx,ebx |
||
8047 | leency | 797 | cmp [dr_flag],12 ; 32 bit per pix cause |
8232 | leency | 798 | jge @f |
8014 | leency | 799 | lea ecx,[ecx*3] |
800 | shr ecx,4 |
||
8047 | leency | 801 | lea ebx,[ebx *3] |
802 | jmp .blr |
||
803 | @@: |
||
804 | |||
805 | shr ecx,2 |
||
806 | shl ebx,2 |
||
6619 | leency | 807 | ; mov ecx,(SIZE_X*(SIZE_Y-3))*3/16 |
1979 | yogev_ezra | 808 | .blr: |
809 | @@: |
||
8014 | leency | 810 | push ecx |
811 | movups xmm0,[edi+ebx] |
||
812 | mov ecx,edi |
||
813 | sub ecx,ebx |
||
814 | movups xmm1,[ecx] |
||
8047 | leency | 815 | cmp [dr_flag],12 |
8232 | leency | 816 | jge @f |
8014 | leency | 817 | movups xmm2,[edi-3] |
818 | movups xmm3,[edi+3] |
||
8047 | leency | 819 | jmp .f |
820 | @@: |
||
821 | movups xmm2,[edi-4] |
||
822 | movups xmm3,[edi+4] |
||
823 | .f: |
||
8014 | leency | 824 | pavgb xmm0,xmm1 |
825 | pavgb xmm2,xmm3 |
||
826 | pavgb xmm0,xmm2 |
||
827 | psubusb xmm0,xmm5 ; importand if fire |
||
828 | movups [edi],xmm0 |
||
829 | add edi,16 |
||
830 | add esi,16 |
||
831 | pop ecx |
||
832 | loop .blr |
||
6619 | leency | 833 | end if |
8014 | leency | 834 | xor eax,eax |
835 | movzx ecx,word[size_x_var] |
||
8047 | leency | 836 | cmp [dr_flag],12 |
8232 | leency | 837 | jge @f |
8014 | leency | 838 | lea ecx,[ecx*3] |
839 | shr ecx,2 |
||
8047 | leency | 840 | @@: |
6619 | leency | 841 | ; mov ecx,SIZE_X*3/4 |
8014 | leency | 842 | rep stosd |
843 | pop ecx |
||
8047 | leency | 844 | dec ecx |
845 | jnz .again_blur |
||
8014 | leency | 846 | mov esp,ebp |
847 | pop ebp |
||
1979 | yogev_ezra | 848 | end if |
849 | |||
850 | if Ext=SSE |
||
8014 | leency | 851 | emms |
852 | push ebp |
||
853 | mov ebp,esp |
||
854 | push dword 0x01010101 |
||
855 | push dword 0x01010101 |
||
856 | movq mm4,[esp] |
||
1979 | yogev_ezra | 857 | .again_blur: |
8014 | leency | 858 | push ecx |
859 | mov edi,[screen_ptr] |
||
860 | movzx ecx,word[size_x_var] ;SIZE_X*3/4 |
||
861 | lea ecx,[ecx*3] |
||
862 | shr ecx,2 |
||
1979 | yogev_ezra | 863 | ; pxor mm5,mm5 |
8014 | leency | 864 | xor eax,eax |
865 | rep stosd |
||
866 | movzx ebx,word[size_x_var] |
||
867 | movzx ecx,word[size_y_var] |
||
868 | sub ecx,3 |
||
869 | imul ecx,ebx |
||
870 | lea ecx,[ecx*3] |
||
871 | shr ecx,3 |
||
872 | lea ebx,[ebx*3] |
||
6619 | leency | 873 | ; mov ecx,(SIZE_X*(SIZE_Y-3))*3/8 |
1979 | yogev_ezra | 874 | .blr: |
875 | @@: |
||
8014 | leency | 876 | movq mm0,[edi+ebx] |
877 | movq mm1,[edi-ebx] |
||
878 | movq mm2,[edi-3] |
||
879 | movq mm3,[edi+3] |
||
1979 | yogev_ezra | 880 | |
8014 | leency | 881 | pavgb mm0,mm1 |
882 | pavgb mm2,mm3 |
||
883 | pavgb mm0,mm2 |
||
1979 | yogev_ezra | 884 | |
8014 | leency | 885 | psubusb mm0,mm4 ; importand if fire |
1979 | yogev_ezra | 886 | |
8014 | leency | 887 | movq [edi],mm0 |
888 | add edi,8 |
||
889 | add esi,8 |
||
1979 | yogev_ezra | 890 | |
8014 | leency | 891 | loop .blr |
892 | |||
893 | xor eax,eax |
||
894 | mov ecx,[size_x_var] |
||
895 | lea ecx,[ecx*3] |
||
896 | shr ecx,2 |
||
6619 | leency | 897 | ; SIZE_X*3/4 |
8014 | leency | 898 | rep stosd |
899 | pop ecx |
||
900 | loop .again_blur |
||
901 | mov esp,ebp |
||
902 | pop ebp |
||
1979 | yogev_ezra | 903 | end if |
904 | |||
905 | if Ext=MMX |
||
8014 | leency | 906 | emms |
907 | push ebp |
||
908 | mov ebp,esp |
||
909 | push dword 0x0 |
||
910 | push dword 0x01010101 |
||
1245 | hidnplayr | 911 | .again_blur: |
8014 | leency | 912 | push ecx |
913 | mov edi,[screen_ptr] |
||
914 | mov ecx,SIZE_X*3/4 |
||
915 | pxor mm5,mm5 |
||
916 | xor eax,eax |
||
917 | rep stosd |
||
1245 | hidnplayr | 918 | |
8014 | leency | 919 | mov ecx,(SIZE_X*(SIZE_Y-3))*3/4 |
1245 | hidnplayr | 920 | .blr: |
921 | @@: |
||
922 | |||
8014 | leency | 923 | movd mm0,[edi+SIZE_X*3] |
924 | movd mm1,[edi-SIZE_X*3] |
||
925 | movd mm2,[edi-3] |
||
926 | movd mm3,[edi+3] |
||
1245 | hidnplayr | 927 | |
8014 | leency | 928 | punpcklbw mm0,mm5 |
929 | punpcklbw mm1,mm5 |
||
930 | punpcklbw mm2,mm5 |
||
931 | punpcklbw mm3,mm5 |
||
932 | paddw mm0,mm1 |
||
933 | paddw mm0,mm2 |
||
934 | paddw mm0,mm3 |
||
935 | psrlw mm0,2 |
||
1245 | hidnplayr | 936 | |
8014 | leency | 937 | packuswb mm0,mm5 |
938 | psubusb mm0,qword[esp] ; importand if fire |
||
939 | movd eax,mm0 |
||
940 | stosd |
||
1245 | hidnplayr | 941 | |
8014 | leency | 942 | loop .blr |
1245 | hidnplayr | 943 | |
8014 | leency | 944 | xor eax,eax |
945 | mov ecx,SIZE_X*3/4 |
||
946 | rep stosd |
||
947 | pop ecx |
||
948 | loop .again_blur |
||
949 | mov esp,ebp |
||
950 | pop ebp |
||
1245 | hidnplayr | 951 | end if |
952 | if Ext=NON |
||
953 | .blur: |
||
8014 | leency | 954 | push ecx |
955 | xor ecx,ecx |
||
1245 | hidnplayr | 956 | .next_col_coof: |
8014 | leency | 957 | xor esi,esi |
958 | xor eax,eax |
||
959 | xor ebx,ebx |
||
960 | mov edi,SIZE_X*SIZE_Y |
||
1245 | hidnplayr | 961 | .next: |
8014 | leency | 962 | mov ebp,esi |
963 | dec ebp |
||
1245 | hidnplayr | 964 | |
8014 | leency | 965 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
966 | jl @f |
||
967 | mov ebp,SIZE_X*SIZE_Y-1 |
||
1245 | hidnplayr | 968 | @@: |
8014 | leency | 969 | or ebp,ebp |
970 | jg @f |
||
971 | xor ebp,ebp |
||
1245 | hidnplayr | 972 | @@: |
8014 | leency | 973 | lea edx,[ebp*3+screen] |
974 | mov al,byte[edx+ecx] |
||
1245 | hidnplayr | 975 | |
8014 | leency | 976 | mov ebp,esi |
977 | inc ebp |
||
978 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
||
979 | jl @f |
||
980 | mov ebp,SIZE_X*SIZE_Y-1 |
||
1245 | hidnplayr | 981 | @@: |
8014 | leency | 982 | or ebp,ebp |
983 | jg @f |
||
984 | xor ebp,ebp |
||
1245 | hidnplayr | 985 | @@: |
8014 | leency | 986 | lea edx,[ebp*3+screen] |
987 | mov bl,byte[edx+ecx] |
||
988 | add eax,ebx |
||
1245 | hidnplayr | 989 | |
8014 | leency | 990 | mov ebp,esi |
991 | sub ebp,SIZE_X |
||
992 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
||
993 | jl @f |
||
994 | mov ebp,SIZE_X*SIZE_Y-1 |
||
1245 | hidnplayr | 995 | @@: |
8014 | leency | 996 | or ebp,ebp |
997 | jg @f |
||
998 | xor ebp,ebp |
||
1245 | hidnplayr | 999 | @@: |
8014 | leency | 1000 | lea edx,[ebp*3+screen] |
1001 | mov bl,byte[edx+ecx] |
||
1002 | add eax,ebx |
||
1245 | hidnplayr | 1003 | |
8014 | leency | 1004 | mov ebp,esi |
1005 | add ebp,SIZE_X |
||
1006 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
||
1007 | jl @f |
||
1008 | mov ebp,SIZE_X*SIZE_Y-1 |
||
1245 | hidnplayr | 1009 | @@: |
8014 | leency | 1010 | or ebp,ebp |
1011 | jg @f |
||
1012 | xor ebp,ebp |
||
1245 | hidnplayr | 1013 | @@: |
8014 | leency | 1014 | lea edx,[ebp*3+screen] |
1015 | mov bl,byte[edx+ecx] |
||
1016 | add eax,ebx |
||
1245 | hidnplayr | 1017 | |
8014 | leency | 1018 | shr eax,2 |
1019 | lea edx,[esi*3+screen] |
||
1020 | or al,al |
||
1021 | jz @f |
||
1022 | dec al ; not importand if fire |
||
1023 | mov byte[edx+ecx],al |
||
1245 | hidnplayr | 1024 | @@: |
1025 | |||
8014 | leency | 1026 | inc esi |
1027 | dec edi |
||
1028 | jnz .next |
||
1245 | hidnplayr | 1029 | |
8014 | leency | 1030 | inc ecx |
1031 | cmp ecx,3 |
||
1032 | jne .next_col_coof |
||
1033 | pop ecx |
||
1034 | dec ecx |
||
1035 | jnz .blur |
||
1245 | hidnplayr | 1036 | end if |
1037 | ret |
||
1038 | |||
8014 | leency | 1039 | mirror: ; mirror effect - loseless operation |
1245 | hidnplayr | 1040 | ; in ah - button id = 11, 12, 13 |
8014 | leency | 1041 | mov edi,[points_ptr] ; one real point - triple float |
1042 | mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z |
||
1043 | fninit |
||
1044 | mov ecx,[points_count_var] |
||
1245 | hidnplayr | 1045 | |
8014 | leency | 1046 | cmp ah,11 |
1047 | je @f |
||
1048 | cmp ah,12 |
||
1049 | je .yn |
||
1050 | cmp ah,13 |
||
1051 | je .zn |
||
1245 | hidnplayr | 1052 | |
8014 | leency | 1053 | @@: ; neg x |
1054 | fld dword[edi] ;x |
||
1055 | fchs |
||
1056 | fstp dword[edi] ;x |
||
1057 | fld dword[esi] |
||
1058 | fchs |
||
1059 | fstp dword[esi] |
||
1060 | add edi,12 |
||
1061 | add esi,12 |
||
1062 | loop @b |
||
1063 | ret |
||
1245 | hidnplayr | 1064 | .yn: |
8014 | leency | 1065 | fld dword[edi+4] ;y |
1066 | fchs |
||
1067 | fstp dword[edi+4] ;y |
||
1068 | fld dword[esi+4] |
||
1069 | fchs |
||
1070 | fstp dword[esi+4] |
||
1245 | hidnplayr | 1071 | |
8014 | leency | 1072 | add edi,12 |
1073 | add esi,12 |
||
1074 | loop .yn |
||
1075 | ret |
||
1245 | hidnplayr | 1076 | .zn: |
8014 | leency | 1077 | fld dword[edi+8] ;z |
1078 | fchs |
||
1079 | fstp dword[edi+8] ;z |
||
1080 | fld dword[esi+8] |
||
1081 | fchs |
||
1082 | fstp dword[esi+8] |
||
1245 | hidnplayr | 1083 | |
8014 | leency | 1084 | add edi,12 |
1085 | add esi,12 |
||
1086 | loop .zn |
||
1245 | hidnplayr | 1087 | ret |
1088 | |||
8014 | leency | 1089 | exchange: ; exchange some coords - loseless operation |
1090 | mov edi,[points_ptr] ; one real point - triple float |
||
1091 | mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z |
||
1092 | fninit ; exchange both points and normal vactors coords/coofics |
||
1093 | mov ecx,[points_count_var] |
||
1245 | hidnplayr | 1094 | |
8014 | leency | 1095 | cmp [xchg_flag],1 |
1096 | je @f |
||
1097 | cmp [xchg_flag],2 |
||
1098 | je .zx |
||
1099 | cmp [xchg_flag],3 |
||
1100 | je .yz |
||
1245 | hidnplayr | 1101 | @@: |
8014 | leency | 1102 | fld dword[edi] ;x |
1103 | fld dword[edi+4] ;y |
||
1104 | fstp dword[edi] ;x |
||
1105 | fstp dword[edi+4] ;y |
||
1106 | fld dword[esi] ;x |
||
1107 | fld dword[esi+4] ;y |
||
1108 | fstp dword[esi] ;x |
||
1109 | fstp dword[esi+4] ;y |
||
1245 | hidnplayr | 1110 | |
8014 | leency | 1111 | add esi,12 |
1112 | add edi,12 |
||
1113 | loop @b |
||
1114 | ret |
||
1245 | hidnplayr | 1115 | .zx: |
8014 | leency | 1116 | fld dword[edi] ;x |
1117 | fld dword[edi+8] ;z |
||
1118 | fstp dword[edi] ;x |
||
1119 | fstp dword[edi+8] ;z |
||
1120 | fld dword[esi] ;x |
||
1121 | fld dword[esi+8] ;y |
||
1122 | fstp dword[esi] ;x |
||
1123 | fstp dword[esi+8] ;y |
||
1245 | hidnplayr | 1124 | |
8014 | leency | 1125 | add esi,12 |
1126 | add edi,12 |
||
1127 | loop .zx |
||
1128 | ret |
||
1245 | hidnplayr | 1129 | .yz: |
8014 | leency | 1130 | fld dword[edi+8] ;z |
1131 | fld dword[edi+4] ;y |
||
1132 | fstp dword[edi+8] ;z |
||
1133 | fstp dword[edi+4] ;y |
||
1134 | fld dword[esi+8] ;x |
||
1135 | fld dword[esi+4] ;y |
||
1136 | fstp dword[esi+8] ;x |
||
1137 | fstp dword[esi+4] ;y |
||
1245 | hidnplayr | 1138 | |
8014 | leency | 1139 | add edi,12 |
1140 | add esi,12 |
||
1141 | loop .yz |
||
1245 | hidnplayr | 1142 | ret |
1143 | |||
1144 | ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented/////////////////////////////// |
||
1145 | if 0 |
||
8014 | leency | 1146 | calc_attenuation_light: ;; calculate point to spot_light distance |
1245 | hidnplayr | 1147 | ; spot light with attenuation ;; and vector, normalize vector, |
8014 | leency | 1148 | ;; calc dot_pr and unlinear color according |
1149 | ;; to dot_product, write to color buff |
||
1150 | .distance equ dword[ebp-4] ;; color buff in bumpmap for save the mem |
||
1245 | hidnplayr | 1151 | .temp_col equ word[ebp-6] |
1152 | .vector equ [ebp-20] |
||
1153 | .spot_light_ptr equ dword [ebp-24] |
||
8014 | leency | 1154 | mov ebp,esp |
1155 | sub esp,24 |
||
1156 | mov edi,rotated_points_r ;points_rotated |
||
1157 | mov edx,point_normals_rotated |
||
1158 | mov ecx,bumpmap ; mem area with temp points color list |
||
1159 | xor ax,ax ; counter |
||
1160 | mov esi,spot_light_params |
||
1161 | mov .spot_light_ptr,esi |
||
1245 | hidnplayr | 1162 | .again_color: |
8014 | leency | 1163 | push eax |
1164 | lea ebx,.vector |
||
1165 | mov esi,.spot_light_ptr ; calc vector fom light to every point |
||
1166 | call make_vector_r |
||
1167 | ; ebx - ptr to result vector |
||
1168 | fld dword [ebx] |
||
1169 | fmul st, st |
||
1170 | fld dword [ebx+4] |
||
1171 | fmul st, st |
||
1172 | fld dword [ebx+8] |
||
1173 | fmul st, st |
||
1174 | faddp st1, st |
||
1175 | faddp st1, st |
||
1176 | fsqrt |
||
1177 | fstp .distance |
||
1178 | push edi |
||
1179 | mov edi,ebx |
||
1180 | call normalize_vector |
||
1181 | ; edi - normalized distance vector |
||
1182 | mov esi,edx |
||
1183 | call dot_product ; esi first vector, edi second vector |
||
1184 | ; st0 - dot product |
||
1185 | fabs ; why not ? - think about it |
||
1186 | pop edi |
||
1187 | fldz |
||
1188 | fcomip st1 |
||
1189 | jbe @f ; st1>0 |
||
1190 | mov dword[ecx],0 |
||
1191 | mov word[ecx+4],0 |
||
1192 | add ecx,6 |
||
1193 | ffree st0 |
||
1194 | jmp .update_counters |
||
1245 | hidnplayr | 1195 | @@: |
1196 | ; pop edi |
||
1197 | |||
8014 | leency | 1198 | ; calc color(with atenuation), write to buff |
1199 | ; buff - color of points list |
||
1200 | ; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular |
||
1245 | hidnplayr | 1201 | |
8014 | leency | 1202 | push edx |
1203 | push edi |
||
1245 | hidnplayr | 1204 | |
8014 | leency | 1205 | push ecx |
1206 | push ebp |
||
1245 | hidnplayr | 1207 | |
1208 | ; mov eax,spot_light_params |
||
8014 | leency | 1209 | mov eax,.spot_light_ptr |
1210 | movzx dx,byte[eax+15] |
||
1211 | push dx ; shines |
||
1212 | movzx dx,byte[eax+8] ; b |
||
1213 | push dx ; orginal col |
||
1214 | movzx dx,byte[eax+7] ; g |
||
1215 | push dx |
||
1216 | movzx dx,byte[eax+6] ; r |
||
1217 | push dx |
||
1218 | movzx dx,byte[eax+14] ; max col |
||
1219 | push dx |
||
1220 | movzx dx,byte[eax+13] |
||
1221 | push dx |
||
1222 | movzx dx,byte[eax+12] |
||
1223 | push dx |
||
1224 | movzx dx,byte[eax+11] ; min col |
||
1225 | push dx |
||
1226 | movzx dx,byte[eax+10] |
||
1227 | push dx |
||
1228 | movzx dx,byte[eax+9] |
||
1229 | push dx |
||
1230 | push eax ; dot pr. (in st0) |
||
1231 | call calc_one_col |
||
1232 | ; eax - 0x00rrggbb |
||
1233 | ; brightness = 1 - (distance/light.fadezero)^fogness |
||
1234 | ; if brightness < 0, then brightness = 0 |
||
1235 | ; attenuetion equation taken from 3dica tutorial - 1/d^2 isn't perfect |
||
1236 | ; color = color * brightness ; fogness = <0.5,2.0> |
||
1237 | pop ebp |
||
1238 | pop ecx |
||
1245 | hidnplayr | 1239 | |
8014 | leency | 1240 | fld .distance |
1241 | mov esi,.spot_light_ptr |
||
1245 | hidnplayr | 1242 | ; fidiv word[spot_light_params+16] ; fadezero |
8014 | leency | 1243 | fidiv word[esi+16] ; fadezero |
1245 | hidnplayr | 1244 | ; fmul st,st0 ; fogness = 2 |
8014 | leency | 1245 | fabs ; to be sure |
1246 | fchs |
||
1247 | fld1 |
||
1248 | faddp |
||
1249 | fld1 |
||
1250 | fcomip st1 |
||
1251 | jnbe @f |
||
1252 | ffree st0 |
||
1253 | fld1 |
||
1245 | hidnplayr | 1254 | @@: |
8014 | leency | 1255 | fld st ; st - brightness |
1256 | ror eax,16 |
||
1257 | movzx bx,al ; al - r |
||
1258 | mov .temp_col,bx |
||
1259 | fimul .temp_col |
||
1260 | fistp word[ecx] |
||
1261 | cmp word[ecx],0 |
||
1262 | jge @f |
||
1263 | mov word[ecx],0 |
||
1245 | hidnplayr | 1264 | @@: |
1265 | ; mov edx,dword[spot_light_params+12] ; max colors |
||
8014 | leency | 1266 | mov edx,dword[esi+12] ; max colors |
1267 | movzx bx,dl ; r max |
||
1268 | cmp word[ecx],bx ; choose the brightest for r, g, b |
||
1269 | jl @f |
||
1270 | mov word[ecx],bx |
||
1245 | hidnplayr | 1271 | @@: |
1272 | |||
8014 | leency | 1273 | add ecx,2 |
1274 | fld st |
||
1275 | ror eax,16 |
||
1276 | movzx bx,ah ; g |
||
1277 | mov .temp_col,bx |
||
1278 | fimul .temp_col |
||
1279 | fistp word[ecx] |
||
1280 | cmp word[ecx],0 |
||
1281 | jg @f |
||
1282 | mov word[ecx],0 |
||
1245 | hidnplayr | 1283 | @@: |
8014 | leency | 1284 | movzx bx,dh ; g max |
1285 | cmp word[ecx],bx |
||
1286 | jle @f |
||
1287 | mov word[ecx],bx |
||
1245 | hidnplayr | 1288 | @@: |
1289 | |||
8014 | leency | 1290 | add ecx,2 |
1291 | movzx bx,al ; b |
||
1292 | mov .temp_col,bx |
||
1293 | fimul .temp_col |
||
1294 | fistp word[ecx] |
||
1295 | cmp word[ecx],0 |
||
1296 | jg @f |
||
1297 | mov word[ecx],0 |
||
1245 | hidnplayr | 1298 | @@: |
8014 | leency | 1299 | shr edx,16 |
1300 | movzx bx,dl ; b max |
||
1301 | cmp word[ecx],bx |
||
1302 | jle @f |
||
1303 | mov word[ecx],bx |
||
1245 | hidnplayr | 1304 | @@: |
8014 | leency | 1305 | add ecx,2 |
1245 | hidnplayr | 1306 | ;end if |
1307 | ; ror eax,16 |
||
1308 | ; movzx bx,al |
||
1309 | ; mov word[ecx],bx |
||
1310 | ; ror eax,16 |
||
1311 | ; movzx bx,ah |
||
1312 | ; mov word[ecx+2],bx |
||
1313 | ; xor ah,ah |
||
1314 | ; mov word[ecx+4],ax |
||
1315 | ; add ecx,6 |
||
1316 | |||
8014 | leency | 1317 | pop edi |
1318 | pop edx |
||
1245 | hidnplayr | 1319 | |
1320 | .update_counters: |
||
8014 | leency | 1321 | add edx,12 ; normal_size |
1322 | add edi,12 ;6 ; 3d point_coord_size |
||
1245 | hidnplayr | 1323 | |
8014 | leency | 1324 | pop eax |
1325 | inc ax |
||
1326 | cmp ax,[points_count_var] |
||
1327 | jne .again_color |
||
1245 | hidnplayr | 1328 | |
8014 | leency | 1329 | add .spot_light_ptr,18 |
1330 | cmp .spot_light_ptr,spot_l_end |
||
1331 | jl .again_color |
||
1245 | hidnplayr | 1332 | |
8014 | leency | 1333 | mov esp,ebp |
1245 | hidnplayr | 1334 | ret |
1335 | end if |
||
1336 | ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented////////////////////////////////////0.5,2.0>>-->-2pi;2pi>-1.0;1.0>-2pi;2pi>--->-1;1>-1.0,1.0>-1.0,1.0> |