Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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