@@ -9,19 +9,28 @@ class ViewController: UIViewController, MetaballDataSource {
99 let width = 350
1010 let height = 600
1111
12− var metaballs = [CGPoint(x: 70, y: 70), CGPoint(x: 270, y: 470), CGPoint(x: 270, y: 70), CGPoint(x: 70, y: 470)].map {
13− Metaball(position: $0)
14− }
12+ var metaballGraph: Graph<Metaball>!
1513 var previousLocation: CGPoint!
1614
1715 var selectedMetaball: Metaball?
1816
17+ let edgeAnimationDuration: Float = 1
18+
1919 override func viewDidLoad() {
2020 super.viewDidLoad()
2121
2222 let recognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
2323 view.addGestureRecognizer(recognizer)
2424
25+ let metaballs = [CGPoint(x: 70, y: 70), CGPoint(x: 270, y: 70), CGPoint(x: 270, y: 470), CGPoint(x: 70, y: 470)].map {
26+ Metaball(position: $0)
27+ }
28+ metaballGraph = Graph(vertices: metaballs)
29+ metaballGraph.addEdge(0, 1)
30+ metaballGraph.addEdge(0, 3)
31+ metaballGraph.addEdge(1, 2)
32+ metaballGraph.addEdge(2, 3)
33+
2534 let border = 20
2635 let metaballViewFrame = CGRect(x: border/2, y: border/2, width: width, height: height)
2736 renderer = MetalMetaballRenderer(dataSource: self, frame: metaballViewFrame)
@@ -36,6 +45,41 @@ class ViewController: UIViewController, MetaballDataSource {
3645 metaballView.addSubview(metaball)
3746 }
3847
48+ addEdge(0, 2)
49+
50+ renderer.state = .Running
51+ }
52+
53+ func addEdge(i: Int, _ j: Int) {
54+ animateEdge(i, j, fadeIn: true)
55+ }
56+
57+ func removeEdge(i: Int, _ j: Int) {
58+ animateEdge(i, j, fadeIn: false)
59+ }
60+
61+ func animateEdge(i: Int, _ j: Int, fadeIn: Bool) {
62+ let parameters = EdgeAnimationParameters(startDate: NSDate(), duration: edgeAnimationDuration, fadeIn: fadeIn, i: i, j: j)
63+ NSTimer.scheduledTimerWithTimeInterval(1.0/60.0, target: self, selector: "animateEdgeWithTimer:", userInfo: parameters, repeats: true)
64+ }
65+
66+ func animateEdge(withTimer timer: NSTimer) {
67+ let (animationStart, duration, fadeIn, i, j) = (timer.userInfo as! EdgeAnimationParameters).unpack()
68+
69+ let now = NSDate()
70+ var timeElapsed = Float(now.timeIntervalSinceDate(animationStart))
71+
72+ if timeElapsed > duration {
73+ timer.invalidate()
74+ timeElapsed = duration
75+ }
76+
77+ let linearValue = timeElapsed / duration
78+ let interpolatedValue = fadeIn ? interpolateSquareEaseOut(linearValue) : (1 - interpolateSquareEaseIn(linearValue))
79+
80+ metaballGraph.adjacencyMatrix.set(i, j, value: interpolatedValue)
81+ metaballGraph.adjacencyMatrix.set(j, i, value: interpolatedValue)
82+
3983 renderer.state = .Running
4084 }
4185