Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;    3D ’…Š‘’“ˆŽ‚€›‰ „‚ˆ†ŽŠ  3D TEXTURED ENGINE
  3. ;    €‚’Ž:  ¢«î設 …¢£¥­¨©    AUTOR: Pavlushin Evgeni
  4. ;
  5. ;    Š®¬¯¨«¨àã¥âáï á ¯®¬®éìî FASM  áᥬ¡«¥à  ¤«ï MenuetOS
  6. ;    Compile with FASM assembler for MenuetOS
  7. ;
  8. ; 20.11.04   Fast point calc & triangle draw
  9. ;            Little matrix no (trangle massive)
  10. ;            Fast triangle, del triangle out of screen
  11. ; 16.12.04   Fast triangle with MMX
  12. ; 20.12.04   Out triangle fatal bug's deleted, "black zones" deleted
  13. ;            Matrix move support
  14. ; 24.12.04   Fast keyboard scanning
  15. ;            Z-ground level map work
  16. ;            Texture draw correction deleted "black zones"
  17. ; 04.01.05   Moveing texture
  18. ; 05.01.05   Water dynamic texture
  19. ; 06.01.05   Texture pack (many textures in one file)
  20. ; 07.01.05   Z-sorting
  21. ; 08.01.05   Triangle good clipping calculating (speed up)
  22. ;            4 byte Z-sorting, more dynamic of water
  23. ; 09.01.05   Texture map from 256 color bmp file
  24. ;            Pixel Z-buffer, good speed!
  25. ; 21.01.05   Models buffer add.
  26. ; 25.01.05   Models buffer update, Add 2 new models.
  27. ; 29.01.05   Dynamic model array
  28. ; 01.02.05   1 picture MipMap calculation
  29. ; 04.02.05   All picture MipMap calculation, proc speed up.
  30. ;            Simple Triangel MipMap chose.
  31. ; 05.02.05   Normal Triangel MipMap chose.
  32. ; 12.02.05   Best QUALITY of Textured TRIANGEL!
  33. ; 13.02.05   add new models. All camera axis calculating
  34. ; 16.02.05   Simple model turning
  35. ; 17.02.05   Advanced model turning, model tmpoints massive deleted
  36. ;            New map size 128, add new models.
  37. ; 25.02.05   Left side clipping bug deleted
  38. ; 26.02.05   Optimization of textured line algorythm
  39. ; 24.04.05   Test pixel z-buffer it's work. Use new textri algorythm
  40. ; 30.04.05   Fast Y-clipping
  41.  
  42. use32
  43.  
  44. SCREEN_X equ 800 ;320  ;Screen size easy change
  45. SCREEN_Y equ 600 ;200
  46. DSCREEN_X equ SCREEN_X-1 ;320  ;For triangle clipping
  47. DSCREEN_Y equ SCREEN_Y-1 ;200
  48. MATRIX_XSIZE equ 64;32;64;100  ;Ground matrix size
  49. MATRIX_YSIZE equ 64;32;64;100
  50. SECTOR_SIZE  equ 100           ;Size of matrix sector
  51. MAP_XSIZE equ 128               ;Rezolution of map file
  52. MAP_YSIZE equ 128
  53.  
  54.     org    0x0
  55.     db     'MENUET01'              ; 8 ¡ ©â ¨­â¤¥ä¨ª â®à
  56.     dd     0x01                    ; ¢¥àá¨ï § £®«®¢ª 
  57.     dd     START                   ;  ¤à¥áá ­ ç «  ª®¤ 
  58.     dd     I_END                   ; à §¬¥à ¯à®£à ¬¬ë
  59.     dd     I_END+(SCREEN_X*SCREEN_Y*3+50000)   ; à §¬¥à ¯ ¬ï⨠¤«ï ¯à®££à ¬¬ë
  60.     dd     I_END+(SCREEN_X*SCREEN_Y*3+10000)   ; esp
  61.     dd     0x0 , 0x0               ; I_Param , I_Icon
  62.  
  63. include 'lang.inc'
  64. include 'ascgl.inc'
  65. include 'ascl.inc'
  66.  
  67. START:                          ; ­ ç «® ¯à¨«®¦¥­¨ï
  68. ; Draw window at first
  69.      call draw_window
  70.  
  71.      ; Decoding groud texture and ground level map
  72.      gif_hash_offset = gif_hash_area
  73.      ;texture's
  74.      giftoimg texpack_gif,texpack_img-8
  75.      ;ground level map
  76.      giftoimg gif_file_area5,glm_img_area
  77.  
  78. ;get 8bitmap from 256 colors bmp file
  79.      mov ebp,128;64
  80.      mov esi,0x043a+128*128-4;64*64-4
  81.      sub esi,128;64
  82.      mov edi,0
  83.      mov ecx,128;64
  84. texmap_unp:
  85.      mov al,[bmp_texmap+esi]
  86.      mov [img_area+edi],al
  87.      inc esi
  88.      inc edi
  89.      dec ecx
  90.      jnz texmap_unp
  91.      mov ecx,128;64
  92.      sub esi,256;128
  93.      dec ebp
  94.      jnz texmap_unp
  95.  
  96.  
  97. ;Unpack textures
  98.  
  99.      mov esi,texpack_img
  100.      mov edi,texture_img
  101.      mov edx,16
  102.      mov ecx,16
  103. tpuckloop:
  104.      pushad
  105.      call unpuck
  106.      popad
  107.      add esi,32*3
  108.      add edi,4095
  109.      dec ecx
  110.      jnz tpuckloop
  111.      add esi,31*32*16*3
  112.      mov ecx,16
  113.      dec edx
  114.      jnz tpuckloop
  115.  
  116. ;
  117. ; Unpuck one texture procendure
  118. ;
  119.      jmp skip_unpuck
  120. unpuck:
  121.      mov ecx,32
  122.      mov edx,32
  123. tunploop:
  124.      mov ax,[esi]
  125.      mov [edi],ax
  126.      mov al,[esi+2]
  127.      mov [edi+2],al
  128.      add esi,3
  129.      add edi,3
  130.      dec ecx
  131.      jnz tunploop
  132.      mov ecx,32
  133.      add esi,(32*16*3)-(32*3)
  134.      dec edx
  135.      jnz tunploop
  136.      ret
  137. skip_unpuck:
  138.  
  139.  
  140. ;calculating all mipmaps
  141.     mov esi,texture_img
  142.     mov ecx,256   ;quantity of textures
  143. mmaploop:
  144.     mov ebp,32    ;max mipmap texture
  145.     pusha
  146.     call texgen
  147.     popa
  148.     add esi,4095  ;next mipmap block
  149.     dec ecx
  150.     jnz mmaploop
  151.  
  152.     jmp skip_texgen
  153.  
  154. ;********************************
  155. ;   MIPMAP TEXTURE GENERATION
  156. ;
  157. ; in put:
  158. ;   esi - offset to texture
  159. ;   ebp - mipmap max size (32 for this sample)
  160. ;********************************
  161.  
  162. texgen:
  163.     push esi
  164.     mov eax,ebp
  165.     imul eax,ebp
  166.     imul eax,3
  167.     add eax,esi
  168.     mov edi,eax
  169.  
  170.     mov eax,ebp
  171.     shr eax,1
  172.     mov dh,al
  173.     mov dl,al
  174.     mov cl,dl
  175.  
  176.     mov ecx,ebp
  177.     mov eax,ebp
  178.     shl eax,1
  179.     add ecx,eax
  180.  
  181. miploop:
  182. ; Red
  183.     xor bx,bx  ;for add
  184.     xor ax,ax  ;for add
  185.     mov al,[esi+0]
  186.     add bx,ax
  187.     mov al,[esi+3+0]
  188.     add bx,ax
  189.     mov al,[esi+ecx+0]
  190.     add bx,ax
  191.     mov al,[esi+ecx+3+0]
  192.     add bx,ax
  193.     shr bx,2   ;/4
  194.     mov [edi+0],bl
  195. ;Green
  196.     xor bx,bx  ;for add
  197.     xor ax,ax  ;for add
  198.     mov al,[esi+1]
  199.     add bx,ax
  200.     mov al,[esi+3+1]
  201.     add bx,ax
  202.     mov al,[esi+ecx+1]
  203.     add bx,ax
  204.     mov al,[esi+ecx+3+1]
  205.     add bx,ax
  206.     shr bx,2   ;/4
  207.     mov [edi+1],bl
  208. ;Blue
  209.     xor bx,bx  ;for add
  210.     xor ax,ax  ;for add
  211.     mov al,[esi+2]
  212.     add bx,ax
  213.     mov al,[esi+3+2]
  214.     add bx,ax
  215.     mov al,[esi+ecx+2]
  216.     add bx,ax
  217.     mov al,[esi+ecx+3+2]
  218.     add bx,ax
  219.     shr bx,2   ;/4
  220.     mov [edi+2],bl
  221.  
  222.     add esi,6
  223.     add edi,3
  224.     dec dl
  225.     jnz miploop
  226.     mov ax,bp
  227.     shr ax,1
  228.     mov dl,al
  229.     add esi,ecx
  230.     dec dh
  231.     jnz miploop
  232.     pop esi
  233.  
  234.     mov eax,ebp
  235.     imul eax,ebp
  236.     imul eax,3
  237.     add esi,eax
  238.     shr ebp,1
  239.     cmp ebp,1
  240.     jne texgen
  241.     ret
  242. skip_texgen:
  243.  
  244.  
  245. ;Copy dynamic water texture
  246. ; ????????????
  247.     mov ecx,32*32*3
  248.     mov esi,texture_img+4095 ;32*32*3
  249.     mov edi,texture_limg
  250.     cld
  251.     rep movsb
  252.  
  253.         ; init sine wave for dynamic water texture
  254.     finit
  255.     mov edi,sinwave
  256.     mov ecx,32;256
  257.     isv_loop:
  258.     fld [angle]
  259.     fld st
  260.     fsin
  261.     fmul        [mul_wave]
  262.     fistp       word [edi]
  263.     fadd        [d_angle]
  264.     fstp        [angle]
  265.     add edi,2
  266.     dec ecx
  267.     jnz isv_loop
  268.  
  269.  
  270. ;Initalize keyboard
  271.     mov  eax,66
  272.     mov  ebx,1
  273.     mov  ecx,1
  274.     int  0x40
  275.  
  276.     mov  eax,26
  277.     mov  ebx,2
  278.     mov  ecx,1
  279.     mov  edx,keymap+100
  280.     int  0x40
  281.  
  282. ;Build triangle matrix
  283.     mov  esi,points
  284.     mov  eax,-(MATRIX_XSIZE/2)*SECTOR_SIZE
  285.     mov  ebx,-(MATRIX_YSIZE/2)*SECTOR_SIZE
  286.     mov  ebp,img_area+8
  287. loomat:
  288.     mov  [esi],eax        ;x-set
  289.     mov  [esi+4],ebx      ;y-set
  290.     mov  [esi+8],ecx      ;z-set
  291.     add  ebp,3
  292.     add  esi,4*3
  293.     add  eax,SECTOR_SIZE
  294.     cmp  eax,((MATRIX_YSIZE/2)+1)*SECTOR_SIZE
  295.     jnge loomat
  296.     mov  eax,-(MATRIX_YSIZE/2)*SECTOR_SIZE
  297.     add  ebx,SECTOR_SIZE
  298.     cmp  ebx,((MATRIX_XSIZE/2)+1)*SECTOR_SIZE
  299.     jnge loomat
  300.  
  301. ; Create z-ground good algorythm not already yet (64x64 map)
  302.     mov esi,glm_img_area+8
  303.     mov edi,ground_level_map
  304. loox:
  305. ; draw_courner_points
  306.     mov eax,[esi]
  307.     call get_z
  308. ;    mov [edi],eax
  309.  
  310.     mov eax,[esi+((MATRIX_XSIZE-1)*4)]
  311.     call get_z
  312. ;    mov [edi+((MATRIX_XSIZE)*4)],eax
  313.  
  314.     mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE-1)+1)*4)]
  315.     call get_z
  316. ;    mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE)-0)*4)],eax
  317.  
  318.     mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE)-1)*4)]
  319.     call get_z
  320. ;    mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)-1)*4)],eax
  321.  
  322.  
  323.     jmp skip_gz
  324. get_z:
  325.     xor ebx,ebx
  326.     xor ecx,ecx
  327.     mov bl,al
  328.     add ecx,ebx
  329.     mov bl,ah
  330.     add ecx,ebx
  331.     shr eax,16
  332.     mov bl,al
  333.     add ecx,ebx
  334.     mov eax,ecx
  335.     xor edx,edx
  336.     mov ebx,3
  337.     cdq
  338.     div ebx
  339.     neg eax
  340.     ret
  341. skip_gz:
  342.  
  343. ; z-ground livel facking method (65x65 map)
  344.     mov esi,glm_img_area+8
  345.     mov edi,ground_level_map
  346.     mov ebp,(MAP_XSIZE+1)*(MAP_YSIZE+1)
  347. looglm:
  348.     mov eax,[esi]
  349. ;    and eax,0x000000ff
  350.     call get_z
  351.     mov [edi],eax
  352.     add esi,3
  353.     add edi,1
  354.     dec ebp
  355.     jnz looglm
  356.  
  357. ;Fill model massive
  358.     mov ecx,[model_mas_start]
  359.     imul ecx,8
  360.     add ecx,4
  361.     mov esi,model_mas_start
  362.     mov edi,model_mas
  363.     cld
  364.     rep movsd
  365.  
  366.     jmp skip_moddata
  367. model_mas_start:
  368. dd 12               ;quantity of models
  369. dd 0,0,-150,0,0,0,0,bunker
  370. dd 60,-250,-190,0,0,64,0,tank
  371. dd 0,180,-150,0,0,0,0,cannon
  372. dd 0,480,-150,0,0,0,0,outpost
  373. dd 260,60,-150,0,0,0,0,bunker
  374. dd 60,260,-150,0,0,0,0,outpost
  375. dd 210,410,-150,0,0,0,0,cannon
  376. dd 160,260,-150,0,0,0,0,tree
  377. dd 100,-360,-150,0,0,192,0,gqfa
  378. dd 10,580,-150,0,0,0,0,repear
  379. dd 460,160,-100,0,0,0,0,red_flag
  380. dd 60,360,-170,0,0,40,0,cannon
  381. skip_moddata:
  382.  
  383.  
  384. ;Main loop
  385. still:                          ; ®á­®¢­®© 横«
  386.     mov  eax,11                 ; ¯à®¢¥àª  á®áâ®ï­¨ï ®ª­ 
  387.     int  0x40
  388.  
  389.     cmp  eax,1                  ; ®ª­® ᤢ¨­ã«¨ ¥£® ­ã¦­® ¯¥à¥à¨á®¢ âì
  390.     je   red
  391.     cmp  eax,2                  ; ­ ¦ â  ª« ¢¨è  ­  ª« ¢¨ âãà¥
  392.     je   key
  393.     cmp  eax,3                  ; ­ ¦ â  ª­®¯ª  ¢ ®ª­¥
  394.     je   button
  395.  
  396. ;    delay 10
  397. ;    cmp  [autorot],0  ;frize no fps show when autorot off
  398. ;    je   still
  399.  
  400. cycle:
  401.     call clrscr                 ; clear screen buffer
  402.     call clrzbuf                ; clear z-buffer
  403.     call render_scene           ; calculating scene
  404.     call dispimg                ; show buffer
  405.  
  406.     fps_show_frequency=0
  407.     fps 10,10,cl_White,cl_Black
  408.  
  409.  
  410. ;turn model on z-axis
  411.     inc dword [model_mas+4*6]
  412.     and dword [model_mas+4*6],011111111b
  413.  
  414.  
  415. ; Sin wave dynamic texture for water
  416. ; jmp ndt
  417.  xor edi,edi
  418.         mov     dx,32
  419.         mov     bp,word [sin_pos]
  420. dp_ver:
  421.         mov     cx,32 ;320
  422.         mov     si,word [sin_pos]
  423. dp_hor:
  424.  and ebp,0000ffffh
  425.         mov     ax,word [sinwave+ebp]
  426.         add     ax,cx
  427.         and     ax,31
  428.  
  429.  and esi,0000ffffh
  430.         mov     bx,word [sinwave+esi]
  431.         add     bx,dx
  432.         and     bx,31
  433.         shl     bx,5
  434.         add     bx,ax
  435.  
  436.  push bx
  437.  imul bx,3
  438.  and ebx,0000ffffh
  439.         mov     ax,[texture_limg+ebx]
  440.  mov [texture_img2+edi],ax
  441.         mov     al,[texture_limg+ebx+2]
  442.  mov [texture_img2+edi+2],al
  443.  pop bx
  444.  
  445.  add edi,3
  446.         add     si,2
  447.         and     si,63;511
  448.        
  449.         dec     cx
  450.         jnz     dp_hor
  451.         add     bp,2
  452.         and     bp,63;511
  453.         dec     dx
  454.         jnz     dp_ver
  455.  
  456. ; update sine position for next frame
  457.         add     word [sin_pos],2
  458.         and     word [sin_pos],63;511
  459.  
  460. ;Move water texture
  461.     jmp ndt
  462.     mov  esi,texture_limg
  463.     mov  ecx,32*32-1
  464. loodt:
  465.     mov  al,byte [esi]
  466.     mov  bl,byte [esi+1]
  467.     mov  dl,byte [esi+2]
  468.     mov  ah,byte [esi+3]
  469.     mov  bh,byte [esi+4]
  470.     mov  dh,byte [esi+5]
  471.     mov  byte [esi],ah
  472.     mov  byte [esi+1],bh
  473.     mov  byte [esi+2],dh
  474.     mov  byte [esi+3],al
  475.     mov  byte [esi+4],bl
  476.     mov  byte [esi+5],dl
  477.     add  esi,3
  478.     dec  ecx
  479.     jnz  loodt
  480. ndt:
  481.  
  482. ;Creat mipmap pack for dynamic texture
  483.     mov ebp,32
  484.     mov esi,texture_img+4095
  485.     call texgen
  486.  
  487.  
  488.     mov  eax,4                     ; function 4 : write text to window
  489.     mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
  490.     mov  ecx,0x0000ff00            ; font 1 & color ( 0xF0RRGGBB )
  491.     mov  edx,keymap                ; pointer to text beginning
  492.     mov  esi,100       ; text length
  493.     int  0x40
  494.     add  edx,100
  495.     add  ebx,10
  496.     mov  esi,60       ; text length
  497.     mov  ecx,0x00dddddd            ; font 1 & color ( 0xF0RRGGBB )
  498.     int  0x40
  499.     mov  edx,usemap
  500.     mov  esi,60       ; text length
  501.     mov  ecx,0x0000ff00
  502.     int  0x40
  503.     jmp rx
  504.           ;01234567890123456789012345678901234567890123456789
  505. usemap db ' E               wer  u   []  asd           zxc   '
  506.        db '                                                  '
  507. rx:
  508.  
  509.     cmp byte [keymap+1],0
  510.     je  n_esc
  511.     jmp exit
  512. n_esc:
  513.  
  514.     cmp byte [keymap+22],0
  515.     je  n_u
  516.     mov [Xangle],0
  517.     mov [Yangle],0
  518.     mov [Zangle],0
  519. n_u:
  520.  
  521. ; t,y - mipmap cntrol
  522.     cmp byte [keymap+20],0
  523.     je  n_t
  524.     inc [mipzoom]
  525. n_t:
  526.     cmp byte [keymap+21],0
  527.     je  n_y
  528.     dec [mipzoom]
  529. n_y:
  530.     cmp byte [keymap+23],0
  531.     je  n_i
  532.     mov byte [keymap+23],0 ; reset key
  533.     cmp [mipmapwork],1
  534.     je  i_1
  535. i_0:
  536.     mov [mipmapwork],1
  537.     jmp n_i
  538. i_1:
  539.     mov [mipmapwork],0
  540. n_i:
  541.  
  542.  
  543.     cmp byte [keymap+26],0
  544.     je  n_lsk
  545.     add [Xcam],1
  546. n_lsk:
  547.     cmp byte [keymap+27],0
  548.     je  n_rsk
  549.     sub [Xcam],1
  550. n_rsk:
  551.     cmp byte [keymap+18],0
  552.     je  n_e
  553.     add [Yangle],1
  554. n_e:
  555.     cmp byte [keymap+45],0
  556.     je  n_x
  557.     sub [Yangle],1
  558. n_x:
  559.     cmp byte [keymap+31],0
  560.     je  n_s
  561.     add [Xangle],1
  562. n_s:
  563.     cmp byte [keymap+32],0
  564.     je  n_d
  565.     sub [Xangle],1
  566. n_d:
  567.     cmp byte [keymap+44],0
  568.     je  n_z
  569.     add [Zangle],1
  570. n_z:
  571.     cmp byte [keymap+46],0
  572.     je  n_c
  573.     sub [Zangle],1
  574. n_c:
  575.     cmp byte [keymap+17],0
  576.     je  n_w
  577.     add [Zcam],25 ;250
  578. n_w:
  579.     cmp byte [keymap+19],0
  580.     je  n_r
  581.     sub [Zcam],25 ;250
  582. n_r:
  583.  
  584.     cmp byte [keymap+75],0
  585.     je  n_lk
  586.     add [Zcamangle],1
  587.     and [Zcamangle],011111111b
  588. n_lk:
  589.     cmp byte [keymap+77],0
  590.     je  n_rk
  591.     sub [Zcamangle],1
  592.     and [Zcamangle],011111111b
  593. n_rk:
  594.  
  595.     cmp byte [keymap+79],0
  596.     je  n_num1
  597.     add [Xcamangle],1
  598.     and [Xcamangle],011111111b
  599. n_num1:
  600.     cmp byte [keymap+81],0
  601.     je  n_num3
  602.     sub [Xcamangle],1
  603.     and [Xcamangle],011111111b
  604. n_num3:
  605.     cmp byte [keymap+71],0
  606.     je  n_num7
  607.     add [Ycamangle],1
  608.     and [Ycamangle],011111111b
  609. n_num7:
  610.     cmp byte [keymap+73],0
  611.     je  n_num9
  612.     sub [Ycamangle],1
  613.     and [Ycamangle],011111111b
  614. n_num9:
  615.  
  616.  
  617.  
  618.     cmp byte [keymap+30],0
  619.     je  n_a
  620.     mov byte [keymap+30],0 ; reset key
  621.     cmp [autorot],1
  622.     je  a_1
  623. a_0:
  624.     mov [autorot],1
  625.     jmp n_a
  626. a_1:
  627.     mov [autorot],0
  628. n_a:
  629.  
  630. ; for camera
  631. ;    mov     ebx,[Xcamangle]
  632. ;    call    GetSinCos
  633. ;    mov     [Xcamsin],eax
  634. ;    mov     [Xcamcos],ebx
  635.  
  636. ;    mov     ebx,[Ycamangle]
  637. ;    call    GetSinCos
  638. ;    mov     [Ycamsin],eax
  639. ;    mov     [Ycamcos],ebx
  640.  
  641.     mov     ebx,[Zcamangle]
  642.     call    GetSinCos
  643.     mov     [Zcamsin],eax
  644.     mov     [Zcamcos],ebx
  645.  
  646.     mov eax,[Zcamsin]
  647.     mov ebx,[Zcamcos]
  648. ;    mov ecx,[Xcamsin]
  649. ;    mov edx,[Xcamcos]
  650. ;    mov esi,[Ycamsin]
  651. ;    mov edi,[Ycamcos]
  652.  
  653.     sar eax,4
  654.     sar ebx,4
  655. ;    sar ecx,4
  656. ;    sar edx,4
  657. ;    sar esi,4
  658. ;    sar edi,4
  659.  
  660.     cmp byte [keymap+72],0
  661.     je  n_uk
  662.     sub [Xcam],eax
  663.     sub [Ycam],ebx
  664.  
  665. ;    sub [Zcam],ecx
  666. ;    sub [Ycam],edx
  667.  
  668. ;    sub [Xcam],esi
  669. ;    add [Zcam],edi
  670.  
  671. n_uk:
  672.     cmp byte [keymap+80],0
  673.     je  n_dk
  674.     add [Xcam],eax
  675.     add [Ycam],ebx
  676.  
  677. ;    add [Zcam],ecx
  678. ;    add [Ycam],edx
  679.  
  680. ;    add [Xcam],esi
  681. ;    sub [Zcam],edi
  682.  
  683. n_dk:
  684.  
  685.     xor ebp,ebp
  686. move_test:
  687.     cmp [Xcam],-SECTOR_SIZE/2
  688.     jnl ok1
  689.     add [Xcam],SECTOR_SIZE
  690.     dec [Xmap]
  691.     jmp move_test
  692. ok1:
  693.     cmp [Xcam],SECTOR_SIZE/2
  694.     jng ok2
  695.     sub [Xcam],SECTOR_SIZE
  696.     inc [Xmap]
  697.     jmp ok1
  698. ok2:
  699.     cmp [Ycam],-SECTOR_SIZE/2
  700.     jnl ok3
  701.     add [Ycam],SECTOR_SIZE
  702.     dec [Ymap]
  703.     jmp ok2
  704. ok3:
  705.     cmp [Ycam],SECTOR_SIZE/2
  706.     jng ok4
  707.     sub [Ycam],SECTOR_SIZE
  708.     inc [Ymap]
  709.     jmp ok3
  710. ok4:
  711.  
  712.     and [Xangle],011111111b
  713.     and [Yangle],011111111b
  714.     and [Zangle],011111111b
  715.  
  716.     jmp still
  717.  
  718.   red:                          ; redraw
  719.     call draw_window
  720.     jmp  still
  721.  
  722.   key:                          ; key
  723.     mov  eax,2                  ; just read it and ignore
  724.     int  0x40
  725.  
  726.     shr eax,8
  727.     and eax,0xff
  728.     mov ah,al
  729.  
  730.     mov ebx,0
  731.     mov bl,ah
  732.     cmp bl,224
  733.     je  noisa  ; ignore Ext code
  734.     cmp bl,170
  735.     je  noisa  ; ignore Key Up code
  736.     cmp bl,128
  737.     ja  isa
  738.     mov [keymap+ebx],byte 'X'  ; set press marker to key id
  739.     jmp noisa
  740. isa:
  741.     sub bl,128
  742.     mov [keymap+ebx],byte 0    ; reset key marker
  743. noisa:
  744.     jmp n_a
  745.  
  746.     jmp still ; cycle
  747.  
  748.   button:                       ; button
  749.     mov  eax,17                 ; get id
  750.     int  0x40
  751.     cmp ah,1
  752.     jz exit
  753.     jmp  cycle
  754.  
  755. exit:
  756.     mov eax,-1
  757.     int 0x40
  758.  
  759. ;   *********************************************
  760. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  761. ;   *********************************************
  762.  
  763. draw_window:
  764.     mov  eax,12                    ; function 12:tell os about windowdraw
  765.     mov  ebx,1                     ; 1, start of draw
  766.     int  0x40
  767.                                    ; DRAW WINDOW
  768.     mov  eax,0                     ; function 0 : define and draw window
  769.     mov  ebx,0*65536+SCREEN_X-1         ; [x start] *65536 + [x size]
  770.     mov  ecx,0*65536+SCREEN_Y-1         ; [y start] *65536 + [y size]
  771.     mov  edx,0x03ffffff            ; color of work area RRGGBB,8->color gl
  772.     mov  esi,0x005080d0            ; color of grab bar  RRGGBB,8->color gl
  773.     mov  edi,0x005080d0            ; color of frames    RRGGBB
  774.     int  0x40
  775.                                    ; WINDOW LABEL
  776.     mov  eax,4                     ; function 4 : write text to window
  777.     mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
  778.     mov  ecx,0x10ddeeff            ; font 1 & color ( 0xF0RRGGBB )
  779.     mov  edx,labelt                ; pointer to text beginning
  780.     mov  esi,labellen-labelt       ; text length
  781.     int  0x40
  782.  
  783.     mov eax,12
  784.     mov ebx,2
  785.     int 0x40
  786.     ret
  787.  
  788. dispimg:
  789.     mov eax,7
  790.     mov ebx,I_END ;zbuffer
  791.     mov ecx,SCREEN_X*65536+SCREEN_Y
  792.     xor edx,edx  ;0*65536+0
  793.     int 0x40
  794. ;    ret
  795.  
  796.     mov eax,8
  797.     mov ebx,(SCREEN_X-30)*65536+20
  798.     mov ecx,10*65536+20
  799.     mov edx,1
  800.     mov esi,0x0000aa00
  801.     int 0x40
  802.     ret
  803.  
  804. clrscr:                         ; clear screen buffer
  805. ;    cld
  806. ;    mov edi,I_END
  807. ;    xor eax,eax
  808. ;    mov ecx,SCREEN_X*SCREEN_Y*3/4
  809. ;    rep stosd
  810. ;    ret
  811.  
  812. ; clear screen buffer with MMX technology +1,5 fps
  813.     mov edi,I_END
  814.     mov ecx,SCREEN_X*SCREEN_Y*3/32
  815.     xor eax,eax
  816.     movd mm0,eax
  817.     movd mm1,eax
  818.     movd mm2,eax
  819.     movd mm3,eax
  820. csloo:
  821.     movq qword [edi],mm0
  822.     movq qword [edi+8],mm1
  823.     movq qword [edi+16],mm2
  824.     movq qword [edi+24],mm3
  825.     add edi,32
  826.     dec ecx
  827.     jnz csloo
  828.     ret
  829.  
  830. clrzbuf:                         ; clear zbuf
  831.     cld
  832.     mov edi,zbuffer
  833.     mov eax,-1
  834.     mov ecx,SCREEN_X*SCREEN_Y*3/4
  835.     rep stosd
  836.     ret
  837.  
  838.  
  839. ;    mov [@@atx1],dword 0xffffffff
  840. ;    mov [@@aty1],dword 0xffffffff
  841. ;    movq mm0,qword [@@atx1]
  842. ;    movq mm1,qword [@@atx1]
  843. ;    movq mm2,qword [@@atx1]
  844. ;    movq mm3,qword [@@atx1]
  845. ;czbloo:
  846. ;    movq qword [edi],mm0
  847. ;    movq qword [edi+8],mm1
  848. ;    movq qword [edi+16],mm2
  849. ;    movq qword [edi+24],mm3
  850. ;    add edi,32
  851. ;    dec ecx
  852. ;    jnz czbloo
  853.     ret
  854.  
  855. @@atx1: dd 0
  856. @@aty1: dd 0
  857.  
  858. ;===========================================================================
  859. ;
  860. ;   3D-system example. Use the following formulas to rotate a point:
  861. ;
  862. ;        Rotate around x-axis
  863. ;        Y = Y * COS(xang) - Z * SIN(xang) / 256
  864. ;        Z = Y * SIN(xang) + Z * COS(xang) / 256
  865. ;
  866. ;        Rotate around y-axis
  867. ;        X = X * COS(yang) - Z * SIN(yang) / 256
  868. ;        Z = X * SIN(yang) + Z * COS(yang) / 256
  869. ;
  870. ;        Rotate around z-axis
  871. ;        X = X * COS(zang) - Y * SIN(zang) / 256
  872. ;        Y = X * SIN(zang) + Y * COS(zang) / 256
  873. ;
  874. ;   Divide by 256 coz we have multiplyd our sin values with 256 too.
  875. ;   This example isn't too fast right now but it'll work just fine.
  876. ;
  877. ;===========================================================================
  878.  
  879. ;***************************************************************************
  880. ;                      \\\   MAIN 3D LOOP   ///
  881. ;                         ******************
  882. render_scene:
  883.  
  884. ;********************
  885. ; Turn matrix points
  886. ;********************
  887.  
  888.     cmp   [autorot],0
  889.     je    no_autorot
  890.     call  UpdateAngles        ; Calculate new angles
  891. no_autorot:
  892.     call  SetRotation         ; Find sine & cosine of those angles
  893.  
  894.     mov  edi,tpoints
  895.     mov  esi,points
  896.     mov [mapoff],-1      ;-1 at start
  897.     mov ebp,[Ymap]
  898.     imul ebp,MAP_XSIZE+1
  899.     mov eax,[Xmap]
  900.     add ebp,eax
  901.  
  902.     mov  ecx,(MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)
  903. ShowLoop:
  904.     push ecx
  905.     push esi
  906.     mov  eax,[esi]
  907.     sub  eax,[Xcam]
  908.     mov  [X],eax
  909.     mov  eax,[esi+4]
  910.     sub  eax,[Ycam]
  911.     mov  [Y],eax
  912.     mov  eax,[ebp+ground_level_map]    ;color
  913.     and  eax,0x000000ff
  914.     sub  eax,[Zcam]
  915.     mov  [Z],eax
  916.     push ebp
  917.     push edi
  918.     call TranslatePoint         ; Rotates the point using above formulas
  919.     pop  edi
  920.     mov  [edi],ebp    ;x
  921.     mov  [edi+4],eax  ;y
  922.     mov  eax,[Z]      ;z
  923.     add  eax,[Zoff]
  924.     mov  [edi+8],eax
  925.     pop  ebp
  926.     pop  esi
  927.     pop  ecx
  928.  
  929.     add  esi,4*3 ;next in point
  930.     add  edi,4*3 ;next out point
  931.  
  932.     inc [mapoff]
  933.     cmp [mapoff],MATRIX_XSIZE+1
  934.     jne no_shift_glm
  935.     mov [mapoff],dword 0
  936.     add ebp,(MAP_XSIZE-MATRIX_XSIZE)
  937. no_shift_glm:
  938.     add ebp,1
  939.  
  940.     dec  ecx
  941.     jnz  ShowLoop
  942.  
  943.  
  944. ; Show, how many polygons on screen.
  945.     outcount [massize],50,10,cl_White,8*65536
  946.  
  947.  
  948. ;*****************
  949. ;  out triangles
  950. ;*****************
  951.  
  952.     mov [mapoff],-1      ;-1 at start
  953.     mov [massize],0      ;restet triangle massive counter
  954.  
  955.     mov ebp,[Ymap]
  956.     imul ebp,MAP_XSIZE;64;3*64  ;MAP_XSIZE
  957.     mov eax,[Xmap]
  958.     add ebp,eax
  959.  
  960.     mov edi,tpoints
  961.     mov ecx,MATRIX_YSIZE ;64
  962. lootpy:
  963.     push ecx
  964.     mov ecx,MATRIX_XSIZE ;64
  965. lootpx:
  966. ;draw four angle (two triangles)
  967.  
  968. Z_MAX = 10    ;maximal z range for triangles
  969.  
  970. ; get texture offset at start
  971.     inc [mapoff]
  972.     cmp [mapoff],MATRIX_XSIZE
  973.     jne no_shift
  974.     mov [mapoff],dword 0
  975.     add ebp,(MAP_XSIZE-MATRIX_XSIZE)
  976. no_shift:
  977.     xor eax,eax
  978.     mov al,[ebp+img_area];+8]
  979.     inc ebp
  980.     imul eax,4095;32*32*3
  981.     add eax,texture_img
  982.     mov ebx,eax
  983.  
  984. ;first triangle
  985.     mov eax,[edi+8]          ;z1
  986.     cmp eax,Z_MAX
  987.     jl  no_add1
  988.     mov [@@tz1],eax
  989.     mov eax,[edi+8+12]   ;z2
  990.     cmp eax,Z_MAX
  991.     jl  no_add1
  992.     mov [@@tz2],eax
  993.     mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))]   ;z3
  994.     cmp eax,Z_MAX
  995.     jl  no_add1
  996.     mov [@@tz3],eax
  997.  
  998.     cmp dword [edi],SCREEN_X
  999.     ja  p11
  1000.     cmp dword [edi+4],SCREEN_Y
  1001.     jna yes_add1
  1002. p11:
  1003.     cmp dword [edi+12],SCREEN_X
  1004.     ja  p12
  1005.     cmp dword [edi+4+12],SCREEN_Y
  1006.     jna yes_add1
  1007. p12:
  1008.     cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X
  1009.     ja  p13
  1010.     cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y
  1011.     jna yes_add1
  1012. p13:
  1013.     jmp no_add1
  1014. yes_add1:
  1015.  
  1016.     movq mm0,qword [edi]        ;x1
  1017.     movq mm1,qword [edi+12]     ;x2
  1018.     movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))]     ;x3
  1019.     movq qword [@@tx1],mm0
  1020.     movq qword [@@tx2],mm1
  1021.     movq qword [@@tx3],mm2
  1022.  
  1023.     mov eax,ebx;+1 shl 31;[ebp]
  1024.     mov [@@tex_off],eax ;0x0000ff00
  1025.     inc [massize]
  1026.     pushad
  1027.     mov [@@tex_x1],0
  1028.     mov [@@tex_y1],0
  1029.     mov [@@tex_x3],(32 shl 16) -1;128
  1030.     mov [@@tex_y3],(32 shl 16) -1;128
  1031.     mov [@@tex_x2],0
  1032.     mov [@@tex_y2],(32 shl 16) -1;128
  1033.     call textured_triangle
  1034.     popad
  1035.  
  1036. no_add1:
  1037.  
  1038.  
  1039.  
  1040. ;second triangle
  1041.     mov eax,[edi+8]          ;z1
  1042.     cmp eax,Z_MAX
  1043.     jl  no_add2
  1044.     mov [@@tz1],eax
  1045.     mov eax,[edi+8+(4*3*(MATRIX_XSIZE+1))]   ;z2
  1046.     cmp eax,Z_MAX
  1047.     jl  no_add2
  1048.     mov [@@tz2],eax
  1049.     mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))]   ;z3
  1050.     cmp eax,Z_MAX
  1051.     jl  no_add2
  1052.     mov [@@tz3],eax
  1053.  
  1054.     cmp dword [edi],SCREEN_X
  1055.     ja  p21
  1056.     cmp dword [edi+4],SCREEN_Y
  1057.     jna yes_add2
  1058. p21:
  1059.     cmp dword [edi+(4*3*(MATRIX_XSIZE+1))],SCREEN_X
  1060.     ja  p22
  1061.     cmp dword [edi+4+(4*3*(MATRIX_XSIZE+1))],SCREEN_Y
  1062.     jna yes_add2
  1063. p22:
  1064.     cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X
  1065.     ja  p23
  1066.     cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y
  1067.     jna yes_add2
  1068. p23:
  1069.     jmp no_add2
  1070. yes_add2:
  1071.  
  1072.     movq mm0,qword [edi]            ;x1
  1073.     movq mm1,qword [edi+(4*3*(MATRIX_XSIZE+1))]     ;x2
  1074.     movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))]     ;x3
  1075.     movq qword [@@tx1],mm0
  1076.     movq qword [@@tx2],mm1
  1077.     movq qword [@@tx3],mm2
  1078.  
  1079.  
  1080.     mov eax,ebx
  1081.     mov [@@tex_off],eax ;0x0000ff00
  1082.     inc [massize]
  1083. ;    add esi,4*10
  1084.  
  1085.     pushad
  1086.     mov [@@tex_x1],0
  1087.     mov [@@tex_y1],0
  1088.     mov [@@tex_x3],(32 shl 16) -1;128
  1089.     mov [@@tex_y3],(32 shl 16) -1;128
  1090.     mov [@@tex_x2],(32 shl 16) -1
  1091.     mov [@@tex_y2],0
  1092.     call textured_triangle
  1093.     popad
  1094.  
  1095.  
  1096. no_add2:
  1097.  
  1098.     add edi,4*3     ;next triangle
  1099.     dec ecx
  1100.     jnz lootpx
  1101.     add edi,4*3     ;next string
  1102.     pop ecx
  1103.     dec ecx
  1104.     jnz lootpy
  1105.  
  1106. ;**********************************
  1107. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1108. ;**********************************
  1109. ; For good models quality -5% speed
  1110. ;    call clrzbuf
  1111.  
  1112.     jmp skip_modmas
  1113. mmcnt       dd 0 ;counter of model read number
  1114. modeloff    dd 0 ;offset of model structure
  1115. modelmoff   dd 0 ;offset in model mas
  1116. modeltmpoff dd 0 ;tmpoints offset
  1117. ; massive of models
  1118. ; format: X,Y,Z coordoinats,offset to model structure
  1119.  
  1120. skip_modmas:
  1121.  
  1122. ; Rendering models on map
  1123.  
  1124.     mov  eax,[model_mas]
  1125.     mov  [mmcnt],eax
  1126.  
  1127. ModelRenderLoop:
  1128.  
  1129.     mov  ebx,[mmcnt]
  1130.     dec  ebx
  1131.     imul ebx,4*8
  1132.     add  ebx,model_mas+4
  1133.     mov  ebp,ebx   ;edi=model offset X,Y,Z,Xturn,Yturn,Zturn,zero,modeloff
  1134.  
  1135.     mov     ebx,[ebp+4*3];[Xangle]         ; Grab angle
  1136.     call    GetSinCos           ; Get the sine&cosine
  1137.     mov     [Xsin],eax           ; Save sin
  1138.     mov     [Xcos],ebx           ; Save cos
  1139.     mov     ebx,[ebp+4*4];[Yangle]
  1140.     call    GetSinCos
  1141.     mov     [Ysin],eax
  1142.     mov     [Ycos],ebx
  1143.     mov     ebx,[ebp+4*5];[Zangle]
  1144.     call    GetSinCos
  1145.     mov     [Zsin],eax
  1146.     mov     [Zcos],ebx
  1147.  
  1148.     mov  ebx,[mmcnt]
  1149.     imul ebx,4*8
  1150.     add  ebx,model_mas+4-4
  1151.     mov  eax,[ebx]
  1152.  
  1153.     mov  [modeloff],eax
  1154.     sub  ebx,4*7;3
  1155.     mov  [modelmoff],ebx
  1156.  
  1157.     mov edi,modelpoints
  1158.     mov  esi,eax ;bunker+8
  1159.     add  esi,8
  1160.     mov  ecx,[eax] ;[bunker] ;MODEL_POINTS
  1161.  
  1162. TurnModelLoop:
  1163.     push ecx
  1164.     push esi
  1165.     mov  eax,[esi]
  1166.     mov  [X],eax
  1167.     mov  eax,[esi+4]
  1168.     mov  [Y],eax
  1169.     mov  eax,[esi+8]
  1170.     mov  [Z],eax
  1171.     push ebp
  1172.     push edi
  1173.  
  1174. ;RotatePoint
  1175.  
  1176.     mov esi,[Y]
  1177.     mov ebx,[Xcos]
  1178.     mov edi,[Z]
  1179.     mov ecx,[Xsin]
  1180.     call math
  1181.     mov [Y],esi
  1182.     mov [Z],edi
  1183.     mov esi,[X]
  1184.     mov ebx,[Ycos]
  1185.     mov ecx,[Ysin]
  1186.     call math
  1187.     mov [X],esi
  1188.     mov [Z],edi
  1189.     mov ebx,[Zcos]
  1190.     mov edi,[Y]
  1191.     mov ecx,[Zsin]
  1192.     call math
  1193.     mov [X],esi
  1194.     mov [Y],edi
  1195.  
  1196.     pop  edi
  1197.  
  1198.     mov  eax,[X]
  1199.     mov  [edi],eax
  1200.     mov  eax,[Y]
  1201.     mov  [edi+4],eax
  1202.  
  1203.     mov  eax,[Z]      ;z
  1204. ;    add  eax,[Zoff]
  1205.     mov  [edi+8],eax
  1206.     pop  ebp
  1207.     pop  esi
  1208.     pop  ecx
  1209.  
  1210.     add  esi,4*3 ;next in point
  1211.     add  edi,4*3 ;next out point
  1212.  
  1213.     dec  ecx
  1214.     jnz  TurnModelLoop
  1215.  
  1216. modxxx:
  1217.  
  1218.  
  1219. ;Turn model off map
  1220.  
  1221.     call SetRotation
  1222.  
  1223.     mov  ebx,[mmcnt]
  1224.     imul ebx,4*8
  1225.     add  ebx,model_mas+4-4
  1226.     mov  eax,[ebx]
  1227.  
  1228.     mov  [modeloff],eax
  1229.     sub  ebx,4*7;3
  1230.     mov  [modelmoff],ebx
  1231.  
  1232.     mov edi,modelpoints
  1233.     mov  ecx,[eax] ;[bunker] ;MODEL_POINTS
  1234.  
  1235. ShowModelLoop:
  1236.     push ecx
  1237.     mov  eax,[edi] ;esi]
  1238.  
  1239.     mov  ebx,[modelmoff]
  1240.     sub  eax,[ebx] ;[Xmod]
  1241.  
  1242.     sub  eax,[Xcam]
  1243.     mov  ebx,[Xmap]
  1244.     imul ebx,SECTOR_SIZE
  1245.     sub  eax,ebx
  1246.     mov  [X],eax
  1247.     mov  eax,[edi+4] ;esi+4]
  1248.  
  1249.     mov  ebx,[modelmoff]
  1250.     sub  eax,[ebx+4] ;[Ymod]
  1251.  
  1252.     sub  eax,[Ycam]
  1253.     mov  ebx,[Ymap]
  1254.     imul ebx,SECTOR_SIZE
  1255.     sub  eax,ebx
  1256.     mov  [Y],eax
  1257.     mov  eax,[edi+8];esi+8]
  1258.  
  1259.     mov  ebx,[modelmoff]
  1260.     sub  eax,[ebx+8] ;[Zmod]
  1261.  
  1262.     sub  eax,[Zcam]
  1263.     mov  [Z],eax
  1264.     push ebp
  1265.     push edi
  1266.     call TranslatePoint         ; Rotates the point using above formulas
  1267.     pop  edi
  1268.     mov  [edi],ebp    ;x
  1269.     mov  [edi+4],eax  ;y
  1270.     mov  eax,[Z]      ;z
  1271.     add  eax,[Zoff]
  1272.     mov  [edi+8],eax
  1273.     pop  ebp
  1274.     pop  ecx
  1275.  
  1276.     add  edi,4*3 ;next out point
  1277.  
  1278.     dec  ecx
  1279.     jnz  ShowModelLoop
  1280.  
  1281.  
  1282. ;    add [model_mas+8],dword 3
  1283.  
  1284.  
  1285.  
  1286.     mov esi,[massize]
  1287.     imul esi,4*10
  1288.  
  1289.     mov eax,[modeloff]
  1290.     mov ecx,[eax+4] ;MODEL_TRIANGELS
  1291.  
  1292. ;calc tmpoints offset
  1293.     mov edi,modelpoints
  1294.     mov [modeltmpoff],edi
  1295.  
  1296. ;calc postlink offset
  1297.     mov edi,[eax]
  1298.     imul edi,3*4;*2  ;X,Y,Z (3) points dd format (4) 2 masives (2)
  1299.     add edi,eax
  1300.     add edi,8       ;skip dd points, dd triangels
  1301. msloo:
  1302.  
  1303.     mov ebx,[edi]
  1304.     imul ebx,4*3
  1305.     add ebx,[modeltmpoff] ;tmpoints
  1306.     mov eax,[ebx]
  1307.     mov [@@tx1],eax
  1308.     mov eax,[ebx+4]
  1309.     mov [@@ty1],eax
  1310.     mov eax,[ebx+8]
  1311.     mov [@@tz1],eax
  1312.  
  1313.     mov ebx,[edi+4]
  1314.     imul ebx,4*3
  1315.     add ebx,[modeltmpoff] ;tmpoints
  1316.     mov eax,[ebx]
  1317.     mov [@@tx2],eax
  1318.     mov eax,[ebx+4]
  1319.     mov [@@ty2],eax
  1320.     mov eax,[ebx+8]
  1321.     mov [@@tz2],eax
  1322.  
  1323.     mov ebx,[edi+8]
  1324.     imul ebx,4*3
  1325.     add ebx,[modeltmpoff] ;tmpoints
  1326.     mov eax,[ebx]
  1327.     mov [@@tx3],eax
  1328.     mov eax,[ebx+4]
  1329.     mov [@@ty3],eax
  1330.     mov eax,[ebx+8]
  1331.     mov [@@tz3],eax
  1332.  
  1333.  
  1334.     cmp dword [@@tz1],Z_MAX
  1335.     jl  no_add
  1336.     cmp dword [@@tz2],Z_MAX
  1337.     jl  no_add
  1338.     cmp dword [@@tz3],Z_MAX
  1339.     jl  no_add
  1340.     cmp dword [@@tx1],SCREEN_X
  1341.     ja  pm1
  1342.     cmp dword [@@ty1],SCREEN_Y
  1343.     jna yes_madd
  1344. pm1:
  1345.     cmp dword [@@tx2],SCREEN_X
  1346.     ja  pm2
  1347.     cmp dword [@@ty2],SCREEN_Y
  1348.     jna yes_madd
  1349. pm2:
  1350.     cmp dword [@@tx3],SCREEN_X
  1351.     ja  pm3
  1352.     cmp dword [@@ty3],SCREEN_Y
  1353.     jna yes_madd
  1354. pm3:
  1355.     jmp no_add
  1356. yes_madd:
  1357.  
  1358.  
  1359.  
  1360.  
  1361.     mov ebx,[edi+12]
  1362.     dec ebx
  1363.     js  ttex
  1364.     mov eax,1 shl 31
  1365.     jmp posit
  1366. ttex:
  1367.     add ebx,2
  1368.     mov eax,0
  1369.     neg ebx
  1370. posit:
  1371.     imul ebx,4095;32*32*3
  1372.     add ebx,texture_img
  1373.     mov [@@tex_off],ebx
  1374.  
  1375.     pushad
  1376.     mov [@@tex_x1],0
  1377.     mov [@@tex_y1],0
  1378.     mov [@@tex_x3],(32 shl 16) -1;128
  1379.     mov [@@tex_y3],(32 shl 16) -1;128
  1380.     cmp eax,0
  1381.     je  nez
  1382.     mov [@@tex_x2],0
  1383.     mov [@@tex_y2],(32 shl 16) -1
  1384.     jmp isz
  1385. nez:
  1386.     mov [@@tex_x2],(32 shl 16) -1
  1387.     mov [@@tex_y2],0
  1388. isz:
  1389.     call textured_triangle
  1390.     popad
  1391.  
  1392. ;    mov [esi+8+24+4],eax
  1393. ;    add esi,4*10
  1394.     inc [massize]
  1395. no_add:
  1396.     add edi,4*4; *9
  1397.     dec ecx
  1398.     jnz msloo
  1399.  
  1400.     dec [mmcnt]
  1401.     jnz ModelRenderLoop
  1402.  
  1403.  
  1404.     jmp skip_mdata
  1405.  
  1406. bunker:
  1407. dd 8      ;model points
  1408. dd 10     ;model triagels
  1409. ;mpoints:
  1410. dd -105,-105,0, -105,105,0, 105,105,0,  105,-105,0
  1411. dd -70,-70,-50, -70,70,-50, 70,70,-50,  70,-70,-50
  1412.  
  1413. ;  4-------7 Points structure
  1414. ;  |\0---3/|
  1415. ;  | |   | |
  1416. ;  | |   | |
  1417. ;  |/1---2\|
  1418. ;  5-------6
  1419.  
  1420. ;pointslink:
  1421. ;dd   0,1,2, -3,  0,3,2, 3  ;far side
  1422. dd   4,0,1, -5,  4,5,1, 5   ;left side
  1423. dd   6,2,3, -5,  6,7,3, 5   ;right side
  1424. dd   4,0,3, -5,  4,7,3, 5   ;up side
  1425. dd   5,1,2, -5,  5,6,2, 5   ;down side
  1426. dd   4,5,6, -6,  4,7,6, 6   ;far side
  1427.  
  1428. ;model 2 outpost
  1429. outpost:
  1430. dd 8      ;model points
  1431. dd 10     ;model triagels
  1432. ;mpoints:
  1433. dd -45,-45,0,   -45,45,0,   45,45,0,   45,-45,0
  1434. dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20
  1435. ;pointslink:
  1436. ;dd   0,1,2, -3,  0,3,2, 3  ;far side
  1437. dd   4,0,1, -8,  4,5,1, 8   ;left  side
  1438. dd   6,2,3, -8,  6,7,3, 8   ;right side
  1439. dd   4,0,3, -8,  4,7,3, 8   ;up side
  1440. dd   5,1,2, -8,  5,6,2, 8   ;down side
  1441. dd   4,5,6, -7,  4,7,6, 7   ;near side
  1442.  
  1443. ;model 3 cannon
  1444. cannon:
  1445. dd 12      ;model points
  1446. dd 12     ;model triagels
  1447. ;mpoints:
  1448. dd -10,-20,0,   -10,20,0,   10,20,0,   10,-20,0
  1449. dd -10,-10,-15, -10,10,-15, 10,10,-15, 10,-10,-15
  1450. dd -2,15,-8,    2,15,-8,    -2,45,-8,  2,45,-8
  1451. ;pointslink:
  1452. ;dd   0,1,2, -3,  0,3,2, 3  ;far side
  1453. dd   4,0,1, -10,  4,5,1, 10   ;left  side
  1454. dd   6,2,3, -10,  6,7,3, 10   ;right side
  1455. dd   4,0,3, -10,  4,7,3, 10   ;up side
  1456. dd   5,1,2, -10,  5,6,2, 10   ;down side
  1457. dd   4,5,6, -11,  4,7,6, 11   ;near side
  1458. dd   8,9,10,-10,  9,10,11,10  ;cannon 1
  1459.  
  1460. ;model 4 red flag
  1461. red_flag:
  1462. dd 12      ;model points
  1463. dd 6*2     ;model triagels
  1464. ;mpoints:
  1465. dd -1,-1,0,   -1,1,0,    1,1,0,    1,-1,0
  1466. dd -1,-1,-30, -1,1,-30,  1,1,-30,  1,-1,-30
  1467. dd 1,1,-30,  10,1,-30,  10,1,-20, 1,1,-20
  1468. ;pointslink:
  1469. dd   4,0,1, -10,  4,5,1, 15   ;left  side
  1470. dd   6,2,3, -10,  6,7,3, 15   ;right side
  1471. dd   4,0,3, -10,  4,7,3, 15   ;up side
  1472. dd   5,1,2, -10,  5,6,2, 15   ;down side
  1473. dd   4,5,6, -10,  4,7,6, 15   ;near side
  1474. dd   8,11,10,-49, 8,9,10,49   ;flag
  1475.  
  1476. repear:
  1477. dd 8      ;model points
  1478. dd 10     ;model triagels
  1479. ;mpoints:
  1480. dd -45,-45,0,   -45,45,0,   45,45,0,   45,-45,0
  1481. dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20
  1482. ;pointslink:
  1483. dd   4,0,1, -5,  4,5,1, 5   ;left side
  1484. dd   6,2,3, -5,  6,7,3, 5   ;right side
  1485. dd   4,0,3, -5,  4,7,3, 5   ;up side
  1486. dd   5,1,2, -5,  5,6,2, 5   ;down side
  1487. dd   4,5,6, -3,  4,7,6, 3   ;far side
  1488.  
  1489. ;model 5 tree (elka)
  1490. tree:
  1491. dd 16      ;model points
  1492. dd 8*2     ;model triagels
  1493. ;mpoints:
  1494. dd -2,-2,0,   -2,2,0,    2,2,0,    2,-2,0
  1495. dd -1,-1,-8, -1,1,-8,  1,1,-8,  1,-1,-8
  1496. dd -10,-10,-8,  -10,10,-8,   10,10,-8,   10,-10,-8
  1497. dd -1,-1,-40, -1,1,-40,  1,1,-40,  1,-1,-40
  1498. ;pointslink:
  1499. dd   4,0,1, -16,  4,5,1, 16   ;left  side
  1500. dd   6,2,3, -16,  6,7,3, 16   ;right side
  1501. dd   4,0,3, -16,  4,7,3, 16   ;up side
  1502. dd   5,1,2, -16,  5,6,2, 16   ;down side
  1503.  
  1504. dd   12,8,9, -14,  12,13,9, 14   ;left  side
  1505. dd   14,10,11, -14,  14,15,11, 14   ;right side
  1506. dd   12,8,11, -14,  12,15,11, 14   ;up side
  1507. dd   13,9,10, -14,  13,14,10, 14   ;down side
  1508.  
  1509. ;model tank
  1510. tank:
  1511. dd 20      ;model points
  1512. dd 12+10     ;model triagels
  1513. ;mpoints:
  1514. dd -10,-20,-10, -10,20,-10,   10,20,-10,  10,-20,-10
  1515. dd -10,-10,-20, -10,10,-20,   10,10,-20,  10,-10,-20
  1516. dd -2,15,-15,    2,15,-15,    -2,45,-15,   2,45,-15
  1517.  
  1518. dd -20,-20,0,   -20,20,0,   20,20,0,   20,-20,0
  1519. dd -20,-30,-10, -20,30,-10, 20,30,-10, 20,-30,-10
  1520.  
  1521. ;pointslink:
  1522. ;dd   0,1,2, -3,  0,3,2, 3  ;far side
  1523. dd   4,0,1, -10,  4,5,1, 10   ;left  side
  1524. dd   6,2,3, -10,  6,7,3, 10   ;right side
  1525. dd   4,0,3, -10,  4,7,3, 10   ;up side
  1526. dd   5,1,2, -10,  5,6,2, 10   ;down side
  1527. dd   4,5,6, -11,  4,7,6, 11   ;near side
  1528. dd   8,9,10,-10,  9,10,11,10  ;cannon 1
  1529.  
  1530. dd   16,12,13, -11,  16,17,13, 11   ;left  side
  1531. dd   18,14,15, -11,  18,19,15, 11   ;right side
  1532. dd   16,12,15, -11,  16,19,15, 11   ;up side
  1533. dd   17,13,14, -11,  17,18,14, 11   ;down side
  1534. dd   16,17,18, -11,  16,19,18, 11   ;near side
  1535.  
  1536. ;Test model
  1537. gqfa:  ;Good quality four angle
  1538. dd 5     ;model points
  1539. dd 4     ;model triagels
  1540. ;mpoints:
  1541. ;dd -45,-145,0,   -45,145,0,   45,45,0,   45,-45,0
  1542. dd -0,-105,0,   -0,105,0,   45,45,0,   45,-45,0
  1543. dd 30,0,0
  1544. ;pointslink:
  1545. dd   1,4,0, 50  ;left side
  1546. dd   1,4,2, 51 ;right side
  1547. dd   3,4,2, -50 ;up side
  1548. dd   3,4,0, -51  ;down side
  1549.  
  1550. skip_mdata:
  1551.  
  1552. ;***************
  1553. ; Add new models
  1554. ;***************
  1555. ;    jmp no_addmodel
  1556.  
  1557.     random 20,eax
  1558.     sub eax,10
  1559.     imul eax,SECTOR_SIZE
  1560.     add eax,SECTOR_SIZE/2
  1561.     mov [temp1],eax
  1562.     random 20,eax
  1563.     sub eax,10
  1564.     imul eax,SECTOR_SIZE
  1565.     add eax,SECTOR_SIZE/2
  1566.     mov [temp2],eax
  1567.  
  1568.     mov eax,dword [model_mas]
  1569.     cmp eax,40;00
  1570.     jae no_addmodel
  1571.     imul eax,4*8;
  1572.     add eax,4+model_mas
  1573.     inc dword [model_mas]
  1574.     mov ebx,[temp1]
  1575.     mov [eax],ebx
  1576.     mov ebx,[temp2]
  1577.     mov [eax+4],ebx
  1578.     mov [eax+8],dword -170
  1579.     mov ebx,0
  1580.     mov [eax+12],ebx
  1581.     mov [eax+16],ebx
  1582.     mov [eax+20],ebx
  1583.     mov ebx,tree;red_flag
  1584.     mov [eax+28],ebx
  1585.     jmp skip_mdata     ;use for auto filling at start
  1586. no_addmodel:
  1587.  
  1588.     ret
  1589.  
  1590.  
  1591. UpdateAngles:
  1592. ; Calculates new x,y,z angles
  1593. ; to autorotate around
  1594.  
  1595.    mov     eax,[Xangle]         ; Load current angles
  1596.    mov     ebx,[Yangle]
  1597.    mov     ecx,[Zangle]
  1598.  
  1599.    add     eax,[DeltaX]         ; Add velocity
  1600.    and     eax,011111111b        ; Range from 0..255
  1601.    mov     [Xangle],eax         ; Update X
  1602.    add     ebx,[DeltaY]         ; Add velocity
  1603.    and     ebx,011111111b        ; Range from 0..255
  1604.    mov     [Yangle],ebx         ; Update Y
  1605.    add     ecx,[DeltaZ]         ; Add velocity
  1606.    and     ecx,011111111b        ; Range from 0..255
  1607.    mov     [Zangle],ecx         ; Update Z
  1608.    ret
  1609.  
  1610. GetSinCos:
  1611. ; Needed : bx=angle (0..255)
  1612. ; Returns: ax=Sin   bx=Cos
  1613.     push    ebx                  ; Save angle (use as pointer)
  1614.     shl     ebx,2                ; Grab a word so bx=bx*2
  1615.     mov     eax,[SinCos + ebx]    ; Get sine
  1616.     pop     ebx                  ; Restore pointer into bx
  1617.     push    eax                  ; Save sine on stack
  1618.     add     ebx,64               ; Add 64 to get cosine
  1619.     and     ebx,11111111b        ; Range from 0..255
  1620.     shl     ebx,2                ; *2 coz it's a word
  1621.     mov     eax,[SinCos + ebx]    ; Get cosine
  1622.     mov     ebx,eax               ; Save it   bx=Cos
  1623.     pop     eax                  ; Restore   ax=Sin
  1624.     ret
  1625.  
  1626. ; Get sin & cos of x,y,z angle
  1627. SetRotation:
  1628.     mov     ebx,[Xangle]         ; Grab angle
  1629.     call    GetSinCos           ; Get the sine&cosine
  1630.     mov     [Xsin],eax           ; Save sin
  1631.     mov     [Xcos],ebx           ; Save cos
  1632.  
  1633.     mov     ebx,[Yangle]
  1634.     call    GetSinCos
  1635.     mov     [Ysin],eax
  1636.     mov     [Ycos],ebx
  1637.  
  1638.     mov     ebx,[Zangle]
  1639.     call    GetSinCos
  1640.     mov     [Zsin],eax
  1641.     mov     [Zcos],ebx
  1642. ; for camera
  1643.     mov     ebx,[Xcamangle]
  1644.     call    GetSinCos
  1645.     mov     [Xcamsin],eax
  1646.     mov     [Xcamcos],ebx
  1647.  
  1648.     mov     ebx,[Ycamangle]
  1649.     call    GetSinCos
  1650.     mov     [Ycamsin],eax
  1651.     mov     [Ycamcos],ebx
  1652.  
  1653.     mov     ebx,[Zcamangle]
  1654.     call    GetSinCos
  1655.     mov     [Zcamsin],eax
  1656.     mov     [Zcamcos],ebx
  1657.  
  1658.     ret
  1659.  
  1660. TranslatePoint:            ; Rotates the point around x,y,z
  1661. ; Gets original x,y,z values
  1662. ; This can be done elsewhere
  1663.  
  1664.     mov esi,[X]
  1665.     mov edi,[Y]
  1666.     mov ebx,[Zcamcos]
  1667.     mov ecx,[Zcamsin]
  1668.     call math
  1669.     mov [X],esi
  1670.     mov [Y],edi
  1671.  
  1672.     mov esi,[Y]
  1673.     mov edi,[Z]
  1674.     mov ebx,[Xcamcos]
  1675.     mov ecx,[Xcamsin]
  1676.     call math
  1677.     mov [Y],esi
  1678.     mov [Z],edi
  1679.  
  1680.     mov esi,[X]
  1681.     mov edi,[Z]
  1682.     mov ebx,[Ycamcos]
  1683.     mov ecx,[Ycamsin]
  1684.     call math
  1685.     mov [X],esi
  1686.     mov [Z],edi
  1687.  
  1688.     mov esi,[Y]
  1689.     mov ebx,[Xcos]
  1690.     mov edi,[Z]
  1691.     mov ecx,[Xsin]
  1692.     call math
  1693.     mov [Y],esi
  1694.     mov [Z],edi
  1695.     mov esi,[X]
  1696.     mov ebx,[Ycos]
  1697.     mov ecx,[Ysin]
  1698.     call math
  1699.     mov [X],esi
  1700.     mov [Z],edi
  1701.     mov ebx,[Zcos]
  1702.     mov edi,[Y]
  1703.     mov ecx,[Zsin]
  1704.     call math
  1705.  
  1706. ;*************
  1707. ;  ShowPoint
  1708. ;*************
  1709.  
  1710. ; Calculates screenposition and
  1711. ; plots the point on the screen
  1712.     mov     eax,[Xoff]           ; Xoff*X / Z+Zoff = screen x
  1713.     mov     ecx,esi
  1714.     imul    ecx
  1715.  
  1716.     mov     ebx,[Z]
  1717.     add     ebx,[Zoff]           ; Distance
  1718.  
  1719.     cmp ebx,0
  1720.     je notout
  1721.     idiv    ebx
  1722.     add     eax,[Mx]             ; Center on screen
  1723.     mov     ebp,eax              ;ebp =Xp
  1724.  
  1725.     mov     eax,[Yoff]           ; Yoff*Y / Z+Zoff = screen y
  1726.     mov     ecx,edi
  1727.     imul    ecx
  1728.  
  1729.     cmp ebx,0
  1730.     je notout
  1731.     idiv    ebx                  ;eax =Yp
  1732.     add     eax,[My]             ; Center on screen
  1733.  
  1734. notout:
  1735.     ret
  1736.  
  1737. math:
  1738.     mov     eax,esi
  1739.     imul    ebx               ; ax = X * Cos(zang)
  1740.     mov     ebp,eax
  1741.     mov     eax,edi
  1742.     imul    ecx               ; ax = Y * Sin(zang)
  1743.     sub     ebp,eax            ; bp = X * Cos(zang) - Y * Sin(zang)
  1744.     sar     ebp,8             ; bp = X * Cos(zang) - Y * Sin(zang) / 256
  1745.  
  1746.     mov     eax,esi
  1747.     mov     esi,ebp
  1748.     imul    ecx               ; ax = X * Sin(zang)
  1749.     mov     ebp,eax
  1750.     mov     eax,edi
  1751.     imul    ebx               ; ax = Y * Cos(zang)
  1752.     add     ebp,eax            ; bp = X * SIN(zang) + Y * COS(zang)
  1753.     sar     ebp,8             ; bp = X * SIN(zang) + Y * COS(zang) / 256
  1754.     mov     edi,ebp
  1755.     ret
  1756.  
  1757. SinCos:
  1758. dd 0,6,13,19,25,31,38,44,50,56
  1759. dd 62,68,74,80,86,92,98,104,109,115
  1760. dd 121,126,132,137,142,147,152,157,162,167
  1761. dd 172,177,181,185,190,194,198,202,206,209
  1762. dd 213,216,220,223,226,229,231,234,237,239
  1763. dd 241,243,245,247,248,250,251,252,253,254
  1764. dd 255,255,256,256,256,256,256,255,255,254
  1765. dd 253,252,251,250,248,247,245,243,241,239
  1766. dd 237,234,231,229,226,223,220,216,213,209
  1767. dd 206,202,198,194,190,185,181,177,172,167
  1768. dd 162,157,152,147,142,137,132,126,121,115
  1769. dd 109,104,98,92,86,80,74,68,62,56
  1770. dd 50,44,38,31,25,19,13,6,0,-6
  1771. dd -13,-19,-25,-31,-38,-44,-50,-56,-62,-68
  1772. dd -74,-80,-86,-92,-98,-104,-109,-115,-121,-126
  1773. dd -132,-137,-142,-147,-152,-157,-162,-167,-172,-177
  1774. dd -181,-185,-190,-194,-198,-202,-206,-209,-213,-216
  1775. dd -220,-223,-226,-229,-231,-234,-237,-239,-241,-243
  1776. dd -245,-247,-248,-250,-251,-252,-253,-254,-255,-255
  1777. dd -256,-256,-256,-256,-256,-255,-255,-254,-253,-252
  1778. dd -251,-250,-248,-247,-245,-243,-241,-239,-237,-234
  1779. dd -231,-229,-226,-223,-220,-216,-213,-209,-206,-202
  1780. dd -198,-194,-190,-185,-181,-177,-172,-167,-162,-157
  1781. dd -152,-147,-142,-137,-132,-126,-121,-115,-109,-104
  1782. dd -98,-92,-86,-80,-74,-68,-62,-56,-50,-44
  1783. dd -38,-31,-25,-19,-13,-6
  1784.  
  1785. mipzoom dd 0
  1786. mipmapwork dd 0
  1787. temp1 dd 0
  1788. temp2 dd 0
  1789.  
  1790. ;  4.24.2005 Textured triangle algorythm
  1791. ;  created by Pavlushin Evgeni waptap[at]mail.ru
  1792. ;  on base tex3 from Mikolaj Felix mfelix@polbox.com
  1793.  
  1794. align 512
  1795. @@tx1 dd 0 ;equ [bp+4]
  1796. @@ty1 dd 0 ;equ [bp+6]
  1797. align 512
  1798. @@tx2 dd 0 ;equ [bp+8]
  1799. @@ty2 dd 0 ;equ [bp+10]
  1800. align 512
  1801. @@tx3 dd 0 ;equ [bp+12]
  1802. @@ty3 dd 0 ;equ [bp+14]
  1803.  
  1804. @@tz1 dd 0
  1805. @@tz2 dd 0
  1806. @@tz3 dd 0
  1807.  
  1808. @@z_dy12 dd 0
  1809. @@z_dy13 dd 0
  1810. @@z_dy23 dd 0
  1811.  
  1812. @@tex_off dd 0 ;equ [bp+16]
  1813. @@tex_x1 dd 0 ;equ [bp+18]
  1814. @@tex_y1 dd 0 ;equ [bp+20]
  1815. @@tex_x2 dd 0 ;equ [bp+22]
  1816. @@tex_y2 dd 0 ;equ [bp+24]
  1817. @@tex_x3 dd 0 ;equ [bp+26]
  1818. @@tex_y3 dd 0 ;equ [bp+28]
  1819.  
  1820. @@dx12 dd 0 ;equ [bp-2]
  1821. @@dx13 dd 0 ;equ [bp-4]
  1822. @@dx23 dd 0 ;equ [bp-6]
  1823.  
  1824. @@tex_dx12 dd 0 ;equ [bp-8]
  1825. @@tex_dy12 dd 0 ;equ [bp-10]
  1826. @@tex_dx13 dd 0 ;equ [bp-12]
  1827. @@tex_dy13 dd 0 ;equ [bp-14]
  1828. @@tex_dx23 dd 0 ;equ [bp-16]
  1829. @@tex_dy23 dd 0 ;equ [bp-18]
  1830.  
  1831. @@scan_x1 dd 0
  1832. @@scan_y1 dd 0
  1833. @@scan_x2 dd 0
  1834. @@scan_y2 dd 0
  1835.  
  1836. @@scan_z1 dd 0
  1837. @@scan_z2 dd 0
  1838.  
  1839. SHIFT=16
  1840.  
  1841. textured_triangle:
  1842.  
  1843.         mov eax,[@@ty1]
  1844.         cmp eax,[@@ty3]
  1845.         jle tt_check1
  1846.  
  1847.         xchg eax,[@@ty3]
  1848.         mov [@@ty1],eax
  1849.  
  1850.         mov eax,[@@tx1]
  1851.         xchg eax,[@@tx3]
  1852.         mov [@@tx1],eax
  1853.  
  1854.         mov eax,[@@tz1]
  1855.         xchg eax,[@@tz3]
  1856.         mov [@@tz1],eax
  1857.  
  1858.         mov eax,[@@tex_y1]
  1859.         xchg eax,[@@tex_y3]
  1860.         mov [@@tex_y1],eax
  1861.  
  1862.         mov eax,[@@tex_x1]
  1863.         xchg eax,[@@tex_x3]
  1864.         mov [@@tex_x1],eax
  1865. tt_check1:
  1866.         mov eax,[@@ty2]
  1867.         cmp eax,[@@ty3]
  1868.         jle tt_check2
  1869.  
  1870.         xchg eax,[@@ty3]
  1871.         mov [@@ty2],eax
  1872.  
  1873.         mov eax,[@@tx2]
  1874.         xchg eax,[@@tx3]
  1875.         mov [@@tx2],eax
  1876.  
  1877.         mov eax,[@@tz2]
  1878.         xchg eax,[@@tz3]
  1879.         mov [@@tz2],eax
  1880.  
  1881.         mov eax,[@@tex_y2]
  1882.         xchg eax,[@@tex_y3]
  1883.         mov [@@tex_y2],eax
  1884.  
  1885.         mov eax,[@@tex_x2]
  1886.         xchg eax,[@@tex_x3]
  1887.         mov [@@tex_x2],eax
  1888. tt_check2:
  1889.         mov eax,[@@ty1]
  1890.         cmp eax,[@@ty2]
  1891.         jle tt_check3
  1892.  
  1893.         xchg eax,[@@ty2]
  1894.         mov [@@ty1],eax
  1895.  
  1896.         mov eax,[@@tx1]
  1897.         xchg eax,[@@tx2]
  1898.         mov [@@tx1],eax
  1899.  
  1900.         mov eax,[@@tz1]
  1901.         xchg eax,[@@tz2]
  1902.         mov [@@tz1],eax
  1903.  
  1904.         mov eax,[@@tex_y1]
  1905.         xchg eax,[@@tex_y2]
  1906.         mov [@@tex_y1],eax
  1907.  
  1908.         mov eax,[@@tex_x1]
  1909.         xchg eax,[@@tex_x2]
  1910.         mov [@@tex_x1],eax
  1911. tt_check3:
  1912.  
  1913.         mov ebx,[@@ty2]
  1914.         sub ebx,[@@ty1]
  1915.         jnz tt_dx12_make
  1916.  
  1917.         mov [@@dx12],0
  1918.         mov [@@tex_dx12],0
  1919.         mov [@@tex_dy12],0
  1920.         mov [@@z_dy12],0
  1921.         jmp tt_dx12_done
  1922. tt_dx12_make:
  1923.         mov eax,[@@tx2]
  1924.         sub eax,[@@tx1]
  1925.         shl eax,SHIFT
  1926.         cdq
  1927.         idiv ebx
  1928.         mov [@@dx12],eax                        ; dx12 = (x2-x1)/(y2-y1)
  1929.  
  1930.         mov eax,[@@tex_x2]
  1931.         sub eax,[@@tex_x1]
  1932.         cdq
  1933.         idiv ebx
  1934.         mov [@@tex_dx12],eax            ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)
  1935.  
  1936.         mov eax,[@@tex_y2]
  1937.         sub eax,[@@tex_y1]
  1938.         cdq
  1939.         idiv ebx
  1940.         mov [@@tex_dy12],eax            ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
  1941.  
  1942.         mov eax,[@@tz2]
  1943.         sub eax,[@@tz1]
  1944.         shl eax,SHIFT
  1945.         cdq
  1946.         idiv ebx
  1947.         mov [@@z_dy12],eax     
  1948.  
  1949. tt_dx12_done:
  1950.  
  1951.         mov ebx,[@@ty3]
  1952.         sub ebx,[@@ty1]
  1953.         jnz tt_dx13_make
  1954.  
  1955.         mov [@@dx13],0
  1956.         mov [@@tex_dx13],0
  1957.         mov [@@tex_dy13],0
  1958.  mov [@@z_dy13],0
  1959.         jmp tt_dx13_done
  1960. tt_dx13_make:
  1961.         mov eax,[@@tx3]
  1962.         sub eax,[@@tx1]
  1963.         shl eax,SHIFT
  1964.         cdq
  1965.         idiv ebx
  1966.         mov [@@dx13],eax                        ; dx13 = (x3-x1)/(y3-y1)
  1967.  
  1968.         mov eax,[@@tex_x3]
  1969.         sub eax,[@@tex_x1]
  1970.         cdq
  1971.         idiv ebx
  1972.         mov [@@tex_dx13],eax            ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)
  1973.  
  1974.         mov eax,[@@tex_y3]
  1975.         sub eax,[@@tex_y1]
  1976.         cdq
  1977.         idiv ebx
  1978.         mov [@@tex_dy13],eax            ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1)
  1979.  
  1980.         mov eax,[@@tz3]
  1981.         sub eax,[@@tz1]
  1982.         shl eax,SHIFT
  1983.         cdq
  1984.         idiv ebx
  1985.         mov [@@z_dy13],eax             
  1986. tt_dx13_done:
  1987.  
  1988.         mov ebx,[@@ty3]
  1989.         sub ebx,[@@ty2]
  1990.         jnz tt_dx23_make
  1991.  
  1992.         mov [@@dx23],0
  1993.         mov [@@tex_dx23],0
  1994.         mov [@@tex_dy23],0
  1995.         mov [@@z_dy23],0
  1996.         jmp tt_dx23_done
  1997. tt_dx23_make:
  1998.         mov eax,[@@tx3]
  1999.         sub eax,[@@tx2]
  2000.         shl eax,SHIFT
  2001.         cdq
  2002.         idiv ebx
  2003.         mov [@@dx23],eax                        ; dx23 = (x3-x2)/(y3-y2)
  2004.  
  2005.         mov eax,[@@tex_x3]
  2006.         sub eax,[@@tex_x2]
  2007.         cdq
  2008.         idiv ebx
  2009.         mov [@@tex_dx23],eax            ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)
  2010.  
  2011.         mov eax,[@@tex_y3]
  2012.         sub eax,[@@tex_y2]
  2013.         cdq
  2014.         idiv ebx
  2015.         mov [@@tex_dy23],eax            ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
  2016.  
  2017.         mov eax,[@@tz3]
  2018.         sub eax,[@@tz2]
  2019.         shl eax,SHIFT
  2020.         cdq
  2021.         idiv ebx
  2022.         mov [@@z_dy23],eax             
  2023. tt_dx23_done:
  2024.  
  2025.  
  2026.         mov eax,[@@tx1]
  2027.         shl eax,SHIFT
  2028.         mov ebx,eax
  2029.         mov ecx,[@@ty1]
  2030.  
  2031.  mov edx,[@@tz1]
  2032.  shl edx,SHIFT
  2033.  mov [@@scan_z1],edx
  2034.  mov [@@scan_z2],edx
  2035.  
  2036.         mov edx,[@@tex_x1]
  2037.         mov [@@scan_x1],edx
  2038.         mov [@@scan_x2],edx
  2039.         mov edx,[@@tex_y1]
  2040.         mov [@@scan_y1],edx
  2041.         mov [@@scan_y2],edx
  2042.  
  2043. ; ****************
  2044.  mov edx,[@@ty1]   ;skip equals
  2045.  cmp [@@ty2],edx
  2046.  je tt_loop1_end
  2047.  
  2048.  mov ebp,[@@ty1]
  2049.  cmp ebp,0
  2050.  jg no_up_clip
  2051.  neg ebp
  2052.  mov edx,[@@ty2]
  2053.  cmp edx,0
  2054.  jg no_sbx
  2055.  neg edx
  2056.  sub ebp,edx
  2057. no_sbx:
  2058.  
  2059.         mov edx,[@@tex_dx13]
  2060.  imul edx,ebp
  2061.         add [@@scan_x1],edx
  2062.         mov edx,[@@tex_dx12]
  2063.  imul edx,ebp
  2064.         add [@@scan_x2],edx
  2065.         mov edx,[@@tex_dy13]
  2066.  imul edx,ebp
  2067.         add [@@scan_y1],edx
  2068.         mov edx,[@@tex_dy12]
  2069.  imul edx,ebp
  2070.         add [@@scan_y2],edx
  2071.  
  2072.         mov edx,[@@z_dy13]
  2073.  imul edx,ebp
  2074.         add [@@scan_z1],edx
  2075.         mov edx,[@@z_dy12]
  2076.  imul edx,ebp
  2077.         add [@@scan_z2],edx
  2078.  
  2079.  mov edx,[@@dx13]
  2080.  imul edx,ebp
  2081.         add eax,edx
  2082.  mov edx,[@@dx12]
  2083.  imul edx,ebp
  2084.         add ebx,edx
  2085.         add ecx,ebp
  2086. no_up_clip:
  2087.  
  2088.  cmp [@@ty2],0
  2089.  jl  tt_loop1_end
  2090.  
  2091. tt_loop1:
  2092.  cmp ecx,SCREEN_Y
  2093.  jge tt_loop2_end
  2094.  
  2095.  pushad
  2096.         mov edx,[@@scan_y2]
  2097.         mov [@@tex_ly2],edx ;push dx
  2098.         mov edx,[@@scan_x2]
  2099.         mov [@@tex_lx2],edx ;push dx
  2100.         mov edx,[@@scan_y1]
  2101.         mov [@@tex_ly1],edx ;push dx
  2102.         mov edx,[@@scan_x1]
  2103.         mov [@@tex_lx1],edx ;push dx
  2104.  
  2105.  mov edx,[@@scan_z1]
  2106.  mov [@@lz1],edx
  2107.  mov edx,[@@scan_z2]
  2108.  mov [@@lz2],edx
  2109.  
  2110.         mov [@@ly],ecx ;push cx
  2111.         mov edx,ebx
  2112.         sar edx,SHIFT
  2113.         mov [@@lx2],edx ;push dx
  2114.         mov edx,eax
  2115.         sar edx,SHIFT
  2116.         mov [@@lx1],edx ; push dx
  2117.         call textured_horizontal_line
  2118.  popad
  2119.  
  2120.         mov edx,[@@tex_dx13]
  2121.         add [@@scan_x1],edx
  2122.         mov edx,[@@tex_dx12]
  2123.         add [@@scan_x2],edx
  2124.         mov edx,[@@tex_dy13]
  2125.         add [@@scan_y1],edx
  2126.         mov edx,[@@tex_dy12]
  2127.         add [@@scan_y2],edx
  2128.  
  2129.         mov edx,[@@z_dy13]
  2130.         add [@@scan_z1],edx
  2131.         mov edx,[@@z_dy12]
  2132.         add [@@scan_z2],edx
  2133.  
  2134.         add eax,[@@dx13]
  2135.         add ebx,[@@dx12]
  2136.         inc ecx
  2137.         cmp ecx,[@@ty2]
  2138.         jl tt_loop1
  2139.  
  2140. tt_loop1_end:
  2141.  
  2142.         mov ebx,[@@tx2]
  2143.         shl ebx,SHIFT
  2144.         mov ecx,[@@ty2]
  2145.  
  2146.  mov edx,[@@tz2]
  2147.  shl edx,SHIFT
  2148.  mov [@@scan_z2],edx
  2149.  
  2150.         mov edx,[@@tex_x2]
  2151.         mov [@@scan_x2],edx
  2152.         mov edx,[@@tex_y2]
  2153.         mov [@@scan_y2],edx
  2154.  
  2155.  mov ebp,[@@ty2]
  2156.  cmp ebp,0
  2157.  jg no_down_clip
  2158.  neg ebp
  2159.  dec ebp
  2160.  
  2161.         mov edx,[@@tex_dx13]
  2162.  imul edx,ebp
  2163.         add [@@scan_x1],edx
  2164.         mov edx,[@@tex_dx23]
  2165.  imul edx,ebp
  2166.         add [@@scan_x2],edx
  2167.         mov edx,[@@tex_dy13]
  2168.  imul edx,ebp
  2169.         add [@@scan_y1],edx
  2170.         mov edx,[@@tex_dy23]
  2171.  imul edx,ebp
  2172.         add [@@scan_y2],edx
  2173.  
  2174.         mov edx,[@@z_dy13]
  2175.  imul edx,ebp
  2176.         add [@@scan_z1],edx
  2177.         mov edx,[@@z_dy23]
  2178.  imul edx,ebp
  2179.         add [@@scan_z2],edx
  2180.  
  2181.  mov edx,[@@dx13]
  2182.  imul edx,ebp
  2183.         add eax,edx
  2184.  mov edx,[@@dx23]
  2185.  imul edx,ebp
  2186.         add ebx,edx
  2187.  add ecx,ebp
  2188. no_down_clip:
  2189.  
  2190. tt_loop2:
  2191.  cmp ecx,SCREEN_Y
  2192.  jge tt_loop2_end
  2193.  
  2194.  pushad
  2195.         mov edx,[@@scan_y2]
  2196.         mov [@@tex_ly2],edx ;push dx
  2197.         mov edx,[@@scan_x2]
  2198.         mov [@@tex_lx2],edx ;push dx
  2199.         mov edx,[@@scan_y1]
  2200.         mov [@@tex_ly1],edx ;push dx
  2201.         mov edx,[@@scan_x1]
  2202.         mov [@@tex_lx1],edx ;push dx
  2203.  
  2204.  mov edx,[@@scan_z1]
  2205.  mov [@@lz1],edx
  2206.  mov edx,[@@scan_z2]
  2207.  mov [@@lz2],edx
  2208.  
  2209.         mov [@@ly],ecx ;push cx
  2210.         mov edx,ebx
  2211.         sar edx,SHIFT
  2212.         mov [@@lx2],edx ;push dx
  2213.         mov edx,eax
  2214.         sar edx,SHIFT
  2215.         mov [@@lx1],edx ; push dx
  2216.         call textured_horizontal_line
  2217.  popad
  2218.  
  2219.         mov edx,[@@tex_dx13]
  2220.         add [@@scan_x1],edx
  2221.         mov edx,[@@tex_dx23]
  2222.         add [@@scan_x2],edx
  2223.         mov edx,[@@tex_dy13]
  2224.         add [@@scan_y1],edx
  2225.         mov edx,[@@tex_dy23]
  2226.         add [@@scan_y2],edx
  2227.  
  2228.         mov edx,[@@z_dy13]
  2229.         add [@@scan_z1],edx
  2230.         mov edx,[@@z_dy23]
  2231.         add [@@scan_z2],edx
  2232.  
  2233.         add eax,[@@dx13]
  2234.         add ebx,[@@dx23]
  2235.         inc ecx
  2236.         cmp ecx,[@@ty3]
  2237.         jl tt_loop2
  2238.  
  2239. tt_loop2_end:
  2240.         ret
  2241.  
  2242. align 512
  2243. @@lx1 dd 0
  2244. align 512
  2245. @@lx2 dd 0
  2246. align 512
  2247. @@ly dd  0
  2248.  
  2249. @@lz1 dd 0
  2250. @@lz2 dd 0
  2251. @@z_dx dd 0
  2252.  
  2253. align 512
  2254. @@tex_loff dd 0 ;equ [bp+10]
  2255. @@tex_lx1 dd 0 ;equ [bp+12]
  2256. @@tex_ly1 dd 0 ;equ [bp+14]
  2257. @@tex_lx2 dd 0 ;equ [bp+16]
  2258. @@tex_ly2 dd 0 ;equ [bp+18]
  2259.  
  2260. align 512
  2261. @@tex_ldx dd 0 ;equ [bp-2]
  2262. @@tex_ldy dd 0 ;equ [bp-4]
  2263.  
  2264. align 1024
  2265. textured_horizontal_line:
  2266.  
  2267.         mov eax,[@@lx1]
  2268.         cmp eax,[@@lx2]
  2269.         je thl_quit
  2270.         jl thl_ok
  2271.  
  2272.         xchg eax,[@@lx2]
  2273.         mov [@@lx1],eax
  2274.  
  2275.  mov eax,[@@lz1]
  2276.         xchg eax,[@@lz2]
  2277.         mov [@@lz1],eax
  2278.  
  2279.         mov eax,[@@tex_lx1]
  2280.         xchg eax,[@@tex_lx2]
  2281.         mov [@@tex_lx1],eax
  2282.  
  2283.         mov eax,[@@tex_ly1]
  2284.         xchg eax,[@@tex_ly2]
  2285.         mov [@@tex_ly1],eax
  2286.  
  2287. thl_ok:
  2288.  
  2289.  cmp [@@lx2],0
  2290.  jle thl_quit
  2291.  mov eax,SCREEN_X
  2292.  cmp [@@lx1],eax
  2293.  jge thl_quit
  2294.  
  2295.         mov ecx,[@@lx2]
  2296.         sub ecx,[@@lx1]
  2297.  
  2298.  ; Uneversal method
  2299.  mov edi,[@@ly]
  2300.  mov eax,SCREEN_X   ;di = ly*320+lx1
  2301.  imul edi
  2302.  add eax,[@@lx1]
  2303.  imul eax,3
  2304.  mov edi,eax
  2305.  add edi,I_END
  2306.  
  2307.  ;Right side clipping
  2308.  mov eax,SCREEN_X
  2309.  cmp [@@lx2],eax
  2310.  jnge x1ok
  2311.  mov edx,SCREEN_X
  2312.  dec edx
  2313.  sub edx,[@@lx1]
  2314.  cmp edx,0
  2315.  jle thl_quit
  2316.  mov ecx,edx
  2317. x1ok:
  2318.  
  2319.  ;Left side clipping
  2320.  cmp [@@lx1],0
  2321.  jg  x2ok
  2322.  mov ecx,[@@lx2]     ;cmp lx2 screen x if above cut (for future)
  2323.  mov edi,[@@ly]
  2324.  mov eax,SCREEN_X
  2325.  imul edi,eax
  2326.  imul edi,3
  2327.  add edi,I_END
  2328. x2ok:
  2329.  
  2330.         mov ebx,[@@lx2]
  2331.         sub ebx,[@@lx1]
  2332.  
  2333.         mov eax,[@@tex_lx2]
  2334.         sub eax,[@@tex_lx1]
  2335.         cdq
  2336.         idiv ebx
  2337.         mov [@@tex_ldx],eax                     ; tex_dx = (tex_x2-tex_x1)/(x2-x1)
  2338.  
  2339.         mov eax,[@@tex_ly2]
  2340.         sub eax,[@@tex_ly1]
  2341.         cdq
  2342.         idiv ebx
  2343.         mov [@@tex_ldy],eax                     ; tex_dy = (tex_y2-tex_y1)/(x2-x1)
  2344.  
  2345.         mov eax,[@@lz2]
  2346.         sub eax,[@@lz1]
  2347.         cdq
  2348.         idiv ebx
  2349.         mov [@@z_dx],eax                        ; tex_dx = (tex_x2-tex_x1)/(x2-x1)
  2350.  
  2351.  ; Left clipping post correction
  2352.  cmp [@@lx1],0
  2353.  jg  no_lcpc
  2354.  mov eax,[@@lx1]
  2355.  neg eax
  2356.  mov ebp,[@@tex_ldx]
  2357.  imul ebp,eax
  2358.  add [@@tex_lx1],ebp
  2359.  mov ebp,[@@tex_ldy]
  2360.  imul ebp,eax
  2361.  add [@@tex_ly1],ebp
  2362.  mov ebp,[@@z_dx]
  2363.  imul ebp,eax
  2364.  add [@@lz1],ebp
  2365. no_lcpc:
  2366.  
  2367.         inc ecx ;for equal correction
  2368.         mov edx,[@@tex_lx1]
  2369.         mov ebx,[@@tex_ly1]
  2370.  mov esi,[@@lz1]
  2371.  
  2372. thl_loop:
  2373.         mov ebp,esi
  2374.  shr ebp,SHIFT
  2375.  mov eax,dword [edi-I_END+zbuffer]
  2376.  cmp ax,bp
  2377.  jb  no_set
  2378.  mov [edi-I_END+zbuffer],bp
  2379.  
  2380.  mov eax,edx
  2381. ; and eax,0x0fff0000
  2382.  ror ebx,16
  2383.  mov ax,bx
  2384.  ror ebx,16
  2385.  shl ax,11    ; 8 for 256*256, 9 for 128*128 ...
  2386.  shr eax,11
  2387.  lea eax,[eax*2+eax] ; equ imul eax,3
  2388.         add eax,[@@tex_off]
  2389.  mov ebp,eax
  2390.  
  2391.         mov ax,word [ebp]
  2392.  mov [edi],ax
  2393.         mov al,byte [ebp+2]
  2394.  mov [edi+2],al
  2395.  
  2396. no_set:
  2397.  add edi,3
  2398.  
  2399.  add esi,[@@z_dx]
  2400.         add edx,[@@tex_ldx]
  2401.         add ebx,[@@tex_ldy]
  2402.         dec ecx
  2403.         jnz thl_loop
  2404. thl_quit:
  2405.  ret
  2406.  
  2407.  
  2408. @@rgb  dd 0
  2409. @@rgbax  dw 0
  2410. @@rgbbl  db 0
  2411.  
  2412. ; === DATA ===
  2413.  
  2414. d_angle  dd 0.19634954 ;pi/16
  2415. angle    dd 0.0
  2416. mul_wave dd 1.5
  2417.  
  2418. sin_pos dw 0
  2419. sinwave rw 256
  2420.  
  2421. Xmap   dd 0
  2422. Ymap   dd 0
  2423. mapoff dd 0
  2424.  
  2425. Xcam   dd 0
  2426. Ycam   dd 0
  2427. Zcam   dd -400
  2428.  
  2429. Xcamangle dd 0
  2430. Ycamangle dd 0
  2431. Zcamangle dd 0
  2432.  
  2433. Xcamsin   dd 0
  2434. Xcamcos   dd 0
  2435. Ycamsin   dd 0
  2436. Ycamcos   dd 0
  2437. Zcamsin   dd 0
  2438. Zcamcos   dd 0
  2439.  
  2440. X      dd ?             ; X,Y,Z variable for formula
  2441. Y      dd ?
  2442. Z      dd ?
  2443.  
  2444. Xp dd ?
  2445. Yp dd ?
  2446.  
  2447. Xangle dd 0             ; Angle to rotate around x
  2448. Yangle dd 0
  2449. Zangle dd 0
  2450.  
  2451. DeltaX dd 1             ; x,y,z rotation angle
  2452. DeltaY dd 1
  2453. DeltaZ dd 1
  2454.  
  2455. Xoff   dd 256           ; x-cord
  2456. Yoff   dd 256           ; y-cord
  2457. Zoff   dd 0;800         ; Distance from viewer
  2458.  
  2459. Xsin   dd ?             ; Sine and cosine of angle to rotate around
  2460. Xcos   dd ?
  2461. Ysin   dd ?
  2462. Ycos   dd ?
  2463. Zsin   dd ?
  2464. Zcos   dd ?
  2465.  
  2466. Mx     dd SCREEN_X/2            ; Center  of the screen
  2467. My     dd SCREEN_Y/2
  2468.  
  2469. autorot db 0                    ;Auto rotation flag
  2470. massize dd 0                    ;Size of triangle massive
  2471. id      dd 0
  2472. temp    dd 0
  2473.  
  2474. ; DATA AREA
  2475. labelt:
  2476.      db   '3D TEXTURED ENGINE'
  2477. labellen:
  2478.  
  2479.  
  2480. ;Texture pusck 32*32 256
  2481. texpack_gif:
  2482. file 'TEXPACK.gif'
  2483. rb 50
  2484.  
  2485. ;Ground texture
  2486. bmp_texmap:
  2487. file 'TEXMAP.bmp'
  2488. rb 50
  2489.  
  2490.  
  2491. ; Ground livel map
  2492. gif_file_area5:
  2493. file 'MAP.gif' ;level map
  2494. rb 50
  2495.  
  2496. rb 8
  2497. texture_limg:
  2498. rb 4095
  2499. texture_img:
  2500. rb 4095
  2501. texture_img2:
  2502. rb 4095
  2503.  
  2504. rb (4095)*16*16
  2505.  
  2506. img_area:
  2507. rb 128*128*3+8
  2508.  
  2509. glm_img_area:
  2510. rb (MAP_XSIZE+1)*(MAP_YSIZE+1)*3+8
  2511.  
  2512. rb 8
  2513.  
  2514. texpack_img:
  2515. rb 512*512*3+8
  2516.  
  2517. keymap:
  2518. rb 1000
  2519.  
  2520. model_mas:
  2521. rb 4+8*100
  2522.  
  2523. ; Hash area for decoding GIF
  2524. gif_hash_area:
  2525. rd 4096+1
  2526.  
  2527. MAX_MODEL_POINTS = 100
  2528. modelpoints:
  2529. rb MAX_MODEL_POINTS*3*4
  2530.  
  2531. ; Matrix points massive
  2532. points:
  2533. ; Massive of turn matrix points
  2534. tpoints=points+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4)
  2535. ; Ground level map massive
  2536. ground_level_map=tpoints+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4)
  2537. ; zbuffer
  2538. zbuffer=ground_level_map+((MAP_XSIZE+1)*(MAP_YSIZE+1)*4)
  2539. I_END=zbuffer+(SCREEN_X*SCREEN_Y)*3
  2540.