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