Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. CATMULL_SHIFT equ 16
  2. fill_Z_buffer:
  3.         mov     eax,0x70000000
  4.         mov     edi,Z_buffer
  5.         mov     ecx,SIZE_X*SIZE_Y
  6.         rep     stosd
  7. ret
  8. flat_triangle_z:
  9. ;  procedure drawing triangle with Z cordinate interpolation ------
  10. ;  (Catmull  alghoritm)--------------------------------------------
  11. ;  ----------------in - eax - x1 shl 16 + y1 ----------------------
  12. ;  -------------------- ebx - x2 shl 16 + y2 ----------------------
  13. ;  -------------------- ecx - x3 shl 16 + y3 ----------------------
  14. ;  -------------------- edx - color 0x00RRGGBB --------------------
  15. ;  -------------------- esi - pointer to Z-buffer -----------------
  16. ;  -------------------- edi - pointer to screen buffer-------------
  17. ;  -------------------- stack : z coordinates
  18. ;  -------------------- Z-buffer : each z variable as dword
  19. ;  -------------------- (Z coor. as word) shl CATMULL_SHIFT
  20. .z1     equ word[ebp+4]
  21. .z2     equ word[ebp+6]    ; each z coordinate as word integer
  22. .z3     equ word[ebp+8]
  23.  
  24. .col    equ dword[ebp-4]
  25. .x1     equ word[ebp-6]
  26. .y1     equ word[ebp-8]
  27. .x2     equ word[ebp-10]
  28. .y2     equ word[ebp-12]
  29. .x3     equ word[ebp-14]
  30. .y3     equ word[ebp-16]
  31.  
  32. .dx12   equ dword[ebp-20]
  33. .dz12   equ dword[ebp-24]
  34. .dx13   equ dword[ebp-28]
  35. .dz13   equ dword[ebp-32]
  36. .dx23   equ dword[ebp-36]
  37. .dz23   equ dword[ebp-40]
  38. .zz1    equ dword[ebp-44]
  39. .zz2    equ dword[ebp-48]
  40.  
  41.         mov     ebp,esp
  42.         push    edx            ; store edx in variable .col
  43.       .sort2:
  44.         cmp     ax,bx
  45.         jle     .sort1
  46.         xchg    eax,ebx
  47.         mov     dx,.z1
  48.         xchg    dx,.z2
  49.         mov     .z1,dx
  50.       .sort1:
  51.         cmp     bx,cx
  52.         jle     .sort3
  53.         xchg    ebx,ecx
  54.         mov     dx,.z2
  55.         xchg    dx,.z3
  56.         mov     .z2,dx
  57.         jmp     .sort2
  58.       .sort3:
  59.         push    eax            ; store triangle coordinates in user friendly variables
  60.         push    ebx
  61.         push    ecx
  62.          mov      edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
  63.          and      edx,ebx        ; if *all* of them are negative a sign flag is raised
  64.          and      edx,ecx
  65.          and      edx,eax
  66.          test     edx,80008000h  ; Check both X&Y at once
  67.          jne      .ft_loop2_end
  68.        ;  cmp      ax,SIZE_Y
  69.        ;  jle      @f
  70.        ;  cmp      bx,SIZE_Y
  71.        ;  jle      @f
  72.        ;  cmp      cx,SIZE_Y
  73.        ;  jge      @f
  74.        ;  ror      eax,16
  75.        ;  ror      ebx,16
  76.        ;  ror      ecx,16
  77.        ;  cmp      ax,SIZE_X
  78.        ;  jle      @f
  79.        ;  cmp      bx,SIZE_X
  80.        ;  jle      @f
  81.        ;  cmp      cx,SIZE_X
  82.        ;  jle      @f
  83.        ;  jmp      .ft_loop2_end
  84.        ;@@:
  85.         sub     esp,32
  86.  
  87.         mov     bx,.y2       ; calc delta 12
  88.         sub     bx,.y1
  89.         jnz     .ft_dx12_make
  90.         mov     .dx12,0
  91.         mov     .dz12,0
  92.         jmp     .ft_dx12_done
  93.    .ft_dx12_make:
  94.         mov     ax,.x2
  95.         sub     ax,.x1
  96.         cwde
  97.         movsx   ebx,bx
  98.         shl     eax,ROUND
  99.         cdq
  100.         idiv    ebx
  101.         mov     .dx12,eax
  102.  
  103.         mov     ax,.z2
  104.         sub     ax,.z1
  105.         cwde
  106.         shl     eax,CATMULL_SHIFT
  107.         cdq
  108.         idiv    ebx
  109.         mov     .dz12,eax
  110.   .ft_dx12_done:
  111.         mov     bx,.y3       ; calc delta 13
  112.         sub     bx,.y1
  113.         jnz     .ft_dx13_make
  114.         mov     .dx13,0
  115.         mov     .dz13,0
  116.         jmp     .ft_dx13_done
  117.    .ft_dx13_make:
  118.         mov     ax,.x3
  119.         sub     ax,.x1
  120.         cwde
  121.         movsx   ebx,bx
  122.         shl     eax,ROUND
  123.         cdq
  124.         idiv    ebx
  125.         mov     .dx13,eax
  126.  
  127.         mov     ax,.z3
  128.         sub     ax,.z1
  129.         cwde
  130.         shl     eax,CATMULL_SHIFT
  131.         cdq
  132.         idiv    ebx
  133.         mov     .dz13,eax
  134.     .ft_dx13_done:
  135.         mov     bx,.y3       ; calc delta 23
  136.         sub     bx,.y2
  137.         jnz     .gt_dx23_make
  138.         mov     .dx23,0
  139.         mov     .dz23,0
  140.         jmp     .gt_dx23_done
  141.    .gt_dx23_make:
  142.         mov     ax,.x3
  143.         sub     ax,.x2
  144.         cwde
  145.         movsx   ebx,bx
  146.         shl     eax,ROUND
  147.         cdq
  148.         idiv    ebx
  149.         mov     .dx23,eax
  150.  
  151.         mov     ax,.z3
  152.         sub     ax,.z2
  153.         cwde
  154.         shl     eax,CATMULL_SHIFT
  155.         cdq
  156.         idiv    ebx
  157.         mov     .dz23,eax
  158.     .gt_dx23_done:
  159.  
  160.         movsx   edx,.z1
  161.         shl     edx,CATMULL_SHIFT
  162.         mov     .zz1,edx
  163.         mov     .zz2,edx
  164.         movsx   eax,.x1
  165.         shl     eax,ROUND    ; eax - x1
  166.         mov     ebx,eax      ; ebx - x2
  167.         mov     cx,.y1
  168.         cmp     cx,.y2
  169.         jge     .ft_loop1_end
  170.      .ft_loop1:
  171.  
  172.         pushad
  173.  
  174.         push    .col
  175.         push    cx          ; y
  176.         sar     ebx,ROUND
  177.         push    bx          ; x2
  178.         sar     eax,ROUND
  179.         push    ax          ; x1
  180.         push    .zz2        ; z2 shl CATMULL_SHIFT
  181.         push    .zz1        ; z1 shl CATMULL_SHIFT
  182.         call    flat_line_z
  183.  
  184.         popad
  185.  
  186.         add     eax,.dx13
  187.         add     ebx,.dx12
  188.         mov     edx,.dz13
  189.         add     .zz1,edx
  190.         mov     edx,.dz12
  191.         add     .zz2,edx
  192.         inc     cx
  193.         cmp     cx,.y2
  194.         jl      .ft_loop1
  195.     .ft_loop1_end:
  196.  
  197.         movsx   edx,.z2
  198.         shl     edx,CATMULL_SHIFT
  199.         mov     .zz2,edx
  200.         movsx   ebx,.x2
  201.         shl     ebx,ROUND
  202.         mov     cx,.y2
  203.         cmp     cx,.y3
  204.         jge     .ft_loop2_end
  205.      .ft_loop2:
  206.         pushad
  207.  
  208.         push    .col
  209.         push    cx
  210.         sar     ebx,ROUND
  211.         push    bx
  212.         sar     eax,ROUND
  213.         push    ax          ; x1
  214.         push    .zz2        ; z2 shl CATMULL_SHIFT
  215.         push    .zz1        ; z1 shl CATMULL_SHIFT
  216.         call    flat_line_z
  217.  
  218.         popad
  219.  
  220.         add     eax,.dx13
  221.         add     ebx,.dx23
  222.         mov     edx,.dz13
  223.         add     .zz1,edx
  224.         mov     edx,.dz23
  225.         add     .zz2,edx
  226.         inc     cx
  227.         cmp     cx,.y3
  228.         jl      .ft_loop2
  229.      .ft_loop2_end:
  230.  
  231.         mov esp,ebp
  232. ret 6
  233.  
  234. flat_line_z:
  235. ;----------------
  236. ;-------------in edi - pointer to screen buffer ----------------------------------
  237. ;--------------- esi - pointer to z-buffer (each Z varible dword)-----------------
  238. ;----------stack - (each z coordinate shifted shl CATMULL_SHIFT)------------------
  239. .z1 equ dword [ebp+4]
  240. .z2 equ dword [ebp+8]
  241. .x1 equ word  [ebp+12]
  242. .x2 equ word  [ebp+14]
  243. .y  equ word  [ebp+16]
  244. .col equ dword [ebp+18]
  245.  
  246. .dz equ dword [ebp-4]
  247.  
  248.      mov        ebp,esp
  249. ;;     sub        esp,4
  250.      mov        ax,.y
  251.      or         ax,ax
  252.      jl         .fl_quit
  253.      cmp        ax,SIZE_Y-1
  254.      jg         .fl_quit
  255.  
  256.  ;    cmp        .x1,0
  257.  ;    jge        .fl_ok1
  258.  ;    cmp        .x2,0
  259.  ;    jl         .fl_quit
  260.  ;  .fl_ok1:
  261.  ;    cmp        .x1,SIZE_X
  262.  ;    jle        .fl_ok2
  263.  ;    cmp        .x2,SIZE_X
  264.  ;    jg         .fl_quit
  265.  ;  .fl_ok2:
  266.      mov        ax,.x1
  267.      cmp        ax,.x2
  268.      je         .fl_quit
  269.      jl         .fl_ok
  270.  
  271.      xchg       ax,.x2
  272.      mov        .x1,ax
  273.      mov        edx,.z1
  274.      xchg       edx,.z2
  275.      mov        .z1,edx
  276.    .fl_ok:
  277.      cmp        .x1,SIZE_X-1
  278.      jg         .fl_quit
  279.      cmp        .x2,0
  280.      jle        .fl_quit
  281.  
  282.      mov        eax,.z2
  283.      sub        eax,.z1
  284.      cdq
  285.      mov        bx,.x2
  286.      sub        bx,.x1
  287.      movsx      ebx,bx
  288.      idiv       ebx
  289. ;;     mov        .dz,eax                ; calculated delta - shifted .dz
  290.      push       eax
  291.  
  292.      cmp        .x1,0
  293.      jge        @f
  294.      movsx      ebx,.x1
  295.      neg        ebx
  296.      imul       ebx
  297.      add        .z1,eax
  298.      mov        .x1,0
  299.     @@:
  300.      cmp        .x2,SIZE_X
  301.      jl         @f
  302.      mov        .x2,SIZE_X
  303.     @@:
  304.      mov        edx,SIZE_X
  305.      movsx      eax,.y
  306.      mul        edx                  ; edi = edi + (SIZE_X * y + x1)*3
  307.      movsx      edx,.x1
  308.      add        eax,edx
  309.      push       eax
  310.      lea        eax,[eax*3]
  311.      add        edi,eax              ; esi = esi + (SIZE_X * y + x1)*4
  312.      pop        eax
  313.      shl        eax,2
  314.      add        esi,eax
  315.  
  316.      mov        cx,.x2
  317.      sub        cx,.x1
  318.      movzx      ecx,cx
  319.  
  320.      mov        eax,.col
  321.      mov        ebx,.z1  ; ebx : curr. z
  322.      mov        edx,.dz
  323.    .ddraw:
  324.      ;pushad
  325.      ;show
  326.      ;popad
  327.      cmp        ebx,dword[esi]
  328.      jge        .skip
  329.      stosd
  330.      dec        edi
  331.      mov        dword[esi],ebx
  332.      jmp        .no_skip
  333.    .skip:
  334.      add        edi,3
  335.    .no_skip:
  336.      add        esi,4
  337.      add        ebx,edx
  338.      loop       .ddraw
  339.  
  340.    .fl_quit:
  341.      mov   esp,ebp
  342. ret 18
  343.