Subversion Repositories Kolibri OS

Rev

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

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