MCPcopy Create free account
hub / github.com/bfbbdecomp/bfbb / xCollideCalcTri

Function xCollideCalcTri

src/SB/Core/x/xCollide.cpp:863–960  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

861 }
862
863 const RpTriangle& t = RpGeometryGetTriangles(geom)[tri.index];
864 for (S32 i = 0; i < 3; i++)
865 {
866 v[i] = verts[t.vertIndex[i]];
867 }
868
869 xVec3 e[3];
870 e[0] = v[1] - v[0];
871 e[1] = v[2] - v[1];
872 e[2] = v[0] - v[2];
873
874 struct
875 {
876 xVec3 norm;
877 F32 D;
878 } plane;
879
880 plane.norm = e[0].cross(e[2]);
881 plane.D = -v[0].dot(plane.norm);
882
883 xVec3 p;
884 F32 num = plane.D + plane.norm.dot(center);
885 F32 denom = plane.norm.dot(heading);
886 if (xfeq0(denom))
887 {
888 p = v[0];
889 }
890 else
891 {
892 p = heading * -(num / denom) + center;
893 }
894
895 xVec3 b, A, B, C, AxB, CxB;
896 A = p - v[0];
897 B = v[2] - v[1];
898 C = v[1] - v[0];
899 AxB = A.cross(B);
900 CxB = C.cross(B);
901
902 F32 len2 = AxB.length2();
903 if (xfeq0(len2))
904 {
905 b = v[1];
906 }
907 else
908 {
909 b = v[0] + A * (CxB.dot(AxB) / len2);
910 }
911
912 {
913 xVec3 d = b - v[0];
914 xVec3 ad = d.get_abs();
915 if (ad.x >= ad.y && ad.x >= ad.z)
916 {
917 tri.r = xfeq0(ad.x) ? 0.0f : (p.x - v[0].x) / d.x;
918 }
919 else if (ad.y >= ad.z)
920 {

Callers 3

xSphereHitsModelFunction · 0.70
iSphereHitsModel3Function · 0.50
iRayHitsModelFunction · 0.50

Calls 5

render_triFunction · 0.85
crossMethod · 0.80
get_absMethod · 0.80
dotMethod · 0.45
length2Method · 0.45

Tested by

no test coverage detected