Subversion Repositories Kolibri OS

Rev

Rev 6648 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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