Subversion Repositories Kolibri OS

Rev

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