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); } }
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); } }
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); } }
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; } }