; 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: