;//////////////////////////////////////////////////////////////////////////////////////////////////
;//
;// Note that this code is highly unoptimized, but might be useful to learn from or so.
;//

ViewScreenMatrix = 0
CameraMatrix     = 4
Scale            = 8
Color            = 9
Giftag           = 13
Data             = 14
Dest             = Data+50

.global         g_Vu1CubeRender
.global         g_Vu1CubeRender_End                
                        
                .p2align 4  ; This aligns the following data to quadword alignment
                .vu

g_Vu1CubeRender:
                nop                             lq          vf28, ViewScreenMatrix+0(vi00)
                nop                             lq          vf29, ViewScreenMatrix+1(vi00)
                nop                             lq          vf30, ViewScreenMatrix+2(vi00)
                nop                             lq          vf31, ViewScreenMatrix+3(vi00)

                nop                             lq          vf24, CameraMatrix+0(vi00)
                nop                             lq          vf25, CameraMatrix+1(vi00)
                nop                             lq          vf26, CameraMatrix+2(vi00)
                nop                             lq          vf27, CameraMatrix+3(vi00)

                ;nop                             xitop       vi04
                nop                             iaddiu      vi04, vi00, 50
                nop                             iadd        vi02, vi00, vi04        ; 
                nop                             iadd        vi03, vi00, vi04        ; xgkick adree
                nop                             iaddiu      vi01, vi00, Data        ; coord adress
                
                nop                             lq.xyzw     vf21, Color(vi00)       ; giftag
                nop                             lq.xyzw     vf06, Giftag(vi00)      ; giftag
                nop                             lq.xyzw     vf07, Scale(vi00)       ; giftag
                nop                             sqi.xyzw    vf06, (vi02++)          ; store the giftag

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Calculate Screen * Camera

                mulax     acc,  vf28, vf24      nop
                madday    acc,  vf29, vf24      nop
                maddaz    acc,  vf30, vf24      nop
                maddw     vf01, vf31, vf24      nop
                
                mulax     acc,  vf28, vf25      nop
                madday    acc,  vf29, vf25      nop
                maddaz    acc,  vf30, vf25      nop
                maddw     vf02, vf31, vf25      nop
                
                mulax     acc,  vf28, vf26      nop
                madday    acc,  vf29, vf26      nop
                maddaz    acc,  vf30, vf26      nop
                maddw     vf03, vf31, vf26      nop
                
                mulax     acc,  vf28, vf27      nop
                madday    acc,  vf29, vf27      nop
                maddaz    acc,  vf30, vf27      nop
                maddw     vf04, vf31, vf27      nop

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Static color for now
                
                nop                             loi 20.0
                addi        vf10,vf00,I         nop
                ftoi0       vf10, vf10          nop

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Do the loop
                ;// first pass render backface culled

                sub         vf20, vf20, vf20    nop
                nop                             iaddiu      vi05, vi00, 12
p_loop:

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Project point

                nop                             lqi         vf05, (vi01++)       ; XYZ
                mul       vf05, vf05, vf07      nop
                mulax     acc,  vf01, vf05x     nop                                 
                madday    acc,  vf02, vf05y     nop                                 
                maddaz    acc,  vf03, vf05z     nop                                 
                maddw     vf05, vf04, vf05w     nop                                 
                nop                             div         q, vf00w, vf05w         
                nop                             waitq
                mulq      vf05, vf05, q         nop                                 
                nop                             move        vf11, vf05
                ftoi4     vf18, vf05            nop

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Project point

                nop                             lqi         vf05, (vi01++)       ; XYZ
                mul       vf05, vf05, vf07      nop
                mulax     acc,  vf01, vf05x     nop                                 
                madday    acc,  vf02, vf05y     nop                                 
                maddaz    acc,  vf03, vf05z     nop                                 
                maddw     vf05, vf04, vf05w     nop                                 
                nop                             div         q, vf00w, vf05w         
                nop                             waitq
                mulq      vf05, vf05, q         nop                                 
                nop                             move        vf12, vf05
                ftoi4     vf19, vf05            nop

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Project point

                nop                             lqi         vf05, (vi01++)       ; XYZ
                mul       vf05, vf05, vf07      nop
                mulax     acc,  vf01, vf05x     nop                                 
                madday    acc,  vf02, vf05y     nop                                 
                maddaz    acc,  vf03, vf05z     nop                                 
                maddw     vf05, vf04, vf05w     nop                                 
                nop                             div         q, vf00w, vf05w         
                nop                             waitq
                mulq      vf05, vf05, q         nop                                 
                nop                             move        vf13, vf05
                ftoi4     vf05, vf05            nop
                
                ;///////////////////////////////////////////////////////////////////////////////////////
                ;// do bfc
                
                sub        vf12, vf12, vf11     nop     ; v2 - v1
                sub        vf13, vf13, vf11     nop     ; v3 - v1
                opmula.xyz acc, vf13,vf12       nop
                opmsub.xyz vf14,vf12,vf13       nop
                                
                ;///////////////////////////////////////////////////////////////////////////////////////
                ;/ check if z is negative
                
                mulw.z     vf14,vf14,vf00       nop
                nop                             iaddiu      vi11,   vi00, 0x20
                nop                             fmand       vi07,   vi11              
                nop                             ibne        vi07,   vi00, DrawKick
                nop                             nop
                nop                             iaddiu      vi12, vi00, 0x7fff
                nop                             iaddiu      vi12, vi12, 0x1
                nop                             mfir.w      vf05w,  vi12   
                nop                             mfir.w      vf18w,  vi12   
                nop                             mfir.w      vf19w,  vi12   
DrawKick:                
                nop                             nop
                
                ;//////////////////////////////////////////////////////////////////////////////////////
                ;// create color
                
                abs       vf14, vf14            nop
                addz.x    vf15x, vf00x,vf14z    nop
                addz.y    vf15y, vf00y,vf14z    nop
                addz.z    vf15z, vf00z,vf14z    nop
                mul       vf15, vf15, vf21      loi 127
                addi.w    vf15, vf20, i         nop          
                ftoi0     vf15, vf15            nop
                nop                             sqi         vf15, (vi02++)       ; RGA
                nop                             sqi         vf18, (vi02++)       ; XYZ
                nop                             sqi         vf19, (vi02++)       ; XYZ
                nop                             sqi         vf05, (vi02++)       ; XYZ
                nop                             nop                
                nop                             iaddi       vi05, vi05, -1       ; 
                nop                             nop                              ;
                nop                             ibne        vi05, vi00, p_loop   ; loop check
                nop                             nop
                ;nop                             xgkick      vi03
                nop                             nop
                nop                             nop
                nop                             nop

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Do the loop
                
                nop                             iaddiu      vi01, vi00, Data        ; coord adress
                nop                             iadd        vi03, vi00, vi02
                nop                             lq.xyzw     vf06, Giftag(vi00)      ; giftag
                nop                             lq.xyzw     vf07, Scale(vi00)      ; giftag
                nop                             sqi.xyzw    vf06, (vi02++)          ; store the giftag
                nop                             iaddiu      vi05, vi00, 12
                
p_loop_2:

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Project point

                nop                             lqi         vf05, (vi01++)       ; XYZ
                mul       vf05, vf05, vf07      nop
                mulax     acc,  vf01, vf05x     nop                                 
                madday    acc,  vf02, vf05y     nop                                 
                maddaz    acc,  vf03, vf05z     nop                                 
                maddw     vf05, vf04, vf05w     nop                                 
                nop                             div         q, vf00w, vf05w         
                nop                             waitq
                mulq      vf05, vf05, q         nop                                 
                nop                             move        vf11, vf05
                ftoi4     vf18, vf05            nop

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Project point

                nop                             lqi         vf05, (vi01++)       ; XYZ
                mul       vf05, vf05, vf07      nop
                mulax     acc,  vf01, vf05x     nop                                 
                madday    acc,  vf02, vf05y     nop                                 
                maddaz    acc,  vf03, vf05z     nop                                 
                maddw     vf05, vf04, vf05w     nop                                 
                nop                             div         q, vf00w, vf05w         
                nop                             waitq
                mulq      vf05, vf05, q         nop                                 
                nop                             move        vf12, vf05
                ftoi4     vf19, vf05            nop

                ;////////////////////////////////////////////////////////////////////////////////////////
                ;// Project point

                nop                             lqi         vf05, (vi01++)       ; XYZ
                mul       vf05, vf05, vf07      nop
                mulax     acc,  vf01, vf05x     nop                                 
                madday    acc,  vf02, vf05y     nop                                 
                maddaz    acc,  vf03, vf05z     nop                                 
                maddw     vf05, vf04, vf05w     nop                                 
                nop                             div         q, vf00w, vf05w         
                nop                             waitq
                mulq      vf05, vf05, q         nop                                 
                nop                             move        vf13, vf05
                ftoi4     vf05, vf05            nop
                
                ;///////////////////////////////////////////////////////////////////////////////////////
                ;// do bfc
                
                sub        vf12, vf12, vf11     nop     ; v2 - v1
                sub        vf13, vf13, vf11     nop     ; v3 - v1
                opmula.xyz acc, vf13,vf12       nop
                opmsub.xyz vf14,vf12,vf13       nop
                                
                ;///////////////////////////////////////////////////////////////////////////////////////
                ;/ check if z is negative
                
                mulw.z     vf14,vf14,vf00       nop
                nop                             iaddiu      vi11,   vi00, 0x20
                nop                             fmand       vi07,   vi11              
                nop                             ibeq        vi07,   vi00, DrawKick_2
                nop                             nop
                nop                             iaddiu      vi12, vi00, 0x7fff
                nop                             iaddiu      vi12, vi12, 0x1
                nop                             mfir.w      vf05w,  vi12   
                nop                             mfir.w      vf18w,  vi12   
                nop                             mfir.w      vf19w,  vi12   
DrawKick_2:                
                nop                             nop
                
                ;//////////////////////////////////////////////////////////////////////////////////////
                ;// normalize vector
                ;// 
                
                ;mul.xyz   vf15,  vf14,  vf14    nop 
                ;addy.x    vf15x, vf15x, vf15y   nop
                ;addz.x    vf15x, vf15x, vf15z   loi 1256
                ;nop                             rsqrt q, vf00w, vf15x
                ;nop                             waitq
                ;mulq      vf14, vf14, q         nop                             
                ;muli      vf14, vf14, i         loi 64
                abs       vf14, vf14            nop
                ;maxw.z    vf14z, vf14z, vf00w   nop
                addz.x    vf15x, vf00x,vf14z    nop
                addz.y    vf15y, vf00y,vf14z    nop
                addz.z    vf15z, vf00z,vf14z    nop
                mul       vf15, vf15, vf21      loi 64
                addi.w    vf15, vf20, i         nop          
                ftoi0     vf15, vf15            nop
                nop                             sqi         vf15, (vi02++)       ; RGA
                nop                             sqi         vf18, (vi02++)       ; XYZ
                nop                             sqi         vf19, (vi02++)       ; XYZ
                nop                             sqi         vf05, (vi02++)       ; XYZ
                nop                             nop                
                nop                             iaddi       vi05, vi05, -1       ; 
                nop                             nop                              ;
                nop                             ibne        vi05, vi00, p_loop_2 ; loop check
                nop                             nop
                nop                             xgkick      vi03
                nop[e]                          nop
                nop                             nop

g_Vu1CubeRender_End: