Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8719 leency 1
;===============================================================
2
do_edges_list:
3
    push    ebp
4
    mov     ebp,esp
5
    sub     esp,32
6
 
7
    .ed_cnt   equ [ebp-4]
8
    .edd_ptr  equ [ebp-8]
9
    .counter  equ [ebp-12]
10
 
11
 
12
    mov     ebx,[edges_ptr]
13
    mov     eax,[triangles_ptr]
14
    mov     ecx,[triangles_count_var]
15
  @@:
16
    movdqu  xmm0,[eax]
17
    movq    [ebx],xmm0
18
    pshufd  xmm0,xmm0,11001001b
19
    movq    [ebx+8],xmm0
20
    pshufd  xmm0,xmm0,11001001b
21
    movq    [ebx+16],xmm0
22
    add     ebx,24
23
    add     eax,12
24
    loop    @b
25
 
26
 
27
    mov     ebx,[edges_ptr]
28
    mov     ecx,[triangles_count_var]
29
    lea     ecx,[ecx*3]
30
  .mxd:
31
    mov     eax,[ebx]
32
    cmp     eax,[ebx+4]
33
    jl      @f
34
    movq    xmm0,[ebx]
35
    pshufd  xmm0,xmm0,11100001b
36
    movq    [ebx],xmm0
37
  @@:
38
    add     ebx,8
39
    loop    .mxd
40
 
41
 
42
   ; insert sort
43
   mov    ebx,[edges_ptr]
44
   mov    ecx,[triangles_count_var]
45
   lea    ecx,[ecx*3]
46
 
47
   mov    esi,ecx
48
   shl    esi,3
49
   add    esi,ebx
50
 
51
 .ccc:
52
   mov    eax,[ebx+8]
53
   cmp    eax,[ebx]
54
   jge    .g
55
   movq   xmm0,[ebx+8]
56
   push   ebx
57
 .c:
58
   cmp    ebx,esi
59
   jge    .done
60
   cmp    ebx,[edges_ptr]
61
   jl     .done
62
   cmp    eax,[ebx]
63
   jge    .done
64
   movq   xmm7,[ebx]
65
   movq   [ebx+8],xmm7
66
   sub    ebx,8
67
   jnz    .c
68
   add    ebx,8
69
 .done:
70
   movq   [ebx+8],xmm0
71
 .p:
72
   pop    ebx
73
 .g:
74
   add    ebx,8
75
   dec    ecx
76
   cmp    ecx,1
77
   jnz    .ccc
78
 
79
 
80
  ; insert sort again
81
   mov    ebx,[edges_ptr]
82
   mov    ecx,[triangles_count_var]
83
   lea    ecx,[ecx*3]
84
   mov    esi,ecx
85
   shl    esi,3
86
   add    esi,ebx
87
 
88
 .count:
89
   push   ecx
90
   push   ebx
91
   xor    ecx,ecx
92
   mov    eax,[ebx]          ; count
93
 .aa:
94
   inc    ecx
95
   add    ebx,8
96
   cmp    ebx,esi
97
   jge    .br         ; break
98
   cmp    eax,[ebx]
99
   je     .aa
100
   mov    .counter,ecx
101
   pop    ebx
102
   mov    edi,ebx
103
   sub    edi,8
104
   mov    edx,[ebx+8]
105
 .ccc2:
106
 
107
   cmp    ebx,esi
108
   jbe    @f
109
   add    esp,4
110
   jmp    .ff
111
 @@:
112
   mov    eax,[ebx+12]
113
   mov    edx,[ebx+8]
114
   cmp    eax,[ebx+4]
115
   jge    .gg2
116
   movq   xmm0,[ebx+8]
117
   push   ebx
118
 .c2:
119
   cmp    eax,[ebx+4]
120
   jge    .done2
121
   movq   xmm7,[ebx]
122
   movq   [ebx+8],xmm7
123
 
124
   sub    ebx,8
125
   cmp    ebx,edi
126
   jz     @f
127
   cmp    [ebx+8],edx
128
   jz     .c2
129
 @@:
130
 .done2:
131
   add    ebx,8
132
   movq   [ebx],xmm0
133
 
134
 .p2:
135
   pop    ebx
136
 .gg2:
137
   add    ebx,8
138
   dec    ecx
139
   cmp    ecx,1
140
   jnz    .ccc2
141
 
142
   pop    ecx
143
   sub    ecx,.counter
144
   add    ebx,8
145
   ja     .count
146
 
147
   jmp    .ff
148
 .br: ;break
149
   add   esp,8
150
 .ff:
151
 
152
   ; count edges
153
   mov    ecx,0
154
   mov    edx,[triangles_count_var]
155
   lea    edx,[edx*3]
156
   mov    ebx,[edges_ptr]
157
;   mov    esi,edx
158
;   shl    esi,3
159
;   add    esi,[edges_ptr]
160
 .nx:
161
   movq    xmm0,[ebx]
162
   add     ebx,8
163
;   cmp     ebx,esi
164
;   jae     @f
165
   movq    xmm1,[ebx]
166
; @@:
167
   pcmpeqd xmm0,xmm1
168
   pmovmskb eax,xmm0
169
   and     eax,0xff
170
   cmp     eax,0xff
171
   jz      @f
172
   inc     ecx
173
  @@:
174
   dec     edx
175
   jnz     .nx
176
 
177
 
178
    mov     .ed_cnt,ecx
179
    lea     ecx,[ecx*3]
180
    shl     ecx,2
181
    add     ecx,65536
182
    mov     ebx,12
183
    mov     eax,68
184
    mov     edx,.edd_ptr
185
    int     0x40                   ;  -> allocate memory to triangles
186
    mov     .edd_ptr, eax   ;  -> eax = pointer to allocated mem
187
 
188
 
189
 
190
   mov      ebx,[edges_ptr]
191
   mov      ecx,[triangles_count_var]
192
   lea      ecx,[ecx*3]
193
  .seek:
194
   movq     xmm0,[ebx]
195
   movq     xmm1,[ebx+8]
196
   pcmpeqd  xmm1,xmm0
197
   pmovmskb edx,xmm1
198
   and      edx,0xff
199
   cmp      edx,0xff
200
   je       @f
201
   movq     [eax],xmm0
202
   add      eax,8
203
 @@:
204
   add      ebx,8
205
   loop     .seek
206
 
207
   mov       eax,68
208
   mov       ebx,13
209
   mov       ecx,[edges_ptr]
210
   int       0x40          ; release old edges ptr
211
 
212
 
213
   mov      eax,.edd_ptr
214
   mov      ecx,.ed_cnt
215
   mov      [edges_ptr],eax
216
   mov      [edges_count],ecx
217
 
218
   mov      esp,ebp
219
   pop      ebp
220
ret
221
 
222
;=======================
223
 
224
 
225
do_sinus:
226
   .x      equ  [ebp-8]
227
   .y      equ  [ebp-12]
228
   .new_y  equ  [ebp-16]
229
   .temp   equ  [ebp-20]
230
   push    ebp
231
   mov     ebp,esp
232
   sub     esp,64
233
   mov     dword .x,0
234
   mov     dword .y,0
235
   mov     esi,[screen_ptr]
236
   mov     edi,[Zbuffer_ptr]
237
   push    edi
238
   ;  clear Zbuffer temporally used as image buffer
239
   movzx   ecx,word[size_x_var]
240
   movzx   eax,word[size_y_var]
241
   imul    ecx,eax  ;SIZE_X*SIZE_Y
242
   xor     eax,eax
243
   cld
244
   rep     stosd
245
   pop     edi
246
;   movzx   eax,[sinus_flag]
247
;   mov     edx,10
248
;   mul     edx
249
;   mov     [sin_amplitude],eax
250
;   mov     [sin_frq],eax
251
   fninit
252
;if Ext = SSE2
253
;   movups  xmm1,[const0123]   ; xmm1 - init values
254
;   mov     eax,0x000000ff
255
;   movd    xmm2,eax
256
;   shufps  xmm2,xmm2,0        ; xmm2 - mask value
257
;   mov     eax,4
258
;   movd    xmm3,eax
259
;   shufps  xmm3,xmm3,0
260
 .again:
261
if  0
262
   fild    dword .x
263
   fidiv   [sin_frq]
264
   fsin
265
   fimul   [sin_amplitude]
266
   fiadd   dword .y
267
   fistp   dword .new_y
268
else
269
   fild    dword .x
270
   fmul    [sin_frq]
271
   fistp   dword .temp
272
   mov     eax, .temp
273
;   mov     bx, [angle_x]
274
;   add     bx, [angle_y]
275
;   movzx   ebx,bx
276
;   shr     ebx,1       ; change phase
277
;   add     eax,ebx
278
 
279
 
280
   and     eax, 0x000000ff
281
 
282
;   cdq
283
 ;  mul     [sin_frq]
284
;   and      eax,0x000000ff
285
;   and     ax,0x00ff
286
;   cwde
287
 
288
   fld     dword [sin_tab+eax*4]
289
   fimul   dword [sin_amplitude]
290
   fiadd   dword .y
291
   fistp   dword .new_y
292
end if
293
   mov     eax,.new_y
294
   or      eax,eax
295
   jl      .skip
296
   movzx   ebx,word[size_y_var]
297
   cmp     eax,ebx  ;SIZE_Y
298
   jg      .skip
299
   movzx   edx,word[size_x_var]
300
   mul     edx
301
;   shl     eax,9
302
   add     eax,dword .x
303
 
304
   lea     ebx,[eax*3]
305
   cmp     [dr_flag],12 ; 32 bit col cause
306
   jl      @f
307
   add     ebx,eax
308
  @@:
309
   mov     eax,[esi]
310
   mov     [edi+ebx],eax
311
 .skip:
312
   add     esi,3
313
   cmp     [dr_flag],12
314
   jl      @f
315
   inc     esi
316
  @@:
317
   inc     dword .x
318
   movzx   edx,word[size_x_var]
319
   cmp     dword .x,edx  ;SIZE_X
320
   jl      .again
321
   mov     dword .x,0
322
   inc     dword .y
323
   movzx   edx,word[size_y_var]
324
   cmp     dword .y,edx   ;SIZE_Y
325
   jl      .again
326
 
327
   ; copy from temporary buffer -> Zbuffer to screen
328
   mov     esi,[Zbuffer_ptr]
329
   mov     edi,[screen_ptr]
330
   movzx   ecx,word[size_x_var]
331
   movzx   eax,word[size_y_var]
332
   imul    ecx,eax
333
   cmp     [dr_flag],12
334
   jge     @f
335
   lea     ecx,[ecx*3]
336
   shr     ecx,2
337
 ;  mov     ecx,SIZE_X*SIZE_Y*3/4
338
  @@:
339
   cld
340
   rep     movsd
341
 
342
 
343
   mov     esp,ebp
344
   pop     ebp
345
ret
346
 
347
 
348
draw_dots:
349
   mov     esi,[points_translated_ptr]
350
   mov     ecx,[points_count_var]
351
 .drw:
352
 @@:
353
   lodsd
354
   add     esi,2           ; skip z
355
   movzx   ebx,ax
356
   shr     eax,16          ; bx = x , ax = y
357
   or      ax,ax
358
   jl      @f
359
   or      bx,bx
360
   jl      @f
361
   cmp     ax,[size_y_var]  ;SIZE_Y
362
   jge     @f
363
   cmp     bx,[size_x_var]  ;SIZE_X
364
   jge     @f
365
   movzx   edx,word[size_x_var]  ;SIZE_X      ; SIZE_X not only power of 2   -> 256,512,...
366
   mul     edx
367
   add     eax,ebx
368
   mov     edi,[screen_ptr]
369
   lea     eax,[eax*3]
370
   add     edi,eax
371
   xor     eax,eax
372
   not     eax
373
   stosd
374
 @@:
375
   loop    .drw
376
 
377
ret
378
 
379
do_emboss:   ; sse2 version only
380
if Ext >= SSE2
381
 movzx ecx,[bumps_deep_flag]
382
 inc   ecx
383
 call  blur_screen    ;blur n times
384
 
385
 mov   eax,[size_y_var]  ;load both x, y
386
 mov   ebx,eax
387
 shr   ebx,16
388
 cwde
389
 mul   ebx
390
 mov   ecx,eax
391
 sub   ecx,ebx
392
 sub   ecx,ebx
393
 mov   esi,[screen_ptr]
394
 mov   edi,[Zbuffer_ptr]
395
 cmp   [dr_flag],12
396
 jge   @f
397
 lea   ebx,[ebx*3]
398
 jmp   .f
399
@@:
400
 shl   ebx,2
401
.f:
402
 mov   edx,esi
403
 add   esi,ebx
404
 lea   ebx,[ebx+esi]
405
 pxor  xmm0,xmm0
406
 push  eax
407
.emb:
408
 cmp   [dr_flag],12
409
 jge   @f
410
 movlps     xmm1,[esi+3]
411
 movhps     xmm1,[esi+6]
412
 movlps     xmm2,[esi-3]
413
 movhps     xmm2,[esi]
414
 movlps     xmm3,[ebx]
415
 movhps     xmm3,[ebx+3]
416
 movlps     xmm4,[edx]
417
 movhps     xmm4,[edx+3]
418
 jmp        .ff
419
@@:
420
 movlps     xmm1,[esi+4]
421
 movhps     xmm1,[esi+8]
422
 movlps     xmm2,[esi-4]
423
 movhps     xmm2,[esi]
424
 movlps     xmm3,[ebx]
425
 movhps     xmm3,[ebx+4]
426
 movlps     xmm4,[edx]
427
 movhps     xmm4,[edx+4]
428
.ff:
429
 punpcklbw  xmm1,xmm0
430
 punpcklbw  xmm2,xmm0
431
 punpcklbw  xmm3,xmm0
432
 punpcklbw  xmm4,xmm0
433
 psubsw     xmm1,xmm2
434
 paddw      xmm1,[emboss_bias]
435
 psubsw     xmm3,xmm4
436
 paddw      xmm3,[emboss_bias]
437
 pmulhw     xmm1,xmm3
438
 movaps      xmm7,xmm1
439
 movaps      xmm6,xmm1
440
 psrlq       xmm7,2*8
441
 psrlq       xmm6,4*8
442
 pmaxsw      xmm1,xmm7
443
 pmaxsw      xmm1,xmm6
444
 
445
if 0
446
 movaps      xmm7,xmm3
447
 movaps      xmm6,xmm3
448
 psrlq       xmm7,2*8
449
 psrlq       xmm6,4*8
450
 pmaxsw      xmm3,xmm7
451
 pmaxsw      xmm3,xmm6
452
end if
453
 pmaxsw      xmm1,xmm3
454
 
455
 movd        eax,xmm1
456
 movzx       eax,al
457
; cmp         [dr_flag],12
458
; je          @f
459
 lea         eax,[eax*3+envmap_cub]
460
; jmp         .fff
461
;@@:
462
 
463
 mov         eax,[eax]
464
 mov        [edi],eax  ;xmm1
465
 psrldq     xmm1,8
466
 movd       eax,xmm1
467
 movzx      eax,al
468
 lea        eax,[eax*3+envmap_cub]
469
 mov        eax,[eax]
470
 mov        [edi+4],eax
471
 
472
 cmp    [dr_flag],12
473
 jl     @f
474
 add    esi,2
475
 add    ebx,2
476
 add    edx,2
477
@@:
478
 
479
 add    edi,8
480
 add    esi,6
481
 add    ebx,6
482
 add    edx,6
483
 sub    ecx,2
484
 jnc    .emb
485
 
486
 
487
 pop    ecx  ;,eax
488
 mov    edi,[screen_ptr]
489
 mov    esi,[Zbuffer_ptr]
490
 cmp    [dr_flag],12
491
 jge    .e
492
@@:
493
 movsd
494
 dec    edi
495
 loop   @b
496
.e:
497
 rep    movsd
498
 
499
end if
500
 
501
ret
502
 
503
;align 16
504
; emboss_bias:
505
;    dw 128, 128, 128, 128, 128, 128, 128, 128
506
 
507
if 0  ; old emb proc
508
 
509
 ;  emboss -  after drawing all,
510
 ;  transfer screen buffer into bump map
511
 ;  and draw two bump triangles
512
 ; *************************************
513
        mov     esi,screen
514
        mov     edi,bumpmap2
515
        mov     ecx,TEXTURE_SIZE/3
516
        cld
517
if  Ext=NON
518
        xor     eax,eax
519
        xor     bh,bh
520
        xor     dh,dh
521
      @@:
522
        lodsb
523
        movzx   bx,al
524
        lodsb
525
        movzx   dx,al
526
        lodsb
527
        add     ax,bx
528
        add     ax,dx
529
      ;  cwd
530
      ;  div     [i3]
531
 ;;       push    ax
532
 ;;       pop     bx
533
 ;;       shr     bx,3
534
 ;;       shr     ax,2
535
 ;;       add     ax,bx
536
 
537
        lea      eax,[eax*5]
538
        shr      ax,4
539
 
540
        stosb
541
        loop    @b
542
else
543
        emms
544
        pxor          mm1,mm1
545
        mov           ebx,0x0000ffff
546
      @@:
547
        movd          mm0,[esi]
548
        punpcklbw     mm0,mm1
549
        movq          mm2,mm0
550
        psrlq         mm2,16
551
        movq          mm3,mm0
552
        psrlq         mm3,32
553
        paddw         mm0,mm2
554
        paddw         mm0,mm3
555
 
556
 
557
        movd          eax,mm0
558
        and           eax,ebx
559
        lea           eax,[eax*5]
560
        shr           ax,4
561
        stosb
562
        add           esi,3
563
        loop          @b
564
 
565
end if
566
        push    ebp
567
 
568
        push    dword 0          ; env coords
569
        push    word 0
570
        push    word SIZE_X
571
        push    word SIZE_Y
572
        push    dword 0
573
        push    dword 0          ; bump coords
574
        push    word SIZE_X
575
        push    word SIZE_Y
576
        push    word 0
577
        mov     eax,SIZE_Y
578
        mov     ebx,SIZE_X*65536+0
579
        xor     ecx,ecx
580
        mov     edx,bumpmap2
581
        mov     esi,envmap
582
        mov     edi,screen
583
        call    bump_triangle
584
 
585
        push    dword SIZE_X shl 16 + SIZE_Y       ; env coords
586
        push    word 0
587
        push    word SIZE_X
588
        push    word SIZE_Y
589
        push    word 0
590
        push    dword SIZE_X shl 16 + SIZE_Y        ; bump coords
591
        push    word 0
592
        push    word SIZE_X
593
        push    word SIZE_Y
594
        push    word 0
595
        mov     eax,SIZE_Y
596
        mov     ebx,SIZE_X * 65536+0
597
        mov     ecx,SIZE_X shl 16 + SIZE_Y
598
        mov     edx,bumpmap2
599
        mov     esi,envmap
600
        mov     edi,screen
601
        call    bump_triangle
602
 
603
        pop     ebp
604
ret
605
end if
606
;********************************EMBOSS DONE*******************************
607
 
608
 
609
generate_object2:  ; torus
610
;in  ax - figure number       2=torus, 3=loop, 4=loop
611
;locals
612
;   counter dw ?
613
;   sin     dd ?
614
;   cos     dd ?
615
;endl
616
.counter equ  word[ebp-2]
617
.sin     equ  dword[ebp-6]
618
.cos     equ  dword[ebp-10]
619
.sin2    equ  dword[ebp-14]
620
.cos2    equ  dword[ebp-18]
621
.piD180m3 equ dword[ebp-22]
622
.cD2      equ word[ebp-24]
623
        push  ebp
624
        mov   ebp,esp
625
        sub   esp,24
626
 
627
        push  ax
628
 
629
        fninit
630
        mov     edi,[points_ptr]
631
        xor     eax,eax
632
                                    ; init seed -> 4   3d points
633
        mov     dword[edi],-1.0     ; x
634
        add     edi,4
635
        stosd                       ; y
636
        stosd                       ; z
637
        mov     dword[edi],-0.9     ; x1
638
        mov     dword[edi+4],0.1    ; y1
639
        add     edi,8
640
        stosd                       ; z1
641
        mov     dword[edi],-0.8
642
        add     edi,4
643
        stosd
644
        stosd
645
        mov     dword[edi],-0.9     ; x3
646
        mov     dword[edi+4],-0.1   ; y3
647
        add     edi,8
648
        stosd                       ; z3
649
        mov     [points_count_var],4
650
 
651
        fld     [piD180]
652
        fidiv   [i3]
653
        fstp    .piD180m3
654
        mov     .cD2,5
655
 
656
        pop     ax
657
        mov     ecx,1
658
        mov     edx,9
659
      .next:                      ; calc angle and rotate seed 4 points
660
        mov     .counter,cx
661
        mov     ebx,[points_ptr]
662
        fld     .piD180m3
663
        fimul   .counter
664
        fld     st
665
        fsincos
666
        fstp    .sin
667
        fstp    .cos
668
        fadd    st,st0
669
        fsincos
670
        fstp    .sin2
671
        fstp    .cos2
672
 
673
      .rotor:                          ; next 4
674
        ; rotary y
675
        fld     dword[ebx]         ; x
676
        fld     .sin
677
        fmul    dword[ebx+8]       ; z * sinbeta
678
        fchs
679
        fld     .cos
680
        fmul    dword[ebx]         ; x * cosbeta
681
        faddp
682
        fstp    dword[edi]         ; new x
683
        fmul    .sin             ; old x * sinbeta
684
        fld     .cos
685
        fmul    dword[ebx+8]       ; z * cosbeta
686
        faddp
687
        dec     dx
688
        or      dx,dx
689
        jnz     @f
690
;        mov     .counter,dx
691
        fld     st
692
        fidiv   [i3]
693
        faddp
694
    @@:
695
        fstp    dword[edi+8]       ; new z
696
        fld     dword[ebx+4]
697
        or      dx,dx
698
        jnz     @f
699
  ;      fld1
700
  ;      faddp
701
;        fld     st
702
        fadd    st,st0
703
        fadd    st,st0
704
;        fxch
705
;        fimul   [i3]
706
;        fsin
707
;        faddp
708
        mov     dx,9
709
    @@:
710
        fstp    dword[edi+4]
711
        ; rotary x
712
        cmp     al,3
713
        jl      .end_rot
714
        fld     dword[edi+4]    ;y
715
        fld     .sin2
716
        fmul    dword[edi+8]    ;z
717
        fld     .cos2
718
        fmul    dword[edi+4]    ;y
719
        faddp
720
        fstp    dword[edi+4]    ; new y
721
        fmul    .sin2       ; sinbeta * old y
722
        fchs
723
        fld     .cos2
724
        fmul    dword[edi+8]
725
        faddp
726
        fstp    dword[edi+8]
727
        ; rotary z
728
        cmp     al,4
729
        jl      .end_rot
730
        fld     dword[edi]      ;x
731
        fld     .sin
732
        fmul    dword[edi+4]    ;y
733
        fld     .cos
734
        fmul    dword[edi]      ;x
735
        faddp
736
        fstp    dword[edi]      ;new x
737
        fmul    .sin       ; sinbeta * old x
738
        fchs
739
        fld     .cos
740
        fmul    dword[edi+4]         ; cosbeta * y
741
        faddp
742
        fstp    dword[edi+4]    ; new y
743
 
744
 
745
 
746
      .end_rot:
747
 
748
        add     edi,12
749
        add     ebx,12
750
        mov     esi,[points_ptr]
751
        add     esi,12*4
752
        cmp     ebx,esi
753
        jl      .rotor
754
 
755
        add     [points_count_var],4
756
        add     cx,18
757
        cmp     cx,(18*21*3)+1
758
        jle     .next
759
 
760
        mov     edi,[triangles_ptr]
761
        mov     eax,4
762
        mov     ebx,4+4
763
        mov     [triangles_count_var],160*3    ;164*3   ;140
764
 
765
        mov     ecx,80*3  ;68
766
      @@:
767
        stosd                 ;----
768
        mov     [edi],ebx      ;    |
769
        add     edi,4         ;    |
770
        inc     eax            ;    |
771
        stosd                 ;    |repeat 4 times
772
 
773
        mov     [edi],ebx      ;    |
774
        inc     ebx
775
        add     edi,4
776
        stosd                 ;    |
777
        mov     [edi],ebx      ;    |
778
        add     edi,4         ;----
779
        loop     @b
780
 
781
 
782
        mov     dword[edi],-1  ; < - end mark
783
        mov       [culling_flag],0
784
 
785
        mov     esp,ebp
786
        pop     ebp
787
 
788
ret
789
generate_object3:  ; heart
790
;locals
791
;   counter dw ?
792
;   sin     dd ?
793
;   cos     dd ?
794
;endl
795
.counter equ  word[ebp-2]
796
.sin     equ  dword[ebp-6]
797
.cos     equ  dword[ebp-10]
798
.sin2    equ  dword[ebp-14]
799
.cos2    equ  dword[ebp-18]
800
.piD180m3 equ dword[ebp-22]
801
.cD2      equ word[ebp-24]
802
        push  ebp
803
        mov   ebp,esp
804
        sub   esp,24
805
 
806
        fninit
807
        mov     edi,[points_ptr]
808
        xor     eax,eax
809
                               ; init seed -> eight   3d points
810
        mov     dword[edi],2.0
811
        add     edi,4
812
        stosd
813
        stosd
814
 
815
        mov     dword[edi],2.0
816
        mov     dword[edi+4],-0.5
817
        add     edi,8
818
        stosd
819
 
820
        mov     dword[edi],1.5
821
        mov     dword[edi+4],-1.5
822
        add     edi,8
823
        stosd
824
        mov     dword[edi],1.0
825
        mov     dword[edi+4],-2.0
826
        add     edi,8
827
        stosd
828
 
829
        stosd
830
        mov     dword[edi],-2.5
831
        add     edi,4
832
        stosd
833
 
834
        mov     [points_count_var],5
835
 
836
        mov     ecx,1
837
      .next:                      ; calc angle and rotate seed 4 points
838
        mov     .counter,cx
839
        mov     ebx,[points_ptr]
840
        fld     [piD180]
841
        fimul   .counter
842
        fsincos
843
        fstp    .sin
844
        fstp    .cos
845
 
846
      .rotor:                          ; next 4
847
        ; rotary y
848
        fld     dword[ebx]         ; x
849
        fld     .sin
850
        fmul    dword[ebx+8]       ; z * sinbeta
851
        fchs
852
        fld     .cos
853
        fmul    dword[ebx]         ; x * cosbeta
854
        faddp
855
        fidiv   [i3]
856
        fstp    dword[edi]         ; new x
857
        fmul    .sin               ; old x * sinbeta
858
        fld     .cos
859
        fmul    dword[ebx+8]       ; z * cosbeta
860
        faddp
861
        fstp    dword[edi+8]       ; new z
862
 
863
        fld     dword[ebx+4]   ;y
864
        fstp    dword[edi+4]
865
 
866
 
867
      .end_rot:
868
 
869
        add     edi,12
870
        add     ebx,12
871
        mov     esi,[points_ptr]
872
        add     esi,12*5
873
        cmp     ebx,esi  ;real_points + (12*5)
874
        jl      .rotor
875
 
876
        add     [points_count_var],5
877
        add     cx,18
878
        cmp     cx,(18*21)+1
879
        jle     .next
880
;last points
881
 
882
        xor     eax,eax
883
 
884
        mov     dword[edi],0.22
885
        mov     dword[edi+4],0.77
886
        mov     dword[edi+8],1.25
887
        add     edi,12
888
 
889
        mov     dword[edi],0.22
890
        mov     dword[edi+4],0.77
891
        mov     dword[edi+8],-1.25
892
        add     edi,12
893
        stosd
894
 
895
        add     [points_count_var],2
896
 
897
; init triangles list
898
 
899
        mov     edi,[triangles_ptr]
900
        mov     eax,5
901
        mov     ebx,5+5
902
        mov     [triangles_count_var],200  ;204
903
 
904
        mov     ecx,100
905
      @@:
906
        stosd                 ;----
907
        mov     [edi],ebx      ;    |
908
        add     edi,4         ;    |
909
        inc     eax            ;    |
910
        stosd                 ;    |repeat
911
 
912
        mov     [edi],ebx      ;    |
913
        inc     ebx
914
        add     edi,4
915
        stosd                 ;    |
916
        mov     [edi],ebx      ;    |
917
        add     edi,4         ;----
918
        loop     @b
919
 
920
        mov     eax,5
921
        mov     ebx,[points_count_var]
922
        sub     ebx,2
923
        mov     dl,2
924
    .nx:
925
        mov     ecx,5
926
        add     [triangles_count_var],ecx
927
    @@:
928
        stosd
929
        add     eax,5
930
        stosd
931
        mov     dword[edi],ebx
932
        add     edi,4
933
        loop    @b
934
 
935
        cmp     dl,1
936
        je      @f
937
 
938
        inc     ebx
939
        jmp     .lab
940
     @@:
941
        dec     ebx
942
     .lab:
943
        mov     ecx,5
944
        add     [triangles_count_var],ecx
945
     @@:
946
        stosd
947
        add     eax,5
948
        stosd
949
        mov     dword[edi],ebx
950
        add     edi,4
951
        loop    @b
952
 
953
        dec     dl
954
        or      dl,dl
955
        jnz     .nx
956
 
957
        sub     eax,25
958
        stosd
959
        sub     eax,50
960
        stosd
961
        mov     dword[edi],ebx
962
        add     edi,4
963
 
964
        stosd
965
        add     eax,50
966
        stosd
967
        inc     ebx
968
        mov     dword[edi],ebx
969
        add     edi,4
970
        add     [triangles_count_var],2
971
 
972
        mov     dword[edi],-1  ; < - end mark
973
        mov     [culling_flag],0
974
 
975
        mov     esp,ebp
976
        pop     ebp
977
 
978
ret
979