;
; 9 Ver Screen saver
; 5 Ver 24 bit texture.
; 23/8/2004
; Pavlushin Evgeni 3d cube screen saver
; mail: waptap@mail.ru       site: www.deck4.narod.ru
;
; This programm develop on sample text3d to Mikolaj Felix 25/5/2001
; mfelix@polbox.com
;

use32
               org     0x0
               db     'MENUET01'              ; 8 byte id
               dd     0x01                    ; header version
               dd     START                   ; start of code
               dd     I_END                   ; size of image
               dd     0x200000                ; memory for app
               dd     0x200000                ; esp
               dd     0x0 , 0x0               ; I_Param , I_Icon

include 'lang.inc'
MAX_DEGS equ 512 ;quantity of angels 2^n.Minimize for speedup
MAX_POINTS equ 8 ;quantity of points
MAX_FACES equ 6  ;quantity of points

START:
    finit
    call draw_window
    call clear_screen
    call init_sincos

still:
    mov eax,23  ; wait for system event with 2 ms timeout
    mov ebx,2   ; wait 2 ms, then continue
    int  0x40

;    mov eax,11 ;If you want maximum speed! :)
;    int 0x40

    dec  eax                  ; window redraw request ?
    je   red
    dec  eax                  ; key in buffer ?
    je   key
    dec  eax                  ; button in buffer ?
    je   button

main_loop:
 call fade_texture

	mov esi,cube
	mov edi,cube_rotated
	mov ecx,MAX_POINTS*3
copy_object:
 fild word [esi]
 fstp dword [edi]
 add esi,2
 add edi,4
 dec ecx
 jnz copy_object

 mov esi,angle_x
 mov edi,cube_rotated
 mov ecx,MAX_POINTS
 call rotate_points
	
 mov esi,cube_rotated
 mov edi,coord2d
 mov ecx,MAX_POINTS
 call translate_points

 call draw_textured_faces
 call clear_screen_buffer

 add [angle_x],1
 add [angle_y],3
 add [angle_z],1

 jmp still

red:
     call draw_window
     jmp still
key:
     mov eax,2
     jmp exit
button:
     mov eax,17
     int 0x40
     cmp ah,1
     jne still
exit:
     mov eax,-1
     int 0x40

;Draw window
draw_window:
    mov eax,12  ;Start
    mov ebx,1
    int 0x40

    mov eax,0   ;Draw window
    mov ebx,0*65536+(799) ;x start*65536+x size
    mov ecx,0*65536+(599) ;y start*65536+y size
    mov edx,0x00000000         ;0x03 use skinned window
    int 0x40

    call clear_screen

    mov eax,12  ;End
    mov ebx,2
    int 0x40
    ret

head_label: db "3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR MENUETOS. USE "
            db "800x600 SCREEN MODE FROM VIEW. PRESS ANY KEY FOR EXIT"
hl_end:

;FADE IN FADE OUT TEXTURE

x_step db 0
x_num  db 1

fade_texture:
 mov ecx,0
loox:
 mov al,[file_texture+ecx]
 mov [texture+ecx],al
 inc ecx
 cmp ecx,128*128*3
 jnae loox

 mov ecx,0
loox2:
 mov al,[file_texture+ecx]
 cmp [x_step],al
 jae xxx
 sub al,[x_step]
 jmp nnn
xxx:
 mov al,0
nnn:
 mov [texture+ecx],al
 inc ecx
 cmp ecx,128*128*3
 jnae loox2

 cmp [x_step],255
 jne no_max
 mov [x_num],-1
no_max:
 cmp [x_step],0
 jne no_min
 mov [x_num],1
no_min:
 mov al,[x_num]
 add [x_step],al
 ret

; Clear Screen
clear_screen:
 mov eax,13
 mov ebx,0*65536+800
 mov ecx,0*65536+600
 mov edx,0
 int 40h

 mov eax,4   ;Out Text
 mov ebx,8*65536+8          ;x start*65536+y start
 mov ecx,0x00ffffff         ;color White
 mov edx,head_label
 mov esi,hl_end-head_label
 int 0x40
 ret

clear_screen_buffer:
 mov ebx,scrbuf
 mov ecx,800*65536+(600-40)  ;sub 40 for antiflickering title
 mov edx,0*65536+40
 mov eax,7
 int 0x40

 mov eax,4   ;Out Text
 mov ebx,8*65536+580          ;x start*65536+y start
 mov ebp,[n_step]
 shl ebp,16
 sub ebx,ebp
 mov ecx,0x0000ff00         ;color White
 mov edx,move_text
 add edx,[step]
 mov esi,130 ;mt_end-move_text
 int 0x40

 inc [n_step]
 cmp [n_step],6
 jna t_ok
 mov [n_step],0
 inc [step]
 cmp [step],mt_end-move_text-130
 jng t_ok
 mov [step],0
t_ok:

 mov edi,scrbuf
 mov eax,0  ;black background
 mov ecx,800*600*3/4 ; 16000
 cld
 rep stosd
 ret

n_step dd 0
step dd 0

move_text: db "                                            "
           db "                                            "
           db "                                            "
           db "***** 3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR "
           db "MENUET OS. SET 800x600 SCREEN MODE FROM VIEW THIS SCREEN "
           db "SAVER *****                                        "
           db "SITE OF THE RUSSIAN DEVELOPERS TO MENUETOS: "
           db "www.menuet.narod.ru                         "
           db "RUSSIAN MENUET APLICATION ARCHIVE PAGE ON: "
           db "www.meosfiles.narod.ru                      "
           db "AUTOR OF THIS SCREEN SAVER Pavlushin Evgeni "
           db "MY SITE: www.deck4.narod.ru (Slow update)   "
           db "AND MAIL BOX: waptap@mail.ru                "
           db "THANK YOU FOR USE!                          "
           db "                                            "
           db "                                            "
           db "                                            "
mt_end:


;include graphlib.asm Mikolaj Felix 9/12/2000 mfelix@polbox.com
;Draw textured faces proc

@@rx1 dw 0 ;equ [bp-2]
@@ry1 dw 0 ;equ [bp-4]
@@rx2 dw 0 ;equ [bp-6]
@@ry2 dw 0 ;equ [bp-8]
@@rx3 dw 0 ;equ [bp-10]
@@ry3 dw 0 ;equ [bp-12]
@@rx4 dw 0 ;equ [bp-14]
@@ry4 dw 0 ;equ [bp-16]

draw_textured_faces:
	
 mov esi,link
 mov ecx,MAX_FACES
dtf_loop:
 push ecx

 xor ebx,ebx
 mov bl,byte [esi]		; point 1
 shl bx,2
 mov eax,dword [coord2d+bx] ;COPY 1 FOURANGLE POINT
 mov dword [@@rx1],eax

 xor ebx,ebx
 mov bl,byte [esi+1]		; point 2
 shl bx,2
 mov eax,dword [coord2d+bx] ;COPY 2 FOURANGLE POINT
 mov dword [@@rx2],eax

 xor ebx,ebx
 mov bl,byte [esi+2]		; point 3
 shl bx,2
 mov eax,dword [coord2d+bx] ;COPY 3 FOURANGLE POINT
 mov dword [@@rx3],eax

 xor bh,bh			; point 4
 mov bl,byte [esi+3]
 shl bx,2
 mov eax,dword [coord2d+bx] ;COPY 4 FOURANGLE POINT
 mov dword [@@rx4],eax

 mov ax,[@@ry1]
 sub ax,[@@ry3]
 mov bx,[@@rx2]
 sub bx,[@@rx1]
 imul bx
 shl edx,16
 mov dx,ax
 push edx
 mov ax,[@@rx1]
 sub ax,[@@rx3]
 mov bx,[@@ry2]
 sub bx,[@@ry1]
 imul bx
 shl edx,16
 mov dx,ax
 pop ebx
 sub ebx,edx			; normal_z = (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1)
 or ebx,ebx
 jl dtf_next_face		; normal_z < 0	

 ; FIRST PICE OF FOUR ANGLE

 ; Set 3 triangel puts for texture ycoord*65536+xcoord
 mov dword [@@tex_x3],127*65536+127 ;3 point
 mov dword [@@tex_x2],0*65536+127   ;2 point
 mov dword [@@tex_x1],0*65536+0     ;1 point
 ; Set texture bitmap offset
 mov [@@tex_off],texture
 ; Set 3 triangel puts coordinates
 mov eax,dword [@@rx3]
 mov dword [@@x3],eax
 mov eax,dword [@@rx2]
 mov dword [@@x2],eax
 mov eax,dword [@@rx1]
 mov dword [@@x1],eax
 call textured_triangle

 ; SECOND PICE OF FOUR ANGLE

 ; Set 3 triangel puts for texture ycoord*65536+xcoord
 mov dword [@@tex_x3],127*65536+0   ;3 point
 mov dword [@@tex_x2],127*65536+127 ;2 point
 mov dword [@@tex_x1],0*65536+0     ;1 point
 ; Set texture bitmap offset
 mov [@@tex_off],texture
 ; Set 3 triangel puts coordinates
 mov eax,dword [@@rx4]
 mov dword [@@x3],eax
 mov eax,dword [@@rx3]
 mov dword [@@x2],eax
 mov eax,dword [@@rx1]
 mov dword [@@x1],eax
 call textured_triangle

dtf_next_face:
 add esi,4
 pop ecx
 dec ecx
 jnz dtf_loop
 ret

;include tex3.asm Mikolaj Felix 15/5/2001 mfelix@polbox.com

@@x1 dw 0 ;equ [bp+4]
@@y1 dw 0 ;equ [bp+6]
@@x2 dw 0 ;equ [bp+8]
@@y2 dw 0 ;equ [bp+10]
@@x3 dw 0 ;equ [bp+12]
@@y3 dw 0 ;equ [bp+14]

@@tex_off dd 0 ;equ [bp+16]
@@tex_x1 dw 0 ;equ [bp+18]
@@tex_y1 dw 0 ;equ [bp+20]
@@tex_x2 dw 0 ;equ [bp+22]
@@tex_y2 dw 0 ;equ [bp+24]
@@tex_x3 dw 0 ;equ [bp+26]
@@tex_y3 dw 0 ;equ [bp+28]

@@dx12 dw 0 ;equ [bp-2]
@@dx13 dw 0 ;equ [bp-4]
@@dx23 dw 0 ;equ [bp-6]

@@tex_dx12 dw 0 ;equ [bp-8]
@@tex_dy12 dw 0 ;equ [bp-10]
@@tex_dx13 dw 0 ;equ [bp-12]
@@tex_dy13 dw 0 ;equ [bp-14]
@@tex_dx23 dw 0 ;equ [bp-16]
@@tex_dy23 dw 0 ;equ [bp-18]

@@scan_x1 dw 0 ;equ [bp-20]
@@scan_y1 dw 0 ;equ [bp-22]
@@scan_x2 dw 0 ;equ [bp-24]
@@scan_y2 dw 0 ;equ [bp-26]


textured_triangle:

	mov ax,[@@y1]
	cmp ax,[@@y3]
	jb tt_check1

	xchg ax,[@@y3]
	mov [@@y1],ax

	mov ax,[@@x1]
	xchg ax,[@@x3]
	mov [@@x1],ax

	mov ax,[@@tex_y1]
	xchg ax,[@@tex_y3]
	mov [@@tex_y1],ax

	mov ax,[@@tex_x1]
	xchg ax,[@@tex_x3]
	mov [@@tex_x1],ax
tt_check1:
	mov ax,[@@y2]
	cmp ax,[@@y3]
	jb tt_check2

	xchg ax,[@@y3]
	mov [@@y2],ax

	mov ax,[@@x2]
	xchg ax,[@@x3]
	mov [@@x2],ax

	mov ax,[@@tex_y2]
	xchg ax,[@@tex_y3]
	mov [@@tex_y2],ax

	mov ax,[@@tex_x2]
	xchg ax,[@@tex_x3]
	mov [@@tex_x2],ax
tt_check2:
	mov ax,[@@y1]
	cmp ax,[@@y2]
	jb tt_check3

	xchg ax,[@@y2]
	mov [@@y1],ax

	mov ax,[@@x1]
	xchg ax,[@@x2]
	mov [@@x1],ax

	mov ax,[@@tex_y1]
	xchg ax,[@@tex_y2]
	mov [@@tex_y1],ax

	mov ax,[@@tex_x1]
	xchg ax,[@@tex_x2]
	mov [@@tex_x1],ax
tt_check3:

	mov bx,[@@y2]
	sub bx,[@@y1]
	jnz tt_dx12_make

	mov word [@@dx12],0
	mov word [@@tex_dx12],0
	mov word [@@tex_dy12],0
	jmp tt_dx12_done
tt_dx12_make:
	mov ax,[@@x2]
	sub ax,[@@x1]
	shl ax,7
	cwd
	idiv bx
	mov [@@dx12],ax			; dx12 = (x2-x1)/(y2-y1)

	mov ax,[@@tex_x2]
	sub ax,[@@tex_x1]
	shl ax,7
	cwd
	idiv bx
	mov [@@tex_dx12],ax		; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)

	mov ax,[@@tex_y2]
	sub ax,[@@tex_y1]
	shl ax,7
	cwd
	idiv bx
	mov [@@tex_dy12],ax		; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
tt_dx12_done:

	mov bx,[@@y3]
	sub bx,[@@y1]
	jnz tt_dx13_make

	mov word [@@dx13],0
	mov word [@@tex_dx13],0
	mov word [@@tex_dy13],0
	jmp tt_dx13_done
tt_dx13_make:
	mov ax,[@@x3]
	sub ax,[@@x1]
	shl ax,7
	cwd
	idiv bx
	mov [@@dx13],ax			; dx13 = (x3-x1)/(y3-y1)

	mov ax,[@@tex_x3]
	sub ax,[@@tex_x1]
	shl ax,7
	cwd
	idiv bx
	mov [@@tex_dx13],ax		; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)

	mov ax,[@@tex_y3]
	sub ax,[@@tex_y1]
	shl ax,7
	cwd
	idiv bx
	mov [@@tex_dy13],ax		; tex_dy13 = (tex_y3-tex_x1)/(y3-y1)
tt_dx13_done:

	mov bx,[@@y3]
	sub bx,[@@y2]
	jnz tt_dx23_make

	mov word [@@dx23],0
	mov word [@@tex_dx23],0
	mov word [@@tex_dy23],0
	jmp tt_dx23_done
tt_dx23_make:
	mov ax,[@@x3]
	sub ax,[@@x2]
	shl ax,7
	cwd
	idiv bx
	mov [@@dx23],ax			; dx23 = (x3-x2)/(y3-y2)

	mov ax,[@@tex_x3]
	sub ax,[@@tex_x2]
	shl ax,7
	cwd
	idiv bx
	mov [@@tex_dx23],ax		; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)

	mov ax,[@@tex_y3]
	sub ax,[@@tex_y2]
	shl ax,7
	cwd
	idiv bx
	mov [@@tex_dy23],ax		; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
tt_dx23_done:


	mov ax,[@@x1]
	shl ax,7
	mov bx,ax
	mov cx,[@@y1]

	mov dx,[@@tex_x1]
	shl dx,7
	mov [@@scan_x1],dx
	mov [@@scan_x2],dx
	mov dx,[@@tex_y1]
	shl dx,7
	mov [@@scan_y1],dx
	mov [@@scan_y2],dx
tt_loop1:
 pushad
;	push ax
;	push bx
;	push cx

	mov dx,[@@scan_y2]
	shr dx,7
	mov [@@tex_ly2],dx ;push dx
	mov dx,[@@scan_x2]
	shr dx,7
	mov [@@tex_lx2],dx ;push dx
	mov dx,[@@scan_y1]
	shr dx,7
	mov [@@tex_ly1],dx ;push dx
	mov dx,[@@scan_x1]
	shr dx,7
	mov [@@tex_lx1],dx ;push dx
	mov ebp,dword [@@tex_off]  ;push word ptr @@tex_off
 mov [@@tex_loff],ebp

	mov [@@ly],cx ;push cx
	mov dx,bx
	shr dx,7
	mov [@@lx2],dx ;push dx
	mov dx,ax
	shr dx,7
	mov [@@lx1],dx ; push dx
	call textured_horizontal_line

;	pop cx
;	pop bx
;	pop ax
 popad

	mov dx,[@@tex_dx13]
	add [@@scan_x1],dx
	mov dx,[@@tex_dx12]
	add [@@scan_x2],dx
	mov dx,[@@tex_dy13]
	add [@@scan_y1],dx
	mov dx,[@@tex_dy12]
	add [@@scan_y2],dx

	add ax,[@@dx13]
	add bx,[@@dx12]
	inc cx
	cmp cx,[@@y2]
	jb tt_loop1

	mov bx,[@@x2]
	shl bx,7
	mov cx,[@@y2]

	mov dx,[@@tex_x2]
	shl dx,7
	mov [@@scan_x2],dx
	mov dx,[@@tex_y2]
	shl dx,7
	mov [@@scan_y2],dx
tt_loop2:

 pushad
;	push ax
;	push bx
;	push cx

	mov dx,[@@scan_y2]
	shr dx,7
	mov [@@tex_ly2],dx ;push dx
	mov dx,[@@scan_x2]
	shr dx,7
	mov [@@tex_lx2],dx ;push dx
	mov dx,[@@scan_y1]
	shr dx,7
	mov [@@tex_ly1],dx ;push dx
	mov dx,[@@scan_x1]
	shr dx,7
	mov [@@tex_lx1],dx ;push dx
	mov ebp,dword [@@tex_off]  ;push word ptr @@tex_off
 mov [@@tex_loff],ebp

	mov [@@ly],cx ;push cx
	mov dx,bx
	shr dx,7
	mov [@@lx2],dx ;push dx
	mov dx,ax
	shr dx,7
	mov [@@lx1],dx ; push dx
	call textured_horizontal_line

;	pop cx
;	pop bx
;	pop ax
 popad

	mov dx,[@@tex_dx13]
	add [@@scan_x1],dx
	mov dx,[@@tex_dx23]
	add [@@scan_x2],dx
	mov dx,[@@tex_dy13]
	add [@@scan_y1],dx
	mov dx,[@@tex_dy23]
	add [@@scan_y2],dx

	add ax,[@@dx13]
	add bx,[@@dx23]
	inc cx
	cmp cx,[@@y3]
	jb tt_loop2
	ret

@@lx1 dw 0 ;equ [bp+4]
@@lx2 dw 0 ;equ [bp+6]
@@ly dw 0 ;equ [bp+8]

@@tex_loff dd 0 ;equ [bp+10]
@@tex_lx1 dw 0 ;equ [bp+12]
@@tex_ly1 dw 0 ;equ [bp+14]
@@tex_lx2 dw 0 ;equ [bp+16]
@@tex_ly2 dw 0 ;equ [bp+18]

@@tex_ldx dw 0 ;equ [bp-2]
@@tex_ldy dw 0 ;equ [bp-4]

textured_horizontal_line:

	mov ax,[@@lx1]
	cmp ax,[@@lx2]
	je thl_quit
	jb thl_ok

	xchg ax,[@@lx2]
	mov [@@lx1],ax

	mov ax,[@@tex_lx1]
	xchg ax,[@@tex_lx2]
	mov [@@tex_lx1],ax

	mov ax,[@@tex_ly1]
	xchg ax,[@@tex_ly2]
	mov [@@tex_ly1],ax
thl_ok:

 ; Fast method
; mov edi,0
;	mov di,[@@ly]  ;edi = calculating start of line
;	mov ax,di
;	shl di,6  ;ly*64
;	shl ax,8  ;ly*256
;	add di,ax    ;di = (ly*64)+(ly*256)
;	add di,[@@lx1] ;di = ly*320+lx1
; mov eax,edi
; shl eax,1
; add edi,eax
; add edi,scrbuf

 ; Uneversal method
 movsx edi,[@@ly]
 mov eax,800   ;di = ly*320+lx1
 mul edi
 movsx ebx,[@@lx1]
 add eax,ebx ;[@@lx1]
 mov edi,3
 mul edi
 mov edi,eax
 add edi,scrbuf

	mov cx,[@@lx2]
	sub cx,[@@lx1]

	mov ax,[@@tex_lx2]
	sub ax,[@@tex_lx1]
	shl ax,7
	cwd
	idiv cx
	mov [@@tex_ldx],ax			; tex_dx = (tex_x2-tex_x1)/(x2-x1)

	mov ax,[@@tex_ly2]
	sub ax,[@@tex_ly1]
	shl ax,7
	cwd
	idiv cx
	mov [@@tex_ldy],ax			; tex_dy = (tex_y2-tex_y1)/(x2-x1)

	cld
	inc cx
	mov ax,[@@tex_lx1]
	shl ax,7
	mov bx,[@@tex_ly1]
	shl bx,7

thl_loop:
	mov dx,ax
	push bx

	and bx,0ff80h
	shr ax,7
	add bx,ax
 mov ebp,0
 mov bp,bx
 mov eax,ebp
 shl eax,1
 add ebp,eax
	add ebp,[@@tex_loff]

	mov al,byte [ebp+2]
	stosb
	mov al,byte [ebp+1]
	stosb
	mov al,byte [ebp]
	stosb

	pop bx
	mov ax,dx

	add ax,[@@tex_ldx]
	add bx,[@@tex_ldy]
	dec cx
	jnz thl_loop
thl_quit:
	ret

;include math3d_2.asm
; Mikolaj Felix 20/06/2001
; mfelix@polbox.com

;------------------------------------------------------------
;	ds:si	- offset to angles (int)
;	ds:di	- offset to array of 3d points
;	cx	- number of points
;------------------------------------------------------------

@@sin_x dd 0 ;equ dword ptr [bp-4]
@@cos_x dd 0 ;equ dword ptr [bp-8]
@@sin_y dd 0 ;equ dword ptr [bp-12]
@@cos_y dd 0 ;equ dword ptr [bp-16]
@@sin_z dd 0 ;equ dword ptr [bp-20]
@@cos_z dd 0 ;equ dword ptr [bp-24]

@@x equ dword [edi]
@@y equ dword [edi+4]
@@z equ dword [edi+8]

rotate_points:

	push edi
	mov edi,@@sin_x
	mov edx,3
rp_sin_cos:
	mov bx,word [esi]
	and bx,MAX_DEGS-1
	shl bx,2
	mov eax,dword [sintab+bx] 	
	mov dword [edi],eax
	mov eax,dword [costab+bx]
	mov dword [edi+4],eax
	add edi,8
	add esi,2
	dec edx
	jnz rp_sin_cos
	pop edi

rp_rotate:
	fld @@y
	fmul [@@cos_x]
	fld @@z
	fmul [@@sin_x]
	fsubp st1,st
	fld @@y
	fxch st1
	fstp @@y			; Yrotated = Cos (A)*Y - Sin (A)*Z
	fmul [@@sin_x]
	fld @@z
	fmul [@@cos_x]
	faddp st1,st
	fstp @@z			; Zrotated = Sin (A)*Y + Cos (A)*Z
	
	fld @@x
	fmul [@@cos_y]
	fld @@z
	fmul [@@sin_y]
	fsubp st1,st
	fld @@x
	fxch st1
	fstp @@x			; Xrotated = Cos (A)*X - Sin (A)*Z
	fmul [@@sin_y]
	fld @@z
	fmul [@@cos_y]
	faddp st1,st
	fstp @@z			; Zrotated = Sin (A)*X + Cos (A)*Z
	
	fld @@x
	fmul [@@cos_z]
	fld @@y
	fmul [@@sin_z]
	fsubp st1,st
	fld @@x
	fxch st1
	fstp @@x			; Xrotated = Cos (A)*X - Sin (A)*Y
	fmul [@@sin_z]
	fld @@y
	fmul [@@cos_z]
	faddp st1,st
	fstp @@y			; Yrotated = Sin (A)*X + Cos (A)*Y

	add edi,12
	dec ecx
	jnz rp_rotate
	ret
					
;------------------------------------------------------------
;	ds:si	- offset to array of 3d points
;	ds:di	- offset to 2d points
;	cx	- number of points
;------------------------------------------------------------

translate_points:

	fld dword [esi+8]
	fadd [perspective]

	fld dword [esi]
	fmul [perspective]
	fdiv st,st1
	fadd [correct_x]
	fistp word [edi]		; x2d = (x*persp)/(z+persp)+correct_x

	fld dword [esi+4]
	fmul [perspective]
	fdivrp st1,st
	fadd [correct_y]
	fistp word [edi+2]		; y2d = (y*persp)/(z+persp)+correct_y

	add esi,12
	add edi,4
 dec ecx
 jnz translate_points
 ret

; initalize SIN&COS table

@@temp1 dd 0 ;dword ptr [bp-4]
@@temp2 dd 0 ;dword ptr [bp-8]

init_sincos:
	mov [@@temp1],0
	fldpi
	mov [@@temp2],MAX_DEGS/2
	fidiv [@@temp2]
	fstp [@@temp2]

	xor edi,edi
	mov ecx,MAX_DEGS
isc_loop:
	fld [@@temp1]
	fld st0
	fld st0
	fsin
	fstp dword [sintab+edi]
	fcos
	fstp dword [costab+edi]
	fadd [@@temp2]
	fstp [@@temp1]

	add edi,4
	dec ecx
	jnz isc_loop
	ret

perspective dd 256.0
correct_x dd 400.0
correct_y dd 300.0

angle_x dw 0
angle_y dw 0
angle_z dw 0

file_texture:
file 'texture.raw'

cube	dw -50,-50,50, 50,-50,50, 50,50,50, -50,50,50	
    	dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50

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

sintab:
rd MAX_DEGS
costab:
rd MAX_DEGS

cube_rotated:
rd MAX_POINTS*3
coord2d:
rw MAX_POINTS*2
texture:
rb 128*128*3
scrbuf:

I_END: