Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; application : Caritas - flat shading, Gouraud shading,
  3. ;               enviornament mapping, bump mapping
  4. ; compiler    : FASM
  5. ; system      : KolibriOS
  6. ; author      : macgub alias Maciej Guba
  7. ; email       : macgub3@wp.pl
  8. ; web         : www.menuet.xt.pl
  9. ; Fell free to use this intro in your own distribution of KolibriOS.
  10. ; Special greetings to all MenuetOS maniax in the world.
  11. ; I hope because my intros Christian Belive will be near to each of You.
  12.  
  13.  
  14. ; Some adjustments made by Madis Kalme
  15. ; madis.kalme@mail.ee
  16. ; I tried optimizing it a bit, but don't know if it was successful. The objects
  17. ; can be:
  18. ; 1) Read from a file (*.3DS standard)
  19. ; 2) Written in manually (at the end of the code)
  20. SIZE_X equ 350
  21. SIZE_Y equ 350
  22. TIMEOUT equ 4
  23. ROUND equ 10
  24. TEX_X equ 512     ; texture width
  25. TEX_Y equ 512     ;         height
  26. TEX_SHIFT equ 9  ; texture width shifting
  27. TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
  28. TEX equ  SHIFTING ;  TEX={SHIFTING | FLUENTLY}
  29. FLUENTLY = 0
  30. SHIFTING = 1
  31. CATMULL_SHIFT equ 8
  32. NON   =   0
  33. MMX   =   1
  34.  
  35. Ext   =   MMX                   ;Ext={ NON | MMX}
  36.  
  37. use32
  38.         org    0x0
  39.         db     'MENUET01'       ; 8 byte id
  40.         dd     0x01             ; header version
  41.         dd     START            ; start of code
  42.         dd     I_END            ; size of image
  43.         dd     I_END            ; memory for app
  44.         dd     I_END            ; esp
  45.         dd     0x0 , 0x0        ; I_Param , I_Icon
  46.  
  47. START:    ; start of execution
  48.         cld
  49.  ;       call alloc_buffer_mem
  50.         call read_from_file
  51.         call init_triangles_normals
  52.         call init_point_normals
  53.         call init_envmap
  54.         mov  edi,bumpmap
  55.         call calc_bumpmap
  56.         call calc_bumpmap_coords
  57.         call draw_window
  58.  
  59.  
  60. still:
  61.         mov     eax,23          ; wait here for event with timeout
  62.         mov     ebx,TIMEOUT
  63.         cmp     [speed_flag],1
  64.         jne     .skip
  65.         mov     eax,11
  66.     .skip:
  67.         int     0x40
  68.  
  69.         cmp     eax,1           ; redraw request ?
  70.         je      red
  71.         cmp     eax,2           ; key in buffer ?
  72.         je      key
  73.         cmp     eax,3           ; button in buffer ?
  74.         je      button
  75.  
  76.         jmp     noclose
  77.  
  78.     red:                        ; redraw
  79.         call    draw_window
  80.         jmp     noclose
  81.  
  82.     key:                        ; key
  83.         mov     eax,2           ; just read it and ignore
  84.         int     0x40
  85.         jmp     noclose
  86.  
  87.     button:                     ; button
  88.         mov     eax,17          ; get id
  89.         int     0x40
  90.  
  91.         cmp     ah,1            ; button id=1 ?
  92.         jne     .ch_another
  93.  
  94.         mov     eax,-1          ; close this program
  95.         int     0x40
  96.       .ch_another:
  97.         cmp     ah,2
  98.         jne     .ch_another1
  99.         inc     [r_flag]
  100.         cmp     [r_flag],3
  101.         jne     noclose
  102.         mov     [r_flag],0
  103.       .ch_another1:
  104.         cmp     ah,3
  105.         jne     .ch_another2
  106.         inc     [dr_flag]
  107.         cmp     [dr_flag],4
  108.         jne     noclose
  109.         mov     [dr_flag],0
  110.       .ch_another2:
  111.         cmp     ah,4                     ; toggle speed
  112.         jne     @f
  113.         inc     [speed_flag]
  114.         cmp     [speed_flag],2
  115.         jne     noclose
  116.         mov     [speed_flag],0
  117.       @@:
  118.         cmp     ah,5
  119.         jne     @f                       ;scale-
  120.         mov     [scale], dword 0.7
  121.         fninit
  122.         fld     [sscale]
  123.         fmul    [scale]
  124.         fstp    [sscale]
  125.         call    read_from_file
  126.         mov     ax,[vect_x]  ;-- last change
  127.         mov     bx,[vect_y]
  128.         mov     cx,[vect_z]
  129.         call    add_vector
  130. ;        call    do_scale
  131.       @@:
  132.         cmp     ah,6
  133.         jne     @f                      ; scale+
  134.         mov     [scale], dword 1.3
  135.         fninit
  136.         fld     [sscale]
  137.         fmul    [scale]
  138.         fstp    [sscale]
  139.         call    read_from_file
  140.         mov     ax,[vect_x]
  141.         mov     bx,[vect_y]
  142.         mov     cx,[vect_z]
  143.         call    add_vector
  144.         call    init_triangles_normals
  145.         call    init_point_normals
  146.       @@:
  147.         cmp     ah,7
  148.         jne     @f
  149.         xor     ax,ax            ;add vector to object and rotary point
  150.         mov     bx,-10
  151.         xor     cx,cx
  152.         call    add_vector
  153.         sub     [vect_y],10
  154.         sub     [yo],10
  155.       @@:
  156.         cmp     ah,8
  157.         jne     @f
  158.         xor     ax,ax
  159.         xor     bx,bx
  160.         mov     cx,10
  161.         call    add_vector
  162.         add     [vect_z],10
  163.         add     [zo],10
  164.       @@:
  165.         cmp     ah,9
  166.         jne     @f
  167.         mov     ax,-10
  168.         xor     bx,bx
  169.         xor     cx,cx
  170.         call    add_vector
  171.         sub     [vect_x],10
  172.         sub     [xo],10
  173.       @@:
  174.         cmp     ah,10
  175.         jne     @f
  176.         mov     ax,10
  177.         xor     bx,bx
  178.         xor     cx,cx
  179.         call    add_vector
  180.         add     [vect_x],10
  181.         add     [xo],10
  182.       @@:
  183.         cmp     ah,11
  184.         jne     @f
  185.         xor     ax,ax
  186.         xor     bx,bx
  187.         mov     cx,-10
  188.         call    add_vector
  189.         sub     [vect_z],10
  190.         sub     [zo],10
  191.       @@:
  192.         cmp     ah,12
  193.         jne     @f
  194.         xor     ax,ax
  195.         mov     bx,10
  196.         xor     cx,cx
  197.         call    add_vector
  198.         add     [vect_y],10
  199.         add     [yo],10
  200.       @@:
  201.         cmp     ah,13                    ; change main color -
  202.         jne     @f                       ; - lead color setting
  203.         cmp     [max_color_r],245
  204.         jge     @f
  205.         add     [max_color_r],10
  206.         call    init_envmap
  207.       @@:
  208.         cmp     ah,14
  209.         jne     @f
  210.         cmp     [max_color_g],245
  211.         jge     @f
  212.         add     [max_color_g],10
  213.         call    init_envmap
  214.       @@:
  215.         cmp     ah,15
  216.         jne     @f
  217.         cmp     [max_color_b],245
  218.         jge     @f
  219.         add     [max_color_b],10
  220.         call    init_envmap
  221.       @@:
  222.         cmp     ah,16                    ; change main color
  223.         jne     @f
  224.         cmp     [max_color_r],10
  225.         jle     @f
  226.         sub     [max_color_r],10
  227.         call    init_envmap
  228.       @@:
  229.         cmp     ah,17
  230.         jne     @f
  231.         cmp     [max_color_g],10
  232.         jle     @f
  233.         sub     [max_color_g],10
  234.         call    init_envmap
  235.       @@:
  236.         cmp     ah,18
  237.         jne     @f
  238.         cmp     [max_color_b],10
  239.         jle     @f
  240.         sub     [max_color_b],10
  241.         call    init_envmap
  242.       @@:
  243.         cmp     ah,19
  244.         jne     @f
  245.         inc     [catmull_flag]
  246.         cmp     [catmull_flag],2
  247.         jne     @f
  248.         mov     [catmull_flag],0
  249.       @@:
  250.     noclose:
  251.  
  252.         call    calculate_angle ; calculates sinus and cosinus
  253.         call    copy_point_normals
  254.    ; copy normals and rotate the copy using sin/cosbeta - best way
  255.         call    rotate_point_normals
  256.         cmp     [dr_flag],2
  257.         jge     @f
  258.         call    calculate_colors
  259.     @@:
  260.         call    copy_points
  261.         call    rotate_points
  262.         call    translate_perspective_points; translate from 3d to 2d
  263.         call    clrscr          ; clear the screen
  264.         cmp     [catmull_flag],1  ;non sort if Catmull
  265.         je      .no_sort
  266.         call    sort_triangles
  267.       .no_sort:
  268.         call    fill_Z_buffer     ; make background
  269.  
  270.     RDTSC
  271.     push eax
  272.         call    draw_triangles  ; draw all triangles from the list
  273.  
  274.     RDTSC
  275.     sub eax,[esp]
  276.     sub eax,41
  277.     ;    lea     esi,[debug_points]
  278.     ;    lea     edi,[debug_points+6]
  279.     ;    lea     ebx,[debug_vector1]
  280.     ;    call    make_vector
  281.     ;    fninit
  282.     ;    fld     [sinbeta_one]
  283.     ;    fimul   [debug_dwd]
  284.     ;    fistp   [debug_dd]
  285.     ;    movzx    eax,[debug_dd]
  286.  
  287.  
  288.     mov     ecx,10
  289.   .dc:
  290.  
  291.     pop eax
  292. macro show
  293. {
  294.         mov     eax,7           ; put image
  295.         mov     ebx,screen
  296.         mov     ecx,SIZE_X shl 16 + SIZE_Y
  297.         xor     edx,edx
  298.         int     0x40
  299. }
  300.     show
  301.  
  302.  
  303.         jmp     still
  304.  
  305. ;--------------------------------------------------------------------------------
  306. ;-------------------------PROCEDURES---------------------------------------------
  307. ;--------------------------------------------------------------------------------
  308. include "tex3.ASM"
  309. include "flat_cat.ASM"
  310. include "grd_cat.ASM"
  311. include "tex_cat.ASM"
  312. include "bump_cat.ASM"
  313. include "3dmath.asm"
  314. include "grd3.asm"
  315. include "flat3.asm"
  316. include "bump3.asm"
  317. include "b_procs.asm"
  318.  
  319.  
  320. ;alloc_buffer_mem:
  321. ;        mov     eax,68
  322. ;        mov     ebx,5
  323. ;        mov     ecx,SIZE_X*SIZE_Y*3
  324. ;        int     0x40
  325. ;        mov     [screen],eax
  326. ;ret
  327. calc_bumpmap_coords:
  328. ;        fninit
  329.         mov     esi,points
  330.         mov     edi,tex_points
  331. ;      @@:
  332. ;        add     esi,2
  333. ;        fild    word[esi]
  334. ;        fmul    [bump_scale]
  335. ;        fistp   word[edi]
  336. ;        fild    word[esi+2]
  337. ;        fmul    [bump_scale]
  338. ;        fistp   word[edi+2]
  339. ;        add     esi,4
  340. ;        add     edi,4
  341. ;        cmp     [esi],dword -1
  342. ;        jnz     @b
  343.       @@:
  344.          add     esi,2
  345.          movsd
  346.       ;   add     esi,2
  347.          cmp     dword[esi],dword -1
  348.          jne     @b
  349. ret
  350. ;bump_scale  dd 1.4  ;TEX_X/SIZE_X
  351.  
  352. init_envmap:
  353.  
  354. .temp equ word [ebp-2]
  355.          push     ebp
  356.          mov      ebp,esp
  357.          sub      esp,2
  358.          mov      edi,envmap
  359.          fninit
  360.  
  361.          mov      dx,-256
  362.     .ie_ver:
  363.          mov      cx,-256
  364.     .ie_hor:
  365.          mov      .temp,cx
  366.          fild     .temp
  367.          fmul     st,st0
  368.          mov      .temp,dx
  369.          fild     .temp
  370.          fmul     st,st0
  371.          faddp
  372.          fsqrt
  373.          mov      .temp,254
  374.          fisubr   .temp
  375.          fmul     [env_const]
  376.          fistp    .temp
  377.          mov      ax,.temp
  378.  
  379.          or      ax,ax
  380.          jge     .ie_ok1
  381.          xor     ax,ax
  382.          jmp     .ie_ok2
  383.   .ie_ok1:
  384.          cmp     ax,254
  385.          jle     .ie_ok2
  386.          mov     ax,254
  387.   .ie_ok2:
  388.          push    dx
  389.          mov     bx,ax
  390.          mul     [max_color_b]
  391.          shr     ax,8
  392.          stosb
  393.          mov     ax,bx
  394.          mul     [max_color_g]
  395.          shr     ax,8
  396.          stosb
  397.          mov     ax,bx
  398.          mul     [max_color_r]
  399.          shr     ax,8
  400.          stosb
  401.          pop     dx
  402.  
  403.          inc     cx
  404.          cmp     cx,256
  405.          jne     .ie_hor
  406.  
  407.          inc     dx
  408.          cmp     dx,256
  409.          jne     .ie_ver
  410.  
  411.          mov     esp,ebp
  412.          pop     ebp
  413. macro debug
  414. {
  415.          mov     edi,envmap
  416.          mov     ecx,512*512*3/4
  417.          mov     eax,0xffffffff
  418.          rep     stosd
  419. }
  420. ret
  421. calculate_colors:
  422.         fninit
  423.         xor     ebx,ebx
  424.         movzx   ecx,[points_count_var]
  425.         lea     ecx,[ecx*3]
  426.         add     ecx,ecx
  427.       .cc_again:
  428.         mov     esi,light_vector
  429.         lea     edi,[point_normals_rotated+ebx*2]
  430.         call    dot_product
  431.         fcom    [dot_min]
  432.         fstsw   ax
  433.         sahf
  434.         ja      .cc_ok1
  435.         ffree   st
  436.         mov     dword[points_color+ebx],0
  437.         mov     word[points_color+ebx+4],0
  438.         add     ebx,6
  439.         cmp     ebx,ecx
  440.         jne     .cc_again
  441.         jmp     .cc_done
  442.       .cc_ok1:
  443.         fcom    [dot_max]
  444.         fstsw   ax
  445.         sahf
  446.         jb      .cc_ok2
  447.         ffree   st
  448.         mov     dword[points_color+ebx],0  ; clear r,g,b
  449.         mov     word[points_color+ebx+4],0
  450.         add     ebx,6
  451.         cmp     ebx,ecx
  452.         jne     .cc_again
  453.         jmp     .cc_done
  454.       .cc_ok2:
  455.         fld     st
  456.         fld     st
  457.         fimul   [max_color_r]
  458.         fistp   word[points_color+ebx]        ;each color as word
  459.         fimul   [max_color_g]
  460.         fistp   word[points_color+ebx+2]
  461.         fimul   [max_color_b]
  462.         fistp   word[points_color+ebx+4]
  463.         add     ebx,6
  464.         cmp     ebx,ecx
  465.         jne     .cc_again
  466.      .cc_done:
  467. ret
  468. copy_point_normals:
  469.         movzx   ecx,[points_count_var]
  470.         shl     ecx,2
  471.         inc     ecx
  472.         mov     esi,point_normals
  473.         mov     edi,point_normals_rotated
  474.         rep     movsd
  475. ret
  476. rotate_point_normals:
  477.         movzx   ecx,[points_count_var]
  478.         mov     ebx,point_normals_rotated
  479.         fninit                     ; for now only rotate around Z axle
  480.      .again_r:
  481.         cmp     [r_flag],1
  482.         je      .z_rot
  483.         cmp     [r_flag],2
  484.         je      .x_rot
  485.  
  486.       .y_rot:
  487.         fld     dword[ebx]         ; x
  488.         fld     [sinbeta]
  489.         fmul    dword[ebx+8]       ; z * sinbeta
  490.         fchs
  491.         fld     [cosbeta]
  492.         fmul    dword[ebx]         ; x * cosbeta
  493.         faddp
  494.         fstp    dword[ebx]         ; new x
  495.         fmul    [sinbeta]          ; old x * sinbeta
  496.         fld     [cosbeta]
  497.         fmul    dword[ebx+8]       ; z * cosbeta
  498.         faddp
  499.         fstp    dword[ebx+8]       ; new z
  500.         add     ebx,12
  501.         loop    .y_rot
  502.         jmp     .end_rot
  503.       .z_rot:
  504.         fld     dword[ebx]      ;x
  505.         fld     [sinbeta]
  506.         fmul    dword[ebx+4]    ;y
  507.         fld     [cosbeta]
  508.         fmul    dword[ebx]      ;x
  509.         faddp
  510.         fstp    dword[ebx]      ;new x
  511.         fmul    [sinbeta]       ; sinbeta * old x
  512.         fchs
  513.         fld     [cosbeta]
  514.         fmul    dword[ebx+4]         ; cosbeta * y
  515.         faddp
  516.         fstp    dword[ebx+4]    ; new y
  517.         add     ebx,12
  518.         loop    .z_rot
  519.         jmp     .end_rot
  520.        .x_rot:
  521.         fld     dword[ebx+4]    ;y
  522.         fld     [sinbeta]
  523.         fmul    dword[ebx+8]    ;z
  524.         fld     [cosbeta]
  525.         fmul    dword[ebx+4]    ;y
  526.         faddp
  527.         fstp    dword[ebx+4]    ; new y
  528.         fmul    [sinbeta]       ; sinbeta * old y
  529.         fchs
  530.         fld     [cosbeta]
  531.         fmul    dword[ebx+8]
  532.         faddp
  533.         fstp    dword[ebx+8]
  534.         add     ebx,12
  535.         loop    .x_rot
  536.        .end_rot:
  537. ret
  538. init_triangles_normals:
  539.         mov     ebx,triangles_normals
  540.         mov     ebp,triangles
  541.      @@:
  542.         push    ebx
  543.         mov     ebx,vectors
  544.         movzx   esi,word[ebp]          ; first point index
  545.         lea     esi,[esi*3]
  546.         lea     esi,[points+esi*2]     ; esi - pointer to 1st 3d point
  547.         movzx   edi,word[ebp+2]        ; second point index
  548.         lea     edi,[edi*3]
  549.         lea     edi,[points+edi*2]     ; edi - pointer to 2nd 3d point
  550.         call    make_vector
  551.         add     ebx,12
  552.         mov     esi,edi
  553.         movzx   edi,word[ebp+4]        ; third point index
  554.         lea     edi,[edi*3]
  555.         lea     edi,[points+edi*2]
  556.         call    make_vector
  557.         mov     edi,ebx                 ; edi - pointer to 2nd vector
  558.         mov     esi,ebx
  559.         sub     esi,12                  ; esi - pointer to 1st vector
  560.         pop     ebx
  561.         call    cross_product
  562.         mov     edi,ebx
  563.         call    normalize_vector
  564.         add     ebp,6
  565.         add     ebx,12
  566.         cmp     dword[ebp],-1
  567.         jne     @b
  568. ret
  569.  
  570. init_point_normals:
  571. .x equ dword [ebp-4]
  572. .y equ dword [ebp-8]
  573. .z equ dword [ebp-12]
  574. .point_number equ word [ebp-26]
  575. .hit_faces    equ word [ebp-28]
  576.  
  577.         fninit
  578.         mov       ebp,esp
  579.         sub       esp,28
  580.         mov       edi,point_normals
  581.         mov       .point_number,0
  582.     .ipn_loop:
  583.         mov       .hit_faces,0
  584.         mov       .x,0
  585.         mov       .y,0
  586.         mov       .z,0
  587.         mov       esi,triangles
  588.         xor       ecx,ecx              ; ecx - triangle number
  589.     .ipn_check_face:
  590.         xor       ebx,ebx              ; ebx - 'position' in one triangle
  591.     .ipn_check_vertex:
  592.         movzx     eax,word[esi+ebx]    ;  eax - point_number
  593.         cmp       ax,.point_number
  594.         jne       .ipn_next_vertex
  595.         push      esi
  596.         mov       esi,ecx
  597.         lea       esi,[esi*3]
  598.         lea       esi,[triangles_normals+esi*4]
  599.        ; shl       esi,2
  600.        ; add       esi,triangles_normals
  601.  
  602.         fld       .x
  603.         fadd      dword[esi+vec_x]
  604.         fstp      .x
  605.         fld       .y
  606.         fadd      dword[esi+vec_y]
  607.         fstp      .y
  608.         fld       .z
  609.         fadd      dword[esi+vec_z]
  610.         fstp      .z
  611.         pop       esi
  612.         inc       .hit_faces
  613.         jmp       .ipn_next_face
  614.     .ipn_next_vertex:
  615.         add       ebx,2
  616.         cmp       ebx,6
  617.         jne       .ipn_check_vertex
  618.     .ipn_next_face:
  619.         add       esi,6
  620.         inc       ecx
  621.         cmp       cx,[triangles_count_var]
  622.         jne       .ipn_check_face
  623.  
  624.         fld       .x
  625.         fidiv     .hit_faces
  626.         fstp      dword[edi+vec_x]
  627.         fld       .y
  628.         fidiv     .hit_faces
  629.         fstp      dword[edi+vec_y]
  630.         fld       .z
  631.         fidiv     .hit_faces
  632.         fstp      dword[edi+vec_z]
  633.         call      normalize_vector
  634.         add       edi,12  ;type vector 3d
  635.         inc       .point_number
  636.         mov       dx,.point_number
  637.         cmp       dx,[points_count_var]
  638.         jne       .ipn_loop
  639.  
  640.         mov       esp,ebp
  641. ret
  642.  
  643. add_vector:
  644.         mov ebp,points
  645.        @@:
  646.         add word[ebp],ax
  647.         add word[ebp+2],bx
  648.         add word[ebp+4],cx
  649.         add ebp,6
  650.         cmp dword[ebp],-1
  651.         jne @b
  652. ret
  653. ;do_scale:
  654. ;        fninit
  655. ;        mov ebp,points
  656. ;      .next_sc:
  657. ;        fld1
  658. ;        fsub [scale]
  659. ;        fld st
  660. ;        fimul [xo]
  661. ;        fld [scale]
  662. ;        fimul word[ebp] ;x
  663. ;        faddp
  664. ;        fistp word[ebp]
  665. ;        fld st
  666. ;        fimul [yo]
  667. ;        fld [scale]
  668. ;        fimul word[ebp+2]
  669. ;        faddp
  670. ;        fistp word[ebp+2]
  671. ;        fimul [zo]
  672. ;        fld [scale]
  673. ;        fimul word[ebp+4]
  674. ;        faddp
  675. ;        fistp word[ebp+4]
  676. ;        add ebp,6
  677. ;        cmp dword[ebp],-1
  678. ;        jne .next_sc
  679. ;ret
  680. sort_triangles:
  681.         mov     esi,triangles
  682.         mov     edi,triangles_with_z
  683.         mov     ebp,points_rotated
  684.  
  685.     make_triangle_with_z:       ;makes list with triangles and z position
  686.         movzx   eax,word[esi]
  687.         lea     eax,[eax*3]
  688.         movzx   ecx,word[ebp+eax*2+4]
  689.  
  690.         movzx   eax,word[esi+2]
  691.         lea     eax,[eax*3]
  692.         add     cx,word[ebp+eax*2+4]
  693.  
  694.         movzx   eax,word[esi+4]
  695.         lea     eax,[eax*3]
  696.         add     cx,word[ebp+eax*2+4]
  697.  
  698.         mov     ax,cx
  699.        ; cwd
  700.        ; idiv    word[i3]
  701.         movsd                   ; store vertex coordinates
  702.         movsw
  703.         stosw                   ; middle vertex coordinate  'z' in triangles_with_z list
  704.         cmp     dword[esi],-1
  705.         jne     make_triangle_with_z
  706.         movsd                   ; copy end mark
  707.         mov     eax,4
  708.         lea     edx,[edi-8-trizdd]
  709.         mov     [high],edx
  710.         call    quicksort
  711.         mov     eax,4
  712.         mov     edx,[high]
  713.         call    insertsort
  714.         jmp     end_sort
  715.  
  716.     quicksort:
  717.         mov     ecx,edx
  718.         sub     ecx,eax
  719.         cmp     ecx,32
  720.         jc      .exit
  721.         lea     ecx,[eax+edx]
  722.         shr     ecx,4
  723.         lea     ecx,[ecx*8-4]; i
  724.         mov     ebx,[trizdd+eax]; trizdd[l]
  725.         mov     esi,[trizdd+ecx]; trizdd[i]
  726.         mov     edi,[trizdd+edx]; trizdd[h]
  727.         cmp     ebx,esi
  728.         jg      @f              ; direction NB! you need to negate these to invert the order
  729.       if Ext=NON
  730.         mov     [trizdd+eax],esi
  731.         mov     [trizdd+ecx],ebx
  732.         mov     ebx,[trizdd+eax-4]
  733.         mov     esi,[trizdd+ecx-4]
  734.         mov     [trizdd+eax-4],esi
  735.         mov     [trizdd+ecx-4],ebx
  736.         mov     ebx,[trizdd+eax]
  737.         mov     esi,[trizdd+ecx]
  738.       else
  739.         movq    mm0,[trizdq+eax-4]
  740.         movq    mm1,[trizdq+ecx-4]
  741.         movq    [trizdq+ecx-4],mm0
  742.         movq    [trizdq+eax-4],mm1
  743.         xchg    ebx,esi
  744.       end if
  745.       @@:
  746.         cmp     ebx,edi
  747.         jg      @f              ; direction
  748.       if Ext=NON
  749.         mov     [trizdd+eax],edi
  750.         mov     [trizdd+edx],ebx
  751.         mov     ebx,[trizdd+eax-4]
  752.         mov     edi,[trizdd+edx-4]
  753.         mov     [trizdd+eax-4],edi
  754.         mov     [trizdd+edx-4],ebx
  755.         mov     ebx,[trizdd+eax]
  756.         mov     edi,[trizdd+edx]
  757.       else
  758.         movq    mm0,[trizdq+eax-4]
  759.         movq    mm1,[trizdq+edx-4]
  760.         movq    [trizdq+edx-4],mm0
  761.         movq    [trizdq+eax-4],mm1
  762.         xchg    ebx,edi
  763.       end if
  764.       @@:
  765.         cmp     esi,edi
  766.         jg      @f              ; direction
  767.       if Ext=NON
  768.         mov     [trizdd+ecx],edi
  769.         mov     [trizdd+edx],esi
  770.         mov     esi,[trizdd+ecx-4]
  771.         mov     edi,[trizdd+edx-4]
  772.         mov     [trizdd+ecx-4],edi
  773.         mov     [trizdd+edx-4],esi
  774.       else
  775.         movq    mm0,[trizdq+ecx-4]
  776.         movq    mm1,[trizdq+edx-4]
  777.         movq    [trizdq+edx-4],mm0
  778.         movq    [trizdq+ecx-4],mm1
  779. ;        xchg    ebx,esi
  780.       end if
  781.       @@:
  782.         mov     ebp,eax         ; direction
  783.         add     ebp,8      ;   j
  784.       if Ext=NON
  785.         mov     esi,[trizdd+ebp]
  786.         mov     edi,[trizdd+ecx]
  787.         mov     [trizdd+ebp],edi
  788.         mov     [trizdd+ecx],esi
  789.         mov     esi,[trizdd+ebp-4]
  790.         mov     edi,[trizdd+ecx-4]
  791.         mov     [trizdd+ecx-4],esi
  792.         mov     [trizdd+ebp-4],edi
  793.       else
  794.         movq    mm0,[trizdq+ebp-4]
  795.         movq    mm1,[trizdq+ecx-4]
  796.         movq    [trizdq+ecx-4],mm0
  797.         movq    [trizdq+ebp-4],mm1
  798.       end if
  799.         mov     ecx,edx    ;   i; direction
  800.         mov     ebx,[trizdd+ebp]; trizdd[j]
  801.       .loop:
  802.         sub     ecx,8           ; direction
  803.         cmp     [trizdd+ecx],ebx
  804.         jl      .loop           ; direction
  805.       @@:
  806.         add     ebp,8           ; direction
  807.         cmp     [trizdd+ebp],ebx
  808.         jg      @b              ; direction
  809.         cmp     ebp,ecx
  810.         jge     @f              ; direction
  811.       if Ext=NON
  812.         mov     esi,[trizdd+ecx]
  813.         mov     edi,[trizdd+ebp]
  814.         mov     [trizdd+ebp],esi
  815.         mov     [trizdd+ecx],edi
  816.         mov     edi,[trizdd+ecx-4]
  817.         mov     esi,[trizdd+ebp-4]
  818.         mov     [trizdd+ebp-4],edi
  819.         mov     [trizdd+ecx-4],esi
  820.       else
  821.         movq    mm0,[trizdq+ecx-4]
  822.         movq    mm1,[trizdq+ebp-4]
  823.         movq    [trizdq+ebp-4],mm0
  824.         movq    [trizdq+ecx-4],mm1
  825.       end if
  826.         jmp     .loop
  827.       @@:
  828.       if Ext=NON
  829.         mov     esi,[trizdd+ecx]
  830.         mov     edi,[trizdd+eax+8]
  831.         mov     [trizdd+eax+8],esi
  832.         mov     [trizdd+ecx],edi
  833.         mov     edi,[trizdd+ecx-4]
  834.         mov     esi,[trizdd+eax+4]
  835.         mov     [trizdd+eax+4],edi
  836.         mov     [trizdd+ecx-4],esi
  837.       else
  838.         movq    mm0,[trizdq+ecx-4]
  839.         movq    mm1,[trizdq+eax+4]; dir
  840.         movq    [trizdq+eax+4],mm0; dir
  841.         movq    [trizdq+ecx-4],mm1
  842.       end if
  843.         add     ecx,8
  844.         push    ecx edx
  845.         mov     edx,ebp
  846.         call    quicksort
  847.         pop     edx eax
  848.         call    quicksort
  849.       .exit:
  850.     ret
  851.     insertsort:
  852.         mov     esi,eax
  853.       .start:
  854.         add     esi,8
  855.         cmp     esi,edx
  856.         ja      .exit
  857.         mov     ebx,[trizdd+esi]
  858.       if Ext=NON
  859.         mov     ecx,[trizdd+esi-4]
  860.       else
  861.         movq    mm1,[trizdq+esi-4]
  862.       end if
  863.         mov     edi,esi
  864.       @@:
  865.         cmp     edi,eax
  866.         jna     @f
  867.         cmp     [trizdd+edi-8],ebx
  868.         jg      @f                 ; direction
  869.       if Ext=NON
  870.         mov     ebp,[trizdd+edi-8]
  871.         mov     [trizdd+edi],ebp
  872.         mov     ebp,[trizdd+edi-12]
  873.         mov     [trizdd+edi-4],ebp
  874.       else
  875.         movq    mm0,[trizdq+edi-12]
  876.         movq    [trizdq+edi-4],mm0
  877.       end if
  878.         sub     edi,8
  879.         jmp     @b
  880.       @@:
  881.       if Ext=NON
  882.         mov     [trizdd+edi],ebx
  883.         mov     [trizdd+edi-4],ecx
  884.       else
  885.         movq    [trizdq+edi-4],mm1
  886.       end if
  887.         jmp     .start
  888.       .exit:
  889.     ret
  890.    end_sort:
  891.     ; translate triangles_with_z to sorted_triangles
  892.         mov     esi,triangles_with_z
  893.       ;  mov     edi,sorted_triangles
  894.         mov      edi,triangles
  895.     again_copy:
  896.       if Ext=NON
  897.         movsd
  898.         movsw
  899.         add     esi,2
  900.       else
  901.         movq    mm0,[esi]
  902.         movq    [edi],mm0
  903.         add     esi,8
  904.         add     edi,6
  905.       end if
  906.         cmp     dword[esi],-1
  907.         jne     again_copy
  908. ;      if Ext=MMX
  909. ;        emms
  910. ;      end if
  911.         movsd  ; copy end mark too
  912. ret
  913.  
  914. clrscr:
  915.         mov     edi,screen
  916.         mov     ecx,SIZE_X*SIZE_Y*3/4
  917.         xor     eax,eax
  918.       if Ext=NON
  919.         rep     stosd
  920.       else
  921.         pxor    mm0,mm0
  922.       @@:
  923.         movq    [edi+00],mm0
  924.         movq    [edi+08],mm0
  925.         movq    [edi+16],mm0
  926.         movq    [edi+24],mm0
  927.         add     edi,32
  928.         sub     ecx,8
  929.         jnc     @b
  930.       end if
  931. ret
  932.  
  933. calculate_angle:
  934.         fninit
  935. ;        fldpi
  936. ;        fidiv   [i180]
  937.         fld     [piD180]
  938.         fimul   [angle_counter]
  939.         fsincos
  940.         fstp    [sinbeta]
  941.         fstp    [cosbeta]
  942.         inc     [angle_counter]
  943.         cmp     [angle_counter],360
  944.         jne     end_calc_angle
  945.         mov     [angle_counter],0
  946.     end_calc_angle:
  947. ret
  948.  
  949. rotate_points:
  950.         fninit
  951.         mov     ebx,points_rotated
  952.     again_r:
  953.         cmp     [r_flag],1
  954.         je      .z_rot
  955.         cmp     [r_flag],2
  956.         je      .x_rot
  957.     .y_rot:
  958.         mov     eax,[ebx+2]     ;z
  959.         mov     ax,word[ebx]    ;x
  960.         sub     eax,dword[xo]
  961.         mov     dword[xsub],eax
  962.         fld     [sinbeta]
  963.         fimul   [zsub]
  964.         fchs
  965.         fld     [cosbeta]
  966.         fimul   [xsub]
  967.         faddp
  968.         fiadd   [xo]
  969.         fistp   word[ebx]  ;x
  970.         fld     [sinbeta]
  971.         fimul   [xsub]
  972.         fld     [cosbeta]
  973.         fimul   [zsub]
  974.         faddp
  975.         fiadd   [zo]
  976.         fistp   word[ebx+4] ;z
  977.         jmp     .end_rot
  978.    .z_rot:
  979.         mov     ax,word[ebx]
  980.         sub     ax,word[xo]       ;need optimization
  981.         mov     [xsub],ax
  982.         mov     ax,word[ebx+2]
  983.         sub     ax,word[yo]
  984.         mov     [ysub],ax
  985.         fld     [sinbeta]
  986.         fimul   [ysub]
  987.         fld     [cosbeta]
  988.         fimul   [xsub]
  989.         faddp
  990.         fiadd   [xo]
  991.         fistp   word[ebx]
  992.         fld     [cosbeta]
  993.         fimul   [ysub]
  994.         fld     [sinbeta]
  995.         fimul   [xsub]
  996.         fchs
  997.         faddp
  998.         fiadd   [yo]
  999.         fistp   word[ebx+2]
  1000.         jmp     .end_rot
  1001.    .x_rot:
  1002.         mov     ax,word[ebx+2]
  1003.         sub     ax,[yo]
  1004.         mov     [ysub],ax
  1005.         mov     ax,word[ebx+4]
  1006.         sub     ax,word[zo]
  1007.         mov     [zsub],ax
  1008.         fld     [sinbeta]
  1009.         fimul   [zsub]
  1010.         fld     [cosbeta]
  1011.         fimul   [ysub]
  1012.         faddp
  1013.         fiadd   [yo]
  1014.         fistp   word[ebx+2];y
  1015.         fld     [cosbeta]
  1016.         fimul   [zsub]
  1017.         fld     [sinbeta]
  1018.         fimul   [ysub]
  1019.         fchs
  1020.         faddp
  1021.         fiadd   [zo]
  1022.         fistp   word[ebx+4]
  1023.      .end_rot:
  1024.         add     ebx,6
  1025.         cmp     dword[ebx],-1
  1026.         jne     again_r
  1027. ret
  1028.  
  1029. draw_triangles:
  1030.         mov esi,triangles
  1031.     .again_dts:
  1032.         mov ebp,points_rotated
  1033.       if Ext=NON
  1034.         movzx   eax,word[esi]
  1035.         mov     [point_index1],ax
  1036.         lea     eax,[eax*3]
  1037.         add     eax,eax
  1038.         push    ebp
  1039.         add     ebp,eax
  1040.         mov     eax,[ebp]
  1041.         mov     dword[xx1],eax
  1042.         mov     eax,[ebp+4]
  1043.         mov     [zz1],ax
  1044.         pop     ebp
  1045.  
  1046.  
  1047.         movzx   eax,word[esi+2]
  1048.         mov     [point_index2],ax
  1049.         lea     eax,[eax*3]
  1050.         add     eax,eax
  1051.         push    ebp
  1052.         add     ebp,eax
  1053.         mov     eax,[ebp]
  1054.         mov     dword[xx2],eax
  1055.         mov     eax,[ebp+4]
  1056.         mov     [zz2],ax
  1057.         pop     ebp
  1058.  
  1059.  
  1060.         movzx   eax,word[esi+4]        ; xyz3 = [ebp+[esi+4]*6]
  1061.         mov     [point_index3],ax
  1062.         lea     eax,[eax*3]
  1063.         add     eax,eax
  1064.     ;    push    ebp
  1065.         add     ebp,eax
  1066.         mov     eax,[ebp]
  1067.         mov     dword[xx3],eax
  1068.         mov     eax,[ebp+4]
  1069.         mov     [zz3],ax
  1070.       else
  1071.         mov     eax,dword[esi]           ; don't know MMX
  1072.         mov     dword[point_index1],eax
  1073.        ; shr     eax,16
  1074.        ; mov     [point_index2],ax
  1075.         mov     ax,word[esi+4]
  1076.         mov     [point_index3],ax
  1077.         movq    mm0,[esi]
  1078.         pmullw  mm0,qword[const6]
  1079.         movd    eax,mm0
  1080.         psrlq   mm0,16
  1081.         movd    ebx,mm0
  1082.         psrlq   mm0,16
  1083.         movd    ecx,mm0
  1084.         and     eax,0FFFFh
  1085.         and     ebx,0FFFFh
  1086.         and     ecx,0FFFFh
  1087.         movq    mm0,[ebp+eax]
  1088.         movq    mm1,[ebp+ebx]
  1089.         movq    mm2,[ebp+ecx]
  1090.         movq    qword[xx1],mm0
  1091.         movq    qword[xx2],mm1
  1092.         movq    qword[xx3],mm2
  1093. ;        emms
  1094.       end if
  1095.         push esi
  1096.         ; culling
  1097.         fninit
  1098.         mov     esi,point_index1
  1099.         mov     ecx,3
  1100.       @@:
  1101.         movzx   eax,word[esi]
  1102.         lea     eax,[eax*3]
  1103.         shl     eax,2
  1104.         lea     eax,[eax+point_normals_rotated]
  1105.         fld     dword[eax+8]   ; I check  Z element of normal vector
  1106.         ftst
  1107.         fstsw   ax
  1108.         sahf
  1109.         jb     @f
  1110.         ffree   st
  1111.         loop    @b
  1112.         jmp     .end_draw
  1113.       @@:
  1114.         ffree   st  ;is visable
  1115.  
  1116.         cmp     [dr_flag],0               ; draw type flag
  1117.         je      .flat_draw
  1118.         cmp     [dr_flag],2
  1119.         je      .env_mapping
  1120.         cmp     [dr_flag],3
  1121.         je      .bump_mapping
  1122.  
  1123.         cmp     [catmull_flag],1
  1124.         je      @f
  1125.  
  1126.         movzx   edi,[point_index3]      ; do gouraud shading catmull off
  1127.         lea     edi,[edi*3]
  1128.         lea     edi,[points_color+edi*2]
  1129.         push    word[edi]
  1130.         push    word[edi+2]
  1131.         push    word[edi+4]
  1132.         movzx   edi,[point_index2]
  1133.         lea     edi,[edi*3]
  1134.         lea     edi,[points_color+edi*2]
  1135.         push    word[edi]
  1136.         push    word[edi+2]
  1137.         push    word[edi+4]
  1138.         movzx   edi,[point_index1]
  1139.         lea     edi,[edi*3]
  1140.         lea     edi,[points_color+edi*2]
  1141.         push    word[edi]
  1142.         push    word[edi+2]
  1143.         push    word[edi+4]
  1144.         jmp     .both_draw
  1145.       @@:
  1146.         movzx   edi,[point_index3]      ; do gouraud shading catmull on
  1147.         lea     edi,[edi*3]
  1148.         lea     edi,[points_color+edi*2]
  1149.         push    [zz3]
  1150.         push    word[edi]
  1151.         push    word[edi+2]
  1152.         push    word[edi+4]
  1153.         movzx   edi,[point_index2]
  1154.         lea     edi,[edi*3]
  1155.         lea     edi,[points_color+edi*2]
  1156.         push    [zz2]
  1157.         push    word[edi]
  1158.         push    word[edi+2]
  1159.         push    word[edi+4]
  1160.         movzx   edi,[point_index1]
  1161.         lea     edi,[edi*3]
  1162.         lea     edi,[points_color+edi*2]
  1163.         push    [zz1]
  1164.         push    word[edi]
  1165.         push    word[edi+2]
  1166.         push    word[edi+4]
  1167.  
  1168.    ;     movzx   edi,[point_index3]   ;gouraud shading according to light vector
  1169.    ;     lea     edi,[edi*3]
  1170.    ;     lea     edi,[4*edi+point_normals_rotated] ; edi - normal
  1171.    ;     mov     esi,light_vector
  1172.    ;     call    dot_product
  1173.    ;     fabs
  1174.    ;     fimul   [max_color_r]
  1175.    ;     fistp   [temp_col]
  1176.    ;     and     [temp_col],0x00ff
  1177.    ;     push    [temp_col]
  1178.    ;     push    [temp_col]
  1179.    ;     push    [temp_col]
  1180.  
  1181.    ;     movzx   edi,[point_index2]
  1182.    ;     lea     edi,[edi*3]
  1183.    ;     lea     edi,[4*edi+point_normals_rotated] ; edi - normal
  1184.    ;     mov     esi,light_vector
  1185.    ;     call    dot_product
  1186.    ;     fabs
  1187.    ;     fimul   [max_color_r]
  1188.    ;     fistp    [temp_col]
  1189.    ;     and     [temp_col],0x00ff
  1190.    ;     push    [temp_col]
  1191.    ;     push    [temp_col]
  1192.    ;     push    [temp_col]
  1193.  
  1194.    ;     movzx   edi,[point_index1]
  1195.    ;     lea     edi,[edi*3]
  1196.    ;     lea     edi,[4*edi+point_normals_rotated] ; edi - normal
  1197.    ;     mov     esi,light_vector
  1198.    ;     call    dot_product
  1199.    ;     fabs
  1200.    ;     fimul   [max_color_r]
  1201.    ;     fistp   [temp_col]
  1202.    ;     and     [temp_col],0x00ff
  1203.    ;     push    [temp_col]
  1204.    ;     push    [temp_col]
  1205.    ;     push    [temp_col]
  1206.  
  1207. ;        xor     edx,edx            ; draw acording to position
  1208. ;        mov     ax,[zz3]
  1209. ;        add     ax,128
  1210. ;        neg     al
  1211. ;        and     ax,0x00ff
  1212. ;        push    ax
  1213. ;        neg     al
  1214. ;        push    ax
  1215. ;        mov     dx,[yy3]
  1216. ;        and     dx,0x00ff
  1217. ;        push    dx
  1218. ;        mov     ax,[zz2]
  1219. ;        add     ax,128
  1220. ;        neg     al
  1221. ;        and     ax,0x00ff
  1222. ;        push    ax
  1223. ;        neg     al
  1224. ;        push    ax
  1225. ;        mov     dx,[yy2]
  1226. ;        and     dx,0x00ff
  1227. ;        push    dx
  1228. ;        mov     ax,[zz1]
  1229. ;        add     ax,128
  1230. ;        neg     al
  1231. ;        and     ax,0x00ff
  1232. ;        push    ax
  1233. ;        neg     al
  1234. ;        push    ax
  1235. ;        mov     dx,[yy1]
  1236. ;        and     dx,0x00ff
  1237. ;        push    dx
  1238.     .both_draw:
  1239.         mov     eax,dword[xx1]
  1240.         ror     eax,16
  1241.         mov     ebx,dword[xx2]
  1242.         ror     ebx,16
  1243.         mov     ecx,dword[xx3]
  1244.         ror     ecx,16
  1245.         lea     edi,[screen]
  1246.         cmp     [catmull_flag],0
  1247.         je      @f
  1248.         lea     esi,[Z_buffer]
  1249.         call    gouraud_triangle_z
  1250.         jmp     .end_draw
  1251.        @@:
  1252.         call    gouraud_triangle
  1253.         jmp     .end_draw
  1254.  
  1255.      .flat_draw:
  1256.         movzx   edi,[point_index3]
  1257.         lea     edi,[edi*3]
  1258.         lea     edi,[points_color+edi*2]
  1259.         movzx   eax,word[edi]
  1260.         movzx   ebx,word[edi+2]
  1261.         movzx   ecx,word[edi+4]
  1262.         movzx   edi,[point_index2]
  1263.         lea     edi,[edi*3]
  1264.         lea     edi,[points_color+edi*2]
  1265.         add     ax,word[edi]
  1266.         add     bx,word[edi+2]
  1267.         add     cx,word[edi+4]
  1268.         movzx   edi,[point_index1]
  1269.         lea     edi,[edi*3]
  1270.         lea     edi,[points_color+edi*2]
  1271.         add     ax,word[edi]
  1272.         add     bx,word[edi+2]
  1273.         add     cx,word[edi+4]
  1274.         cwd
  1275.         idiv    [i3]
  1276.         mov     di,ax
  1277.         shl     edi,16
  1278.         mov     ax,bx
  1279.         cwd
  1280.         idiv    [i3]
  1281.         mov     di,ax
  1282.         shl     di,8
  1283.         mov     ax,cx
  1284.         cwd
  1285.         idiv    [i3]
  1286.         mov     edx,edi
  1287.         mov     dl,al
  1288.         and     edx,0x00ffffff
  1289.  
  1290.  
  1291.      ;   mov     ax,[zz1]      ; z position depend draw
  1292.      ;   add     ax,[zz2]
  1293.      ;   add     ax,[zz3]
  1294.      ;   cwd
  1295.      ;   idiv    [i3] ;    = -((a+b+c)/3+130)
  1296.      ;   add     ax,130
  1297.      ;   neg     al
  1298.      ;   xor     edx,edx
  1299.      ;   mov     ah,al           ;set color according to z position
  1300.      ;   shl     eax,8
  1301.      ;   mov     edx,eax
  1302.  
  1303.         mov     eax,dword[xx1]
  1304.         ror     eax,16
  1305.         mov     ebx,dword[xx2]
  1306.         ror     ebx,16
  1307.         mov     ecx,dword[xx3]
  1308.         ror     ecx,16
  1309.        ; mov     edi,screen
  1310.         lea     edi,[screen]
  1311.         cmp     [catmull_flag],0
  1312.         je      @f
  1313.         lea     esi,[Z_buffer]
  1314.         push    word[zz3]
  1315.         push    word[zz2]
  1316.         push    word[zz1]
  1317.         call    flat_triangle_z
  1318.         jmp     .end_draw
  1319.       @@:
  1320.         call    draw_triangle
  1321.         jmp     .end_draw
  1322.       .env_mapping:
  1323.        ; fninit
  1324.         cmp     [catmull_flag],0
  1325.         je      @f
  1326.         push    [zz3]
  1327.         push    [zz2]
  1328.         push    [zz1]
  1329.       @@:
  1330.         mov     esi,point_index1
  1331.         sub     esp,12
  1332.         mov     edi,esp
  1333.         mov     ecx,3
  1334.       @@:
  1335.         movzx   eax,word[esi]
  1336.         lea     eax,[eax*3]
  1337.         shl     eax,2
  1338.         add     eax,point_normals_rotated
  1339.         ; texture x=(rotated point normal -> x * 255)+255
  1340.         fld     dword[eax]
  1341.         fimul   [correct_tex]
  1342.         fiadd   [correct_tex]
  1343.         fistp   word[edi]
  1344.         ; texture y=(rotated point normal -> y * 255)+255
  1345.         fld     dword[eax+4]
  1346.         fimul   [correct_tex]
  1347.         fiadd   [correct_tex]
  1348.         fistp   word[edi+2]
  1349.  
  1350.         add     edi,4
  1351.         add     esi,2
  1352.         loop    @b
  1353.  
  1354.         mov     eax,dword[xx1]
  1355.         ror     eax,16
  1356.         mov     ebx,dword[xx2]
  1357.         ror     ebx,16
  1358.         mov     ecx,dword[xx3]
  1359.         ror     ecx,16
  1360.         mov     edi,screen
  1361.         mov     esi,envmap
  1362.         cmp     [catmull_flag],0
  1363.         je      @f
  1364.         mov     edx,Z_buffer
  1365.         call    tex_triangle_z
  1366.         jmp     .end_draw
  1367.       @@:
  1368.         call    tex_triangle
  1369.         jmp     .end_draw
  1370.       .bump_mapping:
  1371.         ; fninit
  1372.         cmp     [catmull_flag],0
  1373.         je      @f
  1374.         push    Z_buffer
  1375.         push    [zz3]
  1376.         push    [zz2]
  1377.         push    [zz1]
  1378.       @@:
  1379.         mov     esi,point_index1
  1380.         sub     esp,12
  1381.         mov     edi,esp
  1382.         mov     ecx,3
  1383.       @@:
  1384.         movzx   eax,word[esi]
  1385.         lea     eax,[eax*3]
  1386.         shl     eax,2
  1387.         add     eax,point_normals_rotated
  1388.         ; texture x=(rotated point normal -> x * 255)+255
  1389.         fld     dword[eax]
  1390.         fimul   [correct_tex]
  1391.         fiadd   [correct_tex]
  1392.         fistp   word[edi]
  1393.         ; texture y=(rotated point normal -> y * 255)+255
  1394.         fld     dword[eax+4]
  1395.         fimul   [correct_tex]
  1396.         fiadd   [correct_tex]
  1397.         fistp   word[edi+2]
  1398.  
  1399.         add     edi,4
  1400.         add     esi,2
  1401.         loop    @b
  1402.  
  1403.         movzx  esi,[point_index3]
  1404.         shl    esi,2
  1405.         add    esi,tex_points
  1406.         push   dword[esi]
  1407.         movzx  esi,[point_index2]
  1408.         shl    esi,2
  1409.         add    esi,tex_points
  1410. ;       lea    esi,[esi*3]
  1411. ;       lea    esi,[points+2+esi*2]
  1412.         push   dword[esi]
  1413.   ;     push   dword[xx2]
  1414.         movzx  esi,[point_index1]
  1415.         shl    esi,2
  1416.         add    esi,tex_points
  1417. ;       lea     esi,[esi*3]
  1418. ;       lea     esi,[points+2+esi*2]
  1419.         push   dword[esi]
  1420.    ;    push     dword[xx1]
  1421.  
  1422.         mov     eax,dword[xx1]
  1423.         ror     eax,16
  1424.         mov     ebx,dword[xx2]
  1425.         ror     ebx,16
  1426.         mov     ecx,dword[xx3]
  1427.         ror     ecx,16
  1428.         mov     edi,screen
  1429.         mov     esi,envmap
  1430.         mov     edx,bumpmap            ;BUMP_MAPPING
  1431.  
  1432.         cmp     [catmull_flag],0
  1433.         je      @f
  1434.         call    bump_triangle_z
  1435.         jmp     .end_draw
  1436.       @@:
  1437.         call    bump_triangle
  1438.  
  1439.       .end_draw:
  1440.         pop     esi
  1441.         add     esi,6
  1442.         cmp     dword[esi],-1
  1443.         jne     .again_dts
  1444. ret
  1445. translate_points:
  1446. ;        fninit
  1447. ;        mov     ebx,points_rotated
  1448. ;    again_trans:
  1449. ;        fild    word[ebx+4] ;z1
  1450. ;        fmul    [sq]
  1451. ;        fld     st
  1452. ;        fiadd   word[ebx]  ;x1
  1453. ;        fistp   word[ebx]
  1454. ;        fchs
  1455. ;        fiadd   word[ebx+2] ;y1
  1456. ;        fistp   word[ebx+2] ;y1
  1457.  
  1458. ;        add     ebx,6
  1459. ;        cmp     dword[ebx],-1
  1460. ;        jne     again_trans
  1461. ;ret
  1462. translate_perspective_points: ;translate points from 3d to 2d using
  1463.         fninit                ;perspective equations
  1464.         mov ebx,points_rotated
  1465.       .again_trans:
  1466.         fild word[ebx]
  1467.         fisub [xobs]
  1468.         fimul [zobs]
  1469.         fild word[ebx+4]
  1470.         fisub [zobs]
  1471.         fdivp
  1472.         fiadd [xobs]
  1473.         fistp word[ebx]
  1474.         fild word[ebx+2]
  1475.         fisub [yobs]
  1476.         fimul [zobs]
  1477.         fild word[ebx+4]
  1478.         fisub [zobs]
  1479.         fdivp
  1480.         fchs
  1481.         fiadd [yobs]
  1482.         fistp word[ebx+2]
  1483.         add ebx,6
  1484.         cmp dword[ebx],-1
  1485.         jne .again_trans
  1486. ret
  1487.  
  1488.  
  1489. copy_points:
  1490.         mov     esi,points
  1491.         mov     edi,points_rotated
  1492.         mov     ecx,points_count*3+2
  1493.         rep     movsw
  1494. ret
  1495.  
  1496.  
  1497.  
  1498. read_from_file:
  1499.         mov     edi,triangles
  1500.         xor     ebx,ebx
  1501.         xor     ebp,ebp
  1502.         mov     esi,SourceFile
  1503.         cmp     [esi],word 4D4Dh
  1504.         jne     .exit ;Must be legal .3DS file
  1505.         cmp     dword[esi+2],EndFile-SourceFile
  1506.         jne     .exit ;This must tell the length
  1507.         add     esi,6
  1508.       @@:
  1509.         cmp     [esi],word 3D3Dh
  1510.         je      @f
  1511.         add     esi,[esi+2]
  1512.         jmp     @b
  1513.       @@:
  1514.         add     esi,6
  1515.       .find4k:
  1516.         cmp     [esi],word 4000h
  1517.         je      @f
  1518.         add     esi,[esi+2]
  1519.         cmp     esi,EndFile
  1520.         jc      .find4k
  1521.         jmp     .exit
  1522.       @@:
  1523.         add     esi,6
  1524.       @@:
  1525.         cmp     [esi],byte 0
  1526.         je      @f
  1527.         inc     esi
  1528.         jmp     @b
  1529.       @@:
  1530.         inc     esi
  1531.       @@:
  1532.         cmp     [esi],word 4100h
  1533.         je      @f
  1534.         add     esi,[esi+2]
  1535.         jmp     @b
  1536.       @@:
  1537.         add     esi,6
  1538.       @@:
  1539.         cmp     [esi],word 4110h
  1540.         je      @f
  1541.         add     esi,[esi+2]
  1542.         jmp     @b
  1543.       @@:
  1544.         movzx   ecx,word[esi+6]
  1545.         mov     [points_count_var],cx
  1546.         mov     edx,ecx
  1547.         add     esi,8
  1548.       @@:
  1549.         fld     dword[esi+4]
  1550.         fmul    [sscale]
  1551.         fadd    [xoffset]
  1552.         fld     dword[esi+8]
  1553.         fchs
  1554.         fmul    [sscale]
  1555.         fadd    [yoffset]
  1556.         fld     dword[esi+0]
  1557.         fchs
  1558.         fmul    [sscale]
  1559.         fistp   word[points+ebx+4]
  1560.         fistp   word[points+ebx+2]
  1561.         fistp   word[points+ebx+0]
  1562.         add     ebx,6
  1563.         add     esi,12
  1564.         dec     ecx
  1565.         jnz     @b
  1566.       @@:
  1567.         mov     dword[points+ebx],-1
  1568.       @@:
  1569.         cmp     [esi],word 4120h
  1570.         je      @f
  1571.         add     esi,[esi+2]
  1572.         jmp     @b
  1573.       @@:
  1574.         movzx   ecx,word[esi+6]
  1575.         mov     [triangles_count_var],cx
  1576.         add     esi,8
  1577.         ;mov     edi,triangles
  1578.       @@:
  1579.         movsd
  1580.         movsw
  1581.         add     word[edi-6],bp
  1582.         add     word[edi-4],bp
  1583.         add     word[edi-2],bp
  1584.         add     esi,2
  1585.         dec     ecx
  1586.         jnz     @b
  1587.         add     ebp,edx
  1588.         jmp     .find4k
  1589.  
  1590.       .exit:
  1591.         mov     dword[edi],-1
  1592. ret
  1593.  
  1594.  
  1595. ;   *********************************************
  1596. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  1597. ;   *********************************************
  1598. draw_window:
  1599.  
  1600.         mov     eax,12          ; function 12:tell os about windowdraw
  1601.         mov     ebx,1           ; 1, start of draw
  1602.         int     0x40
  1603.  
  1604.         ; SKIN WIDTH
  1605.         mov  eax,48
  1606.         mov  ebx,4
  1607.         int  0x40
  1608.         mov  esi, eax
  1609.        
  1610.         ; DRAW WINDOW
  1611.     mov  eax,0                     ; function 0 : define and draw window
  1612.     mov  ebx,100*65536+SIZE_X+9+80         ; [x start] *65536 + [x size]
  1613.     mov  ecx,100*65536+SIZE_Y+4         ; [y start] *65536 + [y size]
  1614.         add  ecx, esi
  1615.         mov  edx,0x74000000                ; color of work area RRGGBB,8->color gl
  1616.     mov  edi,labelt
  1617.         int  0x40
  1618.        
  1619.         ; BLACK BAR
  1620.         mov     eax,13          ; function 8 : define and draw button
  1621.         mov     ebx,SIZE_X*65536+80     ; [x start] *65536 + [x size]
  1622.         mov     ecx,0*65536+SIZE_Y  ; [y start] *65536 + [y size]
  1623.         mov     edx,0           ; color RRGGBB
  1624.         int     0x40   
  1625.  
  1626.         ; ROTARY BUTTON
  1627.         mov     eax,8           ; function 8 : define and draw button
  1628.         mov     ebx,(SIZE_X+10)*65536+62     ; [x start] *65536 + [x size]
  1629.         mov     ecx,25*65536+12  ; [y start] *65536 + [y size]
  1630.         mov     edx,2           ; button id
  1631.         mov     esi,0x6688dd    ; button color RRGGBB
  1632.         int     0x40
  1633.         ; ROTARY  LABEL
  1634.         mov     eax,4           ; function 4 : write text to window
  1635.         mov     ebx,(SIZE_X+12)*65536+28   ; [x start] *65536 + [y start]
  1636.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1637.         mov     edx,labelrot      ; pointer to text beginning
  1638.         mov     esi,labelrotend-labelrot     ; text length
  1639.         int     0x40
  1640.  
  1641.         ; DRAW MODE BUTTON
  1642.         mov     eax,8           ; function 8 : define and draw button
  1643.         mov     ebx,(SIZE_X+10)*65536+62     ; [x start] *65536 + [x size]
  1644.         mov     ecx,(25+15)*65536+12  ; [y start] *65536 + [y size]
  1645.         mov     edx,3           ; button id
  1646.         mov     esi,0x6688dd    ; button color RRGGBB
  1647.         int     0x40
  1648.          ; DRAW MODE LABEL
  1649.         mov     eax,4           ; function 4 : write text to window
  1650.         mov     ebx,(SIZE_X+12)*65536+28+15   ; [x start] *65536 + [y start]
  1651.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1652.         mov     edx,labeldrmod      ; pointer to text beginning
  1653.         mov     esi,labeldrmodend-labeldrmod     ; text length
  1654.         int     0x40
  1655.  
  1656.          ; SPEED BUTTON
  1657.         mov     eax,8           ; function 8 : define and draw button
  1658.         mov     ebx,(SIZE_X+10)*65536+62     ; [x start] *65536 + [x size]
  1659.         mov     ecx,(25+15*2)*65536+12  ; [y start] *65536 + [y size]
  1660.         mov     edx,4           ; button id
  1661.         mov     esi,0x6688dd    ; button color RRGGBB
  1662.         int     0x40
  1663.          ; SPEED MODE LABEL
  1664.         mov     eax,4           ; function 4 : write text to window
  1665.         mov     ebx,(SIZE_X+12)*65536+(28+15*2)   ; [x start] *65536 + [y start]
  1666.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1667.         mov     edx,labelspeedmod      ; pointer to text beginning
  1668.         mov     esi,labelspeedmodend-labelspeedmod     ; text length
  1669.         int     0x40
  1670.  
  1671.          ; SCALE- BUTTON
  1672.         mov     eax,8           ; function 8 : define and draw button
  1673.         mov     ebx,(SIZE_X+10)*65536+62     ; [x start] *65536 + [x size]
  1674.         mov     ecx,(25+15*3)*65536+12  ; [y start] *65536 + [y size]
  1675.         mov     edx,5           ; button id
  1676.         mov     esi,0x6688dd    ; button color RRGGBB
  1677.         int     0x40
  1678.          ; SCALE- MODE LABEL
  1679.         mov     eax,4           ; function 4 : write text to window
  1680.         mov     ebx,(SIZE_X+12)*65536+(28+15*3)   ; [x start] *65536 + [y start]
  1681.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1682.         mov     edx,labelzoomout      ; pointer to text beginning
  1683.         mov     esi,labelzoomoutend-labelzoomout     ; text length
  1684.         int     0x40
  1685.  
  1686.          ; SCALE+ BUTTON
  1687.         mov     eax,8           ; function 8 : define and draw button
  1688.         mov     ebx,(SIZE_X+10)*65536+62     ; [x start] *65536 + [x size]
  1689.         mov     ecx,(25+15*4)*65536+12  ; [y start] *65536 + [y size]
  1690.         mov     edx,6           ; button id
  1691.         mov     esi,0x6688dd    ; button color RRGGBB
  1692.         int     0x40
  1693.          ; SCALE+ MODE LABEL
  1694.         mov     eax,4           ; function 4 : write text to window
  1695.         mov     ebx,(SIZE_X+12)*65536+(28+15*4)   ; [x start] *65536 + [y start]
  1696.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1697.         mov     edx,labelzoomin      ; pointer to text beginning
  1698.         mov     esi,labelzoominend-labelzoomin     ; text length
  1699.         int     0x40
  1700.         ; ADD VECTOR LABEL
  1701.         mov     eax,4           ; function 4 : write text to window
  1702.         mov     ebx,(SIZE_X+12)*65536+(28+15*5)   ; [x start] *65536 + [y start]
  1703.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1704.         mov     edx,labelvector      ; pointer to text beginning
  1705.         mov     esi,labelvectorend-labelvector     ; text length
  1706.         int     0x40
  1707.          ; VECTOR Y- BUTTON
  1708.         mov     eax,8           ; function 8 : define and draw button
  1709.         mov     ebx,(SIZE_X+10+20)*65536+62-42     ; [x start] *65536 + [x size]
  1710.         mov     ecx,(25+15*6)*65536+12  ; [y start] *65536 + [y size]
  1711.         mov     edx,7           ; button id
  1712.         mov     esi,0x6688dd    ; button color RRGGBB
  1713.         int     0x40
  1714.         ;VECTOR Y- LABEL
  1715.         mov     eax,4           ; function 4 : write text to window
  1716.         mov     ebx,(SIZE_X+12+20)*65536+(28+15*6)   ; [x start] *65536 + [y start]
  1717.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1718.         mov     edx,labelyminus      ; pointer to text beginning
  1719.         mov     esi,labelyminusend-labelyminus     ; text length
  1720.         int     0x40
  1721.         ; VECTOR Z+ BUTTON
  1722.         mov     eax,8           ; function 8 : define and draw button
  1723.         mov     ebx,(SIZE_X+10+41)*65536+62-41     ; [x start] *65536 + [x size]
  1724.         mov     ecx,(25+15*6)*65536+12  ; [y start] *65536 + [y size]
  1725.         mov     edx,8           ; button id
  1726.         mov     esi,0x6688dd    ; button color RRGGBB
  1727.         int     0x40
  1728.         ;VECTOR Z+ LABEL
  1729.         mov     eax,4           ; function 4 : write text to window
  1730.         mov     ebx,(SIZE_X+12+41)*65536+(28+15*6)   ; [x start] *65536 + [y start]
  1731.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1732.         mov     edx,labelzplus      ; pointer to text beginning
  1733.         mov     esi,labelzplusend-labelzplus     ; text length
  1734.         int     0x40
  1735.         ; VECTOR x- BUTTON
  1736.         mov     eax,8           ; function 8 : define and draw button
  1737.         mov     ebx,(SIZE_X+10)*65536+62-41     ; [x start] *65536 + [x size]
  1738.         mov     ecx,(25+15*7)*65536+12  ; [y start] *65536 + [y size]
  1739.         mov     edx,9           ; button id
  1740.         mov     esi,0x6688dd    ; button color RRGGBB
  1741.         int     0x40
  1742.         ;VECTOR x- LABEL
  1743.         mov     eax,4           ; function 4 : write text to window
  1744.         mov     ebx,(SIZE_X+12)*65536+(28+15*7)   ; [x start] *65536 + [y start]
  1745.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1746.         mov     edx,labelxminus      ; pointer to text beginning
  1747.         mov     esi,labelxminusend-labelxminus     ; text length
  1748.         int     0x40
  1749.         ; VECTOR x+ BUTTON
  1750.         mov     eax,8           ; function 8 : define and draw button
  1751.         mov     ebx,(SIZE_X+10+41)*65536+62-41     ; [x start] *65536 + [x size]
  1752.         mov     ecx,(25+15*7)*65536+12  ; [y start] *65536 + [y size]
  1753.         mov     edx,10           ; button id
  1754.         mov     esi,0x6688dd    ; button color RRGGBB
  1755.         int     0x40
  1756.         ;VECTOR x+ LABEL
  1757.         mov     eax,4           ; function 4 : write text to window
  1758.         mov     ebx,(SIZE_X+12+41)*65536+(28+15*7)   ; [x start] *65536 + [y start]
  1759.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1760.         mov     edx,labelxplus      ; pointer to text beginning
  1761.         mov     esi,labelxplusend-labelxplus     ; text length
  1762.         int     0x40
  1763.         ; VECTOR z- BUTTON
  1764.         mov     eax,8           ; function 8 : define and draw button
  1765.         mov     ebx,(SIZE_X+10)*65536+62-41     ; [x start] *65536 + [x size]
  1766.         mov     ecx,(25+15*8)*65536+12  ; [y start] *65536 + [y size]
  1767.         mov     edx,11           ; button id
  1768.         mov     esi,0x6688dd    ; button color RRGGBB
  1769.         int     0x40
  1770.         ;VECTOR z- LABEL
  1771.         mov     eax,4           ; function 4 : write text to window
  1772.         mov     ebx,(SIZE_X+12)*65536+(28+15*8)   ; [x start] *65536 + [y start]
  1773.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1774.         mov     edx,labelzminus      ; pointer to text beginning
  1775.         mov     esi,labelzminusend-labelzminus     ; text length
  1776.         int     0x40
  1777.        ;VECTOR Y+ BUTTON
  1778.         mov     eax,8           ; function 8 : define and draw button
  1779.         mov     ebx,(SIZE_X+10+20)*65536+62-42     ; [x start] *65536 + [x size]
  1780.         mov     ecx,(25+15*8)*65536+12  ; [y start] *65536 + [y size]
  1781.         mov     edx,12           ; button id
  1782.         mov     esi,0x6688dd    ; button color RRGGBB
  1783.         int     0x40
  1784.         ;VECTOR Y+ LABEL
  1785.         mov     eax,4           ; function 4 : write text to window
  1786.         mov     ebx,(SIZE_X+12+20)*65536+(28+15*8)   ; [x start] *65536 + [y start]
  1787.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1788.         mov     edx,labelyplus      ; pointer to text beginning
  1789.         mov     esi,labelyplusend-labelyplus     ; text length
  1790.         int     0x40
  1791.         ; LEAD COLOR LABEL
  1792.         mov     eax,4           ; function 4 : write text to window
  1793.         mov     ebx,(SIZE_X+12)*65536+(28+15*9)   ; [x start] *65536 + [y start]
  1794.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1795.         mov     edx,labelmaincolor      ; pointer to text beginning
  1796.         mov     esi,labelmaincolorend-labelmaincolor     ; text length
  1797.         int     0x40
  1798.  
  1799.         ;RED+ BUTTON
  1800.         mov     eax,8           ; function 8 : define and draw button
  1801.         mov     ebx,(SIZE_X+10)*65536+62-41     ; [x start] *65536 + [x size]
  1802.         mov     ecx,(25+15*10)*65536+12  ; [y start] *65536 + [y size]
  1803.         mov     edx,13           ; button id
  1804.         mov     esi,0x6688dd    ; button color RRGGBB
  1805.         int     0x40
  1806.         ;RED+  LABEL
  1807.         mov     eax,4           ; function 4 : write text to window
  1808.         mov     ebx,(SIZE_X+12)*65536+(28+15*10)   ; [x start] *65536 + [y start]
  1809.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1810.         mov     edx,labelredplus      ; pointer to text beginning
  1811.         mov     esi,labelredplusend-labelredplus     ; text length
  1812.         int     0x40
  1813.         ;GREEN+ BUTTON
  1814.         mov     eax,8           ; function 8 : define and draw button
  1815.         mov     ebx,(SIZE_X+10+20)*65536+62-42     ; [x start] *65536 + [x size]
  1816.         mov     ecx,(25+15*10)*65536+12  ; [y start] *65536 + [y size]
  1817.         mov     edx,14           ; button id
  1818.         mov     esi,0x6688dd    ; button color RRGGBB
  1819.         int     0x40
  1820.         ;GREEN+ LABEL
  1821.         mov     eax,4           ; function 4 : write text to window
  1822.         mov     ebx,(SIZE_X+12+20)*65536+(28+15*10)   ; [x start] *65536 + [y start]
  1823.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1824.         mov     edx,labelgreenplus      ; pointer to text beginning
  1825.         mov     esi,labelgreenplusend-labelgreenplus     ; text length
  1826.         int     0x40
  1827.         ;BLUE+ BUTTON
  1828.         mov     eax,8           ; function 8 : define and draw button
  1829.         mov     ebx,(SIZE_X+10+41)*65536+62-41     ; [x start] *65536 + [x size]
  1830.         mov     ecx,(25+15*10)*65536+12  ; [y start] *65536 + [y size]
  1831.         mov     edx,15           ; button id
  1832.         mov     esi,0x6688dd    ; button color RRGGBB
  1833.         int     0x40
  1834.         ;BLUE+ LABEL
  1835.         mov     eax,4           ; function 4 : write text to window
  1836.         mov     ebx,(SIZE_X+12+41)*65536+(28+15*10)   ; [x start] *65536 + [y start]
  1837.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1838.         mov     edx,labelblueplus      ; pointer to text beginning
  1839.         mov     esi,labelblueplusend-labelblueplus     ; text length
  1840.         int     0x40
  1841.         ;RED- BUTTON
  1842.         mov     eax,8           ; function 8 : define and draw button
  1843.         mov     ebx,(SIZE_X+10)*65536+62-41     ; [x start] *65536 + [x size]
  1844.         mov     ecx,(25+15*11)*65536+12  ; [y start] *65536 + [y size]
  1845.         mov     edx,16           ; button id
  1846.         mov     esi,0x6688dd    ; button color RRGGBB
  1847.         int     0x40
  1848.         ;RED-  LABEL
  1849.         mov     eax,4           ; function 4 : write text to window
  1850.         mov     ebx,(SIZE_X+12)*65536+(28+15*11)   ; [x start] *65536 + [y start]
  1851.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1852.         mov     edx,labelredminus      ; pointer to text beginning
  1853.         mov     esi,labelredminusend-labelredminus     ; text length
  1854.         int     0x40
  1855.         ;GREEN- BUTTON
  1856.         mov     eax,8           ; function 8 : define and draw button
  1857.         mov     ebx,(SIZE_X+10+20)*65536+62-42     ; [x start] *65536 + [x size]
  1858.         mov     ecx,(25+15*11)*65536+12  ; [y start] *65536 + [y size]
  1859.         mov     edx,17           ; button id
  1860.         mov     esi,0x6688dd    ; button color RRGGBB
  1861.         int     0x40
  1862.         ;GREEN- LABEL
  1863.         mov     eax,4           ; function 4 : write text to window
  1864.         mov     ebx,(SIZE_X+12+20)*65536+(28+15*11)   ; [x start] *65536 + [y start]
  1865.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1866.         mov     edx,labelgreenminus      ; pointer to text beginning
  1867.         mov     esi,labelgreenminusend-labelgreenminus     ; text length
  1868.         int     0x40
  1869.         ;BLUE- BUTTON
  1870.         mov     eax,8           ; function 8 : define and draw button
  1871.         mov     ebx,(SIZE_X+10+41)*65536+62-41     ; [x start] *65536 + [x size]
  1872.         mov     ecx,(25+15*11)*65536+12  ; [y start] *65536 + [y size]
  1873.         mov     edx,18           ; button id
  1874.         mov     esi,0x6688dd    ; button color RRGGBB
  1875.         int     0x40
  1876.         ;BLUE- LABEL
  1877.         mov     eax,4           ; function 4 : write text to window
  1878.         mov     ebx,(SIZE_X+12+41)*65536+(28+15*11)   ; [x start] *65536 + [y start]
  1879.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1880.         mov     edx,labelblueminus      ; pointer to text beginning
  1881.         mov     esi,labelblueminusend-labelblueminus     ; text length
  1882.         int     0x40
  1883.         ; Catmull  LABEL
  1884.         mov     eax,4           ; function 4 : write text to window
  1885.         mov     ebx,(SIZE_X+12)*65536+(28+15*12)   ; [x start] *65536 + [y start]
  1886.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1887.         mov     edx,labelcatmullmod      ; pointer to text beginning
  1888.         mov     esi,labelcatmullmodend-labelcatmullmod     ; text length
  1889.         int     0x40
  1890.         ; on/off BUTTON
  1891.         mov     eax,8           ; function 8 : define and draw button
  1892.         mov     ebx,(SIZE_X+10)*65536+62     ; [x start] *65536 + [x size]
  1893.         mov     ecx,(25+15*13)*65536+12  ; [y start] *65536 + [y size]
  1894.         mov     edx,19           ; button id
  1895.         mov     esi,0x6688dd    ; button color RRGGBB
  1896.         int     0x40
  1897.          ; on/off LABEL
  1898.         mov     eax,4           ; function 4 : write text to window
  1899.         mov     ebx,(SIZE_X+12)*65536+(28+15*13)   ; [x start] *65536 + [y start]
  1900.         mov     ecx,0x00ddeeff  ; font 1 & color ( 0xF0RRGGBB )
  1901.         mov     edx,labelonoff      ; pointer to text beginning
  1902.         mov     esi,labelonoffend-labelonoff     ; text length
  1903.         int     0x40
  1904.  
  1905.  
  1906.         mov     eax,12          ; function 12:tell os about windowdraw
  1907.         mov     ebx,2           ; 2, end of draw
  1908.         int     0x40
  1909.  
  1910.         ret
  1911.  
  1912.  
  1913.         ; DATA AREA
  1914.         i3              dw      3
  1915.         light_vector    dd      0.0,0.0,-1.0
  1916.      ;  debug_vector    dd      0.0,2.0,2.0   ;--debug
  1917.      ;  debug_vector1   dd      0.0,0.0,0.0
  1918.      ;  debug_points    dw      1,1,1,3,4,20
  1919.      ;  debug_dd        dw      ?
  1920.      ;  debug_dwd       dd      65535
  1921.      ;  debug_counter   dw      0
  1922.         dot_max         dd      1.0      ; dot product max and min
  1923.         dot_min         dd      0.0
  1924.         env_const       dd      1.2
  1925.         correct_tex     dw      255
  1926.         max_color_r     dw      255
  1927.         max_color_g     dw      25
  1928.         max_color_b     dw      35
  1929.         xobs            dw      SIZE_X / 2 ;200 ;observer
  1930.         yobs            dw      SIZE_Y / 2 ;200 ;coordinates
  1931.         zobs            dw      -500
  1932.  
  1933.  
  1934.         angle_counter dw 0
  1935.         piD180        dd 0.017453292519943295769236907684886
  1936.       ;  sq            dd 0.70710678118654752440084436210485
  1937.         const6        dw 6,6,6,6
  1938.         xo            dw 150;87  ; rotary point coodinates
  1939.         zo            dw 0
  1940.         yo            dw 100
  1941.         xoffset       dd 150.0
  1942.         yoffset       dd 170.0
  1943.         sscale        dd 8.0             ; real scale
  1944.         vect_x        dw 0
  1945.         vect_y        dw 0
  1946.         vect_z        dw 0
  1947.  
  1948.  
  1949.         r_flag        db 0       ; rotary flag
  1950.         dr_flag       db 2       ; drawing mode flag
  1951.         speed_flag    db 0
  1952.         catmull_flag  db 1
  1953.     SourceFile file 'hrt.3ds'
  1954.     EndFile:
  1955.     labelrot:
  1956.         db   'rotary'
  1957.     labelrotend:
  1958.     labeldrmod:
  1959.         db   'shd. mode'
  1960.     labeldrmodend:
  1961.     labelspeedmod:
  1962.         db   'speed'
  1963.     labelspeedmodend:
  1964.     labelzoomout:
  1965.         db   'zoom out'
  1966.     labelzoomoutend:
  1967.     labelzoomin:
  1968.         db   'zoom in'
  1969.     labelzoominend:
  1970.     labelvector:
  1971.         db   'add vector'
  1972.     labelvectorend:
  1973.     labelyminus:
  1974.         db   'y -'
  1975.     labelyminusend:
  1976.     labelzplus:
  1977.         db   'z +'
  1978.     labelzplusend:
  1979.     labelxminus:
  1980.         db   'x -'
  1981.     labelxminusend:
  1982.     labelxplus:
  1983.         db   'x +'
  1984.     labelxplusend:
  1985.     labelzminus:
  1986.         db   'z -'
  1987.     labelzminusend:
  1988.     labelyplus:
  1989.         db   'y +'
  1990.     labelyplusend:
  1991.     labelmaincolor:
  1992.         db   'main color'
  1993.     labelmaincolorend:
  1994.     labelredplus:
  1995.         db   'r +'
  1996.     labelredplusend:
  1997.     labelgreenplus:
  1998.         db   'g +'
  1999.     labelgreenplusend:
  2000.     labelblueplus:
  2001.         db   'b +'
  2002.     labelblueplusend:
  2003.     labelredminus:
  2004.         db   'r -'
  2005.     labelredminusend:
  2006.     labelgreenminus:
  2007.         db   'g -'
  2008.     labelgreenminusend:
  2009.     labelblueminus:
  2010.         db   'b -'
  2011.     labelblueminusend:
  2012.     labelcatmullmod:
  2013.         db 'catmull'
  2014.     labelcatmullmodend:
  2015.     labelonoff:
  2016.         db 'on/off'
  2017.     labelonoffend:
  2018.     labelt:
  2019.         db   'Ave cruce salus mea',0
  2020. align 8
  2021.         @col    dd      ?
  2022.         @y1     dw      ?
  2023.         @x1     dw      ?;+8
  2024.         @y2     dw      ?
  2025.         @x2     dw      ?
  2026.         @y3     dw      ?
  2027.         @x3     dw      ?;+16
  2028.  
  2029.         @dx12   dd      ?
  2030.         @dx13   dd      ?;+24
  2031.         @dx23   dd      ?
  2032.  
  2033.         sinbeta dd      ?;+32
  2034.         cosbeta dd      ?
  2035.  
  2036.         xsub    dw      ?
  2037.         zsub    dw      ?;+40
  2038.         ysub    dw      ?
  2039.  
  2040.         xx1     dw      ?
  2041.         yy1     dw      ?
  2042.         zz1     dw      ?;+48
  2043.         xx2     dw      ?
  2044.         yy2     dw      ?
  2045.         zz2     dw      ?
  2046.         xx3     dw      ?;+56
  2047.         yy3     dw      ?
  2048.         zz3     dw      ?
  2049.         scale   dd      ?                 ; help scale variable
  2050.         ;screen  dd      ?                ;pointer to screen buffer
  2051.         triangles_count_var dw ?
  2052.         points_count_var    dw ?
  2053.  
  2054.  
  2055.         point_index1        dw ?   ;-\
  2056.         point_index2        dw ?   ;  }  don't change order
  2057.         point_index3        dw ?   ;-/
  2058.         temp_col            dw ?
  2059.         high    dd      ?
  2060. align 8
  2061.         buffer  dq      ?
  2062.  
  2063.         ;err    dd      ?
  2064.         drr     dd      ?
  2065.         xx      dd      ?
  2066.         yy      dd      ?
  2067.         xst     dd      ?
  2068.         yst     dd      ?
  2069. align 16
  2070.     points:
  2071.         rw (EndFile-SourceFile)/12*3
  2072.         points_count = ($-points)/6
  2073.     triangles:
  2074.         rw (EndFile-SourceFile)/12*3
  2075.         triangles_count = ($-triangles)/6
  2076.  
  2077. align 16
  2078.         points_rotated rw points_count*3 + 2
  2079. align 16
  2080.         label trizdd dword
  2081.         label trizdq qword
  2082.         triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position
  2083. align 16
  2084.         triangles_normals rb triangles_count * 12 ;
  2085.         point_normals rb points_count * 12  ;one 3dvector - triple float dword x,y,z
  2086. align 16
  2087.         point_normals_rotated rb points_count * 12
  2088. align 16
  2089.         vectors rb 24
  2090.         points_color rb 6*points_count    ; each color as word
  2091. ;        sorted_triangles rw triangles_count*3 + 2
  2092. ;align 16
  2093.         bumpmap         rb      TEXTURE_SIZE + 1
  2094.         envmap          rb      (TEXTURE_SIZE +1) * 3
  2095.         tex_points      rb      points_count * 4  ; bump_map points
  2096.                                 ; each point word x, word y
  2097.         screen          rb      SIZE_X * SIZE_Y * 3   ; screen buffer
  2098.         Z_buffer        rb      SIZE_X * SIZE_Y * 4
  2099.         memStack rb 1000 ;memory area for stack
  2100.     I_END:
  2101.