Subversion Repositories Kolibri OS

Rev

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

  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'
  27. include '..\..\..\macros.inc'
  28. ;purge mov
  29. include 'ascl.inc'
  30. include 'ascgl.inc'
  31.  
  32. START:
  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:
  52.     call draw_window
  53.  
  54. still:
  55.     mov eax,11
  56.     mcall
  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.  
  68.     fps  220,9,cl_White,cl_Black
  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
  100.      mcall
  101.      jmp still
  102. button:
  103.      mov eax,17
  104.      mcall
  105.      cmp ah,1
  106.      jne still
  107. exit:
  108.      mov eax,-1
  109.      mcall
  110.  
  111. ;Draw window
  112. draw_window:
  113.     mcall 12, 1 ;Start window redraw
  114.  
  115.     mov eax,0   ;Draw window
  116.     mov ebx,100*65536+(SCREEN_X+9)  ;x start*65536+x size
  117.     mov ecx,100*65536+(SCREEN_Y+26) ;y start*65536+y size
  118.     mov edx,0x54000000         ;0x03 use skinned window
  119.     mov edi,title
  120.     mcall
  121.  
  122.     mcall 12, 2 ;End window redraw
  123.        
  124.     ret
  125.  
  126. title db '3D Cube Sample',0
  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:
  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
  145.         inc esi
  146.         dec ecx
  147.         jnz df_get_point
  148.  
  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
  160.         pop ebx
  161.         sub ebx,eax
  162.         jge df_next
  163.  
  164.         movzx   eax, byte [esi]
  165.        
  166.         mov     [@@xcol], eax
  167.  
  168.         call filled_triangle
  169. df_next:
  170.         inc esi
  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
  185.  mov eax,7
  186.  mcall
  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.  
  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
  211.  
  212. @@dx12 dd 0
  213. @@dx13 dd 0
  214. @@dx23 dd 0
  215.  
  216. filled_triangle:
  217.  
  218.  mov eax,[@@xcol]  ;trnsforming color
  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.  
  243.         mov eax,[@@ty1]
  244.         cmp eax,[@@ty3]
  245.         jb ft_check1
  246.  
  247.         xchg eax,[@@ty3]
  248.         mov [@@ty1],eax
  249.  
  250.         mov eax,[@@tx1]
  251.         xchg eax,[@@tx3]
  252.         mov [@@tx1],eax
  253. ft_check1:
  254.         mov eax,[@@ty2]
  255.         cmp eax,[@@ty3]
  256.         jb ft_check2
  257.  
  258.         xchg eax,[@@ty3]
  259.         mov [@@ty2],eax
  260.  
  261.         mov eax,[@@tx2]
  262.         xchg eax,[@@tx3]
  263.         mov [@@tx2],eax
  264. ft_check2:
  265.         mov eax,[@@ty1]
  266.         cmp eax,[@@ty2]
  267.         jb ft_check3
  268.  
  269.         xchg eax,[@@ty2]
  270.         mov [@@ty1],eax
  271.  
  272.         mov eax,[@@tx1]
  273.         xchg eax,[@@tx2]
  274.         mov [@@tx1],eax
  275. ft_check3:
  276.  
  277.         mov ebx,[@@ty2]
  278.         sub ebx,[@@ty1]
  279.         jnz ft_dx12_make
  280.  
  281.         mov [@@dx12],dword 0
  282.         jmp ft_dx12_done
  283. ft_dx12_make:
  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)
  290. ft_dx12_done:
  291.  
  292.         mov ebx,[@@ty3]
  293.         sub ebx,[@@ty1]
  294.         jnz ft_dx13_make
  295.  
  296.         mov [@@dx13],dword 0
  297.         jmp ft_dx13_done
  298. ft_dx13_make:
  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)
  305. ft_dx13_done:
  306.  
  307.         mov ebx,[@@ty3]
  308.         sub ebx,[@@ty2]
  309.         jnz ft_dx23_make
  310.  
  311.         mov [@@dx23],dword 0
  312.         jmp ft_dx23_done
  313. ft_dx23_make:
  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)
  320. ft_dx23_done:
  321.  
  322.         mov eax,[@@tx1]
  323.         shl eax,7
  324.         mov ebx,eax
  325.  
  326.         mov ecx,[@@ty1]
  327. ft_loop1:
  328.  
  329.  pushad
  330.  
  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
  340.  call horizontal_line
  341.  
  342.  popad
  343.  
  344.         add eax,[@@dx13]
  345.         add ebx,[@@dx12]
  346.         inc ecx
  347.         cmp ecx,[@@ty2]
  348.         jb ft_loop1
  349.  
  350.        
  351.         mov ebx,[@@tx2]
  352.         shl ebx,7
  353.         mov ecx,[@@ty2]
  354. ft_loop2:
  355.  
  356.  pushad
  357.  
  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
  367.         call horizontal_line
  368.  
  369.  popad
  370.  
  371.         add eax,[@@dx13]
  372.         add ebx,[@@dx23]
  373.         inc ecx
  374.         cmp ecx,[@@ty3]
  375.         jb ft_loop2
  376.  
  377.         ret
  378.  
  379. ;horizontal line subproc
  380.  
  381. align 4
  382. @@lx1  dd 0
  383. @@lx2  dd 0
  384. @@ly   dd 0
  385. @@lcol dd 0
  386.  
  387. @@rgb  dd 0
  388.  
  389. horizontal_line:
  390.  
  391.  mov ecx,[@@lx1]
  392.  sub ecx,[@@lx2]
  393.  ja  x12
  394.  je  ext
  395. ; ret
  396.  neg ecx
  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:
  406.  mov eax,[@@ly]
  407.  mov ebx,SCREEN_X ;320
  408.  mul ebx
  409.  add eax,[@@lx1]
  410.  lea ebp,[eax*3-3]      ; for delete white dots
  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:
  454.         mov ebx, [esi]
  455.         and ebx,511
  456.         mov ax,word [sin_table+ebx*2]
  457.         mov word [edi],ax
  458.         mov ax,word [cos_table+ebx*2]
  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
  572.  mcall
  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.  
  588.         movzx ebx,word [esi+4]
  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.  
  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)
  602.         stosw
  603.  
  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)
  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: