Subversion Repositories Kolibri OS

Rev

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

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