Subversion Repositories Kolibri OS

Rev

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

  1. ;=============================================================
  2.  
  3. remove_dead_tri:
  4. ;  push  ebp
  5. ;  mov   ebp,esp
  6.   mov     edi,-1
  7.   movd    xmm7,edi
  8.   pshufd  xmm7,xmm7,0
  9.  
  10.   mov     esi,[triangles_ptr]
  11.   mov     ecx,[triangles_count_var]
  12.  .chck:
  13. ;  jecxz   .cop
  14.   mov     eax,[esi]
  15. ;  mov     ebx,[esi+4]
  16. ;  mov     edx,[esi+8]
  17.   cmp     eax,[esi+4]
  18.   je      .tri_fail
  19.   cmp     eax,[esi+8]
  20.   je      .tri_fail
  21.   mov     eax,[esi+4]
  22.   cmp     eax,[esi+8]
  23.   je      .tri_fail
  24.  
  25. ;  cmp     ebx,[esi]
  26. ;  je      .tri_fail
  27. ;  cmp     ebx,[esi+8]
  28. ;  je      .tri_fail
  29. ;  cmp     edx,[esi]
  30. ;  je      .tri_fail
  31. ;  cmp     edx,[esi+4]
  32. ;  je      .tri_fail
  33.   add     esi,12
  34.   loop    .chck
  35.   jmp     .cop
  36.  .tri_fail:
  37.   movq    [esi],xmm7
  38.   movd    [esi+8],xmm7
  39.   add     esi,12
  40.   loop    .chck
  41.  .cop:
  42.   mov     esi,[triangles_ptr]
  43.   mov     edi,[triangles_ptr]
  44.   mov     ecx,[triangles_count_var]
  45.   xor     edx,edx
  46.  .cp:
  47.   cmp     [esi],dword -1
  48.   je      @f
  49.   movdqu  xmm0,[esi]
  50.   movq    [edi],xmm0
  51.   movhlps xmm0,xmm0
  52.   movd    [edi+8],xmm0
  53.   add     edi,12
  54.   inc     edx
  55.  @@:
  56.   add     esi,12
  57.   loop    .cp
  58.   mov     [triangles_count_var],edx
  59. ret
  60. ;========================================================
  61.  
  62. if Ext > SSE2
  63.  ;--------------------------------------------------------------------
  64. init_point_lights:
  65.       mov       ecx,3
  66.       mov       edi,point_light_coords
  67.     @@:
  68.       push      ecx
  69.       xor       ecx,ecx
  70.       movzx     edx,word[size_x_var]
  71.       call      random
  72.       cvtsi2ss  xmm0,eax
  73.       movss     [edi],xmm0
  74.       xor       ecx,ecx
  75.       movzx     edx,word[size_x_var]
  76.       call      random
  77.       cvtsi2ss  xmm0,eax
  78.       movss     [edi+4],xmm0
  79.       mov       ecx,-1900
  80.       mov       edx,-600
  81.       call      random
  82.       cvtsi2ss  xmm0,eax
  83.       movss     [edi+8],xmm0
  84.       mov       [edi+12],dword 0
  85.       add       edi,16
  86.       pop       ecx
  87.       loop      @b
  88.  
  89. ret
  90.  
  91. ;------------------------------------------------------------------
  92. intersect_tri: ; Moeller-Trumbore method
  93. ; in:
  94. ;     xmm0 - ray direction  ; should be normalized
  95. ;     xmm1 - ray orgin
  96. ;     xmm2 - tri vert1
  97. ;     xmm3 - tri vert2
  98. ;     xmm4 - tri vert3
  99. ;     if  eax = 1 - intersction with edge
  100. ;        xmm6 - edge lenght
  101. ;     if  eax = 0 - intersect with ray (classic)
  102. ; out:
  103. ;     eax  = 1 - intersection occured
  104. ;     xmm0 - float lo -> hi = t, v, u, ...
  105.       push    ebp
  106.       mov     ebp,esp
  107.       and     ebp,-16
  108.       sub     esp,220
  109.  
  110.        .dir    equ [ebp-16]
  111.        .origin equ [ebp-32]
  112.        .ta     equ [ebp-48]
  113.        .tb     equ [ebp-64]
  114.        .tc     equ [ebp-80]
  115.        .tvec   equ [ebp-96]
  116.        .pvec   equ [ebp-112]
  117.        .qvec   equ [ebp-128]
  118.        .e1     equ [ebp-128-16]
  119.        .ift    equ dword[ebp-152]
  120.        .invdet equ [ebp-156]
  121.        .det    equ [ebp-160]
  122.        .ed_l   equ [ebp-164]
  123.        .u      equ [ebp-168]
  124.        .v      equ [ebp-172]
  125.        .t      equ [ebp-176]
  126.        .e2     equ [ebp-192]
  127.  
  128.       movaps   .dir,xmm0
  129.       movaps   .origin,xmm1
  130.       movaps   .ta,xmm2
  131.       movaps   .tb,xmm3
  132.       movaps   .tc,xmm4
  133.       mov      .ift,eax
  134.       movss    .ed_l,xmm6
  135.       subps    xmm3,xmm2
  136.       subps    xmm4,xmm2
  137.       andps    xmm3,[zero_hgst_dd]
  138.       andps    xmm4,[zero_hgst_dd]
  139.       movaps   .e1,xmm3
  140.       movaps   .e2,xmm4
  141.  
  142.       lea      esi,.dir
  143.       lea      edi,.e2
  144.       lea      ebx,.pvec
  145.       call     cross_aligned
  146.  
  147.       movaps   xmm0,.e1
  148.       mulps    xmm0,.pvec
  149.  ;     andps    xmm0,[zero_hgst_dd]
  150.       haddps   xmm0,xmm0
  151.       haddps   xmm0,xmm0
  152.       movss    .det,xmm0
  153. ;      cmpnless xmm0,[eps]
  154. ;      movd     eax,xmm0
  155. ;      or       eax,eax
  156. ;      jz       @f
  157.       comiss   xmm0,[eps]
  158.       jb       @f
  159.  
  160.       rcpss    xmm0,.det
  161.       movss    .invdet,xmm0
  162.  
  163.       movaps   xmm0,.origin
  164.       subps    xmm0,.ta
  165.       andps    xmm0,[zero_hgst_dd]
  166.       movaps   .tvec,xmm0
  167.  
  168.       mulps    xmm0,.pvec
  169.       haddps   xmm0,xmm0
  170.       haddps   xmm0,xmm0
  171.       mulss    xmm0,.invdet
  172.       movss    xmm1,xmm0
  173.       movss    .u,xmm0
  174.       cmpnless xmm1,[epsone]
  175.       cmpnless xmm0,[epsminus]
  176.       pxor     xmm1,xmm0
  177.       movd     eax,xmm1
  178.       or       eax,eax
  179.       jz       @f
  180.  
  181.       lea      esi,.tvec
  182.       lea      edi,.e1
  183.       lea      ebx,.qvec
  184.       call     cross_aligned
  185.  
  186.       movaps   xmm0,.dir
  187.       mulps    xmm0,.qvec
  188.       haddps   xmm0,xmm0
  189.       haddps   xmm0,xmm0
  190.       mulss    xmm0,.invdet
  191.       movss    .v,xmm0
  192.       movss    xmm1,xmm0
  193.       addss    xmm1,.u
  194.       cmpnless xmm1,[epsone]
  195.       cmpnless xmm0,[epsminus]
  196.       pxor     xmm1,xmm0
  197.       movd     eax,xmm1
  198.       or       eax,eax
  199.       jz       @f
  200.  
  201.       movaps   xmm1,.e2
  202.       mulps    xmm1,.qvec
  203.       haddps   xmm1,xmm1
  204.       haddps   xmm1,xmm1
  205.       mulss    xmm1,.invdet
  206.       movss    .t,xmm1
  207.    ;   cmpnless xmm1,[eps]
  208.    ;   movmskps eax,xmm1
  209.    ;   test     eax,1
  210.    ;   jz       @f
  211.       comiss   xmm1,[eps]
  212.       jb       @f
  213.  
  214.       mov      eax,1
  215.       cmp      .ift,0
  216.       je       .end       ; ok intersect occured, no edge cause
  217.  
  218.       movss    xmm0,.t      ; else check with edge lenght
  219.     ;  movss    xmm1,.t
  220.       cmpnless xmm0,[eps]
  221.       cmpnless xmm1,.ed_l
  222.       xorps    xmm0,xmm1
  223.       movd     ebx,xmm0
  224.       or       ebx,ebx
  225.       jz       @f
  226.  
  227.  ;     mov      eax,1
  228.  ;     movaps   xmm0,.t
  229.       jmp      .end
  230.    @@:
  231.       xor      eax,eax
  232.     .end:
  233.       movaps   xmm0,.t
  234.       add      esp,220
  235.       pop      ebp
  236. ret
  237. end if
  238. ;===============================================================
  239. do_edges_list:
  240.     push    ebp
  241.     mov     ebp,esp
  242.     sub     esp,32
  243.  
  244.     .ed_cnt   equ [ebp-4]
  245.     .edd_ptr  equ [ebp-8]
  246.     .counter  equ [ebp-12]
  247.  
  248.        mov     ebx, 12
  249.        mov     eax, 68
  250.        mov     ecx,[triangles_count_var]
  251.        lea     ecx,[ecx*3]
  252.        shl     ecx,4
  253.        add     ecx,1024
  254.        mov     edx,[edges_ptr]
  255.        int     0x40                   ;  -> allocate memory to edges
  256.        mov     [edges_ptr], eax   ;  -> eax = pointer to allocated mem
  257.  
  258.  
  259.     mov     ebx,[edges_ptr]
  260.     mov     eax,[triangles_ptr]
  261.     mov     ecx,[triangles_count_var]
  262.   @@:
  263.     movdqu  xmm0,[eax]
  264.     movq    [ebx],xmm0
  265.     pshufd  xmm0,xmm0,11001001b
  266.     movq    [ebx+8],xmm0
  267.     pshufd  xmm0,xmm0,11001001b
  268.     movq    [ebx+16],xmm0
  269.     add     ebx,24
  270.     add     eax,12
  271.     loop    @b
  272.  
  273.  
  274.  
  275.     mov     ebx,[edges_ptr]
  276.     mov     ecx,[triangles_count_var]
  277.     lea     ecx,[ecx*3]
  278.   .mxd:
  279.     mov     eax,[ebx]
  280.     mov     edx,[ebx+4]
  281.     cmp     eax,[ebx+4]
  282.     cmovg   eax,edx
  283.     cmovg   edx,[ebx]
  284.     mov     [ebx],eax
  285.     mov     [ebx+4],edx
  286.     add     ebx,8
  287.     loop    .mxd
  288.  
  289.  
  290.    ; insert sort
  291.    mov    ebx,[edges_ptr]
  292.    mov    ecx,[triangles_count_var]
  293.    lea    ecx,[ecx*3]
  294.  
  295.    mov    esi,ecx
  296.    shl    esi,3
  297.    add    esi,ebx
  298.    dec    ecx
  299.  .ccc:
  300.    mov    eax,[ebx+8]
  301.    cmp    eax,[ebx]
  302.    jae    .g
  303.    movq   xmm0,[ebx+8]
  304.    push   ebx
  305.  .c:
  306.    cmp    ebx,esi
  307.    jae    .done
  308.    cmp    ebx,[edges_ptr]
  309.    jb     .done
  310.    cmp    eax,[ebx]
  311.    jae    .done
  312.    movq   xmm7,[ebx]
  313.    movq   [ebx+8],xmm7
  314.    sub    ebx,8
  315.    jnz    .c
  316.    add    ebx,8
  317.  .done:
  318.    movq   [ebx+8],xmm0
  319.  .p:
  320.    pop    ebx
  321.  .g:
  322.    add    ebx,8
  323.    loop    .ccc
  324.  
  325.   ; insert sort again
  326.    mov    ebx,[edges_ptr]
  327.    mov    ecx,[triangles_count_var]
  328.    lea    ecx,[ecx*3]
  329.    mov    esi,ecx
  330.    shl    esi,3
  331.    add    esi,ebx
  332.  
  333.  .count:
  334.    push   ecx
  335.    push   ebx
  336.    xor    ecx,ecx
  337.    mov    eax,[ebx]          ; count
  338.  .aa:
  339.    inc    ecx
  340.    add    ebx,8
  341.    cmp    ebx,esi
  342.    jae    .br         ; break
  343.    cmp    eax,[ebx]
  344.    je     .aa
  345.    mov    .counter,ecx
  346.    pop    ebx
  347.    mov    edi,ebx
  348.    sub    edi,8
  349.    mov    edx,[ebx+8]
  350.  .ccc2:
  351.  
  352.    cmp    ebx,esi
  353.    jbe    @f
  354.    add    esp,4
  355.    jmp    .ff
  356.  @@:
  357.    mov    eax,[ebx+12]
  358.    mov    edx,[ebx+8]
  359.    cmp    eax,[ebx+4]
  360.    jae    .gg2
  361.    movq   xmm0,[ebx+8]
  362.    push   ebx
  363.  .c2:
  364.    cmp    eax,[ebx+4]
  365.    jae    .done2
  366.    movq   xmm7,[ebx]
  367.    movq   [ebx+8],xmm7
  368.  
  369.    sub    ebx,8
  370.    cmp    ebx,edi
  371.    jz     @f
  372.    cmp    [ebx+8],edx
  373.    jz     .c2
  374.  @@:
  375.  .done2:
  376.    add    ebx,8
  377.    movq   [ebx],xmm0
  378.  
  379.  .p2:
  380.    pop    ebx
  381.  .gg2:
  382.    add    ebx,8
  383.    dec    ecx
  384.    cmp    ecx,1
  385.    jnz    .ccc2
  386.  
  387.    pop    ecx
  388.    sub    ecx,.counter
  389.    add    ebx,8
  390.    ja     .count
  391.  
  392.    jmp    .ff
  393.  .br: ;break
  394.    add   esp,8
  395.  .ff:
  396.  
  397.  
  398.    ; count edges
  399.  
  400.    mov    ecx,[triangles_count_var]
  401.    lea    ecx,[ecx*3+3]
  402.    mov    esi,[edges_ptr]
  403.    xor    edx,edx
  404.    cld
  405.  .nx:
  406.    lodsd
  407.    mov    ebx,eax
  408.    lodsd
  409.    cmp    ebx,[esi]
  410.    jnz    .ic
  411.    cmp    eax,[esi+4]
  412.    jnz    .ic
  413.    loop   .nx
  414.    jmp    .endc
  415.  .ic:
  416.  
  417.    inc    edx
  418.    loop   .nx
  419.   .endc:
  420.     mov     .ed_cnt,edx
  421.     mov     ecx,edx
  422.  
  423.  
  424.     shl     ecx,3
  425.     add     ecx,65536
  426.     mov     ebx,12
  427.     mov     eax,68
  428.     mov     edx,.edd_ptr
  429.     int     0x40            ;  -> allocate memory to new edges
  430.     mov     .edd_ptr, eax   ;  -> eax = pointer to allocated mem
  431.  
  432.  
  433.  
  434.    mov    ecx,[triangles_count_var]
  435.    lea    ecx,[ecx*3]
  436.    add    ecx,ecx
  437.    mov    esi,[edges_ptr]
  438.    mov    edi,eax
  439.    xor    edx,edx
  440.    cld
  441.  .nx1:
  442.    lodsd
  443.    mov    ebx,eax
  444.    lodsd
  445.    cmp    ebx,[esi]
  446.    jnz    .ic1
  447.    cmp    eax,[esi+4]
  448.    jnz    .ic1
  449.    loop   .nx1
  450.    jmp    .endc1
  451.  .ic1:
  452.    xchg   eax,ebx
  453.    stosd
  454.    mov    eax,ebx
  455.    stosd
  456.    inc    edx
  457.    loop   .nx1
  458.   .endc1:
  459.  
  460.    mov       eax,68
  461.    mov       ebx,13
  462.    mov       ecx,[edges_ptr]
  463.    int       0x40          ; release old edges ptr
  464.  
  465.  
  466.    mov      eax,.edd_ptr
  467.    mov      ecx,.ed_cnt
  468.    mov      [edges_ptr],eax
  469.    mov      [edges_count],ecx
  470.  
  471.    mov      esp,ebp
  472.    pop      ebp
  473. ret
  474.  
  475. ;=======================
  476.  
  477.  
  478. do_sinus:
  479. ;in - ax - render mode
  480.    .x      equ  [ebp-8]
  481.    .y      equ  [ebp-12]
  482.    .new_y  equ  [ebp-16]
  483.    .temp   equ  [ebp-20]
  484.    .dr_f   equ  word[ebp-22]
  485.  
  486.    push    ebp
  487.    mov     ebp,esp
  488.    sub     esp,30
  489.    mov     .dr_f,ax
  490.  
  491.    mov     dword .x,0
  492.    mov     dword .y,0
  493.    mov     esi,[screen_ptr]
  494.    mov     edi,[Zbuffer_ptr]
  495.    push    edi
  496.    ;  clear Zbuffer temporally used as image buffer
  497.    movzx   ecx,word[size_x_var]
  498.    movzx   eax,word[size_y_var]
  499.    imul    ecx,eax  ;SIZE_X*SIZE_Y
  500.    xor     eax,eax
  501.    cld
  502.    rep     stosd
  503.    pop     edi
  504.    fninit
  505.  .again:
  506.    fild    dword .x
  507.    fmul    [sin_frq]
  508.    fistp   dword .temp
  509.    mov     eax, .temp
  510.  
  511.    and     eax, 0x000000ff
  512.  
  513.    fld     dword [sin_tab+eax*4]
  514.    fimul   dword [sin_amplitude]
  515.    fiadd   dword .y
  516.    fistp   dword .new_y
  517.  
  518.    mov     eax,.new_y
  519.    or      eax,eax
  520.    jl      .skip
  521.    movzx   ebx,word[size_y_var]
  522.    cmp     eax,ebx  ;SIZE_Y
  523.    jg      .skip
  524.    movzx   edx,word[size_x_var]
  525.    mul     edx
  526.    add     eax,dword .x
  527.  
  528.    lea     ebx,[eax*3]
  529.    cmp     .dr_f,12 ; 32 bit col cause
  530.    jb      @f
  531.    add     ebx,eax
  532.   @@:
  533.    mov     eax,[esi]
  534.    mov     [edi+ebx],eax
  535.  .skip:
  536.    add     esi,3
  537.    cmp     .dr_f,12
  538.    jb      @f
  539.    inc     esi
  540.   @@:
  541.    inc     dword .x
  542.    movzx   edx,word[size_x_var]
  543.    cmp     dword .x,edx  ;SIZE_X
  544.    jl      .again
  545.    mov     dword .x,0
  546.    inc     dword .y
  547.    movzx   edx,word[size_y_var]
  548.    cmp     dword .y,edx   ;SIZE_Y
  549.    jl      .again
  550.  
  551.    ; copy from temporary buffer -> Zbuffer to screen
  552.    mov     esi,[Zbuffer_ptr]
  553.    mov     edi,[screen_ptr]
  554.    movzx   ecx,word[size_x_var]
  555.    movzx   eax,word[size_y_var]
  556.    imul    ecx,eax
  557.    cmp     .dr_f,12
  558.    jae     @f
  559.    lea     ecx,[ecx*3]
  560.    shr     ecx,2
  561.  ;  mov     ecx,SIZE_X*SIZE_Y*3/4
  562.   @@:
  563.    cld
  564.    rep     movsd
  565.  
  566.  
  567.    mov     esp,ebp
  568.    pop     ebp
  569. ret
  570.  
  571.  
  572. draw_dots:
  573.    mov     esi,[points_translated_ptr]
  574.    mov     ecx,[points_count_var]
  575.  .drw:
  576.  @@:
  577.    lodsd
  578.    add     esi,2           ; skip z
  579.    movzx   ebx,ax
  580.    shr     eax,16          ; bx = x , ax = y
  581.    or      ax,ax
  582.    jl      @f
  583.    or      bx,bx
  584.    jl      @f
  585.    cmp     ax,[size_y_var]  ;SIZE_Y
  586.    jge     @f
  587.    cmp     bx,[size_x_var]  ;SIZE_X
  588.    jge     @f
  589.    movzx   edx,word[size_x_var]  ;SIZE_X      ; SIZE_X not only power of 2   -> 256,512,...
  590.    mul     edx
  591.    add     eax,ebx
  592.    mov     edi,[screen_ptr]
  593.    lea     eax,[eax*3]
  594.    add     edi,eax
  595.    or      eax,-1
  596. ;   not     eax
  597.    stosd
  598.  @@:
  599.    loop    .drw
  600.  
  601. ret
  602.  
  603. do_emboss:   ; sse2 version only
  604. ; in ax - render model
  605.    push  ebp
  606.    mov   ebp,esp
  607.    sub   esp,4
  608.  
  609.    .dr_mod  equ word[ebp-2]
  610.  
  611.    mov    .dr_mod,ax
  612.  
  613. if Ext >= SSE2
  614.  
  615.  
  616.  
  617.  movzx ecx,[bumps_deep_flag]
  618.  inc   ecx
  619.  call  blur_screen    ;blur n times
  620.  
  621.  mov   eax,[size_y_var]  ;load both x, y
  622.  mov   ebx,eax
  623.  shr   ebx,16
  624.  cwde
  625.  mul   ebx
  626.  mov   ecx,eax
  627.  sub   ecx,ebx
  628.  sub   ecx,ebx
  629.  mov   esi,[screen_ptr]
  630.  mov   edi,[Zbuffer_ptr]
  631.  cmp   .dr_mod,11
  632.  jge   @f
  633.  lea   ebx,[ebx*3]
  634.  jmp   .gf
  635. @@:
  636.  shl   ebx,2
  637. .gf:
  638.  mov   edx,esi
  639.  add   esi,ebx
  640.  lea   ebx,[ebx+esi]
  641.  pxor  xmm0,xmm0
  642.  push  eax
  643. .emb:
  644.  cmp    .dr_mod ,11
  645.  jge   @f
  646.  movlps     xmm1,[esi+3]
  647.  movhps     xmm1,[esi+6]
  648.  movlps     xmm2,[esi-3]
  649.  movhps     xmm2,[esi]
  650.  movlps     xmm3,[ebx]
  651.  movhps     xmm3,[ebx+3]
  652.  movlps     xmm4,[edx]
  653.  movhps     xmm4,[edx+3]
  654.  jmp        .ff
  655. @@:
  656.  movlps     xmm1,[esi+4]
  657.  movhps     xmm1,[esi+8]
  658.  movlps     xmm2,[esi-4]
  659.  movhps     xmm2,[esi]
  660.  movlps     xmm3,[ebx]
  661.  movhps     xmm3,[ebx+4]
  662.  movlps     xmm4,[edx]
  663.  movhps     xmm4,[edx+4]
  664. .ff:
  665.  punpcklbw  xmm1,xmm0
  666.  punpcklbw  xmm2,xmm0
  667.  punpcklbw  xmm3,xmm0
  668.  punpcklbw  xmm4,xmm0
  669.  psubsw     xmm1,xmm2
  670.  paddw      xmm1,[emboss_bias]
  671.  psubsw     xmm3,xmm4
  672.  paddw      xmm3,[emboss_bias]
  673.  pmulhw     xmm1,xmm3
  674.  movaps      xmm7,xmm1
  675.  movaps      xmm6,xmm1
  676.  psrlq       xmm7,2*8
  677.  psrlq       xmm6,4*8
  678.  pmaxsw      xmm1,xmm7
  679.  pmaxsw      xmm1,xmm6
  680.  
  681.  
  682.  pmaxsw      xmm1,xmm3
  683.  
  684.  movd        eax,xmm1
  685.  movzx       eax,al
  686. ; cmp         [dr_flag],12
  687. ; je          @f
  688.  lea         eax,[eax*3+envmap_cub]
  689. ; jmp         .fff
  690. ;@@:
  691.  
  692.  mov         eax,[eax]
  693.  mov        [edi],eax  ;xmm1
  694.  psrldq     xmm1,8
  695.  movd       eax,xmm1
  696.  movzx      eax,al
  697.  lea        eax,[eax*3+envmap_cub]
  698.  mov        eax,[eax]
  699.  mov        [edi+4],eax
  700.  
  701.  cmp    .dr_mod,11
  702.  jl     @f
  703.  add    esi,2
  704.  add    ebx,2
  705.  add    edx,2
  706. @@:
  707.  
  708.  add    edi,8
  709.  add    esi,6
  710.  add    ebx,6
  711.  add    edx,6
  712.  sub    ecx,2
  713.  jnc    .emb
  714.  
  715.  
  716.  pop    ecx  ;,eax
  717.  mov    edi,[screen_ptr]
  718.  mov    esi,[Zbuffer_ptr]
  719.  cmp    .dr_mod,11
  720.  jge    .e
  721. @@:
  722.  movsd
  723.  dec    edi
  724.  loop   @b
  725. .e:
  726.  rep    movsd
  727.  
  728. end if
  729.  
  730.  
  731.  
  732.    mov   esp,ebp
  733.    pop   ebp
  734.  
  735. ret
  736.  
  737. ;align 16
  738. ; emboss_bias:
  739. ;    dw 128, 128, 128, 128, 128, 128, 128, 128
  740.  
  741. if 0  ; old emb proc
  742.  
  743.  ;  emboss -  after drawing all,
  744.  ;  transfer screen buffer into bump map
  745.  ;  and draw two bump triangles
  746.  ; *************************************
  747.         mov     esi,screen
  748.         mov     edi,bumpmap2
  749.         mov     ecx,TEXTURE_SIZE/3
  750.         cld
  751. if  Ext=NON
  752.         xor     eax,eax
  753.         xor     bh,bh
  754.         xor     dh,dh
  755.       @@:
  756.         lodsb
  757.         movzx   bx,al
  758.         lodsb
  759.         movzx   dx,al
  760.         lodsb
  761.         add     ax,bx
  762.         add     ax,dx
  763.       ;  cwd
  764.       ;  div     [i3]
  765.  ;;       push    ax
  766.  ;;       pop     bx
  767.  ;;       shr     bx,3
  768.  ;;       shr     ax,2
  769.  ;;       add     ax,bx
  770.  
  771.         lea      eax,[eax*5]
  772.         shr      ax,4
  773.  
  774.         stosb
  775.         loop    @b
  776. else
  777.         emms
  778.         pxor          mm1,mm1
  779.         mov           ebx,0x0000ffff
  780.       @@:
  781.         movd          mm0,[esi]
  782.         punpcklbw     mm0,mm1
  783.         movq          mm2,mm0
  784.         psrlq         mm2,16
  785.         movq          mm3,mm0
  786.         psrlq         mm3,32
  787.         paddw         mm0,mm2
  788.         paddw         mm0,mm3
  789.  
  790.  
  791.         movd          eax,mm0
  792.         and           eax,ebx
  793.         lea           eax,[eax*5]
  794.         shr           ax,4
  795.         stosb
  796.         add           esi,3
  797.         loop          @b
  798.  
  799. end if
  800.         push    ebp
  801.  
  802.         push    dword 0          ; env coords
  803.         push    word 0
  804.         push    word SIZE_X
  805.         push    word SIZE_Y
  806.         push    dword 0
  807.         push    dword 0          ; bump coords
  808.         push    word SIZE_X
  809.         push    word SIZE_Y
  810.         push    word 0
  811.         mov     eax,SIZE_Y
  812.         mov     ebx,SIZE_X*65536+0
  813.         xor     ecx,ecx
  814.         mov     edx,bumpmap2
  815.         mov     esi,envmap
  816.         mov     edi,screen
  817.         call    bump_triangle
  818.  
  819.         push    dword SIZE_X shl 16 + SIZE_Y       ; env coords
  820.         push    word 0
  821.         push    word SIZE_X
  822.         push    word SIZE_Y
  823.         push    word 0
  824.         push    dword SIZE_X shl 16 + SIZE_Y        ; bump coords
  825.         push    word 0
  826.         push    word SIZE_X
  827.         push    word SIZE_Y
  828.         push    word 0
  829.         mov     eax,SIZE_Y
  830.         mov     ebx,SIZE_X * 65536+0
  831.         mov     ecx,SIZE_X shl 16 + SIZE_Y
  832.         mov     edx,bumpmap2
  833.         mov     esi,envmap
  834.         mov     edi,screen
  835.         call    bump_triangle
  836.  
  837.         pop     ebp
  838. ret
  839. end if
  840. ;********************************EMBOSS DONE*******************************
  841.  
  842.  
  843. generate_object2:  ; torus
  844. ;in  ax - figure number       2=torus, 3=loop, 4=loop
  845. ;locals
  846. ;   counter dw ?
  847. ;   sin     dd ?
  848. ;   cos     dd ?
  849. ;endl
  850. .counter equ  word[ebp-2]
  851. .sin     equ  dword[ebp-6]
  852. .cos     equ  dword[ebp-10]
  853. .sin2    equ  dword[ebp-14]
  854. .cos2    equ  dword[ebp-18]
  855. .piD180m3 equ dword[ebp-22]
  856. .cD2      equ word[ebp-24]
  857.         push  ebp
  858.         mov   ebp,esp
  859.         sub   esp,24
  860.  
  861.         push  ax
  862.  
  863.         fninit
  864.         mov     edi,[points_ptr]
  865.         xor     eax,eax
  866.                                     ; init seed -> 4   3d points
  867.         mov     dword[edi],-1.0     ; x
  868.         add     edi,4
  869.         stosd                       ; y
  870.         stosd                       ; z
  871.         mov     dword[edi],-0.9     ; x1
  872.         mov     dword[edi+4],0.1    ; y1
  873.         add     edi,8
  874.         stosd                       ; z1
  875.         mov     dword[edi],-0.8
  876.         add     edi,4
  877.         stosd
  878.         stosd
  879.         mov     dword[edi],-0.9     ; x3
  880.         mov     dword[edi+4],-0.1   ; y3
  881.         add     edi,8
  882.         stosd                       ; z3
  883.         mov     [points_count_var],4
  884.  
  885.         fld     [piD180]
  886.         fidiv   [i3]
  887.         fstp    .piD180m3
  888.         mov     .cD2,5
  889.  
  890.         pop     ax
  891.         mov     ecx,1
  892.         mov     edx,9
  893.       .next:                      ; calc angle and rotate seed 4 points
  894.         mov     .counter,cx
  895.         mov     ebx,[points_ptr]
  896.         fld     .piD180m3
  897.         fimul   .counter
  898.         fld     st
  899.         fsincos
  900.         fstp    .sin
  901.         fstp    .cos
  902.         fadd    st,st0
  903.         fsincos
  904.         fstp    .sin2
  905.         fstp    .cos2
  906.  
  907.       .rotor:                          ; next 4
  908.         ; rotary y
  909.         fld     dword[ebx]         ; x
  910.         fld     .sin
  911.         fmul    dword[ebx+8]       ; z * sinbeta
  912.         fchs
  913.         fld     .cos
  914.         fmul    dword[ebx]         ; x * cosbeta
  915.         faddp
  916.         fstp    dword[edi]         ; new x
  917.         fmul    .sin             ; old x * sinbeta
  918.         fld     .cos
  919.         fmul    dword[ebx+8]       ; z * cosbeta
  920.         faddp
  921.         dec     dx
  922.         or      dx,dx
  923.         jnz     @f
  924. ;        mov     .counter,dx
  925.         fld     st
  926.         fidiv   [i3]
  927.         faddp
  928.     @@:
  929.         fstp    dword[edi+8]       ; new z
  930.         fld     dword[ebx+4]
  931.         or      dx,dx
  932.         jnz     @f
  933.   ;      fld1
  934.   ;      faddp
  935. ;        fld     st
  936.         fadd    st,st0
  937.         fadd    st,st0
  938. ;        fxch
  939. ;        fimul   [i3]
  940. ;        fsin
  941. ;        faddp
  942.         mov     dx,9
  943.     @@:
  944.         fstp    dword[edi+4]
  945.         ; rotary x
  946.         cmp     al,3
  947.         jl      .end_rot
  948.         fld     dword[edi+4]    ;y
  949.         fld     .sin2
  950.         fmul    dword[edi+8]    ;z
  951.         fld     .cos2
  952.         fmul    dword[edi+4]    ;y
  953.         faddp
  954.         fstp    dword[edi+4]    ; new y
  955.         fmul    .sin2       ; sinbeta * old y
  956.         fchs
  957.         fld     .cos2
  958.         fmul    dword[edi+8]
  959.         faddp
  960.         fstp    dword[edi+8]
  961.         ; rotary z
  962.         cmp     al,4
  963.         jl      .end_rot
  964.         fld     dword[edi]      ;x
  965.         fld     .sin
  966.         fmul    dword[edi+4]    ;y
  967.         fld     .cos
  968.         fmul    dword[edi]      ;x
  969.         faddp
  970.         fstp    dword[edi]      ;new x
  971.         fmul    .sin       ; sinbeta * old x
  972.         fchs
  973.         fld     .cos
  974.         fmul    dword[edi+4]         ; cosbeta * y
  975.         faddp
  976.         fstp    dword[edi+4]    ; new y
  977.  
  978.  
  979.  
  980.       .end_rot:
  981.  
  982.         add     edi,12
  983.         add     ebx,12
  984.         mov     esi,[points_ptr]
  985.         add     esi,12*4
  986.         cmp     ebx,esi
  987.         jl      .rotor
  988.  
  989.         add     [points_count_var],4
  990.         add     cx,18
  991.         cmp     cx,(18*21*3)+1
  992.         jle     .next
  993.  
  994.         mov     edi,[triangles_ptr]
  995.         mov     eax,4
  996.         mov     ebx,4+4
  997.         mov     [triangles_count_var],160*3    ;164*3   ;140
  998.  
  999.         mov     ecx,80*3  ;68
  1000.       @@:
  1001.         stosd                 ;----
  1002.         mov     [edi],ebx      ;    |
  1003.         add     edi,4         ;    |
  1004.         inc     eax            ;    |
  1005.         stosd                 ;    |repeat 4 times
  1006.  
  1007.         mov     [edi],ebx      ;    |
  1008.         inc     ebx
  1009.         add     edi,4
  1010.         stosd                 ;    |
  1011.         mov     [edi],ebx      ;    |
  1012.         add     edi,4         ;----
  1013.         loop     @b
  1014.  
  1015.  
  1016.         mov     dword[edi],-1  ; < - end mark
  1017.         mov       [culling_flag],0
  1018.  
  1019.         mov     esp,ebp
  1020.         pop     ebp
  1021.  
  1022. ret
  1023. generate_object3:  ; heart
  1024. ;locals
  1025. ;   counter dw ?
  1026. ;   sin     dd ?
  1027. ;   cos     dd ?
  1028. ;endl
  1029. .counter equ  word[ebp-2]
  1030. .sin     equ  dword[ebp-6]
  1031. .cos     equ  dword[ebp-10]
  1032. .sin2    equ  dword[ebp-14]
  1033. .cos2    equ  dword[ebp-18]
  1034. .piD180m3 equ dword[ebp-22]
  1035. .cD2      equ word[ebp-24]
  1036.         push  ebp
  1037.         mov   ebp,esp
  1038.         sub   esp,24
  1039.  
  1040.         fninit
  1041.         mov     edi,[points_ptr]
  1042.         xor     eax,eax
  1043.                                ; init seed -> eight   3d points
  1044.         mov     dword[edi],2.0
  1045.         add     edi,4
  1046.         stosd
  1047.         stosd
  1048.  
  1049.         mov     dword[edi],2.0
  1050.         mov     dword[edi+4],-0.5
  1051.         add     edi,8
  1052.         stosd
  1053.  
  1054.         mov     dword[edi],1.5
  1055.         mov     dword[edi+4],-1.5
  1056.         add     edi,8
  1057.         stosd
  1058.         mov     dword[edi],1.0
  1059.         mov     dword[edi+4],-2.0
  1060.         add     edi,8
  1061.         stosd
  1062.  
  1063.         stosd
  1064.         mov     dword[edi],-2.5
  1065.         add     edi,4
  1066.         stosd
  1067.  
  1068.         mov     [points_count_var],5
  1069.  
  1070.         mov     ecx,1
  1071.       .next:                      ; calc angle and rotate seed 4 points
  1072.         mov     .counter,cx
  1073.         mov     ebx,[points_ptr]
  1074.         fld     [piD180]
  1075.         fimul   .counter
  1076.         fsincos
  1077.         fstp    .sin
  1078.         fstp    .cos
  1079.  
  1080.       .rotor:                          ; next 4
  1081.         ; rotary y
  1082.         fld     dword[ebx]         ; x
  1083.         fld     .sin
  1084.         fmul    dword[ebx+8]       ; z * sinbeta
  1085.         fchs
  1086.         fld     .cos
  1087.         fmul    dword[ebx]         ; x * cosbeta
  1088.         faddp
  1089.         fidiv   [i3]
  1090.         fstp    dword[edi]         ; new x
  1091.         fmul    .sin               ; old x * sinbeta
  1092.         fld     .cos
  1093.         fmul    dword[ebx+8]       ; z * cosbeta
  1094.         faddp
  1095.         fstp    dword[edi+8]       ; new z
  1096.  
  1097.         fld     dword[ebx+4]   ;y
  1098.         fstp    dword[edi+4]
  1099.  
  1100.  
  1101.       .end_rot:
  1102.  
  1103.         add     edi,12
  1104.         add     ebx,12
  1105.         mov     esi,[points_ptr]
  1106.         add     esi,12*5
  1107.         cmp     ebx,esi  ;real_points + (12*5)
  1108.         jl      .rotor
  1109.  
  1110.         add     [points_count_var],5
  1111.         add     cx,18
  1112.         cmp     cx,(18*21)+1
  1113.         jle     .next
  1114. ;last points
  1115.  
  1116.         xor     eax,eax
  1117.  
  1118.         mov     dword[edi],0.22
  1119.         mov     dword[edi+4],0.77
  1120.         mov     dword[edi+8],1.25
  1121.         add     edi,12
  1122.  
  1123.         mov     dword[edi],0.22
  1124.         mov     dword[edi+4],0.77
  1125.         mov     dword[edi+8],-1.25
  1126.         add     edi,12
  1127.         stosd
  1128.  
  1129.         add     [points_count_var],2
  1130.  
  1131. ; init triangles list
  1132.  
  1133.         mov     edi,[triangles_ptr]
  1134.         mov     eax,5
  1135.         mov     ebx,5+5
  1136.         mov     [triangles_count_var],200  ;204
  1137.  
  1138.         mov     ecx,100
  1139.       @@:
  1140.         stosd                 ;----
  1141.         mov     [edi],ebx      ;    |
  1142.         add     edi,4         ;    |
  1143.         inc     eax            ;    |
  1144.         stosd                 ;    |repeat
  1145.  
  1146.         mov     [edi],ebx      ;    |
  1147.         inc     ebx
  1148.         add     edi,4
  1149.         stosd                 ;    |
  1150.         mov     [edi],ebx      ;    |
  1151.         add     edi,4         ;----
  1152.         loop     @b
  1153.  
  1154.         mov     eax,5
  1155.         mov     ebx,[points_count_var]
  1156.         sub     ebx,2
  1157.         mov     dl,2
  1158.     .nx:
  1159.         mov     ecx,5
  1160.         add     [triangles_count_var],ecx
  1161.     @@:
  1162.         stosd
  1163.         add     eax,5
  1164.         stosd
  1165.         mov     dword[edi],ebx
  1166.         add     edi,4
  1167.         loop    @b
  1168.  
  1169.         cmp     dl,1
  1170.         je      @f
  1171.  
  1172.         inc     ebx
  1173.         jmp     .lab
  1174.      @@:
  1175.         dec     ebx
  1176.      .lab:
  1177.         mov     ecx,5
  1178.         add     [triangles_count_var],ecx
  1179.      @@:
  1180.         stosd
  1181.         add     eax,5
  1182.         stosd
  1183.         mov     dword[edi],ebx
  1184.         add     edi,4
  1185.         loop    @b
  1186.  
  1187.         dec     dl
  1188.         or      dl,dl
  1189.         jnz     .nx
  1190.  
  1191.         sub     eax,25
  1192.         stosd
  1193.         sub     eax,50
  1194.         stosd
  1195.         mov     dword[edi],ebx
  1196.         add     edi,4
  1197.  
  1198.         stosd
  1199.         add     eax,50
  1200.         stosd
  1201.         inc     ebx
  1202.         mov     dword[edi],ebx
  1203.         add     edi,4
  1204.         add     [triangles_count_var],2
  1205.  
  1206.         mov     dword[edi],-1  ; < - end mark
  1207.         mov     [culling_flag],0
  1208.  
  1209.         mov     esp,ebp
  1210.         pop     ebp
  1211.  
  1212. ret
  1213.  
  1214.  
  1215.  
  1216.