Skip to content

Instantly share code, notes, and snippets.

@dpasca
Created January 23, 2020 17:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dpasca/e26189654b58e55a640420dd5f568374 to your computer and use it in GitHub Desktop.
Save dpasca/e26189654b58e55a640420dd5f568374 to your computer and use it in GitHub Desktop.
/*=======================================================================
VF01 - VF04 : perspective + transformation matrix
VF05 - VF08 : light color matrix
VF09 - VF12 : X light vector matrix(3 lighting vector + 1 ambient)
VF13 : temp light / gif tag
VF14 : temp light
VF15 : temp vert for clipping
VF16 : * unused
VF17 : * unused
VF18 : * unused
VF19 : * unused
VF20 : source vertex
VF21 : source normal
VF22 : material color
VF23 : ambient color
VF24 : * unused
VF25 : * unused
VF26 : temp color
VF27 : vertex (p)
VF28 : temp vertex
VF29 : * unused
VF30 : * unused
VF31 : * unused
VI02 : last src vert addr
VI03 : pointer for vertex
VI04 : pointer for normal
VI05 : temp clip flags
VI06 : no kick flag
VI07-VI09 : nodraw flag
VI11 : * unused
VI12 : obj flags
VI10 : counter for vertices
VF14 = ACC(L COLOR) + VF23(ambient color) * 1
=======================================================================*/
/*========================== PER OBJECT ================================*/
NOP BAL VI15, OBJECT_SETUP_GMX
NOP NOP
NOP[E] NOP
NOP NOP
/*========================== PER STRIP ================================*/
START_GMCSL:
NOP BAL VI15, PRIMPACKET_SETUP_GMX
NOP LQ VF22, KGL_VU1_MATERIAL_COL_ADDR(VI00) ; material color (reload cause clipping uses vf22)
NOP LOI 0.00390625 ;// prepare coefficient for VF29
MULi.xyz VF30, VF22, I NOP
;// NOP LOI 2.0 ;// compensate for texture brightness
;// MULi.xyzw VF23, VF23, I LOI 0.5 ;//
;// MULi.xyzw VF22, VF22, I NOP ;//
NOP IADD VI04, VI03, VI00 ;// VI04 = dest data (overwrite source)
NOP LQI VF29, (VI03++) ;// load color
NOP LQI VF21, (VI03++) ;// load normal
NOP LQI VF20, (VI03++) ;// load vertex
NOP IBNE VI13, VI00, JUMP_GMCSL_NL
ITOF0 VF29, VF29 NOP
ITOF12 VF21,VF21 NOP
ITOF4.xyz VF20,VF20 NOP
MULAx.xyzw ACC, VF05, VF21x NOP
MADDAy.xyzw ACC, VF06, VF21y NOP
MADDz.xyzw VF13, VF07, VF21z NOP
MULAx.xyzw ACC, VF01, VF20x NOP
MADDAy.xyzw ACC, VF02, VF20y LQ VF21, 1(VI03) ;// load normal
MADDAz.xyzw ACC, VF03, VF20z NOP
MAXx.xyzw VF13, VF13, VF00x NOP
MADDw.xyzw VF27, VF04, VF00w NOP
ITOF12 VF21,VF21 NOP
MULAx.xyzw ACC, VF09, VF13x NOP
MADDAy.xyzw ACC, VF10, VF13y NOP
/*================================================*/
LOOP_GMCSL:
MADDz.xyzw VF14, VF11, VF13z DIV Q, VF00w, VF27w
;//----- Temporary for shadows -----
NOP MOVE.xyz VF26, VF22
SUBAw.w ACCw, VF00w, VF00w NOP ;// ACCw = 0.0
MADDAx.w ACCw, VF00w, VF13x NOP ;// ACCw = 1.0 * VF14x
MADDAy.w ACCw, VF00w, VF13y NOP ;// ACCw = 1.0 * VF14x + 1.0 * VF14y
MADDz.w VF26, VF00w, VF13z NOP ;// VF26w = VF14x + VF14y + VF14z
NOP LOI -255.0 ;//
MULi.w VF26, VF26, I LOI 255.0 ;// VF26w = (VF14x + VF14y + VF14z) * 255 / 3
ADDi.w VF26, VF26, I NOP
;//---------------------------------
MULAx.xyzw ACC, VF05, VF21x MOVE.w VF28w, VF20w ;// VF28w = nodraw flag
MADDAy.xyzw ACC, VF06, VF21y MTIR VI06, VF20w ;// VI06 = nodraw flag
MADDz.xyzw VF13, VF07, VF21z LQ VF20, 2(VI03) ;// load vertex
NOP LQ.xyz VF21, 3+1(VI03) ;// .
NOP LOI 255.0
NOP LQ VF29, 0(VI03) ;// VF29 = source color
MAXx.xyzw VF13, VF13, VF00x MOVE VF15, VF27 ;// for clip section
ITOF4.xyz VF20, VF20 NOP
MULq.xyz VF28, VF27, Q ISUBIU VI10, VI10, 1
MINIi.xyzw VF26, VF26, I IADDI VI04, VI04, 2 ;// inc dest
ITOF0 VF29, VF29 IBEQ VI12, VI00, NOCLIP_GMCSL
ITOF12 VF21, VF21 IADDI VI03, VI03, 3 ;// inc source
NOP BAL VI15, CLIP_LOOP_SECTION_GMT_NEAR
NOP IADDI VI01, VI00, 2
NOCLIP_GMCSL:
MULAx.xyzw ACC, VF01, VF20x NOP
FTOI0.xyzw VF26, VF26 NOP
FTOI4.xyz VF28, VF28 NOP
MADDAy.xyzw ACC, VF02, VF20y NOP
MADDAz.xyzw ACC, VF03, VF20z NOP
MADDw.xyzw VF27, VF04, VF00w SQ VF26, -2+0(VI04)
MULAx.xyzw ACC, VF09, VF13x IBNE VI10, VI00, LOOP_GMCSL
MADDAy.xyzw ACC, VF10, VF13y SQ VF28, -2+1(VI04)
/* --- send result to GIF and stop --- */
NOP XTOP VI01 ;// first row is for triangle fan..
NOP IADDI VI01, VI01, 1 ;// ..giftag for clipping !
KGL_XGKICK VI01
NOP[E] B START_GMCSL
NOP NOP
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/*========================== PER STRIP ================================*/
START_GMCSL_NL:
NOP BAL VI15, PRIMPACKET_SETUP_GMX
NOP LQ VF22, KGL_VU1_MATERIAL_COL_ADDR(VI00) ; material color (reload cause clipping uses vf22)
NOP LOI 0.00390625 ;// prepare coefficient for VF29
MULi.xyz VF30, VF22, I NOP
NOP IADD VI04, VI03, VI00 ;// VI04 = dest data (overwrite source)
NOP LQI VF29, (VI03++) ;// load color
NOP LQI VF21, (VI03++) ;// load normal
NOP LQI VF20, (VI03++) ;// load vertex
NOP NOP
ITOF0 VF29, VF29 NOP
JUMP_GMCSL_NL:
ITOF12 VF21,VF21 NOP
ITOF4.xyz VF20,VF20 NOP
MULAx.xyzw ACC, VF01, VF20x NOP
MADDAy.xyzw ACC, VF02, VF20y LQ VF21, 1(VI03) ;// load normal
MADDAz.xyzw ACC, VF03, VF20z NOP
MADDw.xyzw VF27, VF04, VF00w NOP
ITOF12 VF21,VF21 NOP
/*================================================*/
LOOP_GMCSL_NL:
NOP DIV Q, VF00w, VF27w
NOP MOVE.w VF28w, VF20w ;// VF28w = nodraw flag
NOP MTIR VI06, VF20w ;// VI06 = nodraw flag
NOP LQ VF20, 2(VI03) ;// load vertex
MUL.xyzw VF26, VF30, VF29 NOP
NOP LQ VF29, 0(VI03) ;// VF29 = source color
NOP MOVE VF15, VF27 ;// for clip section
MULq.xyz VF28, VF27, Q ISUBIU VI10, VI10, 1
ITOF4.xyz VF20, VF20 IADDI VI04, VI04, 2 ;// inc dest
ITOF0 VF29, VF29 IBEQ VI12, VI00, NOCLIP_GMCSL_NL
ITOF12 VF21, VF21 IADDI VI03, VI03, 3 ;// inc source
NOP BAL VI15, CLIP_LOOP_SECTION_GMT_NEAR
NOP IADDI VI01, VI00, 2
NOCLIP_GMCSL_NL:
FTOI0.xyzw VF26, VF26 NOP
FTOI4.xyz VF28, VF28 NOP
MULAx.xyzw ACC, VF01, VF20x NOP
MADDAy.xyzw ACC, VF02, VF20y NOP
MADDAz.xyzw ACC, VF03, VF20z SQ VF26, -2+0(VI04)
MADDw.xyzw VF27, VF04, VF00w IBNE VI10, VI00, LOOP_GMCSL_NL
NOP SQ VF28, -2+1(VI04)
/* --- send result to GIF and stop --- */
NOP XTOP VI01 ;// first row is for triangle fan..
NOP IADDI VI01, VI01, 1 ;// ..giftag for clipping !
KGL_XGKICK VI01
NOP[E] B START_GMCSL_NL
NOP NOP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment