; Vertex renderer code (c) TyRaNiD (James Forshaw) 2002
; Takes a list of verteces (must be multiple of 3), with point normals, transforms and colours
; Then outputs to GIF

.global vucodebegin
.global vucodeend
.global vu_buildmatrix
.global vu_mulpoint
.global vu_renderpoints
.global vu_renderstrips

; Object to world location
vu_o2w_m=0
; World to view
vu_w2v_m=4
; Projection matrix
vu_proj_m=8
; Screen Size
vu_scrsize=12
; Screen Offset
vu_scroffs=13
; GifTag
vu_giftag=14
; GifEnd
vu_gifend=15
; Object colour
vu_objcol=16
; Scene light
vu_light=17

.p2align 8
.vu
vucodebegin:
	nop				nop
	nop				nop
	nop				nop

vu_renderstrips:
	nop				nop
	nop				nop
	nop				xtop	vi01
	nop				lq	vf10, vu_o2w_m+0(vi00)
	nop				lq	vf11, vu_o2w_m+1(vi00)
	nop				lq	vf12, vu_o2w_m+2(vi00)
	nop				lq	vf13, vu_o2w_m+3(vi00)
	nop				lq	vf02, vu_proj_m+0(vi00)
	nop				lq	vf03, vu_proj_m+1(vi00)
	nop				lq	vf04, vu_proj_m+2(vi00)
	nop				lq	vf05, vu_proj_m+3(vi00)
	nop				lq	vf23, vu_w2v_m+0(vi00)
	nop				lq	vf24, vu_w2v_m+1(vi00)
	nop				lq	vf25, vu_w2v_m+2(vi00)
	nop				lq	vf26, vu_w2v_m+3(vi00)
	nop				lq	vf06, vu_light(vi00)

	nop				lq	vf15, vu_objcol(vi00)
	;ftoi0.xyzw vf15, vf15		nop
	nop				lq	vf16, vu_scrsize(vi00)
	nop				lq	vf17, vu_scroffs(vi00)
	nop				lq	vf18, vu_giftag(vi00)
	nop				lq	vf19, vu_gifend(vi00)
	; Calculate gif buffer
	nop				iaddiu	vi02, vi01, 247
	nop				iadd	vi04, vi00, vi02
	nop				sqi	vf18, (vi04++)	
	; Load number of vertices
	nop				ilw.x	vi03, 0(vi01)
	nop				iaddi	vi01, vi01, 1
	; Set the counter for vertices rendered
	nop				iadd 	vi09, vi00, vi00
strip_loop:
	nop				nop
	; Load vertex
	nop				lqi	vf20, (vi01++)
	; Load normal
	nop				lqi	vf21, (vi01++)
	; Load uv
	nop				lqi	vf22, (vi01++)
 
	; Multiply obj2world
	mulax.xyzw ACC, vf10, vf20	nop
	madday.xyzw ACC, vf11, vf20	nop
	maddaz.xyzw ACC, vf12, vf20	nop
	maddw.xyzw  vf20, vf13, vf20	nop

        ; Multiply world2view
	mulax.xyzw ACC, vf23, vf20	nop
	madday.xyzw ACC, vf24, vf20	nop
	maddaz.xyzw ACC, vf25, vf20	nop
	maddw.xyzw  vf20, vf26, vf20	nop

	; Rotate normal
	mulax.xyzw ACC, vf10, vf21	nop
	madday.xyzw ACC, vf11, vf21	nop
	maddaz.xyzw ACC, vf12, vf21	nop
	maddw.xyzw  vf21, vf13, vf21	nop

	; Project
	mulax.xyzw ACC, vf02, vf20	nop
	madday.xyzw ACC, vf03, vf20	nop
	maddaz.xyzw ACC, vf04, vf20	nop
	maddw.xyzw  vf01, vf05, vf20	nop
	nop				div q, vf00w, vf01w
	
	; Calculate n.l
	mul.xyz	vf21, vf21, vf06	nop
	maxw.x 	vf07, vf00, vf00	nop
	adday.x ACC, vf21x, vf21y	nop
	maddz.x Vf07x, vf07x, vf21z	nop	
	; Set to 0 if < 0
	max.x	vf07x, vf07x, vf00x	nop
	; Broadcast multiply n.l to colour
	mulx.xyzw vf08, vf15, vf07x	nop
	ftoi0	vf08, vf08		nop
	;ftoi0 	vf08, vf15		nop

	nop				waitq
	mulq.xyzw   vf01, vf01, q	nop
	mul.xyzw    vf01, vf01, vf16	nop
	add.xyzw    vf01, vf01, vf17	nop
	ftoi4.xy    vf01, vf01		nop
	ftoi0.z	    vf01, vf01		mfir.w	vf01w, vi00
	
	nop				sqi	vf08, (vi04++)
	nop				sqi	vf01, (vi04++)

	nop				iaddi	vi03, vi03, -1
	nop				iaddi	vi09, vi09, 1
	nop				nop
	nop				nop	
	nop				ibgtz    vi03, strip_loop
	nop				nop
	nop				isw.x	vi09, 0(vi02)
	nop				sqi	vf19, (vi04++)	
	nop				nop
	nop				nop
	nop				xgkick	vi02
	nop				nop
	nop[e]				nop
	nop				nop
.p2align 8
vucodeend: