Subversion Repositories Kolibri OS

Rev

Rev 9237 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; Glass like rendering triangle by Maciej Guba.
  2. ; http://macgub.co.pl, macgub3@wp.pl
  3.  
  4. ROUND2 equ 10
  5. glass_tri:
  6. ;----procedure render glass like triangle with z coord --
  7. ;----interpolation ( Catmull alghoritm )-----------------
  8. ;----I normalize normal vector in every pixel -----------
  9. ;------------------in - eax - x1 shl 16 + y1 ------------
  10. ;---------------------- ebx - x2 shl 16 + y2 ------------
  11. ;---------------------- ecx - x3 shl 16 + y3 ------------
  12. ;---------------------- edx - ptr to stencil_buff -------
  13. ;---------------------- esi - pointer to Z-buffer filled-
  14. ;----------------------   with dd float variables--------
  15. ;---------------------- edi - pointer to screen buffer---
  16. ;---------------------- xmm0 - 1st normal vector --------
  17. ;---------------------- xmm1 - 2cond normal vector ------
  18. ;---------------------- xmm2 - 3rd normal vector --------
  19. ;---------------------- xmm3 - normalized light vector --
  20. ;---------------------- xmm4 - lo -> hi z1, z2, z3 coords
  21. ;----------------------  as dwords floats ---------------
  22. ;---------------------- xmm5 - lo -> hi y_min, y_max, ---
  23. ;----------------------  x_min, x_max as dword integers -
  24. ;---------------------- stack - no parameters -----------
  25. ;--------------------------------------------------------
  26. ;----------------- procedure don't save registers !! ----
  27.  
  28.  
  29.  
  30.  
  31.   push  ebp
  32.   mov   ebp,esp
  33.   sub   esp,512
  34.   sub   ebp,16
  35.   and   ebp,0xfffffff0
  36.  
  37.   .1_nv equ [ebp-16]
  38.   .2_nv equ [ebp-32]
  39.   .3_nv equ [ebp-48]
  40.   .l_v  equ [ebp-64]
  41.   .z3   equ [ebp-72]
  42.   .z2   equ [ebp-76]
  43.   .z1   equ [ebp-80]
  44.   .x1   equ [ebp-82]
  45.   .y1   equ [ebp-84]
  46.   .x2   equ [ebp-86]
  47.   .y2   equ [ebp-88]
  48.   .x3   equ [ebp-90]
  49.   .y3   equ [ebp-92]
  50.   .Zbuf equ [ebp-96]
  51.   .x_max equ  [ebp-100]
  52.   .x_min equ  [ebp-104]
  53.   .y_max equ  [ebp-108]
  54.   .y_min equ  [ebp-112]
  55.   .screen equ [ebp-116]
  56.   .dx12   equ [ebp-120]
  57.   .dx13   equ [ebp-124]
  58.   .dx23   equ [ebp-128]
  59.   .dn12   equ [ebp-144]
  60.   .dn13   equ [ebp-160]
  61.   .dn23   equ [ebp-176]
  62.   .dz12   equ [ebp-180]
  63.   .dz13   equ [ebp-184]
  64.   .dz23   equ [ebp-188]
  65.  
  66.   .cnv1   equ [ebp-208]  ; cur normal vectors
  67.   .cnv2   equ [ebp-224]
  68.   .cz2    equ [ebp-228]
  69.   .cz1    equ [ebp-232]
  70.   .stencil_buff equ [ebp-236]
  71.  
  72.  
  73.  
  74.  
  75.  .sort3:                  ; sort triangle coordinates...
  76.        cmp     ax,bx
  77.        jle     .sort1
  78.        xchg    eax,ebx
  79.        shufps  xmm4,xmm4,11100001b
  80.        movaps  xmm6,xmm0
  81.        movaps  xmm0,xmm1
  82.        movaps  xmm1,xmm6
  83.  
  84.  
  85.  .sort1:
  86.        cmp      bx,cx
  87.        jle      .sort2
  88.        xchg     ebx,ecx
  89.        shufps   xmm4,xmm4,11011000b
  90.        movaps   xmm6,xmm1
  91.        movaps   xmm1,xmm2
  92.        movaps   xmm2,xmm6
  93.  
  94.        jmp .sort3
  95.  
  96.  .sort2:
  97.  
  98.    movaps .z1,xmm4
  99.    mov    .y1,eax
  100.    mov    .y2,ebx
  101.    mov    .y3,ecx
  102.    mov    .stencil_buff, edx
  103.  
  104.    movdqa   .y_min,xmm5
  105. if 1                            ; check if at last only fragment
  106.    packssdw xmm5,xmm5       ; of triangle is in visable area
  107.    pshuflw  xmm5,xmm5,11011000b
  108.    movdqu   xmm7,.y3
  109.    movdqa   xmm6,xmm5
  110.    pshufd   xmm5,xmm5,0  ; xmm5 lo-hi -> broadcasted y_min, x_min
  111.    pshufd   xmm6,xmm6,01010101b ;xmm6 -> brd y_max x_max
  112.    movdqa   xmm4,xmm7
  113.    pcmpgtw  xmm7,xmm5
  114.    pcmpgtw  xmm4,xmm6
  115.    pxor     xmm7,xmm4
  116.    pmovmskb eax,xmm7
  117.    and      eax,0x00aaaaaa
  118.    or       eax,eax
  119.    jz       .rpt_loop2_end
  120. end if
  121.    movaps   .1_nv,xmm0
  122.    movaps   .2_nv,xmm1
  123.    movaps   .3_nv,xmm2
  124.    movaps   .l_v,xmm3
  125.  ;  mov      .Zbuf,esi
  126.    mov      .screen,edi
  127.  
  128.  
  129.  
  130.        mov      bx,.y2       ; calc deltas
  131.        sub      bx,.y1
  132.        jnz      .rpt_dx12_make
  133.  
  134.        xorps    xmm7,xmm7
  135.        mov      dword .dx12,0
  136.        mov      dword .dz12,0
  137.        movaps   .dn12,xmm7
  138.        jmp      .rpt_dx12_done
  139.  
  140.   .rpt_dx12_make:
  141.        mov      ax,.x2
  142.        sub      ax,.x1
  143.        cwde
  144.        movsx    ebx,bx
  145.        shl      eax,ROUND2
  146.        cdq
  147.        idiv     ebx
  148.        mov      .dx12,eax
  149.  
  150.        cvtsi2ss xmm6,ebx
  151.        movss    xmm5,.z2
  152.        subss    xmm5,.z1
  153.        divss    xmm5,xmm6
  154.        movss    .dz12,xmm5
  155.  
  156.        movaps   xmm0,.2_nv
  157.        subps    xmm0,.1_nv
  158.        shufps   xmm6,xmm6,0
  159.        divps    xmm0,xmm6
  160.        movaps   .dn12,xmm0
  161.  
  162.  
  163.    .rpt_dx12_done:
  164.  
  165.        mov      bx,.y3       ; calc deltas
  166.        sub      bx,.y1
  167.        jnz      .rpt_dx13_make
  168.  
  169.        xorps    xmm7,xmm7
  170.        mov      dword .dx13,0
  171.        mov      dword .dz13,0
  172.        movaps   .dn13,xmm7
  173.        jmp      .rpt_dx13_done
  174.  
  175.   .rpt_dx13_make:
  176.        mov      ax,.x3
  177.        sub      ax,.x1
  178.        cwde
  179.        movsx    ebx,bx
  180.        shl      eax,ROUND2
  181.        cdq
  182.        idiv     ebx
  183.        mov      .dx13,eax
  184.  
  185.        cvtsi2ss xmm6,ebx
  186.        movss    xmm5,.z3
  187.        subss    xmm5,.z1
  188.        divss    xmm5,xmm6
  189.        movss    .dz13,xmm5
  190.  
  191.        movaps   xmm0,.3_nv
  192.        subps    xmm0,.1_nv
  193.        shufps   xmm6,xmm6,0
  194.        divps    xmm0,xmm6
  195.        movaps   .dn13,xmm0
  196.  
  197.    .rpt_dx13_done:
  198.  
  199.        mov      bx,.y3       ; calc deltas
  200.        sub      bx,.y2
  201.        jnz      .rpt_dx23_make
  202.  
  203.        xorps    xmm7,xmm7
  204.        mov      dword .dx23,0
  205.        mov      dword .dz23,0
  206.        movaps   .dn23,xmm7
  207.        jmp      .rpt_dx23_done
  208.  
  209.   .rpt_dx23_make:
  210.        mov      ax,.x3
  211.        sub      ax,.x2
  212.        cwde
  213.        movsx    ebx,bx
  214.        shl      eax,ROUND2
  215.        cdq
  216.        idiv     ebx
  217.        mov      .dx23,eax
  218.  
  219.        cvtsi2ss xmm6,ebx
  220.        movss    xmm5,.z3
  221.        subss    xmm5,.z2
  222.        divss    xmm5,xmm6
  223.        movss    .dz23,xmm5
  224.  
  225.        movaps   xmm0,.3_nv
  226.        subps    xmm0,.2_nv
  227.        shufps   xmm6,xmm6,0
  228.        divps    xmm0,xmm6
  229.        movaps   .dn23,xmm0
  230.  
  231.    .rpt_dx23_done:
  232.  
  233.  
  234.        movsx   eax,word .x1
  235.        shl     eax,ROUND2
  236.        mov     ebx,eax
  237.        mov     edx,.z1
  238.        mov     .cz1,edx
  239.        mov     .cz2,edx
  240.        movaps  xmm0,.1_nv
  241.        movaps  .cnv1,xmm0
  242.        movaps  .cnv2,xmm0
  243.  
  244.  
  245.        movsx    ecx,word .y1
  246.        cmp      cx,.y2
  247.  
  248.        jge      .rpt_loop1_end
  249.  
  250.     .rpt_loop1:
  251.        pushad
  252.  
  253.        movaps   xmm2,.y_min
  254.        movaps   xmm0,.cnv1
  255.        movaps   xmm1,.cnv2
  256.        movlps   xmm3,.cz1
  257.        movaps   xmm4,.l_v
  258.        sar      ebx,ROUND2
  259.        sar      eax,ROUND2
  260.        mov      edx,.stencil_buff
  261.        mov      edi,.screen
  262.    ;    mov      esi,.Zbuf
  263.  
  264.        call     glass_line
  265.  
  266.        popad
  267.        movaps   xmm0,.cnv1
  268.        movaps   xmm1,.cnv2
  269.        movss    xmm2,.cz1
  270.        movss    xmm3,.cz2
  271.        addps    xmm0,.dn13
  272.        addps    xmm1,.dn12
  273.        addss    xmm2,.dz13
  274.        addss    xmm3,.dz12
  275.        add      eax,.dx13
  276.        add      ebx,.dx12
  277.  
  278.        movaps   .cnv1,xmm0
  279.        movaps   .cnv2,xmm1
  280.        movss    .cz1,xmm2
  281.        movss    .cz2,xmm3
  282.  
  283.        add      ecx,1
  284.        cmp      cx,.y2
  285.        jl       .rpt_loop1
  286.  
  287.  
  288.  
  289.  
  290.  
  291.    .rpt_loop1_end:
  292.        movsx    ecx,word .y2
  293.        cmp      cx,.y3
  294.        jge      .rpt_loop2_end
  295.  
  296.        movsx    ebx,word .x2                    ; eax - cur x1
  297.        shl      ebx,ROUND2                 ; ebx - cur x2
  298.        push     dword .z2
  299.        pop      dword .cz2
  300.        movaps   xmm0,.2_nv
  301.        movaps   .cnv2,xmm0
  302.  
  303.  
  304.      .rpt_loop2:
  305.        pushad
  306.  
  307.        movaps   xmm2,.y_min
  308.        movaps   xmm0,.cnv1
  309.        movaps   xmm1,.cnv2
  310.        movlps   xmm3,.cz1
  311.        movaps   xmm4,.l_v
  312.        sar      ebx,ROUND2
  313.        sar      eax,ROUND2
  314.        mov      edx,.stencil_buff
  315.        mov      edi,.screen
  316.   ;     mov      esi,.Zbuf
  317.  
  318.        call     glass_line
  319.  
  320.        popad
  321.        movaps   xmm0,.cnv1
  322.        movaps   xmm1,.cnv2
  323.        movss    xmm2,.cz1
  324.        movss    xmm3,.cz2
  325.        addps    xmm0,.dn13
  326.        addps    xmm1,.dn23
  327.        addss    xmm2,.dz13
  328.        addss    xmm3,.dz23
  329.        add      eax,.dx13
  330.        add      ebx,.dx23
  331.  
  332.        movaps   .cnv1,xmm0
  333.        movaps   .cnv2,xmm1
  334.        movss    .cz1,xmm2
  335.        movss    .cz2,xmm3
  336.  
  337.        add      ecx,1
  338.        cmp      cx,.y3
  339.        jl       .rpt_loop2
  340.  
  341.     .rpt_loop2_end:
  342.  
  343.       add   esp,512
  344.       pop   ebp
  345.  
  346. ret
  347.  
  348. glass_line:
  349. ; in:
  350. ;    xmm0 - normal vector 1
  351. ;    xmm1 - normal vect 2
  352. ;    xmm3 - lo -> hi z1, z2 coords as dwords floats
  353. ;    xmm2 - lo -> hi y_min, y_max, x_min, x_max
  354. ;           as dword integers
  355. ;    xmm4 - normalized light vector
  356. ;    eax - x1
  357. ;    ebx - x2
  358. ;    ecx - y
  359. ;    edx - stencil buff ptr
  360. ;    edi - screen buffer
  361. ;    esi - z buffer ===> not needed in glass rendering
  362.  
  363.    push  ebp
  364.    mov   ebp,esp
  365.    sub   esp,190
  366.    sub   ebp,16
  367.    and   ebp,0xfffffff0
  368.  
  369.  .n1 equ [ebp-16]
  370.  .n2 equ [ebp-32]
  371.  .lv equ [ebp-48]
  372.  .lx1 equ [ebp-52]
  373.  .lx2 equ [ebp-56]
  374.  .z2 equ [ebp-60]
  375.  .z1 equ [ebp-64]
  376.  .screen equ [ebp-68]
  377.  .zbuff  equ [ebp-72]
  378.  .x_max  equ [ebp-74]
  379.  .x_min  equ [ebp-76]
  380.  .y_max  equ [ebp-78]
  381.  .y_min  equ [ebp-80]
  382.  .dn     equ [ebp-96]
  383.  .dz     equ [ebp-100]
  384.  .y      equ [ebp-104]
  385.  .cnv    equ [ebp-128]
  386.  .col_sum_b  equ [ebp-136]
  387.  .col_sum_g  equ [ebp-140]
  388.  .col_sum_r  equ [ebp-144]
  389.  .cur_col equ [ebp-160]
  390.  .stencil_buf equ [ebp-164]
  391.  
  392.         mov    .y,ecx
  393.         packssdw xmm2,xmm2
  394.         movq   .y_min,xmm2
  395.         cmp    cx,.y_min
  396.         jl     .end_rp_line
  397.         cmp    cx,.y_max
  398.         jge    .end_rp_line          ;
  399.  
  400.         cmp     eax,ebx
  401.         je      .end_rp_line
  402.         jl      @f
  403.         xchg    eax,ebx
  404.         movaps  xmm7,xmm0
  405.         movaps  xmm0,xmm1
  406.         movaps  xmm1,xmm7
  407.         shufps  xmm3,xmm3,11100001b
  408.    @@:
  409.  
  410.         cmp     ax,.x_max
  411.         jge     .end_rp_line
  412.         cmp     bx,.x_min
  413.         jle     .end_rp_line
  414.         movaps  .lv,xmm4
  415.         movaps  .n1,xmm0
  416.         movaps  .n2,xmm1
  417.         mov     .lx1,eax
  418.         mov     .lx2,ebx
  419.         mov     .stencil_buf,edx
  420.         movlps  .z1,xmm3
  421.  
  422.         sub     ebx,eax
  423.         cvtsi2ss xmm7,ebx
  424.         shufps  xmm7,xmm7,0
  425.         subps   xmm1,xmm0
  426.         divps   xmm1,xmm7
  427.         movaps  .dn,xmm1
  428.         psrldq  xmm3,4
  429.         subss   xmm3,.z1
  430.         divss   xmm3,xmm7
  431.         movss   .dz,xmm3
  432.  
  433.         mov      ebx,.lx1
  434.         cmp      bx,.x_min     ; clipping on function4
  435.         jge      @f
  436.         movzx    eax,word .x_min
  437.         sub      eax,ebx
  438.         cvtsi2ss xmm7,eax
  439.         shufps   xmm7,xmm7,0
  440.         mulss    xmm3,xmm7
  441.         mulps    xmm1,xmm7
  442.         addss    xmm3,.z1
  443.         addps    xmm1,.n1
  444.         movsx    eax,word .x_min
  445.         movss    .z1,xmm3
  446.         movaps   .n1,xmm1
  447.         mov      dword .lx1,eax
  448.  
  449.       @@:
  450.         movzx   eax,word .x_max
  451.         cmp     .lx2,eax
  452.         jl      @f
  453.         mov     .lx2,eax
  454.       @@:
  455.         movzx   eax,word[xres_var]
  456.         mul     dword .y
  457.  
  458.         add     eax,.lx1
  459.         shl     eax,2
  460.         add     edi,eax
  461.         mov     ebx,eax
  462.         add     ebx,.stencil_buf
  463.  
  464.  
  465.         mov     ecx,.lx2
  466.         sub     ecx,.lx1
  467.  
  468.         movaps  xmm0,.n1
  469.         movss   xmm2,.z1
  470. align 16
  471.    .ddraw:
  472.         movaps   xmm7,xmm0
  473.         mulps    xmm7,xmm7 ; normalize
  474.         andps    xmm7,[zero_hgst_dd]
  475.         haddps   xmm7,xmm7
  476.         haddps   xmm7,xmm7
  477.         rsqrtps  xmm7,xmm7
  478.         mulps    xmm7,xmm0
  479.        ; maxps    xmm7,[the_zero]
  480.         movaps   .cnv,xmm7
  481.  
  482.         mov      edx,lights_aligned  ; lights_aligned - global variable
  483.         xorps    xmm1,xmm1           ; instead global can be used .lv - light vect.
  484.       .again_col:
  485.         movaps    xmm3,.cnv
  486.         mulps     xmm3,[edx]
  487.         haddps    xmm3,xmm3
  488.         haddps    xmm3,xmm3   ; xmm3 - dot pr
  489.  
  490.       ; cmp       [bump_flag],1     ; on/off temporaly
  491.                                     ; depend on bump button
  492.       ; je        @f
  493.       ; stencil
  494.         movss     xmm5,xmm2
  495.         movss     xmm6,xmm2
  496.         addss     xmm5,[aprox]
  497.         subss     xmm6,[aprox]
  498.         cmpnltss  xmm5,dword[ebx]
  499.         cmpnltss  xmm6,dword[ebx]
  500.         xorps     xmm5,xmm6
  501.         movd      eax,xmm5
  502.         or        eax,eax
  503.         jz       .no_reflective
  504.      @@:
  505.         movaps    xmm6,xmm3   ;xmm7
  506.         mulps     xmm6,xmm6
  507.         mulps     xmm6,xmm6
  508.         mulps     xmm6,xmm6
  509.         mulps     xmm6,xmm6
  510.         mulps     xmm6,xmm6
  511.         mulps     xmm6,[edx+48]
  512.       .no_reflective:
  513.         movaps    xmm7,xmm3
  514.         mulps     xmm7,[edx+16]
  515.         addps     xmm7,xmm6
  516.         addps     xmm7,[edx+32]
  517.         minps     xmm7,[mask_255f]   ; global
  518.  
  519.         maxps     xmm1,xmm7
  520.         add       edx,64     ; size of one light in aligned list
  521.         cmp       edx,lights_aligned_end
  522.         jl        .again_col
  523.         cvtps2dq  xmm1,xmm1
  524.         movd      xmm6,[edi]
  525.         packssdw  xmm1,xmm1
  526.         packuswb  xmm1,xmm1
  527.         paddusb   xmm1,xmm6
  528.         movd      [edi],xmm1
  529.  
  530.  
  531.      .skip:
  532.         add      edi,4
  533.         add      ebx,4  ; stencil_buff
  534.         addps    xmm0,.dn
  535.         addss    xmm2,.dz
  536.         sub      ecx,1
  537.         jnz      .ddraw
  538.  
  539.   .end_rp_line:
  540.         add      esp,190
  541.         pop      ebp
  542.  
  543. ret
  544.