Esempio n. 1
0
        protected override void BuildMeshComponents()
        {
            Vector2 center = MeshHelper.GetCenter(SplinePoints);

            for (int i = 0; i < SplinePoints.Length; i++)
            {
                SplinePoints[i] -= center;
            }

            var points = CatmullRomSpline.GetPoints(MeshHelper.ConvertVec2ToVec3(SplinePoints), Resolution);

            if (MinArea.HasValue)
            {
                points = SplineSimplification.Simplify(points, MinArea.Value, true, false);
            }
            Vertices = points.ToArray();

            var connections = Triangulation.TriangulationToInt3(new List <Vector2>(MeshHelper.ConvertVec3ToVec2(Vertices)));

            Triangles = new int[connections.Count * 3];
            for (int i = 0; i < connections.Count; i++)
            {
                Triangles[i * 3 + 0] = connections[i].A;
                Triangles[i * 3 + 1] = connections[i].B;
                Triangles[i * 3 + 2] = connections[i].C;
            }

            UVs = MeshHelper.UVUnwrap(Vertices);
        }
        protected override void BuildMeshComponents()
        {
            Vertices = new Vector3[4];
            Vector2 center = MeshHelper.GetCenter(Verts);

            for (int i = 0; i < 4; i++)
            {
                Vertices[i] = Verts[i] - center;
            }

            double[] angles = new double[4];
            double   sum    = 0;

            for (int i = 0; i < 4; i++)
            {
                angles[i] = MeshHelper.AngleBetweenPoints(Verts[i], Verts[(i + 1) % 4], Verts[(i + 2) % 4]);
                sum      += angles[i];
            }
            if (System.Math.Abs(360 - sum) < 1e-3) //check for clockwise order
            {
                Triangles = new int [] { 0, 1, 3, 2, 3, 1 };
            }
            else
            {
                int index = GetMaxIndex(angles);
                int a     = (index + 1) % 4;
                int b     = (index + 2) % 4;
                int c     = (index + 3) % 4;
                Triangles = new int[] { a, index, c, b, a, c };
            }

            UVs = MeshHelper.UVUnwrap(Vertices);
        }
Esempio n. 3
0
        protected override void BuildMeshComponents()
        {
            var points = CatmullRomSpline.GetPoints(MeshHelper.ConvertVec2ToVec3(SplinePoints), Resolution);

            if (MinArea.HasValue)
            {
                points = SplineSimplification.Simplify(points, MinArea.Value, true, false);
            }
            Vertices = points.ToArray();

            CenterShift = MeshHelper.GetCenter(Vertices);
            for (int i = 0; i < Vertices.Length; i++)
            {
                Vertices[i] -= CenterShift;
            }

            Triangles = new int[Vertices.Length * 3];
            for (int i = 0; i < Vertices.Length; i++)
            {
                Triangles[i * 3 + 0] = 0;
                Triangles[i * 3 + 1] = i;
                Triangles[i * 3 + 2] = (i + 1) % Vertices.Length;
            }

            UVs = MeshHelper.UVUnwrap(Vertices);
        }
        public static TriangulatedMesh Add(Vector3 position, Vector2[] points, List <Triangulation.IntTriple> connections, Material meshMat = null, bool attachRigidbody = true)
        {
            GameObject triangulatedMesh = new GameObject();

            triangulatedMesh.transform.position = MeshHelper.GetCenter(points);

            TriangulatedMesh triComponent = triangulatedMesh.AddComponent <TriangulatedMesh>();

            triComponent.Build(points, connections, meshMat);
            if (attachRigidbody)
            {
                triangulatedMesh.AddComponent <Rigidbody2D>();
            }
            return(triComponent);
        }
        protected override void BuildMeshComponents()
        {
            Vector2 center = MeshHelper.GetCenter(Vertices);

            Vertices = new Vector3[Points.Length];
            for (int i = 0; i < Vertices.Length; i++)
            {
                Vertices[i] = Points[i] - center;
            }

            Triangles = new int[Connections.Count * 3];
            for (int i = 0; i < Connections.Count; i++)
            {
                Triangles[i * 3 + 0] = Connections[i].A;
                Triangles[i * 3 + 1] = Connections[i].B;
                Triangles[i * 3 + 2] = Connections[i].C;
            }
            UVs = MeshHelper.UVUnwrap(Vertices);
        }
Esempio n. 6
0
        public static LineMesh AddLine(Vector3 position, Vector2[] lineVerts, float lineWidth, bool useDoubleCollider, Space space, Material meshMat = null, bool attachRigidbody = true)
        {
            GameObject line = new GameObject();

            if (space == Space.Self)
            {
                line.transform.position = position;
            }
            else
            {
                line.transform.position = position + (Vector3)MeshHelper.GetCenter(lineVerts);
            }

            LineMesh lineComponent = line.AddComponent <LineMesh>();

            lineComponent.Build(lineVerts, lineWidth, useDoubleCollider, meshMat);
            if (attachRigidbody)
            {
                line.AddComponent <Rigidbody2D>();
            }
            return(lineComponent);
        }
Esempio n. 7
0
        public static SplineShapeMesh AddSplineShape(Vector3 position, Vector2[] splinePoints, float resolution = 0.2f, float?minArea = null, Space space = Space.World, Material meshMat = null, bool attachRigidbody = true)
        {
            GameObject splineShapeMesh = new GameObject();

            if (space == Space.Self)
            {
                splineShapeMesh.transform.position = position;
            }
            else
            {
                splineShapeMesh.transform.position = position + (Vector3)MeshHelper.GetCenter(splinePoints);
            }


            SplineShapeMesh splineMeshComponent = splineShapeMesh.AddComponent <SplineShapeMesh>();

            splineMeshComponent.Build(splinePoints, resolution, minArea, meshMat);
            if (attachRigidbody)
            {
                splineShapeMesh.AddComponent <Rigidbody2D>();
            }
            return(splineMeshComponent);
        }
        public static SplineCurveMesh AddSplineCurve(Vector3 position, Vector2[] splinePoints, float resolution, float width, bool useDoubleCollider, float?minArea, Space space, Material meshMat = null, bool attachRigidbody = true)
        {
            GameObject curve = new GameObject();

            if (space == Space.Self)
            {
                curve.transform.position = position;
            }
            else
            {
                curve.transform.position = position + (Vector3)MeshHelper.GetCenter(splinePoints);
            }

            curve.transform.position = position;
            SplineCurveMesh curveComponent = curve.AddComponent <SplineCurveMesh>();

            curveComponent.Build(splinePoints, resolution, width, useDoubleCollider, minArea, meshMat);
            if (attachRigidbody)
            {
                curve.AddComponent <Rigidbody2D>();
            }
            return(curveComponent);
        }
Esempio n. 9
0
        protected override void BuildMeshComponents()
        {
            #region DoubleCollider
            if (UseDoubleCollider)
            {
                cachedVertsLeft  = new List <Vector2>();
                cachedVertsRight = new List <Vector2>();
            }
            #endregion

            List <Vector3> verticesList  = new List <Vector3>();
            List <int>     trianglesList = new List <int>();

            Vector2 center = MeshHelper.GetCenter(LineVerts);
            for (int i = 0; i < LineVerts.Length; i++)
            {
                LineVerts[i] -= center;
            }

            int currentVertIndex = 0;
            int currentTriIndex  = 0;
            //add first two vertices
            float   angle = Mathf.Atan2(LineVerts[1].y - LineVerts[0].y, LineVerts[1].x - LineVerts[0].x);
            float   oldAngle, angleDiff;
            Vector2 p1 = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * LineWidth;
            Vector2 p2 = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * LineWidth;
            if (p1 != p2)
            {
                verticesList.Add(LineVerts[currentVertIndex] + p1);
                verticesList.Add(LineVerts[currentVertIndex] + p2);
                #region DoubleCollider
                if (UseDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
            }
            else
            {
                verticesList.Add(LineVerts[currentVertIndex]);
                #region DoubleCollider
                if (UseDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 1]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
            }
            oldAngle = angle;
            currentVertIndex++;
            // add middle vertices
            for (int i = 0; i < LineVerts.Length - 2; i++, currentVertIndex++)
            {
                angle     = Mathf.Atan2(LineVerts[currentVertIndex + 1].y - LineVerts[currentVertIndex].y, LineVerts[currentVertIndex + 1].x - LineVerts[currentVertIndex].x);
                angleDiff = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f;
                p1        = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * LineWidth;
                p2        = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * LineWidth;
                if (p1 != p2)
                {
                    verticesList.Add(LineVerts[currentVertIndex] + p1);
                    verticesList.Add(LineVerts[currentVertIndex] + p2);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 1);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 2);
                    currentTriIndex += 2;
                }
                else
                {
                    verticesList.Add(LineVerts[currentTriIndex] + p1);
                    if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2])
                    {
                        trianglesList.Add(currentTriIndex + 0);
                        trianglesList.Add(currentTriIndex + 3);
                        trianglesList.Add(currentTriIndex + 1);
                        currentTriIndex++;
                    }
                }
                #region DoubleCollider
                if (UseDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
                oldAngle = angle;
            }

            //add last two vertices
            if (LineVerts[0] != LineVerts[currentVertIndex])
            {
                angle = Mathf.Atan2(LineVerts[currentVertIndex].y - LineVerts[currentVertIndex - 1].y, LineVerts[currentVertIndex].x - LineVerts[currentVertIndex - 1].x);
                p1    = new Vector2(Mathf.Cos(angle + deg90), Mathf.Sin(angle + deg90)) * LineWidth;
                p2    = new Vector2(Mathf.Cos(angle - deg90), Mathf.Sin(angle - deg90)) * LineWidth;
                if (p1 != p2)
                {
                    verticesList.Add(LineVerts[currentVertIndex] + p1);
                    verticesList.Add(LineVerts[currentVertIndex] + p2);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 1);
                    trianglesList.Add(currentTriIndex + 3);
                    trianglesList.Add(currentTriIndex + 0);
                    trianglesList.Add(currentTriIndex + 2);
                }
                else
                {
                    //make LineMesh loop
                    if (verticesList[verticesList.Count - 1] != verticesList[verticesList.Count - 2])
                    {
                        verticesList.Add(LineVerts[currentTriIndex] + p1);
                        trianglesList.Add(currentTriIndex + 0);
                        trianglesList.Add(currentTriIndex + 3);
                        trianglesList.Add(currentTriIndex + 1);
                    }
                }
                #region DoubleCollider
                if (UseDoubleCollider)
                {
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion
            }
            else
            {
                oldAngle = Mathf.Atan2(
                    LineVerts[0].y - LineVerts[currentVertIndex].y,
                    LineVerts[0].x - LineVerts[currentVertIndex].x);
                angle = Mathf.Atan2(
                    LineVerts[1].y - LineVerts[0].y,
                    LineVerts[1].x - LineVerts[0].x);
                angleDiff       = oldAngle + MeshHelper.AngleDifference(oldAngle, angle) * 0.5f - deg90;
                p1              = new Vector2(Mathf.Cos(angleDiff - deg90), Mathf.Sin(angleDiff - deg90)) * LineWidth;
                p2              = new Vector2(Mathf.Cos(angleDiff + deg90), Mathf.Sin(angleDiff + deg90)) * LineWidth;
                verticesList[0] = LineVerts[currentVertIndex] + p1;
                verticesList[1] = LineVerts[currentVertIndex] + p2;
                #region DoubleCollider
                if (UseDoubleCollider)
                {
                    cachedVertsLeft[0]  = verticesList[0];
                    cachedVertsRight[0] = verticesList[1];
                    cachedVertsLeft.Add(verticesList[verticesList.Count - 2]);
                    cachedVertsRight.Add(verticesList[verticesList.Count - 1]);
                }
                #endregion

                trianglesList.Add(0);
                trianglesList.Add(verticesList.Count - 1);
                trianglesList.Add(1);
                trianglesList.Add(verticesList.Count - 1);
                trianglesList.Add(0);
                trianglesList.Add(verticesList.Count - 2);
            }
            Vertices  = verticesList.ToArray();
            Triangles = trianglesList.ToArray();

            UVs = MeshHelper.UVUnwrap(Vertices);
        }