.global defaultPipe

.equ vertexTop, 0x3d0
.equ numInAttribs, 4
.equ numOutAttribs, 3
.equ numOutBuf, 2
.equ vertCount, ((vertexTop-numOutBuf)/(numInAttribs*2+numOutAttribs*numOutBuf))
.equ offset, (vertCount*numInAttribs)
.equ outBuf1, (2*offset)
.equ outSize, ((vertexTop-outBuf1-2)/2)
.equ outBuf2, (outBuf1+outSize)

.equ lightMat,		0x3d0
.equ lightDir,		0x3d4
.equ matrix, 		0x3f0
.equ screenOffset, 	0x3f9
.equ gifTag, 		0x3fa
.equ matColor, 		0x3fb
.equ ambientLight, 	0x3fd

.balign 16,0
defaultPipe:
DMAret *
MPG 0, *
.vu
Start:
	NOP	LQ VF25, screenOffset(VI00)
	NOP	LQ VF28, matrix(VI00)
	NOP	LQ VF29, matrix+1(VI00)
	NOP	LQ VF30, matrix+2(VI00)
	NOP	LQ VF31, matrix+3(VI00)
	NOP	IADDIU VI12, VI00, outBuf1
	NOP	IADDIU VI13, VI00, outBuf2
Cnt:
	NOP	XTOP VI02			; input pointer
	NOP	LQ VF01, gifTag(VI00)
	NOP	XITOP VI01			; vertex count
	NOP	IADDIU VI05, VI00, 0x4000
	NOP	IADD VI05, VI05, VI05
	NOP	IOR VI05, VI05, VI01
	NOP	SQ VF01, 0(VI12)
	NOP	ISW.x VI05, 0(VI12)
	NOP	IADDIU VI03, VI12, 1		; output pointer
	NOP	LQ VF18, lightMat(VI00)
	NOP	LQ VF19, lightMat+1(VI00)
	NOP	LQ VF20, lightMat+2(VI00)

Loop:
	NOP	LQI VF01, (VI02++)	; vertex
	NOP	LQI VF02, (VI02++)	; UV
	NOP	LQI VF03, (VI02++)	; color
	NOP	LQI VF04, (VI02++)	; normal

	MULAw.xyzw ACC, VF31, VF00w	NOP	; transform vertex
	MADDAx.xyzw ACC, VF28, VF01x	NOP
	MADDAy.xyzw ACC, VF29, VF01y	NOP
	MADDz.xyzw VF01, VF30, VF01z	NOP
	ITOF0 VF03, VF03	NOP
	ITOF0[I] VF04, VF04	LOI 0.0078125	; - normal scale
	NOP	NOP
	NOP	DIV Q, VF00w, VF01w
	NOP	WAITQ
	MULq	VF01, VF01, Q	NOP	; perspective division
	MULi VF04, VF04, I	NOP	; scale normal
	NOP	MR32.z VF02, VF00
	NOP	NOP
	SUB.w VF01, VF01, VF01	NOP
	MULAx.xyz ACC, VF18, VF04x	NOP	; transform normal
	MADDAy.xyz ACC, VF19, VF04y	NOP
	MADDz.xyz VF04, VF20, VF04z	NOP
	ADD.xy VF01, VF01, VF25	NOP
	MULq VF02, VF02, Q	NOP
	NOP	NOP
	FTOI0 VF03, VF03	NOP
	FTOI4 VF01, VF01	NOP
	NOP	SQ VF04, -1(VI02)	; store normal
	NOP	IADDI VI01, VI01, -1
	NOP	SQI VF02, (VI03++)	; STQ
	NOP	SQI VF03, (VI03++)	; color
	NOP	SQI VF01, (VI03++)	; vertex
	NOP	IBNE VI01, VI00, Loop
	NOP	NOP

	.include "light.vu"

	NOP	XGKICK VI12
	NOP	IADD VI15,VI00,VI12
	NOP	IADD VI12,VI00,VI13
	NOP[E]	IADD VI13,VI00,VI15
	NOP	NOP
	NOP	B Cnt
	NOP	NOP

.EndMPG
.EndDmaData