예제 #1
0
        // Token: 0x060042CC RID: 17100 RVA: 0x001565C4 File Offset: 0x001549C4
        public PPMesh.Face GetIntersectingPolygon(Ray ray, bool excludeBackSidePolygons)
        {
            Vector3 origin    = this.Transform.InverseTransformPoint(ray.origin);
            Vector3 direction = this.Transform.InverseTransformDirection(ray.direction);
            Ray     ray2      = new Ray(origin, direction);

            PPMesh.Face result = null;
            float       num    = float.MaxValue;

            foreach (PPMesh.Face face in this.faces)
            {
                Vector3 vector  = this.vertices[face.p0];
                Vector3 vector2 = this.vertices[face.p1];
                Vector3 vector3 = this.vertices[face.p2];
                float   num2;
                if (MeshUtils.RayTriangleIntersection(vector, vector2, vector3, ray2.origin, ray2.direction, out num2) && num2 < num)
                {
                    if (!excludeBackSidePolygons || PrimitivesPro.Utils.Plane.GetSide(vector, vector2, vector3, ray2.origin))
                    {
                        num    = num2;
                        result = face;
                    }
                }
            }
            return(result);
        }
예제 #2
0
        // Token: 0x060042CB RID: 17099 RVA: 0x001564BC File Offset: 0x001548BC
        public float GetNearestPoint(Ray ray, out int index, bool excludeBackSidePolygons)
        {
            Vector3 origin    = this.Transform.InverseTransformPoint(ray.origin);
            Vector3 direction = this.Transform.InverseTransformDirection(ray.direction);
            Ray     ray2      = new Ray(origin, direction);
            float   num       = float.MaxValue;
            int     num2      = -1;

            for (int i = 0; i < this.vertices.Length; i++)
            {
                Vector3 point = this.vertices[i];
                float   num3  = MeshUtils.DistanceToLine2(ray2, point);
                if (num3 < num)
                {
                    if (excludeBackSidePolygons)
                    {
                        PPMesh.Face face = this.vertexFaces[i];
                        if (face != null && !PrimitivesPro.Utils.Plane.GetSide(this.vertices[face.p0], this.vertices[face.p1], this.vertices[face.p2], ray2.origin))
                        {
                            goto IL_E0;
                        }
                    }
                    num  = num3;
                    num2 = i;
                }
                IL_E0 :;
            }
            index = num2;
            return(num);
        }
예제 #3
0
        // Token: 0x060042CF RID: 17103 RVA: 0x00156864 File Offset: 0x00154C64
        public Vector3[] GetFaceRectangle(PPMesh.Face face)
        {
            Vector3 vector  = this.Transform.TransformPoint(this.vertices[face.p0]);
            Vector3 vector2 = this.Transform.TransformPoint(this.vertices[face.p1]);
            Vector3 vector3 = this.Transform.TransformPoint(this.vertices[face.p2]);

            return(new Vector3[]
            {
                vector,
                vector2,
                vector3,
                vector3
            });
        }
예제 #4
0
 // Token: 0x060042D5 RID: 17109 RVA: 0x00156B78 File Offset: 0x00154F78
 public Vector3 GetFaceNormalWorld(PPMesh.Face face)
 {
     return(MeshUtils.ComputePolygonNormal(this.Transform.TransformPoint(this.vertices[face.p0]), this.Transform.TransformPoint(this.vertices[face.p1]), this.Transform.TransformPoint(this.vertices[face.p2])));
 }
예제 #5
0
 // Token: 0x060042C9 RID: 17097 RVA: 0x001561FC File Offset: 0x001545FC
 private void Populate(Mesh mesh)
 {
     this.edges         = new Dictionary <long, PPMesh.HalfEdge>(mesh.triangles.Length);
     this.faces         = new HashSet <PPMesh.Face>();
     this.vertexFaces   = new PPMesh.Face[mesh.vertexCount];
     this.vertices      = new Vector3[mesh.vertexCount];
     this.normals       = new Vector3[mesh.vertexCount];
     this.uvs           = new Vector2[mesh.vertexCount];
     this.verticesDelta = new HashSet <int>();
     Array.Copy(mesh.vertices, this.vertices, mesh.vertexCount);
     Array.Copy(mesh.normals, this.normals, mesh.vertexCount);
     Array.Copy(mesh.uv, this.uvs, mesh.vertexCount);
     int[] triangles = mesh.triangles;
     for (int i = 0; i < triangles.Length; i += 3)
     {
         long            key      = this.HashEdge(triangles[i], triangles[i + 1]);
         long            key2     = this.HashEdge(triangles[i + 1], triangles[i + 2]);
         long            key3     = this.HashEdge(triangles[i + 2], triangles[i]);
         PPMesh.Face     face     = new PPMesh.Face(triangles[i], triangles[i + 1], triangles[i + 2]);
         PPMesh.HalfEdge halfEdge = new PPMesh.HalfEdge
         {
             face  = face,
             point = triangles[i]
         };
         PPMesh.HalfEdge halfEdge2 = new PPMesh.HalfEdge
         {
             face  = face,
             point = triangles[i + 1]
         };
         PPMesh.HalfEdge halfEdge3 = new PPMesh.HalfEdge
         {
             face  = face,
             point = triangles[i + 2]
         };
         this.vertexFaces[triangles[i]]     = face;
         this.vertexFaces[triangles[i + 1]] = face;
         this.vertexFaces[triangles[i + 2]] = face;
         try
         {
             halfEdge.nextEdge  = halfEdge2;
             halfEdge2.nextEdge = halfEdge3;
             halfEdge3.nextEdge = halfEdge;
             this.edges.Add(key, halfEdge);
             this.edges.Add(key2, halfEdge2);
             this.edges.Add(key3, halfEdge3);
             this.faces.Add(face);
         }
         catch
         {
         }
     }
     foreach (PPMesh.HalfEdge halfEdge4 in this.edges.Values)
     {
         int point  = halfEdge4.point;
         int point2 = halfEdge4.nextEdge.point;
         if (halfEdge4.oppositeEdge == null)
         {
             long            key4 = this.HashEdge(point2, point);
             PPMesh.HalfEdge halfEdge5;
             if (this.edges.TryGetValue(key4, out halfEdge5))
             {
                 halfEdge4.oppositeEdge = halfEdge5;
                 halfEdge5.oppositeEdge = halfEdge4;
             }
         }
     }
 }
예제 #6
0
 public void Reset()
 {
     Face = null;
     Command = CommandType.None;
 }