Subversion Repositories Kolibri OS

Rev

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