Exemple #1
0
        MeshInfo FastFillCutEdges(List <Vector3> edges, Vector3 pos, Vector3 normal)
        {
            if (edges.Count < 3)
            {
                throw new Exception("edges point less 3!");
            }

            for (int i = 0; i < edges.Count - 3; i++)
            {
                Vector3 t    = edges[i + 1];
                Vector3 temp = edges[i + 3];
                for (int j = i + 2; j < edges.Count - 1; j += 2)
                {
                    if ((edges[j] - t).sqrMagnitude < 1e-6)
                    {
                        edges[j]     = edges[i + 2];
                        edges[i + 3] = edges[j + 1];
                        edges[j + 1] = temp;
                        break;
                    }
                    if ((edges[j + 1] - t).sqrMagnitude < 1e-6)
                    {
                        edges[j + 1] = edges[i + 2];
                        edges[i + 3] = edges[j];
                        edges[j]     = temp;
                        break;
                    }
                }
                edges.RemoveAt(i + 2);
            }
            edges.RemoveAt(edges.Count - 1);

            Vector4 tangent = MeshInfo.CalculateTangent(normal);

            MeshInfo cutEdges = new MeshInfo();

            for (int i = 0; i < edges.Count; i++)
            {
                cutEdges.Add(edges[i], Vector2.zero, normal, tangent);
            }
            int count = edges.Count - 1;

            for (int i = 1; i < count; i++)
            {
                cutEdges.triangles.Add(0);
                cutEdges.triangles.Add(i);
                cutEdges.triangles.Add(i + 1);
            }

            cutEdges.center = MeshInfo.center;
            cutEdges.size   = MeshInfo.size;
            cutEdges.MapperCube(uvRange);
            return(cutEdges);
        }
Exemple #2
0
        MeshInfo FillCutEdges(List <Vector3> edges, Vector3 pos, Vector3 normal)
        {
            if (edges.Count < 3)
            {
                throw new Exception("edges point less 3!");
            }

            for (int i = 0; i < edges.Count; i++)
            {
                for (int j = i + 1; j < edges.Count; j++)
                {
                    if ((edges[i] - edges[j]).sqrMagnitude < 1e-5f)
                    {
                        edges.RemoveAt(j);
                    }
                }
            }

            Vector3 start = edges[0];
            Vector3 dir   = Vector3.zero;

            for (int i = 1; i < edges.Count; i++)
            {
                if (dir == Vector3.zero)
                {
                    dir = edges[i] - start;
                }
            }
            dir.Normalize();
            int count = edges.Count - 1;

            for (int i = 2; i < count; i++)
            {
                Vector3 a     = edges[i] - start;
                float   angle = Vector3.Dot(a.normalized, dir);
                float   dis   = a.sqrMagnitude;
                if (dis < 1e-6f)
                {
                    continue;
                }

                bool change = false;

                for (int j = i + 1; j < edges.Count; j++)
                {
                    Vector3 b      = edges[j] - start;
                    float   _angle = Vector3.Dot(b.normalized, dir);
                    float   _dis   = b.sqrMagnitude;
                    bool    next   = _dis <= dis;
                    next = (angle - _angle < 0.001f) && (_angle > 0.9999f ? _dis < dis : _dis >= dis);
                    next = change ? false : next;
                    if (_angle - angle > 0.001f || next || _dis < 1e-6f)
                    {
                        if (_angle - angle > 0.001f)
                        {
                            change = true;
                        }
                        angle = _angle;
                        dis   = _dis;
                        Vector3 temp;
                        temp     = edges[i];
                        edges[i] = edges[j];
                        edges[j] = temp;
                    }
                }
            }

            Vector4 tangent = MeshInfo.CalculateTangent(normal);

            MeshInfo cutEdges = new MeshInfo();

            for (int i = 0; i < edges.Count; i++)
            {
                cutEdges.Add(edges[i], Vector2.zero, normal, tangent);
            }
            for (int i = 1; i < count; i++)
            {
                cutEdges.triangles.Add(0);
                cutEdges.triangles.Add(i);
                cutEdges.triangles.Add(i + 1);
            }

            cutEdges.center = MeshInfo.center;
            cutEdges.size   = MeshInfo.size;
            cutEdges.MapperCube(uvRange);
            return(cutEdges);
        }