public static float Dot(AffineVector3 Vec1, AffineVector3 Vec2) { return ((Vec1.x * Vec2.x) + (Vec1.y * Vec2.y) + (Vec1.z * Vec2.z) + (Vec1.w * Vec2.w)); }
public static AffineVector3 ApplyMap(AffineVector3 Vec1, AffineMatrix3 Matrix) { float[] Return = new float[4]; for (int row = 0; row < 4; row++) { AffineVector3 RowVector = new AffineVector3( Matrix.values[row, 0], Matrix.values[row, 1], Matrix.values[row, 2], Matrix.values[row, 3]); Return[row] = AffineVector3.Dot(RowVector, Vec1);; } return(new AffineVector3(Return[0], Return[1], Return[2], Return[3])); }
public void ApplyMap(AffineMatrix3 Map) { float[,] values = new float[4, 4]; for (int row = 0; row < 4; row++) { AffineVector3 RowVector = new AffineVector3( Map.values[row, 0], Map.values[row, 1], Map.values[row, 2], Map.values[row, 3]); for (int col = 0; col < 4; col++) { AffineVector3 ColVector = new AffineVector3( this.values[0, col], this.values[1, col], this.values[2, col], this.values[3, col]); values[row, col] = AffineVector3.Dot(RowVector, ColVector); } } this.values = values; }
public static AffineVector3[] ClipTri(AffineVector3[] Points, float NearClippingDistance) { AffineVector3 Vec1 = Points[0]; AffineVector3 Vec2 = Points[1]; AffineVector3 Vec3 = Points[2]; bool Vec1Clip = (Vec1.z <= NearClippingDistance); bool Vec2Clip = (Vec2.z <= NearClippingDistance); bool Vec3Clip = (Vec3.z <= NearClippingDistance); if (!Vec1Clip & !Vec2Clip & !Vec3Clip) { /* All 3 are in front of clipping plane */ return(Points); } if (Vec1Clip & Vec2Clip & Vec3Clip) { /* All 3 are behind */ return(new AffineVector3[0]); } /* All but 1 are behind */ if (!Vec1Clip & Vec2Clip & Vec3Clip) { AffineVector3[] Return = new AffineVector3[3]; Return[0] = Vec1; Return[1] = IntersectClippingPlane(Vec1, Vec2, NearClippingDistance); Return[2] = IntersectClippingPlane(Vec1, Vec3, NearClippingDistance); return(Return); } if (Vec1Clip & !Vec2Clip & Vec3Clip) { AffineVector3[] Return = new AffineVector3[3]; Return[0] = Vec2; Return[1] = IntersectClippingPlane(Vec2, Vec1, NearClippingDistance); Return[2] = IntersectClippingPlane(Vec2, Vec3, NearClippingDistance); return(Return); } if (!Vec1Clip & Vec2Clip & Vec3Clip) { AffineVector3[] Return = new AffineVector3[3]; Return[0] = Vec3; Return[1] = IntersectClippingPlane(Vec3, Vec2, NearClippingDistance); Return[2] = IntersectClippingPlane(Vec3, Vec1, NearClippingDistance); return(Return); } /* All but 1 are in front */ if (Vec1Clip & !Vec2Clip & !Vec3Clip) { AffineVector3[] Return = new AffineVector3[4]; Return[0] = Vec2; Return[1] = IntersectClippingPlane(Vec2, Vec1, NearClippingDistance); Return[2] = IntersectClippingPlane(Vec3, Vec1, NearClippingDistance); Return[3] = Vec3; return(Return); } if (!Vec1Clip & Vec2Clip & !Vec3Clip) { AffineVector3[] Return = new AffineVector3[4]; Return[0] = Vec3; Return[1] = IntersectClippingPlane(Vec3, Vec2, NearClippingDistance); Return[2] = IntersectClippingPlane(Vec1, Vec2, NearClippingDistance); Return[3] = Vec1; return(Return); } if (!Vec1Clip & !Vec2Clip & Vec3Clip) { AffineVector3[] Return = new AffineVector3[4]; Return[0] = Vec1; Return[1] = IntersectClippingPlane(Vec1, Vec3, NearClippingDistance); Return[2] = IntersectClippingPlane(Vec2, Vec3, NearClippingDistance); Return[3] = Vec2; return(Return); } return(new AffineVector3[0]); }
public static AffineVector3 IntersectClippingPlane(AffineVector3 Vec1, AffineVector3 Vec2, float NearClippingDistance) { float InterpolationFactor = (Vec1.z - NearClippingDistance) / (Vec1.z - Vec2.z); return(new AffineVector3(Utils.Lerp(Vec1.x, Vec2.x, InterpolationFactor), Utils.Lerp(Vec1.y, Vec2.y, InterpolationFactor), NearClippingDistance)); }