Example #1
0
 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));
 }
Example #2
0
        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]));
        }
Example #3
0
        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;
        }
Example #4
0
        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]);
        }
Example #5
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));
        }