Subversion Repositories Kolibri OS

Rev

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

  1. do_sinus:
  2.    .x      equ  [ebp-8]
  3.    .y      equ  [ebp-12]
  4.    .new_y  equ  [ebp-16]
  5.    .temp   equ  [ebp-20]
  6.    push    ebp
  7.    mov     ebp,esp
  8.    sub     esp,64
  9.    mov     dword .x,0
  10.    mov     dword .y,0
  11.    mov     esi,[screen_ptr]
  12.    mov     edi,[Zbuffer_ptr]
  13.    push    edi
  14.    ;  clear Zbuffer temporally used as image buffer
  15.    movzx   ecx,word[size_x_var]
  16.    movzx   eax,word[size_y_var]
  17.    imul    ecx,eax  ;SIZE_X*SIZE_Y
  18.    xor     eax,eax
  19.    cld
  20.    rep     stosd
  21.    pop     edi
  22.    fninit
  23.  .again:
  24.    fild    dword .x
  25.    fmul    [sin_frq]
  26.    fistp   dword .temp
  27.    mov     eax, .temp
  28.  
  29.    and     eax, 0x000000ff
  30.  
  31.  
  32.    fld     dword [sin_tab+eax*4]
  33.    fimul   dword [sin_amplitude]
  34.    fiadd   dword .y
  35.    fistp   dword .new_y
  36.  
  37.    mov     eax,.new_y
  38.    or      eax,eax
  39.    jl      .skip
  40.    movzx   ebx,word[size_y_var]
  41.    cmp     eax,ebx  ;SIZE_Y
  42.    jg      .skip
  43.    movzx   edx,word[size_x_var]
  44.    mul     edx
  45. ;   shl     eax,9
  46.    add     eax,dword .x
  47.  
  48.    lea     ebx,[eax*3]
  49.    cmp     [dr_flag],12 ; 32 bit col cause
  50.    jl      @f
  51.    add     ebx,eax
  52.   @@:
  53.    mov     eax,[esi]
  54.    mov     [edi+ebx],eax
  55.  .skip:
  56.    add     esi,3
  57.    cmp     [dr_flag],12
  58.    jl      @f
  59.    inc     esi
  60.   @@:
  61.    inc     dword .x
  62.    movzx   edx,word[size_x_var]
  63.    cmp     dword .x,edx  ;SIZE_X
  64.    jl      .again
  65.    mov     dword .x,0
  66.    inc     dword .y
  67.    movzx   edx,word[size_y_var]
  68.    cmp     dword .y,edx   ;SIZE_Y
  69.    jl      .again
  70.  
  71.    ; copy from temporary buffer -> Zbuffer to screen
  72.    mov     esi,[Zbuffer_ptr]
  73.    mov     edi,[screen_ptr]
  74.    movzx   ecx,word[size_x_var]
  75.    movzx   eax,word[size_y_var]
  76.    imul    ecx,eax
  77.    cmp     [dr_flag],12
  78.    jge     @f
  79.    lea     ecx,[ecx*3]
  80.    shr     ecx,2
  81.  ;  mov     ecx,SIZE_X*SIZE_Y*3/4
  82.   @@:
  83.    cld
  84.    rep     movsd
  85.  
  86.  
  87.    mov     esp,ebp
  88.    pop     ebp
  89. ret
  90.  
  91.  
  92. draw_dots:
  93.    mov     esi,[points_translated_ptr]
  94.    mov     ecx,[points_count_var]
  95.  .drw:
  96.  @@:
  97.    lodsd
  98.    add     esi,2           ; skip z
  99.    movzx   ebx,ax
  100.    shr     eax,16          ; bx = x , ax = y
  101.    or      ax,ax
  102.    jl      @f
  103.    or      bx,bx
  104.    jl      @f
  105.    cmp     ax,[size_y_var]  ;SIZE_Y
  106.    jge     @f
  107.    cmp     bx,[size_x_var]  ;SIZE_X
  108.    jge     @f
  109.    movzx   edx,word[size_x_var]  ;SIZE_X      ; SIZE_X not only power of 2   -> 256,512,...
  110.    mul     edx
  111.    add     eax,ebx
  112.    mov     edi,[screen_ptr]
  113.    lea     eax,[eax*3]
  114.    add     edi,eax
  115.    xor     eax,eax
  116.    not     eax
  117.    stosd
  118.  @@:
  119.    loop    .drw
  120.  
  121. ret
  122.  
  123. do_emboss:   ; sse2 version only
  124. if Ext >= SSE2
  125.  movzx ecx,[bumps_deep_flag]
  126.  inc   ecx
  127.  call  blur_screen    ;blur n times
  128.  
  129.  mov   eax,[size_y_var]  ;load both x, y
  130.  mov   ebx,eax
  131.  shr   ebx,16
  132.  cwde
  133.  mul   ebx
  134.  mov   ecx,eax
  135.  sub   ecx,ebx
  136.  sub   ecx,ebx
  137.  mov   esi,[screen_ptr]
  138.  mov   edi,[Zbuffer_ptr]
  139.  cmp   [dr_flag],12
  140.  jge   @f
  141.  lea   ebx,[ebx*3]
  142.  jmp   .f
  143. @@:
  144.  shl   ebx,2
  145. .f:
  146.  mov   edx,esi
  147.  add   esi,ebx
  148.  lea   ebx,[ebx+esi]
  149.  pxor  xmm0,xmm0
  150.  push  eax
  151. .emb:
  152.  cmp   [dr_flag],12
  153.  jge   @f
  154.  movlps     xmm1,[esi+3]
  155.  movhps     xmm1,[esi+6]
  156.  movlps     xmm2,[esi-3]
  157.  movhps     xmm2,[esi]
  158.  movlps     xmm3,[ebx]
  159.  movhps     xmm3,[ebx+3]
  160.  movlps     xmm4,[edx]
  161.  movhps     xmm4,[edx+3]
  162.  jmp        .ff
  163. @@:
  164.  movlps     xmm1,[esi+4]
  165.  movhps     xmm1,[esi+8]
  166.  movlps     xmm2,[esi-4]
  167.  movhps     xmm2,[esi]
  168.  movlps     xmm3,[ebx]
  169.  movhps     xmm3,[ebx+4]
  170.  movlps     xmm4,[edx]
  171.  movhps     xmm4,[edx+4]
  172. .ff:
  173.  punpcklbw  xmm1,xmm0
  174.  punpcklbw  xmm2,xmm0
  175.  punpcklbw  xmm3,xmm0
  176.  punpcklbw  xmm4,xmm0
  177.  psubsw     xmm1,xmm2
  178.  paddw      xmm1,[emboss_bias]
  179.  psubsw     xmm3,xmm4
  180.  paddw      xmm3,[emboss_bias]
  181.  pmulhw     xmm1,xmm3
  182.  movaps      xmm7,xmm1
  183.  movaps      xmm6,xmm1
  184.  psrlq       xmm7,2*8
  185.  psrlq       xmm6,4*8
  186.  pmaxsw      xmm1,xmm7
  187.  pmaxsw      xmm1,xmm6
  188.  
  189. if 0
  190.  movaps      xmm7,xmm3
  191.  movaps      xmm6,xmm3
  192.  psrlq       xmm7,2*8
  193.  psrlq       xmm6,4*8
  194.  pmaxsw      xmm3,xmm7
  195.  pmaxsw      xmm3,xmm6
  196. end if
  197.  pmaxsw      xmm1,xmm3
  198.  
  199.  movd        eax,xmm1
  200.  movzx       eax,al
  201. ; cmp         [dr_flag],12
  202. ; je          @f
  203.  lea         eax,[eax*3+envmap_cub]
  204. ; jmp         .fff
  205. ;@@:
  206.  
  207.  mov         eax,[eax]
  208.  mov        [edi],eax  ;xmm1
  209.  psrldq     xmm1,8
  210.  movd       eax,xmm1
  211.  movzx      eax,al
  212.  lea        eax,[eax*3+envmap_cub]
  213.  mov        eax,[eax]
  214.  mov        [edi+4],eax
  215.  
  216.  cmp    [dr_flag],12
  217.  jl     @f
  218.  add    esi,2
  219.  add    ebx,2
  220.  add    edx,2
  221. @@:
  222.  
  223.  add    edi,8
  224.  add    esi,6
  225.  add    ebx,6
  226.  add    edx,6
  227.  sub    ecx,2
  228.  jnc    .emb
  229.  
  230.  
  231.  pop    ecx  ;,eax
  232.  mov    edi,[screen_ptr]
  233.  mov    esi,[Zbuffer_ptr]
  234.  cmp    [dr_flag],12
  235.  jge    .e
  236. @@:
  237.  movsd
  238.  dec    edi
  239.  loop   @b
  240. .e:
  241.  rep    movsd
  242.  
  243. end if
  244.  
  245. ret
  246.  
  247.  
  248. ;********************************EMBOSS DONE*******************************
  249.  
  250.  
  251. generate_object2:  ; torus
  252. ;in  ax - figure number       2=torus, 3=loop, 4=loop
  253. ;locals
  254. ;   counter dw ?
  255. ;   sin     dd ?
  256. ;   cos     dd ?
  257. ;endl
  258. .counter equ  word[ebp-2]
  259. .sin     equ  dword[ebp-6]
  260. .cos     equ  dword[ebp-10]
  261. .sin2    equ  dword[ebp-14]
  262. .cos2    equ  dword[ebp-18]
  263. .piD180m3 equ dword[ebp-22]
  264. .cD2      equ word[ebp-24]
  265.         push  ebp
  266.         mov   ebp,esp
  267.         sub   esp,24
  268.  
  269.         push  ax
  270.  
  271.         fninit
  272.         mov     edi,[points_ptr]
  273.         xor     eax,eax
  274.                                     ; init seed -> 4   3d points
  275.         mov     dword[edi],-1.0     ; x
  276.         add     edi,4
  277.         stosd                       ; y
  278.         stosd                       ; z
  279.         mov     dword[edi],-0.9     ; x1
  280.         mov     dword[edi+4],0.1    ; y1
  281.         add     edi,8
  282.         stosd                       ; z1
  283.         mov     dword[edi],-0.8
  284.         add     edi,4
  285.         stosd
  286.         stosd
  287.         mov     dword[edi],-0.9     ; x3
  288.         mov     dword[edi+4],-0.1   ; y3
  289.         add     edi,8
  290.         stosd                       ; z3
  291.         mov     [points_count_var],4
  292.  
  293.         fld     [piD180]
  294.         fidiv   [i3]
  295.         fstp    .piD180m3
  296.         mov     .cD2,5
  297.  
  298.         pop     ax
  299.         mov     ecx,1
  300.         mov     edx,9
  301.       .next:                      ; calc angle and rotate seed 4 points
  302.         mov     .counter,cx
  303.         mov     ebx,[points_ptr]
  304.         fld     .piD180m3
  305.         fimul   .counter
  306.         fld     st
  307.         fsincos
  308.         fstp    .sin
  309.         fstp    .cos
  310.         fadd    st,st0
  311.         fsincos
  312.         fstp    .sin2
  313.         fstp    .cos2
  314.  
  315.       .rotor:                          ; next 4
  316.         ; rotary y
  317.         fld     dword[ebx]         ; x
  318.         fld     .sin
  319.         fmul    dword[ebx+8]       ; z * sinbeta
  320.         fchs
  321.         fld     .cos
  322.         fmul    dword[ebx]         ; x * cosbeta
  323.         faddp
  324.         fstp    dword[edi]         ; new x
  325.         fmul    .sin             ; old x * sinbeta
  326.         fld     .cos
  327.         fmul    dword[ebx+8]       ; z * cosbeta
  328.         faddp
  329.         dec     dx
  330.         or      dx,dx
  331.         jnz     @f
  332. ;        mov     .counter,dx
  333.         fld     st
  334.         fidiv   [i3]
  335.         faddp
  336.     @@:
  337.         fstp    dword[edi+8]       ; new z
  338.         fld     dword[ebx+4]
  339.         or      dx,dx
  340.         jnz     @f
  341.   ;      fld1
  342.   ;      faddp
  343. ;        fld     st
  344.         fadd    st,st0
  345.         fadd    st,st0
  346. ;        fxch
  347. ;        fimul   [i3]
  348. ;        fsin
  349. ;        faddp
  350.         mov     dx,9
  351.     @@:
  352.         fstp    dword[edi+4]
  353.         ; rotary x
  354.         cmp     al,3
  355.         jl      .end_rot
  356.         fld     dword[edi+4]    ;y
  357.         fld     .sin2
  358.         fmul    dword[edi+8]    ;z
  359.         fld     .cos2
  360.         fmul    dword[edi+4]    ;y
  361.         faddp
  362.         fstp    dword[edi+4]    ; new y
  363.         fmul    .sin2       ; sinbeta * old y
  364.         fchs
  365.         fld     .cos2
  366.         fmul    dword[edi+8]
  367.         faddp
  368.         fstp    dword[edi+8]
  369.         ; rotary z
  370.         cmp     al,4
  371.         jl      .end_rot
  372.         fld     dword[edi]      ;x
  373.         fld     .sin
  374.         fmul    dword[edi+4]    ;y
  375.         fld     .cos
  376.         fmul    dword[edi]      ;x
  377.         faddp
  378.         fstp    dword[edi]      ;new x
  379.         fmul    .sin       ; sinbeta * old x
  380.         fchs
  381.         fld     .cos
  382.         fmul    dword[edi+4]         ; cosbeta * y
  383.         faddp
  384.         fstp    dword[edi+4]    ; new y
  385.  
  386.  
  387.  
  388.       .end_rot:
  389.  
  390.         add     edi,12
  391.         add     ebx,12
  392.         mov     esi,[points_ptr]
  393.         add     esi,12*4
  394.         cmp     ebx,esi
  395.         jl      .rotor
  396.  
  397.         add     [points_count_var],4
  398.         add     cx,18
  399.         cmp     cx,(18*21*3)+1
  400.         jle     .next
  401.  
  402.         mov     edi,[triangles_ptr]
  403.         mov     eax,4
  404.         mov     ebx,4+4
  405.         mov     [triangles_count_var],160*3    ;164*3   ;140
  406.  
  407.         mov     ecx,80*3  ;68
  408.       @@:
  409.         stosd                 ;----
  410.         mov     [edi],ebx      ;    |
  411.         add     edi,4         ;    |
  412.         inc     eax            ;    |
  413.         stosd                 ;    |repeat 4 times
  414.  
  415.         mov     [edi],ebx      ;    |
  416.         inc     ebx
  417.         add     edi,4
  418.         stosd                 ;    |
  419.         mov     [edi],ebx      ;    |
  420.         add     edi,4         ;----
  421.         loop     @b
  422.  
  423.  
  424.         mov     dword[edi],-1  ; < - end mark
  425.         mov       [culling_flag],0
  426.  
  427.         mov     esp,ebp
  428.         pop     ebp
  429.  
  430. ret
  431. generate_object3:  ; heart
  432. ;locals
  433. ;   counter dw ?
  434. ;   sin     dd ?
  435. ;   cos     dd ?
  436. ;endl
  437. .counter equ  word[ebp-2]
  438. .sin     equ  dword[ebp-6]
  439. .cos     equ  dword[ebp-10]
  440. .sin2    equ  dword[ebp-14]
  441. .cos2    equ  dword[ebp-18]
  442. .piD180m3 equ dword[ebp-22]
  443. .cD2      equ word[ebp-24]
  444.         push  ebp
  445.         mov   ebp,esp
  446.         sub   esp,24
  447.  
  448.         fninit
  449.         mov     edi,[points_ptr]
  450.         xor     eax,eax
  451.                                ; init seed -> eight   3d points
  452.         mov     dword[edi],2.0
  453.         add     edi,4
  454.         stosd
  455.         stosd
  456.  
  457.         mov     dword[edi],2.0
  458.         mov     dword[edi+4],-0.5
  459.         add     edi,8
  460.         stosd
  461.  
  462.         mov     dword[edi],1.5
  463.         mov     dword[edi+4],-1.5
  464.         add     edi,8
  465.         stosd
  466.         mov     dword[edi],1.0
  467.         mov     dword[edi+4],-2.0
  468.         add     edi,8
  469.         stosd
  470.  
  471.         stosd
  472.         mov     dword[edi],-2.5
  473.         add     edi,4
  474.         stosd
  475.  
  476.         mov     [points_count_var],5
  477.  
  478.         mov     ecx,1
  479.       .next:                      ; calc angle and rotate seed 4 points
  480.         mov     .counter,cx
  481.         mov     ebx,[points_ptr]
  482.         fld     [piD180]
  483.         fimul   .counter
  484.         fsincos
  485.         fstp    .sin
  486.         fstp    .cos
  487.  
  488.       .rotor:                          ; next 4
  489.         ; rotary y
  490.         fld     dword[ebx]         ; x
  491.         fld     .sin
  492.         fmul    dword[ebx+8]       ; z * sinbeta
  493.         fchs
  494.         fld     .cos
  495.         fmul    dword[ebx]         ; x * cosbeta
  496.         faddp
  497.         fidiv   [i3]
  498.         fstp    dword[edi]         ; new x
  499.         fmul    .sin               ; old x * sinbeta
  500.         fld     .cos
  501.         fmul    dword[ebx+8]       ; z * cosbeta
  502.         faddp
  503.         fstp    dword[edi+8]       ; new z
  504.  
  505.         fld     dword[ebx+4]   ;y
  506.         fstp    dword[edi+4]
  507.  
  508.  
  509.       .end_rot:
  510.  
  511.         add     edi,12
  512.         add     ebx,12
  513.         mov     esi,[points_ptr]
  514.         add     esi,12*5
  515.         cmp     ebx,esi  ;real_points + (12*5)
  516.         jl      .rotor
  517.  
  518.         add     [points_count_var],5
  519.         add     cx,18
  520.         cmp     cx,(18*21)+1
  521.         jle     .next
  522. ;last points
  523.  
  524.         xor     eax,eax
  525.  
  526.         mov     dword[edi],0.22
  527.         mov     dword[edi+4],0.77
  528.         mov     dword[edi+8],1.25
  529.         add     edi,12
  530.  
  531.         mov     dword[edi],0.22
  532.         mov     dword[edi+4],0.77
  533.         mov     dword[edi+8],-1.25
  534.         add     edi,12
  535.         stosd
  536.  
  537.         add     [points_count_var],2
  538.  
  539. ; init triangles list
  540.  
  541.         mov     edi,[triangles_ptr]
  542.         mov     eax,5
  543.         mov     ebx,5+5
  544.         mov     [triangles_count_var],200  ;204
  545.  
  546.         mov     ecx,100
  547.       @@:
  548.         stosd                 ;----
  549.         mov     [edi],ebx      ;    |
  550.         add     edi,4         ;    |
  551.         inc     eax            ;    |
  552.         stosd                 ;    |repeat
  553.  
  554.         mov     [edi],ebx      ;    |
  555.         inc     ebx
  556.         add     edi,4
  557.         stosd                 ;    |
  558.         mov     [edi],ebx      ;    |
  559.         add     edi,4         ;----
  560.         loop     @b
  561.  
  562.         mov     eax,5
  563.         mov     ebx,[points_count_var]
  564.         sub     ebx,2
  565.         mov     dl,2
  566.     .nx:
  567.         mov     ecx,5
  568.         add     [triangles_count_var],ecx
  569.     @@:
  570.         stosd
  571.         add     eax,5
  572.         stosd
  573.         mov     dword[edi],ebx
  574.         add     edi,4
  575.         loop    @b
  576.  
  577.         cmp     dl,1
  578.         je      @f
  579.  
  580.         inc     ebx
  581.         jmp     .lab
  582.      @@:
  583.         dec     ebx
  584.      .lab:
  585.         mov     ecx,5
  586.         add     [triangles_count_var],ecx
  587.      @@:
  588.         stosd
  589.         add     eax,5
  590.         stosd
  591.         mov     dword[edi],ebx
  592.         add     edi,4
  593.         loop    @b
  594.  
  595.         dec     dl
  596.         or      dl,dl
  597.         jnz     .nx
  598.  
  599.         sub     eax,25
  600.         stosd
  601.         sub     eax,50
  602.         stosd
  603.         mov     dword[edi],ebx
  604.         add     edi,4
  605.  
  606.         stosd
  607.         add     eax,50
  608.         stosd
  609.         inc     ebx
  610.         mov     dword[edi],ebx
  611.         add     edi,4
  612.         add     [triangles_count_var],2
  613.  
  614.         mov     dword[edi],-1  ; < - end mark
  615.         mov     [culling_flag],0
  616.  
  617.         mov     esp,ebp
  618.         pop     ebp
  619.  
  620. ret
  621.  
  622.  
  623.  
  624.