diff --git a/Cube4Fun/AnimationsController.swift b/Cube4Fun/AnimationsController.swift index e901e14..d2b67ac 100644 --- a/Cube4Fun/AnimationsController.swift +++ b/Cube4Fun/AnimationsController.swift @@ -7,27 +7,41 @@ // import Cocoa +import Foundation + + +//let _emptyAnimation: NSMutableDictionary = ["AnimName": "Animation1", "AnimKey": "1=anim1", "AnimDur": 1, "AnimSpeed": 500, "AnimFrames": 1] + +/* +var dataArray: [NSMutableDictionary] = [["AnimName": "Animation1", "AnimKey": "1=anim1", "AnimDur": 3, "AnimSpeed": 700, "AnimFrames": 12], + ["AnimName": "Animation2", "AnimKey": "1=anim2", "AnimDur": 7, "AnimSpeed": 1700, "AnimFrames": 17], + ["AnimName": "Animation3", "AnimKey": "1=anim3", "AnimDur": 1, "AnimSpeed": 500, "AnimFrames": 22], + ["AnimName": "Animation4", "AnimKey": "1=anim4", "AnimDur": 10, "AnimSpeed": 500, "AnimFrames": 32], + ["AnimName": "Animation5", "AnimKey": "1=anim5", "AnimDur": 23, "AnimSpeed": 500, "AnimFrames": 18], + ["AnimName": "Animation6", "AnimKey": "1=anim6", "AnimDur": 2, "AnimSpeed": 1000, "AnimFrames": 52]]; +*/ + +var _animationArray: [NSMutableDictionary] = [NSMutableDictionary](); + class AnimationsController: NSObject, NSTableViewDataSource, NSTableViewDelegate { - @IBOutlet weak var animationsWindow: NSWindow! @IBOutlet weak var myTableView: NSTableView! - var dataArray: [NSMutableDictionary] = [["AnimName": "Animation1", "AnimKey": "1=anim1", "AnimDur": 3, "AnimSpeed": 700, "AnimFrames": 12], - ["AnimName": "Animation2", "AnimKey": "1=anim2", "AnimDur": 7, "AnimSpeed": 1700, "AnimFrames": 17], - ["AnimName": "Animation3", "AnimKey": "1=anim3", "AnimDur": 1, "AnimSpeed": 500, "AnimFrames": 22], - ["AnimName": "Animation4", "AnimKey": "1=anim4", "AnimDur": 10, "AnimSpeed": 500, "AnimFrames": 32], - ["AnimName": "Animation5", "AnimKey": "1=anim5", "AnimDur": 23, "AnimSpeed": 500, "AnimFrames": 18], - ["AnimName": "Animation6", "AnimKey": "1=anim6", "AnimDur": 2, "AnimSpeed": 1000, "AnimFrames": 52]]; + var _selectedRow: Int = -1 + + override func awakeFromNib() { + _animationArray.append(_emptyAnimation) + } func numberOfRowsInTableView(tableView: NSTableView) -> Int { - let numberOfRows:Int = dataArray.count + let numberOfRows:Int = _animationArray.count return numberOfRows } func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? { - println("Display: \(row)") - let object: NSDictionary = dataArray[row] as NSDictionary + //println("Display: \(row)") + let object: NSDictionary = _animationArray[row] as NSDictionary //println(object) let column: String = tableColumn?.identifier as String! if column == "AnimName" { @@ -54,12 +68,67 @@ class AnimationsController: NSObject, NSTableViewDataSource, NSTableViewDelegate return column } + func tableViewSelectionDidChange(notification: NSNotification) { - println("klicked") + let view: NSTableView = notification.object as NSTableView + _selectedRow = view.selectedRow + + //println("klicked \(view.selectedRow)") } func tableView(tableView: NSTableView, setObjectValue object: AnyObject?, forTableColumn tableColumn: NSTableColumn?, row: Int) { - dataArray[row].setObject(object!, forKey: (tableColumn?.identifier)!) + let column: String = tableColumn?.identifier as String! + //println("Object: \(object) Key: \((tableColumn?.identifier)!)" ) + + let value = object! as NSString + if column == "AnimName" { + _animationArray[row].setObject(value, forKey: (tableColumn?.identifier)!) + } + if column == "AnimKey" { + _animationArray[row].setObject(value, forKey: (tableColumn?.identifier)!) + } + if column == "AnimDur" { + _animationArray[row].setObject(value.integerValue, forKey: (tableColumn?.identifier)!) + } + if column == "AnimSpeed" { + _animationArray[row].setObject(value.integerValue, forKey: (tableColumn?.identifier)!) + } + if column == "AnimFrames" { + _animationArray[row].setObject(value.integerValue, forKey: (tableColumn?.identifier)!) + } + } + + @IBAction func addNewAnimation(sender: AnyObject) { + _animationArray.append(_emptyAnimation) + myTableView.reloadData() + // println("Adding new Item") + } + + @IBAction func delNewAnimation(sender: AnyObject) { + if ( _selectedRow >= 0 ) { + _animationArray.removeAtIndex(_selectedRow) + myTableView.reloadData() + } +// println("Deleting selected Item") + } + + @IBAction func moveUpItem(send: AnyObject) { + if ( _selectedRow > 0 ) { + _animationArray.insert(_animationArray[_selectedRow], atIndex: _selectedRow-1) + _animationArray.removeAtIndex(_selectedRow+1) + myTableView.reloadData() + myTableView.selectRowIndexes(NSIndexSet(index: _selectedRow-1), byExtendingSelection: false) +// let save: NSMutableDictionary = dataArray. + } + } + + @IBAction func moveDownItem(send: AnyObject) { + if (_selectedRow < _animationArray.count - 1) { + _animationArray.insert(_animationArray[_selectedRow+1], atIndex: _selectedRow) + _animationArray.removeAtIndex(_selectedRow+2) + myTableView.reloadData() + myTableView.selectRowIndexes(NSIndexSet(index: _selectedRow+1), byExtendingSelection: false) + } } /* diff --git a/Cube4Fun/AppDelegate.swift b/Cube4Fun/AppDelegate.swift index 7b6ea49..b231416 100644 --- a/Cube4Fun/AppDelegate.swift +++ b/Cube4Fun/AppDelegate.swift @@ -8,17 +8,17 @@ import Cocoa +var _animationsWindow: NSWindow = NSWindow() + @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! - @IBOutlet weak var projectWindow: NSWindow! - - - @IBOutlet weak var closeButton: NSButton! + @IBOutlet weak var animationsWindow: NSWindow! func applicationDidFinishLaunching(aNotification: NSNotification) { // Insert code here to initialize your application + _animationsWindow = animationsWindow } func applicationShouldTerminate(sender: NSApplication) -> NSApplicationTerminateReply { @@ -26,9 +26,5 @@ class AppDelegate: NSObject, NSApplicationDelegate { return NSApplicationTerminateReply.TerminateNow } - @IBAction func closeButtonClicked(sender: AnyObject ) { - projectWindow.close() - } - } diff --git a/Cube4Fun/GameView.swift b/Cube4Fun/GameView.swift index 064889c..656f1bb 100644 --- a/Cube4Fun/GameView.swift +++ b/Cube4Fun/GameView.swift @@ -204,6 +204,36 @@ class GameView: SCNView { updateButtonVisibility() } + func plusSpeedButtonPressed() { + if ( _playSendDelay <= 3 ) { // 3 seconds slowest fps + _playSendDelay = _playSendDelay + 0.1 + updateSpeedText() + } + } + + func minusSpeedButtonPressed() { + println(_playSendDelay) + if ( _playSendDelay > 0.2 ) { // 100ms fastest fps + _playSendDelay = _playSendDelay - 0.1 + updateSpeedText() + } + } + + func updateSpeedText() { + if let rootNode = self.scene?.rootNode { + for childNode in rootNode.childNodes { + let buttonNode: SCNNode = childNode as SCNNode + if buttonNode.name == "mySpeedText" { + let geometry:SCNText = buttonNode.geometry as SCNText + geometry.string = "Speed: \(Int(_playSendDelay*1000)) ms" + } + + } + } + + } + + func playButtonPressed() { // Change the button from Play to Pause let myPauseButtonNode: SCNNode = self.scene!.rootNode.childNodeWithName("myPauseButton", recursively: true)! @@ -226,6 +256,10 @@ class GameView: SCNView { _playAllFrames = false } + func openAnimationWindow() { + _animationsWindow.setIsVisible(true) + + } override func rightMouseDown(theEvent: NSEvent) { let p = self.convertPoint(theEvent.locationInWindow, fromView: nil) @@ -305,6 +339,15 @@ class GameView: SCNView { } if clickedNode.name == "myLastFrameButton" { lastButtonPressed() + } + if clickedNode.name == "myPlusSpeedButton" { + plusSpeedButtonPressed() + } + if clickedNode.name == "myMinusSpeedButton" { + minusSpeedButtonPressed() + } + if clickedNode.name == "myMngAnimationsButton" { + openAnimationWindow() } if clickedNode.name == "myColorBar" || clickedNode.name == "myArrows" { let colorInt = Int(round(relativeBarPosition - theEvent.locationInWindow.y)) diff --git a/Cube4Fun/GameViewController.swift b/Cube4Fun/GameViewController.swift index 2bd3c8d..d13a7bb 100644 --- a/Cube4Fun/GameViewController.swift +++ b/Cube4Fun/GameViewController.swift @@ -9,10 +9,11 @@ import SceneKit import QuartzCore + var myFrameCount: UInt32 = 1; var myMaxFrameCount: UInt32 = 1; -var myFrames: NSMutableData = NSMutableData() - +var myFrames: NSMutableData = NSMutableData() // == byte[] array +var _emptyAnimation: NSMutableDictionary = ["AnimName": "Animation1", "AnimKey": "1=anim1", "AnimDur": 1, "AnimSpeed": 500, "AnimFrames": 1, "AnimData": myFrames] let emptyFrame: [Byte] = [ 255,255,255,255, diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Contents.json b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Contents.json index 2db2b1c..66257b0 100644 --- a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,38 +1,45 @@ { "images" : [ { - "idiom" : "mac", "size" : "16x16", + "idiom" : "mac", + "filename" : "Cube4Fun-Icon-16.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "16x16", + "idiom" : "mac", + "filename" : "Cube4Fun-Icon-32.png", "scale" : "2x" }, { - "idiom" : "mac", "size" : "32x32", + "idiom" : "mac", + "filename" : "Cube4Fun-Icon-32-1.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "32x32", + "idiom" : "mac", + "filename" : "Cube4Fun-Icon-64.png", "scale" : "2x" }, { - "idiom" : "mac", "size" : "128x128", + "idiom" : "mac", + "filename" : "Cube4Fun-Icon-128.png", "scale" : "1x" }, { - "idiom" : "mac", "size" : "128x128", + "idiom" : "mac", + "filename" : "Cube4Fun-Icon-256.png", "scale" : "2x" }, { - "idiom" : "mac", "size" : "256x256", + "idiom" : "mac", + "filename" : "Cube4Fun-Icon-256-1.png", "scale" : "1x" }, { diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-128.png b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-128.png new file mode 100644 index 0000000..4593301 Binary files /dev/null and b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-128.png differ diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-16.png b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-16.png new file mode 100644 index 0000000..d136f6a Binary files /dev/null and b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-16.png differ diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-256-1.png b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-256-1.png new file mode 100644 index 0000000..33c80d2 Binary files /dev/null and b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-256-1.png differ diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-256.png b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-256.png new file mode 100644 index 0000000..33c80d2 Binary files /dev/null and b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-256.png differ diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-32-1.png b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-32-1.png new file mode 100644 index 0000000..af51fae Binary files /dev/null and b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-32-1.png differ diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-32.png b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-32.png new file mode 100644 index 0000000..af51fae Binary files /dev/null and b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-32.png differ diff --git a/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-64.png b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-64.png new file mode 100644 index 0000000..6670709 Binary files /dev/null and b/Cube4Fun/Images.xcassets/AppIcon.appiconset/Cube4Fun-Icon-64.png differ diff --git a/Cube4Fun/PrimitivesScene.swift b/Cube4Fun/PrimitivesScene.swift index 09659c6..a1b3ffb 100644 --- a/Cube4Fun/PrimitivesScene.swift +++ b/Cube4Fun/PrimitivesScene.swift @@ -80,6 +80,42 @@ class PrimitivesScene: SCNScene { } self.rootNode.addChildNode(lastFrameImageNode) + } + + func createSpeedButtons() { + // Frame + let textSpeed = SCNText(string: "Speed: \(Int(_playSendDelay*1000)) ms", extrusionDepth: 0) + textSpeed.font = NSFont(name: "Arial", size: 1.2) + let textSpeedNode = SCNNode(geometry: textSpeed) + textSpeedNode.name = "mySpeedText" + textSpeedNode.position = SCNVector3(x:-20.0 , y: 9.7, z: 0.0) + self.rootNode.addChildNode(textSpeedNode) + + // SpeedUp - Button + let plusSpeedImage = SCNPlane(width: 1.7, height: 1.7) + plusSpeedImage.firstMaterial?.diffuse.contents = NSImage(named: "list-add-2.png") + let plusSpeedImageNode = SCNNode(geometry: plusSpeedImage) + plusSpeedImageNode.name = "myPlusSpeedButton" + plusSpeedImageNode.position = SCNVector3(x:-16.5, y:8, z:0) + self.rootNode.addChildNode(plusSpeedImageNode) + + // SpeedDown - Button + let minusSpeedImage = SCNPlane(width: 1.7, height: 1.7) + minusSpeedImage.firstMaterial?.diffuse.contents = NSImage(named: "list-remove-2.png") + let minusSpeedImageNode = SCNNode(geometry: minusSpeedImage) + minusSpeedImageNode.name = "myMinusSpeedButton" + minusSpeedImageNode.position = SCNVector3(x:-18.7, y:8, z:0) + self.rootNode.addChildNode(minusSpeedImageNode) + } + + func createFrameButtons() { + let textFrame = SCNText(string: "Frame: \(myFrameCount)/\(myMaxFrameCount)", extrusionDepth: 0) + textFrame.font = NSFont(name: "Arial", size: 1.2) + let textFrameNode = SCNNode(geometry: textFrame) + textFrameNode.name = "myFrameText" + textFrameNode.position = SCNVector3(x:-20.0 , y: 13.7, z: 0.0) + self.rootNode.addChildNode(textFrameNode) + // AddFrame - Button let addFrameImage = SCNPlane(width: 1.7, height: 1.7) addFrameImage.firstMaterial?.diffuse.contents = NSImage(named: "list-add-2.png") @@ -99,7 +135,23 @@ class PrimitivesScene: SCNScene { delFrameImageNode.hidden = true } self.rootNode.addChildNode(delFrameImageNode) + } + + func createOpenAnimations() { + let textAnimations = SCNText(string: "List Animations", extrusionDepth: 0) + textAnimations.font = NSFont(name: "Arial", size: 1.2) + let textAnimationsNode = SCNNode(geometry: textAnimations) + textAnimationsNode.name = "myAnimationsText" + textAnimationsNode.position = SCNVector3(x:-20.0 , y: 5.7, z: 0.0) + self.rootNode.addChildNode(textAnimationsNode) + // Manage Animations - Button + let mngAnimationsImage = SCNPlane(width: 1.7, height: 1.7) + mngAnimationsImage.firstMaterial?.diffuse.contents = NSImage(named: "view-sidetree.png") + let mngAnimationsImageNode = SCNNode(geometry: mngAnimationsImage) + mngAnimationsImageNode.name = "myMngAnimationsButton" + mngAnimationsImageNode.position = SCNVector3(x:-16.5, y:4, z:0) + self.rootNode.addChildNode(mngAnimationsImageNode) } override init() { @@ -134,17 +186,17 @@ class PrimitivesScene: SCNScene { self.rootNode.addChildNode(textNode) // Frame - let textFrame = SCNText(string: "Frame: \(myFrameCount)/\(myMaxFrameCount)", extrusionDepth: 0) - textFrame.font = NSFont(name: "Arial", size: 1.2) - let textFrameNode = SCNNode(geometry: textFrame) - textFrameNode.name = "myFrameText" - textFrameNode.position = SCNVector3(x:-20.0 , y: 13.7, z: 0.0) - self.rootNode.addChildNode(textFrameNode) - + createFrameButtons() // Action Buttons createPlayback() + // Speed Buttons + createSpeedButtons() + + // Open Animation Button + createOpenAnimations() + // color picker let colorBar = SCNPlane(width: 3, height: 16) colorBar.firstMaterial?.diffuse.contents = NSImage(named: "Gradient2.png")