Subversion Repositories Kolibri OS

Rev

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