; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
                INCDIR  "INCLUDE:"
		INCLUDE	"exec/types.i"

		INCLUDE	"/Renderer/EM_structures.i"

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

CHUNKY_WIDTH	EQU	320
CHUNKY_HEIGHT	EQU	200
CHUNKY_WIDTH2	EQU	CHUNKY_WIDTH>>1
CHUNKY_HEIGHT2	EQU	CHUNKY_HEIGHT>>1

VALUES_NUMBER	EQU	1024
ANGLES_NUMBER	EQU	180
COSINE_OFFSET	EQU	VALUES_NUMBER*(ANGLES_NUMBER>>2)*2

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

		XREF	_ChunkyAdr
                XREF    _TN_TextureAdr
		XREF	_RotateTable
		XREF	_PerspectiveTable

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

		XDEF	_TN_TransformScene
		XDEF	_TN_CreateDepthBuffer

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

		SECTION	TN_render,CODE
; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
; a0.l	pointer to SCENE

_TN_TransformScene
		movem.l	d2-d7/a2-a6,-(sp)

		move.l	(a0,sc_Camera),a1
		movem.l	(a1),d0-d5

		move.l	#VALUES_NUMBER,d6
		move.l	d6,d7
		add.l	d6,d6

		mulu	d6,d3
		add.l	d7,d3
		mulu	d6,d4
		add.l	d7,d4
		mulu	d6,d5
		add.l	d7,d5

		move.l	_RotateTable,a1
		lea	(a1,d5.l),a3
		lea	(a1,d4.l),a2
		adda.l	d3,a1

		move.l	(a0,sc_VNumber),d7
		subq.w	#1,d7
		move.l	(a0,sc_Vertices),a0

		move.l	_PerspectiveTable,a4

; rotate position around Z axis

		move.w	d0,d6
		move.w	(a3,d0.w*2,COSINE_OFFSET.l),d0
		add.w	(a3,d1.w*2),d0
		move.w	(a3,d1.w*2,COSINE_OFFSET.l),d1
		sub.w	(a3,d6.w*2),d1

; rotate position around Y axis

		move.w	d0,d6
		move.w	(a2,d0.w*2,COSINE_OFFSET.l),d0
		sub.w	(a2,d2.w*2),d0
		move.w	(a2,d2.w*2,COSINE_OFFSET.l),d2
		add.w	(a2,d6.w*2),d2

; rotate position around X axis

		move.w	d1,d6
		move.w	(a1,d1.w*2,COSINE_OFFSET.l),d1
		add.w	(a1,d2.w*2),d1
		move.w	(a1,d2.w*2,COSINE_OFFSET.l),d2
		sub.w	(a1,d6.w*2),d2

		ext.l	d0
		ext.l	d1
		ext.l	d2

; ---------------------------------------
; d0.l	PosX
; d1.l	PosY
; d2.l	PosZ
; d3.l	FREE
; d4.l	FREE
; d5.l	FREE
; d6.l	FREE
; d7.l	vertices number (-1)
; a0.l	pointer to vertices
; a1.l	pointer to sin(RotX) lookup table
; a2.l	pointer to sin(RotY) lookup table
; a3.l	pointer to sin(RotZ) lookup table
; a4.l	pointer to perspective table
; a5.l	FREE
; a6.l	FREE

TN_ts_Loop
		movem.l	(a0),d3-d5

; rotate around Z axis

		move.w	d3,d6
		move.w	(a3,d3.w*2,COSINE_OFFSET.l),d3
		add.w	(a3,d4.w*2),d3
		move.w	(a3,d4.w*2,COSINE_OFFSET.l),d4
		sub.w	(a3,d6.w*2),d4

; rotate around Y axis

		move.w	d3,d6
		move.w	(a2,d3.w*2,COSINE_OFFSET.l),d3
		sub.w	(a2,d5.w*2),d3
		move.w	(a2,d5.w*2,COSINE_OFFSET.l),d5
		add.w	(a2,d6.w*2),d5

; rotate around X axis

		move.w	d4,d6
		move.w	(a1,d4.w*2,COSINE_OFFSET.l),d4
		add.w	(a1,d5.w*2),d4
		move.w	(a1,d5.w*2,COSINE_OFFSET.l),d5
		sub.w	(a1,d6.w*2),d5

; translate

		ext.l	d3
		ext.l	d4
		ext.l	d5

		add.l	d0,d3
		add.l	d1,d4
		add.l	d2,d5

;		move.l	d3,(a0,vt_xt)
;		move.l	d4,(a0,vt_yt)
		cmpi.l	#10,d5
		bge.b	xxx
		moveq	#0,d5
xxx
		move.l	d5,(a0,vt_zt)
;		ble.b	TN_ts4
		beq.b	TN_ts4

; perspective projection

		move.l	(a4,d5.l*4,-4.w),d6

		muls.l	d6,d3
		swap	d3
		ext.l	d3

		muls.l	d6,d4
		swap	d4
		ext.l	d4

		moveq	#0,d6

		add.l	#CHUNKY_WIDTH2,d3
		bpl.b	TN_ts0
		bset	#LEFT_CLIP_BIT,d6
		bra.b	TN_ts1
TN_ts0
		cmpi.l	#CHUNKY_WIDTH,d3
		blt.b	TN_ts1
		bset	#RIGHT_CLIP_BIT,d6
TN_ts1
		add.l	#CHUNKY_HEIGHT2,d4
		bpl.b	TN_ts2
		bset	#TOP_CLIP_BIT,d6
		bra.b	TN_ts3
TN_ts2
		cmpi.l	#CHUNKY_HEIGHT,d4
		blt.b	TN_ts3
		bset	#BOTTOM_CLIP_BIT,d6
TN_ts3
		move.l	d3,(a0,vt_xp)
		move.l	d4,(a0,vt_yp)
		move.l	d6,(a0,vt_ClipBits)
TN_ts4
		lea	(a0,vt_SIZEOF),a0

		dbra	d7,TN_ts_Loop

		movem.l	(sp)+,d2-d7/a2-a6
		rts


; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
; a0.l	pointer to SCENE
; a1.l	pointer to DepthBuffer
; return visible faces number

_TN_CreateDepthBuffer
		movem.l	d2-d7/a2-a6,-(sp)

		move.l	(a0,sc_FNumber),d7
		subq.w	#1,d7
		move.l	(a0,sc_Faces),a0

		moveq	#0,d0
TN_cdb_Loop
		move.l	(a0,fc_V1),a2
		move.l	(a2,vt_zt),d2
		beq.b	TN_cdb0
;		ble.b	TN_cdb0
		move.l	(a0,fc_V2),a3
		move.l	(a3,vt_zt),d3
		beq.b	TN_cdb0
;		ble.b	TN_cdb0
		move.l	(a0,fc_V3),a4
		move.l	(a4,vt_zt),d4
		beq.b	TN_cdb0
;		ble.b	TN_cdb0

		add.l	d3,d2
		add.l	d4,d2
		move.l	d2,(a0,fc_AvgZ)

; a2.l	pointer to V1
; a3.l	pointer to V2
; a4.l	pointer to V3

		move.l	(a2,vt_ClipBits),d2
		bne.b	TN_cdb1
		move.l	(a3,vt_ClipBits),d3
		bne.b	TN_cdb2
		move.l	(a4,vt_ClipBits),d4
		bne.b	TN_cdb3

		move.l	#0,(a0,fc_Flags)
TN_cdb4

;	backface culling

		move.l	(a3,vt_xp),d2
		move.l	(a2,vt_xp),d3
		sub.l	d2,d3
		move.l	(a4,vt_xp),d4
		sub.l	d2,d4
		move.l	(a3,vt_yp),d2
		move.l	(a4,vt_yp),d5
		sub.l	d2,d5
		move.l	(a2,vt_yp),d6
		sub.l	d2,d6
		muls	d5,d3
		muls	d6,d4
		cmp.l	d4,d3
		ble.b	TN_cdb0

		move.l	a0,(a1)+
		addq.l	#1,d0
TN_cdb0
		lea	(a0,fc_SIZEOF),a0

		dbra	d7,TN_cdb_Loop

		move.l	#0,(a1)

		movem.l	(sp)+,d2-d7/a2-a6
		rts

TN_cdb1
		move.l	(a3,vt_ClipBits),d3
TN_cdb2
		move.l	(a4,vt_ClipBits),d4
TN_cdb3
		and.l	d3,d2
		and.l	d4,d2
		bne.b	TN_cdb0
		move.l	#FF_CLIP,(a0,fc_Flags)
		bra.b	TN_cdb4

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

		END

; ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
