void LateUpdate()
    {
        if (!m_active)
        {
            return;
        }

        if (m_selectedPoint == null)
        {
            if (!EventSystem.current.IsPointerOverGameObject())
            {
                Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, 1000f, m_dragPointMask))
                {
                    DraggableMeshPoint point = hit.collider.GetComponent <DraggableMeshPoint>();
                    if (point != null)
                    {
                        point.Highlight();
                        if (Input.GetButtonDown(m_buttonPrimary))
                        {
                            m_selectedPoint = point;
                            m_zDistance     = m_selectedPoint.transform.position.z;
                        }
                    }
                }
            }
        }
        else
        {
            if (Input.GetButtonUp(m_buttonPrimary))
            {
                m_selectedPoint = null;
            }
            else
            {
                m_selectedPoint.Select();
                if (Input.GetButton(m_buttonPrimary))
                {
                    var vector = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, m_zDistance));
                    vector.z = m_zDistance;
                    m_selectedPoint.transform.position = vector;
                    foreach (var triangle in m_dict[m_selectedPoint])
                    {
                        triangle.m_triangle.m_uvs[triangle.m_index] = WorldToUv(vector);
                    }
                }
            }
        }

        for (int i = 0; i < m_edges.Count; i++)
        {
            var edge = m_edges[i];

            edge.m_renderer.SetPosition(0, edge.m_pointA.transform.position);
            edge.m_renderer.SetPosition(1, edge.m_pointB.transform.position);
        }
    }
Exemple #2
0
    void RemoveConnected(DraggableMeshPoint point)
    {
        if (point == null)
        {
            return;
        }

        m_invalidated = true;

        List <Edge>     edges               = new List <Edge>();
        List <Triangle> triangles           = new List <Triangle>();
        HashSet <DraggableMeshPoint> points = new HashSet <DraggableMeshPoint>();

        foreach (var e in m_edges)
        {
            if (e.m_pointA == point || e.m_pointB == point)
            {
                edges.Add(e);
                points.Add(e.m_pointA);
                points.Add(e.m_pointB);
            }
        }

        foreach (var t in m_triangles)
        {
            if (t.m_pointA == point || t.m_pointB == point || t.m_pointC == point)
            {
                triangles.Add(t);
                points.Add(t.m_pointA);
                points.Add(t.m_pointB);
                points.Add(t.m_pointC);
            }
        }

        Debug.Log("Triangles removed: " + m_triangles.RemoveAll((x) => triangles.Contains(x)));
        Debug.Log("Edges removed: " + m_edges.RemoveAll((x) => edges.Contains(x)));
        Debug.Log("Handles removed: " + m_meshPointHandles.RemoveAll((x) => points.Contains(x)));

        foreach (var p in points)
        {
            Destroy(p.gameObject);
        }

        foreach (var e in edges)
        {
            if (e.m_renderer != null)
            {
                Destroy(e.m_renderer.gameObject);
            }
            RemoveConnected(e.m_pointA);
            RemoveConnected(e.m_pointB);
        }
    }
Exemple #3
0
    void LateUpdate()
    {
        if (!m_active)
        {
            return;
        }

        if (m_selectedPoint == null)
        {
            if (!EventSystem.current.IsPointerOverGameObject())
            {
                Ray        ray = m_camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, 1000f, m_dragPointMask))
                {
                    DraggableMeshPoint point = hit.collider.GetComponent <DraggableMeshPoint>();
                    if (point != null)
                    {
                        point.Highlight();
                        if (Input.GetButtonDown(m_buttonPrimary))
                        {
                            m_selectedPoint = point;
                            m_zDistance     = m_camera.transform.worldToLocalMatrix.MultiplyPoint(m_selectedPoint.transform.position).z;
                        }
                    }
                }
            }
        }
        else
        {
            if (Input.GetButtonUp(m_buttonPrimary))
            {
                m_selectedPoint = null;
            }
            else
            {
                m_selectedPoint.Select();
                if (Input.GetButton(m_buttonPrimary))
                {
                    m_selectedPoint.transform.position = m_camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, m_zDistance));
                }
                if (Input.GetKeyDown(KeyCode.Delete))
                {
                    RemoveConnected(m_selectedPoint);
                }
            }
        }

        for (int i = 0; i < m_edges.Count; i++)
        {
            var edge = m_edges[i];
            if (edge.m_renderer == null)
            {
                var go = new GameObject("Edge Renderer (copy)");
                go.transform.SetParent(transform);
                go.layer                       = edge.m_pointA.gameObject.layer;
                edge.m_renderer                = go.AddComponent <LineRenderer>();
                edge.m_renderer.startWidth     = 0.04f;
                edge.m_renderer.endWidth       = 0.04f;
                edge.m_renderer.sharedMaterial = m_edgeMaterial;
                m_edges[i]                     = edge;
            }
            edge.m_renderer.SetPosition(0, edge.m_pointA.transform.position);
            edge.m_renderer.SetPosition(1, edge.m_pointB.transform.position);
        }
    }
Exemple #4
0
        public static void Deserialize(out List <DraggableMeshPoint> points, out List <Edge> edges, out List <Triangle> triangles, out int nextFreeId, BinaryReader br, DraggableMeshPoint prefab)
        {
            int version = br.ReadInt16();

            nextFreeId = 0;
            int maxId = 0;

            if (version >= 3)
            {
                nextFreeId = br.ReadInt32();
            }

            Debug.Log("Next Free Id: " + nextFreeId);

            int count = br.ReadInt32();

            points = new List <DraggableMeshPoint>();
            Debug.Log("Points: " + count);
            Dictionary <int, DraggableMeshPoint> idDict = new Dictionary <int, DraggableMeshPoint>();

            for (int i = 0; i < count; i++)
            {
                var instance = Instantiate(prefab);
                instance.m_id = br.ReadInt32();
                if (instance.m_id > maxId)
                {
                    maxId = instance.m_id;
                }
                Debug.Log("Adding id: " + instance.m_id);
                idDict.Add(instance.m_id, instance);
                instance.transform.position = br.ReadVector3();
                points.Add(instance);
            }

            count = br.ReadInt32();
            edges = new List <Edge>();
            Debug.Log("Edges: " + count);
            for (int i = 0; i < count; i++)
            {
                int a = br.ReadInt32();
                int b = br.ReadInt32();
                edges.Add(new Edge
                {
                    m_pointA = idDict[a],
                    m_pointB = idDict[b]
                });
            }

            count     = br.ReadInt32();
            triangles = new List <Triangle>();
            Debug.Log("Triangles: " + count);
            for (int i = 0; i < count; i++)
            {
                int     smoothingGroup = br.ReadInt32();
                int     idA = br.ReadInt32();
                int     idB = br.ReadInt32();
                int     idC = br.ReadInt32();
                Vector2 uvA = Vector2.zero, uvB = Vector2.zero, uvC = Vector2.zero;
                if (version >= 2)
                {
                    uvA = br.ReadVector2();
                    uvB = br.ReadVector2();
                    uvC = br.ReadVector2();
                }
                triangles.Add(new Triangle
                {
                    m_smoothGroupIndex = smoothingGroup,
                    m_pointA           = idDict[idA],
                    m_pointB           = idDict[idB],
                    m_pointC           = idDict[idC],
                    m_uvA = uvA,
                    m_uvB = uvB,
                    m_uvC = uvC,
                });
            }

            if (version < 3)
            {
                nextFreeId = maxId + 1;
            }
        }