Subversion Repositories Kolibri OS

Rev

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