a
@@ -1,325 +0,0 @@
|
||||
//
|
||||
// Animations.swift
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 07.04.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
|
||||
// Constants
|
||||
let AnimName = "AnimName"
|
||||
let AnimKey = "AnimKey"
|
||||
let AnimDuration = "AnimDur"
|
||||
let AnimSpeed = "AnimSpeed"
|
||||
let AnimFrames = "AnimData"
|
||||
|
||||
class Animations: NSObject {
|
||||
|
||||
let _emptyFrame: [UInt8] = [
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255]
|
||||
|
||||
var _displayedFrame: Int = 1;
|
||||
// var _frameCount: UInt32 = 1;
|
||||
// var _oneFrame: NSMutableData = NSMutableData() // == byte[] array
|
||||
// var _emptyAnimation: NSMutableDictionary = NSMutableDictionary()
|
||||
var _animationArray: [NSMutableDictionary] = [NSMutableDictionary]()
|
||||
var _animationSelected: Int = 0
|
||||
let _minSendDelay: NSTimeInterval = 0.200 // fastes speed 200 milliseconds
|
||||
let maxFrameSpeed = 3000 // the lowest possible speed allowed
|
||||
let minFrameSpeed = 100 // the fastest possible speed allowed
|
||||
let frameSpeedStep = 100 // how fast increase or decrease speed
|
||||
// var _playSendDelay: NSTimeInterval = 0.5 // 500 milliseconds as default
|
||||
var _copyFrameBuffer: [UInt8] = [UInt8]()
|
||||
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
// Show the first frame
|
||||
_displayedFrame = 1
|
||||
// Append empty animation
|
||||
self.addAnimation()
|
||||
// Set visible animation
|
||||
_animationSelected = 0
|
||||
// Init Buffer
|
||||
for ( var i = 0; i < 64 ; ++i ) {
|
||||
_copyFrameBuffer.append(255)
|
||||
}
|
||||
}
|
||||
|
||||
// How much animations do we have
|
||||
func count() -> (Int) {
|
||||
return _animationArray.count
|
||||
}
|
||||
|
||||
func sendFrame() {
|
||||
let time = NSDate.timeIntervalSinceReferenceDate()
|
||||
|
||||
if (_previousUpdateTime == 0.0) {
|
||||
_previousUpdateTime = time;
|
||||
}
|
||||
// need to do this because of rounding issues
|
||||
let deltaTime: Int = Int( round( (time - _previousUpdateTime) * 10 ) * 100);
|
||||
|
||||
//var ms = Int((time % 1) * 1000)
|
||||
if ( _playAllFrames ) {
|
||||
//println("Delta: \(deltaTime) Speed: \(__animations.animationSpeedInt())")
|
||||
if ( deltaTime >= __animations.animationSpeedInt() ){
|
||||
_previousUpdateTime = time;
|
||||
if (self.getAnimationFrameID() >= self.getAnimationFrameCount()) {
|
||||
_gameView.firstButtonPressed()
|
||||
}else{
|
||||
_gameView.nextButtonPressed()
|
||||
}
|
||||
CubeNetworkObj.updateFrame(self.getAnimDataSelected(), count: UInt32(self.getAnimationFrameID()))
|
||||
|
||||
}
|
||||
}else{
|
||||
CubeNetworkObj.updateFrame(self.getAnimDataSelected(), count: UInt32(self.getAnimationFrameID()))
|
||||
}
|
||||
}
|
||||
|
||||
func loadAnimations(animArray: NSArray) {
|
||||
// clear the array first
|
||||
_animationArray.removeAll(keepCapacity: true)
|
||||
for ( var i=0; i<animArray.count; i++ ) {
|
||||
_animationArray.append(animArray[i] as! NSMutableDictionary)
|
||||
//println("append Animation count: \(_animationArray.count)")
|
||||
}
|
||||
self.setSelectedAnimationID(0)
|
||||
_gameView.resetView()
|
||||
__tableView.reloadData()
|
||||
}
|
||||
|
||||
func getAnimation(id: Int) -> (NSDictionary) {
|
||||
//println(_animationArray.count)
|
||||
let myAnimation = _animationArray[id] as NSDictionary
|
||||
return myAnimation
|
||||
}
|
||||
func getAnimations() -> ([NSDictionary]) {
|
||||
return _animationArray as [NSDictionary];
|
||||
}
|
||||
|
||||
func getAnimationName(id: Int) -> (String) {
|
||||
let value = (self.getAnimation(id)).objectForKey(AnimName) as! String
|
||||
return value
|
||||
}
|
||||
func setAnimationName(id: Int, value: String) {
|
||||
(self.getAnimation(id)).setValue(value, forKey: AnimName)
|
||||
}
|
||||
|
||||
func getAnimationKey(id: Int) -> (String) {
|
||||
let value = (self.getAnimation(id)).objectForKey(AnimKey) as! String
|
||||
return value
|
||||
}
|
||||
func setAnimationKey(id: Int, value: String) {
|
||||
(self.getAnimation(id)).setValue(value, forKey: AnimKey)
|
||||
}
|
||||
|
||||
func getAnimationDuration(id: Int) -> (Int) {
|
||||
let value = (self.getAnimation(id)).objectForKey(AnimDuration) as! Int
|
||||
return value
|
||||
}
|
||||
func setAnimationDuration(id: Int, value: Int) {
|
||||
(self.getAnimation(id)).setValue(value, forKey: AnimDuration)
|
||||
}
|
||||
|
||||
func getAnimationSpeed(id: Int) -> (Int) {
|
||||
let value = (self.getAnimation(id)).objectForKey(AnimSpeed) as! Int
|
||||
return value
|
||||
}
|
||||
func setAnimationSpeed(id: Int, value: Int) {
|
||||
(self.getAnimation(id)).setValue(value, forKey: AnimSpeed)
|
||||
}
|
||||
|
||||
func getAnimationFrameCount() -> (Int) {
|
||||
return self.getAnimationFrameCount(_animationSelected)
|
||||
}
|
||||
func getAnimationFrameCount(id: Int) -> (Int) {
|
||||
let myFrames: NSMutableData = (self.getAnimation(id)).objectForKey(AnimFrames) as! NSMutableData
|
||||
return (myFrames.length / 64)
|
||||
//let value = (self.getAnimation(id)).objectForKey("AnimFrames") as Int
|
||||
//return value
|
||||
}
|
||||
func getAnimationFrameID() -> Int {
|
||||
return _displayedFrame
|
||||
}
|
||||
func setAnimationFrameID(id: Int) {
|
||||
_displayedFrame = id
|
||||
}
|
||||
|
||||
func setSelectedAnimationID(id: Int) {
|
||||
if id >= 0 {
|
||||
_animationSelected = id
|
||||
_displayedFrame = 1
|
||||
}
|
||||
}
|
||||
func getSelectedAnimationID() -> (Int) {
|
||||
return _animationSelected
|
||||
}
|
||||
func deleteSelected() {
|
||||
_animationArray.removeAtIndex(_animationSelected)
|
||||
if ( _animationSelected == 0 && _animationArray.count == 0 ) { // last Frame
|
||||
self.addAnimation()
|
||||
}
|
||||
}
|
||||
func moveUpSelected() {
|
||||
if ( _animationSelected > 0 ) {
|
||||
_animationArray.insert(_animationArray[_animationSelected], atIndex: _animationSelected-1)
|
||||
_animationArray.removeAtIndex(_animationSelected+1)
|
||||
}
|
||||
}
|
||||
func moveDownSelected() {
|
||||
if (_animationSelected < _animationArray.count - 1) {
|
||||
_animationArray.insert(_animationArray[_animationSelected+1], atIndex: _animationSelected)
|
||||
_animationArray.removeAtIndex(_animationSelected+2)
|
||||
}
|
||||
}
|
||||
|
||||
func addAnimation() {
|
||||
_animationArray.append(self.newAnimation())
|
||||
println("append Animation count: \(_animationArray.count)")
|
||||
}
|
||||
func newAnimation() -> (NSMutableDictionary) {
|
||||
println("create new animation")
|
||||
return [AnimName: "Animation1", AnimKey: "1=anim1", AnimDuration: 10, AnimSpeed: 500, AnimFrames: self.newFrame()]
|
||||
}
|
||||
func newFrame() -> (NSMutableData) {
|
||||
println("create new frame")
|
||||
return NSMutableData(bytes: _emptyFrame, length: 64)
|
||||
}
|
||||
func addFrame() {
|
||||
let myData: NSMutableData = (self.getAnimation(_animationSelected)).objectForKey(AnimFrames) as! NSMutableData
|
||||
myData.appendBytes(_emptyFrame, length: 64)
|
||||
}
|
||||
func removeFrame() {
|
||||
if self.getAnimationFrameCount() > 1 {
|
||||
let myData: NSMutableData = (self.getAnimation(_animationSelected)).objectForKey(AnimFrames) as! NSMutableData
|
||||
let myLength = myData.length
|
||||
myData.length = myLength - 64 // remove one frame
|
||||
}
|
||||
}
|
||||
|
||||
func animationSpeedInt() -> Int {
|
||||
let frameSpeed: Int = (self.getAnimation(_animationSelected)).objectForKey(AnimSpeed) as! Int
|
||||
return frameSpeed
|
||||
}
|
||||
func animationSpeedFloat() -> NSTimeInterval {
|
||||
let frameSpeed: Int = (self.getAnimation(_animationSelected)).objectForKey(AnimSpeed) as! Int
|
||||
let mySpeed: NSTimeInterval = NSTimeInterval(Float(frameSpeed)/1000)
|
||||
return mySpeed
|
||||
}
|
||||
func increaseSpeed() {
|
||||
let frameSpeed: Int = (self.getAnimation(_animationSelected)).objectForKey(AnimSpeed) as! Int
|
||||
if frameSpeed < maxFrameSpeed {
|
||||
(self.getAnimation(_animationSelected)).setValue(frameSpeed+frameSpeedStep, forKey: AnimSpeed)
|
||||
}
|
||||
}
|
||||
func decreaseSpeed() {
|
||||
let frameSpeed: Int = (self.getAnimation(_animationSelected)).objectForKey(AnimSpeed) as! Int
|
||||
if frameSpeed > minFrameSpeed {
|
||||
(self.getAnimation(_animationSelected)).setValue(frameSpeed-frameSpeedStep, forKey: AnimSpeed)
|
||||
}
|
||||
}
|
||||
|
||||
func gotoLastFrame() {
|
||||
self.setAnimationFrameID(self.getAnimationFrameCount())
|
||||
}
|
||||
func gotoFirstFrame() {
|
||||
self.setAnimationFrameID(1)
|
||||
}
|
||||
func gotoNextFrame() {
|
||||
if self.getAnimationFrameID() < self.getAnimationFrameCount() {
|
||||
self.setAnimationFrameID(self.getAnimationFrameID()+1)
|
||||
}
|
||||
}
|
||||
func gotoPrevFrame() {
|
||||
if self.getAnimationFrameID() > 1 {
|
||||
self.setAnimationFrameID(self.getAnimationFrameID()-1)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func getMinSendDelay() -> (NSTimeInterval) {
|
||||
return _minSendDelay
|
||||
}
|
||||
|
||||
func getAnimDataSelected() -> (UnsafePointer<UInt8>) {
|
||||
let myData: NSMutableData = (self.getAnimation(_animationSelected)).objectForKey(AnimFrames) as! NSMutableData
|
||||
let byteArray = UnsafePointer<UInt8>(myData.bytes)
|
||||
return byteArray
|
||||
}
|
||||
|
||||
func getAnimData(id: Int) -> (UnsafePointer<UInt8>) {
|
||||
let myData: NSMutableData = (self.getAnimation(id)).objectForKey(AnimFrames) as! NSMutableData
|
||||
let byteArray = UnsafePointer<UInt8>(myData.bytes)
|
||||
return byteArray
|
||||
}
|
||||
|
||||
func getAnimDataLength(id: Int) -> Int {
|
||||
let myFrames: NSMutableData = (self.getAnimation(id)).objectForKey(AnimFrames) as! NSMutableData
|
||||
return myFrames.length
|
||||
}
|
||||
|
||||
func setLEDColor(color: UInt8, led: Int) {
|
||||
//println("Led pressed: \(led)")
|
||||
var myByte: [UInt8] = [color]
|
||||
let myData: NSMutableData = (self.getAnimation(_animationSelected)).objectForKey(AnimFrames) as! NSMutableData
|
||||
let bytePosition = NSMakeRange(((self.getAnimationFrameID()-1)*64)+led, 1)
|
||||
myData.replaceBytesInRange(bytePosition, withBytes: myByte)
|
||||
|
||||
// Send updated frame
|
||||
self.sendFrame()
|
||||
}
|
||||
|
||||
func getLEDColor(pos: Int) -> (UInt8) {
|
||||
let myData = self.getAnimDataSelected()
|
||||
return myData[pos]
|
||||
}
|
||||
|
||||
func clearLEDColor() {
|
||||
//var myByte: [UInt8] = [255]
|
||||
let myData: NSMutableData = (self.getAnimation(_animationSelected)).objectForKey(AnimFrames) as! NSMutableData
|
||||
myData.replaceBytesInRange(NSMakeRange((self.getAnimationFrameID()-1)*64, 64), withBytes: _emptyFrame)
|
||||
}
|
||||
|
||||
func copyDisplayedFrame() {
|
||||
let myData = self.getAnimDataSelected()
|
||||
var animFrameCount = (self.getAnimationFrameID()-1)*64
|
||||
for ( var i = 0 ; i < 64 ; ++i ) {
|
||||
_copyFrameBuffer[i] = myData[animFrameCount]
|
||||
++animFrameCount
|
||||
}
|
||||
}
|
||||
func pasteDisplayedFrame() {
|
||||
let myData: NSMutableData = (self.getAnimation(_animationSelected)).objectForKey(AnimFrames) as! NSMutableData
|
||||
myData.replaceBytesInRange(NSMakeRange((self.getAnimationFrameID()-1)*64, 64), withBytes: _copyFrameBuffer)
|
||||
}
|
||||
}
|
||||
@@ -1,241 +0,0 @@
|
||||
//
|
||||
// ProjectController.swift
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 02.04.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
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]();
|
||||
//var _selectedAnimation: Int = 0;
|
||||
|
||||
var __tableView: NSTableView = NSTableView()
|
||||
|
||||
class AnimationsController: NSObject, NSTableViewDataSource, NSTableViewDelegate {
|
||||
|
||||
@IBOutlet weak var myTableView: NSTableView!
|
||||
|
||||
override func awakeFromNib() {
|
||||
super.awakeFromNib()
|
||||
__tableView = myTableView
|
||||
}
|
||||
|
||||
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
|
||||
let numberOfRows:Int = __animations.count() // _animationArray.count
|
||||
return numberOfRows
|
||||
}
|
||||
|
||||
func tableView(tableView: NSTableView, objectValueForTableColumn tableColumn: NSTableColumn?, row: Int) -> AnyObject? {
|
||||
//let object: NSDictionary = __animations.getAnimation(row) //_animationArray[row] as NSDictionary
|
||||
//println(object)
|
||||
let column: String = tableColumn?.identifier as String!
|
||||
if column == "AnimName" {
|
||||
return __animations.getAnimationName(row)
|
||||
//let value = object.objectForKey(column) as String
|
||||
//return value
|
||||
}
|
||||
if column == "AnimKey" {
|
||||
return __animations.getAnimationKey(row)
|
||||
//let value = object.objectForKey(column) as String
|
||||
//return value
|
||||
}
|
||||
if column == "AnimDur" {
|
||||
return __animations.getAnimationDuration(row)
|
||||
//let value = object.objectForKey(column) as Int
|
||||
//return value
|
||||
}
|
||||
if column == "AnimSpeed" {
|
||||
return __animations.getAnimationSpeed(row)
|
||||
//let value = object.objectForKey(column) as Int
|
||||
//return value
|
||||
}
|
||||
if column == "AnimFrames" {
|
||||
return __animations.getAnimationFrameCount(row)
|
||||
//let value = object.objectForKey(column) as Int
|
||||
//return value
|
||||
}
|
||||
|
||||
return column
|
||||
}
|
||||
|
||||
|
||||
func tableViewSelectionDidChange(notification: NSNotification) {
|
||||
let view: NSTableView = notification.object as! NSTableView
|
||||
__animations.setSelectedAnimationID(view.selectedRow)
|
||||
|
||||
_gameView.resetView()
|
||||
//let myCubeController: GameViewController = _animationsWindow.contentViewController as! GameViewController
|
||||
//let myCubeView: GameView = myCubeController.view as! GameView
|
||||
//myCubeView.resetView()
|
||||
|
||||
//_selectedAnimation = view.selectedRow
|
||||
|
||||
//println("klicked \(view.selectedRow)")
|
||||
}
|
||||
|
||||
func tableView(tableView: NSTableView, setObjectValue object: AnyObject?, forTableColumn tableColumn: NSTableColumn?, row: Int) {
|
||||
let column: String = tableColumn?.identifier as String!
|
||||
//println("Object: \(object) Key: \((tableColumn?.identifier)!)" )
|
||||
|
||||
let value = object! as! NSString
|
||||
if column == "AnimName" {
|
||||
__animations.setAnimationName(row, value: value as String)
|
||||
//_animationArray[row].setObject(value, forKey: (tableColumn?.identifier)!)
|
||||
}
|
||||
if column == "AnimKey" {
|
||||
__animations.setAnimationKey(row, value: value as String)
|
||||
//_animationArray[row].setObject(value, forKey: (tableColumn?.identifier)!)
|
||||
}
|
||||
if column == "AnimDur" {
|
||||
__animations.setAnimationDuration(row, value: value.integerValue)
|
||||
//_animationArray[row].setObject(value.integerValue, forKey: (tableColumn?.identifier)!)
|
||||
}
|
||||
if column == "AnimSpeed" {
|
||||
__animations.setAnimationSpeed(row, value: value.integerValue)
|
||||
//_animationArray[row].setObject(value.integerValue, forKey: (tableColumn?.identifier)!)
|
||||
}
|
||||
|
||||
_gameView.resetView()
|
||||
|
||||
//if column == "AnimFrames" {
|
||||
// _animationArray[row].setObject(value.integerValue, forKey: (tableColumn?.identifier)!)
|
||||
//}
|
||||
}
|
||||
|
||||
@IBAction func addNewAnimation(sender: AnyObject) {
|
||||
__animations.addAnimation()
|
||||
myTableView.reloadData()
|
||||
}
|
||||
|
||||
@IBAction func delNewAnimation(sender: AnyObject) {
|
||||
__animations.deleteSelected()
|
||||
myTableView.reloadData()
|
||||
}
|
||||
|
||||
@IBAction func moveUpItem(send: AnyObject) {
|
||||
if ( __animations.getSelectedAnimationID() > 0 ) {
|
||||
__animations.moveUpSelected()
|
||||
myTableView.reloadData()
|
||||
myTableView.selectRowIndexes(NSIndexSet(index: __animations.getSelectedAnimationID()-1), byExtendingSelection: false)
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func moveDownItem(send: AnyObject) {
|
||||
if (__animations.getSelectedAnimationID() < __animations.count() - 1) {
|
||||
__animations.moveDownSelected()
|
||||
myTableView.reloadData()
|
||||
myTableView.selectRowIndexes(NSIndexSet(index: __animations.getSelectedAnimationID()+1), byExtendingSelection: false)
|
||||
}
|
||||
}
|
||||
|
||||
func convertInt16(value: UInt16) -> ([UInt8]) {
|
||||
var array: [UInt8] = [0,0]
|
||||
array[0] = UInt8(value & 0x000000ff);
|
||||
array[1] = UInt8((value & 0x0000ff00) >> 8);
|
||||
return array;
|
||||
}
|
||||
|
||||
func convertInt32(value: UInt32) -> ([UInt8]) {
|
||||
var array: [UInt8] = [0,0,0,0]
|
||||
array[0] = UInt8(value & 0x000000ff);
|
||||
array[1] = UInt8((value & 0x0000ff00) >> 8);
|
||||
array[2] = UInt8((value & 0x00ff0000) >> 16);
|
||||
array[3] = UInt8((value & 0xff000000) >> 24);
|
||||
return array;
|
||||
}
|
||||
|
||||
@IBAction func exportAnimations(send: AnyObject) {
|
||||
var sendData: [UInt8] = [UInt8]()
|
||||
println("Import button pressed")
|
||||
|
||||
// for each animation
|
||||
for ( var i = 0; i < __animations.count(); ++i ) {
|
||||
// Create header line per animation
|
||||
// Syntax: ,F<key:12Byte>,<playtime:2Byte><speed:2Byte><frames:2Byte>\n
|
||||
|
||||
// Key
|
||||
sendData.append(UInt8(ascii: ","))
|
||||
sendData.append(UInt8(ascii: "F"))
|
||||
let key = __animations.getAnimationKey(i)
|
||||
let keyArray: NSData = key.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)!
|
||||
let keyBytes: UnsafePointer<UInt8> = UnsafePointer<UInt8>(keyArray.bytes)
|
||||
for (var j = 0; j < keyArray.length; ++j) {
|
||||
|
||||
if keyBytes[j] != UInt8(ascii: "\n") && keyBytes[j] != UInt8(ascii: "\r" ) { // ignore line breaks in the key
|
||||
sendData.append(UInt8(keyBytes[j]))
|
||||
}
|
||||
}
|
||||
sendData.append(UInt8(ascii: ","))
|
||||
|
||||
// Playtime
|
||||
let playTime: [UInt8] = convertInt16(UInt16(__animations.getAnimationDuration(i)))
|
||||
sendData.append(playTime[0])
|
||||
sendData.append(playTime[1])
|
||||
|
||||
// Speed
|
||||
let playSpeed: [UInt8] = convertInt16(UInt16(__animations.getAnimationSpeed(i)))
|
||||
sendData.append(playSpeed[0])
|
||||
sendData.append(playSpeed[1])
|
||||
|
||||
// Frames
|
||||
let playFrames: [UInt8] = convertInt16(UInt16(__animations.getAnimationFrameCount(i)))
|
||||
sendData.append(playFrames[0])
|
||||
sendData.append(playFrames[1])
|
||||
|
||||
// End line
|
||||
sendData.append(UInt8(ascii: "\n"))
|
||||
|
||||
// Append frame, separated by new-Line
|
||||
let animData = __animations.getAnimData(i)
|
||||
for ( var count = 1; count <= __animations.getAnimDataLength(i); ++count) {
|
||||
sendData.append(animData[count-1])
|
||||
// End line for each frame
|
||||
if ( (count % 64) == 0 ) {
|
||||
sendData.append(UInt8(ascii: "\n"))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Calculate overall data to send
|
||||
|
||||
|
||||
// Send data
|
||||
CubeNetworkObj.sendBytes(sendData , count: UInt32(sendData.count))
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@IBAction func closeButtonClicked(sender: AnyObject ) {
|
||||
animationsWindow.close()
|
||||
}
|
||||
*/
|
||||
}
|
||||
@@ -1,178 +0,0 @@
|
||||
//
|
||||
// AppDelegate.swift
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 27.03.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
import Cocoa
|
||||
|
||||
var _animationsWindow: NSWindow = NSWindow()
|
||||
var _cubeWindow: NSWindow = NSWindow()
|
||||
var _prefWindow: NSWindow = NSWindow()
|
||||
var __animations: Animations = Animations()
|
||||
var __prefData: Preferences = Preferences()
|
||||
|
||||
@NSApplicationMain
|
||||
class AppDelegate: NSObject, NSApplicationDelegate, NSTextFieldDelegate {
|
||||
|
||||
@IBOutlet weak var window: NSWindow!
|
||||
@IBOutlet weak var animationsWindow: NSWindow!
|
||||
@IBOutlet weak var preferencesWindow: NSWindow!
|
||||
@IBOutlet weak var myMenu: NSMenu!
|
||||
|
||||
@IBOutlet weak var levelInd: NSProgressIndicator!
|
||||
@IBOutlet weak var ipAddr: NSTextField!
|
||||
@IBOutlet weak var port: NSTextField!
|
||||
@IBOutlet weak var waitAnim: NSProgressIndicator!
|
||||
|
||||
func applicationDidFinishLaunching(aNotification: NSNotification) {
|
||||
// Insert code here to initialize your application
|
||||
_animationsWindow = animationsWindow
|
||||
_cubeWindow = window
|
||||
_prefWindow = preferencesWindow
|
||||
//__animations.initialize()
|
||||
|
||||
port.stringValue = String(__prefData.portNR())
|
||||
ipAddr.stringValue = __prefData.ipAddr()
|
||||
if CubeNetworkObj.connected() {
|
||||
showConnActive(true)
|
||||
}else{
|
||||
showConnActive(false)
|
||||
}
|
||||
}
|
||||
|
||||
func applicationShouldTerminate(sender: NSApplication) -> NSApplicationTerminateReply {
|
||||
CubeNetworkObj.closeConnection()
|
||||
return NSApplicationTerminateReply.TerminateNow
|
||||
}
|
||||
|
||||
@IBAction func saveDocument(sender: AnyObject) {
|
||||
let mySavePanel: NSSavePanel = NSSavePanel()
|
||||
mySavePanel.allowedFileTypes = ["plist"]
|
||||
mySavePanel.beginWithCompletionHandler { (result: Int) -> Void in
|
||||
if result == NSFileHandlingPanelOKButton {
|
||||
let exportedFileURL = mySavePanel.URL
|
||||
// Save the data. What you do depends on your app.
|
||||
let myAnimArray: NSMutableArray = NSMutableArray()
|
||||
myAnimArray.addObjectsFromArray(__animations.getAnimations())
|
||||
myAnimArray.writeToURL(exportedFileURL!, atomically: true)
|
||||
//let myAnimation: NSDictionary = NSDictionary(dictionary: __animations.getAnimations())
|
||||
|
||||
|
||||
// Don't just paste this code in your app as your app
|
||||
// probably doesn't have a createPDF() method. self.createPDF(exportedFileURL)
|
||||
}
|
||||
} // End block
|
||||
println("save pressed")
|
||||
}
|
||||
|
||||
@IBAction func openDocument(sender: AnyObject) {
|
||||
let myOpenPanel: NSOpenPanel = NSOpenPanel()
|
||||
myOpenPanel.allowedFileTypes = ["plist"]
|
||||
myOpenPanel.beginWithCompletionHandler { (result: Int) -> Void in
|
||||
if result == NSFileHandlingPanelOKButton {
|
||||
let importedFileURL = myOpenPanel.URL
|
||||
//let myAnimationsDict: NSMutableDictionary = NSMutableDictionary(contentsOfURL: importedFileURL!)!
|
||||
let myAnimArray: NSMutableArray = NSMutableArray(contentsOfURL: importedFileURL!)!
|
||||
__animations.loadAnimations(myAnimArray)
|
||||
}
|
||||
} // End block
|
||||
}
|
||||
|
||||
@IBAction func openPreferences(send: AnyObject) {
|
||||
preferencesWindow.setIsVisible(true)
|
||||
}
|
||||
|
||||
@IBAction func testIPConnection(send: AnyObject) {
|
||||
//println("TestIP Button clicked")
|
||||
|
||||
if CubeNetworkObj.connected() {
|
||||
CubeNetworkObj.closeConnection()
|
||||
}
|
||||
if CubeNetworkObj.openConnection(__prefData.ipAddr(), port: UInt32(__prefData.portNR())) {
|
||||
showConnActive(true)
|
||||
}else{
|
||||
showConnActive(false)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func showConnActive(active: Bool) {
|
||||
if active {
|
||||
levelInd.doubleValue = 100.0
|
||||
}else{
|
||||
levelInd.doubleValue = 0.0
|
||||
}
|
||||
}
|
||||
|
||||
func validIPAddress(ipaddr: String) -> Bool {
|
||||
var valid: Bool = false
|
||||
let validIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
|
||||
if ipaddr != "" {
|
||||
if (ipaddr.rangeOfString(validIpAddressRegex, options: .RegularExpressionSearch) != nil) {
|
||||
valid = true;
|
||||
}
|
||||
}
|
||||
return valid
|
||||
}
|
||||
|
||||
func validPortNr(portNr: Int) -> Bool {
|
||||
var valid: Bool = false
|
||||
if portNr < 65536 && portNr > 0 {
|
||||
valid = true
|
||||
}
|
||||
return valid
|
||||
//^(6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)$
|
||||
}
|
||||
|
||||
override func controlTextDidChange(obj: NSNotification) {
|
||||
let myField: NSTextField = obj.object as! NSTextField
|
||||
if myField.identifier == "IPADDR_FIELD" {
|
||||
if validIPAddress(myField.stringValue) {
|
||||
__prefData.setIPAddr(myField.stringValue)
|
||||
println("Changing ip address field")
|
||||
}
|
||||
}
|
||||
if myField.identifier == "PORTNR_FIELD" {
|
||||
if validPortNr(myField.integerValue) {
|
||||
__prefData.setPortNr(myField.integerValue)
|
||||
println("Changing port number")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func cmdCopyPressed(send: AnyObject) {
|
||||
__animations.copyDisplayedFrame()
|
||||
}
|
||||
|
||||
@IBAction func cmdPastePressed(send: AnyObject) {
|
||||
__animations.pasteDisplayedFrame()
|
||||
_gameView.updateLEDFrame()
|
||||
// Send updated frame
|
||||
__animations.sendFrame()
|
||||
}
|
||||
|
||||
@IBAction func clearLEDs(send: AnyObject) {
|
||||
// Remove from Memory
|
||||
__animations.clearLEDColor()
|
||||
// Update visual
|
||||
_gameView.updateLEDFrame()
|
||||
// Update on a hardware
|
||||
__animations.sendFrame()
|
||||
}
|
||||
|
||||
}
|
||||
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,5 +0,0 @@
|
||||
//
|
||||
// Use this file to import your target's public headers that you would like to expose to Swift.
|
||||
//
|
||||
|
||||
#import "ObjCtoCPlusPlus.h"
|
||||
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,368 +0,0 @@
|
||||
//
|
||||
// CubeNetwork.cpp
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 28.03.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
#include "CubeNetwork.h"
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif // win32
|
||||
|
||||
using Poco::Net::DialogSocket;
|
||||
using Poco::Net::SocketAddress;
|
||||
using Poco::Exception;
|
||||
|
||||
unsigned char buffer3D[64];
|
||||
unsigned char receiveBuffer[32];
|
||||
int bytesReceived;
|
||||
int i,x;
|
||||
unsigned char color;
|
||||
DialogSocket ds;
|
||||
int frameChange = 0;
|
||||
int streamMode = 0; // 0 = off, 1 = frameStream, 2 = writeStream
|
||||
|
||||
void sleepcp(int milliseconds) // cross-platform sleep function
|
||||
{
|
||||
#ifdef WIN32
|
||||
Sleep(milliseconds);
|
||||
#else
|
||||
usleep(milliseconds * 1000);
|
||||
#endif // win32
|
||||
}
|
||||
|
||||
bool frame1[3][64] = { {1,0,0,1,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
1,0,0,1},
|
||||
{0,0,0,0,
|
||||
0,0,0,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0,
|
||||
0,0,0,0},
|
||||
{0,0,0,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
1,0,0,1,
|
||||
1,0,0,1,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0, //0,1,1,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
0,0,0,0,
|
||||
1,0,0,1,
|
||||
0,0,0,0}};
|
||||
|
||||
bool connectionEstablished = false;
|
||||
|
||||
void byte2uint32(unsigned char* bytes, u_int32_t msgLength) {
|
||||
unsigned char *vp = (unsigned char *)&msgLength;
|
||||
bytes[0] = vp[0]; // int32 to byte array conversion
|
||||
bytes[1] = vp[1];
|
||||
bytes[2] = vp[2];
|
||||
bytes[3] = vp[3];
|
||||
}
|
||||
|
||||
void msgCloseFrameStream() {
|
||||
try {
|
||||
buffer3D[0] = 's';
|
||||
buffer3D[1] = 'S';
|
||||
ds.sendBytes(buffer3D, 2); // End the stream mode
|
||||
}catch (const Poco::Net::NetException & e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void msgOpenFrameStream() {
|
||||
try {
|
||||
buffer3D[0] = 'G';
|
||||
buffer3D[1] = 'E';
|
||||
buffer3D[2] = 'T';
|
||||
buffer3D[3] = ' ';
|
||||
buffer3D[4] = '/';
|
||||
buffer3D[5] = '?';
|
||||
buffer3D[6] = 'S';
|
||||
buffer3D[7] = 's';
|
||||
buffer3D[8] = ' ';
|
||||
ds.sendBytes(buffer3D, 9);
|
||||
}catch (const Poco::Net::NetException & e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void msgStartWrite(u_int32_t msgLength) {
|
||||
unsigned char myBuffer[4];
|
||||
byte2uint32(myBuffer, msgLength);
|
||||
try{
|
||||
buffer3D[0] = 'G';
|
||||
buffer3D[1] = 'E';
|
||||
buffer3D[2] = 'T';
|
||||
buffer3D[3] = ' ';
|
||||
buffer3D[4] = '/';
|
||||
buffer3D[5] = '?';
|
||||
buffer3D[6] = 'W';
|
||||
buffer3D[7] = 'w';
|
||||
buffer3D[8] = myBuffer[0]; // int32 to byte array conversion
|
||||
buffer3D[9] = myBuffer[1];
|
||||
buffer3D[10] = myBuffer[2];
|
||||
buffer3D[11] = myBuffer[3];
|
||||
buffer3D[12] = ' ';
|
||||
|
||||
printf("sending Length:\n");
|
||||
printf("0: %u\n", myBuffer[0]);
|
||||
printf("1: %u\n", myBuffer[1]);
|
||||
printf("2: %u\n", myBuffer[2]);
|
||||
printf("3: %u\n", myBuffer[3]);
|
||||
|
||||
ds.sendBytes(buffer3D, 13);
|
||||
}catch (const Poco::Net::NetException & e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void testFrame() {
|
||||
// for (color=128;color<130;color++) {
|
||||
// Create testframe
|
||||
for (x=0;x<64;x++) {
|
||||
buffer3D[x] = color; // Red frame
|
||||
}
|
||||
if ( color > 128 ) {
|
||||
buffer3D[0]=255;
|
||||
buffer3D[3]=255;
|
||||
buffer3D[12]=255;
|
||||
buffer3D[15]=255;
|
||||
|
||||
buffer3D[48]=255;
|
||||
buffer3D[51]=255;
|
||||
buffer3D[60]=255;
|
||||
buffer3D[63]=255;
|
||||
}else{
|
||||
buffer3D[0]=254;
|
||||
buffer3D[3]=254;
|
||||
buffer3D[12]=254;
|
||||
buffer3D[15]=254;
|
||||
|
||||
buffer3D[48]=254;
|
||||
buffer3D[51]=254;
|
||||
buffer3D[60]=254;
|
||||
buffer3D[63]=254;
|
||||
}
|
||||
ds.sendBytes(buffer3D, 64);
|
||||
// sleepcp(50); // 20 FPS
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
||||
void testStream2() {
|
||||
int frameChange = 0;
|
||||
while (true) {
|
||||
unsigned char color = rand() % 254;
|
||||
for (i=0;i<64;i++) {
|
||||
if ( frame1[frameChange][i] == 1 ) {
|
||||
buffer3D[i] = color; // Rot
|
||||
}else{
|
||||
buffer3D[i] = 255; // Aus
|
||||
}
|
||||
}
|
||||
ds.sendBytes(buffer3D, 64);
|
||||
sleepcp(1000); // 20 FPS
|
||||
if ( frameChange < 2 ) {
|
||||
frameChange++;
|
||||
}else{
|
||||
frameChange=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void CubeNetwork::updateFrame() {
|
||||
unsigned char color = rand() % 254;
|
||||
for (i=0;i<64;i++) {
|
||||
if ( frame1[frameChange][i] == 1 ) {
|
||||
buffer3D[i] = color; // Rot
|
||||
}else{
|
||||
buffer3D[i] = 255; // Aus
|
||||
}
|
||||
}
|
||||
ds.sendBytes(buffer3D, 64);
|
||||
if ( frameChange < 2 ) {
|
||||
frameChange++;
|
||||
}else{
|
||||
frameChange=0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void CubeNetwork::sendBytes(const unsigned char* byteBuffer, unsigned int byteLength) {
|
||||
printf("sendBytes called\n");
|
||||
if ( connectionEstablished) {
|
||||
if ( streamMode == 1 ) {
|
||||
// End the frameStreammode first
|
||||
msgCloseFrameStream();
|
||||
streamMode = 2;
|
||||
}
|
||||
if ( byteBuffer != NULL ) {
|
||||
try {
|
||||
printf("Open connection for writing\n");
|
||||
//ds.connect(SocketAddress("192.168.1.79", 8081));
|
||||
// let arduino knows what to expect
|
||||
msgStartWrite(byteLength);
|
||||
unsigned char myBuffer[4];
|
||||
int ret = ds.receiveRawBytes(myBuffer, 4);
|
||||
printf("received Length:\n");
|
||||
printf("0: %u\n", myBuffer[0]);
|
||||
printf("1: %u\n", myBuffer[1]);
|
||||
printf("2: %u\n", myBuffer[2]);
|
||||
printf("3: %u\n", myBuffer[3]);
|
||||
printf("ret: %u\n", ret);
|
||||
|
||||
// send bytes to write
|
||||
ds.sendBytes(byteBuffer, byteLength);
|
||||
//ds.close();
|
||||
// Reset to the frameStream mode
|
||||
if ( streamMode == 2 ) {
|
||||
msgOpenFrameStream();
|
||||
streamMode = 1;
|
||||
}
|
||||
}catch (const Poco::Net::NetException & e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CubeNetwork::updateFrame(const unsigned char * frameSequence, unsigned int frameCount) {
|
||||
if (connectionEstablished) {
|
||||
// check for empty pointer
|
||||
if ( frameSequence != NULL ) {
|
||||
//for (startFrame = 0; startFrame<lastByte;startFrame++) {
|
||||
for (i=0;i<64;i++) {
|
||||
// Fill buffer
|
||||
buffer3D[i] = frameSequence[i+((frameCount-1)*64)];
|
||||
}
|
||||
// Send the frame
|
||||
ds.sendBytes(buffer3D, 64);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool CubeNetwork::openConnection(const char* ipAddr, unsigned int port) {
|
||||
connectionEstablished = false;
|
||||
printf("Try to open the connection\n");
|
||||
std::string ipAddr_str(reinterpret_cast<const char*>(ipAddr));
|
||||
Poco::UInt16 portNr = port;
|
||||
try {
|
||||
ds.connect(SocketAddress(ipAddr_str, portNr), Poco::Timespan(10, 0));
|
||||
|
||||
msgOpenFrameStream();
|
||||
streamMode = 1;
|
||||
connectionEstablished = true;
|
||||
}catch (Poco::Net::NetException & e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
ds.close();
|
||||
}catch (Poco::TimeoutException & e) {
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
ds.close();
|
||||
}catch (Exception e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
ds.close();
|
||||
}
|
||||
return connectionEstablished;
|
||||
}
|
||||
|
||||
void CubeNetwork::closeConnection() {
|
||||
try {
|
||||
connectionEstablished = false;
|
||||
msgCloseFrameStream();
|
||||
ds.close();
|
||||
}catch (const Poco::Net::NetException & e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
}
|
||||
streamMode = 0;
|
||||
}
|
||||
|
||||
bool CubeNetwork::connected() {
|
||||
return connectionEstablished;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
void CubeNetwork::initObjects() {
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
try {
|
||||
ds.connect(SocketAddress("192.168.1.79", 8081));
|
||||
|
||||
fillBufferWithMsgStartStream();
|
||||
ds.sendBytes(buffer3D, 9);
|
||||
|
||||
|
||||
//testStream2();
|
||||
testFrame();
|
||||
|
||||
msgCloseFrameStream();
|
||||
|
||||
}catch (const Poco::Net::NetException & e){
|
||||
std::cerr << e.displayText() << std::endl;
|
||||
}
|
||||
|
||||
|
||||
//std::cout << "It works" << std::endl;
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
//void Performance_CPlusPlus::sortArray(unsigned int num_elements)
|
||||
@@ -1,46 +0,0 @@
|
||||
//
|
||||
// CubeNetwork.h
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 28.03.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
#ifndef __Cube4Fun__CubeNetwork__
|
||||
#define __Cube4Fun__CubeNetwork__
|
||||
|
||||
#include <iostream>
|
||||
#include "Poco/Foundation.h"
|
||||
#include "Poco/Net/SocketAddress.h"
|
||||
#include "Poco/Net/DialogSocket.h"
|
||||
#include "Poco/Net/NetException.h"
|
||||
#include "Poco/Exception.h"
|
||||
#include <stdlib.h> /* srand, rand */
|
||||
#include <time.h> /* time */
|
||||
#include <chrono>
|
||||
|
||||
class CubeNetwork
|
||||
{
|
||||
public:
|
||||
static bool connected();
|
||||
//static void initObjects();
|
||||
static void updateFrame(const unsigned char * frameSequence = NULL, unsigned int frameCount = 0);
|
||||
static void sendBytes(const unsigned char* byteBuffer = NULL, u_int32_t byteLength=0);
|
||||
static bool openConnection(const char* ipAddr, unsigned int port);
|
||||
//static void openConnection();
|
||||
static void closeConnection();
|
||||
};
|
||||
|
||||
#endif /* defined(__Cube4Fun__CubeNetwork__) */
|
||||
@@ -1,621 +0,0 @@
|
||||
//
|
||||
// GameView.swift
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 27.03.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
import SceneKit
|
||||
|
||||
var lastMousePos: NSPoint = NSPoint()
|
||||
var startAngle: CGFloat = CGFloat()
|
||||
var klickedColor: UInt8 = UInt8(1)
|
||||
let relativeBarPosition: CGFloat = 500.0
|
||||
|
||||
|
||||
class GameView: SCNView {
|
||||
|
||||
var playTimer: NSTimer = NSTimer()
|
||||
|
||||
func scheduleTimer() {
|
||||
playTimer = NSTimer.scheduledTimerWithTimeInterval(__animations.animationSpeedFloat(), target: __animations, selector: Selector("sendFrame"), userInfo: nil, repeats: true)
|
||||
}
|
||||
func resetTimer() {
|
||||
playTimer.invalidate()
|
||||
}
|
||||
func rescheduleTimer() {
|
||||
resetTimer();
|
||||
scheduleTimer();
|
||||
}
|
||||
|
||||
func resetView() {
|
||||
println("Reset view")
|
||||
// goto first frame
|
||||
self.firstButtonPressed()
|
||||
|
||||
// Update speed
|
||||
self.updateSpeedText()
|
||||
|
||||
// Send updated frame
|
||||
__animations.sendFrame()
|
||||
}
|
||||
|
||||
func updateButtonVisibility() {
|
||||
// init
|
||||
var nextFrame = false;
|
||||
var lastFrame = false;
|
||||
var prevFrame = false;
|
||||
var firstFrame = false;
|
||||
var delFrame = false;
|
||||
|
||||
// first Frame, only one Frame
|
||||
// -> no button visible
|
||||
if __animations.getAnimationFrameID() == 1 && __animations.getAnimationFrameCount() == 1 {
|
||||
nextFrame = false;
|
||||
lastFrame = false;
|
||||
prevFrame = false;
|
||||
firstFrame = false;
|
||||
delFrame = false;
|
||||
}
|
||||
|
||||
// first Frame, second exists.
|
||||
if __animations.getAnimationFrameID() == 1 && __animations.getAnimationFrameCount() > 1 {
|
||||
// Visible:
|
||||
nextFrame = true;
|
||||
lastFrame = true;
|
||||
delFrame = true;
|
||||
// Invisible:
|
||||
prevFrame = false;
|
||||
firstFrame = false;
|
||||
}
|
||||
|
||||
// previous Frame exists, no more Frames
|
||||
if __animations.getAnimationFrameID() > 1 && __animations.getAnimationFrameID() == __animations.getAnimationFrameCount() {
|
||||
// Visible:
|
||||
prevFrame = true;
|
||||
firstFrame = true;
|
||||
delFrame = true;
|
||||
// Invisible
|
||||
nextFrame = false;
|
||||
lastFrame = false;
|
||||
}
|
||||
|
||||
// previous Frame exists and next Frame exists {
|
||||
if __animations.getAnimationFrameID() > 1 && __animations.getAnimationFrameID() < __animations.getAnimationFrameCount() {
|
||||
// Visible:
|
||||
prevFrame = true;
|
||||
firstFrame = true;
|
||||
delFrame = true;
|
||||
nextFrame = true;
|
||||
lastFrame = true;
|
||||
}
|
||||
|
||||
if let rootNode = self.scene?.rootNode {
|
||||
for childNode in rootNode.childNodes {
|
||||
let buttonNode: SCNNode = childNode as! SCNNode
|
||||
if buttonNode.name == "myNextFrameButton" {
|
||||
buttonNode.hidden = !nextFrame;
|
||||
}
|
||||
if buttonNode.name == "myPrevFrameButton" {
|
||||
buttonNode.hidden = !prevFrame
|
||||
}
|
||||
if buttonNode.name == "myStartFrameButton" {
|
||||
buttonNode.hidden = !firstFrame
|
||||
}
|
||||
if buttonNode.name == "myLastFrameButton" {
|
||||
buttonNode.hidden = !lastFrame
|
||||
}
|
||||
if buttonNode.name == "myDelFrameButton" {
|
||||
buttonNode.hidden = !delFrame
|
||||
}
|
||||
if buttonNode.name == "myFrameText" {
|
||||
let geometry:SCNText = buttonNode.geometry as! SCNText
|
||||
geometry.string = "Frame: \(__animations.getAnimationFrameID())/\(__animations.getAnimationFrameCount())"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Send updated frame
|
||||
__animations.sendFrame()
|
||||
|
||||
}
|
||||
|
||||
func updateLEDFrame() {
|
||||
// get actuall frame data
|
||||
|
||||
// let data : UnsafePointer<Byte> = UnsafePointer<Byte>(myFrames.mutableBytes)
|
||||
//let data = __animations.getAnimDataSelected()
|
||||
//NSMutableData
|
||||
if let rootNode = self.scene?.rootNode {
|
||||
if let cubeNode = rootNode.childNodeWithName("cubeNode", recursively: true) {
|
||||
for myLED in cubeNode.childNodes {
|
||||
if let name:NSString = myLED.name {
|
||||
if name != "myBox" { // LED lamps
|
||||
if let geometry: SCNGeometry = myLED.geometry {
|
||||
let ledID: Int = Int(name.integerValue)
|
||||
if let material: SCNMaterial = geometry.firstMaterial {
|
||||
var color: NSColor = NSColor()
|
||||
let colorPosition: Int = ((__animations.getAnimationFrameID()-1)*64) + ledID
|
||||
let savedColor: UInt8 = __animations.getLEDColor(colorPosition) //data[colorPosition]
|
||||
if savedColor == 255 {
|
||||
color = NSColor.grayColor()
|
||||
}else{
|
||||
let hueColor = CGFloat(savedColor) / 255.0
|
||||
color = NSColor(calibratedHue: hueColor, saturation: 1.0, brightness: 1.0, alpha: 1.0)
|
||||
}
|
||||
material.diffuse.contents = color
|
||||
//println(name)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//__animations.sendFrame()
|
||||
}
|
||||
|
||||
func plusButtonPressed() {
|
||||
// Extend the data array with one frame
|
||||
//myFrames.appendBytes(emptyFrame, length: 64)
|
||||
__animations.addFrame()
|
||||
|
||||
// Add frame
|
||||
//myMaxFrameCount++;
|
||||
|
||||
// Goto new frame
|
||||
//myFrameCount = __animations.getAnimationFrameCount();
|
||||
__animations.gotoLastFrame()
|
||||
|
||||
// Update LEDs
|
||||
updateLEDFrame()
|
||||
|
||||
// Update control button visibility
|
||||
updateButtonVisibility()
|
||||
}
|
||||
|
||||
func minusButtonPressed() {
|
||||
// remove one frame from the data array
|
||||
// TODO!
|
||||
|
||||
// Remove frame
|
||||
__animations.removeFrame()
|
||||
// if __animations.getAnimationFrameCount() > 1 {
|
||||
// myMaxFrameCount--;
|
||||
// }
|
||||
// if myFrameCount > 1 {
|
||||
// myFrameCount--;
|
||||
// }
|
||||
|
||||
// Update control button visibility
|
||||
updateButtonVisibility()
|
||||
}
|
||||
|
||||
func prevButtonPressed() {
|
||||
// if myFrameCount > 1 {
|
||||
// myFrameCount--
|
||||
// }
|
||||
__animations.gotoPrevFrame()
|
||||
|
||||
// Update LEDs
|
||||
updateLEDFrame()
|
||||
|
||||
// Update control button visibility
|
||||
updateButtonVisibility()
|
||||
}
|
||||
|
||||
func nextButtonPressed() {
|
||||
// if myFrameCount < myMaxFrameCount {
|
||||
// myFrameCount++
|
||||
// }
|
||||
__animations.gotoNextFrame()
|
||||
|
||||
// Update LEDs
|
||||
updateLEDFrame()
|
||||
|
||||
// Update control button visibility
|
||||
updateButtonVisibility()
|
||||
}
|
||||
|
||||
func firstButtonPressed() {
|
||||
//myFrameCount = 1;
|
||||
__animations.gotoFirstFrame()
|
||||
|
||||
// Update LEDs
|
||||
updateLEDFrame()
|
||||
|
||||
// Update control button visibility
|
||||
updateButtonVisibility()
|
||||
}
|
||||
|
||||
func lastButtonPressed() {
|
||||
__animations.gotoLastFrame()
|
||||
|
||||
// Update LEDs
|
||||
updateLEDFrame()
|
||||
|
||||
// Update control button visibility
|
||||
updateButtonVisibility()
|
||||
}
|
||||
|
||||
func plusSpeedButtonPressed() {
|
||||
__animations.increaseSpeed()
|
||||
// if ( _playSendDelay <= 3 ) { // 3 seconds slowest fps
|
||||
// _playSendDelay = _playSendDelay + 0.1
|
||||
updateSpeedText()
|
||||
// }
|
||||
rescheduleTimer()
|
||||
}
|
||||
|
||||
func minusSpeedButtonPressed() {
|
||||
//println(_playSendDelay)
|
||||
__animations.decreaseSpeed()
|
||||
// if ( _playSendDelay > 0.2 ) { // 100ms fastest fps
|
||||
// _playSendDelay = _playSendDelay - 0.1
|
||||
updateSpeedText()
|
||||
// }
|
||||
rescheduleTimer()
|
||||
}
|
||||
|
||||
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: \(__animations.animationSpeedInt()) ms"
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
func playButtonPressed() {
|
||||
// Change the button from Play to Pause
|
||||
let myPauseButtonNode: SCNNode = self.scene!.rootNode.childNodeWithName("myPauseButton", recursively: true)!
|
||||
let myPlayButtonNode: SCNNode = self.scene!.rootNode.childNodeWithName("myPlayButton", recursively: true)!
|
||||
myPlayButtonNode.hidden = true
|
||||
myPauseButtonNode.hidden = false
|
||||
|
||||
// Start the animation
|
||||
_playAllFrames = true
|
||||
scheduleTimer();
|
||||
}
|
||||
|
||||
func pauseButtonPressed() {
|
||||
// Change the button from Pause to Play
|
||||
let myPauseButtonNode: SCNNode = self.scene!.rootNode.childNodeWithName("myPauseButton", recursively: true)!
|
||||
let myPlayButtonNode: SCNNode = self.scene!.rootNode.childNodeWithName("myPlayButton", recursively: true)!
|
||||
myPauseButtonNode.hidden = true
|
||||
myPlayButtonNode.hidden = false
|
||||
|
||||
// Stop the animation
|
||||
_playAllFrames = false
|
||||
resetTimer()
|
||||
}
|
||||
|
||||
func openAnimationWindow() {
|
||||
_animationsWindow.setIsVisible(true)
|
||||
|
||||
}
|
||||
|
||||
override func rightMouseDown(theEvent: NSEvent) {
|
||||
let p = self.convertPoint(theEvent.locationInWindow, fromView: nil)
|
||||
if let hitResults = self.hitTest(p, options: nil) {
|
||||
// check that we clicked on at least one object
|
||||
if hitResults.count > 0 {
|
||||
// retrieved the first clicked object
|
||||
let result: AnyObject = hitResults[0]
|
||||
if let node = result.node {
|
||||
if let geom = node.geometry {
|
||||
if let name:NSString = geom.name {
|
||||
if name.integerValue >= 0 && name.integerValue < 64 { // LED lamps
|
||||
let color: NSColor = geom.firstMaterial?.diffuse.contents as! NSColor
|
||||
if color != NSColor.grayColor() {
|
||||
// Make sure we are in range of 0...255
|
||||
let ledColor = (color.hueComponent * 255) % 255
|
||||
if ( ledColor >= 0 && ledColor < 255 ) {
|
||||
klickedColor = UInt8(ledColor)
|
||||
}
|
||||
klickedColor = UInt8 (color.hueComponent * 255)
|
||||
moveArrows(Int(klickedColor))
|
||||
//println(klickedColor)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override func mouseDown(theEvent: NSEvent) {
|
||||
lastMousePos = theEvent.locationInWindow
|
||||
/* Called when a mouse click occurs */
|
||||
|
||||
var ledPressed: Int = 0;
|
||||
var ledColorOn = false;
|
||||
|
||||
// check what nodes are clicked
|
||||
let p = self.convertPoint(theEvent.locationInWindow, fromView: nil)
|
||||
if let hitResults = self.hitTest(p, options: nil) {
|
||||
// check that we clicked on at least one object
|
||||
if hitResults.count > 0 {
|
||||
// retrieved the first clicked object
|
||||
let result: AnyObject = hitResults[0]
|
||||
var anim = true
|
||||
|
||||
// get its material
|
||||
let material = result.node!.geometry!.firstMaterial!
|
||||
|
||||
if let clickedNode = result.node {
|
||||
if clickedNode.name == "myBox" {
|
||||
anim = false
|
||||
}
|
||||
if clickedNode.name == "myPlayButton" && __animations.getAnimationFrameCount() > 1 {
|
||||
playButtonPressed()
|
||||
anim = false
|
||||
}
|
||||
if clickedNode.name == "myPauseButton" {
|
||||
pauseButtonPressed()
|
||||
anim = false
|
||||
}
|
||||
if clickedNode.name == "myAddFrameButton" {
|
||||
plusButtonPressed()
|
||||
}
|
||||
if clickedNode.name == "myDelFrameButton" {
|
||||
minusButtonPressed()
|
||||
}
|
||||
if clickedNode.name == "myPrevFrameButton" {
|
||||
prevButtonPressed()
|
||||
}
|
||||
if clickedNode.name == "myNextFrameButton" {
|
||||
nextButtonPressed()
|
||||
}
|
||||
if clickedNode.name == "myStartFrameButton" {
|
||||
firstButtonPressed()
|
||||
}
|
||||
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))
|
||||
if colorInt < 0 {
|
||||
klickedColor = 0 // Minimum value
|
||||
}else{
|
||||
if colorInt > 253 {
|
||||
klickedColor = 253 // Maximum value
|
||||
}else{
|
||||
klickedColor = UInt8(colorInt)
|
||||
println(klickedColor)
|
||||
}
|
||||
}
|
||||
// Move arrows to the clicked position
|
||||
moveArrows(colorInt)
|
||||
|
||||
//println("BarX: \(barRootPositionX) ClickedX: \(theEvent.locationInWindow.x) ")
|
||||
//println("BarY: \(barRootPositionY) ClickedY: \(theEvent.locationInWindow.y) ")
|
||||
|
||||
|
||||
anim = false
|
||||
}
|
||||
}
|
||||
|
||||
// get its name
|
||||
if let node = result.node {
|
||||
if let geom = node.geometry {
|
||||
if let name:NSString = geom.name {
|
||||
let myGeometry:SCNText = self.scene!.rootNode.childNodeWithName("myDescr", recursively: true)?.geometry as! SCNText
|
||||
// Show touched led
|
||||
myGeometry.string = name
|
||||
// Check for previously color
|
||||
let prevColor = geom.firstMaterial?.diffuse.contents as! NSColor
|
||||
if prevColor != NSColor.grayColor() {
|
||||
geom.firstMaterial?.diffuse.contents = NSColor.grayColor()
|
||||
ledColorOn = false
|
||||
}else{
|
||||
let hueColor = CGFloat(klickedColor) / 255.0
|
||||
geom.firstMaterial?.diffuse.contents = NSColor(calibratedHue: hueColor, saturation: 1.0, brightness: 1.0, alpha: 1.0)
|
||||
ledColorOn = true
|
||||
}
|
||||
ledPressed = Int(name.intValue)
|
||||
|
||||
// Update the LED frame
|
||||
var myByte: UInt8
|
||||
if ledColorOn {
|
||||
myByte = klickedColor
|
||||
}else{
|
||||
myByte = 255 // Off
|
||||
}
|
||||
__animations.setLEDColor(myByte, led: ledPressed)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if let rootNode = self.scene?.rootNode {
|
||||
if let cubeNode = rootNode.childNodeWithName("cubeNode", recursively: true) {
|
||||
if let boxNode = cubeNode.childNodeWithName("myBox", recursively: true ) {
|
||||
//anim = false
|
||||
}
|
||||
}
|
||||
} */
|
||||
|
||||
|
||||
//let name:NSString = result.node!.geometry!.name!
|
||||
/*
|
||||
let myScene:SCNScene = self.scene!
|
||||
let myRootNode:SCNNode = myScene.rootNode
|
||||
let myTextNode:SCNNode = myRootNode.childNodeWithName("myDescr", recursively: false)!
|
||||
let myGeometry:SCNText = myTextNode.geometry as SCNText
|
||||
*/
|
||||
|
||||
|
||||
|
||||
//let nextNode = self.scene
|
||||
//let text = self.scene?.rootNode.childNodeWithName("myDescr", recursively: true)
|
||||
|
||||
|
||||
//println(name);
|
||||
|
||||
|
||||
if anim {
|
||||
|
||||
// highlight it
|
||||
SCNTransaction.begin()
|
||||
SCNTransaction.setAnimationDuration(0.2)
|
||||
|
||||
// on completion - unhighlight
|
||||
SCNTransaction.setCompletionBlock() {
|
||||
SCNTransaction.begin()
|
||||
SCNTransaction.setAnimationDuration(0.2)
|
||||
|
||||
material.emission.contents = NSColor.blackColor()
|
||||
|
||||
SCNTransaction.commit()
|
||||
}
|
||||
|
||||
material.emission.contents = NSColor.grayColor()
|
||||
|
||||
SCNTransaction.commit()
|
||||
|
||||
//myFrames.replaceBytesInRange(NSMakeRange(((myFrameCount-1)*64)+ledPressed, 1), withBytes: myByte)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
super.mouseDown(theEvent)
|
||||
}
|
||||
|
||||
func moveArrows(colorY: Int) {
|
||||
// Range is from y=+15 ... -1
|
||||
let myArrowsNode = self.scene!.rootNode.childNodeWithName("myArrows", recursively: true)
|
||||
let myRelativePos = 16.0 * CGFloat(colorY) / 255.0
|
||||
SCNTransaction.begin()
|
||||
SCNTransaction.setAnimationDuration(0.5)
|
||||
myArrowsNode?.position = SCNVector3(x:17, y: (16 - myRelativePos)-1, z:0.1)
|
||||
SCNTransaction.commit()
|
||||
}
|
||||
|
||||
func rotateCamera(var x: CGFloat, var y: CGFloat) {
|
||||
// Save the angle for reset
|
||||
startAngle = startAngle + y
|
||||
|
||||
// rotate
|
||||
if let node = self.scene!.rootNode.childNodeWithName("cubeNode", recursively: true) {
|
||||
node.runAction(SCNAction.rotateByX(0, y: y, z: 0, duration: 0.5))
|
||||
}
|
||||
//println(startAngle)
|
||||
}
|
||||
|
||||
override func mouseUp(theEvent: NSEvent) {
|
||||
// Reset the last location
|
||||
lastMousePos.x = 0.0
|
||||
lastMousePos.y = 0.0
|
||||
|
||||
super.mouseUp(theEvent)
|
||||
}
|
||||
|
||||
override func mouseDragged(theEvent: NSEvent) {
|
||||
let mousePos = theEvent.locationInWindow
|
||||
if lastMousePos.x > 0.0 {
|
||||
let drag = ( (lastMousePos.x - mousePos.x ) / 50 ) * -1
|
||||
rotateCamera(0.0, y: drag)
|
||||
lastMousePos = mousePos
|
||||
//println(drag)
|
||||
}
|
||||
|
||||
super.mouseDragged(theEvent)
|
||||
}
|
||||
|
||||
override func flagsChanged(theEvent: NSEvent) {
|
||||
// println(theEvent.keyCode)
|
||||
}
|
||||
|
||||
override func keyDown(theEvent: NSEvent) {
|
||||
|
||||
/*
|
||||
if theEvent.modifierFlags & .CommandKeyMask != nil {
|
||||
println("cmd pressed")
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
switch (theEvent.keyCode) {
|
||||
case 123:
|
||||
self.rotateCamera(0.0, y: -0.1)
|
||||
// Left
|
||||
break;
|
||||
case 124:
|
||||
self.rotateCamera(0.0, y: 0.1)
|
||||
//self.rotateByAngle(-1.0);
|
||||
//right
|
||||
break;
|
||||
case 15: // r - Key
|
||||
// Reset the cube position
|
||||
self.rotateCamera(0.0, y: -startAngle)
|
||||
break;
|
||||
case 17: // t - Key
|
||||
// Reset the frame color on the Cube
|
||||
//myFrames.replaceBytesInRange(NSMakeRange(myFrameCount-1, 64), withBytes: emptyFrame)
|
||||
__animations.clearLEDColor()
|
||||
|
||||
// Reset the frame color in 3D
|
||||
if let rootNode = self.scene?.rootNode {
|
||||
if let cubeNode = rootNode.childNodeWithName("cubeNode", recursively: true) {
|
||||
for myLED in cubeNode.childNodes {
|
||||
if let name:NSString = myLED.name {
|
||||
if name != "myBox" { // LED lamps
|
||||
if let geometry: SCNGeometry = myLED.geometry {
|
||||
if let material: SCNMaterial = geometry.firstMaterial {
|
||||
material.diffuse.contents = NSColor.grayColor()
|
||||
//println(name)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
super.keyDown(theEvent)
|
||||
}
|
||||
|
||||
println(theEvent.keyCode);
|
||||
|
||||
|
||||
//super.keyDown(theEvent)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,230 +0,0 @@
|
||||
//
|
||||
// GameViewController.swift
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 27.03.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
import SceneKit
|
||||
import QuartzCore
|
||||
|
||||
/*
|
||||
var myFrameCount: UInt32 = 1;
|
||||
var myMaxFrameCount: UInt32 = 1;
|
||||
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,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255,
|
||||
255,255,255,255]
|
||||
|
||||
let _minSendDelay: NSTimeInterval = 0.200 // 200 milliseconds
|
||||
let _frameSendDelay: NSTimeInterval = 0.2 // one second
|
||||
var _playSendDelay: NSTimeInterval = 0.5 // 500 milliseconds as default
|
||||
*/
|
||||
|
||||
var _previousUpdateTime: NSTimeInterval = NSTimeInterval()
|
||||
var _deltaTime: NSTimeInterval = NSTimeInterval()
|
||||
var _playAllFrames = false
|
||||
var _gameView: GameView = GameView();
|
||||
|
||||
class GameViewController: NSViewController { // SCNSceneRendererDelegate
|
||||
|
||||
@IBOutlet weak var gameView: GameView!
|
||||
|
||||
|
||||
/*
|
||||
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) {
|
||||
//sendFrame(time)
|
||||
sendFrame(NSDate.timeIntervalSinceReferenceDate())
|
||||
//println("This will be called before each frame draw")
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
self.gameView!.delegate = self
|
||||
|
||||
super.viewDidLoad()
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
//func sendFrame() {
|
||||
// sendFrame(NSDate.timeIntervalSinceReferenceDate())
|
||||
//}
|
||||
|
||||
/*
|
||||
func sendFrame(time: NSTimeInterval) {
|
||||
//println(time)
|
||||
|
||||
if (_previousUpdateTime == 0.0) {
|
||||
_previousUpdateTime = time;
|
||||
}
|
||||
_deltaTime = time - _previousUpdateTime;
|
||||
|
||||
//var ms = Int((time % 1) * 1000)
|
||||
if ( _playAllFrames ) {
|
||||
if ( _deltaTime >= __animations.animationSpeedFloat() ){
|
||||
if (__animations.getAnimationFrameID() >= __animations.getAnimationFrameCount()) {
|
||||
self.gameView!.firstButtonPressed()
|
||||
}else{
|
||||
self.gameView!.nextButtonPressed()
|
||||
}
|
||||
CubeNetworkObj.updateFrame(__animations.getAnimDataSelected(), count: UInt32(__animations.getAnimationFrameID()))
|
||||
_previousUpdateTime = time;
|
||||
}
|
||||
}else{
|
||||
if ( _deltaTime >= __animations.getMinSendDelay() ) {
|
||||
CubeNetworkObj.updateFrame(__animations.getAnimDataSelected(), count: UInt32(__animations.getAnimationFrameID()))
|
||||
//println("SendFrame: \(_deltaTime)")
|
||||
_previousUpdateTime = time;
|
||||
}
|
||||
}
|
||||
//CubeNetworkObj.updateFrame(UnsafePointer<UInt8>(myFrames.bytes), count: myFrameCount)
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
override func awakeFromNib(){
|
||||
|
||||
_gameView = gameView;
|
||||
//NSTimer.scheduledTimerWithTimeInterval(_frameSendDelay, invocation: CubeNetworkObj.initObjects(), repeats: true)
|
||||
// CubeNetworkObj.initObjects();
|
||||
|
||||
// Init first frame
|
||||
|
||||
// myFrames = NSMutableData(bytes: emptyFrame, length: 64)
|
||||
// myFrameCount = 1
|
||||
// Open connection to the LED cube
|
||||
let established = CubeNetworkObj.openConnection(__prefData.ipAddr(), port: UInt32(__prefData.portNR()))
|
||||
if established {
|
||||
println("connection established")
|
||||
}else{
|
||||
println("connection failed")
|
||||
}
|
||||
__animations.sendFrame()
|
||||
|
||||
// Fallback timer if nothing render at the moment
|
||||
// NSTimer.scheduledTimerWithTimeInterval(__animations.getMinSendDelay(), target: self, selector: Selector("sendFrame"), userInfo: nil, repeats: true)
|
||||
|
||||
|
||||
|
||||
|
||||
// create a new scene
|
||||
//let scene = SCNScene(named: "art.scnassets/ship.dae")!
|
||||
let scene = PrimitivesScene();
|
||||
|
||||
|
||||
// create and add a camera to the scene
|
||||
let camera = SCNCamera()
|
||||
camera.usesOrthographicProjection = true
|
||||
camera.orthographicScale = 15
|
||||
camera.zNear = 0
|
||||
camera.zFar = 100
|
||||
let cameraNode = SCNNode()
|
||||
cameraNode.camera = camera
|
||||
cameraNode.name = "myCamera"
|
||||
scene.rootNode.addChildNode(cameraNode)
|
||||
|
||||
// place the camera
|
||||
var newAngle = (CGFloat)(20.0)*(CGFloat)(M_PI)/180.0
|
||||
//newAngle += currentAngle
|
||||
|
||||
// cameraNode.transform = SCNMatrix4MakeRotation(-0.5, 0, 0, 1)
|
||||
|
||||
cameraNode.transform = SCNMatrix4MakeRotation(newAngle, 0, 1, 0)
|
||||
cameraNode.transform = SCNMatrix4MakeRotation(-0.4, 1, 0, 0)
|
||||
cameraNode.position = SCNVector3(x: 0, y: 13, z: 30)
|
||||
//cameraNode.eulerAngles = SCNVector3(x: 1.0, y: 0.0, z: 0.0)
|
||||
|
||||
|
||||
/*
|
||||
let camera = SCNCamera()
|
||||
camera.usesOrthographicProjection = true
|
||||
camera.orthographicScale = 9
|
||||
camera.zNear = 0
|
||||
camera.zFar = 100
|
||||
let cameraNode = SCNNode()
|
||||
cameraNode.position = SCNVector3(x: 0, y: 0, z: 20)
|
||||
cameraNode.camera = camera
|
||||
let cameraOrbit = SCNNode()
|
||||
cameraOrbit.name = "myCamera"
|
||||
cameraOrbit.addChildNode(cameraNode)
|
||||
scene.rootNode.addChildNode(cameraOrbit)
|
||||
*/
|
||||
|
||||
// create and add a light to the scene
|
||||
let lightNode = SCNNode()
|
||||
lightNode.light = SCNLight()
|
||||
lightNode.light!.type = SCNLightTypeDirectional
|
||||
lightNode.light!.color = NSColor.grayColor()
|
||||
lightNode.position = SCNVector3(x: 20, y: 40, z: 20)
|
||||
scene.rootNode.addChildNode(lightNode)
|
||||
|
||||
// create and add an ambient light to the scene
|
||||
let ambientLightNode = SCNNode()
|
||||
ambientLightNode.light = SCNLight()
|
||||
ambientLightNode.light!.type = SCNLightTypeAmbient
|
||||
ambientLightNode.light!.color = NSColor.darkGrayColor()
|
||||
scene.rootNode.addChildNode(ambientLightNode)
|
||||
|
||||
|
||||
// Background image
|
||||
scene.background.contents = NSImage(named: "Background.jpg")
|
||||
|
||||
|
||||
/*
|
||||
// retrieve the ship node
|
||||
let ship = scene.rootNode.childNodeWithName("ship", recursively: true)!
|
||||
|
||||
// animate the 3d object
|
||||
let animation = CABasicAnimation(keyPath: "rotation")
|
||||
animation.toValue = NSValue(SCNVector4: SCNVector4(x: CGFloat(0), y: CGFloat(1), z: CGFloat(0), w: CGFloat(M_PI)*2))
|
||||
animation.duration = 3
|
||||
animation.repeatCount = MAXFLOAT //repeat forever
|
||||
ship.addAnimation(animation, forKey: nil)
|
||||
*/
|
||||
|
||||
scene.paused = false
|
||||
|
||||
// set the scene to the view
|
||||
self.gameView!.scene = scene
|
||||
|
||||
|
||||
// allows the user to manipulate the camera
|
||||
//self.gameView!.allowsCameraControl = true
|
||||
|
||||
// show statistics such as fps and timing information
|
||||
//self.gameView!.showsStatistics = true
|
||||
|
||||
// configure the view
|
||||
self.gameView!.backgroundColor = NSColor.blackColor()
|
||||
}
|
||||
|
||||
}
|
||||
|
Before Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
@@ -1,29 +0,0 @@
|
||||
//
|
||||
// ObjCtoCPlusPlus.h
|
||||
//
|
||||
// Created by Nikolai Rinas on 02/02/2015.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface CubeNetworkObj : NSObject
|
||||
+ (void) updateFrame: (const unsigned char *) frameSequence count: (UInt32) frameCount;
|
||||
+ (void) sendBytes: (const unsigned char *) byteBuffer count: (u_int32_t) byteLength;
|
||||
//+ (void) initObjects;
|
||||
+ (bool) openConnection: (const char *) ipAddress port: (UInt32) port;
|
||||
+ (void) closeConnection;
|
||||
+ (bool) connected;
|
||||
@end
|
||||
@@ -1,53 +0,0 @@
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
#import "ObjCtoCPlusPlus.h"
|
||||
|
||||
#import "CubeNetwork.h"
|
||||
|
||||
|
||||
@implementation CubeNetworkObj
|
||||
|
||||
/*
|
||||
+ (void) initObjects
|
||||
{
|
||||
CubeNetwork::initObjects();
|
||||
}
|
||||
*/
|
||||
+ (void) updateFrame: (const unsigned char *) frameSequence count: (UInt32) frameCount
|
||||
{
|
||||
CubeNetwork::updateFrame(frameSequence, frameCount);
|
||||
}
|
||||
+ (void) sendBytes: (const unsigned char *) byteBuffer count: (u_int32_t) byteLength
|
||||
{
|
||||
CubeNetwork::sendBytes(byteBuffer, byteLength);
|
||||
}
|
||||
//+ (void) openConnection
|
||||
+ (bool) openConnection: (const char *) ipAddress port: (UInt32) port
|
||||
{
|
||||
bool success = false;
|
||||
success = CubeNetwork::openConnection(ipAddress, port);
|
||||
return success;
|
||||
}
|
||||
+ (void) closeConnection
|
||||
{
|
||||
CubeNetwork::closeConnection();
|
||||
}
|
||||
|
||||
+ (bool) connected
|
||||
{
|
||||
return CubeNetwork::connected();
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,77 +0,0 @@
|
||||
//
|
||||
// Preferences.swift
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 18.04.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
import Foundation
|
||||
|
||||
class Preferences: NSObject {
|
||||
|
||||
let _myPrefs: NSUserDefaults = NSUserDefaults()
|
||||
var _myIPAddr: String = String()
|
||||
var _myPortNr: Int = Int()
|
||||
|
||||
let ipaddr_txt: String = "IPADDR"
|
||||
let portnr_txt: String = "PORTNR"
|
||||
// ipAddr
|
||||
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
|
||||
// Load defaults
|
||||
self.loadFile()
|
||||
}
|
||||
|
||||
func loadFile() {
|
||||
// Load ip address
|
||||
if let myIPAddr: String = _myPrefs.stringForKey(ipaddr_txt) {
|
||||
_myIPAddr = myIPAddr
|
||||
}
|
||||
// Load custom port
|
||||
let myPort: Int = _myPrefs.integerForKey(portnr_txt)
|
||||
if myPort > 0 {
|
||||
_myPortNr = myPort
|
||||
}
|
||||
}
|
||||
|
||||
func saveFile() {
|
||||
// Save ip address
|
||||
_myPrefs.setObject(_myIPAddr, forKey: ipaddr_txt)
|
||||
// Save port number
|
||||
_myPrefs.setInteger(_myPortNr, forKey: portnr_txt)
|
||||
}
|
||||
|
||||
func ipAddr() -> (String) {
|
||||
return _myIPAddr
|
||||
}
|
||||
|
||||
func setIPAddr(ipAddr: String) {
|
||||
_myIPAddr = ipAddr
|
||||
self.saveFile()
|
||||
}
|
||||
|
||||
func portNR() -> (Int) {
|
||||
return _myPortNr
|
||||
}
|
||||
|
||||
func setPortNr(portNr: Int) {
|
||||
_myPortNr = portNr
|
||||
self.saveFile()
|
||||
}
|
||||
}
|
||||
@@ -1,283 +0,0 @@
|
||||
//
|
||||
// PrimitivesScene.swift
|
||||
// Cube4Fun
|
||||
//
|
||||
// Created by Nikolai Rinas on 27.03.15.
|
||||
// Copyright (c) 2015 Nikolai Rinas. All rights reserved.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
|
||||
import Cocoa
|
||||
import SceneKit
|
||||
import QuartzCore
|
||||
|
||||
let debugOn = false
|
||||
let animRun = false
|
||||
|
||||
class PrimitivesScene: SCNScene {
|
||||
|
||||
func createPlayback() {
|
||||
// Play - Button
|
||||
let playImage = SCNPlane(width: 2.2, height: 2.2)
|
||||
playImage.firstMaterial?.diffuse.contents = NSImage(named: "media-playback-start-5.png")
|
||||
let playImageNode = SCNNode(geometry: playImage)
|
||||
playImageNode.name = "myPlayButton"
|
||||
playImageNode.position = SCNVector3(x:0, y:14, z:0)
|
||||
self.rootNode.addChildNode(playImageNode)
|
||||
|
||||
// Pause - Button
|
||||
let pauseImage = SCNPlane(width: 2.5, height: 2.5)
|
||||
pauseImage.firstMaterial?.diffuse.contents = NSImage(named: "media-playback-pause-5.png")
|
||||
let pauseImageNode = SCNNode(geometry: pauseImage)
|
||||
pauseImageNode.name = "myPauseButton"
|
||||
pauseImageNode.position = SCNVector3(x:0, y:14, z:0)
|
||||
pauseImageNode.hidden = true
|
||||
if __animations.getAnimationFrameID() == 1 && __animations.getAnimationFrameCount() == 1 {
|
||||
pauseImageNode.hidden = true
|
||||
}
|
||||
self.rootNode.addChildNode(pauseImageNode)
|
||||
|
||||
// NextFrame - Button
|
||||
let nextFrameImage = SCNPlane(width: 2.0, height: 2.0)
|
||||
nextFrameImage.firstMaterial?.diffuse.contents = NSImage(named: "media-seek-forward-5.png")
|
||||
let nextFrameImageNode = SCNNode(geometry: nextFrameImage)
|
||||
nextFrameImageNode.name = "myNextFrameButton"
|
||||
nextFrameImageNode.position = SCNVector3(x:2, y:14, z:0)
|
||||
if __animations.getAnimationFrameID() == 1 && __animations.getAnimationFrameCount() == 1 {
|
||||
nextFrameImageNode.hidden = true
|
||||
}
|
||||
self.rootNode.addChildNode(nextFrameImageNode)
|
||||
|
||||
// PrevFrame - Button
|
||||
let prevFrameImage = SCNPlane(width: 2.0, height: 2.0)
|
||||
prevFrameImage.firstMaterial?.diffuse.contents = NSImage(named: "media-seek-backward-5.png")
|
||||
let prevFrameImageNode = SCNNode(geometry: prevFrameImage)
|
||||
prevFrameImageNode.name = "myPrevFrameButton"
|
||||
prevFrameImageNode.position = SCNVector3(x:-2, y:14, z:0)
|
||||
if __animations.getAnimationFrameID() == 1 {
|
||||
prevFrameImageNode.hidden = true
|
||||
}
|
||||
self.rootNode.addChildNode(prevFrameImageNode)
|
||||
|
||||
// StartFrame - Button
|
||||
let startFrameImage = SCNPlane(width: 2.0, height: 2.0)
|
||||
startFrameImage.firstMaterial?.diffuse.contents = NSImage(named: "media-skip-backward-5.png")
|
||||
let startFrameImageNode = SCNNode(geometry: startFrameImage)
|
||||
startFrameImageNode.name = "myStartFrameButton"
|
||||
startFrameImageNode.position = SCNVector3(x:-5, y:14, z:0)
|
||||
if __animations.getAnimationFrameID() == 1 {
|
||||
startFrameImageNode.hidden = true
|
||||
}
|
||||
self.rootNode.addChildNode(startFrameImageNode)
|
||||
|
||||
// LastFrame - Button
|
||||
let lastFrameImage = SCNPlane(width: 2.0, height: 2.0)
|
||||
lastFrameImage.firstMaterial?.diffuse.contents = NSImage(named: "media-skip-forward-5.png")
|
||||
let lastFrameImageNode = SCNNode(geometry: lastFrameImage)
|
||||
lastFrameImageNode.name = "myLastFrameButton"
|
||||
lastFrameImageNode.position = SCNVector3(x:5, y:14, z:0)
|
||||
if __animations.getAnimationFrameID() == __animations.getAnimationFrameCount() {
|
||||
lastFrameImageNode.hidden = true
|
||||
}
|
||||
self.rootNode.addChildNode(lastFrameImageNode)
|
||||
|
||||
}
|
||||
|
||||
func createSpeedButtons() {
|
||||
// Frame
|
||||
let textSpeed = SCNText(string: "Speed: \(__animations.animationSpeedInt()) 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: \(__animations.getAnimationFrameID())/\(__animations.getAnimationFrameCount())", 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")
|
||||
let addFrameImageNode = SCNNode(geometry: addFrameImage)
|
||||
addFrameImageNode.name = "myAddFrameButton"
|
||||
addFrameImageNode.position = SCNVector3(x:-16.5, y:12, z:0)
|
||||
self.rootNode.addChildNode(addFrameImageNode)
|
||||
|
||||
// DeleteFrame - Button
|
||||
let delFrameImage = SCNPlane(width: 1.7, height: 1.7)
|
||||
delFrameImage.firstMaterial?.diffuse.contents = NSImage(named: "list-remove-2.png")
|
||||
let delFrameImageNode = SCNNode(geometry: delFrameImage)
|
||||
delFrameImageNode.name = "myDelFrameButton"
|
||||
delFrameImageNode.position = SCNVector3(x:-18.7, y:12, z:0)
|
||||
// for first frame, there is nothing to delete
|
||||
if ( __animations.getAnimationFrameID() == 1 ) {
|
||||
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() {
|
||||
super.init()
|
||||
|
||||
var radius:CGFloat = 1.0
|
||||
|
||||
let yCount = 4
|
||||
let zCount = 4
|
||||
let xCount = 4
|
||||
var myIndex = 0
|
||||
|
||||
let spaceBetweenLEDs:CGFloat = 4.0
|
||||
let edgePosX:CGFloat = CGFloat(xCount-1) * spaceBetweenLEDs * -1 / 2
|
||||
let edgePosY:CGFloat = CGFloat(yCount-1) * spaceBetweenLEDs * -1 / 2
|
||||
let edgePosZ:CGFloat = CGFloat(zCount-1) * spaceBetweenLEDs * -1 / 2
|
||||
let boxSizeX:CGFloat = CGFloat(xCount-1) * spaceBetweenLEDs + 2 * radius
|
||||
let boxSizeZ:CGFloat = CGFloat(zCount-1) * spaceBetweenLEDs + 2 * radius
|
||||
let boxPosY:CGFloat = (CGFloat(yCount-1) * spaceBetweenLEDs / 2) + radius + 0.5
|
||||
|
||||
|
||||
// ID for the LED
|
||||
let text = SCNText(string: "Klick", extrusionDepth: 0)
|
||||
text.font = NSFont(name: "Arial", size: 1.5)
|
||||
let textNode = SCNNode(geometry: text)
|
||||
textNode.name = "myDescr"
|
||||
if ( debugOn ) {
|
||||
textNode.position = SCNVector3(x:-20.0 , y: -14.0, z: 0.0)
|
||||
}else{
|
||||
textNode.position = SCNVector3(x:-20.0 , y: -24.0, z: 0.0)
|
||||
}
|
||||
self.rootNode.addChildNode(textNode)
|
||||
|
||||
// Frame
|
||||
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")
|
||||
let colorBarNode = SCNNode(geometry: colorBar)
|
||||
colorBarNode.name = "myColorBar"
|
||||
colorBarNode.position = SCNVector3(x: 17, y: 7, z:0.0)
|
||||
self.rootNode.addChildNode(colorBarNode)
|
||||
|
||||
// Arrows
|
||||
let arrowImage = SCNPlane(width: 3, height: 2.0)
|
||||
arrowImage.firstMaterial?.diffuse.contents = NSImage(named: "Arrows.png")
|
||||
let arrowImageNode = SCNNode(geometry: arrowImage)
|
||||
arrowImageNode.name = "myArrows"
|
||||
arrowImageNode.position = SCNVector3(x:17, y:15, z:0.1)
|
||||
self.rootNode.addChildNode(arrowImageNode)
|
||||
|
||||
|
||||
// All movable objects
|
||||
let cubeNode = SCNNode()
|
||||
cubeNode.name = "cubeNode"
|
||||
|
||||
let box = SCNBox(width: boxSizeX, height: 1.0, length: boxSizeZ, chamferRadius: 0.1)
|
||||
box.firstMaterial?.diffuse.contents = NSColor.whiteColor()
|
||||
let boxNode = SCNNode(geometry: box)
|
||||
boxNode.name = "myBox"
|
||||
boxNode.position = SCNVector3(x:0.0 , y: -boxPosY, z: 0.0)
|
||||
cubeNode.addChildNode(boxNode)
|
||||
|
||||
|
||||
var y:CGFloat = edgePosY
|
||||
for row in 0..<yCount {
|
||||
var z:CGFloat = edgePosZ
|
||||
for depth in 0..<zCount {
|
||||
var x:CGFloat = edgePosX
|
||||
for column in 0..<xCount {
|
||||
|
||||
let sphereGeometry = SCNSphere(radius: radius)
|
||||
sphereGeometry.name = myIndex.description
|
||||
|
||||
sphereGeometry.firstMaterial?.diffuse.contents = NSColor.grayColor()
|
||||
/*
|
||||
if (row % 2 == 0) {
|
||||
sphereGeometry.firstMaterial?.diffuse.contents = NSColor.redColor()
|
||||
} else {
|
||||
sphereGeometry.firstMaterial?.diffuse.contents = NSColor.greenColor()
|
||||
}*/
|
||||
|
||||
let sphereNode = SCNNode(geometry: sphereGeometry)
|
||||
sphereNode.position = SCNVector3(x: y, y: x, z: z)
|
||||
sphereNode.name = myIndex.description
|
||||
|
||||
|
||||
cubeNode.addChildNode(sphereNode)
|
||||
|
||||
x += spaceBetweenLEDs * CGFloat(radius)
|
||||
myIndex++
|
||||
|
||||
}
|
||||
z += spaceBetweenLEDs * CGFloat(radius)
|
||||
}
|
||||
y += spaceBetweenLEDs * CGFloat(radius)
|
||||
}
|
||||
|
||||
cubeNode.runAction(SCNAction.rotateByX(0, y: 0.6, z: 0, duration: 0.0))
|
||||
self.rootNode.addChildNode(cubeNode)
|
||||
|
||||
}
|
||||
|
||||
required init(coder aDecoder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 342 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |