public void InstantiateLatches(Manifold manifold, FaceHandleController handleController) { var neighbourFaces = manifold.GetAdjacentFaceIdsAndEdgeCenters(handleController.AssociatedFaceID); var edgeCenters = neighbourFaces.edgeCenter; for (int j = 0; j < neighbourFaces.edgeId.Length; j++) { var adjacentFace = neighbourFaces.faceId[j]; int uniqueHalfedgeId = Mathf.Max(manifold.GetOppHalfEdge(neighbourFaces.edgeId[j]), neighbourFaces.edgeId[j]); EdgeHandleController existingEdgeHandle = null; var latchExists = _edgeHandles.TryGetValue(uniqueHalfedgeId, out existingEdgeHandle); if (latchExists) { handleController.AttachLatch(existingEdgeHandle); } else { var newLatch = Instantiate(LatchPrefab, transform, false); //newLatch.transform.localScale = Vector3.Scale(transform.lossyScale, newLatch.transform.localScale); newLatch.transform.SetParent(transform); var edgeCenter = edgeCenters[j]; var edgeHandleController = newLatch.GetComponent <EdgeHandleController>(); var adjacentFaceNormal = manifold.GetFaceNormal(adjacentFace); var normal = manifold.GetFaceNormal(handleController.AssociatedFaceID); edgeHandleController.UpdatePositionAndRotation(edgeCenter, neighbourFaces.edgeNormals[j], adjacentFaceNormal + normal); edgeHandleController.FirstFace = handleController.AssociatedFaceID; edgeHandleController.SecondFace = adjacentFace; // always use max halfedge id - to uniquely identify halfedge edgeHandleController.AssociatedEdgeID = uniqueHalfedgeId; KeyValuePair <int, int> pairToRemove = new KeyValuePair <int, int>(); foreach (var pair in _closedEdgeBackup) { if (edgeHandleController.IsAdjacent(pair.Key, pair.Value)) { pairToRemove = pair; edgeHandleController.Locked = true; break; } } _closedEdgeBackup.Remove(pairToRemove); handleController.AttachLatch(edgeHandleController); _edgeHandles.Add(edgeHandleController.AssociatedEdgeID, edgeHandleController); } } }
private FaceHandleController InstantiateFaceHandle(Manifold manifold, int faceId) { var newHandle = Instantiate(FaceHandlePrefab, transform, false); //newHandle.transform.localScale = Vector3.Scale(transform.lossyScale,newHandle.transform.localScale); newHandle.transform.SetParent(transform); // Assign handle position to the center of a face var center = manifold.GetCenterTriangulated(faceId); // Rotate the handle to look in the opposite direction of face's normal var normal = manifold.GetFaceNormal(faceId); var edgeNormal = manifold.GetFirstEdgeDirection(faceId); var faceHandleController = newHandle.GetComponent <FaceHandleController>(); faceHandleController.UpdatePositionAndRotation(center, normal, edgeNormal); // Assign FaceID and Extrudable reference to handle faceHandleController.AssociatedFaceID = faceId; faceHandleController.Extrudable = Extrudable; _faceHandles.Add(faceId, faceHandleController); return(faceHandleController); }
public void updateAdjacentFaceHandles(int face) { Manifold manifold = Extrudable._manifold; //Use average of edgecenters if we have more than 4 edges. var temp = manifold.GetAdjacentFaceIdsAndEdgeCenters(face); foreach (int faceHandleId in temp.faceId) { var center = manifold.GetCenterTriangulated(faceHandleId); FaceHandleController faceHandleController = _faceHandles[faceHandleId]; if (temp.edgeCenter.Length > 4) { Vector3 cent = new Vector3(); foreach (Vector3 v in temp.edgeCenter) { cent[0] += v[0]; cent[1] += v[1]; cent[2] += v[2]; } cent[0] /= temp.edgeCenter.Length; cent[1] /= temp.edgeCenter.Length; cent[2] /= temp.edgeCenter.Length; center = cent; } // Rotate the handle to look in the opposite direction of face's normal var normal = manifold.GetFaceNormal(faceHandleId); var edgeNormal = manifold.GetFirstEdgeDirection(faceHandleId); faceHandleController.UpdatePositionAndRotation(center, normal, edgeNormal); } }
public void UpdateFacesAndSelectedEdges(List <int> extrudingFaces) { Manifold manifold = Extrudable._manifold; foreach (var handleFace in extrudingFaces) { var center = manifold.GetCenterTriangulated(handleFace); // Rotate the handle to look in the opposite direction of face's normal var normal = manifold.GetFaceNormal(handleFace); var edgeNormal = manifold.GetFirstEdgeDirection(handleFace); _faceHandles[handleFace].UpdatePositionAndRotation(center, normal, edgeNormal); } }
public void UpdateControls() { Manifold manifold = Extrudable._manifold; var faceIds = new int[manifold.NumberOfFaces()]; var vertexIds = new int[manifold.NumberOfVertices()]; var halfedgeIds = new int[manifold.NumberOfHalfEdges()]; manifold.GetHMeshIds(vertexIds, halfedgeIds, faceIds); // update face handles foreach (var faceHandleController in _faceHandles) { var handleFace = faceHandleController.Value.AssociatedFaceID; if (!faceHandleController.Value.IsDragged) { var center = manifold.GetCenterTriangulated(handleFace); //Use average of edgecenters if we have more than 4 edges. var temp = manifold.GetAdjacentFaceIdsAndEdgeCenters(handleFace); if (temp.edgeCenter.Length > 4) { Vector3 cent = new Vector3(); foreach (Vector3 v in temp.edgeCenter) { cent[0] += v[0]; cent[1] += v[1]; cent[2] += v[2]; } cent[0] /= temp.edgeCenter.Length; cent[1] /= temp.edgeCenter.Length; cent[2] /= temp.edgeCenter.Length; center = cent; } // Rotate the handle to look in the opposite direction of face's normal var normal = manifold.GetFaceNormal(handleFace); var edgeNormal = manifold.GetFirstEdgeDirection(handleFace); faceHandleController.Value.UpdatePositionAndRotation(center, normal, edgeNormal); faceHandleController.Value.gameObject.SetActive(true); } var adjacentFaces = manifold.GetAdjacentFaceIdsAndEdgeCenters(handleFace); for (int j = 0; j < adjacentFaces.edgeId.Length; j++) { EdgeHandleController latch; if (_edgeHandles.TryGetValue(adjacentFaces.edgeId[j], out latch)) { var otherFace = latch.GetOtherFace(handleFace); var edgeCenter = adjacentFaces.edgeCenter[j]; var normal = manifold.GetFaceNormal(handleFace); var adjacentFaceNormal = manifold.GetFaceNormal(otherFace); latch.UpdatePositionAndRotation(edgeCenter, adjacentFaces.edgeNormals[j], adjacentFaceNormal + normal); latch.gameObject.SetActive(true); } } } for (int i = 0; i < faceIds.Length; i++) { int id = faceIds[i]; FaceHandleController visitedHandleController = null; _faceHandles.TryGetValue(id, out visitedHandleController); var newHandle = visitedHandleController != null ? visitedHandleController : InstantiateFaceHandle(manifold, id); InstantiateLatches(manifold, newHandle); } foreach (var vertexHandleController in _vertexHandles) { if (!vertexHandleController.Value.IsDragged) { Vector3 vertexPosition = manifold.VertexPosition(vertexHandleController.Key); vertexHandleController.Value.transform.localPosition = vertexPosition; Vector3 vertexNormal = manifold.GetVertexNormal(vertexHandleController.Key); //Debug.Log("VertexHandleNormal: " + vertexNormal); Quaternion handleRotation = Quaternion.LookRotation(-vertexNormal); vertexHandleController.Value.transform.localRotation = handleRotation; } vertexHandleController.Value.gameObject.SetActive(true); } for (int i = 0; i < vertexIds.Length; i++) { int id = vertexIds[i]; VertexHandleController vertexHandle = null; _vertexHandles.TryGetValue(id, out vertexHandle); if (!manifold.IsVertexInUse(id) || vertexHandle != null) { continue; } InstantiateVertexHandle(manifold, id); } //update sizes foreach (var faceHandleController in _faceHandles.Values) { faceHandleController.UpdateHandleSize(); } foreach (var edgeHandleController in _edgeHandles.Values) { edgeHandleController.UpdateHandleSize(); } foreach (var vertexHandleController in _vertexHandles.Values) { vertexHandleController.UpdateHandleSize(); } }
public Vector3 GetFaceNormal(int faceId) { return(_manifold.GetFaceNormal(faceId)); }