Subversion Repositories Kolibri OS

Rev

Rev 8232 | Rev 8719 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8232 Rev 8666
1
do_sinus:
1
do_sinus:
2
   .x      equ  [ebp-8]
2
   .x      equ  [ebp-8]
3
   .y      equ  [ebp-12]
3
   .y      equ  [ebp-12]
4
   .new_y  equ  [ebp-16]
4
   .new_y  equ  [ebp-16]
5
   .temp   equ  [ebp-20]
5
   .temp   equ  [ebp-20]
6
   push    ebp
6
   push    ebp
7
   mov     ebp,esp
7
   mov     ebp,esp
8
   sub     esp,64
8
   sub     esp,64
9
   mov     dword .x,0
9
   mov     dword .x,0
10
   mov     dword .y,0
10
   mov     dword .y,0
11
   mov     esi,[screen_ptr]
11
   mov     esi,[screen_ptr]
12
   mov     edi,[Zbuffer_ptr]
12
   mov     edi,[Zbuffer_ptr]
13
   push    edi
13
   push    edi
14
   ;  clear Zbuffer temporally used as image buffer
14
   ;  clear Zbuffer temporally used as image buffer
15
   movzx   ecx,word[size_x_var]
15
   movzx   ecx,word[size_x_var]
16
   movzx   eax,word[size_y_var]
16
   movzx   eax,word[size_y_var]
17
   imul    ecx,eax  ;SIZE_X*SIZE_Y
17
   imul    ecx,eax  ;SIZE_X*SIZE_Y
18
   xor     eax,eax
18
   xor     eax,eax
19
   cld
19
   cld
20
   rep     stosd
20
   rep     stosd
21
   pop     edi
21
   pop     edi
22
;   movzx   eax,[sinus_flag]
-
 
23
;   mov     edx,10
-
 
24
;   mul     edx
-
 
25
;   mov     [sin_amplitude],eax
-
 
26
;   mov     [sin_frq],eax
-
 
27
   fninit
22
   fninit
28
;if Ext = SSE2
-
 
29
;   movups  xmm1,[const0123]   ; xmm1 - init values
-
 
30
;   mov     eax,0x000000ff
-
 
31
;   movd    xmm2,eax
-
 
32
;   shufps  xmm2,xmm2,0        ; xmm2 - mask value
-
 
33
;   mov     eax,4
-
 
34
;   movd    xmm3,eax
-
 
35
;   shufps  xmm3,xmm3,0
-
 
36
 .again:
23
 .again:
37
if  0
-
 
38
   fild    dword .x
-
 
39
   fidiv   [sin_frq]
-
 
40
   fsin
-
 
41
   fimul   [sin_amplitude]
-
 
42
   fiadd   dword .y
-
 
43
   fistp   dword .new_y
-
 
44
else
-
 
45
   fild    dword .x
24
   fild    dword .x
46
   fmul    [sin_frq]
25
   fmul    [sin_frq]
47
   fistp   dword .temp
26
   fistp   dword .temp
48
   mov     eax, .temp
27
   mov     eax, .temp
49
;   mov     bx, [angle_x]
-
 
50
;   add     bx, [angle_y]
-
 
51
;   movzx   ebx,bx
-
 
52
;   shr     ebx,1       ; change phase
-
 
53
;   add     eax,ebx
-
 
54
 
-
 
55
 
28
 
56
   and     eax, 0x000000ff
29
   and     eax, 0x000000ff
57
 
-
 
58
;   cdq
-
 
59
 ;  mul     [sin_frq]
-
 
60
;   and      eax,0x000000ff
-
 
61
;   and     ax,0x00ff
-
 
62
;   cwde
30
 
63
 
31
 
64
   fld     dword [sin_tab+eax*4]
32
   fld     dword [sin_tab+eax*4]
65
   fimul   dword [sin_amplitude]
33
   fimul   dword [sin_amplitude]
66
   fiadd   dword .y
34
   fiadd   dword .y
67
   fistp   dword .new_y
35
   fistp   dword .new_y
68
end if
36
 
69
   mov     eax,.new_y
37
   mov     eax,.new_y
70
   or      eax,eax
38
   or      eax,eax
71
   jl      .skip
39
   jl      .skip
72
   movzx   ebx,word[size_y_var]
40
   movzx   ebx,word[size_y_var]
73
   cmp     eax,ebx  ;SIZE_Y
41
   cmp     eax,ebx  ;SIZE_Y
74
   jg      .skip
42
   jg      .skip
75
   movzx   edx,word[size_x_var]
43
   movzx   edx,word[size_x_var]
76
   mul     edx
44
   mul     edx
77
;   shl     eax,9
45
;   shl     eax,9
78
   add     eax,dword .x
46
   add     eax,dword .x
79
 
47
 
80
   lea     ebx,[eax*3]
48
   lea     ebx,[eax*3]
81
   cmp     [dr_flag],12 ; 32 bit col cause
49
   cmp     [dr_flag],12 ; 32 bit col cause
82
   jl      @f
50
   jl      @f
83
   add     ebx,eax
51
   add     ebx,eax
84
  @@:
52
  @@:
85
   mov     eax,[esi]
53
   mov     eax,[esi]
86
   mov     [edi+ebx],eax
54
   mov     [edi+ebx],eax
87
 .skip:
55
 .skip:
88
   add     esi,3
56
   add     esi,3
89
   cmp     [dr_flag],12
57
   cmp     [dr_flag],12
90
   jl      @f
58
   jl      @f
91
   inc     esi
59
   inc     esi
92
  @@:
60
  @@:
93
   inc     dword .x
61
   inc     dword .x
94
   movzx   edx,word[size_x_var]
62
   movzx   edx,word[size_x_var]
95
   cmp     dword .x,edx  ;SIZE_X
63
   cmp     dword .x,edx  ;SIZE_X
96
   jl      .again
64
   jl      .again
97
   mov     dword .x,0
65
   mov     dword .x,0
98
   inc     dword .y
66
   inc     dword .y
99
   movzx   edx,word[size_y_var]
67
   movzx   edx,word[size_y_var]
100
   cmp     dword .y,edx   ;SIZE_Y
68
   cmp     dword .y,edx   ;SIZE_Y
101
   jl      .again
69
   jl      .again
102
 
70
 
103
   ; copy from temporary buffer -> Zbuffer to screen
71
   ; copy from temporary buffer -> Zbuffer to screen
104
   mov     esi,[Zbuffer_ptr]
72
   mov     esi,[Zbuffer_ptr]
105
   mov     edi,[screen_ptr]
73
   mov     edi,[screen_ptr]
106
   movzx   ecx,word[size_x_var]
74
   movzx   ecx,word[size_x_var]
107
   movzx   eax,word[size_y_var]
75
   movzx   eax,word[size_y_var]
108
   imul    ecx,eax
76
   imul    ecx,eax
109
   cmp     [dr_flag],12
77
   cmp     [dr_flag],12
110
   jge     @f
78
   jge     @f
111
   lea     ecx,[ecx*3]
79
   lea     ecx,[ecx*3]
112
   shr     ecx,2
80
   shr     ecx,2
113
 ;  mov     ecx,SIZE_X*SIZE_Y*3/4
81
 ;  mov     ecx,SIZE_X*SIZE_Y*3/4
114
  @@:
82
  @@:
115
   cld
83
   cld
116
   rep     movsd
84
   rep     movsd
117
 
85
 
118
 
86
 
119
   mov     esp,ebp
87
   mov     esp,ebp
120
   pop     ebp
88
   pop     ebp
121
ret
89
ret
122
 
90
 
123
 
91
 
124
draw_dots:
92
draw_dots:
125
   mov     esi,[points_translated_ptr]
93
   mov     esi,[points_translated_ptr]
126
   mov     ecx,[points_count_var]
94
   mov     ecx,[points_count_var]
127
 .drw:
95
 .drw:
128
 @@:
96
 @@:
129
   lodsd
97
   lodsd
130
   add     esi,2           ; skip z
98
   add     esi,2           ; skip z
131
   movzx   ebx,ax
99
   movzx   ebx,ax
132
   shr     eax,16          ; bx = x , ax = y
100
   shr     eax,16          ; bx = x , ax = y
133
   or      ax,ax
101
   or      ax,ax
134
   jl      @f
102
   jl      @f
135
   or      bx,bx
103
   or      bx,bx
136
   jl      @f
104
   jl      @f
137
   cmp     ax,[size_y_var]  ;SIZE_Y
105
   cmp     ax,[size_y_var]  ;SIZE_Y
138
   jge     @f
106
   jge     @f
139
   cmp     bx,[size_x_var]  ;SIZE_X
107
   cmp     bx,[size_x_var]  ;SIZE_X
140
   jge     @f
108
   jge     @f
141
   movzx   edx,word[size_x_var]  ;SIZE_X      ; SIZE_X not only power of 2   -> 256,512,...
109
   movzx   edx,word[size_x_var]  ;SIZE_X      ; SIZE_X not only power of 2   -> 256,512,...
142
   mul     edx
110
   mul     edx
143
   add     eax,ebx
111
   add     eax,ebx
144
   mov     edi,[screen_ptr]
112
   mov     edi,[screen_ptr]
145
   lea     eax,[eax*3]
113
   lea     eax,[eax*3]
146
   add     edi,eax
114
   add     edi,eax
147
   xor     eax,eax
115
   xor     eax,eax
148
   not     eax
116
   not     eax
149
   stosd
117
   stosd
150
 @@:
118
 @@:
151
   loop    .drw
119
   loop    .drw
152
 
120
 
153
ret
121
ret
154
 
122
 
155
do_emboss:   ; sse2 version only
123
do_emboss:   ; sse2 version only
156
if Ext >= SSE2
124
if Ext >= SSE2
157
 movzx ecx,[bumps_deep_flag]
125
 movzx ecx,[bumps_deep_flag]
158
 inc   ecx
126
 inc   ecx
159
 call  blur_screen    ;blur n times
127
 call  blur_screen    ;blur n times
160
 
128
 
161
 mov   eax,[size_y_var]  ;load both x, y
129
 mov   eax,[size_y_var]  ;load both x, y
162
 mov   ebx,eax
130
 mov   ebx,eax
163
 shr   ebx,16
131
 shr   ebx,16
164
 cwde
132
 cwde
165
 mul   ebx
133
 mul   ebx
166
 mov   ecx,eax
134
 mov   ecx,eax
167
 sub   ecx,ebx
135
 sub   ecx,ebx
168
 sub   ecx,ebx
136
 sub   ecx,ebx
169
 mov   esi,[screen_ptr]
137
 mov   esi,[screen_ptr]
170
 mov   edi,[Zbuffer_ptr]
138
 mov   edi,[Zbuffer_ptr]
171
 cmp   [dr_flag],12
139
 cmp   [dr_flag],12
172
 jge   @f
140
 jge   @f
173
 lea   ebx,[ebx*3]
141
 lea   ebx,[ebx*3]
174
 jmp   .f
142
 jmp   .f
175
@@:
143
@@:
176
 shl   ebx,2
144
 shl   ebx,2
177
.f:
145
.f:
178
 mov   edx,esi
146
 mov   edx,esi
179
 add   esi,ebx
147
 add   esi,ebx
180
 lea   ebx,[ebx+esi]
148
 lea   ebx,[ebx+esi]
181
 pxor  xmm0,xmm0
149
 pxor  xmm0,xmm0
182
 push  eax
150
 push  eax
183
.emb:
151
.emb:
184
 cmp   [dr_flag],12
152
 cmp   [dr_flag],12
185
 jge   @f
153
 jge   @f
186
 movlps     xmm1,[esi+3]
154
 movlps     xmm1,[esi+3]
187
 movhps     xmm1,[esi+6]
155
 movhps     xmm1,[esi+6]
188
 movlps     xmm2,[esi-3]
156
 movlps     xmm2,[esi-3]
189
 movhps     xmm2,[esi]
157
 movhps     xmm2,[esi]
190
 movlps     xmm3,[ebx]
158
 movlps     xmm3,[ebx]
191
 movhps     xmm3,[ebx+3]
159
 movhps     xmm3,[ebx+3]
192
 movlps     xmm4,[edx]
160
 movlps     xmm4,[edx]
193
 movhps     xmm4,[edx+3]
161
 movhps     xmm4,[edx+3]
194
 jmp        .ff
162
 jmp        .ff
195
@@:
163
@@:
196
 movlps     xmm1,[esi+4]
164
 movlps     xmm1,[esi+4]
197
 movhps     xmm1,[esi+8]
165
 movhps     xmm1,[esi+8]
198
 movlps     xmm2,[esi-4]
166
 movlps     xmm2,[esi-4]
199
 movhps     xmm2,[esi]
167
 movhps     xmm2,[esi]
200
 movlps     xmm3,[ebx]
168
 movlps     xmm3,[ebx]
201
 movhps     xmm3,[ebx+4]
169
 movhps     xmm3,[ebx+4]
202
 movlps     xmm4,[edx]
170
 movlps     xmm4,[edx]
203
 movhps     xmm4,[edx+4]
171
 movhps     xmm4,[edx+4]
204
.ff:
172
.ff:
205
 punpcklbw  xmm1,xmm0
173
 punpcklbw  xmm1,xmm0
206
 punpcklbw  xmm2,xmm0
174
 punpcklbw  xmm2,xmm0
207
 punpcklbw  xmm3,xmm0
175
 punpcklbw  xmm3,xmm0
208
 punpcklbw  xmm4,xmm0
176
 punpcklbw  xmm4,xmm0
209
 psubsw     xmm1,xmm2
177
 psubsw     xmm1,xmm2
210
 paddw      xmm1,[emboss_bias]
178
 paddw      xmm1,[emboss_bias]
211
 psubsw     xmm3,xmm4
179
 psubsw     xmm3,xmm4
212
 paddw      xmm3,[emboss_bias]
180
 paddw      xmm3,[emboss_bias]
213
 pmulhw     xmm1,xmm3
181
 pmulhw     xmm1,xmm3
214
 movaps      xmm7,xmm1
182
 movaps      xmm7,xmm1
215
 movaps      xmm6,xmm1
183
 movaps      xmm6,xmm1
216
 psrlq       xmm7,2*8
184
 psrlq       xmm7,2*8
217
 psrlq       xmm6,4*8
185
 psrlq       xmm6,4*8
218
 pmaxsw      xmm1,xmm7
186
 pmaxsw      xmm1,xmm7
219
 pmaxsw      xmm1,xmm6
187
 pmaxsw      xmm1,xmm6
220
 
188
 
221
if 0
189
if 0
222
 movaps      xmm7,xmm3
190
 movaps      xmm7,xmm3
223
 movaps      xmm6,xmm3
191
 movaps      xmm6,xmm3
224
 psrlq       xmm7,2*8
192
 psrlq       xmm7,2*8
225
 psrlq       xmm6,4*8
193
 psrlq       xmm6,4*8
226
 pmaxsw      xmm3,xmm7
194
 pmaxsw      xmm3,xmm7
227
 pmaxsw      xmm3,xmm6
195
 pmaxsw      xmm3,xmm6
228
end if
196
end if
229
 pmaxsw      xmm1,xmm3
197
 pmaxsw      xmm1,xmm3
230
 
198
 
231
 movd        eax,xmm1
199
 movd        eax,xmm1
232
 movzx       eax,al
200
 movzx       eax,al
233
; cmp         [dr_flag],12
201
; cmp         [dr_flag],12
234
; je          @f
202
; je          @f
235
 lea         eax,[eax*3+envmap_cub]
203
 lea         eax,[eax*3+envmap_cub]
236
; jmp         .fff
204
; jmp         .fff
237
;@@:
205
;@@:
238
 
206
 
239
 mov         eax,[eax]
207
 mov         eax,[eax]
240
 mov        [edi],eax  ;xmm1
208
 mov        [edi],eax  ;xmm1
241
 psrldq     xmm1,8
209
 psrldq     xmm1,8
242
 movd       eax,xmm1
210
 movd       eax,xmm1
243
 movzx      eax,al
211
 movzx      eax,al
244
 lea        eax,[eax*3+envmap_cub]
212
 lea        eax,[eax*3+envmap_cub]
245
 mov        eax,[eax]
213
 mov        eax,[eax]
246
 mov        [edi+4],eax
214
 mov        [edi+4],eax
247
 
215
 
248
 cmp    [dr_flag],12
216
 cmp    [dr_flag],12
249
 jl     @f
217
 jl     @f
250
 add    esi,2
218
 add    esi,2
251
 add    ebx,2
219
 add    ebx,2
252
 add    edx,2
220
 add    edx,2
253
@@:
221
@@:
254
 
222
 
255
 add    edi,8
223
 add    edi,8
256
 add    esi,6
224
 add    esi,6
257
 add    ebx,6
225
 add    ebx,6
258
 add    edx,6
226
 add    edx,6
259
 sub    ecx,2
227
 sub    ecx,2
260
 jnc    .emb
228
 jnc    .emb
261
 
229
 
262
 
230
 
263
 pop    ecx  ;,eax
231
 pop    ecx  ;,eax
264
 mov    edi,[screen_ptr]
232
 mov    edi,[screen_ptr]
265
 mov    esi,[Zbuffer_ptr]
233
 mov    esi,[Zbuffer_ptr]
266
 cmp    [dr_flag],12
234
 cmp    [dr_flag],12
267
 jge    .e
235
 jge    .e
268
@@:
236
@@:
269
 movsd
237
 movsd
270
 dec    edi
238
 dec    edi
271
 loop   @b
239
 loop   @b
272
.e:
240
.e:
273
 rep    movsd
241
 rep    movsd
274
 
242
 
275
end if
243
end if
276
 
244
 
277
ret
245
ret
278
 
-
 
279
;align 16
-
 
280
; emboss_bias:
-
 
281
;    dw 128, 128, 128, 128, 128, 128, 128, 128
-
 
282
 
-
 
283
if 0  ; old emb proc
-
 
284
 
-
 
285
 ;  emboss -  after drawing all,
-
 
286
 ;  transfer screen buffer into bump map
-
 
287
 ;  and draw two bump triangles
-
 
288
 ; *************************************
-
 
289
        mov     esi,screen
-
 
290
        mov     edi,bumpmap2
-
 
291
        mov     ecx,TEXTURE_SIZE/3
-
 
292
        cld
-
 
293
if  Ext=NON
-
 
294
        xor     eax,eax
-
 
295
        xor     bh,bh
-
 
296
        xor     dh,dh
-
 
297
      @@:
-
 
298
        lodsb
-
 
299
        movzx   bx,al
-
 
300
        lodsb
-
 
301
        movzx   dx,al
-
 
302
        lodsb
-
 
303
        add     ax,bx
-
 
304
        add     ax,dx
-
 
305
      ;  cwd
-
 
306
      ;  div     [i3]
-
 
307
 ;;       push    ax
-
 
308
 ;;       pop     bx
-
 
309
 ;;       shr     bx,3
-
 
310
 ;;       shr     ax,2
-
 
311
 ;;       add     ax,bx
-
 
312
 
-
 
313
        lea      eax,[eax*5]
-
 
314
        shr      ax,4
-
 
315
 
-
 
316
        stosb
-
 
317
        loop    @b
-
 
318
else
-
 
319
        emms
-
 
320
        pxor          mm1,mm1
-
 
321
        mov           ebx,0x0000ffff
-
 
322
      @@:
-
 
323
        movd          mm0,[esi]
-
 
324
        punpcklbw     mm0,mm1
-
 
325
        movq          mm2,mm0
-
 
326
        psrlq         mm2,16
-
 
327
        movq          mm3,mm0
-
 
328
        psrlq         mm3,32
-
 
329
        paddw         mm0,mm2
-
 
330
        paddw         mm0,mm3
-
 
331
 
-
 
332
 
-
 
333
        movd          eax,mm0
-
 
334
        and           eax,ebx
-
 
335
        lea           eax,[eax*5]
-
 
336
        shr           ax,4
-
 
337
        stosb
-
 
338
        add           esi,3
-
 
339
        loop          @b
-
 
340
 
-
 
341
end if
-
 
342
        push    ebp
-
 
343
 
-
 
344
        push    dword 0          ; env coords
-
 
345
        push    word 0
-
 
346
        push    word SIZE_X
-
 
347
        push    word SIZE_Y
-
 
348
        push    dword 0
-
 
349
        push    dword 0          ; bump coords
-
 
350
        push    word SIZE_X
-
 
351
        push    word SIZE_Y
-
 
352
        push    word 0
-
 
353
        mov     eax,SIZE_Y
-
 
354
        mov     ebx,SIZE_X*65536+0
-
 
355
        xor     ecx,ecx
-
 
356
        mov     edx,bumpmap2
-
 
357
        mov     esi,envmap
-
 
358
        mov     edi,screen
-
 
359
        call    bump_triangle
-
 
360
 
-
 
361
        push    dword SIZE_X shl 16 + SIZE_Y       ; env coords
-
 
362
        push    word 0
-
 
363
        push    word SIZE_X
-
 
364
        push    word SIZE_Y
-
 
365
        push    word 0
-
 
366
        push    dword SIZE_X shl 16 + SIZE_Y        ; bump coords
-
 
367
        push    word 0
-
 
368
        push    word SIZE_X
-
 
369
        push    word SIZE_Y
-
 
370
        push    word 0
-
 
371
        mov     eax,SIZE_Y
-
 
372
        mov     ebx,SIZE_X * 65536+0
-
 
373
        mov     ecx,SIZE_X shl 16 + SIZE_Y
-
 
374
        mov     edx,bumpmap2
-
 
375
        mov     esi,envmap
-
 
376
        mov     edi,screen
-
 
377
        call    bump_triangle
-
 
378
 
-
 
379
        pop     ebp
-
 
380
ret
246
 
381
end if
247
 
382
;********************************EMBOSS DONE*******************************
248
;********************************EMBOSS DONE*******************************
383
 
249
 
384
 
250
 
385
generate_object2:  ; torus
251
generate_object2:  ; torus
386
;in  ax - figure number       2=torus, 3=loop, 4=loop
252
;in  ax - figure number       2=torus, 3=loop, 4=loop
387
;locals
253
;locals
388
;   counter dw ?
254
;   counter dw ?
389
;   sin     dd ?
255
;   sin     dd ?
390
;   cos     dd ?
256
;   cos     dd ?
391
;endl
257
;endl
392
.counter equ  word[ebp-2]
258
.counter equ  word[ebp-2]
393
.sin     equ  dword[ebp-6]
259
.sin     equ  dword[ebp-6]
394
.cos     equ  dword[ebp-10]
260
.cos     equ  dword[ebp-10]
395
.sin2    equ  dword[ebp-14]
261
.sin2    equ  dword[ebp-14]
396
.cos2    equ  dword[ebp-18]
262
.cos2    equ  dword[ebp-18]
397
.piD180m3 equ dword[ebp-22]
263
.piD180m3 equ dword[ebp-22]
398
.cD2      equ word[ebp-24]
264
.cD2      equ word[ebp-24]
399
        push  ebp
265
        push  ebp
400
        mov   ebp,esp
266
        mov   ebp,esp
401
        sub   esp,24
267
        sub   esp,24
402
 
268
 
403
        push  ax
269
        push  ax
404
 
270
 
405
        fninit
271
        fninit
406
        mov     edi,[points_ptr]
272
        mov     edi,[points_ptr]
407
        xor     eax,eax
273
        xor     eax,eax
408
                                    ; init seed -> 4   3d points
274
                                    ; init seed -> 4   3d points
409
        mov     dword[edi],-1.0     ; x
275
        mov     dword[edi],-1.0     ; x
410
        add     edi,4
276
        add     edi,4
411
        stosd                       ; y
277
        stosd                       ; y
412
        stosd                       ; z
278
        stosd                       ; z
413
        mov     dword[edi],-0.9     ; x1
279
        mov     dword[edi],-0.9     ; x1
414
        mov     dword[edi+4],0.1    ; y1
280
        mov     dword[edi+4],0.1    ; y1
415
        add     edi,8
281
        add     edi,8
416
        stosd                       ; z1
282
        stosd                       ; z1
417
        mov     dword[edi],-0.8
283
        mov     dword[edi],-0.8
418
        add     edi,4
284
        add     edi,4
419
        stosd
285
        stosd
420
        stosd
286
        stosd
421
        mov     dword[edi],-0.9     ; x3
287
        mov     dword[edi],-0.9     ; x3
422
        mov     dword[edi+4],-0.1   ; y3
288
        mov     dword[edi+4],-0.1   ; y3
423
        add     edi,8
289
        add     edi,8
424
        stosd                       ; z3
290
        stosd                       ; z3
425
        mov     [points_count_var],4
291
        mov     [points_count_var],4
426
 
292
 
427
        fld     [piD180]
293
        fld     [piD180]
428
        fidiv   [i3]
294
        fidiv   [i3]
429
        fstp    .piD180m3
295
        fstp    .piD180m3
430
        mov     .cD2,5
296
        mov     .cD2,5
431
 
297
 
432
        pop     ax
298
        pop     ax
433
        mov     ecx,1
299
        mov     ecx,1
434
        mov     edx,9
300
        mov     edx,9
435
      .next:                      ; calc angle and rotate seed 4 points
301
      .next:                      ; calc angle and rotate seed 4 points
436
        mov     .counter,cx
302
        mov     .counter,cx
437
        mov     ebx,[points_ptr]
303
        mov     ebx,[points_ptr]
438
        fld     .piD180m3
304
        fld     .piD180m3
439
        fimul   .counter
305
        fimul   .counter
440
        fld     st
306
        fld     st
441
        fsincos
307
        fsincos
442
        fstp    .sin
308
        fstp    .sin
443
        fstp    .cos
309
        fstp    .cos
444
        fadd    st,st0
310
        fadd    st,st0
445
        fsincos
311
        fsincos
446
        fstp    .sin2
312
        fstp    .sin2
447
        fstp    .cos2
313
        fstp    .cos2
448
 
314
 
449
      .rotor:                          ; next 4
315
      .rotor:                          ; next 4
450
        ; rotary y
316
        ; rotary y
451
        fld     dword[ebx]         ; x
317
        fld     dword[ebx]         ; x
452
        fld     .sin
318
        fld     .sin
453
        fmul    dword[ebx+8]       ; z * sinbeta
319
        fmul    dword[ebx+8]       ; z * sinbeta
454
        fchs
320
        fchs
455
        fld     .cos
321
        fld     .cos
456
        fmul    dword[ebx]         ; x * cosbeta
322
        fmul    dword[ebx]         ; x * cosbeta
457
        faddp
323
        faddp
458
        fstp    dword[edi]         ; new x
324
        fstp    dword[edi]         ; new x
459
        fmul    .sin             ; old x * sinbeta
325
        fmul    .sin             ; old x * sinbeta
460
        fld     .cos
326
        fld     .cos
461
        fmul    dword[ebx+8]       ; z * cosbeta
327
        fmul    dword[ebx+8]       ; z * cosbeta
462
        faddp
328
        faddp
463
        dec     dx
329
        dec     dx
464
        or      dx,dx
330
        or      dx,dx
465
        jnz     @f
331
        jnz     @f
466
;        mov     .counter,dx
332
;        mov     .counter,dx
467
        fld     st
333
        fld     st
468
        fidiv   [i3]
334
        fidiv   [i3]
469
        faddp
335
        faddp
470
    @@:
336
    @@:
471
        fstp    dword[edi+8]       ; new z
337
        fstp    dword[edi+8]       ; new z
472
        fld     dword[ebx+4]
338
        fld     dword[ebx+4]
473
        or      dx,dx
339
        or      dx,dx
474
        jnz     @f
340
        jnz     @f
475
  ;      fld1
341
  ;      fld1
476
  ;      faddp
342
  ;      faddp
477
;        fld     st
343
;        fld     st
478
        fadd    st,st0
344
        fadd    st,st0
479
        fadd    st,st0
345
        fadd    st,st0
480
;        fxch
346
;        fxch
481
;        fimul   [i3]
347
;        fimul   [i3]
482
;        fsin
348
;        fsin
483
;        faddp
349
;        faddp
484
        mov     dx,9
350
        mov     dx,9
485
    @@:
351
    @@:
486
        fstp    dword[edi+4]
352
        fstp    dword[edi+4]
487
        ; rotary x
353
        ; rotary x
488
        cmp     al,3
354
        cmp     al,3
489
        jl      .end_rot
355
        jl      .end_rot
490
        fld     dword[edi+4]    ;y
356
        fld     dword[edi+4]    ;y
491
        fld     .sin2
357
        fld     .sin2
492
        fmul    dword[edi+8]    ;z
358
        fmul    dword[edi+8]    ;z
493
        fld     .cos2
359
        fld     .cos2
494
        fmul    dword[edi+4]    ;y
360
        fmul    dword[edi+4]    ;y
495
        faddp
361
        faddp
496
        fstp    dword[edi+4]    ; new y
362
        fstp    dword[edi+4]    ; new y
497
        fmul    .sin2       ; sinbeta * old y
363
        fmul    .sin2       ; sinbeta * old y
498
        fchs
364
        fchs
499
        fld     .cos2
365
        fld     .cos2
500
        fmul    dword[edi+8]
366
        fmul    dword[edi+8]
501
        faddp
367
        faddp
502
        fstp    dword[edi+8]
368
        fstp    dword[edi+8]
503
        ; rotary z
369
        ; rotary z
504
        cmp     al,4
370
        cmp     al,4
505
        jl      .end_rot
371
        jl      .end_rot
506
        fld     dword[edi]      ;x
372
        fld     dword[edi]      ;x
507
        fld     .sin
373
        fld     .sin
508
        fmul    dword[edi+4]    ;y
374
        fmul    dword[edi+4]    ;y
509
        fld     .cos
375
        fld     .cos
510
        fmul    dword[edi]      ;x
376
        fmul    dword[edi]      ;x
511
        faddp
377
        faddp
512
        fstp    dword[edi]      ;new x
378
        fstp    dword[edi]      ;new x
513
        fmul    .sin       ; sinbeta * old x
379
        fmul    .sin       ; sinbeta * old x
514
        fchs
380
        fchs
515
        fld     .cos
381
        fld     .cos
516
        fmul    dword[edi+4]         ; cosbeta * y
382
        fmul    dword[edi+4]         ; cosbeta * y
517
        faddp
383
        faddp
518
        fstp    dword[edi+4]    ; new y
384
        fstp    dword[edi+4]    ; new y
519
 
385
 
520
 
386
 
521
 
387
 
522
      .end_rot:
388
      .end_rot:
523
 
389
 
524
        add     edi,12
390
        add     edi,12
525
        add     ebx,12
391
        add     ebx,12
526
        mov     esi,[points_ptr]
392
        mov     esi,[points_ptr]
527
        add     esi,12*4
393
        add     esi,12*4
528
        cmp     ebx,esi
394
        cmp     ebx,esi
529
        jl      .rotor
395
        jl      .rotor
530
 
396
 
531
        add     [points_count_var],4
397
        add     [points_count_var],4
532
        add     cx,18
398
        add     cx,18
533
        cmp     cx,(18*21*3)+1
399
        cmp     cx,(18*21*3)+1
534
        jle     .next
400
        jle     .next
535
 
401
 
536
        mov     edi,[triangles_ptr]
402
        mov     edi,[triangles_ptr]
537
        mov     eax,4
403
        mov     eax,4
538
        mov     ebx,4+4
404
        mov     ebx,4+4
539
        mov     [triangles_count_var],160*3    ;164*3   ;140
405
        mov     [triangles_count_var],160*3    ;164*3   ;140
540
 
406
 
541
        mov     ecx,80*3  ;68
407
        mov     ecx,80*3  ;68
542
      @@:
408
      @@:
543
        stosd                 ;----
409
        stosd                 ;----
544
        mov     [edi],ebx      ;    |
410
        mov     [edi],ebx      ;    |
545
        add     edi,4         ;    |
411
        add     edi,4         ;    |
546
        inc     eax            ;    |
412
        inc     eax            ;    |
547
        stosd                 ;    |repeat 4 times
413
        stosd                 ;    |repeat 4 times
548
 
414
 
549
        mov     [edi],ebx      ;    |
415
        mov     [edi],ebx      ;    |
550
        inc     ebx
416
        inc     ebx
551
        add     edi,4
417
        add     edi,4
552
        stosd                 ;    |
418
        stosd                 ;    |
553
        mov     [edi],ebx      ;    |
419
        mov     [edi],ebx      ;    |
554
        add     edi,4         ;----
420
        add     edi,4         ;----
555
        loop     @b
421
        loop     @b
556
 
422
 
557
 
423
 
558
        mov     dword[edi],-1  ; < - end mark
424
        mov     dword[edi],-1  ; < - end mark
559
        mov       [culling_flag],0
425
        mov       [culling_flag],0
560
 
426
 
561
        mov     esp,ebp
427
        mov     esp,ebp
562
        pop     ebp
428
        pop     ebp
563
 
429
 
564
ret
430
ret
565
generate_object3:  ; heart
431
generate_object3:  ; heart
566
;locals
432
;locals
567
;   counter dw ?
433
;   counter dw ?
568
;   sin     dd ?
434
;   sin     dd ?
569
;   cos     dd ?
435
;   cos     dd ?
570
;endl
436
;endl
571
.counter equ  word[ebp-2]
437
.counter equ  word[ebp-2]
572
.sin     equ  dword[ebp-6]
438
.sin     equ  dword[ebp-6]
573
.cos     equ  dword[ebp-10]
439
.cos     equ  dword[ebp-10]
574
.sin2    equ  dword[ebp-14]
440
.sin2    equ  dword[ebp-14]
575
.cos2    equ  dword[ebp-18]
441
.cos2    equ  dword[ebp-18]
576
.piD180m3 equ dword[ebp-22]
442
.piD180m3 equ dword[ebp-22]
577
.cD2      equ word[ebp-24]
443
.cD2      equ word[ebp-24]
578
        push  ebp
444
        push  ebp
579
        mov   ebp,esp
445
        mov   ebp,esp
580
        sub   esp,24
446
        sub   esp,24
581
 
447
 
582
        fninit
448
        fninit
583
        mov     edi,[points_ptr]
449
        mov     edi,[points_ptr]
584
        xor     eax,eax
450
        xor     eax,eax
585
                               ; init seed -> eight   3d points
451
                               ; init seed -> eight   3d points
586
        mov     dword[edi],2.0
452
        mov     dword[edi],2.0
587
        add     edi,4
453
        add     edi,4
588
        stosd
454
        stosd
589
        stosd
455
        stosd
590
 
456
 
591
        mov     dword[edi],2.0
457
        mov     dword[edi],2.0
592
        mov     dword[edi+4],-0.5
458
        mov     dword[edi+4],-0.5
593
        add     edi,8
459
        add     edi,8
594
        stosd
460
        stosd
595
 
461
 
596
        mov     dword[edi],1.5
462
        mov     dword[edi],1.5
597
        mov     dword[edi+4],-1.5
463
        mov     dword[edi+4],-1.5
598
        add     edi,8
464
        add     edi,8
599
        stosd
465
        stosd
600
        mov     dword[edi],1.0
466
        mov     dword[edi],1.0
601
        mov     dword[edi+4],-2.0
467
        mov     dword[edi+4],-2.0
602
        add     edi,8
468
        add     edi,8
603
        stosd
469
        stosd
604
 
470
 
605
        stosd
471
        stosd
606
        mov     dword[edi],-2.5
472
        mov     dword[edi],-2.5
607
        add     edi,4
473
        add     edi,4
608
        stosd
474
        stosd
609
 
475
 
610
        mov     [points_count_var],5
476
        mov     [points_count_var],5
611
 
477
 
612
        mov     ecx,1
478
        mov     ecx,1
613
      .next:                      ; calc angle and rotate seed 4 points
479
      .next:                      ; calc angle and rotate seed 4 points
614
        mov     .counter,cx
480
        mov     .counter,cx
615
        mov     ebx,[points_ptr]
481
        mov     ebx,[points_ptr]
616
        fld     [piD180]
482
        fld     [piD180]
617
        fimul   .counter
483
        fimul   .counter
618
        fsincos
484
        fsincos
619
        fstp    .sin
485
        fstp    .sin
620
        fstp    .cos
486
        fstp    .cos
621
 
487
 
622
      .rotor:                          ; next 4
488
      .rotor:                          ; next 4
623
        ; rotary y
489
        ; rotary y
624
        fld     dword[ebx]         ; x
490
        fld     dword[ebx]         ; x
625
        fld     .sin
491
        fld     .sin
626
        fmul    dword[ebx+8]       ; z * sinbeta
492
        fmul    dword[ebx+8]       ; z * sinbeta
627
        fchs
493
        fchs
628
        fld     .cos
494
        fld     .cos
629
        fmul    dword[ebx]         ; x * cosbeta
495
        fmul    dword[ebx]         ; x * cosbeta
630
        faddp
496
        faddp
631
        fidiv   [i3]
497
        fidiv   [i3]
632
        fstp    dword[edi]         ; new x
498
        fstp    dword[edi]         ; new x
633
        fmul    .sin               ; old x * sinbeta
499
        fmul    .sin               ; old x * sinbeta
634
        fld     .cos
500
        fld     .cos
635
        fmul    dword[ebx+8]       ; z * cosbeta
501
        fmul    dword[ebx+8]       ; z * cosbeta
636
        faddp
502
        faddp
637
        fstp    dword[edi+8]       ; new z
503
        fstp    dword[edi+8]       ; new z
638
 
504
 
639
        fld     dword[ebx+4]   ;y
505
        fld     dword[ebx+4]   ;y
640
        fstp    dword[edi+4]
506
        fstp    dword[edi+4]
641
 
507
 
642
 
508
 
643
      .end_rot:
509
      .end_rot:
644
 
510
 
645
        add     edi,12
511
        add     edi,12
646
        add     ebx,12
512
        add     ebx,12
647
        mov     esi,[points_ptr]
513
        mov     esi,[points_ptr]
648
        add     esi,12*5
514
        add     esi,12*5
649
        cmp     ebx,esi  ;real_points + (12*5)
515
        cmp     ebx,esi  ;real_points + (12*5)
650
        jl      .rotor
516
        jl      .rotor
651
 
517
 
652
        add     [points_count_var],5
518
        add     [points_count_var],5
653
        add     cx,18
519
        add     cx,18
654
        cmp     cx,(18*21)+1
520
        cmp     cx,(18*21)+1
655
        jle     .next
521
        jle     .next
656
;last points
522
;last points
657
 
523
 
658
        xor     eax,eax
524
        xor     eax,eax
659
 
525
 
660
        mov     dword[edi],0.22
526
        mov     dword[edi],0.22
661
        mov     dword[edi+4],0.77
527
        mov     dword[edi+4],0.77
662
        mov     dword[edi+8],1.25
528
        mov     dword[edi+8],1.25
663
        add     edi,12
529
        add     edi,12
664
 
530
 
665
        mov     dword[edi],0.22
531
        mov     dword[edi],0.22
666
        mov     dword[edi+4],0.77
532
        mov     dword[edi+4],0.77
667
        mov     dword[edi+8],-1.25
533
        mov     dword[edi+8],-1.25
668
        add     edi,12
534
        add     edi,12
669
        stosd
535
        stosd
670
 
536
 
671
        add     [points_count_var],2
537
        add     [points_count_var],2
672
 
538
 
673
; init triangles list
539
; init triangles list
674
 
540
 
675
        mov     edi,[triangles_ptr]
541
        mov     edi,[triangles_ptr]
676
        mov     eax,5
542
        mov     eax,5
677
        mov     ebx,5+5
543
        mov     ebx,5+5
678
        mov     [triangles_count_var],200  ;204
544
        mov     [triangles_count_var],200  ;204
679
 
545
 
680
        mov     ecx,100
546
        mov     ecx,100
681
      @@:
547
      @@:
682
        stosd                 ;----
548
        stosd                 ;----
683
        mov     [edi],ebx      ;    |
549
        mov     [edi],ebx      ;    |
684
        add     edi,4         ;    |
550
        add     edi,4         ;    |
685
        inc     eax            ;    |
551
        inc     eax            ;    |
686
        stosd                 ;    |repeat
552
        stosd                 ;    |repeat
687
 
553
 
688
        mov     [edi],ebx      ;    |
554
        mov     [edi],ebx      ;    |
689
        inc     ebx
555
        inc     ebx
690
        add     edi,4
556
        add     edi,4
691
        stosd                 ;    |
557
        stosd                 ;    |
692
        mov     [edi],ebx      ;    |
558
        mov     [edi],ebx      ;    |
693
        add     edi,4         ;----
559
        add     edi,4         ;----
694
        loop     @b
560
        loop     @b
695
 
561
 
696
        mov     eax,5
562
        mov     eax,5
697
        mov     ebx,[points_count_var]
563
        mov     ebx,[points_count_var]
698
        sub     ebx,2
564
        sub     ebx,2
699
        mov     dl,2
565
        mov     dl,2
700
    .nx:
566
    .nx:
701
        mov     ecx,5
567
        mov     ecx,5
702
        add     [triangles_count_var],ecx
568
        add     [triangles_count_var],ecx
703
    @@:
569
    @@:
704
        stosd
570
        stosd
705
        add     eax,5
571
        add     eax,5
706
        stosd
572
        stosd
707
        mov     dword[edi],ebx
573
        mov     dword[edi],ebx
708
        add     edi,4
574
        add     edi,4
709
        loop    @b
575
        loop    @b
710
 
576
 
711
        cmp     dl,1
577
        cmp     dl,1
712
        je      @f
578
        je      @f
713
 
579
 
714
        inc     ebx
580
        inc     ebx
715
        jmp     .lab
581
        jmp     .lab
716
     @@:
582
     @@:
717
        dec     ebx
583
        dec     ebx
718
     .lab:
584
     .lab:
719
        mov     ecx,5
585
        mov     ecx,5
720
        add     [triangles_count_var],ecx
586
        add     [triangles_count_var],ecx
721
     @@:
587
     @@:
722
        stosd
588
        stosd
723
        add     eax,5
589
        add     eax,5
724
        stosd
590
        stosd
725
        mov     dword[edi],ebx
591
        mov     dword[edi],ebx
726
        add     edi,4
592
        add     edi,4
727
        loop    @b
593
        loop    @b
728
 
594
 
729
        dec     dl
595
        dec     dl
730
        or      dl,dl
596
        or      dl,dl
731
        jnz     .nx
597
        jnz     .nx
732
 
598
 
733
        sub     eax,25
599
        sub     eax,25
734
        stosd
600
        stosd
735
        sub     eax,50
601
        sub     eax,50
736
        stosd
602
        stosd
737
        mov     dword[edi],ebx
603
        mov     dword[edi],ebx
738
        add     edi,4
604
        add     edi,4
739
 
605
 
740
        stosd
606
        stosd
741
        add     eax,50
607
        add     eax,50
742
        stosd
608
        stosd
743
        inc     ebx
609
        inc     ebx
744
        mov     dword[edi],ebx
610
        mov     dword[edi],ebx
745
        add     edi,4
611
        add     edi,4
746
        add     [triangles_count_var],2
612
        add     [triangles_count_var],2
747
 
613
 
748
        mov     dword[edi],-1  ; < - end mark
614
        mov     dword[edi],-1  ; < - end mark
749
        mov     [culling_flag],0
615
        mov     [culling_flag],0
750
 
616
 
751
        mov     esp,ebp
617
        mov     esp,ebp
752
        pop     ebp
618
        pop     ebp
753
 
619
 
754
ret
620
ret