Subversion Repositories Kolibri OS

Rev

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

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