Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
31 halyavin 1
;
2
; 3D POLYGONAL CUBE - ASCL
3
;
4
; Pavlushin Evgeni
5
; mail: waptap@mail.ru       site: www.deck4.narod.ru
6
;
7
; Create on base 3D test sample
8
; Mikolaj Felix mfelix@polbox.com
9
;
10
 
11
use32
12
               org     0x0
13
               db     'MENUET01'              ; 8 byte id
14
               dd     0x01                    ; header version
15
               dd     START                   ; start of code
16
               dd     I_END                   ; size of image
17
               dd     0x30000                  ; memory for app
18
               dd     0x30000                  ; esp
19
               dd     0x0 , 0x0               ; I_Param , I_Icon
20
 
21
MAX_POINTS equ 8
22
MAX_TRIANGLES equ 12
23
SCREEN_X equ 320
24
SCREEN_Y equ 200
25
 
26
include 'lang.inc'
485 heavyiron 27
include '..\..\..\macros.inc'
625 diamond 28
;purge mov
31 halyavin 29
include 'ascl.inc'
30
include 'ascgl.inc'
485 heavyiron 31
 
31 halyavin 32
START:
625 diamond 33
init_sin_cos:
34
	finit
35
	fldz
36
	xor edi,edi
37
	mov ecx,512
38
isc_make:
39
	fld st0
40
	fsincos
41
	fmul [fixed_point_const]
42
	fistp word [cos_table+edi]
43
	fmul [fixed_point_const]
44
	fistp word [sin_table+edi]
45
 
46
	fadd [inc_angle]
47
 
48
	add edi,2
49
	loop isc_make
50
	fstp st0
51
red:
31 halyavin 52
    call draw_window
53
 
54
still:
55
    mov eax,11
485 heavyiron 56
    mcall
31 halyavin 57
 
58
    dec eax
59
;    cmp  eax,1                  ; window redraw request ?
60
    jz   red
61
    dec eax
62
;    cmp  eax,2                  ; key in buffer ?
63
    jz   key
64
    dec eax
65
;    cmp  eax,3                  ; button in buffer ?
66
    jz   button
67
 
2205 leency 68
    fps  220,9,cl_White,cl_Black
31 halyavin 69
 
70
main_loop:
71
 
72
	mov esi,object
73
	mov edi,object_rotated
74
	mov ecx,MAX_POINTS*3
75
	cld
76
	rep movsw
77
 
78
	mov esi,angle_x
79
	mov edi,object_rotated
80
	mov ecx,MAX_POINTS
81
	call rotate_points
82
 
83
	mov esi,object_rotated
84
	mov edi,object_translated
85
	mov ecx,MAX_POINTS
86
	call translate_points
87
 
88
	call draw_faces
89
 
90
	call clear_screen_buffer
91
 
92
	add [angle_x],2
93
	add [angle_y],3
94
	add [angle_z],1
95
 
96
     jmp still
97
 
98
key:
99
     mov eax,2
485 heavyiron 100
     mcall
31 halyavin 101
     jmp still
102
button:
103
     mov eax,17
485 heavyiron 104
     mcall
31 halyavin 105
     cmp ah,1
106
     jne still
107
exit:
108
     mov eax,-1
485 heavyiron 109
     mcall
31 halyavin 110
 
111
;Draw window
112
draw_window:
2205 leency 113
    mcall 12, 1 ;Start window redraw
31 halyavin 114
 
115
    mov eax,0   ;Draw window
2205 leency 116
    mov ebx,100*65536+(SCREEN_X+9)  ;x start*65536+x size
31 halyavin 117
    mov ecx,100*65536+(SCREEN_Y+26) ;y start*65536+y size
2016 leency 118
    mov edx,0x54000000         ;0x03 use skinned window
485 heavyiron 119
    mov edi,title
120
    mcall
31 halyavin 121
 
2205 leency 122
    mcall 12, 2 ;End window redraw
123
 
31 halyavin 124
    ret
125
 
2205 leency 126
title db '3D Cube Sample',0
31 halyavin 127
 
128
 
129
; Draw faces procedure
130
 
131
draw_faces:
132
 
133
	mov esi,link
134
	mov ecx,MAX_TRIANGLES
135
df_draw:
136
	push ecx
137
	mov ecx,3
138
	mov edi,@@tx1 ;bp
139
df_get_point:
625 diamond 140
	movzx	ebx, byte [esi]
141
	movzx	eax, word [object_translated + ebx*4]
142
	stosd
143
	movzx	eax, word [object_translated + ebx*4 + 2]
144
	stosd
31 halyavin 145
	inc esi
146
	dec ecx
147
	jnz df_get_point
148
 
625 diamond 149
	mov eax,[@@ty1]
150
	sub eax,[@@ty3]
151
	mov ebx,[@@tx2]
152
	sub ebx,[@@tx1]
153
	imul ebx
154
	push eax
155
	mov eax,[@@tx1]
156
	sub eax,[@@tx3]
157
	mov ebx,[@@ty2]
158
	sub ebx,[@@ty1]
159
	imul ebx
31 halyavin 160
	pop ebx
625 diamond 161
	sub ebx,eax
31 halyavin 162
	jge df_next
163
 
625 diamond 164
	movzx	eax, byte [esi]
31 halyavin 165
 
625 diamond 166
	mov  	[@@xcol], eax
31 halyavin 167
 
168
	call filled_triangle
169
df_next:
625 diamond 170
	inc esi
31 halyavin 171
	pop ecx
172
	dec ecx
173
	jnz df_draw
174
	ret
175
 
176
;modify
177
;include graphlib.asm
178
 
179
clear_screen_buffer:
180
 
181
;outscrbuf
182
 mov ebx,scrbuf
183
 mov ecx,SCREEN_X*65536+SCREEN_Y
184
 mov edx,5*65536+22
625 diamond 185
 mov eax,7
485 heavyiron 186
 mcall
31 halyavin 187
 
188
;White background
189
 mov edi,scrbuf
190
 mov ecx,(SCREEN_X*SCREEN_Y*3)/4
191
 mov eax,0xffffffff
192
 cld
193
 rep stosd
194
 
195
	ret
196
 
197
;include triangle.asm
198
; Mikolaj Felix 14/5/2001
199
; mfelix@polbox.com
200
 
201
;filled trangle procedure
202
 
625 diamond 203
align 4
204
@@tx1  dd 0
205
@@ty1  dd 0
206
@@tx2  dd 0
207
@@ty2  dd 0
208
@@tx3  dd 0
209
@@ty3  dd 0
210
@@xcol dd 0
31 halyavin 211
 
625 diamond 212
@@dx12 dd 0
213
@@dx13 dd 0
214
@@dx23 dd 0
31 halyavin 215
 
216
filled_triangle:
217
 
625 diamond 218
 mov eax,[@@xcol]  ;trnsforming color
31 halyavin 219
 mov bl,al        ;byte bbbggrrx
220
 mov dl,al        ;to 3 byte
221
 mov dh,al        ;bbbxxxxx ggxxxxxx rrxxxxxx
222
 and dh,00000001b
223
 
224
 and al,11100000b
225
 and bl,00011000b
226
 and dl,00000110b
227
 shl bl,3
228
 shl dl,5
229
 
230
 cmp dh,1
231
 jne no_bitup
232
 or  al,00011111b
233
 or  bl,00111111b
234
 or  dl,00111111b
235
no_bitup:
236
 
237
 shl eax,8 ;puck colors
238
 mov al,bl
239
 shl eax,8
240
 mov al,dl
241
 mov dword [@@rgb],eax
242
 
625 diamond 243
	mov eax,[@@ty1]
244
	cmp eax,[@@ty3]
31 halyavin 245
	jb ft_check1
246
 
625 diamond 247
	xchg eax,[@@ty3]
248
	mov [@@ty1],eax
31 halyavin 249
 
625 diamond 250
	mov eax,[@@tx1]
251
	xchg eax,[@@tx3]
252
	mov [@@tx1],eax
31 halyavin 253
ft_check1:
625 diamond 254
	mov eax,[@@ty2]
255
	cmp eax,[@@ty3]
31 halyavin 256
	jb ft_check2
257
 
625 diamond 258
	xchg eax,[@@ty3]
259
	mov [@@ty2],eax
31 halyavin 260
 
625 diamond 261
	mov eax,[@@tx2]
262
	xchg eax,[@@tx3]
263
	mov [@@tx2],eax
31 halyavin 264
ft_check2:
625 diamond 265
	mov eax,[@@ty1]
266
	cmp eax,[@@ty2]
31 halyavin 267
	jb ft_check3
268
 
625 diamond 269
	xchg eax,[@@ty2]
270
	mov [@@ty1],eax
31 halyavin 271
 
625 diamond 272
	mov eax,[@@tx1]
273
	xchg eax,[@@tx2]
274
	mov [@@tx1],eax
31 halyavin 275
ft_check3:
276
 
625 diamond 277
	mov ebx,[@@ty2]
278
	sub ebx,[@@ty1]
31 halyavin 279
	jnz ft_dx12_make
280
 
625 diamond 281
	mov [@@dx12],dword 0
31 halyavin 282
	jmp ft_dx12_done
283
ft_dx12_make:
625 diamond 284
	mov eax,[@@tx2]
285
	sub eax,[@@tx1]
286
	shl eax,7
287
	cdq
288
	idiv ebx
289
	mov [@@dx12],eax			; dx12 = (x2-x1)/(y2-y1)
31 halyavin 290
ft_dx12_done:
291
 
625 diamond 292
	mov ebx,[@@ty3]
293
	sub ebx,[@@ty1]
31 halyavin 294
	jnz ft_dx13_make
295
 
625 diamond 296
	mov [@@dx13],dword 0
31 halyavin 297
	jmp ft_dx13_done
298
ft_dx13_make:
625 diamond 299
	mov eax,[@@tx3]
300
	sub eax,[@@tx1]
301
	shl eax,7
302
	cdq
303
	idiv ebx
304
	mov [@@dx13],eax			; dx13 = (x3-x1)/(y3-y1)
31 halyavin 305
ft_dx13_done:
306
 
625 diamond 307
	mov ebx,[@@ty3]
308
	sub ebx,[@@ty2]
31 halyavin 309
	jnz ft_dx23_make
310
 
625 diamond 311
	mov [@@dx23],dword 0
31 halyavin 312
	jmp ft_dx23_done
313
ft_dx23_make:
625 diamond 314
	mov eax,[@@tx3]
315
	sub eax,[@@tx2]
316
	shl eax,7
317
	cdq
318
	idiv ebx
319
	mov [@@dx23],eax			; dx23 = (x3-x2)/(y3-y2)
31 halyavin 320
ft_dx23_done:
321
 
625 diamond 322
	mov eax,[@@tx1]
323
	shl eax,7
324
	mov ebx,eax
31 halyavin 325
 
625 diamond 326
	mov ecx,[@@ty1]
31 halyavin 327
ft_loop1:
328
 
329
 pushad
330
 
625 diamond 331
	mov [@@ly],ecx
332
	mov edx,ebx
333
	shr edx,7
334
	mov [@@lx2],edx
335
	mov edx,eax
336
	shr edx,7
337
	mov [@@lx1],edx
338
	mov eax,[@@xcol]
339
 mov [@@lcol],eax
31 halyavin 340
 call horizontal_line
341
 
342
 popad
343
 
625 diamond 344
	add eax,[@@dx13]
345
	add ebx,[@@dx12]
346
	inc ecx
347
	cmp ecx,[@@ty2]
31 halyavin 348
	jb ft_loop1
349
 
350
 
625 diamond 351
	mov ebx,[@@tx2]
352
	shl ebx,7
353
	mov ecx,[@@ty2]
31 halyavin 354
ft_loop2:
355
 
356
 pushad
357
 
625 diamond 358
	mov [@@ly],ecx
359
	mov edx,ebx
360
	shr edx,7
361
	mov [@@lx2],edx
362
	mov edx,eax
363
	shr edx,7
364
	mov [@@lx1],edx
365
 mov eax,[@@xcol]
366
 mov [@@lcol],eax
31 halyavin 367
	call horizontal_line
368
 
369
 popad
370
 
625 diamond 371
	add eax,[@@dx13]
372
	add ebx,[@@dx23]
31 halyavin 373
	inc ecx
625 diamond 374
	cmp ecx,[@@ty3]
31 halyavin 375
	jb ft_loop2
376
 
377
	ret
378
 
379
;horizontal line subproc
380
 
625 diamond 381
align 4
382
@@lx1  dd 0
383
@@lx2  dd 0
384
@@ly   dd 0
385
@@lcol dd 0
31 halyavin 386
 
387
@@rgb  dd 0
388
 
389
horizontal_line:
390
 
625 diamond 391
 mov ecx,[@@lx1]
392
 sub ecx,[@@lx2]
31 halyavin 393
 ja  x12
394
 je  ext
395
; ret
625 diamond 396
 neg ecx
31 halyavin 397
 mov edi,3
398
 jmp xx
399
x12:
400
 mov edi,-3
401
 jmp xx
402
ext:
403
 mov ecx,-1 ;1
404
; sub ebp,3
405
xx:
625 diamond 406
 mov eax,[@@ly]
31 halyavin 407
 mov ebx,SCREEN_X ;320
408
 mul ebx
625 diamond 409
 add eax,[@@lx1]
410
 lea ebp,[eax*3-3]	; for delete white dots
31 halyavin 411
 add ecx,2
412
loo:
413
 
414
 mov eax,dword [@@rgb]
415
 mov bl,al
416
 shr eax,8 ;puck colors
417
 
418
 mov byte [scrbuf+ebp],ah
419
 mov byte [scrbuf+ebp+1],al
420
 mov byte [scrbuf+ebp+2],bl
421
 add ebp,edi
422
 dec ecx
423
 jnz loo
424
 
425
	ret
426
 
427
;include fixed3d.asm
428
; Mikolaj Felix 25/5/2001
429
; mfelix@polbox.com
430
 
431
;------------------------------------------------------------
432
;	ds:si	- offset to angles
433
;	ds:di	- offset to 3d points
434
;	cx	- number of points
435
;------------------------------------------------------------
436
 
437
@@sin_x dw 0
438
@@cos_x dw 0
439
@@sin_y dw 0
440
@@cos_y dw 0
441
@@sin_z dw 0
442
@@cos_z dw 0
443
 
444
@@px equ word [edi]
445
@@py equ word [edi+2]
446
@@pz equ word [edi+4]
447
 
448
rotate_points:
449
 
450
 push edi
451
	mov edi,@@sin_x
452
	mov edx,3
453
rp_sin_cos:
625 diamond 454
	mov ebx, [esi]
455
	and ebx,511
456
	mov ax,word [sin_table+ebx*2]
31 halyavin 457
	mov word [edi],ax
625 diamond 458
	mov ax,word [cos_table+ebx*2]
31 halyavin 459
	mov word [edi+2],ax
460
 
461
	add esi,2
462
	add edi,4
463
	dec edx
464
	jnz rp_sin_cos
465
	pop edi
466
 
467
rp_rotate:
468
 
469
	; rotate around x-axis
470
 
471
	mov ax,@@py
472
	imul [@@cos_x]
473
	mov bx,ax
474
	mov si,dx
475
 
476
	mov ax,@@pz
477
	imul [@@sin_x]
478
	sub bx,ax
479
	sbb si,dx
480
	shrd bx,si,14
481
	push bx
482
 
483
	mov ax,@@py
484
	imul [@@sin_x]
485
	mov bx,ax
486
	mov si,dx
487
 
488
	mov ax,@@pz
489
	imul [@@cos_x]
490
	add bx,ax
491
	adc si,dx
492
	shrd bx,si,14
493
 
494
	pop @@py
495
	mov @@pz,bx
496
 
497
	; rotate around y-axis
498
 
499
	mov ax,@@px
500
	imul [@@cos_y]
501
	mov bx,ax
502
	mov si,dx
503
 
504
	mov ax,@@pz
505
	imul [@@sin_y]
506
	sub bx,ax
507
	sbb si,dx
508
	shrd bx,si,14
509
	push bx
510
 
511
	mov ax,@@px
512
	imul [@@sin_y]
513
	mov bx,ax
514
	mov si,dx
515
 
516
	mov ax,@@pz
517
	imul [@@cos_y]
518
	add bx,ax
519
	adc si,dx
520
	shrd bx,si,14
521
 
522
	pop @@px
523
	mov @@pz,bx
524
 
525
	; rotate around z-axis
526
 
527
	mov ax,@@px
528
	imul [@@cos_z]
529
	mov bx,ax
530
	mov si,dx
531
 
532
	mov ax,@@py
533
	imul [@@sin_z]
534
	sub bx,ax
535
	sbb si,dx
536
	shrd bx,si,14
537
	push bx
538
 
539
	mov ax,@@px
540
	imul [@@sin_z]
541
	mov bx,ax
542
	mov si,dx
543
 
544
	mov ax,@@py
545
	imul [@@cos_z]
546
	add bx,ax
547
	adc si,dx
548
	shrd bx,si,14
549
 
550
	pop @@px
551
	mov @@py,bx
552
 
553
	add edi,6
554
	dec ecx
555
	jnz rp_rotate
556
 
557
	ret
558
 
559
;------------------------------------------------------------
560
;	ds:si	- offset to 3d points
561
;	es:di	- offset to 2d points
562
;	cx	- number of points
563
;------------------------------------------------------------
564
 
565
 mx dw 0
566
 my dw 0
567
 
568
translate_points:
569
 pushad
570
 mov eax,37
571
 mov ebx,1
485 heavyiron 572
 mcall
31 halyavin 573
 mov ebx,eax
574
 shr eax,16
575
 and ebx,0xffff
576
 cmp ax,SCREEN_X
577
 jna x_n
578
 mov ax,0 ;SCREEN_X
579
x_n:
580
 cmp bx,SCREEN_Y
581
 jna y_n
582
 mov bx,0 ;SCREEN_Y
583
y_n:
584
 mov [mx],ax
585
 mov [my],bx
586
 popad
587
 
625 diamond 588
	movzx ebx,word [esi+4]
31 halyavin 589
 mov ax,[my]
590
 cmp ax,0
591
 jng no_m
592
 shl ax,3
593
 add bx,ax
594
no_m:
595
 add bx,256  ; Z factor (zoom)
596
 
625 diamond 597
 	movsx eax,word [esi]
598
	shl eax,8
599
	cdq
600
	idiv ebx
601
	add eax,(SCREEN_X/2) ;160         ;X factor (center X)
31 halyavin 602
	stosw
603
 
625 diamond 604
	movsx eax,word [esi+2]
605
	shl eax,8
606
	cdq
607
	idiv ebx
608
	add eax,(SCREEN_Y/2) ;100         ;Y factor (center Y)
31 halyavin 609
	stosw
610
 
611
	add esi,6
612
	dec ecx
613
	jnz translate_points
614
	ret
615
 
616
fixed_point_const dd 16384.0
617
inc_angle dd 0.01227184630309			; pi/256
618
 
619
angle_x dw 0
620
angle_y dw 0
621
angle_z dw 0
622
 
623
object	dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50
624
      	dw -50,-50, 50, 50,-50, 50, 50,50, 50, -50,50, 50
625
 
626
link:
627
 db  0,1,2,10000011b, 0,2,3,10000011b ;purpure   side
628
 db  5,4,7,00000111b, 5,7,6,00000111b ;soft-red  side
629
 db  1,5,6,00011000b, 1,6,2,00011000b ;soft-lime side
630
 db  4,0,3,11100001b, 4,3,7,11100001b ;soft-blue side
631
 db  4,5,1,00011111b, 1,0,4,00011111b ;yellow    side
632
 db  3,2,6,00000000b, 3,6,7,00000000b ;black     side
633
 
634
sin_table:
635
rw 512
636
cos_table:
637
rw 512
638
 
639
object_rotated:
640
rw MAX_POINTS*3
641
object_translated:
642
rw MAX_POINTS*2
643
 
644
scrbuf:
645
I_END: