| 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 | { |
no test coverage detected