public GraphicsTriangle(Triangle triangle)
 {
     Points        = new GraphicsVector3[3];
     TexturePoints = new TextureVector[3];
     for (int i = 0; i < 3; ++i)
     {
         Points[i]        = new GraphicsVector3(triangle.Points[i]);
         TexturePoints[i] = new TextureVector();
     }
     Normal = triangle.Normal;
     Color  = triangle.Color;
 }
 public GraphicsTriangle(GraphicsVector3 point1, GraphicsVector3 point2, GraphicsVector3 point3, TextureVector texturePoint1, TextureVector texturePoint2, TextureVector texturePoint3, Vector3 normal, Color color)
 {
     Points           = new GraphicsVector3[3];
     Points[0]        = point1;
     Points[1]        = point2;
     Points[2]        = point3;
     TexturePoints    = new TextureVector[3];
     TexturePoints[0] = texturePoint1;
     TexturePoints[1] = texturePoint2;
     TexturePoints[2] = texturePoint3;
     Normal           = normal;
     Color            = color;
 }
        public GraphicsTriangle Copy()
        {
            GraphicsVector3[] newPoints        = new GraphicsVector3[3];
            TextureVector[]   newTexturePoints = new TextureVector[3];

            for (int i = 0; i < 3; ++i)
            {
                newPoints[i]        = new GraphicsVector3(Points[i]);
                newTexturePoints[i] = new TextureVector(TexturePoints[i]);
            }

            return(new GraphicsTriangle(newPoints, newTexturePoints, Normal, Color));
        }
示例#4
0
 private TextureVector clipTextureVector(TextureVector insidePoint, TextureVector outsidePoint, float t)
 {
     return(new TextureVector(t * (outsidePoint.U - insidePoint.U) + insidePoint.U, t * (outsidePoint.V - insidePoint.V) + insidePoint.V, t * (outsidePoint.W - insidePoint.W) + insidePoint.W));
 }
示例#5
0
        private GraphicsTriangle[] ClipTriangleAgainstPlane(Vector3 planePosition, Vector3 planeNormal, GraphicsTriangle triangle)
        {
            planeNormal = Vector3.Normalize(planeNormal);

            List <GraphicsVector3> insidePoints  = new List <GraphicsVector3>();
            List <GraphicsVector3> outsidePoints = new List <GraphicsVector3>();

            List <TextureVector> insideTexturePoints  = new List <TextureVector>();
            List <TextureVector> outsideTexturePoints = new List <TextureVector>();

            float[] distances = new float[3];
            for (int i = 0; i < 3; ++i)
            {
                distances[i] = GetShortestDistanceToPlane(triangle.Points[i], planePosition, planeNormal);
            }

            for (int i = 0; i < 3; ++i)
            {
                if (distances[i] >= 0)
                {
                    insidePoints.Add(triangle.Points[i]);
                    insideTexturePoints.Add(triangle.TexturePoints[i]);
                }
                else
                {
                    outsidePoints.Add(triangle.Points[i]);
                    outsideTexturePoints.Add(triangle.TexturePoints[i]);
                }
            }

            if (insidePoints.Count == 0)
            {
                return(new GraphicsTriangle[] { });
            }

            if (insidePoints.Count == 3)
            {
                return(new GraphicsTriangle[] { triangle });
            }

            if (insidePoints.Count == 1 && outsidePoints.Count == 2)
            {
                GraphicsVector3 p1  = insidePoints[0];
                TextureVector   tp1 = insideTexturePoints[0];

                float t;

                GraphicsVector3 p2  = LinePlaneIntersection(planePosition, planeNormal, p1, outsidePoints[0], out t);
                TextureVector   tp2 = clipTextureVector(insideTexturePoints[0], outsideTexturePoints[0], t);

                GraphicsVector3 p3  = LinePlaneIntersection(planePosition, planeNormal, p1, outsidePoints[1], out t);
                TextureVector   tp3 = clipTextureVector(insideTexturePoints[0], outsideTexturePoints[1], t);

                return(new GraphicsTriangle[] { new GraphicsTriangle(p1, p2, p3, tp1, tp2, tp3, triangle.Normal, triangle.Color) });
            }

            if (insidePoints.Count == 2 && outsidePoints.Count == 1)
            {
                float t;

                GraphicsVector3 t1p1 = insidePoints[0];
                GraphicsVector3 t1p2 = insidePoints[1];
                GraphicsVector3 t1p3 = LinePlaneIntersection(planePosition, planeNormal, t1p1, outsidePoints[0], out t);

                TextureVector t1tp1 = insideTexturePoints[0];
                TextureVector t1tp2 = insideTexturePoints[1];
                TextureVector t1tp3 = clipTextureVector(t1tp1, outsideTexturePoints[0], t);

                GraphicsVector3 t2p1 = insidePoints[1];
                GraphicsVector3 t2p2 = t1p3;
                GraphicsVector3 t2p3 = LinePlaneIntersection(planePosition, planeNormal, t2p1, outsidePoints[0], out t);

                TextureVector t2tp1 = insideTexturePoints[1];
                TextureVector t2tp2 = t1tp3;
                TextureVector t2tp3 = clipTextureVector(t2tp1, outsideTexturePoints[0], t);

                return(new GraphicsTriangle[] {
                    new GraphicsTriangle(t1p1, t1p3, t1p2, t1tp1, t1tp2, t1tp3, triangle.Normal, triangle.Color),
                    new GraphicsTriangle(t2p1, t2p2, t2p3, t2tp1, t2tp2, t2tp3, triangle.Normal, triangle.Color)
                });
            }
            return(null); //To satisfy the compliers :(
        }
示例#6
0
 public TextureVector(TextureVector original)
 {
     U = original.U;
     V = original.V;
     W = original.W;
 }