
        ;CONST
                ile_gene=2 ;number of cycles dither proccy

;gouraudIs=1

; BIT-SORT
; CALCULATE-VERTEX-NORMALS
; SQRT
; MAKE simple LIGHT (not moved)

jumps
.386p
CODE32 SEGMENT PARA PUBLIC USE32
ASSUME cs:CODE32, ds:CODE32

		include pmode.inc
		include rotatem.ext

		widoczno	db 0 ;jak zero to sprawdza

		PUBLIC	widoczno
		PUBLIC	drawFacesVE	
		PUBLIC	drawFacesVCE	
		EXTRN	bene		:BYTE
		EXTRN	poin2d		:WORD
		;sortowanie bitowe
		EXTRN	sumy_z		:DWORD
		EXTRN	sort_adr	:DWORD
		EXTRN	sort_prz	:DWORD
		EXTRN	kolejno	:WORD
		PUBLIC	max_n_of_faces
		EXTRN	adr_faces	:DWORD
		EXTRN	adr_points	:DWORD
		EXTRN	adr_versor	:DWORD
		EXTRN	adr_colors	:DWORD			;11:20
		EXTRN	number_f	:DWORD
		EXTRN	number_p	:DWORD
		EXTRN	adr_pixels	:DWORD
		EXTRN	lightE		:WORD
		PUBLIC	make_lightE
		PUBLIC	_mem
		PUBLIC	_sort
		;urednione wersory normalne...
		EXTRN	nor_to_faces	:WORD
		EXTRN	wersory		:WORD
		EXTRN	ilo_wer	:DWORD
		PUBLIC	calc_nor
		;pierwiastek
		PUBLIC	_sqrt
		;arwka :) making light
		EXTRN	light		:BYTE
		PUBLIC	make_light
                ;rysowanie
		EXTRN	inc_xxx		:DWORD
		EXTRN	inc_yyy		:DWORD
		EXTRN	inc_zzz		:DWORD
		EXTRN	versory:WORD
                PUBLIC  generate32env
	ifDEF gouraudIs
                PUBLIC  drawFacesV
		PUBLIC	drawFacesVC				;11:25
	ENDif
		PUBLIC	copypoints
		PUBLIC	rotatety
		PUBLIC	rotatety2
	ifDEF gouraudIs
                PUBLIC  gouraud
	ENDIF
		PUBLIC	text
		EXTRN	draw_where	:DWORD
		IRPC	roxi,<123>
		EXTRN	gou_x&roxi	:DWORD
		EXTRN	gou_y&roxi	:DWORD
		EXTRN	gou_c&roxi	:BYTE
		EXTRN	delta&roxi	:DWORD
		EXTRN	dC&roxi		:DWORD
		ENDM
                PUBLIC  zdelta
                PUBLIC  d_x
                PUBLIC  d_y

		; a tu ju wewntrzne>> 
		sort_adres	dd	1638
		max_n_of_faces	equ 	2000
		sort_drawers	equ	1096
		sort_memory	equ	sort_drawers*4*16+1024
		pan1		equ	0
		pan2		equ	4
		pan3		equ	8
		pan4		equ	12
		clipup		equ 0
		clipdown	equ 199
		clipleft	equ 0
		clipright	equ 319	
		;clipy do texturowania
		clipu		equ 0
		clipd		equ 199
		clipl		equ 0
		clipr		equ 319
		clipuu		dd clipu*320
		clipdd		dd clipd*320
		clipll		dd clipl
		cliprr		dd clipr

		PUBLIC		first_vertex
		PUBLIC		second_vertex
		PUBLIC		third_vertex
		IRPC		roxi,<123>
		PUBLIC		x&roxi
		PUBLIC		y&roxi
		PUBLIC		xt&roxi
		PUBLIC		yt&roxi
		ENDM
		
	first_vertex:
		x1e	dw 0
		x1	dw 0
		y1e	dw 0
		y1	dw 0
		xt1e	dw 0
		xt1	dw 0
		yt1e	dw 0
		yt1	dw 0
		
	second_vertex:
		x2e	dw 0
		x2 	dw 0
		y2e	dw 0
		y2	dw 0
		xt2e	dw 0
		xt2	dw 0
		yt2e	dw 0
		yt2	dw 0

	third_vertex:
		x3e	dw 0
		x3	dw 0
		y3e	dw 0
		y3	dw 0
		xt3e	dw 0
		xt3	dw 0
		yt3e	dw 0
		yt3	dw 0

		h	dd 0
		w	dd 0
		dxxx1	dd 0
		dyyy1	dd 0
		adr_l	dd offset left ;adres do lewej strony krawdzi
		adr_r	dd offset right ;a tutaj do prawej
		adr_1	dd 0
		adr_2	dd 0
		adr_3	dd 0
		_liner	dd 0


;
; [ _MEM ] - allokuje pami dla sortowania bitowego...
;
_mem		PROC
		mov	eax,sort_memory
		call	_getHiMem
		jnc 	jmem
		jmp	_exit
	jmem:	mov	sort_adres,eax
		lea	edi,sort_adr
		REPT	16
		stosd
		add	eax,sort_drawers*4
		ENDM
		ret
_mem		ENDP

;
; [ _SORT ] - gwna procka sortujca...
; inSide that:	suma zetw, sortowanie, kolejno...
; out	     : 	tablca [KOLEJNO]
;
_sort		PROC
		mov	esi,adr_points
		lea	edi,poin2d
		mov	ecx,number_p
		call	persp
		sort_addding  equ 5000
		mov	esi,adr_faces	
		lea	edi,sumy_z
		xor	ebx,ebx
		mov	ecx,number_f	
		shl	ecx,16
		neg	ecx
	@sdist:	movsx	eax, word ptr [esi]
		mov	ebp,eax
		shl	ebp,1
		add	ebp,adr_points
		mov	bx , word ptr [eax*4+ebp+4]
		movsx	eax, word ptr [esi+2]
		mov	ebp,eax
		shl	ebp,1
		add	ebp,adr_points
		add	bx , word ptr [eax*4+ebp+4]
		movsx	eax, word ptr [esi+4]
		mov	ebp,eax
		shl	ebp,1
		add	ebp,adr_points
		add	bx , word ptr [eax*4+ebp+4]
		add	bx , sort_addding
		mov	dword ptr [edi],ebx
		add	edi,4				
		add	esi,6
		add	ebx,010000h
		add	ecx,010000h
		js	@sdist
		; a tu ju po sumowaniu zet'w...
		IRPC	katha,<123>
		local	bsort,shift,sorw,pddd,@next
		mov	byte ptr [shift-1],pan&katha
	bSort:	lea	edi,sort_prz
		mov	ecx,16
		xor	eax,eax
		rep	stosd
	; sortowanie waciwe 
		mov	esi,offset sumy_z
		mov	ebp,offset sort_prz
		mov	ecx,number_f
	sorw:	lodsd
		mov 	ebx,eax
		shr	ebx,0fh
	shift:	and	ebx,0fh
		mov	edi,dword ptr sort_prz[ebx*4]		
		inc	dword ptr sort_prz[ebx*4]	
		mov	edx,dword ptr sort_adr[ebx*4]	
		mov	[edx+edi*4],eax
		loop 	sorw
	; make [kolejno] table 
		mov	ebp,offset sort_prz
		mov	edi,offset sumy_z
		mov	esi,sort_adres
		mov	ecx,16
	pddd:	push	ecx esi
		mov	edx,dword ptr [ebp]
		or	edx,edx
		jz	@next
		mov	ecx,edx
		rep	movsd
	@next:	pop	esi ecx
		add	ebp,4
		add	esi,sort_drawers*4
		loop	pddd
		ENDM
		mov	eax,number_f
		lea	esi,sumy_z[(eax*4)-2]
		lea	edi,kolejno
		mov	ecx,number_f
		xor 	eax,eax
	@popo:	movsw         ;kolejno
		sub	esi,6 ;minicie sumy zeta
		loop	@popo
		ret
_sort		ENDP

                ShFa    db 8
                ZDelta  dd 200
                d_x     dw 160
                d_y     dw 100
persp PROC
        	movsx 	ebx,word ptr [esi+4]       
        	add 	ebx,ZDelta
	        movsx 	eax,word ptr [esi]       
	        neg 	eax
	        sal 	eax,8
	        mov 	edx,eax
	        sar 	edx,31
	        idiv 	ebx
	        add 	ax,d_x
		mov	word ptr [edi],ax
	        movsx 	eax,word ptr [esi+2]
	        sal 	eax,8
	        mov 	edx,eax
	        sar 	edx,31
	        idiv 	ebx
	        add 	ax,d_y
		mov	word ptr [edi+2],ax
	        add	edi,4
	        add 	esi,6
	        dec 	cx
	        jnz 	persp
	        ret
persp ENDP

; na wejciu ESI - z bitmap 32x32...
generate32env	PROC
		; --- env32 --> env128
;		lea	esi,map32
		lea	edi,bene
		mov	ecx,32
	@jac0:	push	ecx
		mov	ecx,32
	@jac1:	xor	eax,eax
		mov	al,[esi]
		mov	ah,al
		mov	bx,ax
		ror	eax,16
		or	ax,bx
		mov	[edi+000],eax
		mov	[edi+128],eax
		mov	[edi+256],eax
		mov	[edi+384],eax
		add	edi,4
		inc	esi
		loop	@jac1
		add	edi,128*3
		pop	ecx
		loop	@jac0
		mov	esi,offset bene
		mov	edi,offset bene-128
		mov	ecx,32
		rep	movsd
		mov	esi,offset bene+128*127
		mov	edi,offset bene+128*128
		mov	ecx,32
		rep	movsd
		; ---
		mov	ecx,ile_gene
	@p12:	push	ecx
		lea	esi,bene
		mov	ecx,128*128
	@p11:	movzx	ax,byte ptr [esi-1]
		movzx	bx,byte ptr [esi+1]
		add	ax,bx
		movzx	bx,byte ptr [esi+127]
		add	ax,bx
		movzx	bx,byte ptr [esi-127]
		add	ax,bx
		shr	ax,2
		mov	[esi],al
		inc	esi
		loop	@p11
		pop	ecx
		loop	@p12
		ret
generate32env	ENDP

;
; [ CALC_NOR ] PROC
;
; Urednione wersory normalne - wynik zwracany do tablicy wersory !
; in :	adr_faces, adr_points, number_f, number_p
; out:  vertex normals in [WERSORY] table...
;
		nnx1	dd	?
		nny1	dd	?
		nnz1	dd	?
		nnx2	dd	?
		nny2	dd	?
		nnz2	dd	?
		nnx3	dd	?
		nny3	dd	?
		nnz3	dd	?
		norX	dd	?
		norY	dd	?
		norZ	dd	?
calc_nor	PROC
		mov	esi,adr_faces
		lea	edi,nor_to_faces
		mov	ecx,number_f
	@cnv:	push	ecx
		xor	ebx,ebx
		mov	bx,word ptr [esi]
		mov	eax,ebx
		shl	eax,2
		lea	ebp,[eax+ebx*2]
		mov	edx,adr_pixels
		movsx	eax,word ptr [edx+ebp]
		mov	nnx1,eax
		movsx	eax,word ptr [edx+ebp+2]
		mov	nny1,eax
		movsx	eax,word ptr [edx+ebp+4]
		mov	nnz1,eax
		mov	bx,word ptr [esi+2]	;nexte pointe fejse
		mov	eax,ebx
		shl	eax,2
		lea	ebp,[eax+ebx*2]
		movsx	eax,word ptr [edx+ebp]
		mov	nnx2,eax
		movsx	eax,word ptr [edx+ebp+2]
		mov	nny2,eax
		movsx	eax,word ptr [edx+ebp+4]
		mov	nnz2,eax
		mov	bx,word ptr [esi+4]	;bozon shading?
		mov	eax,ebx
		shl	eax,2
		lea	ebp,[eax+ebx*2]
		movsx	eax,word ptr [edx+ebp]
		mov	nnx3,eax
		movsx	eax,word ptr [edx+ebp+2]
		mov	nny3,eax
		movsx	eax,word ptr [edx+ebp+4]
		mov	nnz3,eax
		mov	eax,nny2
		sub	eax,nny1
		mov	ebp,nnz3
		sub	ebp,nnz1
		imul	ebp
		mov	ebx,eax	;(y2-y1)(z3-z1)
		mov	eax,nny3
		sub	eax,nny1
		mov	ebp,nnz2
		sub	ebp,nnz1		
		imul	ebp	;(y3-y1)(z2-z1)
		sub	ebx,eax	
		neg	ebx
		mov	norX,ebx
		mov	eax,nnx2
		sub	eax,nnx1
		mov	ebp,nnz3
		sub	ebp,nnz1
		imul	ebp
		mov	ebx,eax	;(x2-x1)(z3-z1)
		mov	eax,nnx3
		sub	eax,nnx1
		mov	ebp,nnz2
		sub	ebp,nnz1		
		imul	ebp	;(x3-x1)(z2-z1)
		sub	ebx,eax	
		mov	norY,ebx
		mov	eax,nny2
		sub	eax,nny1
		mov	ebp,nnx3
		sub	ebp,nnx1
		imul	ebp
		mov	ebx,eax	;(y2-y1)(x3-x1)
		mov	eax,nny3
		sub	eax,nny1
		mov	ebp,nnx2
		sub	ebp,nnx1		
		imul	ebp	;(y3-y1)(x2-x1)
		sub	ebx,eax	
		neg	ebx
		mov	norZ,ebx
	; dugo wektora normalnego!
		mov	eax,norX
		mov	ebx,norY
		mov	ecx,norZ
		imul	eax,eax
		imul	ebx,ebx
		imul	ecx,ecx
		add	ecx,eax
		add	ecx,ebx
		call	_sqrt
		shr	eax,8
		mov	ebx,eax	;pierwiastek
		or	ebx,ebx
		jnz	@norm
		mov	word ptr [edi],0
		mov	word ptr [edi+2],0
		mov	word ptr [edi+4],0
		jmp	ponor
	@norm:	
	; normalizacja do 255..
		mov	eax,norX
		cdq
		shld	eax,edx,8
		idiv	ebx
		mov	word ptr [edi],ax
		mov	eax,norY
		cdq
		shld	eax,edx,8
		idiv	ebx
		mov	word ptr [edi+2],ax
		mov	eax,norZ
		cdq
		shld	eax,edx,8
		idiv	ebx
		mov	word ptr [edi+4],ax
	ponor:
		add	edi,6
		add	esi,6
		pop	ecx
		loop	@cnv
	; no to bierzemy si za urednione wersory normalne...
	; dodaj wsp.kadego wystpienia wierzch. i dziel przez
	; ilo wystpie...
		lea	edi,ilo_wer
		xor	eax,eax
		mov	ecx,number_p
		rep	stosd
		lea	edi,wersory
		mov	ecx,number_p
		lea	ecx,[ecx*2+ecx]
		rep	stosw

		mov	ecx,number_f
		mov	esi,adr_faces
		lea	ebp,nor_to_faces
	@ur:	xor	ebx,ebx
		mov	bx, word ptr [esi]
		mov	eax,ebx
		shl	eax,2
		inc	dword ptr [offset ilo_wer+eax]
		lea	ebx,[ebx*2+eax]
		mov	ax,word ptr [ebp]
		add	word ptr [offset wersory+ebx],ax
		mov	ax,word ptr [ebp+2]
		add	word ptr [offset wersory+ebx+2],ax
		mov	ax,word ptr [ebp+4]
		add	word ptr [offset wersory+ebx+4],ax
		mov	bx, word ptr [esi+2]
		mov	eax,ebx
		shl	eax,2
		inc	dword ptr [offset ilo_wer+eax]
		lea	ebx,[ebx*2+eax]
		mov	ax,word ptr [ebp]
		add	word ptr [offset wersory+ebx],ax
		mov	ax,word ptr [ebp+2]
		add	word ptr [offset wersory+ebx+2],ax
		mov	ax,word ptr [ebp+4]
		add	word ptr [offset wersory+ebx+4],ax
		mov	bx, word ptr [esi+4]
		mov	eax,ebx
		shl	eax,2
		inc	dword ptr [offset ilo_wer+eax]
		lea	ebx,[ebx*2+eax]
		mov	ax,word ptr [ebp]
		add	word ptr [offset wersory+ebx],ax
		mov	ax,word ptr [ebp+2]
		add	word ptr [offset wersory+ebx+2],ax
		mov	ax,word ptr [ebp+4]
		add	word ptr [offset wersory+ebx+4],ax
		add	ebp,6
		add	esi,6
		loop	@ur
		lea	esi,wersory
		lea	ebp,ilo_wer
		mov	ecx,number_f
	@uv:	
		mov	ebx,[ebp]
		or	ebx,ebx
		jnz	lu
		mov	word ptr [esi],0
		mov	word ptr [esi+2],0
		mov	word ptr [esi+4],0	
		jmp	polu
	lu:
		movsx	eax,word ptr [esi]
		cdq
		idiv	ebx
		mov	word ptr [esi],ax
		movsx	eax,word ptr [esi+2]
		cdq
		idiv	ebx
		mov	word ptr [esi+2],ax
		movsx	eax,word ptr [esi+4]
		cdq
		idiv	ebx
		mov	word ptr [esi+4],ax
	polu:
		add	ebp,4
		add	esi,6
		loop	@uv
		ret
calc_nor	ENDP

;
; [ _sqrt ] - pierwastek low precision ... comes from birthday intro!
;
_sqrt		PROC
		xor     eax,eax
		mov     ebx,40000000h
  	sqrtLP1:
		mov     edx,ecx         
		sub     edx,ebx         
		jl      sqrtLP2
		sub     edx,eax         
		jl      sqrtLP2
		mov     ecx,edx         
		shr     eax,1           
		or      eax,ebx         
		shr     ebx,2           
		jnz     sqrtLP1
		shl     eax,8
		ret
  	sqrtLP2:	
		shr     eax,1           
		shr     ebx,2           
		jnz     sqrtLP1
		shl     eax,8
		ret
_sqrt		ENDP

;
; [ _MAKE_LIGHT ] - dyz proccy is making light...
;		    Sun is on de sky (not moved)....
;
make_light	PROC
		lea	edi,light
		mov	esi,adr_versor
		mov	ecx,number_p
		shl	ecx,16
		neg	ecx
	@swia:	push	ecx
		movsx	eax,word ptr [esi]
		movsx	ebx,word ptr [esi+2]
		movsx	ecx,word ptr [esi+4]
		imul	eax,eax
		imul	ebx,ebx
		imul	ecx,ecx
		add	ecx,eax
		add	ecx,ebx
		call	_sqrt
		shr	eax,8
		mov	ebp,eax
		or	ebp,ebp
		jz	@lik2
		movsx	eax,word ptr [esi+4]
		sal	eax,6
		cdq
		idiv	ebp
		cdq
		xor	eax,edx
		sub	eax,edx
		cmp	eax,63
		jb	@lik
		mov	eax,62
	@lik:	inc	al
		mov	byte ptr [edi],al
		inc	edi
		add	esi,6
		pop	ecx
		add	ecx,010000h
		js	@swia
		ret
	@lik2:	mov	byte ptr [edi],1
		inc	edi
		add	esi,6
		pop	ecx
		add	ecx,010000h
		js	@swia
		ret
make_light	ENDP

IFDEF gouraudIs
;
; [ DRAWfACESv ] - dyz shitty procedure draws my objects...
;
drawFacesV	PROC
		lea	esi,kolejno
		mov	edi,adr_faces
		lea	ebp,poin2d
		mov	ecx,number_f
	dfLoop:	push	esi edi ecx ebp
		xor	eax,eax
		mov	ax,word ptr [esi]
		mov	ebx,eax
		shl	ebx,2
		lea	eax,[ebx+eax*2]
		mov	bx,word ptr [edi+eax]
		mov	dl,byte	ptr [offset light+ebx]
		mov	gou_c1,dl
		shl	ebx,2
		movsx	edx,word ptr [ebp+ebx]
		mov	gou_x1,edx
		mov	vx1,dx
		movsx	edx,word ptr [ebp+ebx+2]
		mov	gou_y1,edx
		mov	vy1,dx
		mov	bx,word ptr [edi+eax+2]
		mov	dl,byte	ptr [offset light+ebx]
		mov	gou_c2,dl
		shl	ebx,2
		movsx	edx,word ptr [ebp+ebx]
		mov	gou_x2,edx
		mov	vx2,dx
		movsx	edx,word ptr [ebp+ebx+2]
		mov	gou_y2,edx
		mov	vy2,dx
		mov	bx,word ptr [edi+eax+4]
		mov	dl,byte	ptr [offset light+ebx]
		mov	gou_c3,dl
		shl	ebx,2
		movsx	edx,word ptr [ebp+ebx]
		mov	gou_x3,edx
		mov	vx3,dx
		movsx	edx,word ptr [ebp+ebx+2]
		mov	gou_y3,edx
		mov	vy3,dx
		call	isVisible
		mov	al,visible
		or	al,al
		jnz	nous
		call	gouraud
	nous:	pop	ebp ecx edi esi
		add	esi,2
		loop	dfLoop
		ret
drawFacesV	ENDP

; draw faces with colors and checking visible it...
drawFacesVC	PROC
		lea	esi,kolejno
		mov	edi,adr_faces
		lea	ebp,poin2d
		mov	ecx,number_f
	@dfLoop:push	esi edi ecx ebp
		xor	eax,eax
		mov	ax,word ptr [esi]
	mov	edx,adr_colors
	mov	dl ,byte ptr [edx+eax]
	mov	ccccc,dl
		mov	ebx,eax
		shl	ebx,2
		lea	eax,[ebx+eax*2]
		mov	bx,word ptr [edi+eax]
		mov	dl,byte	ptr [offset light+ebx]
	add 	dl,ccccc
		mov	gou_c1,dl
		shl	ebx,2
		movsx	edx,word ptr [ebp+ebx]
		mov	gou_x1,edx
		mov	vx1,dx
		movsx	edx,word ptr [ebp+ebx+2]
		mov	gou_y1,edx
		mov	vy1,dx
		mov	bx,word ptr [edi+eax+2]
		mov	dl,byte	ptr [offset light+ebx]
	add 	dl,ccccc
		mov	gou_c2,dl
		shl	ebx,2
		movsx	edx,word ptr [ebp+ebx]
		mov	gou_x2,edx
		mov	vx2,dx
		movsx	edx,word ptr [ebp+ebx+2]
		mov	gou_y2,edx
		mov	vy2,dx
		mov	bx,word ptr [edi+eax+4]
		mov	dl,byte	ptr [offset light+ebx]
	add	dl,ccccc
		mov	gou_c3,dl
		shl	ebx,2
		movsx	edx,word ptr [ebp+ebx]
		mov	gou_x3,edx
		mov	vx3,dx
		movsx	edx,word ptr [ebp+ebx+2]
		mov	gou_y3,edx
		mov	vy3,dx
		call	isVisible
		mov	al,visible
		or	al,al
		jnz	@nous
		call	gouraud
	@nous:	pop	ebp ecx edi esi
		add	esi,2
		loop	@dfLoop
		ret
	ccccc	db 	0
drawFacesVC	ENDP
	ENDIF

;
; [ isVisible ] - is my poly visible???
;
                vx1    	dw 0
                vy1     dw 0
                vz1     dw 0
                vx2     dw 0
                vy2     dw 0
                vz2     dw 0
                vx3     dw 0
                vy3     dw 0
                vz3     dw 0
                visible db 0
isVisible PROC
          	mov	visible,0
          	mov 	ax,vY2
          	sub 	ax,vY1
          	mov 	bx,vX3
          	sub 	bx,vX1
          	imul 	bx
          	mov 	cx,ax
          	mov 	ax,vY3
          	sub 	ax,vY1
          	mov 	bx,vX2
          	sub 	bx,vX1
          	imul 	bx
          	sub 	cx,ax
          	neg 	cx
          	js 	noVis
          	mov 	visible,1
  	noVis: 	ret
isVisible ENDP

copyPoints	PROC
		mov	esi,adr_pixels
		mov	edi,adr_points
		mov	ecx,number_p
		lea	ecx,[ecx*2+ecx]
		push	ecx
		rep	movsw
		lea	esi,wersory
		lea	edi,versory
		pop	ecx
		rep	movsw
		ret
copyPoints	ENDP

rotatety	PROC
		mov	esi,adr_points
		mov	ecx,number_p
		call	_rotatem
		neg	angleX
		neg	angleY
		neg	angleZ
		lea	esi,versory
		mov	ecx,number_p
		call	_rotatem
		neg	angleX
		neg	angleY
		neg	angleZ
		mov	eax,inc_xxx
		add	angleX,eax
		mov	eax,inc_yyy
		add	angleY,eax
		mov	eax,inc_zzz
		add	angleZ,eax
		ret
rotatety	ENDP

rotatety2	PROC
		mov	esi,adr_points
		mov	ecx,number_p
		call	_rotatem
		ret
rotatety2	ENDP

; ------------------------------------------- GOURAUD feee
IFDEF gouraudIs
gouraud         PROC
		mov	ebx,gou_y1
		mov	esi,gou_y2
		mov	edi,gou_y3
		mov	cx,word ptr [gou_c1]
		mov	dl,byte ptr [gou_c3]
		cmp	ebx,esi				; y1 with y2
		jl	gs_1ok1
		xchg	ebx,esi
		mov	eax,dword ptr [offset gou_x1]	; x1
		xchg	eax,dword ptr [offset gou_x1+8]	; exchange x2
		mov	dword ptr [offset gou_x1],eax	
		xchg	cl,ch
	gs_1ok1:	
		cmp	ebx,edi
		jl	gs_2ok
		xchg	ebx,edi
		mov	eax,dword ptr [offset gou_x1]
		xchg	eax,dword ptr [offset gou_x1+16]
		mov	dword ptr [offset gou_x1],eax
		xchg	cl,dl
	gs_2ok:
		cmp	esi,edi
		jl	gs_3ok
		xchg	esi,edi
		mov	eax,dword ptr [offset gou_x1+8]
		xchg	eax,dword ptr [offset gou_x1+16]
		mov	dword ptr [offset gou_x1+8],eax
		xchg	ch,dl
	gs_3ok:
		cmp	ebx,clipDown
		jg	endgou			; when y1>dolnego zakresu
		cmp	edi,clipUp
		jl	endgou			; when y3<grnego 0-zakresu
		
		cmp	ebx,edi
		je	flat_line

		mov	dword ptr [offset gou_x1+4] ,ebx
		mov	dword ptr [offset gou_x1+12],esi
		mov	dword ptr [offset gou_x1+20],edi
		mov	word  ptr [offset gou_c1],cx
		mov	byte  ptr [offset gou_c1+2],dl

		mov	ebx,dword ptr [offset gou_y2]
		sub	ebx,dword ptr [offset gou_y1]
		jnz	dXX1
		mov	delta1,0
		mov	dC1,0
		jmp	boFla1
	dXX1:	mov	eax,dword ptr [offset gou_x2]
		sub	eax,dword ptr [offset gou_x1]
		jnz	nDech1
		xor	eax,eax		; wic po co dzieli...
		jmp	decha1
	nDech1:	sal	eax,16
		cdq
		idiv	ebx
	decha1:	mov	delta1,eax
		movzx	eax,byte ptr [offset gou_c2]
		movzx	ecx,byte ptr [offset gou_c1]
		sub	eax,ecx
		jnz	milky1		
		xor	eax,eax		; dC1=eax/Y gdzie eax=0 so...
		jmp	mle1
	milky1:	sal	eax,16
		cdq
		idiv	ebx
	mle1:	mov	dC1,eax
	boFla1:
		; nastpny - i hope it runs...
		mov	ebx,dword ptr [offset gou_y3]
		sub	ebx,dword ptr [offset gou_y2]
		jnz	dXX2
		mov	delta2,0
		mov	dC2,0
		jmp	boFla2
	dXX2:	mov	eax,dword ptr [offset gou_x3]
		sub	eax,dword ptr [offset gou_x2]
		jnz	nDech2
		xor	eax,eax		; wic po co dzieli...
		jmp	decha2
	nDech2:	sal	eax,16
		cdq
		idiv	ebx
	decha2:	mov	delta2,eax
		movzx	eax,byte ptr [offset gou_c3]
		movzx	ecx,byte ptr [offset gou_c2]
		sub	eax,ecx
		jnz	milky2		
		xor	eax,eax		; dC1=eax/Y gdzie eax=0 so...
		jmp	mle2
	milky2:	sal	eax,16		; chyba kobiety mi si chce...
		cdq
		idiv	ebx
	mle2:	mov	dC2,eax
	boFla2:
		mov	ebx,dword ptr [offset gou_y3]
		sub	ebx,dword ptr [offset gou_y1]
		jnz	dXX3
		mov	delta3,0
		mov	dC3,0
		jmp	boFla3
	dXX3:	mov	eax,dword ptr [offset gou_x3]
		sub	eax,dword ptr [offset gou_x1]
		jnz	nDech3
		xor	eax,eax		; wic po co dzieli...
		jmp	decha3
	nDech3:	sal	eax,16
		cdq
		idiv	ebx
	decha3:	mov	delta3,eax
		movzx	eax,byte ptr [offset gou_c3]
		movzx	ecx,byte ptr [offset gou_c1]
		sub	eax,ecx
		jnz	milky3		
		xor	eax,eax		; dC1=eax/Y gdzie eax=0 so...
		jmp	mle3
	milky3:	sal	eax,16		; chyba kobiety mi si chce...
		cdq
		idiv	ebx
	mle3:	mov	dC3,eax
	boFla3:

		; no to teras trzeba zrobi pierwszy obieg...
		; i zobaczymy jak to wyjdzie...

		mov	eax,dword ptr [offset gou_x1]
		sal	eax,16
		mov	ebx,eax
		movzx	ecx,byte ptr [offset gou_c1]
		shl	ecx,16
		mov	edx,ecx
		mov	ebp,dword ptr [offset gou_y1]	; a co?
		mov	edi,draw_where
	linG1:	
		cmp	ebp,dword ptr [offset gou_Y2]
		je	fuck2
		cmp	ebp,clipUp
		jl	nodr1
		cmp	ebp,clipdown
		jg	endgou
		push	eax ebx ecx edx ebp edi
		sar	eax,16
		sar	ebx,16
		sar	ecx,16
		sar	edx,16
		add	edi,dword ptr [offset a_ekr+ebp*4]
		call	HorizGouraud
		pop	edi ebp edx ecx ebx eax
	noDr1:	add	eax,delta1
		add	ebx,delta3
		add	ecx,dC1
		add	edx,dC3
		inc	ebp
		jmp	linG1
	fuck2:
		mov	eax,dword ptr [offset gou_x2]
		sal	eax,16
		movzx	ecx,byte ptr [offset gou_c2]
		shl	ecx,16
	linG2:	cmp	ebp,clipUp
		jl	nodr2
		cmp	ebp,clipdown
		jg	endgou
		push	eax ebx ecx edx ebp edi
		sar	eax,16
		sar	ebx,16
		sar	ecx,16
		sar	edx,16
		add	edi,dword ptr [offset a_ekr+ebp*4]
		call	HorizGouraud
		pop	edi ebp edx ecx ebx eax
	noDr2:	add	eax,delta2
		add	ebx,delta3
		add	ecx,dC2
		add	edx,dC3
		inc	ebp
		cmp	ebp,dword ptr [offset gou_Y3]
		jle	linG2
	endgou:
		ret

	a_ekr:  t=0
		rept 200
			dd t
			t=t+320
		endm

flat_line:
		;  here is flat gouraud line...	
		mov	edi,draw_where
		add	edi,[offset a_ekr+ebx*4]
		;  and now i sort-x coordinates...
		mov	eax,dword ptr [offset gou_x1]
		mov	ebx,dword ptr [offset gou_x1+8]
		mov	esi,dword ptr [offset gou_x1+16]
		cmp	eax,ebx
		jl	gxs_1
		xchg	eax,ebx
		xchg	cl,ch
	gxs_1:	cmp	eax,esi
		jl	gxs_2
		xchg	eax,esi
		xchg	cl,dl
	gxs_2:	cmp	ebx,esi
		jl	gxs_3
		xchg	ebx,esi
		xchg	ch,dl
	gxs_3:	
		mov	ebx,esi			; last x
		xchg	eax,ebx			; eax=end ebx=start
		movzx	ecx,cl
		movzx	edx,dl
		xchg	ecx,edx
		call	HorizGouraud
		ret

		; eax,ebx	= x1,x2
		; edi		= offset linii
		; ecx,edx	= c1,c2			BAD VERSION...
HorizGouraud:
		cmp	eax,ebx
		je	onlyPoint
		; a to by musi mimo wszystko...
		cmp	ebx,eax
		jl	HGok
		xchg	eax,ebx
		xchg	ecx,edx
	HGok:
		cmp	eax,clipleft	; >
		jl	oPend
		cmp	ebx,clipright	; <
		jg	oPend
		mov	esi,eax		; end x
		push	ebx
		sub	eax,ebx		; x2-x1
		shl	ecx,16		
		shl	edx,16
		mov	ebp,edx		; start color
		sub	ecx,edx		; c2-c1
		xchg	eax,ecx		; bo dC/dX
		cdq
		idiv	ecx
		pop	ecx
		xchg	eax,ebp
	lopHG:
		cmp	ecx,clipleft
		jl	nHG
		cmp	ecx,clipright
		jg	nHG
		push	eax 
		shr	eax,16
		mov	byte ptr [edi+ecx],al
		pop	eax
	nHG:
		add	eax,ebp
		inc	ecx
		cmp	ecx,esi
		jle	lopHG
		ret
	onlyPoint:
		cmp	eax,ClipLeft
		jl	oPend
		cmp	eax,Clipright
		jg	oPend
		mov	byte ptr [edi+eax],cl
	oPend:
		ret
gouraud         ENDP
ENDIF	; -------------------------------- END of it...

		left	dw 300 DUP (?,?,?,?)
		right	dw 300 DUP (?,?,?,?)
		add_col	db 0

text		PROC

		mov	adr_l,offset left
		mov	adr_r,offset right

		lea	esi,first_vertex
		lea	edi,second_vertex
		lea	ebp,third_vertex

		mov	eax,[esi+4] ;y1
		cmp	eax,[edi+4] ;y2
		jl	@s1
		xchg	esi,edi
@s1:		mov	eax,[esi+4] ;y1
		cmp	eax,[ebp+4] ;y3
		jl	@s2
		xchg	esi,ebp
@s2:		mov	eax,[edi+4] ;y2
		cmp	eax,[ebp+4] ;y3
		jl	@s3
		xchg	edi,ebp
@s3:
		mov	adr_1,esi
		mov	adr_2,edi
		mov	adr_3,ebp

		movsx	eax,word ptr [esi+6] ;y1
		movsx	ecx,word ptr [ebp+6] ;y3

		cmp	eax,clipd
		jg	@endt
		cmp	ecx,clipu
		jl	@endt

		sub	ecx,eax
		jz	@endt
		mov	h,ecx

		mov	eax,[ebp] ;X3	test side of in my poly
		sub	eax,[esi] ;X1
		mov	ebx,[ebp+4] ;Y3
		sub	ebx,[edi+4] ;Y2
		imul	ebx
		mov	ebx,[ebp+4] ;Y3
		sub	ebx,[esi+4] ;Y1
		idiv	ebx
		mov	ebx,[ebp]
		sub	ebx,eax
		cmp	ebx,dword ptr [edi] ;x2
		jg	@side_ok

		mov	adr_l,offset right
		mov	adr_r,offset left

@side_ok:
		mov	ebp,adr_l

;LINE 1-2
		mov	ecx,[edi+4] ;y2
		sub	ecx,[esi+4] ;y1
		jz	@no12
		shr	ecx,16
		mov	eax,[edi] ;x2
		sub	eax,[esi] ;x1
		cdq
		idiv	ecx
		mov	dword ptr DX12,eax

		mov	eax,[edi+8] ;tx2
		sub	eax,[esi+8] ;tx1
		cdq
		idiv	ecx
		mov	dword ptr DTX12,eax

		mov	eax,[edi+12] ;ty2
		sub	eax,[esi+12] ;ty1
		cdq
		idiv	ecx
		mov	dword ptr DTY12,eax

		mov	eax,[esi]
		mov	ebx,[esi+8]
		mov	edx,[esi+12]
@lup12:
		add	eax,422011 ;dx
		DX12	=$-4
		add	ebx,422011 ;dtx
		DTX12	=$-4
		add	edx,422011
		DTY12	=$-4
		mov	[ebp+0],eax
		mov	[ebp+4],ebx
		mov	[ebp+8],edx
		add	ebp,16
		dec	ecx
		jnz	@lup12

@no12:

;LINE 2-3
		mov	esi,adr_2
		mov	edi,adr_3

		mov	ecx,[edi+4] ;y3
		sub	ecx,[esi+4] ;y2
		jz	@no23
		shr	ecx,16
		mov	eax,[edi] ;x3
		sub	eax,[esi] ;x2
		cdq
		idiv	ecx
		mov	dword ptr DX23,eax

		mov	eax,[edi+8] ;tx3
		sub	eax,[esi+8] ;tx2
		cdq
		idiv	ecx
		mov	dword ptr DTX23,eax
	
		mov	eax,[edi+12] ;ty3
		sub	eax,[esi+12] ;ty2
		cdq
		idiv	ecx
		mov	dword ptr DTY23,eax

		mov	eax,[esi]
		mov	ebx,[esi+8]
		mov	edx,[esi+12]
@lup23:
		add	eax,422011 ;dx
		DX23	=$-4
		add	ebx,422011 ;dtx
		DTX23	=$-4
		add	edx,422011
		DTY23	=$-4
		mov	[ebp+0],eax
		mov	[ebp+4],ebx
		mov	[ebp+8],edx
		add	ebp,16
		dec	ecx
		jnz	@lup23

@no23:

; LINE 1-3
		mov	ebp,adr_r
		mov	esi,adr_1
		mov	edi,adr_3

		mov	ecx,[edi+4] ;y3
		sub	ecx,[esi+4] ;y1
		jz	@no13
		shr	ecx,16
		mov	eax,[edi] ;x3
		sub	eax,[esi] ;x1
		cdq
		idiv	ecx
		mov	dword ptr DX13,eax

		mov	eax,[edi+8] ;tx3
		sub	eax,[esi+8] ;tx1
		cdq
		idiv	ecx
		mov	dword ptr DTX13,eax

		mov	eax,[edi+12] ;ty3
		sub	eax,[esi+12] ;ty1
		cdq
		idiv	ecx
		mov	dword ptr DTY13,eax

		mov	eax,[esi]
		mov	ebx,[esi+8]
		mov	edx,[esi+12]
@lup13:
		add	eax,422011 ;dx
		DX13	=$-4
		add	ebx,422011 ;dtx
		DTX13	=$-4
		add	edx,422011
		DTY13	=$-4
		mov	[ebp+0],eax
		mov	[ebp+4],ebx
		mov	[ebp+8],edx
		add	ebp,16
		dec	ecx
		jnz	@lup13

@no13:
		; and the ptla rysujca...

		movsx	eax,word ptr [esi+6] ;y1
		mov	edx,eax
		shl	edx,6
		shl	eax,8
		add	eax,edx
		mov	_liner,eax

		lea	esi,left
		lea	ebp,right

@scanline:
		mov	eax,_liner

		mov 	EDI,draw_where
		ADD 	EDI,EAX

		cmp	eax,clipuu	;ykowa grna
		jl	@skip_diz_line
		cmp	eax,clipdd	;ykowa dolna
		jg	@endt
		
		movsx	ecx,word ptr [ebp+2]	;x2
		movsx	ebx,word ptr [esi+2]	;x1
		cmp	ecx,clipl		;x2 z lew
		jl	@skip_diz_line 		;<to skip
		cmp	ebx,clipr 
		jg	@skip_diz_line 	
		sub	ecx,ebx ;x2-x1
		js	@skip_diz_line
		inc	ecx
		mov	w,ecx

		mov	eax,[ebp+4] ;txR
		sub	eax,[esi+4] ;txL
		cdq
		idiv	ecx
		mov	dxxx1,eax

		mov	eax,[ebp+8] ;tyR
		sub	eax,[esi+8] ;tyL
		cdq
		idiv	ecx
		mov	dyyy1,eax

		movsx 	ebx,word ptr [ebp+2] ;x2
		cmp 	ebx,clipr
		jle 	iopek
		sub	ebx,clipr
		sub 	w,ebx
iopek:
		movsx	ecx,word ptr [esi+2] ;x1
		cmp	ecx,clipl
		jge	@nclip_left

		;----clipleft

		neg	ecx ;jest <0
		sub 	[w],ecx
		add	ecx,clipl ;staa two ticks
		
		mov	eax,dxxx1
		imul	ecx
		add	eax,[esi+4]
		push	eax
		mov	eax,dyyy1
		imul	ecx
		mov	ebx,eax
		add	ebx,[esi+8]
		pop	eax
		;----
		jmp	@l000p
		
@nclip_left:
		mov	eax,[esi]
		shr	eax,16	
		add	edi,eax

		mov	eax,[esi+4]
		mov	ebx,[esi+8]
@l000p:
		add	eax,dxxx1
		add	ebx,dyyy1
		mov	edx,eax
		sar	edx,9
		and 	edx,-128
		mov	ecx,ebx
		sar 	ecx,16
		mov	al,[bene+edx+ecx]
		add	al,add_col
		mov	byte ptr [edi],al
		inc	edi
		dec	w
		jnz	@l000p

@skip_diz_line:
	
		add	ebp,16
		add	esi,16
		add	_liner,320
		dec	h
		jnz	@scanline
			
@endt:
		ret

text		ENDP
make_lightE	PROC
		mov	esi,adr_versor
		mov	ecx,number_p
		lea	edi,lightE
@mle:		mov	ax,[esi]
		sar	ax,2
		add	ax,64
		mov	[edi],ax
		mov	ax,[esi+2]
		sar	ax,2
		add	ax,64
		mov	[edi+2],ax
		add	edi,4
		add	esi,6
		loop	@mle
		ret
make_lightE	ENDP


;
; [ DRAWfACESv ] - dyz shitty procedure draws my objects...
;
drawFacesVE	PROC
		mov	add_col,0

		lea	esi,kolejno
		mov	edi,adr_faces
		lea	ebp,poin2d
		mov	ecx,number_f
	dfL00p:	push	esi edi ecx ebp

		xor	eax,eax
		mov	ax,word ptr [esi] ;kolejno 
		lea 	ebx,[eax*4]
		lea	eax,[ebx+eax*2] ;eax=eax*6

		mov	bx,word ptr [edi+eax] ;face
		mov	dx,[ebp+ebx*4] ;x1
		mov	[x1],dx
		mov	[vx1],dx ;and the same value...
		mov	dx,[ebp+ebx*4+2] ;y1
		mov	[y1],dx
		mov	[vy1],dx
		mov	dx,[lightE+ebx*4] ;xt1
		mov	[xt1],dx
		mov	dx,[lightE+ebx*4+2] ;yt1
		mov	[yt1],dx
		
		mov	bx,word ptr [edi+eax+2]
		mov	dx,[ebp+ebx*4]
		mov	[x2],dx
		mov	[vx2],dx
		mov	dx,[ebp+ebx*4+2]
		mov	[y2],dx
		mov	[vy2],dx
		mov	dx,[lightE+ebx*4] ;xt2
		mov	[xt2],dx
		mov	dx,[lightE+ebx*4+2] ;yt2
		mov	[yt2],dx

		mov	bx,word ptr [edi+eax+4]
		mov	dx,[ebp+ebx*4]
		mov	[x3],dx
		mov	[vx3],dx
		mov	dx,[ebp+ebx*4+2]
		mov	[y3],dx
		mov	[vy3],dx
		mov	dx,[lightE+ebx*4] ;xt3
		mov	[xt3],dx
		mov	dx,[lightE+ebx*4+2] ;yt3
		mov	[yt3],dx

		call	isVisible
		mov	al,visible
		or	al,al
		jnz	nouzz

		call	text

	nouzz:	pop	ebp ecx edi esi
		add	esi,2
		loop	dfL00p
		ret
drawFacesVE	ENDP

;
; [ DRAWfACESv ] - dyz shitty procedure draws my objects...
;
drawFacesVCE	PROC

		lea	esi,kolejno
		mov	edi,adr_faces
		lea	ebp,poin2d
		mov	ecx,number_f
	dfL00p3:
		push	esi edi ecx ebp

		xor	eax,eax
		mov	ax,word ptr [esi] ;kolejno 

		mov	ebx,adr_colors		
		mov	dl,[ebx+eax]
		mov	add_col,dl

		lea 	ebx,[eax*4]
		lea	eax,[ebx+eax*2] ;eax=eax*6

		mov	bx,word ptr [edi+eax] ;face
		mov	dx,[ebp+ebx*4] ;x1
		mov	[x1],dx
		mov	[vx1],dx ;and the same value...
		mov	dx,[ebp+ebx*4+2] ;y1
		mov	[y1],dx
		mov	[vy1],dx
		mov	dx,[lightE+ebx*4] ;xt1
		mov	[xt1],dx
		mov	dx,[lightE+ebx*4+2] ;yt1
		mov	[yt1],dx
		
		mov	bx,word ptr [edi+eax+2]
		mov	dx,[ebp+ebx*4]
		mov	[x2],dx
		mov	[vx2],dx
		mov	dx,[ebp+ebx*4+2]
		mov	[y2],dx
		mov	[vy2],dx
		mov	dx,[lightE+ebx*4] ;xt2
		mov	[xt2],dx
		mov	dx,[lightE+ebx*4+2] ;yt2
		mov	[yt2],dx

		mov	bx,word ptr [edi+eax+4]
		mov	dx,[ebp+ebx*4]
		mov	[x3],dx
		mov	[vx3],dx
		mov	dx,[ebp+ebx*4+2]
		mov	[y3],dx
		mov	[vy3],dx
		mov	dx,[lightE+ebx*4] ;xt3
		mov	[xt3],dx
		mov	dx,[lightE+ebx*4+2] ;yt3
		mov	[yt3],dx

		mov	al,widoczno
		or	al,al
		jnz	pipp

		call	isVisible
		mov	al,visible
		or	al,al
		jnz	nouzz3

	pipp:

		call	text

	nouzz3:	pop	ebp ecx edi esi
		add	esi,2
		loop	dfL00p3
		ret
drawFacesVCE	ENDP


CODE32		ENDS
END
