Subversion Repositories Kolibri OS

Rev

Rev 109 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; 9 Ver Screen saver
  3. ; 5 Ver 24 bit texture.
  4. ; 23/8/2004
  5. ; Pavlushin Evgeni 3d cube screen saver
  6. ; mail: waptap@mail.ru       site: www.deck4.narod.ru
  7. ;
  8. ; This programm develop on sample text3d to Mikolaj Felix 25/5/2001
  9. ; mfelix@polbox.com
  10. ;
  11.  
  12. use32
  13.                org     0x0
  14.                db     'MENUET01'              ; 8 byte id
  15.                dd     0x01                    ; header version
  16.                dd     START                   ; start of code
  17.                dd     I_END                   ; size of image
  18.                dd     0x200000                ; memory for app
  19.                dd     0x200000                ; esp
  20.                dd     0x0 , 0x0               ; I_Param , I_Icon
  21.  
  22. include 'lang.inc'
  23. include '..\..\..\macros.inc'
  24. MAX_DEGS equ 512 ;quantity of angels 2^n.Minimize for speedup
  25. MAX_POINTS equ 8 ;quantity of points
  26. MAX_FACES equ 6  ;quantity of points
  27.  
  28. START:
  29.     finit
  30.     call draw_window
  31.     call clear_screen
  32.     call init_sincos
  33.  
  34. still:
  35.     mov eax,23  ; wait for system event with 2 ms timeout
  36.     mov ebx,2   ; wait 2 ms, then continue
  37.     mcall
  38.  
  39. ;    mov eax,11 ;If you want maximum speed! :)
  40. ;    mcall
  41.  
  42.     dec  eax                  ; window redraw request ?
  43.     je   red
  44.     dec  eax                  ; key in buffer ?
  45.     je   key
  46.     dec  eax                  ; button in buffer ?
  47.     je   button
  48.  
  49. main_loop:
  50.  call fade_texture
  51.  
  52.         mov esi,cube
  53.         mov edi,cube_rotated
  54.         mov ecx,MAX_POINTS*3
  55. copy_object:
  56.  fild word [esi]
  57.  fstp dword [edi]
  58.  add esi,2
  59.  add edi,4
  60.  dec ecx
  61.  jnz copy_object
  62.  
  63.  mov esi,angle_x
  64.  mov edi,cube_rotated
  65.  mov ecx,MAX_POINTS
  66.  call rotate_points
  67.        
  68.  mov esi,cube_rotated
  69.  mov edi,coord2d
  70.  mov ecx,MAX_POINTS
  71.  call translate_points
  72.  
  73.  call draw_textured_faces
  74.  call clear_screen_buffer
  75.  
  76.  add [angle_x],1
  77.  add [angle_y],3
  78.  add [angle_z],1
  79.  
  80.  jmp still
  81.  
  82. red:
  83.      call draw_window
  84.      jmp still
  85. key:
  86.      mov eax,2
  87.      jmp exit
  88. button:
  89.      mov eax,17
  90.      mcall
  91.      cmp ah,1
  92.      jne still
  93. exit:
  94.      mov eax,-1
  95.      mcall
  96.  
  97. ;Draw window
  98. draw_window:
  99.     mov eax,12  ;Start
  100.     mov ebx,1
  101.     mcall
  102.  
  103.     mov eax,0   ;Draw window
  104.     mov ebx,0*65536+(799) ;x start*65536+x size
  105.     mov ecx,0*65536+(599) ;y start*65536+y size
  106.     mov edx,0x00000000         ;0x03 use skinned window
  107.     mcall
  108.  
  109.     call clear_screen
  110.  
  111.     mov eax,12  ;End
  112.     mov ebx,2
  113.     mcall
  114.     ret
  115.  
  116. head_label: db "3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR MENUETOS. USE "
  117.             db "800x600 SCREEN MODE FROM VIEW. PRESS ANY KEY FOR EXIT"
  118. hl_end:
  119.  
  120. ;FADE IN FADE OUT TEXTURE
  121.  
  122. x_step db 0
  123. x_num  db 1
  124.  
  125. fade_texture:
  126.  mov ecx,0
  127. loox:
  128.  mov al,[file_texture+ecx]
  129.  mov [texture+ecx],al
  130.  inc ecx
  131.  cmp ecx,128*128*3
  132.  jnae loox
  133.  
  134.  mov ecx,0
  135. loox2:
  136.  mov al,[file_texture+ecx]
  137.  cmp [x_step],al
  138.  jae xxx
  139.  sub al,[x_step]
  140.  jmp nnn
  141. xxx:
  142.  mov al,0
  143. nnn:
  144.  mov [texture+ecx],al
  145.  inc ecx
  146.  cmp ecx,128*128*3
  147.  jnae loox2
  148.  
  149.  cmp [x_step],255
  150.  jne no_max
  151.  mov [x_num],-1
  152. no_max:
  153.  cmp [x_step],0
  154.  jne no_min
  155.  mov [x_num],1
  156. no_min:
  157.  mov al,[x_num]
  158.  add [x_step],al
  159.  ret
  160.  
  161. ; Clear Screen
  162. clear_screen:
  163.  mov eax,13
  164.  mov ebx,0*65536+800
  165.  mov ecx,0*65536+600
  166.  mov edx,0
  167.  mcall
  168.  
  169.  mov eax,4   ;Out Text
  170.  mov ebx,8*65536+8          ;x start*65536+y start
  171.  mov ecx,0x00ffffff         ;color White
  172.  mov edx,head_label
  173.  mov esi,hl_end-head_label
  174.  mcall
  175.  ret
  176.  
  177. clear_screen_buffer:
  178.  mov ebx,scrbuf
  179.  mov ecx,800*65536+(600-40)  ;sub 40 for antiflickering title
  180.  mov edx,0*65536+40
  181.  mov eax,7
  182.  mcall
  183.  
  184.  mov eax,4   ;Out Text
  185.  mov ebx,8*65536+580          ;x start*65536+y start
  186.  mov ebp,[n_step]
  187.  shl ebp,16
  188.  sub ebx,ebp
  189.  mov ecx,0x0000ff00         ;color White
  190.  mov edx,move_text
  191.  add edx,[step]
  192.  mov esi,130 ;mt_end-move_text
  193.  mcall
  194.  
  195.  inc [n_step]
  196.  cmp [n_step],6
  197.  jna t_ok
  198.  mov [n_step],0
  199.  inc [step]
  200.  cmp [step],mt_end-move_text-130
  201.  jng t_ok
  202.  mov [step],0
  203. t_ok:
  204.  
  205.  mov edi,scrbuf
  206.  mov eax,0  ;black background
  207.  mov ecx,800*600*3/4 ; 16000
  208.  cld
  209.  rep stosd
  210.  ret
  211.  
  212. n_step dd 0
  213. step dd 0
  214.  
  215. move_text: db "                                            "
  216.            db "                                            "
  217.            db "                                            "
  218.            db "***** 3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR "
  219.            db "MENUET OS. SET 800x600 SCREEN MODE FROM VIEW THIS SCREEN "
  220.            db "SAVER *****                                        "
  221.            db "SITE OF THE RUSSIAN DEVELOPERS TO MENUETOS: "
  222.            db "www.menuet.narod.ru                         "
  223.            db "RUSSIAN MENUET APLICATION ARCHIVE PAGE ON: "
  224.            db "www.meosfiles.narod.ru                      "
  225.            db "AUTOR OF THIS SCREEN SAVER Pavlushin Evgeni "
  226.            db "MY SITE: www.deck4.narod.ru (Slow update)   "
  227.            db "AND MAIL BOX: waptap@mail.ru                "
  228.            db "THANK YOU FOR USE!                          "
  229.            db "                                            "
  230.            db "                                            "
  231.            db "                                            "
  232. mt_end:
  233.  
  234.  
  235. ;include graphlib.asm Mikolaj Felix 9/12/2000 mfelix@polbox.com
  236. ;Draw textured faces proc
  237.  
  238. @@rx1 dw 0 ;equ [bp-2]
  239. @@ry1 dw 0 ;equ [bp-4]
  240. @@rx2 dw 0 ;equ [bp-6]
  241. @@ry2 dw 0 ;equ [bp-8]
  242. @@rx3 dw 0 ;equ [bp-10]
  243. @@ry3 dw 0 ;equ [bp-12]
  244. @@rx4 dw 0 ;equ [bp-14]
  245. @@ry4 dw 0 ;equ [bp-16]
  246.  
  247. draw_textured_faces:
  248.        
  249.  mov esi,link
  250.  mov ecx,MAX_FACES
  251. dtf_loop:
  252.  push ecx
  253.  
  254.  xor ebx,ebx
  255.  mov bl,byte [esi]              ; point 1
  256.  shl bx,2
  257.  mov eax,dword [coord2d+bx] ;COPY 1 FOURANGLE POINT
  258.  mov dword [@@rx1],eax
  259.  
  260.  xor ebx,ebx
  261.  mov bl,byte [esi+1]            ; point 2
  262.  shl bx,2
  263.  mov eax,dword [coord2d+bx] ;COPY 2 FOURANGLE POINT
  264.  mov dword [@@rx2],eax
  265.  
  266.  xor ebx,ebx
  267.  mov bl,byte [esi+2]            ; point 3
  268.  shl bx,2
  269.  mov eax,dword [coord2d+bx] ;COPY 3 FOURANGLE POINT
  270.  mov dword [@@rx3],eax
  271.  
  272.  xor bh,bh                      ; point 4
  273.  mov bl,byte [esi+3]
  274.  shl bx,2
  275.  mov eax,dword [coord2d+bx] ;COPY 4 FOURANGLE POINT
  276.  mov dword [@@rx4],eax
  277.  
  278.  mov ax,[@@ry1]
  279.  sub ax,[@@ry3]
  280.  mov bx,[@@rx2]
  281.  sub bx,[@@rx1]
  282.  imul bx
  283.  shl edx,16
  284.  mov dx,ax
  285.  push edx
  286.  mov ax,[@@rx1]
  287.  sub ax,[@@rx3]
  288.  mov bx,[@@ry2]
  289.  sub bx,[@@ry1]
  290.  imul bx
  291.  shl edx,16
  292.  mov dx,ax
  293.  pop ebx
  294.  sub ebx,edx                    ; normal_z = (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1)
  295.  or ebx,ebx
  296.  jl dtf_next_face               ; normal_z < 0 
  297.  
  298.  ; FIRST PICE OF FOUR ANGLE
  299.  
  300.  ; Set 3 triangel puts for texture ycoord*65536+xcoord
  301.  mov dword [@@tex_x3],127*65536+127 ;3 point
  302.  mov dword [@@tex_x2],0*65536+127   ;2 point
  303.  mov dword [@@tex_x1],0*65536+0     ;1 point
  304.  ; Set texture bitmap offset
  305.  mov [@@tex_off],texture
  306.  ; Set 3 triangel puts coordinates
  307.  mov eax,dword [@@rx3]
  308.  mov dword [@@x3],eax
  309.  mov eax,dword [@@rx2]
  310.  mov dword [@@x2],eax
  311.  mov eax,dword [@@rx1]
  312.  mov dword [@@x1],eax
  313.  call textured_triangle
  314.  
  315.  ; SECOND PICE OF FOUR ANGLE
  316.  
  317.  ; Set 3 triangel puts for texture ycoord*65536+xcoord
  318.  mov dword [@@tex_x3],127*65536+0   ;3 point
  319.  mov dword [@@tex_x2],127*65536+127 ;2 point
  320.  mov dword [@@tex_x1],0*65536+0     ;1 point
  321.  ; Set texture bitmap offset
  322.  mov [@@tex_off],texture
  323.  ; Set 3 triangel puts coordinates
  324.  mov eax,dword [@@rx4]
  325.  mov dword [@@x3],eax
  326.  mov eax,dword [@@rx3]
  327.  mov dword [@@x2],eax
  328.  mov eax,dword [@@rx1]
  329.  mov dword [@@x1],eax
  330.  call textured_triangle
  331.  
  332. dtf_next_face:
  333.  add esi,4
  334.  pop ecx
  335.  dec ecx
  336.  jnz dtf_loop
  337.  ret
  338.  
  339. ;include tex3.asm Mikolaj Felix 15/5/2001 mfelix@polbox.com
  340.  
  341. @@x1 dw 0 ;equ [bp+4]
  342. @@y1 dw 0 ;equ [bp+6]
  343. @@x2 dw 0 ;equ [bp+8]
  344. @@y2 dw 0 ;equ [bp+10]
  345. @@x3 dw 0 ;equ [bp+12]
  346. @@y3 dw 0 ;equ [bp+14]
  347.  
  348. @@tex_off dd 0 ;equ [bp+16]
  349. @@tex_x1 dw 0 ;equ [bp+18]
  350. @@tex_y1 dw 0 ;equ [bp+20]
  351. @@tex_x2 dw 0 ;equ [bp+22]
  352. @@tex_y2 dw 0 ;equ [bp+24]
  353. @@tex_x3 dw 0 ;equ [bp+26]
  354. @@tex_y3 dw 0 ;equ [bp+28]
  355.  
  356. @@dx12 dw 0 ;equ [bp-2]
  357. @@dx13 dw 0 ;equ [bp-4]
  358. @@dx23 dw 0 ;equ [bp-6]
  359.  
  360. @@tex_dx12 dw 0 ;equ [bp-8]
  361. @@tex_dy12 dw 0 ;equ [bp-10]
  362. @@tex_dx13 dw 0 ;equ [bp-12]
  363. @@tex_dy13 dw 0 ;equ [bp-14]
  364. @@tex_dx23 dw 0 ;equ [bp-16]
  365. @@tex_dy23 dw 0 ;equ [bp-18]
  366.  
  367. @@scan_x1 dw 0 ;equ [bp-20]
  368. @@scan_y1 dw 0 ;equ [bp-22]
  369. @@scan_x2 dw 0 ;equ [bp-24]
  370. @@scan_y2 dw 0 ;equ [bp-26]
  371.  
  372.  
  373. textured_triangle:
  374.  
  375.         mov ax,[@@y1]
  376.         cmp ax,[@@y3]
  377.         jb tt_check1
  378.  
  379.         xchg ax,[@@y3]
  380.         mov [@@y1],ax
  381.  
  382.         mov ax,[@@x1]
  383.         xchg ax,[@@x3]
  384.         mov [@@x1],ax
  385.  
  386.         mov ax,[@@tex_y1]
  387.         xchg ax,[@@tex_y3]
  388.         mov [@@tex_y1],ax
  389.  
  390.         mov ax,[@@tex_x1]
  391.         xchg ax,[@@tex_x3]
  392.         mov [@@tex_x1],ax
  393. tt_check1:
  394.         mov ax,[@@y2]
  395.         cmp ax,[@@y3]
  396.         jb tt_check2
  397.  
  398.         xchg ax,[@@y3]
  399.         mov [@@y2],ax
  400.  
  401.         mov ax,[@@x2]
  402.         xchg ax,[@@x3]
  403.         mov [@@x2],ax
  404.  
  405.         mov ax,[@@tex_y2]
  406.         xchg ax,[@@tex_y3]
  407.         mov [@@tex_y2],ax
  408.  
  409.         mov ax,[@@tex_x2]
  410.         xchg ax,[@@tex_x3]
  411.         mov [@@tex_x2],ax
  412. tt_check2:
  413.         mov ax,[@@y1]
  414.         cmp ax,[@@y2]
  415.         jb tt_check3
  416.  
  417.         xchg ax,[@@y2]
  418.         mov [@@y1],ax
  419.  
  420.         mov ax,[@@x1]
  421.         xchg ax,[@@x2]
  422.         mov [@@x1],ax
  423.  
  424.         mov ax,[@@tex_y1]
  425.         xchg ax,[@@tex_y2]
  426.         mov [@@tex_y1],ax
  427.  
  428.         mov ax,[@@tex_x1]
  429.         xchg ax,[@@tex_x2]
  430.         mov [@@tex_x1],ax
  431. tt_check3:
  432.  
  433.         mov bx,[@@y2]
  434.         sub bx,[@@y1]
  435.         jnz tt_dx12_make
  436.  
  437.         mov word [@@dx12],0
  438.         mov word [@@tex_dx12],0
  439.         mov word [@@tex_dy12],0
  440.         jmp tt_dx12_done
  441. tt_dx12_make:
  442.         mov ax,[@@x2]
  443.         sub ax,[@@x1]
  444.         shl ax,7
  445.         cwd
  446.         idiv bx
  447.         mov [@@dx12],ax                 ; dx12 = (x2-x1)/(y2-y1)
  448.  
  449.         mov ax,[@@tex_x2]
  450.         sub ax,[@@tex_x1]
  451.         shl ax,7
  452.         cwd
  453.         idiv bx
  454.         mov [@@tex_dx12],ax             ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)
  455.  
  456.         mov ax,[@@tex_y2]
  457.         sub ax,[@@tex_y1]
  458.         shl ax,7
  459.         cwd
  460.         idiv bx
  461.         mov [@@tex_dy12],ax             ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
  462. tt_dx12_done:
  463.  
  464.         mov bx,[@@y3]
  465.         sub bx,[@@y1]
  466.         jnz tt_dx13_make
  467.  
  468.         mov word [@@dx13],0
  469.         mov word [@@tex_dx13],0
  470.         mov word [@@tex_dy13],0
  471.         jmp tt_dx13_done
  472. tt_dx13_make:
  473.         mov ax,[@@x3]
  474.         sub ax,[@@x1]
  475.         shl ax,7
  476.         cwd
  477.         idiv bx
  478.         mov [@@dx13],ax                 ; dx13 = (x3-x1)/(y3-y1)
  479.  
  480.         mov ax,[@@tex_x3]
  481.         sub ax,[@@tex_x1]
  482.         shl ax,7
  483.         cwd
  484.         idiv bx
  485.         mov [@@tex_dx13],ax             ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)
  486.  
  487.         mov ax,[@@tex_y3]
  488.         sub ax,[@@tex_y1]
  489.         shl ax,7
  490.         cwd
  491.         idiv bx
  492.         mov [@@tex_dy13],ax             ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1)
  493. tt_dx13_done:
  494.  
  495.         mov bx,[@@y3]
  496.         sub bx,[@@y2]
  497.         jnz tt_dx23_make
  498.  
  499.         mov word [@@dx23],0
  500.         mov word [@@tex_dx23],0
  501.         mov word [@@tex_dy23],0
  502.         jmp tt_dx23_done
  503. tt_dx23_make:
  504.         mov ax,[@@x3]
  505.         sub ax,[@@x2]
  506.         shl ax,7
  507.         cwd
  508.         idiv bx
  509.         mov [@@dx23],ax                 ; dx23 = (x3-x2)/(y3-y2)
  510.  
  511.         mov ax,[@@tex_x3]
  512.         sub ax,[@@tex_x2]
  513.         shl ax,7
  514.         cwd
  515.         idiv bx
  516.         mov [@@tex_dx23],ax             ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)
  517.  
  518.         mov ax,[@@tex_y3]
  519.         sub ax,[@@tex_y2]
  520.         shl ax,7
  521.         cwd
  522.         idiv bx
  523.         mov [@@tex_dy23],ax             ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
  524. tt_dx23_done:
  525.  
  526.  
  527.         mov ax,[@@x1]
  528.         shl ax,7
  529.         mov bx,ax
  530.         mov cx,[@@y1]
  531.  
  532.         mov dx,[@@tex_x1]
  533.         shl dx,7
  534.         mov [@@scan_x1],dx
  535.         mov [@@scan_x2],dx
  536.         mov dx,[@@tex_y1]
  537.         shl dx,7
  538.         mov [@@scan_y1],dx
  539.         mov [@@scan_y2],dx
  540. tt_loop1:
  541.  pushad
  542. ;       push ax
  543. ;       push bx
  544. ;       push cx
  545.  
  546.         mov dx,[@@scan_y2]
  547.         shr dx,7
  548.         mov [@@tex_ly2],dx ;push dx
  549.         mov dx,[@@scan_x2]
  550.         shr dx,7
  551.         mov [@@tex_lx2],dx ;push dx
  552.         mov dx,[@@scan_y1]
  553.         shr dx,7
  554.         mov [@@tex_ly1],dx ;push dx
  555.         mov dx,[@@scan_x1]
  556.         shr dx,7
  557.         mov [@@tex_lx1],dx ;push dx
  558.         mov ebp,dword [@@tex_off]  ;push word ptr @@tex_off
  559.  mov [@@tex_loff],ebp
  560.  
  561.         mov [@@ly],cx ;push cx
  562.         mov dx,bx
  563.         shr dx,7
  564.         mov [@@lx2],dx ;push dx
  565.         mov dx,ax
  566.         shr dx,7
  567.         mov [@@lx1],dx ; push dx
  568.         call textured_horizontal_line
  569.  
  570. ;       pop cx
  571. ;       pop bx
  572. ;       pop ax
  573.  popad
  574.  
  575.         mov dx,[@@tex_dx13]
  576.         add [@@scan_x1],dx
  577.         mov dx,[@@tex_dx12]
  578.         add [@@scan_x2],dx
  579.         mov dx,[@@tex_dy13]
  580.         add [@@scan_y1],dx
  581.         mov dx,[@@tex_dy12]
  582.         add [@@scan_y2],dx
  583.  
  584.         add ax,[@@dx13]
  585.         add bx,[@@dx12]
  586.         inc cx
  587.         cmp cx,[@@y2]
  588.         jb tt_loop1
  589.  
  590.         mov bx,[@@x2]
  591.         shl bx,7
  592.         mov cx,[@@y2]
  593.  
  594.         mov dx,[@@tex_x2]
  595.         shl dx,7
  596.         mov [@@scan_x2],dx
  597.         mov dx,[@@tex_y2]
  598.         shl dx,7
  599.         mov [@@scan_y2],dx
  600. tt_loop2:
  601.  
  602.  pushad
  603. ;       push ax
  604. ;       push bx
  605. ;       push cx
  606.  
  607.         mov dx,[@@scan_y2]
  608.         shr dx,7
  609.         mov [@@tex_ly2],dx ;push dx
  610.         mov dx,[@@scan_x2]
  611.         shr dx,7
  612.         mov [@@tex_lx2],dx ;push dx
  613.         mov dx,[@@scan_y1]
  614.         shr dx,7
  615.         mov [@@tex_ly1],dx ;push dx
  616.         mov dx,[@@scan_x1]
  617.         shr dx,7
  618.         mov [@@tex_lx1],dx ;push dx
  619.         mov ebp,dword [@@tex_off]  ;push word ptr @@tex_off
  620.  mov [@@tex_loff],ebp
  621.  
  622.         mov [@@ly],cx ;push cx
  623.         mov dx,bx
  624.         shr dx,7
  625.         mov [@@lx2],dx ;push dx
  626.         mov dx,ax
  627.         shr dx,7
  628.         mov [@@lx1],dx ; push dx
  629.         call textured_horizontal_line
  630.  
  631. ;       pop cx
  632. ;       pop bx
  633. ;       pop ax
  634.  popad
  635.  
  636.         mov dx,[@@tex_dx13]
  637.         add [@@scan_x1],dx
  638.         mov dx,[@@tex_dx23]
  639.         add [@@scan_x2],dx
  640.         mov dx,[@@tex_dy13]
  641.         add [@@scan_y1],dx
  642.         mov dx,[@@tex_dy23]
  643.         add [@@scan_y2],dx
  644.  
  645.         add ax,[@@dx13]
  646.         add bx,[@@dx23]
  647.         inc cx
  648.         cmp cx,[@@y3]
  649.         jb tt_loop2
  650.         ret
  651.  
  652. @@lx1 dw 0 ;equ [bp+4]
  653. @@lx2 dw 0 ;equ [bp+6]
  654. @@ly dw 0 ;equ [bp+8]
  655.  
  656. @@tex_loff dd 0 ;equ [bp+10]
  657. @@tex_lx1 dw 0 ;equ [bp+12]
  658. @@tex_ly1 dw 0 ;equ [bp+14]
  659. @@tex_lx2 dw 0 ;equ [bp+16]
  660. @@tex_ly2 dw 0 ;equ [bp+18]
  661.  
  662. @@tex_ldx dw 0 ;equ [bp-2]
  663. @@tex_ldy dw 0 ;equ [bp-4]
  664.  
  665. textured_horizontal_line:
  666.  
  667.         mov ax,[@@lx1]
  668.         cmp ax,[@@lx2]
  669.         je thl_quit
  670.         jb thl_ok
  671.  
  672.         xchg ax,[@@lx2]
  673.         mov [@@lx1],ax
  674.  
  675.         mov ax,[@@tex_lx1]
  676.         xchg ax,[@@tex_lx2]
  677.         mov [@@tex_lx1],ax
  678.  
  679.         mov ax,[@@tex_ly1]
  680.         xchg ax,[@@tex_ly2]
  681.         mov [@@tex_ly1],ax
  682. thl_ok:
  683.  
  684.  ; Fast method
  685. ; mov edi,0
  686. ;       mov di,[@@ly]  ;edi = calculating start of line
  687. ;       mov ax,di
  688. ;       shl di,6  ;ly*64
  689. ;       shl ax,8  ;ly*256
  690. ;       add di,ax    ;di = (ly*64)+(ly*256)
  691. ;       add di,[@@lx1] ;di = ly*320+lx1
  692. ; mov eax,edi
  693. ; shl eax,1
  694. ; add edi,eax
  695. ; add edi,scrbuf
  696.  
  697.  ; Uneversal method
  698.  movsx edi,[@@ly]
  699.  mov eax,800   ;di = ly*320+lx1
  700.  mul edi
  701.  movsx ebx,[@@lx1]
  702.  add eax,ebx ;[@@lx1]
  703.  mov edi,3
  704.  mul edi
  705.  mov edi,eax
  706.  add edi,scrbuf
  707.  
  708.         mov cx,[@@lx2]
  709.         sub cx,[@@lx1]
  710.  
  711.         mov ax,[@@tex_lx2]
  712.         sub ax,[@@tex_lx1]
  713.         shl ax,7
  714.         cwd
  715.         idiv cx
  716.         mov [@@tex_ldx],ax                      ; tex_dx = (tex_x2-tex_x1)/(x2-x1)
  717.  
  718.         mov ax,[@@tex_ly2]
  719.         sub ax,[@@tex_ly1]
  720.         shl ax,7
  721.         cwd
  722.         idiv cx
  723.         mov [@@tex_ldy],ax                      ; tex_dy = (tex_y2-tex_y1)/(x2-x1)
  724.  
  725.         cld
  726.         inc cx
  727.         mov ax,[@@tex_lx1]
  728.         shl ax,7
  729.         mov bx,[@@tex_ly1]
  730.         shl bx,7
  731.  
  732. thl_loop:
  733.         mov dx,ax
  734.         push bx
  735.  
  736.         and bx,0ff80h
  737.         shr ax,7
  738.         add bx,ax
  739.  mov ebp,0
  740.  mov bp,bx
  741.  mov eax,ebp
  742.  shl eax,1
  743.  add ebp,eax
  744.         add ebp,[@@tex_loff]
  745.  
  746.         mov al,byte [ebp+2]
  747.         stosb
  748.         mov al,byte [ebp+1]
  749.         stosb
  750.         mov al,byte [ebp]
  751.         stosb
  752.  
  753.         pop bx
  754.         mov ax,dx
  755.  
  756.         add ax,[@@tex_ldx]
  757.         add bx,[@@tex_ldy]
  758.         dec cx
  759.         jnz thl_loop
  760. thl_quit:
  761.         ret
  762.  
  763. ;include math3d_2.asm
  764. ; Mikolaj Felix 20/06/2001
  765. ; mfelix@polbox.com
  766.  
  767. ;------------------------------------------------------------
  768. ;       ds:si   - offset to angles (int)
  769. ;       ds:di   - offset to array of 3d points
  770. ;       cx      - number of points
  771. ;------------------------------------------------------------
  772.  
  773. @@sin_x dd 0 ;equ dword ptr [bp-4]
  774. @@cos_x dd 0 ;equ dword ptr [bp-8]
  775. @@sin_y dd 0 ;equ dword ptr [bp-12]
  776. @@cos_y dd 0 ;equ dword ptr [bp-16]
  777. @@sin_z dd 0 ;equ dword ptr [bp-20]
  778. @@cos_z dd 0 ;equ dword ptr [bp-24]
  779.  
  780. @@x equ dword [edi]
  781. @@y equ dword [edi+4]
  782. @@z equ dword [edi+8]
  783.  
  784. rotate_points:
  785.  
  786.         push edi
  787.         mov edi,@@sin_x
  788.         mov edx,3
  789. rp_sin_cos:
  790.         mov bx,word [esi]
  791.         and bx,MAX_DEGS-1
  792.         shl bx,2
  793.         mov eax,dword [sintab+bx]      
  794.         mov dword [edi],eax
  795.         mov eax,dword [costab+bx]
  796.         mov dword [edi+4],eax
  797.         add edi,8
  798.         add esi,2
  799.         dec edx
  800.         jnz rp_sin_cos
  801.         pop edi
  802.  
  803. rp_rotate:
  804.         fld @@y
  805.         fmul [@@cos_x]
  806.         fld @@z
  807.         fmul [@@sin_x]
  808.         fsubp st1,st
  809.         fld @@y
  810.         fxch st1
  811.         fstp @@y                        ; Yrotated = Cos (A)*Y - Sin (A)*Z
  812.         fmul [@@sin_x]
  813.         fld @@z
  814.         fmul [@@cos_x]
  815.         faddp st1,st
  816.         fstp @@z                        ; Zrotated = Sin (A)*Y + Cos (A)*Z
  817.        
  818.         fld @@x
  819.         fmul [@@cos_y]
  820.         fld @@z
  821.         fmul [@@sin_y]
  822.         fsubp st1,st
  823.         fld @@x
  824.         fxch st1
  825.         fstp @@x                        ; Xrotated = Cos (A)*X - Sin (A)*Z
  826.         fmul [@@sin_y]
  827.         fld @@z
  828.         fmul [@@cos_y]
  829.         faddp st1,st
  830.         fstp @@z                        ; Zrotated = Sin (A)*X + Cos (A)*Z
  831.        
  832.         fld @@x
  833.         fmul [@@cos_z]
  834.         fld @@y
  835.         fmul [@@sin_z]
  836.         fsubp st1,st
  837.         fld @@x
  838.         fxch st1
  839.         fstp @@x                        ; Xrotated = Cos (A)*X - Sin (A)*Y
  840.         fmul [@@sin_z]
  841.         fld @@y
  842.         fmul [@@cos_z]
  843.         faddp st1,st
  844.         fstp @@y                        ; Yrotated = Sin (A)*X + Cos (A)*Y
  845.  
  846.         add edi,12
  847.         dec ecx
  848.         jnz rp_rotate
  849.         ret
  850.                                        
  851. ;------------------------------------------------------------
  852. ;       ds:si   - offset to array of 3d points
  853. ;       ds:di   - offset to 2d points
  854. ;       cx      - number of points
  855. ;------------------------------------------------------------
  856.  
  857. translate_points:
  858.  
  859.         fld dword [esi+8]
  860.         fadd [perspective]
  861.  
  862.         fld dword [esi]
  863.         fmul [perspective]
  864.         fdiv st,st1
  865.         fadd [correct_x]
  866.         fistp word [edi]                ; x2d = (x*persp)/(z+persp)+correct_x
  867.  
  868.         fld dword [esi+4]
  869.         fmul [perspective]
  870.         fdivrp st1,st
  871.         fadd [correct_y]
  872.         fistp word [edi+2]              ; y2d = (y*persp)/(z+persp)+correct_y
  873.  
  874.         add esi,12
  875.         add edi,4
  876.  dec ecx
  877.  jnz translate_points
  878.  ret
  879.  
  880. ; initalize SIN&COS table
  881.  
  882. @@temp1 dd 0 ;dword ptr [bp-4]
  883. @@temp2 dd 0 ;dword ptr [bp-8]
  884.  
  885. init_sincos:
  886.         mov [@@temp1],0
  887.         fldpi
  888.         mov [@@temp2],MAX_DEGS/2
  889.         fidiv [@@temp2]
  890.         fstp [@@temp2]
  891.  
  892.         xor edi,edi
  893.         mov ecx,MAX_DEGS
  894. isc_loop:
  895.         fld [@@temp1]
  896.         fld st0
  897.         fld st0
  898.         fsin
  899.         fstp dword [sintab+edi]
  900.         fcos
  901.         fstp dword [costab+edi]
  902.         fadd [@@temp2]
  903.         fstp [@@temp1]
  904.  
  905.         add edi,4
  906.         dec ecx
  907.         jnz isc_loop
  908.         ret
  909.  
  910. perspective dd 256.0
  911. correct_x dd 400.0
  912. correct_y dd 300.0
  913.  
  914. angle_x dw 0
  915. angle_y dw 0
  916. angle_z dw 0
  917.  
  918. file_texture:
  919. file 'texture.raw'
  920.  
  921. cube    dw -50,-50,50, 50,-50,50, 50,50,50, -50,50,50  
  922.         dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50
  923.  
  924. link db 0,1,2,3, 5,4,7,6, 1,5,6,2, 4,0,3,7, 4,5,1,0, 3,2,6,7
  925.  
  926. sintab:
  927. rd MAX_DEGS
  928. costab:
  929. rd MAX_DEGS
  930.  
  931. cube_rotated:
  932. rd MAX_POINTS*3
  933. coord2d:
  934. rw MAX_POINTS*2
  935. texture:
  936. rb 128*128*3
  937. scrbuf:
  938.  
  939. I_END: