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. ;init_envmap_cub2:
  2. ;        mov esi,envmap
  3. ;        mov edi,envmap_cub    ;take cubic env. map from
  4. ;        xor eax,eax           ;spherical env. map
  5. ;      @@:
  6. ;        add esi,eax
  7. ;        movsd
  8. ;        dec edi
  9. ;        dec esi
  10. ;        add esi,511*3
  11. ;        add eax,3
  12. ;        cmp eax,511*3
  13. ;        jl  @b
  14. ;ret
  15. init_envmap_cub:         ; create 512x512 env map
  16. .temp equ word [ebp-2]
  17.          push     ebp
  18.          mov      ebp,esp
  19.          sub      esp,2
  20.          mov      edi,envmap_cub
  21.          fninit
  22.  
  23.          mov      cx,-256
  24.     .ie_hor:
  25.          mov      .temp,cx
  26.          fild     .temp
  27.          fabs
  28.   ;      fmul     st,st0
  29.   ;      fsqrt
  30.          mov      .temp,255
  31.          fisubr   .temp
  32.          fmul     [env_const]
  33.          fistp    .temp
  34.          mov      ax,.temp
  35.  
  36.          or      ax,ax
  37.          jge     .ie_ok1
  38.          xor     ax,ax
  39.          jmp     .ie_ok2
  40.   .ie_ok1:
  41.          cmp     ax,255
  42.          jle     .ie_ok2
  43.          mov     ax,255
  44.   .ie_ok2:
  45.          stosb
  46.          stosb
  47.          stosb
  48.  
  49.          inc     cx
  50.          cmp     cx,256
  51.          jne     .ie_hor
  52.  
  53.          mov     esp,ebp
  54.          pop     ebp
  55. ret
  56.  
  57. calc_one_col:
  58. ; procedure don't save registers !!!
  59. ; in -   st - dot_product
  60. ;        stack - other parameters
  61. ; out - eax - 0x00rrggbb
  62. .dot_prd   equ dword[ebp+4]           ; dot product   - cos x  - not now
  63. .min_col_r equ [ebp+8]            ; minimum color - ambient
  64. .min_col_g equ word[ebp+10]
  65. .min_col_b equ word[ebp+12]
  66. .max_col_r equ [ebp+14]           ; maximum color - specular
  67. .max_col_g equ word[ebp+16]
  68. .max_col_b equ word[ebp+18]
  69. .org_col_r equ [ebp+20]           ; orginal color - diffuse
  70. .org_col_g equ word[ebp+22]
  71. .org_col_b equ word[ebp+24]
  72. .n         equ word[ebp+26]           ; shines - not implemented
  73. .temp      equ word[ebp-2]
  74. .color_sum_r equ [ebp-6]
  75. .color_sum_g equ [ebp-10]
  76. .color_sum_b equ [ebp-14]
  77. ; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
  78.          mov     ebp,esp
  79.          sub     esp,14
  80.  
  81.  
  82.          mov      ax,.min_col_r
  83.          add      ax,.max_col_r
  84.          add      ax,.org_col_r
  85.          cwde
  86.          mov      .color_sum_r,eax
  87.  
  88.          mov      ax,.min_col_g
  89.          add      ax,.max_col_g
  90.          add      ax,.org_col_g
  91.          cwde
  92.          mov      .color_sum_g,eax
  93.  
  94.          mov      ax,.min_col_b
  95.          add      ax,.max_col_b
  96.          add      ax,.org_col_b
  97.          cwde
  98.          mov      .color_sum_b,eax
  99. if 0
  100.  
  101.  
  102.          movq       xmm0,.min_col_r
  103.          movq       xmm1,.max_col_r
  104.          movq       xmm2,.org_col_r
  105.          packuswb   xmm0,[the_zero]
  106.          packuswb   xmm1,[the_zero]
  107.          packuswb   xmm2,[the_zero]
  108.          punpcklbw  xmm0,xmm1
  109.          punpcklbw  xmm2,[the_zero]
  110.          packusdw   xmm2,[the_zero]
  111.          cvtdq2ps   xmm0,xmm0
  112.          cvtdq2ps   xmm1,xmm1
  113.          cvtdq2ps   xmm2,xmm2
  114.          haddps     xmm0,xmm0
  115.          haddps     xmm1,xmm1
  116.          haddps     xmm2,xmm2
  117.          haddps     xmm0,xmm0
  118.          haddps     xmm1,xmm1
  119.          haddps     xmm2,xmm2
  120.  
  121.          cvtss2si   eax,xmm0
  122.          cvtss2si   ebx,xmm1
  123.          cvtss2si   ecx,xmm2
  124.          mov        .color_sum_r,eax
  125.          mov        .color_sum_g,ebx
  126.          mov        .color_sum_b,ecx
  127.  
  128.  
  129. end if
  130.  
  131. ;         fld     .dot_prd
  132.        ;  fild    .n
  133.        ;  fxch    st1
  134.        ;  fabs
  135.        ;  fyl2x                     ;
  136.        ;  f2xm1
  137.        ;  fld1
  138.        ;  faddp        ; st =  dot_product ^ n
  139.  
  140.          fld     st            ; copy dot pr
  141.          fmul    st,st0
  142.          fmul    st,st0
  143.          fmul    st,st0
  144.          cmp     .n,255            ; .n = 255 -> spot light
  145.          jne     @f
  146.          fmul    st,st0
  147.          fmul    st,st0
  148.          fmul    st,st0
  149.       @@:
  150.          fld     st            ; st0=st1=dot_pr^n, st2=dot_pr
  151.          fimul   .max_col_b
  152.          fild    .org_col_b
  153.          fmul    st,st3
  154.          faddp                 ; st0=first piece of col, st1=dot_pr^n..
  155.          fiadd   .min_col_b
  156.          fimul   .max_col_b
  157.          fidiv   dword .color_sum_b
  158.          fistp   .temp
  159.          movzx   eax,.temp
  160.          shl     eax,16
  161.  
  162.          fld     st
  163.          fimul   .max_col_g
  164.          fild    .org_col_g
  165.          fmul    st,st3
  166.          faddp
  167.          fiadd   .min_col_g
  168.          fimul   .max_col_g
  169.          fidiv   dword .color_sum_g
  170.          fistp   .temp
  171.          mov     ax,.temp
  172.          mov     ah,al
  173.          shl     eax,8
  174.  
  175.          fimul   word .max_col_r
  176.          fild    word .org_col_r
  177.          fmulp   st2,st
  178.          faddp
  179.          fiadd   word .min_col_r
  180.          fimul   word .max_col_r
  181.          fidiv   dword .color_sum_r
  182.          fistp   .temp
  183.          mov     ax,.temp          ;eax -  0xbbgg00rr
  184.      ;   mov     ah,al
  185.          ror     eax,16
  186.          xchg    al,ah             ; eax - 0x00rrggbb
  187.          mov     esp,ebp
  188. ret 24
  189.  
  190. calc_bumpmap:            ; calculate random bumpmap
  191. ;--------------in edi _ pointer to TEX_X x TEX_Y bumpmap
  192.  
  193.          push    edi
  194.  
  195.          cmp     [bumps_flag],0
  196.          je      .random_bump_map
  197.          ; else bumps according to texture
  198.          mov     esi,texmap
  199.          mov     ecx,TEXTURE_SIZE
  200.       @@:
  201.          movzx   ax,byte[esi]
  202.          movzx   bx,byte[esi+1]
  203.          movzx   dx,byte[esi+2]
  204.          add     ax,bx
  205.          add     ax,dx
  206.          cwd
  207.          div     [i3]
  208.          stosb
  209.          add     esi,3
  210.          loop    @b
  211.          jmp     .blur_map
  212. ;         push    ecx
  213. ;         mov     eax,0x88888888
  214. ;         mov     ecx,16/4
  215. ;         rep     stosd
  216. ;         mov     eax,0xffffffff
  217. ;         mov     ecx,16/4
  218. ;         rep     stosd
  219. ;         pop     ecx
  220. ;         loop    @b
  221.   .random_bump_map:
  222.  
  223.          mov     ecx,TEXTURE_SIZE
  224.       @@:
  225.          push    ecx
  226.          xor     ecx,ecx
  227.          mov     edx,255
  228.          call    random
  229.          stosb
  230.          pop    ecx
  231.          loop   @b
  232.  
  233.       .blur_map:
  234.          pop    edi
  235.          movzx  ecx,[bumps_deep_flag]
  236.          inc    cx
  237.       .blur:
  238.          xor    esi,esi
  239.          mov    edx,TEXTURE_SIZE
  240.          xor    eax,eax
  241.          xor    ebx,ebx
  242.       @@:
  243.          mov    ebp,esi
  244.          dec    ebp
  245.          and    ebp,TEXTURE_SIZE
  246.          mov    al,byte[ebp+edi]
  247.  
  248.          mov    ebp,esi
  249.          inc    ebp
  250.          and    ebp,TEXTURE_SIZE
  251.          mov    bl,byte[ebp+edi]
  252.          add    eax,ebx
  253.  
  254.          mov    ebp,esi
  255.          sub    ebp,TEX_X
  256.          and    ebp,TEXTURE_SIZE
  257.          mov    bl,byte[ebp+edi]
  258.          add    eax,ebx
  259.  
  260.          mov    ebp,esi
  261.          add    ebp,TEX_X
  262.          and    ebp,TEXTURE_SIZE
  263.          mov    bl,byte[ebp+edi]
  264.          add    eax,ebx
  265.  
  266.          shr    eax,2
  267.          mov    byte[esi+edi],al
  268.  
  269.          inc    esi
  270.          dec    edx
  271.          jnz    @b
  272.  
  273.          loop   .blur
  274. ret
  275. random:
  276. ;  in  - ecx - min
  277. ;        edx - max
  278. ;  out - eax - random number
  279.          mov    bx,[rand_seed]
  280.          add    bx,0x9248
  281.          ror    bx,3
  282.          mov    [rand_seed],bx
  283.  
  284.          mov    ax,dx
  285.          sub    ax,cx
  286.          mul    bx
  287.          mov    ax,dx
  288.          add    ax,cx
  289.          cwde
  290. ret
  291.  
  292. optimize_object1:        ; setting   point (0,0,0) in center of object
  293.                          ; recalculate all coords , scale object,
  294.                          ;the coords in <-1.0,1.0>
  295. ;in :  real_points - table filled of real float dd coordinates (x,y,z), end mark  dd -1
  296. ;                  _ global variable
  297. ;      points_count_var - dw integer variable with exactly points count
  298. ;                       - global variable
  299. ;      SIZE_X, SIZE_Y must be defined
  300.  
  301. .max   equ dword[ebp-4]
  302. .min   equ dword[ebp-8]
  303. .maxxx equ dword[ebp-12]
  304. .center equ dword[ebp-16]
  305.  
  306.         mov     ebp,esp
  307.         sub     esp,16
  308.         fninit
  309.         mov     .maxxx,0
  310.         mov     ecx,3
  311.         xor     ebx,ebx         ; ebx - x,y,z coord in real_points list
  312.     .next_c:                    ; max/min/center x,y,z
  313.         mov     edi,[points_ptr]      ; in real_point list minimum two points
  314.         mov     edx,[points_count_var]
  315.         fld     dword[edi+ebx]
  316.         fst     .max
  317.         fstp    .min
  318.         add     edi,12
  319.         dec     edx
  320.     .next_coord:               ; next coord from real_points list
  321.         fld     dword [edi+ebx]   ; real_points -> x,y,z
  322.         fcom    .max    ; max_x,y,z
  323.         fstsw   ax
  324.         sahf
  325.         jbe     @f             ; jmp less equal
  326.         fstp    .max    ; new max_x,y,z
  327.         jmp     .end_coords
  328.      @@:
  329.         fcom    .min    ; min_x,y,z
  330.         fstsw   ax
  331.         sahf
  332.         jnbe    @f              ; jmp greater
  333.         fst     .min   ; new min_x
  334.     @@:
  335.         ffree   st
  336.     .end_coords:
  337.         add     edi,12
  338.    ;     cmp     dword[edi],-1   ; cmp with end mark
  339.         dec      edx
  340.         jnz     .next_coord
  341.         ; ok after this we found max_coord and min_coord
  342.         fld     .max          ; find center point
  343.         fadd    .min
  344.         fld1
  345.         fld1
  346.         faddp
  347.         fdivp   st1,st        ; st0 - center coord
  348.         fstp    .center
  349.  
  350.         fld     .max
  351.         fsub    .center      ; st = .max - .center
  352.         fcom    .maxxx      ; maximum of all .max
  353.         fstsw   ax
  354.         sahf
  355.         jbe     @f          ; jmp lower
  356.         fst     .maxxx      ; new maxx
  357.     @@:
  358.         ffree   st
  359.         mov     edi,[points_ptr]
  360.         mov     edx,[points_count_var]   ; substraction all coords - center point
  361.     @@:
  362.         fld     dword[edi+ebx]
  363.         fsub    .center
  364.         fstp    dword[edi+ebx]
  365.         add     edi,12
  366. ;        cmp     dword[edi],-1
  367. ;        jne     @b
  368.         dec      edx
  369.         jnz      @b
  370.  
  371.         add     ebx,4               ; ebx - x,y,z cooficientes in list real_points
  372.         dec     ecx
  373.         jnz     .next_c
  374.  
  375.         fld     .maxxx
  376.         mov     edi,[points_ptr]   ; create all coords in <-1.0,1.0>
  377.         mov     ecx,[points_count_var]
  378.      @@:
  379.         fld     dword[edi]
  380.         fdiv    .maxxx
  381.         fstp    dword[edi]
  382.         fld     dword[edi+4]
  383.         fdiv    .maxxx
  384.         fstp    dword[edi+4]
  385.         fld     dword[edi+8]
  386.         fdiv    .maxxx
  387.         fstp    dword[edi+8]
  388.         add     edi,12
  389.         loop    @b
  390.      ;   cmp     dword[edi],-1
  391.  
  392.      ;   jne     @b
  393.  
  394.         mov     esp,ebp
  395. ret
  396.  
  397. generate_object:         ; generate node
  398. .N         equ 32
  399. .x         equ word[ebp-2]
  400. .Ndiv2     equ word[ebp-10]
  401. .MthickSqr equ dword[ebp-14]   ; diameter^2
  402. .temp      equ dword[ebp-18]   ; variable for x <-1;1>
  403. .Hthick    equ dword[ebp-22]
  404. .cos_temp  equ dword[ebp-26]
  405. .next_const  equ dword[ebp-30]
  406. .a           equ dword[ebp-34]
  407. .Pi2         equ       ebp-38
  408.  
  409.  
  410.  
  411.        mov      ebp,esp
  412.        sub      esp,42
  413.  
  414.        mov      .Ndiv2,.N/2
  415.        fninit
  416.        fldpi
  417.        fadd     st,st
  418.        fst      dword[.Pi2]
  419.        fidiv    .Ndiv2
  420.        fst      .a                       ; .Ndiv2*.a=2Pi => .a=2pi/.Ndiv2
  421.  
  422.        fld      [.Mthick]           ; inside diameter, (outside daiameter = 1)
  423.        fmul     st,st0
  424.        fstp     .MthickSqr
  425.        fld1
  426.  
  427.        fsub      [.Mthick]
  428.  
  429.        fst      .Hthick            ; Hthick = 1 - Mthick
  430.        fld      st
  431.        fadd     st,st
  432.        faddp
  433.        fstp     .next_const         ; next_const = Hthick * 3
  434.  
  435.  
  436.     ;init triangles list
  437.        mov      edi,[triangles_ptr]
  438.  
  439.        xor      esi,esi
  440.        xor      eax,eax
  441.        mov      ebx,.N+1
  442.        mov      ecx,(.N*2)+2  ;--
  443.        mov      edx,(.N*3)+3  ;---
  444.        mov      [triangles_count_var],0
  445.      .again_tri:
  446.        stosd                             ; main wave
  447.        mov      dword[edi],ebx
  448.        inc      eax
  449.        add      edi,4
  450.        stosd
  451.        stosd
  452.        mov      dword[edi],ebx
  453.        inc      ebx
  454.        mov      dword[edi+4],ebx
  455.  
  456.  
  457.        add      edi,8
  458.  
  459.        mov      dword[edi],ecx      ;----   ;     n2+2        ;    xor      ax,ax
  460.        inc      ecx                        ;     n2+3        ;    mov      bx,.N+1
  461.        mov      dword[edi+4],edx            ;                 ;    mov      cx,(.N*2)+2  ;--
  462.        mov      dword[edi+8],ecx            ;     n3+3        ;    mov      dx,(.N*3)+3  ;---
  463.        mov      dword[edi+12],edx            ;     n3+3        ;
  464.        inc      edx                        ;                 ;
  465.        mov      dword[edi+16],edx            ;     n2+3        ;
  466.        mov      dword[edi+20],ecx           ;     n3+4
  467.        add      edi,24              ;----
  468.  
  469.        dec      eax          ; border of wave
  470.        dec      ebx
  471.        dec      ecx
  472.        dec      edx
  473.  
  474.        stosd                      ; first border
  475.        inc      eax
  476.        stosd
  477.        mov      dword[edi],edx
  478.        add      edi,4
  479.  
  480.        mov      dword[edi],edx
  481.        add      edi,4
  482.        stosd
  483.        inc      edx
  484.        mov      dword[edi],edx
  485.  
  486.        mov     dword[edi+4],ebx      ; second border
  487.        mov     dword[edi+8],ecx
  488.        inc     ebx
  489.        mov     dword[edi+12],ebx
  490.  
  491.        mov     dword[edi+16],ebx
  492.        mov     dword[edi+20],ecx
  493.        inc     ecx
  494.        mov     dword[edi+24],ecx
  495.        add     edi,28
  496.  
  497.        add      [triangles_count_var],8     ;10
  498.        inc      esi
  499.        cmp      esi,.N
  500.        jne      .again_tri
  501.  
  502.        add      eax,((.N+1)*3)+1
  503.        add      ebx,((.N+1)*3)+1
  504.        add      ecx,((.N+1)*3)+1
  505.        add      edx,((.N+1)*3)+1
  506.        xor      esi,esi
  507.        cmp      eax,(.N*13)+13    ;;;(.N*23)+23                ; ax,(.N*13)+13
  508.        jl      .again_tri
  509.  
  510.      ;  mov      dword[edi],-1          ;      <--- end mark not always in use
  511.  
  512.     ; init real points list
  513.        mov      .x,-(.N/2)
  514.        mov      edi,[points_ptr]
  515.        lea      esi,[edi+(12*(.N+1))]
  516.        mov      eax,[points_ptr]
  517.        mov      ebx,eax
  518.        add      eax,2*12*(.N+1)    ;---
  519.        add      ebx,3*12*(.N+1)    ;---
  520.        mov      [points_count_var],0
  521.  
  522.  
  523.        .R_P4 equ edi+(4*12*(.N+1))
  524.        .R_P5 equ edi+(5*12*(.N+1))
  525.        .R_P6 equ edi+(6*12*(.N+1))
  526.        .R_P7 equ edi+(7*12*(.N+1))
  527.  
  528.        .R_P8 equ edi+(8*12*(.N+1))
  529.        .R_P9 equ edi+(9*12*(.N+1))
  530.        .R_P10 equ edi+(10*12*(.N+1))
  531.        .R_P11 equ edi+(11*12*(.N+1))
  532.  
  533.        .R_P12 equ edi+(12*12*(.N+1))
  534.        .R_P13 equ edi+(13*12*(.N+1))
  535.        .R_P14 equ edi+(14*12*(.N+1))
  536.        .R_P15 equ edi+(15*12*(.N+1))
  537.  
  538.      @@:
  539.        ; x coordinate
  540.        fild     .x
  541.        fld      st
  542. ;;       fmul     .a                  ; st = <-2pi;2pi>  when mul .a
  543.        fidiv    .Ndiv2
  544.        fst      .temp                 ; temporary x in <-1.0;1.0>
  545.  
  546.        fst      dword[edi]              ;x coordinate of point
  547.        fst      dword[esi]
  548.        fst      dword[eax]              ;--
  549.  
  550.  
  551.        fst      dword[.R_P4]
  552.        fst      dword[.R_P5]
  553.        fst      dword[.R_P6]
  554.        fst      dword[.R_P7]
  555.  
  556.        fst      dword[.R_P8]
  557.        fst      dword[.R_P9]
  558.        fst      dword[.R_P10]
  559.        fst      dword[.R_P11]
  560.  
  561.        fst      dword[.R_P12]
  562.        fst      dword[.R_P13]
  563.        fst      dword[.R_P14]
  564.        fst      dword[.R_P15]
  565.  
  566.        fstp     dword[ebx]  ;pop
  567.       ;*******y coord               dword[offset + 4]
  568.        fmul      .a      ;  st  = <-2pi;2pi>
  569.        fsincos
  570.        fmul     .next_const
  571.        fst      dword[edi+4]            ; y coordinate of point
  572.        fst      dword[esi+4]
  573.        fst      dword[.R_P4+4]
  574.        fst      dword[.R_P5+4]
  575.        fld      .Hthick
  576.        faddp
  577.        fst      dword[.R_P6+4]
  578.        fst      dword[.R_P7+4]
  579.        fst      dword[eax+4]
  580.        fst      dword[ebx+4]
  581.  
  582.        fchs
  583.        fst      dword[.R_P10+4]
  584.        fst      dword[.R_P11+4]
  585.        fst      dword[.R_P14+4]
  586.        fst      dword[.R_P15+4]
  587.        fadd     .Hthick
  588.        fadd     .Hthick
  589.        fst      dword[.R_P8+4]
  590.        fst      dword[.R_P9+4]
  591.        fst      dword[.R_P12+4]
  592.        fstp     dword[.R_P13+4]
  593.  
  594.  
  595.        fmul     .Hthick
  596.        fmul     .next_const
  597.        fstp     .cos_temp           ; cos_temp = Hthick^2 * 3
  598.  
  599.      ;***************z coord
  600.        fld      .temp
  601.        fld      st
  602.        fmul     st,st0                  ; z coords
  603.        fchs
  604.        fld1
  605.        faddp
  606.        fabs
  607.        fsqrt
  608. ;       fld      st
  609. ;       fsub
  610.        fld      st
  611.        fsub     .cos_temp
  612.        fst      dword[esi+8]
  613.        fstp     dword[eax+8]            ;--
  614.        fld      st
  615.        fadd     .cos_temp
  616.        fst      dword[.R_P9+8]
  617.        fstp     dword[.R_P10+8]
  618.        fchs
  619.        fld      st
  620.        fsub     .cos_temp
  621.        fst      dword[.R_P6+8]
  622.        fstp     dword[.R_P5+8]
  623.        fadd     .cos_temp
  624.        fst      dword[.R_P13+8]
  625.        fstp     dword[.R_P14+8]
  626.  
  627.        fmul     [.Mthick]
  628.        fmul     st,st0
  629.        fchs
  630.        fld      .MthickSqr
  631.        faddp
  632.        fabs
  633.        fsqrt
  634.        fld      st
  635.        fsub     .cos_temp
  636.        fst      dword[edi+8]            ;  z coordinate
  637.        fstp     dword[ebx+8]            ;--
  638.        fld      st
  639.        fadd     .cos_temp
  640.        fst      dword[.R_P8+8]
  641.        fstp     dword[.R_P11+8]
  642.        fchs
  643.        fld      st
  644.        fsub     .cos_temp
  645.        fst      dword[.R_P7+8]
  646.        fstp     dword[.R_P4+8]
  647.        fadd     .cos_temp
  648.        fst      dword[.R_P12+8]
  649.        fstp     dword[.R_P15+8]
  650.  
  651.        add      edi,12
  652.        add      esi,12
  653.        add      eax,12                  ;--
  654.        add      ebx,12                  ;---
  655.        add      [points_count_var],24         ;16
  656.        inc      .x
  657.        cmp      .x,.N/2
  658.        jng      @b
  659. ;       mov      dword[esi],-1       ; <-- end mark
  660.        mov       [culling_flag],0
  661.        mov     esp,ebp
  662. ret
  663. .Mthick dd  0.85     ; size-thickness
  664.  
  665. make_random_lights:
  666.   .temp1  equ ebp-4
  667.   .temp2  equ ebp-8     ;  - light vector generate variables
  668.   .temp3  equ ebp-12
  669.   .max equ 800
  670.         RDTSC
  671.         mov    [rand_seed],ax
  672.         push    ebp
  673.         mov     ebp,esp
  674.         sub     esp,12
  675.         mov     edi,lights
  676.         fninit
  677.         mov     dword[.temp2],.max
  678.         mov     dword[.temp3],.max/2
  679.  
  680.     .again:
  681.         xor     esi,esi
  682.      @@:
  683.         mov     edx,.max
  684.         xor     ecx,ecx
  685.         call    random
  686.         sub     eax,.max/2
  687.         mov     dword[.temp1],eax
  688.         fild    dword[.temp1]
  689.         fidiv   dword[.temp3]
  690.         fstp    dword[edi+esi*4]
  691.         inc     esi
  692.         cmp     esi,2
  693.         jne     @b
  694.  
  695.   .max1 equ 1000
  696.         mov     dword[.temp2],.max1/2
  697.         mov     edx,.max1
  698.         xor     ecx,ecx
  699.         call    random
  700.         mov     dword[.temp1],eax
  701.         fild    dword[.temp1]
  702.         fchs
  703.         fidiv   dword[.temp2]
  704.         fstp    dword[edi+8]
  705.  
  706.         xor     esi,esi
  707.      @@:
  708.         mov     ecx,220            ; max colors and shine  , ecx = 200 - more bright shading
  709.         mov     edx,255
  710.         call    random
  711.         mov     byte[edi+18+esi],al
  712.         inc     esi
  713.         cmp     esi,4
  714.         jne     @b
  715.  
  716.  
  717.         xor     esi,esi
  718.      @@:
  719.         mov     ecx,100              ; orginal colors
  720.         movzx   edx,byte[edi+18+esi]
  721.         call    random
  722.         mov     byte[edi+12+esi],al
  723.         inc     esi
  724.         cmp     esi,3
  725.         jne     @b
  726.  
  727.         xor     esi,esi
  728.      @@:
  729.         mov     ecx,1               ; min cols
  730.         movzx   edx,byte[edi+12+esi]
  731.         call    random
  732.         mov     byte[edi+15+esi],al
  733.         inc     esi
  734.         cmp     esi,3
  735.         jne     @b
  736.  
  737.         add     edi,LIGHT_SIZE ;22
  738.         cmp     edi,lightsend     ; see file View3ds,asm
  739.         jne     .again
  740.  
  741.         mov     esp,ebp
  742.         pop     ebp
  743. ret
  744.  
  745. generate_texture2:
  746. .const equ 32
  747.         mov     edi,texmap
  748.         xor     bx,bx
  749.      .next_line:
  750.         xor     dx,dx
  751.      .next2stripes:
  752.         mov     eax,-1
  753.         mov     ecx,(TEX_X/.const)*3/4
  754.         rep     stosd
  755.         mov     eax,0x00ff0000
  756.         mov     ecx,(TEX_X/.const)
  757.      @@:
  758.         stosd
  759.         dec     edi
  760.         loop    @b
  761.         inc     dx
  762.         cmp     dx,.const/2
  763.         jl      .next2stripes
  764.         inc     bx
  765.         cmp     bx,TEX_Y
  766.         jl      .next_line
  767. ret
  768.  
  769. blur_screen:    ;blur n times  ; blur or fire
  770. ;in - ecx  times count
  771. ;.counter equ dword[esp-4]
  772. .counter1 equ dword[esp-8]
  773. if Ext>=SSE2
  774.          push       ebp
  775.          mov        ebp,esp
  776.          push       dword 0x01010101
  777.          movss      xmm5,[esp]
  778.          shufps     xmm5,xmm5,0
  779.      .again_blur:
  780.          push       ecx
  781.          mov        edi,[screen_ptr]
  782.          movzx      ecx,word[size_x_var]  ;SIZE_X*3/4
  783.  
  784.          cmp         [dr_flag],12
  785.          jge        @f
  786.          lea        ecx,[ecx*3+1]
  787.          shr        ecx,2
  788.        @@:
  789.  
  790.          xor        eax,eax
  791.          rep        stosd
  792.    if 1
  793.          movzx      ebx,word[size_x_var]
  794.          movzx      ecx,word[size_y_var]
  795.          sub        ecx,3
  796.          imul       ecx,ebx
  797.          cmp        [dr_flag],12  ; 32 bit per pix cause
  798.          jge        @f
  799.          lea        ecx,[ecx*3]
  800.          shr        ecx,4
  801.          lea        ebx,[ebx *3]
  802.          jmp        .blr
  803.        @@:
  804.  
  805.          shr        ecx,2
  806.          shl        ebx,2
  807.        ;  mov        ecx,(SIZE_X*(SIZE_Y-3))*3/16
  808.      .blr:
  809.      @@:
  810.          push       ecx
  811.          movups     xmm0,[edi+ebx]
  812.          mov        ecx,edi
  813.          sub        ecx,ebx
  814.          movups     xmm1,[ecx]
  815.          cmp         [dr_flag],12
  816.          jge        @f
  817.          movups     xmm2,[edi-3]
  818.          movups     xmm3,[edi+3]
  819.          jmp        .f
  820.         @@:
  821.          movups     xmm2,[edi-4]
  822.          movups     xmm3,[edi+4]
  823.         .f:
  824.          pavgb      xmm0,xmm1
  825.          pavgb      xmm2,xmm3
  826.          pavgb      xmm0,xmm2
  827.          psubusb    xmm0,xmm5  ; importand if fire
  828.          movups     [edi],xmm0
  829.          add        edi,16
  830.          add        esi,16
  831.          pop        ecx
  832.          loop       .blr
  833.     end if
  834.          xor        eax,eax
  835.          movzx      ecx,word[size_x_var]
  836.          cmp        [dr_flag],12
  837.          jge        @f
  838.          lea        ecx,[ecx*3]
  839.          shr        ecx,2
  840.         @@:
  841.     ;     mov        ecx,SIZE_X*3/4
  842.          rep        stosd
  843.          pop        ecx
  844.          dec        ecx
  845.          jnz       .again_blur
  846.          mov        esp,ebp
  847.          pop        ebp
  848. end if
  849.  
  850. if Ext=SSE
  851.          emms
  852.          push       ebp
  853.          mov        ebp,esp
  854.          push       dword 0x01010101
  855.          push       dword 0x01010101
  856.          movq       mm4,[esp]
  857.      .again_blur:
  858.          push       ecx
  859.          mov        edi,[screen_ptr]
  860.          movzx      ecx,word[size_x_var]  ;SIZE_X*3/4
  861.          lea        ecx,[ecx*3]
  862.          shr        ecx,2
  863.      ;    pxor       mm5,mm5
  864.          xor        eax,eax
  865.          rep        stosd
  866.          movzx      ebx,word[size_x_var]
  867.          movzx      ecx,word[size_y_var]
  868.          sub        ecx,3
  869.          imul       ecx,ebx
  870.          lea        ecx,[ecx*3]
  871.          shr        ecx,3
  872.          lea        ebx,[ebx*3]
  873.        ;  mov        ecx,(SIZE_X*(SIZE_Y-3))*3/8
  874.      .blr:
  875.      @@:
  876.          movq       mm0,[edi+ebx]
  877.          movq       mm1,[edi-ebx]
  878.          movq       mm2,[edi-3]
  879.          movq       mm3,[edi+3]
  880.  
  881.          pavgb      mm0,mm1
  882.          pavgb      mm2,mm3
  883.          pavgb      mm0,mm2
  884.  
  885.          psubusb    mm0,mm4  ; importand if fire
  886.  
  887.          movq       [edi],mm0
  888.          add         edi,8
  889.          add         esi,8
  890.  
  891.          loop        .blr
  892.  
  893.          xor        eax,eax
  894.          mov        ecx,[size_x_var]
  895.          lea        ecx,[ecx*3]
  896.          shr        ecx,2
  897.        ;  SIZE_X*3/4
  898.          rep        stosd
  899.          pop         ecx
  900.          loop       .again_blur
  901.          mov        esp,ebp
  902.          pop        ebp
  903. end if
  904.  
  905. if Ext=MMX
  906.          emms
  907.          push       ebp
  908.          mov        ebp,esp
  909.          push       dword 0x0
  910.          push       dword 0x01010101
  911. .again_blur:
  912.          push       ecx
  913.          mov        edi,[screen_ptr]
  914.          mov        ecx,SIZE_X*3/4
  915.          pxor       mm5,mm5
  916.          xor        eax,eax
  917.          rep        stosd
  918.  
  919.          mov        ecx,(SIZE_X*(SIZE_Y-3))*3/4
  920.      .blr:
  921.      @@:
  922.  
  923.          movd       mm0,[edi+SIZE_X*3]
  924.          movd       mm1,[edi-SIZE_X*3]
  925.          movd       mm2,[edi-3]
  926.          movd       mm3,[edi+3]
  927.  
  928.          punpcklbw  mm0,mm5
  929.          punpcklbw  mm1,mm5
  930.          punpcklbw  mm2,mm5
  931.          punpcklbw  mm3,mm5
  932.          paddw      mm0,mm1
  933.          paddw      mm0,mm2
  934.          paddw      mm0,mm3
  935.          psrlw      mm0,2
  936.  
  937.          packuswb   mm0,mm5
  938.          psubusb    mm0,qword[esp]  ; importand if fire
  939.          movd       eax,mm0
  940.          stosd
  941.  
  942.          loop        .blr
  943.  
  944.          xor        eax,eax
  945.          mov        ecx,SIZE_X*3/4
  946.          rep        stosd
  947.          pop         ecx
  948.          loop       .again_blur
  949.          mov        esp,ebp
  950.          pop        ebp
  951. end if
  952. if  Ext=NON
  953.       .blur:
  954.          push   ecx
  955.          xor    ecx,ecx
  956.       .next_col_coof:
  957.          xor    esi,esi
  958.          xor    eax,eax
  959.          xor    ebx,ebx
  960.          mov    edi,SIZE_X*SIZE_Y
  961.       .next:
  962.          mov    ebp,esi
  963.          dec    ebp
  964.  
  965.          cmp    ebp,SIZE_X*SIZE_Y-1   ; clipping
  966.          jl     @f
  967.          mov    ebp,SIZE_X*SIZE_Y-1
  968.       @@:
  969.          or     ebp,ebp
  970.          jg     @f
  971.          xor    ebp,ebp
  972.       @@:
  973.          lea    edx,[ebp*3+screen]
  974.          mov    al,byte[edx+ecx]
  975.  
  976.          mov    ebp,esi
  977.          inc    ebp
  978.          cmp    ebp,SIZE_X*SIZE_Y-1   ; clipping
  979.          jl     @f
  980.          mov    ebp,SIZE_X*SIZE_Y-1
  981.       @@:
  982.          or     ebp,ebp
  983.          jg     @f
  984.          xor    ebp,ebp
  985.       @@:
  986.          lea    edx,[ebp*3+screen]
  987.          mov    bl,byte[edx+ecx]
  988.          add    eax,ebx
  989.  
  990.          mov    ebp,esi
  991.          sub    ebp,SIZE_X
  992.          cmp    ebp,SIZE_X*SIZE_Y-1   ; clipping
  993.          jl     @f
  994.          mov    ebp,SIZE_X*SIZE_Y-1
  995.       @@:
  996.          or     ebp,ebp
  997.          jg     @f
  998.          xor    ebp,ebp
  999.       @@:
  1000.          lea    edx,[ebp*3+screen]
  1001.          mov    bl,byte[edx+ecx]
  1002.          add    eax,ebx
  1003.  
  1004.          mov    ebp,esi
  1005.          add    ebp,SIZE_X
  1006.          cmp    ebp,SIZE_X*SIZE_Y-1   ; clipping
  1007.          jl     @f
  1008.          mov    ebp,SIZE_X*SIZE_Y-1
  1009.       @@:
  1010.          or     ebp,ebp
  1011.          jg     @f
  1012.          xor    ebp,ebp
  1013.       @@:
  1014.          lea    edx,[ebp*3+screen]
  1015.          mov    bl,byte[edx+ecx]
  1016.          add    eax,ebx
  1017.  
  1018.          shr    eax,2
  1019.          lea    edx,[esi*3+screen]
  1020.          or     al,al
  1021.          jz     @f
  1022.          dec    al              ; not importand if fire
  1023.          mov    byte[edx+ecx],al
  1024.      @@:
  1025.  
  1026.          inc    esi
  1027.          dec    edi
  1028.          jnz    .next
  1029.  
  1030.          inc    ecx
  1031.          cmp    ecx,3
  1032.          jne    .next_col_coof
  1033.          pop    ecx
  1034.          dec     ecx
  1035.          jnz    .blur
  1036. end if
  1037. ret
  1038.  
  1039. mirror:                               ; mirror effect - loseless operation
  1040. ; in ah - button id = 11, 12, 13
  1041.          mov      edi,[points_ptr]     ; one real point - triple float
  1042.          mov      esi,[points_normals_ptr]   ; one 3dvector - triple float dword x,y,z
  1043.          fninit
  1044.          mov      ecx,[points_count_var]
  1045.  
  1046.          cmp      ah,11
  1047.          je       @f
  1048.          cmp      ah,12
  1049.          je       .yn
  1050.          cmp      ah,13
  1051.          je       .zn
  1052.  
  1053.        @@:                              ; neg x
  1054.          fld      dword[edi]    ;x
  1055.          fchs
  1056.          fstp     dword[edi]    ;x
  1057.          fld      dword[esi]
  1058.          fchs
  1059.          fstp     dword[esi]
  1060.          add      edi,12
  1061.          add      esi,12
  1062.          loop     @b
  1063.          ret
  1064.        .yn:
  1065.          fld      dword[edi+4]  ;y
  1066.          fchs
  1067.          fstp     dword[edi+4]  ;y
  1068.          fld      dword[esi+4]
  1069.          fchs
  1070.          fstp     dword[esi+4]
  1071.  
  1072.          add      edi,12
  1073.          add      esi,12
  1074.          loop     .yn
  1075.          ret
  1076.       .zn:
  1077.          fld      dword[edi+8]    ;z
  1078.          fchs
  1079.          fstp     dword[edi+8]    ;z
  1080.          fld      dword[esi+8]
  1081.          fchs
  1082.          fstp     dword[esi+8]
  1083.  
  1084.          add      edi,12
  1085.          add      esi,12
  1086.          loop     .zn
  1087. ret
  1088.  
  1089. exchange:                             ; exchange some coords - loseless operation
  1090.          mov      edi,[points_ptr]     ; one real point - triple float
  1091.          mov      esi,[points_normals_ptr]  ; one 3dvector - triple float dword x,y,z
  1092.          fninit                       ; exchange both points and normal vactors coords/coofics
  1093.          mov      ecx,[points_count_var]
  1094.  
  1095.          cmp      [xchg_flag],1
  1096.          je       @f
  1097.          cmp      [xchg_flag],2
  1098.          je       .zx
  1099.          cmp      [xchg_flag],3
  1100.          je       .yz
  1101.        @@:
  1102.          fld      dword[edi]    ;x
  1103.          fld      dword[edi+4]  ;y
  1104.          fstp     dword[edi]    ;x
  1105.          fstp     dword[edi+4]  ;y
  1106.          fld      dword[esi]    ;x
  1107.          fld      dword[esi+4]  ;y
  1108.          fstp     dword[esi]    ;x
  1109.          fstp     dword[esi+4]  ;y
  1110.  
  1111.          add      esi,12
  1112.          add      edi,12
  1113.          loop     @b
  1114.          ret
  1115.        .zx:
  1116.          fld      dword[edi]    ;x
  1117.          fld      dword[edi+8]  ;z
  1118.          fstp     dword[edi]    ;x
  1119.          fstp     dword[edi+8]  ;z
  1120.          fld      dword[esi]    ;x
  1121.          fld      dword[esi+8]  ;y
  1122.          fstp     dword[esi]    ;x
  1123.          fstp     dword[esi+8]  ;y
  1124.  
  1125.          add      esi,12
  1126.          add      edi,12
  1127.          loop     .zx
  1128.          ret
  1129.       .yz:
  1130.          fld      dword[edi+8]    ;z
  1131.          fld      dword[edi+4]    ;y
  1132.          fstp     dword[edi+8]    ;z
  1133.          fstp     dword[edi+4]    ;y
  1134.          fld      dword[esi+8]    ;x
  1135.          fld      dword[esi+4]    ;y
  1136.          fstp     dword[esi+8]    ;x
  1137.          fstp     dword[esi+4]    ;y
  1138.  
  1139.          add      edi,12
  1140.          add      esi,12
  1141.          loop     .yz
  1142. ret
  1143.  
  1144. ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented///////////////////////////////
  1145. if 0
  1146. calc_attenuation_light:          ;; calculate point to spot_light distance
  1147. ; spot light with attenuation    ;; and vector, normalize vector,
  1148.                                  ;; calc dot_pr and unlinear color according
  1149.                                  ;; to dot_product, write to color buff
  1150. .distance equ dword[ebp-4]       ;; color buff in bumpmap for save the mem
  1151. .temp_col equ word[ebp-6]
  1152. .vector   equ [ebp-20]
  1153. .spot_light_ptr equ dword [ebp-24]
  1154.         mov     ebp,esp
  1155.         sub     esp,24
  1156.         mov     edi,rotated_points_r  ;points_rotated
  1157.         mov     edx,point_normals_rotated
  1158.         mov     ecx,bumpmap        ; mem area with temp points color list
  1159.         xor     ax,ax              ; counter
  1160.         mov     esi,spot_light_params
  1161.         mov     .spot_light_ptr,esi
  1162.      .again_color:
  1163.         push    eax
  1164.         lea     ebx,.vector
  1165.         mov     esi,.spot_light_ptr ; calc vector fom light to every point
  1166.         call    make_vector_r
  1167.         ; ebx - ptr to result vector
  1168.         fld     dword [ebx]
  1169.         fmul    st, st
  1170.         fld     dword [ebx+4]
  1171.         fmul    st, st
  1172.         fld     dword [ebx+8]
  1173.         fmul    st, st
  1174.         faddp   st1, st
  1175.         faddp   st1, st
  1176.         fsqrt
  1177.         fstp    .distance
  1178.         push    edi
  1179.         mov     edi,ebx
  1180.         call    normalize_vector
  1181.         ; edi - normalized distance vector
  1182.         mov     esi,edx
  1183.         call    dot_product  ; esi first vector, edi second vector
  1184.         ; st0 - dot product
  1185.         fabs    ; why not ? - think about it
  1186.         pop     edi
  1187.         fldz
  1188.         fcomip  st1
  1189.         jbe     @f           ; st1>0
  1190.         mov     dword[ecx],0
  1191.         mov     word[ecx+4],0
  1192.         add     ecx,6
  1193.         ffree   st0
  1194.         jmp     .update_counters
  1195.   @@:
  1196.      ;   pop     edi
  1197.  
  1198.         ; calc color(with atenuation), write to buff
  1199.         ; buff - color of points list
  1200.         ; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
  1201.  
  1202.         push    edx
  1203.         push    edi
  1204.  
  1205.         push    ecx
  1206.         push    ebp
  1207.  
  1208. ;        mov     eax,spot_light_params
  1209.         mov     eax,.spot_light_ptr
  1210.         movzx   dx,byte[eax+15]
  1211.         push    dx             ; shines
  1212.         movzx   dx,byte[eax+8] ; b
  1213.         push    dx             ; orginal col
  1214.         movzx   dx,byte[eax+7] ; g
  1215.         push    dx
  1216.         movzx   dx,byte[eax+6]   ; r
  1217.         push    dx
  1218.         movzx   dx,byte[eax+14] ; max col
  1219.         push    dx
  1220.         movzx   dx,byte[eax+13]
  1221.         push    dx
  1222.         movzx   dx,byte[eax+12]
  1223.         push    dx
  1224.         movzx   dx,byte[eax+11] ; min col
  1225.         push    dx
  1226.         movzx   dx,byte[eax+10]
  1227.         push    dx
  1228.         movzx   dx,byte[eax+9]
  1229.         push    dx
  1230.         push    eax            ; dot pr.  (in st0)
  1231.         call    calc_one_col
  1232.         ; eax - 0x00rrggbb
  1233.         ; brightness = 1 - (distance/light.fadezero)^fogness
  1234.         ; if brightness  < 0, then brightness = 0
  1235.         ; attenuetion equation taken from 3dica tutorial - 1/d^2 isn't perfect
  1236.         ; color = color * brightness  ;  fogness = <0.5,2.0>
  1237.         pop     ebp
  1238.         pop     ecx
  1239.  
  1240.         fld    .distance
  1241.         mov     esi,.spot_light_ptr
  1242. ;        fidiv   word[spot_light_params+16]   ; fadezero
  1243.         fidiv   word[esi+16]   ; fadezero
  1244.       ;  fmul    st,st0       ; fogness = 2
  1245.         fabs                  ; to be sure
  1246.         fchs
  1247.         fld1
  1248.         faddp
  1249.         fld1
  1250.         fcomip  st1
  1251.         jnbe    @f
  1252.         ffree   st0
  1253.         fld1
  1254.       @@:
  1255.         fld     st            ; st - brightness
  1256.         ror     eax,16
  1257.         movzx   bx,al        ; al - r
  1258.         mov     .temp_col,bx
  1259.         fimul   .temp_col
  1260.         fistp   word[ecx]
  1261.         cmp     word[ecx],0
  1262.         jge     @f
  1263.         mov     word[ecx],0
  1264.     @@:
  1265.    ;     mov     edx,dword[spot_light_params+12]  ; max colors
  1266.         mov     edx,dword[esi+12]  ; max colors
  1267.         movzx   bx,dl         ; r max
  1268.         cmp     word[ecx],bx  ; choose the brightest for r, g, b
  1269.         jl      @f
  1270.         mov     word[ecx],bx
  1271.     @@:
  1272.  
  1273.         add     ecx,2
  1274.         fld     st
  1275.         ror     eax,16
  1276.         movzx   bx,ah        ; g
  1277.         mov     .temp_col,bx
  1278.         fimul   .temp_col
  1279.         fistp   word[ecx]
  1280.         cmp     word[ecx],0
  1281.         jg      @f
  1282.         mov     word[ecx],0
  1283.     @@:
  1284.         movzx   bx,dh        ; g max
  1285.         cmp     word[ecx],bx
  1286.         jle     @f
  1287.         mov     word[ecx],bx
  1288.     @@:
  1289.  
  1290.         add     ecx,2
  1291.         movzx   bx,al        ; b
  1292.         mov     .temp_col,bx
  1293.         fimul   .temp_col
  1294.         fistp   word[ecx]
  1295.         cmp     word[ecx],0
  1296.         jg      @f
  1297.         mov     word[ecx],0
  1298.     @@:
  1299.         shr     edx,16
  1300.         movzx   bx,dl        ; b max
  1301.         cmp     word[ecx],bx
  1302.         jle     @f
  1303.         mov     word[ecx],bx
  1304.     @@:
  1305.         add     ecx,2
  1306. ;end if
  1307. ;        ror     eax,16
  1308. ;        movzx   bx,al
  1309. ;        mov     word[ecx],bx
  1310. ;        ror     eax,16
  1311. ;        movzx   bx,ah
  1312. ;        mov     word[ecx+2],bx
  1313. ;        xor     ah,ah
  1314. ;        mov     word[ecx+4],ax
  1315. ;        add     ecx,6
  1316.  
  1317.         pop    edi
  1318.         pop    edx
  1319.  
  1320.     .update_counters:
  1321.         add     edx,12  ; normal_size
  1322.         add     edi,12   ;6   ; 3d point_coord_size
  1323.  
  1324.         pop     eax
  1325.         inc     ax
  1326.         cmp     ax,[points_count_var]
  1327.         jne     .again_color
  1328.  
  1329.         add     .spot_light_ptr,18
  1330.         cmp     .spot_light_ptr,spot_l_end
  1331.         jl      .again_color
  1332.  
  1333.         mov     esp,ebp
  1334. ret
  1335. end if
  1336. ;#\\\\\\\\\\\\\\\\\\\\\\\\\comented////////////////////////////////////