Subversion Repositories Kolibri OS

Rev

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

  1. draw_dots:
  2.    mov     esi,[points_translated_ptr]
  3.    movzx   ecx,[points_count_var]
  4.  .drw:
  5.  @@:
  6.    lodsd
  7.    add     esi,2           ; skip z
  8.    movzx   ebx,ax
  9.    shr     eax,16          ; bx = x , ax = y
  10.    or      ax,ax
  11.    jl      @f
  12.    or      bx,bx
  13.    jl      @f
  14.    cmp     ax,SIZE_Y
  15.    jge     @f
  16.    cmp     bx,SIZE_X
  17.    jge     @f
  18.    mov     edx,SIZE_X      ; SIZE_X not only power of 2   -> 256,512,...
  19.    mul     edx
  20.    add     eax,ebx
  21.    mov     edi,[screen_ptr]
  22.    lea     eax,[eax*3]
  23.    add     edi,eax
  24.    xor     eax,eax
  25.    not     eax
  26.    stosd
  27.  @@:
  28.    loop    .drw
  29.  
  30. ret
  31.  
  32. do_emboss:
  33.  ;  emboss -  after drawing all,
  34.  ;  transfer screen buffer into bump map
  35.  ;  and draw two bump triangles
  36.  ; *************************************
  37.         mov     esi,screen
  38.         mov     edi,bumpmap2
  39.         mov     ecx,TEXTURE_SIZE/3
  40.         cld
  41. if  Ext=NON
  42.         xor     eax,eax
  43.         xor     bh,bh
  44.         xor     dh,dh
  45.       @@:
  46.         lodsb
  47.         movzx   bx,al
  48.         lodsb
  49.         movzx   dx,al
  50.         lodsb
  51.         add     ax,bx
  52.         add     ax,dx
  53.       ;  cwd
  54.       ;  div     [i3]
  55.  ;;       push    ax
  56.  ;;       pop     bx
  57.  ;;       shr     bx,3
  58.  ;;       shr     ax,2
  59.  ;;       add     ax,bx
  60.  
  61.         lea      eax,[eax*5]
  62.         shr      ax,4
  63.  
  64.         stosb
  65.         loop    @b
  66. else
  67.         emms
  68.         pxor          mm1,mm1
  69.         mov           ebx,0x0000ffff
  70.       @@:
  71.         movd          mm0,[esi]
  72.         punpcklbw     mm0,mm1
  73.         movq          mm2,mm0
  74.         psrlq         mm2,16
  75.         movq          mm3,mm0
  76.         psrlq         mm3,32
  77.         paddw         mm0,mm2
  78.         paddw         mm0,mm3
  79.  
  80.  
  81.         movd          eax,mm0
  82.         and           eax,ebx
  83.         lea           eax,[eax*5]
  84.         shr           ax,4
  85.         stosb
  86.         add           esi,3
  87.         loop          @b
  88.  
  89. end if
  90.         push    ebp
  91.  
  92.         push    dword 0          ; env coords
  93.         push    word 0
  94.         push    word SIZE_X
  95.         push    word SIZE_Y
  96.         push    dword 0
  97.         push    dword 0          ; bump coords
  98.         push    word SIZE_X
  99.         push    word SIZE_Y
  100.         push    word 0
  101.         mov     eax,SIZE_Y
  102.         mov     ebx,SIZE_X*65536+0
  103.         xor     ecx,ecx
  104.         mov     edx,bumpmap2
  105.         mov     esi,envmap
  106.         mov     edi,screen
  107.         call    bump_triangle
  108.  
  109.         push    dword SIZE_X shl 16 + SIZE_Y       ; env coords
  110.         push    word 0
  111.         push    word SIZE_X
  112.         push    word SIZE_Y
  113.         push    word 0
  114.         push    dword SIZE_X shl 16 + SIZE_Y        ; bump coords
  115.         push    word 0
  116.         push    word SIZE_X
  117.         push    word SIZE_Y
  118.         push    word 0
  119.         mov     eax,SIZE_Y
  120.         mov     ebx,SIZE_X * 65536+0
  121.         mov     ecx,SIZE_X shl 16 + SIZE_Y
  122.         mov     edx,bumpmap2
  123.         mov     esi,envmap
  124.         mov     edi,screen
  125.         call    bump_triangle
  126.  
  127.         pop     ebp
  128. ret
  129. ;********************************EMBOSS DONE*******************************
  130.  
  131.  
  132. generate_object2:  ; torus
  133. ;in  ax - figure number       2=torus, 3=loop, 4=loop
  134. ;locals
  135. ;   counter dw ?
  136. ;   sin     dd ?
  137. ;   cos     dd ?
  138. ;endl
  139. .counter equ  word[ebp-2]
  140. .sin     equ  dword[ebp-6]
  141. .cos     equ  dword[ebp-10]
  142. .sin2    equ  dword[ebp-14]
  143. .cos2    equ  dword[ebp-18]
  144. .piD180m3 equ dword[ebp-22]
  145. .cD2      equ word[ebp-24]
  146.         push  ebp
  147.         mov   ebp,esp
  148.         sub   esp,24
  149.  
  150.         push  ax
  151.  
  152.         fninit
  153.         mov     edi,[points_ptr]
  154.         xor     eax,eax
  155.                                     ; init seed -> 4   3d points
  156.         mov     dword[edi],-1.0     ; x
  157.         add     edi,4
  158.         stosd                       ; y
  159.         stosd                       ; z
  160.         mov     dword[edi],-0.9     ; x1
  161.         mov     dword[edi+4],0.1    ; y1
  162.         add     edi,8
  163.         stosd                       ; z1
  164.         mov     dword[edi],-0.8
  165.         add     edi,4
  166.         stosd
  167.         stosd
  168.         mov     dword[edi],-0.9     ; x3
  169.         mov     dword[edi+4],-0.1   ; y3
  170.         add     edi,8
  171.         stosd                       ; z3
  172.         mov     [points_count_var],4
  173.  
  174.         fld     [piD180]
  175.         fidiv   [i3]
  176.         fstp    .piD180m3
  177.         mov     .cD2,5
  178.  
  179.         pop     ax
  180.         mov     ecx,1
  181.         mov     edx,9
  182.       .next:                      ; calc angle and rotate seed 4 points
  183.         mov     .counter,cx
  184.         mov     ebx,[points_ptr]
  185.         fld     .piD180m3
  186.         fimul   .counter
  187.         fld     st
  188.         fsincos
  189.         fstp    .sin
  190.         fstp    .cos
  191.         fadd    st,st0
  192.         fsincos
  193.         fstp    .sin2
  194.         fstp    .cos2
  195.  
  196.       .rotor:                          ; next 4
  197.         ; rotary y
  198.         fld     dword[ebx]         ; x
  199.         fld     .sin
  200.         fmul    dword[ebx+8]       ; z * sinbeta
  201.         fchs
  202.         fld     .cos
  203.         fmul    dword[ebx]         ; x * cosbeta
  204.         faddp
  205.         fstp    dword[edi]         ; new x
  206.         fmul    .sin             ; old x * sinbeta
  207.         fld     .cos
  208.         fmul    dword[ebx+8]       ; z * cosbeta
  209.         faddp
  210.         dec     dx
  211.         or      dx,dx
  212.         jnz     @f
  213. ;        mov     .counter,dx
  214.         fld     st
  215.         fidiv   [i3]
  216.         faddp
  217.     @@:
  218.         fstp    dword[edi+8]       ; new z
  219.         fld     dword[ebx+4]
  220.         or      dx,dx
  221.         jnz     @f
  222.   ;      fld1
  223.   ;      faddp
  224. ;        fld     st
  225.         fadd    st,st0
  226.         fadd    st,st0
  227. ;        fxch
  228. ;        fimul   [i3]
  229. ;        fsin
  230. ;        faddp
  231.         mov     dx,9
  232.     @@:
  233.         fstp    dword[edi+4]
  234.         ; rotary x
  235.         cmp     al,3
  236.         jl      .end_rot
  237.         fld     dword[edi+4]    ;y
  238.         fld     .sin2
  239.         fmul    dword[edi+8]    ;z
  240.         fld     .cos2
  241.         fmul    dword[edi+4]    ;y
  242.         faddp
  243.         fstp    dword[edi+4]    ; new y
  244.         fmul    .sin2       ; sinbeta * old y
  245.         fchs
  246.         fld     .cos2
  247.         fmul    dword[edi+8]
  248.         faddp
  249.         fstp    dword[edi+8]
  250.         ; rotary z
  251.         cmp     al,4
  252.         jl      .end_rot
  253.         fld     dword[edi]      ;x
  254.         fld     .sin
  255.         fmul    dword[edi+4]    ;y
  256.         fld     .cos
  257.         fmul    dword[edi]      ;x
  258.         faddp
  259.         fstp    dword[edi]      ;new x
  260.         fmul    .sin       ; sinbeta * old x
  261.         fchs
  262.         fld     .cos
  263.         fmul    dword[edi+4]         ; cosbeta * y
  264.         faddp
  265.         fstp    dword[edi+4]    ; new y
  266.  
  267.  
  268.  
  269.       .end_rot:
  270.  
  271.         add     edi,12
  272.         add     ebx,12
  273.         mov     esi,[points_ptr]
  274.         add     esi,12*4
  275.         cmp     ebx,esi
  276.         jl      .rotor
  277.  
  278.         add     [points_count_var],4
  279.         add     cx,18
  280.         cmp     cx,(18*21*3)+1
  281.         jle     .next
  282.  
  283.         mov     edi,[triangles_ptr]
  284.         mov     ax,4
  285.         mov     bx,4+4
  286.         mov     [triangles_count_var],164*3   ;140
  287.  
  288.         mov     cx,80*3  ;68
  289.       @@:
  290.         stosw                 ;----
  291.         mov     [edi],bx      ;    |
  292.         add     edi,2         ;    |
  293.         inc     ax            ;    |
  294.         stosw                 ;    |repeat 4 times
  295.  
  296.         mov     [edi],bx      ;    |
  297.         inc     bx
  298.         add     edi,2
  299.         stosw                 ;    |
  300.         mov     [edi],bx      ;    |
  301.         add     edi,2         ;----
  302.         loop     @b
  303.  
  304.  
  305.         mov     dword[edi],-1  ; < - end mark
  306.         mov       [culling_flag],0
  307.  
  308.         mov     esp,ebp
  309.         pop     ebp
  310.  
  311. ret
  312.  
  313.  
  314. generate_object3:  ; heart
  315. ;locals
  316. ;   counter dw ?
  317. ;   sin     dd ?
  318. ;   cos     dd ?
  319. ;endl
  320. .counter equ  word[ebp-2]
  321. .sin     equ  dword[ebp-6]
  322. .cos     equ  dword[ebp-10]
  323. .sin2    equ  dword[ebp-14]
  324. .cos2    equ  dword[ebp-18]
  325. .piD180m3 equ dword[ebp-22]
  326. .cD2      equ word[ebp-24]
  327.         push  ebp
  328.         mov   ebp,esp
  329.         sub   esp,24
  330.  
  331.         fninit
  332.         mov     edi,[points_ptr]
  333.         xor     eax,eax
  334.                                ; init seed -> eight   3d points
  335.         mov     dword[edi],2.0
  336.         add     edi,4
  337.         stosd
  338.         stosd
  339.  
  340.         mov     dword[edi],2.0
  341.         mov     dword[edi+4],-0.5
  342.         add     edi,8
  343.         stosd
  344.  
  345.         mov     dword[edi],1.5
  346.         mov     dword[edi+4],-1.5
  347.         add     edi,8
  348.         stosd
  349.         mov     dword[edi],1.0
  350.         mov     dword[edi+4],-2.0
  351.         add     edi,8
  352.         stosd
  353.  
  354.         stosd
  355.         mov     dword[edi],-2.5
  356.         add     edi,4
  357.         stosd
  358.  
  359.         mov     [points_count_var],5
  360.  
  361.         mov     ecx,1
  362.       .next:                      ; calc angle and rotate seed 4 points
  363.         mov     .counter,cx
  364.         mov     ebx,[points_ptr]
  365.         fld     [piD180]
  366.         fimul   .counter
  367.         fsincos
  368.         fstp    .sin
  369.         fstp    .cos
  370.  
  371.       .rotor:                          ; next 4
  372.         ; rotary y
  373.         fld     dword[ebx]         ; x
  374.         fld     .sin
  375.         fmul    dword[ebx+8]       ; z * sinbeta
  376.         fchs
  377.         fld     .cos
  378.         fmul    dword[ebx]         ; x * cosbeta
  379.         faddp
  380.         fidiv   [i3]
  381.         fstp    dword[edi]         ; new x
  382.         fmul    .sin               ; old x * sinbeta
  383.         fld     .cos
  384.         fmul    dword[ebx+8]       ; z * cosbeta
  385.         faddp
  386.         fstp    dword[edi+8]       ; new z
  387.  
  388.         fld     dword[ebx+4]   ;y
  389.         fstp    dword[edi+4]
  390.  
  391.  
  392.       .end_rot:
  393.  
  394.         add     edi,12
  395.         add     ebx,12
  396.         mov     esi,[points_ptr]
  397.         add     esi,12*5
  398.         cmp     ebx,esi  ;real_points + (12*5)
  399.         jl      .rotor
  400.  
  401.         add     [points_count_var],5
  402.         add     cx,18
  403.         cmp     cx,(18*21)+1
  404.         jle     .next
  405. ;last points
  406.  
  407.         xor     eax,eax
  408.  
  409.         mov     dword[edi],0.22
  410.         mov     dword[edi+4],0.77
  411.         mov     dword[edi+8],1.25
  412.         add     edi,12
  413.  
  414.         mov     dword[edi],0.22
  415.         mov     dword[edi+4],0.77
  416.         mov     dword[edi+8],-1.25
  417.         add     edi,12
  418.         stosd
  419.  
  420.         add     [points_count_var],2
  421.  
  422. ; init triangles list
  423.  
  424.         mov     edi,[triangles_ptr]
  425.         mov     ax,5
  426.         mov     bx,5+5
  427.         mov     [triangles_count_var],204
  428.  
  429.         mov     cx,100
  430.       @@:
  431.         stosw                 ;----
  432.         mov     [edi],bx      ;    |
  433.         add     edi,2         ;    |
  434.         inc     ax            ;    |
  435.         stosw                 ;    |repeat
  436.  
  437.         mov     [edi],bx      ;    |
  438.         inc     bx
  439.         add     edi,2
  440.         stosw                 ;    |
  441.         mov     [edi],bx      ;    |
  442.         add     edi,2         ;----
  443.         loop     @b
  444.  
  445.         mov     ax,5
  446.         mov     bx,[points_count_var]
  447.         sub     bx,2
  448.         mov     dl,2
  449.     .nx:
  450.         mov     cx,5
  451.         add     [triangles_count_var],cx
  452.     @@:
  453.         stosw
  454.         add     ax,5
  455.         stosw
  456.         mov     word[edi],bx
  457.         add     edi,2
  458.         loop    @b
  459.  
  460.         cmp     dl,1
  461.         je      @f
  462.  
  463.         inc     bx
  464.         jmp     .lab
  465.      @@:
  466.         dec     bx
  467.      .lab:
  468.         mov     cx,5
  469.         add     [triangles_count_var],cx
  470.      @@:
  471.         stosw
  472.         add     ax,5
  473.         stosw
  474.         mov     word[edi],bx
  475.         add     edi,2
  476.         loop    @b
  477.  
  478.         dec     dl
  479.         or      dl,dl
  480.         jnz     .nx
  481.  
  482.         sub     ax,25
  483.         stosw
  484.         sub     ax,50
  485.         stosw
  486.         mov     word[edi],bx
  487.         add     edi,2
  488.  
  489.         stosw
  490.         add     ax,50
  491.         stosw
  492.         inc     bx
  493.         mov     word[edi],bx
  494.         add     edi,2
  495.         add     [triangles_count_var],2
  496.  
  497.         mov     dword[edi],-1  ; < - end mark
  498.         mov     [culling_flag],0
  499.  
  500.         mov     esp,ebp
  501.         pop     ebp
  502.  
  503. ret
  504.