Rev 1245 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1245 | Rev 1931 | ||
---|---|---|---|
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 dx,[points_count_var] |
283 | mov dx,[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 dx |
288 | dec dx |
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 dx |
308 | dec dx |
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 dx,[points_count_var] ; substraction all coords - center point |
329 | mov dx,[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 dx |
337 | dec dx |
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 | movzx ecx,[points_count_var] |
346 | movzx 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 si,si |
408 | xor si,si |
409 | xor ax,ax |
409 | xor ax,ax |
410 | mov bx,.N+1 |
410 | mov bx,.N+1 |
411 | mov cx,(.N*2)+2 ;-- |
411 | mov cx,(.N*2)+2 ;-- |
412 | mov dx,(.N*3)+3 ;--- |
412 | mov dx,(.N*3)+3 ;--- |
413 | mov [triangles_count_var],0 |
413 | mov [triangles_count_var],0 |
414 | .again_tri: |
414 | .again_tri: |
415 | stosw ; main wave |
415 | stosw ; main wave |
416 | mov word[edi],bx |
416 | mov word[edi],bx |
417 | inc ax |
417 | inc ax |
418 | add edi,2 |
418 | add edi,2 |
419 | stosw |
419 | stosw |
420 | stosw |
420 | stosw |
421 | mov word[edi],bx |
421 | mov word[edi],bx |
422 | inc bx |
422 | inc bx |
423 | mov word[edi+2],bx |
423 | mov word[edi+2],bx |
424 | 424 | ||
425 | 425 | ||
426 | add edi,4 |
426 | add edi,4 |
427 | 427 | ||
428 | mov word[edi],cx ;---- ; n2+2 ; xor ax,ax |
428 | mov word[edi],cx ;---- ; n2+2 ; xor ax,ax |
429 | inc cx ; n2+3 ; mov bx,.N+1 |
429 | inc cx ; n2+3 ; mov bx,.N+1 |
430 | mov word[edi+2],dx ; ; mov cx,(.N*2)+2 ;-- |
430 | mov word[edi+2],dx ; ; mov cx,(.N*2)+2 ;-- |
431 | mov word[edi+4],cx ; n3+3 ; mov dx,(.N*3)+3 ;--- |
431 | mov word[edi+4],cx ; n3+3 ; mov dx,(.N*3)+3 ;--- |
432 | mov word[edi+6],dx ; n3+3 ; |
432 | mov word[edi+6],dx ; n3+3 ; |
433 | inc dx ; ; |
433 | inc dx ; ; |
434 | mov word[edi+8],dx ; n2+3 ; |
434 | mov word[edi+8],dx ; n2+3 ; |
435 | mov word[edi+10],cx ; n3+4 |
435 | mov word[edi+10],cx ; n3+4 |
436 | add edi,12 ;---- |
436 | add edi,12 ;---- |
437 | 437 | ||
438 | dec ax ; border of wave |
438 | dec ax ; border of wave |
439 | dec bx |
439 | dec bx |
440 | dec cx |
440 | dec cx |
441 | dec dx |
441 | dec dx |
442 | 442 | ||
443 | stosw ; first border |
443 | stosw ; first border |
444 | inc ax |
444 | inc ax |
445 | stosw |
445 | stosw |
446 | mov word[edi],dx |
446 | mov word[edi],dx |
447 | add edi,2 |
447 | add edi,2 |
448 | 448 | ||
449 | mov word[edi],dx |
449 | mov word[edi],dx |
450 | add edi,2 |
450 | add edi,2 |
451 | stosw |
451 | stosw |
452 | inc dx |
452 | inc dx |
453 | mov word[edi],dx |
453 | mov word[edi],dx |
454 | 454 | ||
455 | mov word[edi+2],bx ; second border |
455 | mov word[edi+2],bx ; second border |
456 | mov word[edi+4],cx |
456 | mov word[edi+4],cx |
457 | inc bx |
457 | inc bx |
458 | mov word[edi+6],bx |
458 | mov word[edi+6],bx |
459 | 459 | ||
460 | mov word[edi+8],bx |
460 | mov word[edi+8],bx |
461 | mov word[edi+10],cx |
461 | mov word[edi+10],cx |
462 | inc cx |
462 | inc cx |
463 | mov word[edi+12],cx |
463 | mov word[edi+12],cx |
464 | add edi,14 |
464 | add edi,14 |
465 | 465 | ||
466 | add [triangles_count_var],8 ;10 |
466 | add [triangles_count_var],8 ;10 |
467 | inc si |
467 | inc si |
468 | cmp si,.N |
468 | cmp si,.N |
469 | jne .again_tri |
469 | jne .again_tri |
470 | 470 | ||
471 | add ax,((.N+1)*3)+1 |
471 | add ax,((.N+1)*3)+1 |
472 | add bx,((.N+1)*3)+1 |
472 | add bx,((.N+1)*3)+1 |
473 | add cx,((.N+1)*3)+1 |
473 | add cx,((.N+1)*3)+1 |
474 | add dx,((.N+1)*3)+1 |
474 | add dx,((.N+1)*3)+1 |
475 | xor si,si |
475 | xor si,si |
476 | cmp ax,(.N*13)+13 ;;;(.N*23)+23 ; ax,(.N*13)+13 |
476 | cmp ax,(.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 |
|
- | 640 | mov [rand_seed],ax |
|
639 | push ebp |
641 | push ebp |
640 | mov ebp,esp |
642 | mov ebp,esp |
641 | sub esp,12 |
643 | sub esp,12 |
642 | mov edi,lights |
644 | mov edi,lights |
643 | fninit |
645 | fninit |
644 | mov dword[.temp2],.max |
646 | mov dword[.temp2],.max |
645 | mov dword[.temp3],.max/2 |
647 | mov dword[.temp3],.max/2 |
646 | 648 | ||
647 | .again: |
649 | .again: |
648 | xor esi,esi |
650 | xor esi,esi |
649 | @@: |
651 | @@: |
650 | mov edx,.max |
652 | mov edx,.max |
651 | xor ecx,ecx |
653 | xor ecx,ecx |
652 | call random |
654 | call random |
653 | sub eax,.max/2 |
655 | sub eax,.max/2 |
654 | mov dword[.temp1],eax |
656 | mov dword[.temp1],eax |
655 | fild dword[.temp1] |
657 | fild dword[.temp1] |
656 | fidiv dword[.temp3] |
658 | fidiv dword[.temp3] |
657 | fstp dword[edi+esi*4] |
659 | fstp dword[edi+esi*4] |
658 | inc esi |
660 | inc esi |
659 | cmp esi,2 |
661 | cmp esi,2 |
660 | jne @b |
662 | jne @b |
661 | 663 | ||
662 | .max1 equ 1000 |
664 | .max1 equ 1000 |
663 | mov dword[.temp2],.max1/2 |
665 | mov dword[.temp2],.max1/2 |
664 | mov edx,.max1 |
666 | mov edx,.max1 |
665 | xor ecx,ecx |
667 | xor ecx,ecx |
666 | call random |
668 | call random |
667 | mov dword[.temp1],eax |
669 | mov dword[.temp1],eax |
668 | fild dword[.temp1] |
670 | fild dword[.temp1] |
669 | fchs |
671 | fchs |
670 | fidiv dword[.temp2] |
672 | fidiv dword[.temp2] |
671 | fstp dword[edi+8] |
673 | fstp dword[edi+8] |
672 | 674 | ||
673 | xor esi,esi |
675 | xor esi,esi |
674 | @@: |
676 | @@: |
675 | 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 |
676 | mov edx,255 |
678 | mov edx,255 |
677 | call random |
679 | call random |
678 | mov byte[edi+18+esi],al |
680 | mov byte[edi+18+esi],al |
679 | inc esi |
681 | inc esi |
680 | cmp esi,4 |
682 | cmp esi,4 |
681 | jne @b |
683 | jne @b |
682 | 684 | ||
683 | 685 | ||
684 | xor esi,esi |
686 | xor esi,esi |
685 | @@: |
687 | @@: |
686 | mov ecx,100 ; orginal colors |
688 | mov ecx,100 ; orginal colors |
687 | movzx edx,byte[edi+18+esi] |
689 | movzx edx,byte[edi+18+esi] |
688 | call random |
690 | call random |
689 | mov byte[edi+12+esi],al |
691 | mov byte[edi+12+esi],al |
690 | inc esi |
692 | inc esi |
691 | cmp esi,3 |
693 | cmp esi,3 |
692 | jne @b |
694 | jne @b |
693 | 695 | ||
694 | xor esi,esi |
696 | xor esi,esi |
695 | @@: |
697 | @@: |
696 | mov ecx,1 ; min cols |
698 | mov ecx,1 ; min cols |
697 | movzx edx,byte[edi+12+esi] |
699 | movzx edx,byte[edi+12+esi] |
698 | call random |
700 | call random |
699 | mov byte[edi+15+esi],al |
701 | mov byte[edi+15+esi],al |
700 | inc esi |
702 | inc esi |
701 | cmp esi,3 |
703 | cmp esi,3 |
702 | jne @b |
704 | jne @b |
703 | 705 | ||
704 | add edi,LIGHT_SIZE ;22 |
706 | add edi,LIGHT_SIZE ;22 |
705 | cmp edi,lightsend ; see file View3ds,asm |
707 | cmp edi,lightsend ; see file View3ds,asm |
706 | jne .again |
708 | jne .again |
707 | 709 | ||
708 | mov esp,ebp |
710 | mov esp,ebp |
709 | pop ebp |
711 | pop ebp |
710 | ret |
712 | ret |
711 | 713 | ||
712 | generate_texture2: |
714 | generate_texture2: |
713 | .const equ 32 |
715 | .const equ 32 |
714 | mov edi,texmap |
716 | mov edi,texmap |
715 | xor bx,bx |
717 | xor bx,bx |
716 | .next_line: |
718 | .next_line: |
717 | xor dx,dx |
719 | xor dx,dx |
718 | .next2stripes: |
720 | .next2stripes: |
719 | mov eax,-1 |
721 | mov eax,-1 |
720 | mov ecx,(TEX_X/.const)*3/4 |
722 | mov ecx,(TEX_X/.const)*3/4 |
721 | rep stosd |
723 | rep stosd |
722 | mov eax,0x00ff0000 |
724 | mov eax,0x00ff0000 |
723 | mov ecx,(TEX_X/.const) |
725 | mov ecx,(TEX_X/.const) |
724 | @@: |
726 | @@: |
725 | stosd |
727 | stosd |
726 | dec edi |
728 | dec edi |
727 | loop @b |
729 | loop @b |
728 | inc dx |
730 | inc dx |
729 | cmp dx,.const/2 |
731 | cmp dx,.const/2 |
730 | jl .next2stripes |
732 | jl .next2stripes |
731 | inc bx |
733 | inc bx |
732 | cmp bx,TEX_Y |
734 | cmp bx,TEX_Y |
733 | jl .next_line |
735 | jl .next_line |
734 | ret |
736 | ret |
735 | 737 | ||
736 | blur_screen: ;blur n times ; blur or fire |
738 | blur_screen: ;blur n times ; blur or fire |
737 | ;in - ecx times count |
739 | ;in - ecx times count |
738 | ;.counter equ dword[esp-4] |
740 | ;.counter equ dword[esp-4] |
739 | .counter1 equ dword[esp-8] |
741 | .counter1 equ dword[esp-8] |
740 | if Ext>=MMX |
742 | if Ext>=MMX |
741 | emms |
743 | emms |
742 | push ebp |
744 | push ebp |
743 | mov ebp,esp |
745 | mov ebp,esp |
744 | push dword 0x0 |
746 | push dword 0x0 |
745 | push dword 0x01010101 |
747 | push dword 0x01010101 |
746 | .again_blur: |
748 | .again_blur: |
747 | push ecx |
749 | push ecx |
748 | mov edi,screen |
750 | mov edi,screen |
749 | mov ecx,SIZE_X*3/4 |
751 | mov ecx,SIZE_X*3/4 |
750 | pxor mm5,mm5 |
752 | pxor mm5,mm5 |
751 | xor eax,eax |
753 | xor eax,eax |
752 | rep stosd |
754 | rep stosd |
753 | 755 | ||
754 | mov ecx,(SIZE_X*(SIZE_Y-3))*3/4 |
756 | mov ecx,(SIZE_X*(SIZE_Y-3))*3/4 |
755 | .blr: |
757 | .blr: |
756 | @@: |
758 | @@: |
757 | 759 | ||
758 | movd mm0,[edi+SIZE_X*3] |
760 | movd mm0,[edi+SIZE_X*3] |
759 | movd mm1,[edi-SIZE_X*3] |
761 | movd mm1,[edi-SIZE_X*3] |
760 | movd mm2,[edi-3] |
762 | movd mm2,[edi-3] |
761 | movd mm3,[edi+3] |
763 | movd mm3,[edi+3] |
762 | 764 | ||
763 | punpcklbw mm0,mm5 |
765 | punpcklbw mm0,mm5 |
764 | punpcklbw mm1,mm5 |
766 | punpcklbw mm1,mm5 |
765 | punpcklbw mm2,mm5 |
767 | punpcklbw mm2,mm5 |
766 | punpcklbw mm3,mm5 |
768 | punpcklbw mm3,mm5 |
767 | paddw mm0,mm1 |
769 | paddw mm0,mm1 |
768 | paddw mm0,mm2 |
770 | paddw mm0,mm2 |
769 | paddw mm0,mm3 |
771 | paddw mm0,mm3 |
770 | psrlw mm0,2 |
772 | psrlw mm0,2 |
771 | 773 | ||
772 | packuswb mm0,mm5 |
774 | packuswb mm0,mm5 |
773 | psubusb mm0,qword[esp] ; importand if fire |
775 | psubusb mm0,qword[esp] ; importand if fire |
774 | movd eax,mm0 |
776 | movd eax,mm0 |
775 | stosd |
777 | stosd |
776 | 778 | ||
777 | loop .blr |
779 | loop .blr |
778 | 780 | ||
779 | xor eax,eax |
781 | xor eax,eax |
780 | mov ecx,SIZE_X*3/4 |
782 | mov ecx,SIZE_X*3/4 |
781 | rep stosd |
783 | rep stosd |
782 | pop ecx |
784 | pop ecx |
783 | loop .again_blur |
785 | loop .again_blur |
784 | mov esp,ebp |
786 | mov esp,ebp |
785 | pop ebp |
787 | pop ebp |
786 | end if |
788 | end if |
787 | if Ext=NON |
789 | if Ext=NON |
788 | .blur: |
790 | .blur: |
789 | push ecx |
791 | push ecx |
790 | xor ecx,ecx |
792 | xor ecx,ecx |
791 | .next_col_coof: |
793 | .next_col_coof: |
792 | xor esi,esi |
794 | xor esi,esi |
793 | xor eax,eax |
795 | xor eax,eax |
794 | xor ebx,ebx |
796 | xor ebx,ebx |
795 | mov edi,SIZE_X*SIZE_Y |
797 | mov edi,SIZE_X*SIZE_Y |
796 | .next: |
798 | .next: |
797 | mov ebp,esi |
799 | mov ebp,esi |
798 | dec ebp |
800 | dec ebp |
799 | 801 | ||
800 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
802 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
801 | jl @f |
803 | jl @f |
802 | mov ebp,SIZE_X*SIZE_Y-1 |
804 | mov ebp,SIZE_X*SIZE_Y-1 |
803 | @@: |
805 | @@: |
804 | or ebp,ebp |
806 | or ebp,ebp |
805 | jg @f |
807 | jg @f |
806 | xor ebp,ebp |
808 | xor ebp,ebp |
807 | @@: |
809 | @@: |
808 | lea edx,[ebp*3+screen] |
810 | lea edx,[ebp*3+screen] |
809 | mov al,byte[edx+ecx] |
811 | mov al,byte[edx+ecx] |
810 | 812 | ||
811 | mov ebp,esi |
813 | mov ebp,esi |
812 | inc ebp |
814 | inc ebp |
813 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
815 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
814 | jl @f |
816 | jl @f |
815 | mov ebp,SIZE_X*SIZE_Y-1 |
817 | mov ebp,SIZE_X*SIZE_Y-1 |
816 | @@: |
818 | @@: |
817 | or ebp,ebp |
819 | or ebp,ebp |
818 | jg @f |
820 | jg @f |
819 | xor ebp,ebp |
821 | xor ebp,ebp |
820 | @@: |
822 | @@: |
821 | lea edx,[ebp*3+screen] |
823 | lea edx,[ebp*3+screen] |
822 | mov bl,byte[edx+ecx] |
824 | mov bl,byte[edx+ecx] |
823 | add eax,ebx |
825 | add eax,ebx |
824 | 826 | ||
825 | mov ebp,esi |
827 | mov ebp,esi |
826 | sub ebp,SIZE_X |
828 | sub ebp,SIZE_X |
827 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
829 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
828 | jl @f |
830 | jl @f |
829 | mov ebp,SIZE_X*SIZE_Y-1 |
831 | mov ebp,SIZE_X*SIZE_Y-1 |
830 | @@: |
832 | @@: |
831 | or ebp,ebp |
833 | or ebp,ebp |
832 | jg @f |
834 | jg @f |
833 | xor ebp,ebp |
835 | xor ebp,ebp |
834 | @@: |
836 | @@: |
835 | lea edx,[ebp*3+screen] |
837 | lea edx,[ebp*3+screen] |
836 | mov bl,byte[edx+ecx] |
838 | mov bl,byte[edx+ecx] |
837 | add eax,ebx |
839 | add eax,ebx |
838 | 840 | ||
839 | mov ebp,esi |
841 | mov ebp,esi |
840 | add ebp,SIZE_X |
842 | add ebp,SIZE_X |
841 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
843 | cmp ebp,SIZE_X*SIZE_Y-1 ; clipping |
842 | jl @f |
844 | jl @f |
843 | mov ebp,SIZE_X*SIZE_Y-1 |
845 | mov ebp,SIZE_X*SIZE_Y-1 |
844 | @@: |
846 | @@: |
845 | or ebp,ebp |
847 | or ebp,ebp |
846 | jg @f |
848 | jg @f |
847 | xor ebp,ebp |
849 | xor ebp,ebp |
848 | @@: |
850 | @@: |
849 | lea edx,[ebp*3+screen] |
851 | lea edx,[ebp*3+screen] |
850 | mov bl,byte[edx+ecx] |
852 | mov bl,byte[edx+ecx] |
851 | add eax,ebx |
853 | add eax,ebx |
852 | 854 | ||
853 | shr eax,2 |
855 | shr eax,2 |
854 | lea edx,[esi*3+screen] |
856 | lea edx,[esi*3+screen] |
855 | or al,al |
857 | or al,al |
856 | jz @f |
858 | jz @f |
857 | dec al ; not importand if fire |
859 | dec al ; not importand if fire |
858 | mov byte[edx+ecx],al |
860 | mov byte[edx+ecx],al |
859 | @@: |
861 | @@: |
860 | 862 | ||
861 | inc esi |
863 | inc esi |
862 | dec edi |
864 | dec edi |
863 | jnz .next |
865 | jnz .next |
864 | 866 | ||
865 | inc ecx |
867 | inc ecx |
866 | cmp ecx,3 |
868 | cmp ecx,3 |
867 | jne .next_col_coof |
869 | jne .next_col_coof |
868 | pop ecx |
870 | pop ecx |
869 | dec ecx |
871 | dec ecx |
870 | jnz .blur |
872 | jnz .blur |
871 | end if |
873 | end if |
872 | ret |
874 | ret |
873 | 875 | ||
874 | mirror: ; mirror effect - loseless operation |
876 | mirror: ; mirror effect - loseless operation |
875 | ; in ah - button id = 11, 12, 13 |
877 | ; in ah - button id = 11, 12, 13 |
876 | mov edi,[points_ptr] ; one real point - triple float |
878 | mov edi,[points_ptr] ; one real point - triple float |
877 | mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z |
879 | mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z |
878 | fninit |
880 | fninit |
879 | movzx ecx,[points_count_var] |
881 | movzx ecx,[points_count_var] |
880 | 882 | ||
881 | cmp ah,11 |
883 | cmp ah,11 |
882 | je @f |
884 | je @f |
883 | cmp ah,12 |
885 | cmp ah,12 |
884 | je .yn |
886 | je .yn |
885 | cmp ah,13 |
887 | cmp ah,13 |
886 | je .zn |
888 | je .zn |
887 | 889 | ||
888 | @@: ; neg x |
890 | @@: ; neg x |
889 | fld dword[edi] ;x |
891 | fld dword[edi] ;x |
890 | fchs |
892 | fchs |
891 | fstp dword[edi] ;x |
893 | fstp dword[edi] ;x |
892 | fld dword[esi] |
894 | fld dword[esi] |
893 | fchs |
895 | fchs |
894 | fstp dword[esi] |
896 | fstp dword[esi] |
895 | add edi,12 |
897 | add edi,12 |
896 | add esi,12 |
898 | add esi,12 |
897 | loop @b |
899 | loop @b |
898 | ret |
900 | ret |
899 | .yn: |
901 | .yn: |
900 | fld dword[edi+4] ;y |
902 | fld dword[edi+4] ;y |
901 | fchs |
903 | fchs |
902 | fstp dword[edi+4] ;y |
904 | fstp dword[edi+4] ;y |
903 | fld dword[esi+4] |
905 | fld dword[esi+4] |
904 | fchs |
906 | fchs |
905 | fstp dword[esi+4] |
907 | fstp dword[esi+4] |
906 | 908 | ||
907 | add edi,12 |
909 | add edi,12 |
908 | add esi,12 |
910 | add esi,12 |
909 | loop .yn |
911 | loop .yn |
910 | ret |
912 | ret |
911 | .zn: |
913 | .zn: |
912 | fld dword[edi+8] ;z |
914 | fld dword[edi+8] ;z |
913 | fchs |
915 | fchs |
914 | fstp dword[edi+8] ;z |
916 | fstp dword[edi+8] ;z |
915 | fld dword[esi+8] |
917 | fld dword[esi+8] |
916 | fchs |
918 | fchs |
917 | fstp dword[esi+8] |
919 | fstp dword[esi+8] |
918 | 920 | ||
919 | add edi,12 |
921 | add edi,12 |
920 | add esi,12 |
922 | add esi,12 |
921 | loop .zn |
923 | loop .zn |
922 | ret |
924 | ret |
923 | 925 | ||
924 | exchange: ; exchange some coords - loseless operation |
926 | exchange: ; exchange some coords - loseless operation |
925 | mov edi,[points_ptr] ; one real point - triple float |
927 | mov edi,[points_ptr] ; one real point - triple float |
926 | mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z |
928 | mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z |
927 | fninit ; exchange both points and normal vactors coords/coofics |
929 | fninit ; exchange both points and normal vactors coords/coofics |
928 | movzx ecx,[points_count_var] |
930 | movzx ecx,[points_count_var] |
929 | 931 | ||
930 | cmp [xchg_flag],1 |
932 | cmp [xchg_flag],1 |
931 | je @f |
933 | je @f |
932 | cmp [xchg_flag],2 |
934 | cmp [xchg_flag],2 |
933 | je .zx |
935 | je .zx |
934 | cmp [xchg_flag],3 |
936 | cmp [xchg_flag],3 |
935 | je .yz |
937 | je .yz |
936 | @@: |
938 | @@: |
937 | fld dword[edi] ;x |
939 | fld dword[edi] ;x |
938 | fld dword[edi+4] ;y |
940 | fld dword[edi+4] ;y |
939 | fstp dword[edi] ;x |
941 | fstp dword[edi] ;x |
940 | fstp dword[edi+4] ;y |
942 | fstp dword[edi+4] ;y |
941 | fld dword[esi] ;x |
943 | fld dword[esi] ;x |
942 | fld dword[esi+4] ;y |
944 | fld dword[esi+4] ;y |
943 | fstp dword[esi] ;x |
945 | fstp dword[esi] ;x |
944 | fstp dword[esi+4] ;y |
946 | fstp dword[esi+4] ;y |
945 | 947 | ||
946 | add esi,12 |
948 | add esi,12 |
947 | add edi,12 |
949 | add edi,12 |
948 | loop @b |
950 | loop @b |
949 | ret |
951 | ret |
950 | .zx: |
952 | .zx: |
951 | fld dword[edi] ;x |
953 | fld dword[edi] ;x |
952 | fld dword[edi+8] ;z |
954 | fld dword[edi+8] ;z |
953 | fstp dword[edi] ;x |
955 | fstp dword[edi] ;x |
954 | fstp dword[edi+8] ;z |
956 | fstp dword[edi+8] ;z |
955 | fld dword[esi] ;x |
957 | fld dword[esi] ;x |
956 | fld dword[esi+8] ;y |
958 | fld dword[esi+8] ;y |
957 | fstp dword[esi] ;x |
959 | fstp dword[esi] ;x |
958 | fstp dword[esi+8] ;y |
960 | fstp dword[esi+8] ;y |
959 | 961 | ||
960 | add esi,12 |
962 | add esi,12 |
961 | add edi,12 |
963 | add edi,12 |
962 | loop .zx |
964 | loop .zx |
963 | ret |
965 | ret |
964 | .yz: |
966 | .yz: |
965 | fld dword[edi+8] ;z |
967 | fld dword[edi+8] ;z |
966 | fld dword[edi+4] ;y |
968 | fld dword[edi+4] ;y |
967 | fstp dword[edi+8] ;z |
969 | fstp dword[edi+8] ;z |
968 | fstp dword[edi+4] ;y |
970 | fstp dword[edi+4] ;y |
969 | fld dword[esi+8] ;x |
971 | fld dword[esi+8] ;x |
970 | fld dword[esi+4] ;y |
972 | fld dword[esi+4] ;y |
971 | fstp dword[esi+8] ;x |
973 | fstp dword[esi+8] ;x |
972 | fstp dword[esi+4] ;y |
974 | fstp dword[esi+4] ;y |
973 | 975 | ||
974 | add edi,12 |
976 | add edi,12 |
975 | add esi,12 |
977 | add esi,12 |
976 | loop .yz |
978 | loop .yz |
977 | ret |
979 | ret |
978 | 980 | ||
979 | ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented/////////////////////////////// |
981 | ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented/////////////////////////////// |
980 | if 0 |
982 | if 0 |
981 | calc_attenuation_light: ;; calculate point to spot_light distance |
983 | calc_attenuation_light: ;; calculate point to spot_light distance |
982 | ; spot light with attenuation ;; and vector, normalize vector, |
984 | ; spot light with attenuation ;; and vector, normalize vector, |
983 | ;; calc dot_pr and unlinear color according |
985 | ;; calc dot_pr and unlinear color according |
984 | ;; to dot_product, write to color buff |
986 | ;; to dot_product, write to color buff |
985 | .distance equ dword[ebp-4] ;; color buff in bumpmap for save the mem |
987 | .distance equ dword[ebp-4] ;; color buff in bumpmap for save the mem |
986 | .temp_col equ word[ebp-6] |
988 | .temp_col equ word[ebp-6] |
987 | .vector equ [ebp-20] |
989 | .vector equ [ebp-20] |
988 | .spot_light_ptr equ dword [ebp-24] |
990 | .spot_light_ptr equ dword [ebp-24] |
989 | mov ebp,esp |
991 | mov ebp,esp |
990 | sub esp,24 |
992 | sub esp,24 |
991 | mov edi,rotated_points_r ;points_rotated |
993 | mov edi,rotated_points_r ;points_rotated |
992 | mov edx,point_normals_rotated |
994 | mov edx,point_normals_rotated |
993 | mov ecx,bumpmap ; mem area with temp points color list |
995 | mov ecx,bumpmap ; mem area with temp points color list |
994 | xor ax,ax ; counter |
996 | xor ax,ax ; counter |
995 | mov esi,spot_light_params |
997 | mov esi,spot_light_params |
996 | mov .spot_light_ptr,esi |
998 | mov .spot_light_ptr,esi |
997 | .again_color: |
999 | .again_color: |
998 | push eax |
1000 | push eax |
999 | lea ebx,.vector |
1001 | lea ebx,.vector |
1000 | mov esi,.spot_light_ptr ; calc vector fom light to every point |
1002 | mov esi,.spot_light_ptr ; calc vector fom light to every point |
1001 | call make_vector_r |
1003 | call make_vector_r |
1002 | ; ebx - ptr to result vector |
1004 | ; ebx - ptr to result vector |
1003 | fld dword [ebx] |
1005 | fld dword [ebx] |
1004 | fmul st, st |
1006 | fmul st, st |
1005 | fld dword [ebx+4] |
1007 | fld dword [ebx+4] |
1006 | fmul st, st |
1008 | fmul st, st |
1007 | fld dword [ebx+8] |
1009 | fld dword [ebx+8] |
1008 | fmul st, st |
1010 | fmul st, st |
1009 | faddp st1, st |
1011 | faddp st1, st |
1010 | faddp st1, st |
1012 | faddp st1, st |
1011 | fsqrt |
1013 | fsqrt |
1012 | fstp .distance |
1014 | fstp .distance |
1013 | push edi |
1015 | push edi |
1014 | mov edi,ebx |
1016 | mov edi,ebx |
1015 | call normalize_vector |
1017 | call normalize_vector |
1016 | ; edi - normalized distance vector |
1018 | ; edi - normalized distance vector |
1017 | mov esi,edx |
1019 | mov esi,edx |
1018 | call dot_product ; esi first vector, edi second vector |
1020 | call dot_product ; esi first vector, edi second vector |
1019 | ; st0 - dot product |
1021 | ; st0 - dot product |
1020 | fabs ; why not ? - think about it |
1022 | fabs ; why not ? - think about it |
1021 | pop edi |
1023 | pop edi |
1022 | fldz |
1024 | fldz |
1023 | fcomip st1 |
1025 | fcomip st1 |
1024 | jbe @f ; st1>0 |
1026 | jbe @f ; st1>0 |
1025 | mov dword[ecx],0 |
1027 | mov dword[ecx],0 |
1026 | mov word[ecx+4],0 |
1028 | mov word[ecx+4],0 |
1027 | add ecx,6 |
1029 | add ecx,6 |
1028 | ffree st0 |
1030 | ffree st0 |
1029 | jmp .update_counters |
1031 | jmp .update_counters |
1030 | @@: |
1032 | @@: |
1031 | ; pop edi |
1033 | ; pop edi |
1032 | 1034 | ||
1033 | ; calc color(with atenuation), write to buff |
1035 | ; calc color(with atenuation), write to buff |
1034 | ; buff - color of points list |
1036 | ; buff - color of points list |
1035 | ; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular |
1037 | ; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular |
1036 | 1038 | ||
1037 | push edx |
1039 | push edx |
1038 | push edi |
1040 | push edi |
1039 | 1041 | ||
1040 | push ecx |
1042 | push ecx |
1041 | push ebp |
1043 | push ebp |
1042 | 1044 | ||
1043 | ; mov eax,spot_light_params |
1045 | ; mov eax,spot_light_params |
1044 | mov eax,.spot_light_ptr |
1046 | mov eax,.spot_light_ptr |
1045 | movzx dx,byte[eax+15] |
1047 | movzx dx,byte[eax+15] |
1046 | push dx ; shines |
1048 | push dx ; shines |
1047 | movzx dx,byte[eax+8] ; b |
1049 | movzx dx,byte[eax+8] ; b |
1048 | push dx ; orginal col |
1050 | push dx ; orginal col |
1049 | movzx dx,byte[eax+7] ; g |
1051 | movzx dx,byte[eax+7] ; g |
1050 | push dx |
1052 | push dx |
1051 | movzx dx,byte[eax+6] ; r |
1053 | movzx dx,byte[eax+6] ; r |
1052 | push dx |
1054 | push dx |
1053 | movzx dx,byte[eax+14] ; max col |
1055 | movzx dx,byte[eax+14] ; max col |
1054 | push dx |
1056 | push dx |
1055 | movzx dx,byte[eax+13] |
1057 | movzx dx,byte[eax+13] |
1056 | push dx |
1058 | push dx |
1057 | movzx dx,byte[eax+12] |
1059 | movzx dx,byte[eax+12] |
1058 | push dx |
1060 | push dx |
1059 | movzx dx,byte[eax+11] ; min col |
1061 | movzx dx,byte[eax+11] ; min col |
1060 | push dx |
1062 | push dx |
1061 | movzx dx,byte[eax+10] |
1063 | movzx dx,byte[eax+10] |
1062 | push dx |
1064 | push dx |
1063 | movzx dx,byte[eax+9] |
1065 | movzx dx,byte[eax+9] |
1064 | push dx |
1066 | push dx |
1065 | push eax ; dot pr. (in st0) |
1067 | push eax ; dot pr. (in st0) |
1066 | call calc_one_col |
1068 | call calc_one_col |
1067 | ; eax - 0x00rrggbb |
1069 | ; eax - 0x00rrggbb |
1068 | ; brightness = 1 - (distance/light.fadezero)^fogness |
1070 | ; brightness = 1 - (distance/light.fadezero)^fogness |
1069 | ; if brightness < 0, then brightness = 0 |
1071 | ; if brightness < 0, then brightness = 0 |
1070 | ; attenuetion equation taken from 3dica tutorial - 1/d^2 isn't perfect |
1072 | ; attenuetion equation taken from 3dica tutorial - 1/d^2 isn't perfect |
1071 | ; color = color * brightness ; fogness = <0.5,2.0> |
1073 | ; color = color * brightness ; fogness = <0.5,2.0> |
1072 | pop ebp |
1074 | pop ebp |
1073 | pop ecx |
1075 | pop ecx |
1074 | 1076 | ||
1075 | fld .distance |
1077 | fld .distance |
1076 | mov esi,.spot_light_ptr |
1078 | mov esi,.spot_light_ptr |
1077 | ; fidiv word[spot_light_params+16] ; fadezero |
1079 | ; fidiv word[spot_light_params+16] ; fadezero |
1078 | fidiv word[esi+16] ; fadezero |
1080 | fidiv word[esi+16] ; fadezero |
1079 | ; fmul st,st0 ; fogness = 2 |
1081 | ; fmul st,st0 ; fogness = 2 |
1080 | fabs ; to be sure |
1082 | fabs ; to be sure |
1081 | fchs |
1083 | fchs |
1082 | fld1 |
1084 | fld1 |
1083 | faddp |
1085 | faddp |
1084 | fld1 |
1086 | fld1 |
1085 | fcomip st1 |
1087 | fcomip st1 |
1086 | jnbe @f |
1088 | jnbe @f |
1087 | ffree st0 |
1089 | ffree st0 |
1088 | fld1 |
1090 | fld1 |
1089 | @@: |
1091 | @@: |
1090 | fld st ; st - brightness |
1092 | fld st ; st - brightness |
1091 | ror eax,16 |
1093 | ror eax,16 |
1092 | movzx bx,al ; al - r |
1094 | movzx bx,al ; al - r |
1093 | mov .temp_col,bx |
1095 | mov .temp_col,bx |
1094 | fimul .temp_col |
1096 | fimul .temp_col |
1095 | fistp word[ecx] |
1097 | fistp word[ecx] |
1096 | cmp word[ecx],0 |
1098 | cmp word[ecx],0 |
1097 | jge @f |
1099 | jge @f |
1098 | mov word[ecx],0 |
1100 | mov word[ecx],0 |
1099 | @@: |
1101 | @@: |
1100 | ; mov edx,dword[spot_light_params+12] ; max colors |
1102 | ; mov edx,dword[spot_light_params+12] ; max colors |
1101 | mov edx,dword[esi+12] ; max colors |
1103 | mov edx,dword[esi+12] ; max colors |
1102 | movzx bx,dl ; r max |
1104 | movzx bx,dl ; r max |
1103 | cmp word[ecx],bx ; choose the brightest for r, g, b |
1105 | cmp word[ecx],bx ; choose the brightest for r, g, b |
1104 | jl @f |
1106 | jl @f |
1105 | mov word[ecx],bx |
1107 | mov word[ecx],bx |
1106 | @@: |
1108 | @@: |
1107 | 1109 | ||
1108 | add ecx,2 |
1110 | add ecx,2 |
1109 | fld st |
1111 | fld st |
1110 | ror eax,16 |
1112 | ror eax,16 |
1111 | movzx bx,ah ; g |
1113 | movzx bx,ah ; g |
1112 | mov .temp_col,bx |
1114 | mov .temp_col,bx |
1113 | fimul .temp_col |
1115 | fimul .temp_col |
1114 | fistp word[ecx] |
1116 | fistp word[ecx] |
1115 | cmp word[ecx],0 |
1117 | cmp word[ecx],0 |
1116 | jg @f |
1118 | jg @f |
1117 | mov word[ecx],0 |
1119 | mov word[ecx],0 |
1118 | @@: |
1120 | @@: |
1119 | movzx bx,dh ; g max |
1121 | movzx bx,dh ; g max |
1120 | cmp word[ecx],bx |
1122 | cmp word[ecx],bx |
1121 | jle @f |
1123 | jle @f |
1122 | mov word[ecx],bx |
1124 | mov word[ecx],bx |
1123 | @@: |
1125 | @@: |
1124 | 1126 | ||
1125 | add ecx,2 |
1127 | add ecx,2 |
1126 | movzx bx,al ; b |
1128 | movzx bx,al ; b |
1127 | mov .temp_col,bx |
1129 | mov .temp_col,bx |
1128 | fimul .temp_col |
1130 | fimul .temp_col |
1129 | fistp word[ecx] |
1131 | fistp word[ecx] |
1130 | cmp word[ecx],0 |
1132 | cmp word[ecx],0 |
1131 | jg @f |
1133 | jg @f |
1132 | mov word[ecx],0 |
1134 | mov word[ecx],0 |
1133 | @@: |
1135 | @@: |
1134 | shr edx,16 |
1136 | shr edx,16 |
1135 | movzx bx,dl ; b max |
1137 | movzx bx,dl ; b max |
1136 | cmp word[ecx],bx |
1138 | cmp word[ecx],bx |
1137 | jle @f |
1139 | jle @f |
1138 | mov word[ecx],bx |
1140 | mov word[ecx],bx |
1139 | @@: |
1141 | @@: |
1140 | add ecx,2 |
1142 | add ecx,2 |
1141 | ;end if |
1143 | ;end if |
1142 | ; ror eax,16 |
1144 | ; ror eax,16 |
1143 | ; movzx bx,al |
1145 | ; movzx bx,al |
1144 | ; mov word[ecx],bx |
1146 | ; mov word[ecx],bx |
1145 | ; ror eax,16 |
1147 | ; ror eax,16 |
1146 | ; movzx bx,ah |
1148 | ; movzx bx,ah |
1147 | ; mov word[ecx+2],bx |
1149 | ; mov word[ecx+2],bx |
1148 | ; xor ah,ah |
1150 | ; xor ah,ah |
1149 | ; mov word[ecx+4],ax |
1151 | ; mov word[ecx+4],ax |
1150 | ; add ecx,6 |
1152 | ; add ecx,6 |
1151 | 1153 | ||
1152 | pop edi |
1154 | pop edi |
1153 | pop edx |
1155 | pop edx |
1154 | 1156 | ||
1155 | .update_counters: |
1157 | .update_counters: |
1156 | add edx,12 ; normal_size |
1158 | add edx,12 ; normal_size |
1157 | add edi,12 ;6 ; 3d point_coord_size |
1159 | add edi,12 ;6 ; 3d point_coord_size |
1158 | 1160 | ||
1159 | pop eax |
1161 | pop eax |
1160 | inc ax |
1162 | inc ax |
1161 | cmp ax,[points_count_var] |
1163 | cmp ax,[points_count_var] |
1162 | jne .again_color |
1164 | jne .again_color |
1163 | 1165 | ||
1164 | add .spot_light_ptr,18 |
1166 | add .spot_light_ptr,18 |
1165 | cmp .spot_light_ptr,spot_l_end |
1167 | cmp .spot_light_ptr,spot_l_end |
1166 | jl .again_color |
1168 | jl .again_color |
1167 | 1169 | ||
1168 | mov esp,ebp |
1170 | mov esp,ebp |
1169 | ret |
1171 | ret |
1170 | end if |
1172 | end if |
1171 | ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented////////////////////////////////////0.5,2.0>>-->-2pi;2pi>-1.0;1.0>-2pi;2pi>--->-1;1>-1.0,1.0>-1.0,1.0> |
1173 | ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented////////////////////////////////////0.5,2.0>>-->-2pi;2pi>-1.0;1.0>-2pi;2pi>--->-1;1>-1.0,1.0>-1.0,1.0> |