QuitAndFail: NOP[E] IADDIU VI01, VI00, 0 NOP NOP QuitAndSucceed: NOP[E] IADDIU VI01, VI00, 1 NOP NOP ; 20 -- unused ; VF12, VF13 xyz: sphere centers ; VF14, VF15 x: sphere radii ; out: ; VI01: set when collision ; VF01: supposed to be intersection point? ; VF02: normal (pointing towards s1, not normalized) .globl Vu0SphereToSphereCollision Vu0SphereToSphereCollision: SUB.xyz VF02, VF13, VF12 NOP ; dist of centers ADD.x VF04, VF14, VF15 NOP ; s = sum of radii MUL.xyzw VF03, VF02, VF02 NOP ; MUL.x VF04, VF04, VF04 DIV Q, VF14x, VF04x ; square s NOP NOP ; NOP NOP ; MULAx.w ACC, VF00, VF03 NOP ; MADDAy.w ACC, VF00, VF03 NOP ; MADDz.w VF03, VF00, VF03 NOP ; d = DistSq of centers NOP NOP ; MULAw.xyz ACC, VF12, VF00 NOP ; MADDq.xyz VF01, VF02, Q NOP ; intersection, but wrong CLIPw.xyz VF04, VF03 NOP ; compare s and d SUB.xyz VF02, VF00, VF02 NOP ; compute normal NOP NOP ; NOP NOP ; NOP FCAND VI01, 0x3 ; 0x2 cannot be set here NOP[E] NOP ; NOP NOP ; ; B8 -- unused ; VF12: ; VF13: radius ; VF14: ; VF15: box dimensions (?) .globl Vu0SphereToAABBCollision Vu0SphereToAABBCollision: SUB.xyz VF03, VF12, VF14 LOI 0.5 MULi.xyz VF15, VF15, I NOP MUL.x VF13, VF13, VF13 NOP SUB.xyz VF04, VF03, VF15 NOP ADD.xyz VF05, VF03, VF15 MR32.xyzw VF16, VF15 CLIPw.xyz VF03, VF16 MR32.xyzw VF17, VF16 MUL.xyz VF04, VF04, VF04 NOP MUL.xyz VF05, VF05, VF05 NOP CLIPw.xyz VF03, VF17 MR32.xyzw VF16, VF17 NOP FCAND VI01, 0x1 MINI.xyz VF04, VF04, VF05 MFIR.x VF09, VI01 NOP NOP CLIPw.xyz VF03, VF16 FCAND VI01, 0x4 NOP MFIR.y VF09, VI01 NOP NOP MULAx.w ACC, VF00, VF00 NOP ADD.xyz VF01, VF00, VF03 FCAND VI01, 0x10 NOP MFIR.z VF09, VI01 NOP LOI 2 NOP FCAND VI01, 0x30 SUBAw.xyz ACC, VF00, VF00 IADD VI04, VI00, VI01 ITOF0.xyz VF09, VF09 FCAND VI01, 0x300 NOP IADD VI03, VI00, VI01 NOP FCAND VI01, 0x3000 NOP IADD VI02, VI00, VI01 MADDi.xyzw VF09, VF09, I NOP NOP IBEQ VI04, VI00, IgnoreZValue NOP NOP MADDAz.w ACC, VF00, VF04 NOP MUL.z VF01, VF09, VF15 NOP IgnoreZValue: NOP IBEQ VI03, VI00, IgnoreYValue NOP NOP MADDAy.w ACC, VF00, VF04 NOP MUL.y VF01, VF09, VF15 NOP IgnoreYValue: NOP IBEQ VI02, VI00, IgnoreXValue NOP NOP MADDAx.w ACC, VF00, VF04 NOP MUL.x VF01, VF09, VF15 NOP IgnoreXValue: MADDx.w VF06, VF00, VF00 NOP SUB.xyz VF02, VF03, VF01 NOP ADD.xyz VF01, VF01, VF14 NOP MULx.w VF01, VF00, VF00 NOP CLIPw.xyz VF13, VF06 NOP NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x1 QuitMicrocode: NOP[E] NOP NOP NOP ; 240 .globl Vu0LineToSphereCollision Vu0LineToSphereCollision: SUB.xyzw VF01, VF13, VF12 NOP SUB.xyzw VF02, VF14, VF12 NOP MUL.xyz VF03, VF01, VF02 NOP MUL.xyz VF04, VF01, VF01 NOP MUL.x VF15, VF15, VF15 NOP MUL.xyz VF02, VF02, VF02 NOP MULAx.w ACC, VF00, VF03 NOP MADDAy.w ACC, VF00, VF03 NOP MADDz.w VF03, VF00, VF03 NOP MULAx.w ACC, VF00, VF04 NOP MADDAy.w ACC, VF00, VF04 NOP MADDz.w VF01, VF00, VF04 NOP MULAx.w ACC, VF00, VF02 NOP MADDAy.w ACC, VF00, VF02 NOP MADDz.w VF02, VF00, VF02 NOP MULA.w ACC, VF03, VF03 NOP MADDAx.w ACC, VF01, VF15 NOP MSUB.w VF05, VF01, VF02 NOP NOP NOP NOP NOP NOP IADDIU VI02, VI00, 0x10 NOP FMAND VI01, VI02 NOP IBNE VI01, VI00, QuitAndFail NOP NOP CLIPw.xyz VF15, VF02 SQRT Q, VF05w NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x1 NOP IBNE VI00, VI01, LineStartInsideSphere NOP NOP SUBq.w VF05, VF03, Q NOP SUB.w VF05, VF05, VF01 DIV Q, VF05w, VF01w NOP FMAND VI01, VI02 NOP IBNE VI01, VI00, QuitAndFail NOP NOP NOP FMAND VI01, VI02 NOP IBEQ VI01, VI00, QuitAndFail NOP NOP ADDA.xyz ACC, VF12, VF00 NOP MADDq.xyz VF01, VF01, Q NOP MULx.w VF01, VF00, VF00 NOP SUB.xyz VF02, VF01, VF14 NOP NOP[E] NOP NOP NOP LineStartInsideSphere: NOP MOVE.xyzw VF01, VF12 NOP[E] IADDIU VI01, VI00, 0x1 NOP NOP ; 3C0 .globl Vu0LineToAABBCollision Vu0LineToAABBCollision: SUB.xyzw VF08, VF13, VF12 LOI 0.5 MULi.xyz VF15, VF15, I IADDIU VI08, VI00, 0x0 SUB.xyzw VF12, VF12, VF14 NOP SUB.xyzw VF13, VF13, VF14 NOP NOP DIV Q, VF00w, VF08x NOP MR32.xyzw VF03, VF15 SUB.xyz VF06, VF15, VF12 NOP ADD.xyz VF07, VF15, VF12 NOP NOP NOP CLIPw.xyz VF12, VF03 MR32.xyzw VF04, VF03 NOP NOP ADDq.x VF09, VF00, Q DIV Q, VF00w, VF08y NOP NOP CLIPw.xyz VF12, VF04 MR32.xyzw VF05, VF04 SUB.xyz VF07, VF00, VF07 IADDIU VI06, VI00, 0xCC NOP IADDIU VI07, VI00, 0x30 NOP NOP CLIPw.xyz VF12, VF05 FCGET VI02 NOP IAND VI02, VI02, VI06 ADDq.y VF09, VF00, Q DIV Q, VF00w, VF08z SUB.xyz VF10, VF00, VF10 NOP CLIPw.xyz VF13, VF03 FCGET VI03 CLIPw.xyz VF13, VF04 IAND VI03, VI03, VI07 CLIPw.xyz VF13, VF05 FCAND VI01, 0x3330 NOP IBEQ VI01, VI00, StartPointInsideAABB NOP NOP ADDq.z VF09, VF00, Q FCGET VI04 NOP FCGET VI05 NOP IAND VI04, VI04, VI06 NOP IAND VI05, VI05, VI07 MULx.xyz VF17, VF08, VF09 NOP MULy.xyz VF18, VF08, VF09 IADDIU VI07, VI00, 0x80 MULz.xyz VF19, VF08, VF09 IAND VI06, VI02, VI07 MUL.w VF10, VF00, VF00 IAND VI07, VI04, VI07 NOP NOP NOP IBEQ VI06, VI07, CheckMaxXSide NOP NOP MULAx.xyz ACC, VF17, VF07 NOP MADDw.xyz VF16, VF12, VF00 NOP MUL.x VF10, VF07, VF09 NOP CLIPw.xyz VF16, VF04 NOP CLIPw.xyz VF16, VF05 NOP NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x330 NOP IBNE VI01, VI00, CheckMaxXSide NOP NOP MULx.w VF10, VF00, VF10 IADDIU VI08, VI00, 0x1 ADD.yz VF02, VF00, VF00 MOVE.xyzw VF01, VF16 SUBw.x VF02, VF00, VF00 NOP CheckMaxXSide: MULAx.xyz ACC, VF17, VF06 IADDIU VI07, VI00, 0x40 MADDw.xyz VF16, VF12, VF00 IAND VI06, VI02, VI07 MUL.x VF10, VF06, VF09 IAND VI07, VI04, VI07 NOP NOP NOP IBEQ VI06, VI07, CheckMinYSide NOP NOP CLIPw.xyz VF16, VF04 NOP CLIPw.xyz VF16, VF05 NOP CLIPw.xyz VF10, VF10 NOP NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0xCC03 NOP IBNE VI01, VI00, CheckMinYSide NOP NOP MULx.w VF10, VF00, VF10 IADDIU VI08, VI00, 0x1 ADD.yz VF02, VF00, VF00 MOVE.xyzw VF01, VF16 ADDw.x VF02, VF00, VF00 NOP CheckMinYSide: MULAy.xyz ACC, VF18, VF07 IADDIU VI07, VI00, 0x8 MADDw.xyz VF16, VF12, VF00 IAND VI06, VI02, VI07 MUL.y VF10, VF07, VF09 IAND VI07, VI04, VI07 NOP NOP NOP IBEQ VI06, VI07, CheckMaxYSide NOP NOP CLIPw.xyz VF16, VF03 NOP CLIPw.xyz VF16, VF05 NOP CLIPw.xyz VF10, VF10 NOP NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x3C0C NOP IBNE VI01, VI00, CheckMaxYSide NOP NOP MULy.w VF10, VF00, VF10 IADDIU VI08, VI00, 0x1 ADD.xz VF02, VF00, VF00 MOVE.xyzw VF01, VF16 SUBw.y VF02, VF00, VF00 NOP CheckMaxYSide: MULAy.xyz ACC, VF18, VF06 IADDIU VI07, VI00, 0x4 MADDw.xyz VF16, VF12, VF00 IAND VI06, VI02, VI07 MUL.y VF10, VF06, VF09 IAND VI07, VI04, VI07 NOP NOP NOP IBEQ VI06, VI07, CheckMinZSide NOP NOP CLIPw.xyz VF16, VF03 NOP CLIPw.xyz VF16, VF05 NOP CLIPw.xyz VF10, VF10 NOP NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x3C0C NOP IBNE VI01, VI00, CheckMinZSide NOP NOP MULy.w VF10, VF00, VF10 IADDIU VI08, VI00, 0x1 ADD.xz VF02, VF00, VF00 MOVE.xyzw VF01, VF16 ADDw.y VF02, VF00, VF00 NOP CheckMinZSide: MULAz.xyz ACC, VF19, VF07 IADDIU VI07, VI00, 0x20 MADDw.xyz VF16, VF12, VF00 IAND VI06, VI03, VI07 MUL.z VF10, VF07, VF09 IAND VI07, VI05, VI07 NOP NOP NOP IBEQ VI06, VI07, CheckMaxZSide NOP NOP CLIPw.xyz VF16, VF03 NOP CLIPw.xyz VF16, VF04 NOP CLIPw.xyz VF10, VF10 NOP NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x3330 NOP IBNE VI01, VI00, CheckMaxZSide NOP NOP MULz.w VF10, VF00, VF10 IADDIU VI08, VI00, 0x1 ADD.xy VF02, VF00, VF00 MOVE.xyzw VF01, VF16 SUBw.z VF02, VF00, VF00 NOP CheckMaxZSide: MULAz.xyz ACC, VF19, VF06 IADDIU VI07, VI00, 0x10 MADDw.xyz VF16, VF12, VF00 IAND VI06, VI03, VI07 MUL.z VF10, VF06, VF09 IAND VI07, VI05, VI07 NOP NOP NOP IBEQ VI06, VI07, DoneAllChecks NOP NOP CLIPw.xyz VF16, VF03 NOP CLIPw.xyz VF16, VF04 NOP CLIPw.xyz VF10, VF10 NOP NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x3330 NOP IBNE VI01, VI00, DoneAllChecks NOP NOP MULz.w VF10, VF00, VF10 IADDIU VI08, VI00, 0x1 ADD.xy VF02, VF00, VF00 MOVE.xyzw VF01, VF16 ADDw.z VF02, VF00, VF00 NOP DoneAllChecks: ADD.xyz VF01, VF01, VF14 IADD VI01, VI00, VI08 NOP[E] NOP NOP NOP StartPointInsideAABB: ADD.xyz VF01, VF12, VF14 WAITQ NOP IADDIU VI01, VI00, 0x1 NOP[E] NOP NOP NOP ; 860 .globl Vu0LineToTriangleCollisionCompressedStart Vu0LineToTriangleCollisionCompressedStart: ITOF0.xyzw VF17, VF17 LOI 0.000244140625 ; 1.0/4096.0 ITOF0.xyzw VF14, VF14 NOP ITOF0.xyzw VF15, VF15 NOP ITOF0.xyzw VF16, VF16 NOP MULi.xyz VF17, VF17, I LOI 0.0078125 ; 1.0/128.0 MULi.w VF17, VF17, I NOP MULi.xyzw VF14, VF14, I NOP MULi.xyzw VF15, VF15, I NOP MULi.xyzw VF16, VF16, I NOP ; fall through ; 8A8 ; VF12: point0 ; VF13: point1 ; VF14-16: verts ; VF17: plane ; out: ; VF01: intersection point ; VF02: triangle normal ; VF03 x: intersection parameter .globl Vu0LineToTriangleCollisionStart Vu0LineToTriangleCollisionStart: MUL.xyz VF10, VF17, VF12 LOI 0.5 MUL.xyz VF11, VF17, VF13 NOP SUB.xyz VF02, VF13, VF12 NOP ; line dist ADD.xyz VF17, VF17, VF00 NOP MULi.w VF03, VF00, I NOP MULAx.w ACC, VF00, VF10 NOP MADDAy.w ACC, VF00, VF10 IADDIU VI06, VI00, 0xE0 MADDz.w VF10, VF00, VF10 FMAND VI05, VI06 ; -- normal sign flags, unused MULAx.w ACC, VF00, VF11 NOP MADDAy.w ACC, VF00, VF11 NOP MADDz.w VF11, VF00, VF11 NOP SUB.w VF09, VF17, VF10 NOP ; plane-pos 0 CLIPw.xyz VF17, VF03 NOP ; compare normal against 0.5 to figure out which in which dimension to compare NOP IADDIU VI02, VI00, 0x10 ; Sw flag SUBA.w ACC, VF17, VF11 NOP ; plane-pos 1 SUB.w VF08, VF11, VF10 FMAND VI01, VI02 NOP NOP NOP NOP NOP FMAND VI02, VI02 NOP IBEQ VI01, VI02, QuitAndFail ; if on same side, no collision NOP NOP NOP DIV Q, VF09w, VF08w ; parameter of intersection NOP FCAND VI01, 0x3 ; check x direction NOP IADDIU VI02, VI01, 0x7F NOP IADDIU VI06, VI00, 0x80 NOP IAND VI02, VI02, VI06 ; Sx flag NOP FCAND VI01, 0xC ; check y direction NOP IADDIU VI03, VI01, 0x3F MULAw.xyz ACC, VF12, VF00 IADDIU VI06, VI00, 0x40 MADDq.xyz VF01, VF02, Q IAND VI03, VI03, VI06 ; point of intersection -- Sy flag MULx.w VF01, VF00, VF00 FCAND VI01, 0x30 ; -- check z direction ADDq.x VF03, VF00, Q IADDIU VI04, VI01, 0x1F ; output parameter SUB.xyz VF05, VF15, VF14 IADDIU VI06, VI00, 0x20 ; edge vectors SUB.xyz VF08, VF01, VF14 IAND VI04, VI04, VI06 ; edge vectors -- Sz flag SUB.xyz VF06, VF16, VF15 IADD VI06, VI02, VI03 ; edge vectors SUB.xyz VF09, VF01, VF15 IADD VI06, VI06, VI04 ; edge vectors -- combine flags SUB.xyz VF07, VF14, VF16 NOP ; edge vectors SUB.xyz VF10, VF01, VF16 NOP ; edge vectors OPMULA.xyz ACC, VF08, VF05 NOP OPMSUB.xyz VF18, VF05, VF08 NOP ; cross1 OPMULA.xyz ACC, VF09, VF06 NOP OPMSUB.xyz VF19, VF06, VF09 NOP ; cross2 OPMULA.xyz ACC, VF10, VF07 NOP OPMSUB.xyz VF20, VF07, VF10 FMAND VI02, VI06 ; cross3 NOP NOP NOP FMAND VI03, VI06 NOP NOP NOP FMAND VI04, VI06 NOP NOP NOP IBNE VI03, VI02, QuitAndFail ; point has to lie on the same side of all edges (i.e. inside) NOP NOP NOP IBNE VI04, VI02, QuitAndFail NOP NOP MULw.xyz VF02, VF17, VF00 IADDIU VI01, VI00, 0x1 ; success NOP[E] NOP NOP NOP ; A68 ; VF12: center ; VF14: line origin ; VF15: line vector to other point ; out: VF16 xyz: nearest point on line; w: distance to that point DistanceBetweenSphereAndLine: SUB.xyz VF20, VF12, VF14 NOP MUL.xyz VF21, VF15, VF15 NOP ADDA.xyz ACC, VF14, VF15 NOP MSUBw.xyz VF25, VF12, VF00 NOP ; VF25 = VF12 - (VF14+VF15) MUL.xyz VF22, VF20, VF20 NOP MUL.xyz VF23, VF20, VF15 NOP MULAx.w ACC, VF00, VF21 NOP MADDAy.w ACC, VF00, VF21 NOP MADDz.w VF21, VF00, VF21 NOP ; MagSq VF15 (line length) MULAx.w ACC, VF00, VF23 NOP MADDAy.w ACC, VF00, VF23 NOP MADDz.w VF23, VF00, VF23 NOP ; dot(VF12-VF14, VF15) MULAx.w ACC, VF00, VF22 NOP MADDAy.w ACC, VF00, VF22 NOP MADDz.w VF22, VF00, VF22 IADDIU VI08, VI00, 0x10 ; MagSq VF12-VF14 -- Sw bit MUL.xyz VF25, VF25, VF25 FMAND VI08, VI08 NOP DIV Q, VF23w, VF21w NOP IBNE VI00, VI08, NegativeRatio NOP NOP ADDA.xyz ACC, VF00, VF14 NOP MADDq.xyz VF16, VF15, Q WAITQ ; nearest point on infinte line ADDq.x VF24, VF00, Q NOP ; ratio NOP NOP NOP NOP SUB.xyz VF26, VF16, VF12 NOP CLIPw.xyz VF24, VF00 NOP ; compare ratio to 1.0 NOP NOP NOP NOP MUL.xyz VF26, VF26, VF26 NOP NOP FCAND VI01, 0x1 NOP IBNE VI00, VI01, RatioGreaterThanOne NOP NOP MULAx.w ACC, VF00, VF26 NOP MADDAy.w ACC, VF00, VF26 NOP MADDz.w VF16, VF00, VF26 NOP ; distance NOP JR VI15 NOP NOP NegativeRatio: ADD.xyz VF16, VF00, VF14 NOP ; return line origin MUL.w VF16, VF00, VF22 NOP ; and DistSq to it NOP JR VI15 NOP NOP RatioGreaterThanOne: MULAx.w ACC, VF00, VF25 NOP MADDAy.w ACC, VF00, VF25 NOP MADDz.w VF16, VF00, VF25 NOP ADD.xyz VF16, VF14, VF15 NOP ; return toerh line point NOP JR VI15 NOP NOP ; BE0 .globl Vu0SphereToTriangleCollisionCompressedStart Vu0SphereToTriangleCollisionCompressedStart: ITOF0.xyzw VF17, VF17 LOI 0.000244140625 ; 1.0/4096.0 ITOF0.xyzw VF14, VF14 NOP ITOF0.xyzw VF15, VF15 NOP ITOF0.xyzw VF16, VF16 NOP MULi.xyz VF17, VF17, I LOI 0.0078125 ; 1.0/128.0 MULi.w VF17, VF17, I NOP MULi.xyzw VF14, VF14, I NOP MULi.xyzw VF15, VF15, I NOP MULi.xyzw VF16, VF16, I NOP ; fall through ; C28 ; VF12: sphere ; VF14-16: verts ; VF17: plane ; out: ; VF01: intersection point ; VF02: triangle normal ; VF03 x: intersection parameter .globl Vu0SphereToTriangleCollisionStart Vu0SphereToTriangleCollisionStart: MUL.xyz VF02, VF12, VF17 LOI 0.1 ADD.xyz VF17, VF17, VF00 NOP ADDw.x VF13, VF00, VF12 NOP NOP NOP MULAx.w ACC, VF00, VF02 IADDIU VI06, VI00, 0xE0 MADDAy.w ACC, VF00, VF02 FMAND VI05, VI06 ; normal sign flags MADDAz.w ACC, VF00, VF02 NOP MSUB.w VF02, VF00, VF17 NOP ; center plane pos MULi.w VF03, VF00, I MOVE.xyzw VF04, VF03 NOP NOP NOP NOP CLIPw.xyz VF13, VF02 NOP ; compare dist and radius CLIPw.xyz VF17, VF03 NOP MULAw.xyz ACC, VF12, VF00 IADDIU VI07, VI00, 0x0 ; -- clear test case MSUBw.xyz VF01, VF17, VF02 NOP MULx.w VF01, VF00, VF00 FCAND VI01, 0x3 ; projected center on plane ABS.w VF02, VF02 IBEQ VI00, VI01, QuitAndFail ; no intersection NOP NOP NOP FCAND VI01, 0x3 ; -- check x direction SUB.xyz VF02, VF12, VF01 IADDIU VI02, VI01, 0x7F NOP IADDIU VI06, VI00, 0x80 SUB.xyz VF05, VF15, VF14 IAND VI02, VI02, VI06 SUB.xyz VF08, VF01, VF14 FCAND VI01, 0xC ; -- check y direction SUB.xyz VF06, VF16, VF15 IADDIU VI03, VI01, 0x3F SUB.xyz VF09, VF01, VF15 IADDIU VI06, VI00, 0x40 SUB.xyz VF07, VF14, VF16 IAND VI03, VI03, VI06 SUB.xyz VF10, VF01, VF16 FCAND VI01, 0x30 ; -- check z direction MUL.xyz VF03, VF02, VF02 IADDIU VI04, VI01, 0x1F OPMULA.xyz ACC, VF08, VF05 IADDIU VI06, VI00, 0x20 OPMSUB.xyz VF18, VF05, VF08 IAND VI04, VI04, VI06 OPMULA.xyz ACC, VF09, VF06 NOP OPMSUB.xyz VF19, VF06, VF09 IADD VI06, VI02, VI03 OPMULA.xyz ACC, VF10, VF07 IADD VI06, VI06, VI04 ; -- combine flags OPMSUB.xyz VF20, VF07, VF10 FMAND VI02, VI06 ; -- cross 1 flags MULAx.w ACC, VF00, VF03 IAND VI05, VI05, VI06 MADDAy.w ACC, VF00, VF03 FMAND VI03, VI06 ; -- cross 2 flags MADDz.w VF03, VF00, VF03 IADDIU VI08, VI00, 0x3 NOP FMAND VI04, VI06 ; -- cross 3 flags NOP NOP NOP IBNE VI02, VI05, CheckSide2 NOP RSQRT Q, VF00w, VF03w ADD.xyz VF04, VF00, VF16 IADDIU VI07, VI07, 0x1 ; inside side 1 CheckSide2: NOP IBNE VI03, VI05, CheckSide3 NOP NOP ADD.xyz VF04, VF00, VF14 IADDIU VI07, VI07, 0x1 ; inside side 2 CheckSide3: NOP IBNE VI04, VI05, FinishCheckingSides NOP NOP ADD.xyz VF04, VF00, VF15 IADDIU VI07, VI07, 0x1 ; inside side 3 NOP NOP NOP IBEQ VI07, VI08, TotallyInsideTriangle NOP NOP FinishCheckingSides: MUL.x VF13, VF13, VF13 IADDIU VI08, VI00, 0x2 MULq.xyz VF02, VF02, Q WAITQ NOP IBNE VI07, VI08, IntersectionOutsideTwoSides NOP NOP NOP IBEQ VI02, VI05, CheckDistanceSide2 NOP NOP NOP MOVE.xyzw VF15, VF05 NOP BAL VI15, DistanceBetweenSphereAndLine NOP NOP NOP B ProcessLineResult NOP NOP CheckDistanceSide2: NOP IBEQ VI03, VI05, CheckDistanceSide3 NOP NOP NOP MOVE.xyzw VF14, VF15 NOP MOVE.xyzw VF15, VF06 NOP BAL VI15, DistanceBetweenSphereAndLine NOP NOP NOP B ProcessLineResult NOP NOP CheckDistanceSide3: NOP MOVE.xyzw VF14, VF16 NOP MOVE.xyzw VF15, VF07 NOP BAL VI15, DistanceBetweenSphereAndLine NOP NOP NOP B ProcessLineResult NOP NOP IntersectionOutsideTwoSides: SUB.xyz VF05, VF04, VF12 NOP ADD.xyz VF01, VF00, VF04 NOP ; col point SUB.xyz VF02, VF12, VF04 NOP NOP NOP MUL.xyz VF05, VF05, VF05 NOP NOP NOP NOP NOP NOP NOP MULAx.w ACC, VF00, VF05 NOP MADDAy.w ACC, VF00, VF05 NOP MADDz.w VF05, VF00, VF05 NOP ; distSq to vertex NOP NOP NOP NOP NOP NOP CLIPw.xyz VF13, VF05 SQRT Q, VF05w ; compare radiusSq and distSq NOP NOP NOP NOP NOP NOP NOP FCAND VI01, 0x1 ADDq.x VF03, VF00, Q WAITQ ; dist to vertex NOP IBEQ VI00, VI01, QuitAndFail ; too far NOP NOP NOP NOP NOP DIV Q, VF00w, VF03x MULq.xyz VF02, VF02, Q WAITQ ; col normal NOP[E] NOP NOP NOP TotallyInsideTriangle: ADDw.x VF03, VF00, VF02 WAITQ MULq.xyz VF02, VF02, Q NOP NOP[E] IADDIU VI01, VI00, 0x1 NOP NOP ProcessLineResult: CLIPw.xyz VF13, VF16 SQRT Q, VF16w ADD.xyz VF01, VF00, VF16 NOP SUB.xyz VF02, VF12, VF16 NOP NOP NOP NOP FCAND VI01, 0x1 ADDq.x VF03, VF00, Q WAITQ NOP IBEQ VI00, VI01, QuitAndFail NOP NOP NOP NOP NOP DIV Q, VF00w, VF03x MULq.xyz VF02, VF02, Q WAITQ NOP[E] NOP NOP NOP EndOfMicrocode: