Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1245 hidnplayr 1
draw_dots:
2
   mov	   esi,[points_translated_ptr]
3
   movzx   ecx,[points_count_var]
4
 .drw:
5
 @@:
6
   lodsd
7
   add	   esi,2	   ; skip z
8
   movzx   ebx,ax
9
   shr	   eax,16	   ; bx = x , ax = y
10
   or	   ax,ax
11
   jl	   @f
12
   or	   bx,bx
13
   jl	   @f
14
   cmp	   ax,SIZE_Y
15
   jge	   @f
16
   cmp	   bx,SIZE_X
17
   jge	   @f
18
   mov	   edx,SIZE_X	   ; SIZE_X not only power of 2   -> 256,512,...
19
   mul	   edx
20
   add	   eax,ebx
21
   mov	   edi,[screen_ptr]
22
   lea	   eax,[eax*3]
23
   add	   edi,eax
24
   xor	   eax,eax
25
   not	   eax
26
   stosd
27
 @@:
28
   loop    .drw
29
 
30
ret
31
 
32
do_emboss:
33
 ;  emboss -  after drawing all,
34
 ;  transfer screen buffer into bump map
35
 ;  and draw two bump triangles
36
 ; *************************************
37
	mov	esi,screen
38
	mov	edi,bumpmap2
39
	mov	ecx,TEXTURE_SIZE/3
40
	cld
41
if  Ext=NON
42
	xor	eax,eax
43
	xor	bh,bh
44
	xor	dh,dh
45
      @@:
46
	lodsb
47
	movzx	bx,al
48
	lodsb
49
	movzx	dx,al
50
	lodsb
51
	add	ax,bx
52
	add	ax,dx
53
      ;  cwd
54
      ;  div     [i3]
55
 ;;       push    ax
56
 ;;       pop     bx
57
 ;;       shr     bx,3
58
 ;;       shr     ax,2
59
 ;;       add     ax,bx
60
 
61
	lea	 eax,[eax*5]
62
	shr	 ax,4
63
 
64
	stosb
65
	loop	@b
66
else
67
	emms
68
	pxor	      mm1,mm1
69
	mov	      ebx,0x0000ffff
70
      @@:
71
	movd	      mm0,[esi]
72
	punpcklbw     mm0,mm1
73
	movq	      mm2,mm0
74
	psrlq	      mm2,16
75
	movq	      mm3,mm0
76
	psrlq	      mm3,32
77
	paddw	      mm0,mm2
78
	paddw	      mm0,mm3
79
 
80
 
81
	movd	      eax,mm0
82
	and	      eax,ebx
83
	lea	      eax,[eax*5]
84
	shr	      ax,4
85
	stosb
86
	add	      esi,3
87
	loop	      @b
88
 
89
end if
90
	push	ebp
91
 
92
	push	dword 0 	 ; env coords
93
	push	word 0
94
	push	word SIZE_X
95
	push	word SIZE_Y
96
	push	dword 0
97
	push	dword 0 	 ; bump coords
98
	push	word SIZE_X
99
	push	word SIZE_Y
100
	push	word 0
101
	mov	eax,SIZE_Y
102
	mov	ebx,SIZE_X*65536+0
103
	xor	ecx,ecx
104
	mov	edx,bumpmap2
105
	mov	esi,envmap
106
	mov	edi,screen
107
	call	bump_triangle
108
 
109
	push	dword SIZE_X shl 16 + SIZE_Y	   ; env coords
110
	push	word 0
111
	push	word SIZE_X
112
	push	word SIZE_Y
113
	push	word 0
114
	push	dword SIZE_X shl 16 + SIZE_Y	    ; bump coords
115
	push	word 0
116
	push	word SIZE_X
117
	push	word SIZE_Y
118
	push	word 0
119
	mov	eax,SIZE_Y
120
	mov	ebx,SIZE_X * 65536+0
121
	mov	ecx,SIZE_X shl 16 + SIZE_Y
122
	mov	edx,bumpmap2
123
	mov	esi,envmap
124
	mov	edi,screen
125
	call	bump_triangle
126
 
127
	pop	ebp
128
ret
129
;********************************EMBOSS DONE*******************************
130
 
131
 
132
generate_object2:  ; torus
133
;in  ax - figure number       2=torus, 3=loop, 4=loop
134
;locals
135
;   counter dw ?
136
;   sin     dd ?
137
;   cos     dd ?
138
;endl
139
.counter equ  word[ebp-2]
140
.sin	 equ  dword[ebp-6]
141
.cos	 equ  dword[ebp-10]
142
.sin2	 equ  dword[ebp-14]
143
.cos2	 equ  dword[ebp-18]
144
.piD180m3 equ dword[ebp-22]
145
.cD2	  equ word[ebp-24]
146
	push  ebp
147
	mov   ebp,esp
148
	sub   esp,24
149
 
150
	push  ax
151
 
152
	fninit
153
	mov	edi,[points_ptr]
154
	xor	eax,eax
155
				    ; init seed -> 4   3d points
156
	mov	dword[edi],-1.0     ; x
157
	add	edi,4
158
	stosd			    ; y
159
	stosd			    ; z
160
	mov	dword[edi],-0.9     ; x1
161
	mov	dword[edi+4],0.1    ; y1
162
	add	edi,8
163
	stosd			    ; z1
164
	mov	dword[edi],-0.8
165
	add	edi,4
166
	stosd
167
	stosd
168
	mov	dword[edi],-0.9     ; x3
169
	mov	dword[edi+4],-0.1   ; y3
170
	add	edi,8
171
	stosd			    ; z3
172
	mov	[points_count_var],4
173
 
174
	fld	[piD180]
175
	fidiv	[i3]
176
	fstp	.piD180m3
177
	mov	.cD2,5
178
 
179
	pop	ax
180
	mov	ecx,1
181
	mov	edx,9
182
      .next:			  ; calc angle and rotate seed 4 points
183
	mov	.counter,cx
184
	mov	ebx,[points_ptr]
185
	fld	.piD180m3
186
	fimul	.counter
187
	fld	st
188
	fsincos
189
	fstp	.sin
190
	fstp	.cos
191
	fadd	st,st0
192
	fsincos
193
	fstp	.sin2
194
	fstp	.cos2
195
 
196
      .rotor:			       ; next 4
197
	; rotary y
198
	fld	dword[ebx]	   ; x
199
	fld	.sin
200
	fmul	dword[ebx+8]	   ; z * sinbeta
201
	fchs
202
	fld	.cos
203
	fmul	dword[ebx]	   ; x * cosbeta
204
	faddp
205
	fstp	dword[edi]	   ; new x
206
	fmul	.sin		 ; old x * sinbeta
207
	fld	.cos
208
	fmul	dword[ebx+8]	   ; z * cosbeta
209
	faddp
210
	dec	dx
211
	or	dx,dx
212
	jnz	@f
213
;        mov     .counter,dx
214
	fld	st
215
	fidiv	[i3]
216
	faddp
217
    @@:
218
	fstp	dword[edi+8]	   ; new z
219
	fld	dword[ebx+4]
220
	or	dx,dx
221
	jnz	@f
222
  ;      fld1
223
  ;      faddp
224
;        fld     st
225
	fadd	st,st0
226
	fadd	st,st0
227
;        fxch
228
;        fimul   [i3]
229
;        fsin
230
;        faddp
231
	mov	dx,9
232
    @@:
233
	fstp	dword[edi+4]
234
	; rotary x
235
	cmp	al,3
236
	jl	.end_rot
237
	fld	dword[edi+4]	;y
238
	fld	.sin2
239
	fmul	dword[edi+8]	;z
240
	fld	.cos2
241
	fmul	dword[edi+4]	;y
242
	faddp
243
	fstp	dword[edi+4]	; new y
244
	fmul	.sin2	    ; sinbeta * old y
245
	fchs
246
	fld	.cos2
247
	fmul	dword[edi+8]
248
	faddp
249
	fstp	dword[edi+8]
250
	; rotary z
251
	cmp	al,4
252
	jl	.end_rot
253
	fld	dword[edi]	;x
254
	fld	.sin
255
	fmul	dword[edi+4]	;y
256
	fld	.cos
257
	fmul	dword[edi]	;x
258
	faddp
259
	fstp	dword[edi]	;new x
260
	fmul	.sin	   ; sinbeta * old x
261
	fchs
262
	fld	.cos
263
	fmul	dword[edi+4]	     ; cosbeta * y
264
	faddp
265
	fstp	dword[edi+4]	; new y
266
 
267
 
268
 
269
      .end_rot:
270
 
271
	add	edi,12
272
	add	ebx,12
273
	mov	esi,[points_ptr]
274
	add	esi,12*4
275
	cmp	ebx,esi
276
	jl	.rotor
277
 
278
	add	[points_count_var],4
279
	add	cx,18
280
	cmp	cx,(18*21*3)+1
281
	jle	.next
282
 
283
	mov	edi,[triangles_ptr]
284
	mov	ax,4
285
	mov	bx,4+4
286
	mov	[triangles_count_var],164*3   ;140
287
 
288
	mov	cx,80*3  ;68
289
      @@:
290
	stosw		      ;----
291
	mov	[edi],bx      ;    |
292
	add	edi,2	      ;    |
293
	inc	ax	      ;    |
294
	stosw		      ;    |repeat 4 times
295
 
296
	mov	[edi],bx      ;    |
297
	inc	bx
298
	add	edi,2
299
	stosw		      ;    |
300
	mov	[edi],bx      ;    |
301
	add	edi,2	      ;----
302
	loop	 @b
303
 
304
 
305
	mov	dword[edi],-1  ; < - end mark
306
	mov	  [culling_flag],0
307
 
308
	mov	esp,ebp
309
	pop	ebp
310
 
311
ret
312
 
313
 
314
generate_object3:  ; heart
315
;locals
316
;   counter dw ?
317
;   sin     dd ?
318
;   cos     dd ?
319
;endl
320
.counter equ  word[ebp-2]
321
.sin	 equ  dword[ebp-6]
322
.cos	 equ  dword[ebp-10]
323
.sin2	 equ  dword[ebp-14]
324
.cos2	 equ  dword[ebp-18]
325
.piD180m3 equ dword[ebp-22]
326
.cD2	  equ word[ebp-24]
327
	push  ebp
328
	mov   ebp,esp
329
	sub   esp,24
330
 
331
	fninit
332
	mov	edi,[points_ptr]
333
	xor	eax,eax
334
			       ; init seed -> eight   3d points
335
	mov	dword[edi],2.0
336
	add	edi,4
337
	stosd
338
	stosd
339
 
340
	mov	dword[edi],2.0
341
	mov	dword[edi+4],-0.5
342
	add	edi,8
343
	stosd
344
 
345
	mov	dword[edi],1.5
346
	mov	dword[edi+4],-1.5
347
	add	edi,8
348
	stosd
349
	mov	dword[edi],1.0
350
	mov	dword[edi+4],-2.0
351
	add	edi,8
352
	stosd
353
 
354
	stosd
355
	mov	dword[edi],-2.5
356
	add	edi,4
357
	stosd
358
 
359
	mov	[points_count_var],5
360
 
361
	mov	ecx,1
362
      .next:			  ; calc angle and rotate seed 4 points
363
	mov	.counter,cx
364
	mov	ebx,[points_ptr]
365
	fld	[piD180]
366
	fimul	.counter
367
	fsincos
368
	fstp	.sin
369
	fstp	.cos
370
 
371
      .rotor:			       ; next 4
372
	; rotary y
373
	fld	dword[ebx]	   ; x
374
	fld	.sin
375
	fmul	dword[ebx+8]	   ; z * sinbeta
376
	fchs
377
	fld	.cos
378
	fmul	dword[ebx]	   ; x * cosbeta
379
	faddp
380
	fidiv	[i3]
381
	fstp	dword[edi]	   ; new x
382
	fmul	.sin		   ; old x * sinbeta
383
	fld	.cos
384
	fmul	dword[ebx+8]	   ; z * cosbeta
385
	faddp
386
	fstp	dword[edi+8]	   ; new z
387
 
388
	fld	dword[ebx+4]   ;y
389
	fstp	dword[edi+4]
390
 
391
 
392
      .end_rot:
393
 
394
	add	edi,12
395
	add	ebx,12
396
	mov	esi,[points_ptr]
397
	add	esi,12*5
398
	cmp	ebx,esi  ;real_points + (12*5)
399
	jl	.rotor
400
 
401
	add	[points_count_var],5
402
	add	cx,18
403
	cmp	cx,(18*21)+1
404
	jle	.next
405
;last points
406
 
407
	xor	eax,eax
408
 
409
	mov	dword[edi],0.22
410
	mov	dword[edi+4],0.77
411
	mov	dword[edi+8],1.25
412
	add	edi,12
413
 
414
	mov	dword[edi],0.22
415
	mov	dword[edi+4],0.77
416
	mov	dword[edi+8],-1.25
417
	add	edi,12
418
	stosd
419
 
420
	add	[points_count_var],2
421
 
422
; init triangles list
423
 
424
	mov	edi,[triangles_ptr]
425
	mov	ax,5
426
	mov	bx,5+5
427
	mov	[triangles_count_var],204
428
 
429
	mov	cx,100
430
      @@:
431
	stosw		      ;----
432
	mov	[edi],bx      ;    |
433
	add	edi,2	      ;    |
434
	inc	ax	      ;    |
435
	stosw		      ;    |repeat
436
 
437
	mov	[edi],bx      ;    |
438
	inc	bx
439
	add	edi,2
440
	stosw		      ;    |
441
	mov	[edi],bx      ;    |
442
	add	edi,2	      ;----
443
	loop	 @b
444
 
445
	mov	ax,5
446
	mov	bx,[points_count_var]
447
	sub	bx,2
448
	mov	dl,2
449
    .nx:
450
	mov	cx,5
451
	add	[triangles_count_var],cx
452
    @@:
453
	stosw
454
	add	ax,5
455
	stosw
456
	mov	word[edi],bx
457
	add	edi,2
458
	loop	@b
459
 
460
	cmp	dl,1
461
	je	@f
462
 
463
	inc	bx
464
	jmp	.lab
465
     @@:
466
	dec	bx
467
     .lab:
468
	mov	cx,5
469
	add	[triangles_count_var],cx
470
     @@:
471
	stosw
472
	add	ax,5
473
	stosw
474
	mov	word[edi],bx
475
	add	edi,2
476
	loop	@b
477
 
478
	dec	dl
479
	or	dl,dl
480
	jnz	.nx
481
 
482
	sub	ax,25
483
	stosw
484
	sub	ax,50
485
	stosw
486
	mov	word[edi],bx
487
	add	edi,2
488
 
489
	stosw
490
	add	ax,50
491
	stosw
492
	inc	bx
493
	mov	word[edi],bx
494
	add	edi,2
495
	add	[triangles_count_var],2
496
 
497
	mov	dword[edi],-1  ; < - end mark
498
	mov	[culling_flag],0
499
 
500
	mov	esp,ebp
501
	pop	ebp
502
 
503
ret