From fd9facad9be54ba325f00e404a80a3617f897727 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Tue, 18 Sep 2018 20:45:32 -0700 Subject: [PATCH] Sliders! --- Waveform/Base.lproj/Main.storyboard | 246 +++++++++++++++++++++++++++- Waveform/GameViewController.swift | 112 +++++++++++-- 2 files changed, 343 insertions(+), 15 deletions(-) diff --git a/Waveform/Base.lproj/Main.storyboard b/Waveform/Base.lproj/Main.storyboard index 5d0b8f6..6d3fffb 100644 --- a/Waveform/Base.lproj/Main.storyboard +++ b/Waveform/Base.lproj/Main.storyboard @@ -1,9 +1,10 @@ - + - - + + + @@ -675,7 +676,7 @@ - + @@ -702,14 +703,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + diff --git a/Waveform/GameViewController.swift b/Waveform/GameViewController.swift index 0ebc728..3f37374 100644 --- a/Waveform/GameViewController.swift +++ b/Waveform/GameViewController.swift @@ -9,7 +9,14 @@ import SceneKit import QuartzCore -class GameViewController: NSViewController, SCNSceneRendererDelegate { +protocol SlidersDelegate: AnyObject { + func delayXScaleAdjusted(newValue: Double) + func delayYScaleAdjusted(newValue: Double) + func inputXScaleAdjusted(newValue: Double) + func inputYScaleAdjusted(newValue: Double) +} + +class GameViewController: NSViewController, SCNSceneRendererDelegate, SlidersDelegate { static let numberOfBallsPerSide = 41 private var balls = [SCNNode]() @@ -83,7 +90,7 @@ class GameViewController: NSViewController, SCNSceneRendererDelegate { sceneView.scene = scene // allows the user to manipulate the camera - sceneView.allowsCameraControl = false + sceneView.allowsCameraControl = true // show statistics such as fps and timing information sceneView.showsStatistics = true @@ -92,12 +99,30 @@ class GameViewController: NSViewController, SCNSceneRendererDelegate { sceneView.backgroundColor = NSColor.black } + override func viewDidAppear() { + super.viewDidAppear() + performSegue(withIdentifier: NSStoryboardSegue.Identifier("showSliders"), sender: self) + } + + override func prepare(for segue: NSStoryboardSegue, sender: Any?) { + if segue.identifier == NSStoryboardSegue.Identifier("showSliders") { + let windowController = segue.destinationController as? NSWindowController + let slidersViewController = windowController?.contentViewController as? SlidersViewController + slidersViewController?.delegate = self + } + } + func delayForSphereAt(x: Int, y: Int) -> Double { - return 0.05 * Double(x) + 0.03 * Double(y) + return 0.05 * Double(x) + 0.05 * Double(y) } // MARK: - SCNRendererDelegate + var delayXScale = 0.05 + var delayYScale = 0.05 + var inputXScale = 2.0 + var inputYScale = 2.0 + var maxY = 0.0 var minY = 0.0 @@ -107,21 +132,88 @@ class GameViewController: NSViewController, SCNSceneRendererDelegate { let idx = z * GameViewController.numberOfBallsPerSide + x let node = balls[idx] - let delay = delayForSphereAt(x: x, y: z) - let inputX = 0.5 * time + delay - let y = (sin(inputX) + sin(2.0 * inputX) + sin(4.0 * inputX) + sin(8.0 * inputX)) / 2.0 + //let delay = delayForSphereAt(x: x, y: z) + let delayX = delayXScale * Double(x) + let delayY = delayYScale * Double(z) + let inputX = inputXScale * (time + delayX) + let inputY = inputYScale * (time + delayY) + let y = sin(inputX) + sin(2.0 * inputX) + sin(inputY) + sin(2.0 * inputY) node.worldPosition.y = CGFloat(y) - maxY = max(y, maxY) - minY = min(y, minY) - let scale = CGFloat(map(y, inMin: minY, inMax: maxY, outMin: 0.0, outMax: 1.0)) - node.scale = SCNVector3(x: scale, y: scale, z: scale) +// maxY = max(y, maxY) +// minY = min(y, minY) +// let scale = CGFloat(map(y, inMin: minY, inMax: maxY, outMin: 0.0, outMax: 1.0)) +// node.scale = SCNVector3(x: scale, y: scale, z: scale) } } } + // MARK: - SlidersDelegate + + func delayXScaleAdjusted(newValue: Double) { + delayXScale = newValue + } + + func delayYScaleAdjusted(newValue: Double) { + delayYScale = newValue + } + + func inputXScaleAdjusted(newValue: Double) { + inputXScale = newValue + } + + func inputYScaleAdjusted(newValue: Double) { + inputYScale = newValue + } + + // MARK: - Private + func map(_ x: Double, inMin: Double, inMax: Double, outMin: Double, outMax: Double) -> Double { return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin } } + +class SlidersViewController: NSViewController { + weak var delegate: SlidersDelegate? + + @IBOutlet weak var delayXSlider: NSSlider! + @IBOutlet weak var delayYSlider: NSSlider! + @IBOutlet weak var inputXSlider: NSSlider! + @IBOutlet weak var inputYSlider: NSSlider! + + @IBOutlet weak var delayXLabel: NSTextField! + @IBOutlet weak var delayYLabel: NSTextField! + @IBOutlet weak var inputXLabel: NSTextField! + @IBOutlet weak var inputYLabel: NSTextField! + + override func viewDidLoad() { + super.viewDidLoad() + delayXLabel.stringValue = formatValueForLabel(delayXSlider.doubleValue) + delayYLabel.stringValue = formatValueForLabel(delayYSlider.doubleValue) + inputXLabel.stringValue = formatValueForLabel(inputXSlider.doubleValue) + inputYLabel.stringValue = formatValueForLabel(inputYSlider.doubleValue) + } + + @IBAction func sliderValueDidChange(_ sender: Any) { + if let slider = sender as? NSSlider { + if slider == delayXSlider { + delegate?.delayXScaleAdjusted(newValue: slider.doubleValue) + delayXLabel.stringValue = formatValueForLabel(slider.doubleValue) + } else if slider == delayYSlider { + delegate?.delayYScaleAdjusted(newValue: slider.doubleValue) + delayYLabel.stringValue = formatValueForLabel(slider.doubleValue) + } else if slider == inputXSlider { + delegate?.inputXScaleAdjusted(newValue: slider.doubleValue) + inputXLabel.stringValue = formatValueForLabel(slider.doubleValue) + } else if slider == inputYSlider { + delegate?.inputYScaleAdjusted(newValue: slider.doubleValue) + inputYLabel.stringValue = formatValueForLabel(slider.doubleValue) + } + } + } + + func formatValueForLabel(_ value: Double) -> String { + return String(format: "%.3f", value) + } +}