Subversion Repositories Kolibri OS

Rev

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

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