From 131cdbd5767070ee5ba8df72eb334c3bb775ebbd Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Tue, 30 Apr 2013 19:18:39 +0200 Subject: [PATCH] AS3 and Starling runtimes. --- .gitignore | 4 +- spine-as3/.actionScriptProperties | 46 + spine-as3/.flexLibProperties | 6 + spine-as3/.project | 18 + .../org.eclipse.core.resources.prefs | 3 + spine-as3/html-template/history/history.css | 6 + spine-as3/html-template/history/history.js | 678 +++++++++++++++ .../html-template/history/historyFrame.html | 29 + spine-as3/html-template/index.template.html | 108 +++ .../html-template/playerProductInstall.swf | Bin 0 -> 657 bytes spine-as3/html-template/swfobject.js | 777 +++++++++++++++++ spine-as3/src/spine/AnimationState.as | 155 ++++ spine-as3/src/spine/AnimationStateData.as | 42 + spine-as3/src/spine/Bone.as | 126 +++ spine-as3/src/spine/BoneData.as | 35 + spine-as3/src/spine/Skeleton.as | 197 +++++ spine-as3/src/spine/SkeletonData.as | 117 +++ spine-as3/src/spine/SkeletonJson.as | 249 ++++++ spine-as3/src/spine/Skin.as | 50 ++ spine-as3/src/spine/Slot.as | 75 ++ spine-as3/src/spine/SlotData.as | 34 + spine-as3/src/spine/animation/Animation.as | 83 ++ .../src/spine/animation/AttachmentTimeline.as | 42 + .../src/spine/animation/ColorTimeline.as | 73 ++ .../src/spine/animation/CurveTimeline.as | 92 ++ .../src/spine/animation/RotateTimeline.as | 62 ++ .../src/spine/animation/ScaleTimeline.as | 34 + spine-as3/src/spine/animation/Timeline.as | 9 + .../src/spine/animation/TranslateTimeline.as | 51 ++ spine-as3/src/spine/atlas/AtlasPage.as | 15 + spine-as3/src/spine/atlas/AtlasRegion.as | 24 + spine-as3/src/spine/atlas/Format.as | 21 + spine-as3/src/spine/atlas/TextureFilter.as | 21 + spine-as3/src/spine/atlas/TextureWrap.as | 17 + spine-as3/src/spine/attachments/Attachment.as | 21 + .../src/spine/attachments/AttachmentLoader.as | 9 + .../src/spine/attachments/AttachmentType.as | 26 + .../src/spine/attachments/RegionAttachment.as | 106 +++ .../.actionScriptProperties | 42 + .../spine-starling-example/.project | 17 + .../org.eclipse.core.resources.prefs | 3 + .../html-template/history/history.css | 6 + .../html-template/history/history.js | 678 +++++++++++++++ .../html-template/history/historyFrame.html | 29 + .../html-template/index.template.html | 109 +++ .../html-template/playerProductInstall.swf | Bin 0 -> 657 bytes .../html-template/swfobject.js | 777 +++++++++++++++++ .../spine-starling-example/src/Game.as | 38 + .../spine-starling-example/src/Main.as | 17 + .../spine-starling-example/src/spineboy.json | 787 ++++++++++++++++++ .../spine-starling-example/src/spineboy.png | Bin 0 -> 113804 bytes .../spine-starling-example/src/spineboy.xml | 28 + .../spine-starling/.actionScriptProperties | 48 ++ .../spine-starling/.flexLibProperties | 6 + spine-starling/spine-starling/.project | 18 + .../.settings/FlexPrettyPrintCommand.prefs | 202 +++++ .../org.eclipse.core.resources.prefs | 3 + .../spine-starling/libs/starling.swc | Bin 0 -> 134592 bytes .../src/spine/SkeletonAnimationSprite.as | 66 ++ .../spine-starling/src/spine/SkeletonImage.as | 21 + .../src/spine/SkeletonSprite.as | 207 +++++ .../spine/StarlingAtlasAttachmentLoader.as | 39 + .../src/spine/StarlingSkeletonJson.as | 34 + 63 files changed, 6635 insertions(+), 1 deletion(-) create mode 100644 spine-as3/.actionScriptProperties create mode 100644 spine-as3/.flexLibProperties create mode 100644 spine-as3/.project create mode 100644 spine-as3/.settings/org.eclipse.core.resources.prefs create mode 100644 spine-as3/html-template/history/history.css create mode 100644 spine-as3/html-template/history/history.js create mode 100644 spine-as3/html-template/history/historyFrame.html create mode 100644 spine-as3/html-template/index.template.html create mode 100644 spine-as3/html-template/playerProductInstall.swf create mode 100644 spine-as3/html-template/swfobject.js create mode 100644 spine-as3/src/spine/AnimationState.as create mode 100644 spine-as3/src/spine/AnimationStateData.as create mode 100644 spine-as3/src/spine/Bone.as create mode 100644 spine-as3/src/spine/BoneData.as create mode 100644 spine-as3/src/spine/Skeleton.as create mode 100644 spine-as3/src/spine/SkeletonData.as create mode 100644 spine-as3/src/spine/SkeletonJson.as create mode 100644 spine-as3/src/spine/Skin.as create mode 100644 spine-as3/src/spine/Slot.as create mode 100644 spine-as3/src/spine/SlotData.as create mode 100644 spine-as3/src/spine/animation/Animation.as create mode 100644 spine-as3/src/spine/animation/AttachmentTimeline.as create mode 100644 spine-as3/src/spine/animation/ColorTimeline.as create mode 100644 spine-as3/src/spine/animation/CurveTimeline.as create mode 100644 spine-as3/src/spine/animation/RotateTimeline.as create mode 100644 spine-as3/src/spine/animation/ScaleTimeline.as create mode 100644 spine-as3/src/spine/animation/Timeline.as create mode 100644 spine-as3/src/spine/animation/TranslateTimeline.as create mode 100644 spine-as3/src/spine/atlas/AtlasPage.as create mode 100644 spine-as3/src/spine/atlas/AtlasRegion.as create mode 100644 spine-as3/src/spine/atlas/Format.as create mode 100644 spine-as3/src/spine/atlas/TextureFilter.as create mode 100644 spine-as3/src/spine/atlas/TextureWrap.as create mode 100644 spine-as3/src/spine/attachments/Attachment.as create mode 100644 spine-as3/src/spine/attachments/AttachmentLoader.as create mode 100644 spine-as3/src/spine/attachments/AttachmentType.as create mode 100644 spine-as3/src/spine/attachments/RegionAttachment.as create mode 100644 spine-starling/spine-starling-example/.actionScriptProperties create mode 100644 spine-starling/spine-starling-example/.project create mode 100644 spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs create mode 100644 spine-starling/spine-starling-example/html-template/history/history.css create mode 100644 spine-starling/spine-starling-example/html-template/history/history.js create mode 100644 spine-starling/spine-starling-example/html-template/history/historyFrame.html create mode 100644 spine-starling/spine-starling-example/html-template/index.template.html create mode 100644 spine-starling/spine-starling-example/html-template/playerProductInstall.swf create mode 100644 spine-starling/spine-starling-example/html-template/swfobject.js create mode 100644 spine-starling/spine-starling-example/src/Game.as create mode 100644 spine-starling/spine-starling-example/src/Main.as create mode 100644 spine-starling/spine-starling-example/src/spineboy.json create mode 100644 spine-starling/spine-starling-example/src/spineboy.png create mode 100644 spine-starling/spine-starling-example/src/spineboy.xml create mode 100644 spine-starling/spine-starling/.actionScriptProperties create mode 100644 spine-starling/spine-starling/.flexLibProperties create mode 100644 spine-starling/spine-starling/.project create mode 100644 spine-starling/spine-starling/.settings/FlexPrettyPrintCommand.prefs create mode 100644 spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs create mode 100644 spine-starling/spine-starling/libs/starling.swc create mode 100644 spine-starling/spine-starling/src/spine/SkeletonAnimationSprite.as create mode 100644 spine-starling/spine-starling/src/spine/SkeletonImage.as create mode 100644 spine-starling/spine-starling/src/spine/SkeletonSprite.as create mode 100644 spine-starling/spine-starling/src/spine/StarlingAtlasAttachmentLoader.as create mode 100644 spine-starling/spine-starling/src/spine/StarlingSkeletonJson.as diff --git a/.gitignore b/.gitignore index bfc1f9e69..46c0ed5d3 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,6 @@ spine-love/spine-lua/ spine-love/love/ !spine-love/spine-lua/Place spine-lua here.txt -spine-starling +spine-as3/bin +spine-starling/spine-starling/bin +spine-starling/spine-starling-example/bin-debug diff --git a/spine-as3/.actionScriptProperties b/spine-as3/.actionScriptProperties new file mode 100644 index 000000000..ac85b98e6 --- /dev/null +++ b/spine-as3/.actionScriptProperties @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spine-as3/.flexLibProperties b/spine-as3/.flexLibProperties new file mode 100644 index 000000000..1fbacb45b --- /dev/null +++ b/spine-as3/.flexLibProperties @@ -0,0 +1,6 @@ + + + + + + diff --git a/spine-as3/.project b/spine-as3/.project new file mode 100644 index 000000000..6eb849cd5 --- /dev/null +++ b/spine-as3/.project @@ -0,0 +1,18 @@ + + + spine-as3 + + + + + + com.adobe.flexbuilder.project.flexbuilder + + + + + + com.adobe.flexbuilder.project.aslibnature + com.adobe.flexbuilder.project.actionscriptnature + + diff --git a/spine-as3/.settings/org.eclipse.core.resources.prefs b/spine-as3/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..7e697cc40 --- /dev/null +++ b/spine-as3/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Tue Apr 30 18:55:56 CEST 2013 +eclipse.preferences.version=1 +encoding/=utf-8 diff --git a/spine-as3/html-template/history/history.css b/spine-as3/html-template/history/history.css new file mode 100644 index 000000000..dbc47c61b --- /dev/null +++ b/spine-as3/html-template/history/history.css @@ -0,0 +1,6 @@ +/* This CSS stylesheet defines styles used by required elements in a flex application page that supports browser history */ + +#ie_historyFrame { width: 0px; height: 0px; display:none } +#firefox_anchorDiv { width: 0px; height: 0px; display:none } +#safari_formDiv { width: 0px; height: 0px; display:none } +#safari_rememberDiv { width: 0px; height: 0px; display:none } diff --git a/spine-as3/html-template/history/history.js b/spine-as3/html-template/history/history.js new file mode 100644 index 000000000..00a8bfee7 --- /dev/null +++ b/spine-as3/html-template/history/history.js @@ -0,0 +1,678 @@ +BrowserHistoryUtils = { + addEvent: function(elm, evType, fn, useCapture) { + useCapture = useCapture || false; + if (elm.addEventListener) { + elm.addEventListener(evType, fn, useCapture); + return true; + } + else if (elm.attachEvent) { + var r = elm.attachEvent('on' + evType, fn); + return r; + } + else { + elm['on' + evType] = fn; + } + } +} + +BrowserHistory = (function() { + // type of browser + var browser = { + ie: false, + ie8: false, + firefox: false, + safari: false, + opera: false, + version: -1 + }; + + // Default app state URL to use when no fragment ID present + var defaultHash = ''; + + // Last-known app state URL + var currentHref = document.location.href; + + // Initial URL (used only by IE) + var initialHref = document.location.href; + + // Initial URL (used only by IE) + var initialHash = document.location.hash; + + // History frame source URL prefix (used only by IE) + var historyFrameSourcePrefix = 'history/historyFrame.html?'; + + // History maintenance (used only by Safari) + var currentHistoryLength = -1; + + // Flag to denote the existence of onhashchange + var browserHasHashChange = false; + + var historyHash = []; + + var initialState = createState(initialHref, initialHref + '#' + initialHash, initialHash); + + var backStack = []; + var forwardStack = []; + + var currentObjectId = null; + + //UserAgent detection + var useragent = navigator.userAgent.toLowerCase(); + + if (useragent.indexOf("opera") != -1) { + browser.opera = true; + } else if (useragent.indexOf("msie") != -1) { + browser.ie = true; + browser.version = parseFloat(useragent.substring(useragent.indexOf('msie') + 4)); + if (browser.version == 8) + { + browser.ie = false; + browser.ie8 = true; + } + } else if (useragent.indexOf("safari") != -1) { + browser.safari = true; + browser.version = parseFloat(useragent.substring(useragent.indexOf('safari') + 7)); + } else if (useragent.indexOf("gecko") != -1) { + browser.firefox = true; + } + + if (browser.ie == true && browser.version == 7) { + window["_ie_firstload"] = false; + } + + function hashChangeHandler() + { + currentHref = document.location.href; + var flexAppUrl = getHash(); + //ADR: to fix multiple + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + pl[i].browserURLChange(flexAppUrl); + } + } else { + getPlayer().browserURLChange(flexAppUrl); + } + } + + // Accessor functions for obtaining specific elements of the page. + function getHistoryFrame() + { + return document.getElementById('ie_historyFrame'); + } + + function getFormElement() + { + return document.getElementById('safari_formDiv'); + } + + function getRememberElement() + { + return document.getElementById("safari_remember_field"); + } + + // Get the Flash player object for performing ExternalInterface callbacks. + // Updated for changes to SWFObject2. + function getPlayer(id) { + var i; + + if (id && document.getElementById(id)) { + var r = document.getElementById(id); + if (typeof r.SetVariable != "undefined") { + return r; + } + else { + var o = r.getElementsByTagName("object"); + var e = r.getElementsByTagName("embed"); + for (i = 0; i < o.length; i++) { + if (typeof o[i].browserURLChange != "undefined") + return o[i]; + } + for (i = 0; i < e.length; i++) { + if (typeof e[i].browserURLChange != "undefined") + return e[i]; + } + } + } + else { + var o = document.getElementsByTagName("object"); + var e = document.getElementsByTagName("embed"); + for (i = 0; i < e.length; i++) { + if (typeof e[i].browserURLChange != "undefined") + { + return e[i]; + } + } + for (i = 0; i < o.length; i++) { + if (typeof o[i].browserURLChange != "undefined") + { + return o[i]; + } + } + } + return undefined; + } + + function getPlayers() { + var i; + var players = []; + if (players.length == 0) { + var tmp = document.getElementsByTagName('object'); + for (i = 0; i < tmp.length; i++) + { + if (typeof tmp[i].browserURLChange != "undefined") + players.push(tmp[i]); + } + } + if (players.length == 0 || players[0].object == null) { + var tmp = document.getElementsByTagName('embed'); + for (i = 0; i < tmp.length; i++) + { + if (typeof tmp[i].browserURLChange != "undefined") + players.push(tmp[i]); + } + } + return players; + } + + function getIframeHash() { + var doc = getHistoryFrame().contentWindow.document; + var hash = String(doc.location.search); + if (hash.length == 1 && hash.charAt(0) == "?") { + hash = ""; + } + else if (hash.length >= 2 && hash.charAt(0) == "?") { + hash = hash.substring(1); + } + return hash; + } + + /* Get the current location hash excluding the '#' symbol. */ + function getHash() { + // It would be nice if we could use document.location.hash here, + // but it's faulty sometimes. + var idx = document.location.href.indexOf('#'); + return (idx >= 0) ? document.location.href.substr(idx+1) : ''; + } + + /* Get the current location hash excluding the '#' symbol. */ + function setHash(hash) { + // It would be nice if we could use document.location.hash here, + // but it's faulty sometimes. + if (hash == '') hash = '#' + document.location.hash = hash; + } + + function createState(baseUrl, newUrl, flexAppUrl) { + return { 'baseUrl': baseUrl, 'newUrl': newUrl, 'flexAppUrl': flexAppUrl, 'title': null }; + } + + /* Add a history entry to the browser. + * baseUrl: the portion of the location prior to the '#' + * newUrl: the entire new URL, including '#' and following fragment + * flexAppUrl: the portion of the location following the '#' only + */ + function addHistoryEntry(baseUrl, newUrl, flexAppUrl) { + + //delete all the history entries + forwardStack = []; + + if (browser.ie) { + //Check to see if we are being asked to do a navigate for the first + //history entry, and if so ignore, because it's coming from the creation + //of the history iframe + if (flexAppUrl == defaultHash && document.location.href == initialHref && window['_ie_firstload']) { + currentHref = initialHref; + return; + } + if ((!flexAppUrl || flexAppUrl == defaultHash) && window['_ie_firstload']) { + newUrl = baseUrl + '#' + defaultHash; + flexAppUrl = defaultHash; + } else { + // for IE, tell the history frame to go somewhere without a '#' + // in order to get this entry into the browser history. + getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl; + } + setHash(flexAppUrl); + } else { + + //ADR + if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) { + initialState = createState(baseUrl, newUrl, flexAppUrl); + } else if(backStack.length > 0 && backStack[backStack.length - 1].flexAppUrl == flexAppUrl) { + backStack[backStack.length - 1] = createState(baseUrl, newUrl, flexAppUrl); + } + + if (browser.safari && !browserHasHashChange) { + // for Safari, submit a form whose action points to the desired URL + if (browser.version <= 419.3) { + var file = window.location.pathname.toString(); + file = file.substring(file.lastIndexOf("/")+1); + getFormElement().innerHTML = '
'; + //get the current elements and add them to the form + var qs = window.location.search.substring(1); + var qs_arr = qs.split("&"); + for (var i = 0; i < qs_arr.length; i++) { + var tmp = qs_arr[i].split("="); + var elem = document.createElement("input"); + elem.type = "hidden"; + elem.name = tmp[0]; + elem.value = tmp[1]; + document.forms.historyForm.appendChild(elem); + } + document.forms.historyForm.submit(); + } else { + top.location.hash = flexAppUrl; + } + // We also have to maintain the history by hand for Safari + historyHash[history.length] = flexAppUrl; + _storeStates(); + } else { + // Otherwise, just tell the browser to go there + setHash(flexAppUrl); + } + } + backStack.push(createState(baseUrl, newUrl, flexAppUrl)); + } + + function _storeStates() { + if (browser.safari) { + getRememberElement().value = historyHash.join(","); + } + } + + function handleBackButton() { + //The "current" page is always at the top of the history stack. + var current = backStack.pop(); + if (!current) { return; } + var last = backStack[backStack.length - 1]; + if (!last && backStack.length == 0){ + last = initialState; + } + forwardStack.push(current); + } + + function handleForwardButton() { + //summary: private method. Do not call this directly. + + var last = forwardStack.pop(); + if (!last) { return; } + backStack.push(last); + } + + function handleArbitraryUrl() { + //delete all the history entries + forwardStack = []; + } + + /* Called periodically to poll to see if we need to detect navigation that has occurred */ + function checkForUrlChange() { + + if (browser.ie) { + if (currentHref != document.location.href && currentHref + '#' != document.location.href) { + //This occurs when the user has navigated to a specific URL + //within the app, and didn't use browser back/forward + //IE seems to have a bug where it stops updating the URL it + //shows the end-user at this point, but programatically it + //appears to be correct. Do a full app reload to get around + //this issue. + if (browser.version < 7) { + currentHref = document.location.href; + document.location.reload(); + } else { + if (getHash() != getIframeHash()) { + // this.iframe.src = this.blankURL + hash; + var sourceToSet = historyFrameSourcePrefix + getHash(); + getHistoryFrame().src = sourceToSet; + currentHref = document.location.href; + } + } + } + } + + if (browser.safari && !browserHasHashChange) { + // For Safari, we have to check to see if history.length changed. + if (currentHistoryLength >= 0 && history.length != currentHistoryLength) { + //alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|")); + var flexAppUrl = getHash(); + if (browser.version < 528.16 /* Anything earlier than Safari 4.0 */) + { + // If it did change and we're running Safari 3.x or earlier, + // then we have to look the old state up in our hand-maintained + // array since document.location.hash won't have changed, + // then call back into BrowserManager. + currentHistoryLength = history.length; + flexAppUrl = historyHash[currentHistoryLength]; + } + + //ADR: to fix multiple + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + pl[i].browserURLChange(flexAppUrl); + } + } else { + getPlayer().browserURLChange(flexAppUrl); + } + _storeStates(); + } + } + if (browser.firefox && !browserHasHashChange) { + if (currentHref != document.location.href) { + var bsl = backStack.length; + + var urlActions = { + back: false, + forward: false, + set: false + } + + if ((window.location.hash == initialHash || window.location.href == initialHref) && (bsl == 1)) { + urlActions.back = true; + // FIXME: could this ever be a forward button? + // we can't clear it because we still need to check for forwards. Ugg. + // clearInterval(this.locationTimer); + handleBackButton(); + } + + // first check to see if we could have gone forward. We always halt on + // a no-hash item. + if (forwardStack.length > 0) { + if (forwardStack[forwardStack.length-1].flexAppUrl == getHash()) { + urlActions.forward = true; + handleForwardButton(); + } + } + + // ok, that didn't work, try someplace back in the history stack + if ((bsl >= 2) && (backStack[bsl - 2])) { + if (backStack[bsl - 2].flexAppUrl == getHash()) { + urlActions.back = true; + handleBackButton(); + } + } + + if (!urlActions.back && !urlActions.forward) { + var foundInStacks = { + back: -1, + forward: -1 + } + + for (var i = 0; i < backStack.length; i++) { + if (backStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { + arbitraryUrl = true; + foundInStacks.back = i; + } + } + for (var i = 0; i < forwardStack.length; i++) { + if (forwardStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { + arbitraryUrl = true; + foundInStacks.forward = i; + } + } + handleArbitraryUrl(); + } + + // Firefox changed; do a callback into BrowserManager to tell it. + currentHref = document.location.href; + var flexAppUrl = getHash(); + //ADR: to fix multiple + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + pl[i].browserURLChange(flexAppUrl); + } + } else { + getPlayer().browserURLChange(flexAppUrl); + } + } + } + } + + var _initialize = function () { + + browserHasHashChange = ("onhashchange" in document.body); + + if (browser.ie) + { + var scripts = document.getElementsByTagName('script'); + for (var i = 0, s; s = scripts[i]; i++) { + if (s.src.indexOf("history.js") > -1) { + var iframe_location = (new String(s.src)).replace("history.js", "historyFrame.html"); + } + } + historyFrameSourcePrefix = iframe_location + "?"; + var src = historyFrameSourcePrefix; + + var iframe = document.createElement("iframe"); + iframe.id = 'ie_historyFrame'; + iframe.name = 'ie_historyFrame'; + iframe.src = 'javascript:false;'; + + try { + document.body.appendChild(iframe); + } catch(e) { + setTimeout(function() { + document.body.appendChild(iframe); + }, 0); + } + } + + if (browser.safari && !browserHasHashChange) + { + var rememberDiv = document.createElement("div"); + rememberDiv.id = 'safari_rememberDiv'; + document.body.appendChild(rememberDiv); + rememberDiv.innerHTML = ''; + + var formDiv = document.createElement("div"); + formDiv.id = 'safari_formDiv'; + document.body.appendChild(formDiv); + + var reloader_content = document.createElement('div'); + reloader_content.id = 'safarireloader'; + var scripts = document.getElementsByTagName('script'); + for (var i = 0, s; s = scripts[i]; i++) { + if (s.src.indexOf("history.js") > -1) { + html = (new String(s.src)).replace(".js", ".html"); + } + } + reloader_content.innerHTML = ''; + document.body.appendChild(reloader_content); + reloader_content.style.position = 'absolute'; + reloader_content.style.left = reloader_content.style.top = '-9999px'; + iframe = reloader_content.getElementsByTagName('iframe')[0]; + + if (document.getElementById("safari_remember_field").value != "" ) { + historyHash = document.getElementById("safari_remember_field").value.split(","); + } + } + + if (browserHasHashChange) + document.body.onhashchange = hashChangeHandler; + } + + return { + historyHash: historyHash, + backStack: function() { return backStack; }, + forwardStack: function() { return forwardStack }, + getPlayer: getPlayer, + initialize: function(src) { + _initialize(src); + }, + setURL: function(url) { + document.location.href = url; + }, + getURL: function() { + return document.location.href; + }, + getTitle: function() { + return document.title; + }, + setTitle: function(title) { + try { + backStack[backStack.length - 1].title = title; + } catch(e) { } + //if on safari, set the title to be the empty string. + if (browser.safari) { + if (title == "") { + try { + var tmp = window.location.href.toString(); + title = tmp.substring((tmp.lastIndexOf("/")+1), tmp.lastIndexOf("#")); + } catch(e) { + title = ""; + } + } + } + document.title = title; + }, + setDefaultURL: function(def) + { + defaultHash = def; + def = getHash(); + //trailing ? is important else an extra frame gets added to the history + //when navigating back to the first page. Alternatively could check + //in history frame navigation to compare # and ?. + if (browser.ie) + { + window['_ie_firstload'] = true; + var sourceToSet = historyFrameSourcePrefix + def; + var func = function() { + getHistoryFrame().src = sourceToSet; + window.location.replace("#" + def); + setInterval(checkForUrlChange, 50); + } + try { + func(); + } catch(e) { + window.setTimeout(function() { func(); }, 0); + } + } + + if (browser.safari) + { + currentHistoryLength = history.length; + if (historyHash.length == 0) { + historyHash[currentHistoryLength] = def; + var newloc = "#" + def; + window.location.replace(newloc); + } else { + //alert(historyHash[historyHash.length-1]); + } + setInterval(checkForUrlChange, 50); + } + + + if (browser.firefox || browser.opera) + { + var reg = new RegExp("#" + def + "$"); + if (window.location.toString().match(reg)) { + } else { + var newloc ="#" + def; + window.location.replace(newloc); + } + setInterval(checkForUrlChange, 50); + } + + }, + + /* Set the current browser URL; called from inside BrowserManager to propagate + * the application state out to the container. + */ + setBrowserURL: function(flexAppUrl, objectId) { + if (browser.ie && typeof objectId != "undefined") { + currentObjectId = objectId; + } + //fromIframe = fromIframe || false; + //fromFlex = fromFlex || false; + //alert("setBrowserURL: " + flexAppUrl); + //flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ; + + var pos = document.location.href.indexOf('#'); + var baseUrl = pos != -1 ? document.location.href.substr(0, pos) : document.location.href; + var newUrl = baseUrl + '#' + flexAppUrl; + + if (document.location.href != newUrl && document.location.href + '#' != newUrl) { + currentHref = newUrl; + addHistoryEntry(baseUrl, newUrl, flexAppUrl); + currentHistoryLength = history.length; + } + }, + + browserURLChange: function(flexAppUrl) { + var objectId = null; + if (browser.ie && currentObjectId != null) { + objectId = currentObjectId; + } + + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + try { + pl[i].browserURLChange(flexAppUrl); + } catch(e) { } + } + } else { + try { + getPlayer(objectId).browserURLChange(flexAppUrl); + } catch(e) { } + } + + currentObjectId = null; + }, + getUserAgent: function() { + return navigator.userAgent; + }, + getPlatform: function() { + return navigator.platform; + } + + } + +})(); + +// Initialization + +// Automated unit testing and other diagnostics + +function setURL(url) +{ + document.location.href = url; +} + +function backButton() +{ + history.back(); +} + +function forwardButton() +{ + history.forward(); +} + +function goForwardOrBackInHistory(step) +{ + history.go(step); +} + +//BrowserHistoryUtils.addEvent(window, "load", function() { BrowserHistory.initialize(); }); +(function(i) { + var u =navigator.userAgent;var e=/*@cc_on!@*/false; + var st = setTimeout; + if(/webkit/i.test(u)){ + st(function(){ + var dr=document.readyState; + if(dr=="loaded"||dr=="complete"){i()} + else{st(arguments.callee,10);}},10); + } else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){ + document.addEventListener("DOMContentLoaded",i,false); + } else if(e){ + (function(){ + var t=document.createElement('doc:rdy'); + try{t.doScroll('left'); + i();t=null; + }catch(e){st(arguments.callee,0);}})(); + } else{ + window.onload=i; + } +})( function() {BrowserHistory.initialize();} ); diff --git a/spine-as3/html-template/history/historyFrame.html b/spine-as3/html-template/history/historyFrame.html new file mode 100644 index 000000000..07e3806f0 --- /dev/null +++ b/spine-as3/html-template/history/historyFrame.html @@ -0,0 +1,29 @@ + + + + + + + + Hidden frame for Browser History support. + + diff --git a/spine-as3/html-template/index.template.html b/spine-as3/html-template/index.template.html new file mode 100644 index 000000000..d327daded --- /dev/null +++ b/spine-as3/html-template/index.template.html @@ -0,0 +1,108 @@ + + + + + + ${title} + + + + + + + + + + + + + +
+

+ To view this page ensure that Adobe Flash Player version + ${version_major}.${version_minor}.${version_revision} or greater is installed. +

+ +
+ + + + diff --git a/spine-as3/html-template/playerProductInstall.swf b/spine-as3/html-template/playerProductInstall.swf new file mode 100644 index 0000000000000000000000000000000000000000..bdc3437856cb0ae54bb9423700ba6ec89f35282c GIT binary patch literal 657 zcmV;C0&e|7S5pT30{{ScoOM%8YZE~jel|&yP13aKhpyI8)Pu*a7cZru!IYFhQ!%kE z;zt>GCuViByG~|XgJ(bJp~q+`f){V4c=Tk!n-K9Tcv0|Qh}4-)Z5q%$%)ak4^FGh} zG4mKh>p=QFFsz{%nRVYDpaejJ54{eo7BqCbU1T$6A?_UfdU|tzr7->Edg5~QJ`!s!OO;20fpVHsv=YsdQ{lvI<6(v2yrdS7`6LQi8#uy`}SX?Ni6O)r6`%Pye4YxmY_|vs1r$ zYS62JJit*Qq5)1^TgC)o6KZQEG=%VHP4mC>rXSoh>x{G-y~501s42xbb%oj5teYed zUazfuM*8z%%PQW6Lm}m@hf8V%w#-l*H+45VumzOSNh6MI zfwTnD68J}cRU>5EordGe5i?c`=PYmF$$^*q^20~+G3o1>u%sdEL~sE;XrvE~96_TY z1oQ%v(6hbD$HElG!xl|cjZOyoWIw@E;qK|`oT|Xk&*+o6#W@8T{oeJ8I9m-_V~Lc) rrowHdr=QEu;UGRC%}bhmYZ>GFiMOQQ+m?EJQA~aL;e`Gll9T{P!97I~ literal 0 HcmV?d00001 diff --git a/spine-as3/html-template/swfobject.js b/spine-as3/html-template/swfobject.js new file mode 100644 index 000000000..bf35c07c8 --- /dev/null +++ b/spine-as3/html-template/swfobject.js @@ -0,0 +1,777 @@ +/*! SWFObject v2.2 + is released under the MIT License +*/ + +var swfobject = function() { + + var UNDEF = "undefined", + OBJECT = "object", + SHOCKWAVE_FLASH = "Shockwave Flash", + SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", + FLASH_MIME_TYPE = "application/x-shockwave-flash", + EXPRESS_INSTALL_ID = "SWFObjectExprInst", + ON_READY_STATE_CHANGE = "onreadystatechange", + + win = window, + doc = document, + nav = navigator, + + plugin = false, + domLoadFnArr = [main], + regObjArr = [], + objIdArr = [], + listenersArr = [], + storedAltContent, + storedAltContentId, + storedCallbackFn, + storedCallbackObj, + isDomLoaded = false, + isExpressInstallActive = false, + dynamicStylesheet, + dynamicStylesheetMedia, + autoHideShow = true, + + /* Centralized function for browser feature detection + - User agent string detection is only used when no good alternative is possible + - Is executed directly for optimal performance + */ + ua = function() { + var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, + u = nav.userAgent.toLowerCase(), + p = nav.platform.toLowerCase(), + windows = p ? /win/.test(p) : /win/.test(u), + mac = p ? /mac/.test(p) : /mac/.test(u), + webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit + ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html + playerVersion = [0,0,0], + d = null; + if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { + d = nav.plugins[SHOCKWAVE_FLASH].description; + if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+ + plugin = true; + ie = false; // cascaded feature detection for Internet Explorer + d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); + playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); + playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); + playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; + } + } + else if (typeof win.ActiveXObject != UNDEF) { + try { + var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); + if (a) { // a will return null when ActiveX is disabled + d = a.GetVariable("$version"); + if (d) { + ie = true; // cascaded feature detection for Internet Explorer + d = d.split(" ")[1].split(","); + playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + } + } + catch(e) {} + } + return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; + }(), + + /* Cross-browser onDomLoad + - Will fire an event as soon as the DOM of a web page is loaded + - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/ + - Regular onload serves as fallback + */ + onDomLoad = function() { + if (!ua.w3) { return; } + if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically + callDomLoadFunctions(); + } + if (!isDomLoaded) { + if (typeof doc.addEventListener != UNDEF) { + doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false); + } + if (ua.ie && ua.win) { + doc.attachEvent(ON_READY_STATE_CHANGE, function() { + if (doc.readyState == "complete") { + doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); + callDomLoadFunctions(); + } + }); + if (win == top) { // if not inside an iframe + (function(){ + if (isDomLoaded) { return; } + try { + doc.documentElement.doScroll("left"); + } + catch(e) { + setTimeout(arguments.callee, 0); + return; + } + callDomLoadFunctions(); + })(); + } + } + if (ua.wk) { + (function(){ + if (isDomLoaded) { return; } + if (!/loaded|complete/.test(doc.readyState)) { + setTimeout(arguments.callee, 0); + return; + } + callDomLoadFunctions(); + })(); + } + addLoadEvent(callDomLoadFunctions); + } + }(); + + function callDomLoadFunctions() { + if (isDomLoaded) { return; } + try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early + var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span")); + t.parentNode.removeChild(t); + } + catch (e) { return; } + isDomLoaded = true; + var dl = domLoadFnArr.length; + for (var i = 0; i < dl; i++) { + domLoadFnArr[i](); + } + } + + function addDomLoadEvent(fn) { + if (isDomLoaded) { + fn(); + } + else { + domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ + } + } + + /* Cross-browser onload + - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/ + - Will fire an event as soon as a web page including all of its assets are loaded + */ + function addLoadEvent(fn) { + if (typeof win.addEventListener != UNDEF) { + win.addEventListener("load", fn, false); + } + else if (typeof doc.addEventListener != UNDEF) { + doc.addEventListener("load", fn, false); + } + else if (typeof win.attachEvent != UNDEF) { + addListener(win, "onload", fn); + } + else if (typeof win.onload == "function") { + var fnOld = win.onload; + win.onload = function() { + fnOld(); + fn(); + }; + } + else { + win.onload = fn; + } + } + + /* Main function + - Will preferably execute onDomLoad, otherwise onload (as a fallback) + */ + function main() { + if (plugin) { + testPlayerVersion(); + } + else { + matchVersions(); + } + } + + /* Detect the Flash Player version for non-Internet Explorer browsers + - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description: + a. Both release and build numbers can be detected + b. Avoid wrong descriptions by corrupt installers provided by Adobe + c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports + - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available + */ + function testPlayerVersion() { + var b = doc.getElementsByTagName("body")[0]; + var o = createElement(OBJECT); + o.setAttribute("type", FLASH_MIME_TYPE); + var t = b.appendChild(o); + if (t) { + var counter = 0; + (function(){ + if (typeof t.GetVariable != UNDEF) { + var d = t.GetVariable("$version"); + if (d) { + d = d.split(" ")[1].split(","); + ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + } + else if (counter < 10) { + counter++; + setTimeout(arguments.callee, 10); + return; + } + b.removeChild(o); + t = null; + matchVersions(); + })(); + } + else { + matchVersions(); + } + } + + /* Perform Flash Player and SWF version matching; static publishing only + */ + function matchVersions() { + var rl = regObjArr.length; + if (rl > 0) { + for (var i = 0; i < rl; i++) { // for each registered object element + var id = regObjArr[i].id; + var cb = regObjArr[i].callbackFn; + var cbObj = {success:false, id:id}; + if (ua.pv[0] > 0) { + var obj = getElementById(id); + if (obj) { + if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match! + setVisibility(id, true); + if (cb) { + cbObj.success = true; + cbObj.ref = getObjectById(id); + cb(cbObj); + } + } + else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported + var att = {}; + att.data = regObjArr[i].expressInstall; + att.width = obj.getAttribute("width") || "0"; + att.height = obj.getAttribute("height") || "0"; + if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); } + if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); } + // parse HTML object param element's name-value pairs + var par = {}; + var p = obj.getElementsByTagName("param"); + var pl = p.length; + for (var j = 0; j < pl; j++) { + if (p[j].getAttribute("name").toLowerCase() != "movie") { + par[p[j].getAttribute("name")] = p[j].getAttribute("value"); + } + } + showExpressInstall(att, par, id, cb); + } + else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF + displayAltContent(obj); + if (cb) { cb(cbObj); } + } + } + } + else { // if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content) + setVisibility(id, true); + if (cb) { + var o = getObjectById(id); // test whether there is an HTML object element or not + if (o && typeof o.SetVariable != UNDEF) { + cbObj.success = true; + cbObj.ref = o; + } + cb(cbObj); + } + } + } + } + } + + function getObjectById(objectIdStr) { + var r = null; + var o = getElementById(objectIdStr); + if (o && o.nodeName == "OBJECT") { + if (typeof o.SetVariable != UNDEF) { + r = o; + } + else { + var n = o.getElementsByTagName(OBJECT)[0]; + if (n) { + r = n; + } + } + } + return r; + } + + /* Requirements for Adobe Express Install + - only one instance can be active at a time + - fp 6.0.65 or higher + - Win/Mac OS only + - no Webkit engines older than version 312 + */ + function canExpressInstall() { + return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312); + } + + /* Show the Adobe Express Install dialog + - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 + */ + function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { + isExpressInstallActive = true; + storedCallbackFn = callbackFn || null; + storedCallbackObj = {success:false, id:replaceElemIdStr}; + var obj = getElementById(replaceElemIdStr); + if (obj) { + if (obj.nodeName == "OBJECT") { // static publishing + storedAltContent = abstractAltContent(obj); + storedAltContentId = null; + } + else { // dynamic publishing + storedAltContent = obj; + storedAltContentId = replaceElemIdStr; + } + att.id = EXPRESS_INSTALL_ID; + if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; } + if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; } + doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; + var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", + fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; + if (typeof par.flashvars != UNDEF) { + par.flashvars += "&" + fv; + } + else { + par.flashvars = fv; + } + // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it, + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work + if (ua.ie && ua.win && obj.readyState != 4) { + var newObj = createElement("div"); + replaceElemIdStr += "SWFObjectNew"; + newObj.setAttribute("id", replaceElemIdStr); + obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + obj.parentNode.removeChild(obj); + } + else { + setTimeout(arguments.callee, 10); + } + })(); + } + createSWF(att, par, replaceElemIdStr); + } + } + + /* Functions to abstract and display alternative content + */ + function displayAltContent(obj) { + if (ua.ie && ua.win && obj.readyState != 4) { + // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it, + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work + var el = createElement("div"); + obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content + el.parentNode.replaceChild(abstractAltContent(obj), el); + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + obj.parentNode.removeChild(obj); + } + else { + setTimeout(arguments.callee, 10); + } + })(); + } + else { + obj.parentNode.replaceChild(abstractAltContent(obj), obj); + } + } + + function abstractAltContent(obj) { + var ac = createElement("div"); + if (ua.win && ua.ie) { + ac.innerHTML = obj.innerHTML; + } + else { + var nestedObj = obj.getElementsByTagName(OBJECT)[0]; + if (nestedObj) { + var c = nestedObj.childNodes; + if (c) { + var cl = c.length; + for (var i = 0; i < cl; i++) { + if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) { + ac.appendChild(c[i].cloneNode(true)); + } + } + } + } + } + return ac; + } + + /* Cross-browser dynamic SWF creation + */ + function createSWF(attObj, parObj, id) { + var r, el = getElementById(id); + if (ua.wk && ua.wk < 312) { return r; } + if (el) { + if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content + attObj.id = id; + } + if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML + var att = ""; + for (var i in attObj) { + if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries + if (i.toLowerCase() == "data") { + parObj.movie = attObj[i]; + } + else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword + att += ' class="' + attObj[i] + '"'; + } + else if (i.toLowerCase() != "classid") { + att += ' ' + i + '="' + attObj[i] + '"'; + } + } + } + var par = ""; + for (var j in parObj) { + if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries + par += ''; + } + } + el.outerHTML = '' + par + ''; + objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only) + r = getElementById(attObj.id); + } + else { // well-behaving browsers + var o = createElement(OBJECT); + o.setAttribute("type", FLASH_MIME_TYPE); + for (var m in attObj) { + if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries + if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword + o.setAttribute("class", attObj[m]); + } + else if (m.toLowerCase() != "classid") { // filter out IE specific attribute + o.setAttribute(m, attObj[m]); + } + } + } + for (var n in parObj) { + if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element + createObjParam(o, n, parObj[n]); + } + } + el.parentNode.replaceChild(o, el); + r = o; + } + } + return r; + } + + function createObjParam(el, pName, pValue) { + var p = createElement("param"); + p.setAttribute("name", pName); + p.setAttribute("value", pValue); + el.appendChild(p); + } + + /* Cross-browser SWF removal + - Especially needed to safely and completely remove a SWF in Internet Explorer + */ + function removeSWF(id) { + var obj = getElementById(id); + if (obj && obj.nodeName == "OBJECT") { + if (ua.ie && ua.win) { + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + removeObjectInIE(id); + } + else { + setTimeout(arguments.callee, 10); + } + })(); + } + else { + obj.parentNode.removeChild(obj); + } + } + } + + function removeObjectInIE(id) { + var obj = getElementById(id); + if (obj) { + for (var i in obj) { + if (typeof obj[i] == "function") { + obj[i] = null; + } + } + obj.parentNode.removeChild(obj); + } + } + + /* Functions to optimize JavaScript compression + */ + function getElementById(id) { + var el = null; + try { + el = doc.getElementById(id); + } + catch (e) {} + return el; + } + + function createElement(el) { + return doc.createElement(el); + } + + /* Updated attachEvent function for Internet Explorer + - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks + */ + function addListener(target, eventType, fn) { + target.attachEvent(eventType, fn); + listenersArr[listenersArr.length] = [target, eventType, fn]; + } + + /* Flash Player and SWF content version matching + */ + function hasPlayerVersion(rv) { + var pv = ua.pv, v = rv.split("."); + v[0] = parseInt(v[0], 10); + v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0" + v[2] = parseInt(v[2], 10) || 0; + return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; + } + + /* Cross-browser dynamic CSS creation + - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php + */ + function createCSS(sel, decl, media, newStyle) { + if (ua.ie && ua.mac) { return; } + var h = doc.getElementsByTagName("head")[0]; + if (!h) { return; } // to also support badly authored HTML pages that lack a head element + var m = (media && typeof media == "string") ? media : "screen"; + if (newStyle) { + dynamicStylesheet = null; + dynamicStylesheetMedia = null; + } + if (!dynamicStylesheet || dynamicStylesheetMedia != m) { + // create dynamic stylesheet + get a global reference to it + var s = createElement("style"); + s.setAttribute("type", "text/css"); + s.setAttribute("media", m); + dynamicStylesheet = h.appendChild(s); + if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) { + dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1]; + } + dynamicStylesheetMedia = m; + } + // add style rule + if (ua.ie && ua.win) { + if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) { + dynamicStylesheet.addRule(sel, decl); + } + } + else { + if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) { + dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}")); + } + } + } + + function setVisibility(id, isVisible) { + if (!autoHideShow) { return; } + var v = isVisible ? "visible" : "hidden"; + if (isDomLoaded && getElementById(id)) { + getElementById(id).style.visibility = v; + } + else { + createCSS("#" + id, "visibility:" + v); + } + } + + /* Filter to avoid XSS attacks + */ + function urlEncodeIfNecessary(s) { + var regex = /[\\\"<>\.;]/; + var hasBadChars = regex.exec(s) != null; + return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s; + } + + /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only) + */ + var cleanup = function() { + if (ua.ie && ua.win) { + window.attachEvent("onunload", function() { + // remove listeners to avoid memory leaks + var ll = listenersArr.length; + for (var i = 0; i < ll; i++) { + listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]); + } + // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect + var il = objIdArr.length; + for (var j = 0; j < il; j++) { + removeSWF(objIdArr[j]); + } + // cleanup library's main closures to avoid memory leaks + for (var k in ua) { + ua[k] = null; + } + ua = null; + for (var l in swfobject) { + swfobject[l] = null; + } + swfobject = null; + }); + } + }(); + + return { + /* Public API + - Reference: http://code.google.com/p/swfobject/wiki/documentation + */ + registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) { + if (ua.w3 && objectIdStr && swfVersionStr) { + var regObj = {}; + regObj.id = objectIdStr; + regObj.swfVersion = swfVersionStr; + regObj.expressInstall = xiSwfUrlStr; + regObj.callbackFn = callbackFn; + regObjArr[regObjArr.length] = regObj; + setVisibility(objectIdStr, false); + } + else if (callbackFn) { + callbackFn({success:false, id:objectIdStr}); + } + }, + + getObjectById: function(objectIdStr) { + if (ua.w3) { + return getObjectById(objectIdStr); + } + }, + + embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { + var callbackObj = {success:false, id:replaceElemIdStr}; + if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { + setVisibility(replaceElemIdStr, false); + addDomLoadEvent(function() { + widthStr += ""; // auto-convert to string + heightStr += ""; + var att = {}; + if (attObj && typeof attObj === OBJECT) { + for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs + att[i] = attObj[i]; + } + } + att.data = swfUrlStr; + att.width = widthStr; + att.height = heightStr; + var par = {}; + if (parObj && typeof parObj === OBJECT) { + for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs + par[j] = parObj[j]; + } + } + if (flashvarsObj && typeof flashvarsObj === OBJECT) { + for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs + if (typeof par.flashvars != UNDEF) { + par.flashvars += "&" + k + "=" + flashvarsObj[k]; + } + else { + par.flashvars = k + "=" + flashvarsObj[k]; + } + } + } + if (hasPlayerVersion(swfVersionStr)) { // create SWF + var obj = createSWF(att, par, replaceElemIdStr); + if (att.id == replaceElemIdStr) { + setVisibility(replaceElemIdStr, true); + } + callbackObj.success = true; + callbackObj.ref = obj; + } + else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install + att.data = xiSwfUrlStr; + showExpressInstall(att, par, replaceElemIdStr, callbackFn); + return; + } + else { // show alternative content + setVisibility(replaceElemIdStr, true); + } + if (callbackFn) { callbackFn(callbackObj); } + }); + } + else if (callbackFn) { callbackFn(callbackObj); } + }, + + switchOffAutoHideShow: function() { + autoHideShow = false; + }, + + ua: ua, + + getFlashPlayerVersion: function() { + return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; + }, + + hasFlashPlayerVersion: hasPlayerVersion, + + createSWF: function(attObj, parObj, replaceElemIdStr) { + if (ua.w3) { + return createSWF(attObj, parObj, replaceElemIdStr); + } + else { + return undefined; + } + }, + + showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) { + if (ua.w3 && canExpressInstall()) { + showExpressInstall(att, par, replaceElemIdStr, callbackFn); + } + }, + + removeSWF: function(objElemIdStr) { + if (ua.w3) { + removeSWF(objElemIdStr); + } + }, + + createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) { + if (ua.w3) { + createCSS(selStr, declStr, mediaStr, newStyleBoolean); + } + }, + + addDomLoadEvent: addDomLoadEvent, + + addLoadEvent: addLoadEvent, + + getQueryParamValue: function(param) { + var q = doc.location.search || doc.location.hash; + if (q) { + if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark + if (param == null) { + return urlEncodeIfNecessary(q); + } + var pairs = q.split("&"); + for (var i = 0; i < pairs.length; i++) { + if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { + return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); + } + } + } + return ""; + }, + + // For internal usage only + expressInstallCallback: function() { + if (isExpressInstallActive) { + var obj = getElementById(EXPRESS_INSTALL_ID); + if (obj && storedAltContent) { + obj.parentNode.replaceChild(storedAltContent, obj); + if (storedAltContentId) { + setVisibility(storedAltContentId, true); + if (ua.ie && ua.win) { storedAltContent.style.display = "block"; } + } + if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); } + } + isExpressInstallActive = false; + } + } + }; +}(); diff --git a/spine-as3/src/spine/AnimationState.as b/spine-as3/src/spine/AnimationState.as new file mode 100644 index 000000000..409b5d6a7 --- /dev/null +++ b/spine-as3/src/spine/AnimationState.as @@ -0,0 +1,155 @@ +package spine { +import spine.animation.Animation; + +public class AnimationState { + private var _data:AnimationStateData; + private var current:Animation; + private var previous:Animation; + private var currentTime:Number; + private var previousTime:Number; + private var currentLoop:Boolean; + private var previousLoop:Boolean; + private var mixTime:Number; + private var mixDuration:Number; + private var queue:Vector. = new Vector.(); + + public function AnimationState (data:AnimationStateData) { + if (data == null) + throw new ArgumentError("data cannot be null."); + _data = data; + } + + public function update (delta:Number) : void { + currentTime += delta; + previousTime += delta; + mixTime += delta; + + if (queue.length > 0) { + var entry:QueueEntry = queue[0]; + if (currentTime >= entry.delay) { + setAnimationInternal(entry.animation, entry.loop); + queue.shift(); + } + } + } + + public function apply (skeleton:Skeleton) : void { + if (!current) + return; + if (previous) { + previous.apply(skeleton, previousTime, previousLoop); + var alpha:Number = mixTime / mixDuration; + if (alpha >= 1) { + alpha = 1; + previous = null; + } + current.mix(skeleton, currentTime, currentLoop, alpha); + } else + current.apply(skeleton, currentTime, currentLoop); + } + + public function clearAnimation () : void { + previous = null; + current = null; + clearQueue(); + } + + private function clearQueue () : void { + queue.length = 0; + } + + private function setAnimationInternal (animation:Animation, loop:Boolean) : void { + previous = null; + if (animation != null && current != null) { + mixDuration = _data.getMix(current, animation); + if (mixDuration > 0) { + mixTime = 0; + previous = current; + previousTime = currentTime; + previousLoop = currentLoop; + } + } + current = animation; + currentLoop = loop; + currentTime = 0; + } + + /** @see #setAnimation(Animation, Boolean) */ + public function setAnimationByName (animationName:String, loop:Boolean) : void { + var animation:Animation = _data.skeletonData.findAnimation(animationName); + if (animation == null) + throw new ArgumentError("Animation not found: " + animationName); + setAnimation(animation, loop); + } + + /** Set the current animation. Any queued animations are cleared and the current animation time is set to 0. + * @param animation May be null. */ + public function setAnimation (animation:Animation, loop:Boolean) : void { + clearQueue(); + setAnimationInternal(animation, loop); + } + + /** @see #addAnimation(Animation, Boolean, Number) */ + public function addAnimationByName (animationName:String, loop:Boolean, delay:Number) : void { + var animation:Animation = _data.skeletonData.findAnimation(animationName); + if (animation == null) + throw new ArgumentError("Animation not found: " + animationName); + addAnimation(animation, loop, delay); + } + + /** Adds an animation to be played delay seconds after the current or last queued animation. + * @param delay May be <= 0 to use duration of previous animation minus any mix duration plus the negative delay. */ + public function addAnimation (animation:Animation, loop:Boolean, delay:Number) : void { + var entry:QueueEntry = new QueueEntry(); + entry.animation = animation; + entry.loop = loop; + + if (delay <= 0) { + var previousAnimation:Animation = queue.length == 0 ? current : queue[queue.length - 1].animation; + if (previousAnimation != null) + delay = previousAnimation.duration - _data.getMix(previousAnimation, animation) + delay; + else + delay = 0; + } + entry.delay = delay; + + queue.push(entry); + } + + /** @return May be null. */ + public function get animation () : Animation { + return current; + } + + /** Returns the time within the current animation. */ + public function get time () : Number { + return currentTime; + } + + public function set time (time:Number) : void { + currentTime = time; + } + + /** Returns true if no animation is set or if the current time is greater than the animation duration, regardless of looping. */ + public function get isComplete () : Boolean { + return current == null || currentTime >= current.duration; + } + + public function get data () : AnimationStateData { + return _data; + } + + public function toString () : String { + return (current != null && current.name != null) ? current.name : super.toString(); + } +} + +} + +import spine.animation.Animation; + +class QueueEntry { + public var animation:Animation; + public var loop:Boolean; + public var delay:Number; +} diff --git a/spine-as3/src/spine/AnimationStateData.as b/spine-as3/src/spine/AnimationStateData.as new file mode 100644 index 000000000..0f2261067 --- /dev/null +++ b/spine-as3/src/spine/AnimationStateData.as @@ -0,0 +1,42 @@ +package spine { +import spine.animation.Animation; + +public class AnimationStateData { + private var _skeletonData:SkeletonData; + private var animationToMixTime:Object = new Object(); + + public function AnimationStateData (skeletonData:SkeletonData) { + _skeletonData = skeletonData; + } + + public function get skeletonData () : SkeletonData { + return _skeletonData; + } + + public function setMixByName (fromName:String, toName:String, duration:Number) : void { + var from:Animation = _skeletonData.findAnimation(fromName); + if (from == null) + throw new ArgumentError("Animation not found: " + fromName); + var to:Animation = _skeletonData.findAnimation(toName); + if (to == null) + throw new ArgumentError("Animation not found: " + toName); + setMix(from, to, duration); + } + + public function setMix (from:Animation, to:Animation, duration:Number) : void { + if (from == null) + throw new ArgumentError("from cannot be null."); + if (to == null) + throw new ArgumentError("to cannot be null."); + animationToMixTime[from.name + ":" + to.name] = duration; + } + + public function getMix (from:Animation, to:Animation) : Number { + var time:Object = animationToMixTime[from.name + ":" + to.name]; + if (time == null) + return 0; + return time as Number; + } +} + +} diff --git a/spine-as3/src/spine/Bone.as b/spine-as3/src/spine/Bone.as new file mode 100644 index 000000000..a63321144 --- /dev/null +++ b/spine-as3/src/spine/Bone.as @@ -0,0 +1,126 @@ +package spine { + +public class Bone { + static public var yDown:Boolean; + + internal var _data:BoneData; + internal var _parent:Bone; + public var x:Number; + public var y:Number; + public var rotation:Number; + public var scaleX:Number + public var scaleY:Number; + + internal var _m00:Number; + internal var _m01:Number; + internal var _m10:Number; + internal var _m11:Number; + internal var _worldX:Number; + internal var _worldY:Number; + internal var _worldRotation:Number; + internal var _worldScaleX:Number; + internal var _worldScaleY:Number; + + /** @param parent May be null. */ + public function Bone (data:BoneData, parent:Bone) { + if (data == null) + throw new ArgumentError("data cannot be null."); + _data = data; + _parent = parent; + setToBindPose(); + } + + /** Computes the world SRT using the parent bone and the local SRT. */ + public function updateWorldTransform (flipX:Boolean, flipY:Boolean) : void { + if (_parent != null) { + _worldX = x * _parent._m00 + y * _parent._m01 + _parent._worldX; + _worldY = x * _parent._m10 + y * _parent._m11 + _parent._worldY; + _worldScaleX = _parent._worldScaleX * scaleX; + _worldScaleY = _parent._worldScaleY * scaleY; + _worldRotation = _parent._worldRotation + rotation; + } else { + _worldX = x; + _worldY = y; + _worldScaleX = scaleX; + _worldScaleY = scaleY; + _worldRotation = rotation; + } + var radians:Number = _worldRotation * Math.PI / 180; + var cos:Number = Math.cos(radians); + var sin:Number = Math.sin(radians); + _m00 = cos * _worldScaleX; + _m10 = sin * _worldScaleX; + _m01 = -sin * _worldScaleY; + _m11 = cos * _worldScaleY; + if (flipX) { + _m00 = -_m00; + _m01 = -_m01; + } + if (flipY) { + _m10 = -_m10; + _m11 = -_m11; + } + if (yDown) { + _m10 = -_m10; + _m11 = -_m11; + } + } + + public function setToBindPose () : void { + x = _data.x; + y = _data.y; + rotation = _data.rotation; + scaleX = _data.scaleX; + scaleY = _data.scaleY; + } + + public function get data () : BoneData { + return _data; + } + + public function get parent () : Bone { + return _parent; + } + + public function get m00 () : Number { + return _m00; + } + + public function get m01 () : Number { + return _m01; + } + + public function get m10 () : Number { + return _m10; + } + + public function get m11 () : Number { + return _m11; + } + + public function get worldX () : Number { + return _worldX; + } + + public function get worldY () : Number { + return _worldY; + } + + public function get worldRotation () : Number { + return _worldRotation; + } + + public function get worldScaleX () : Number { + return _worldScaleX; + } + + public function get worldScaleY () : Number { + return _worldScaleY; + } + + public function toString () : String { + return _data._name; + } +} + +} diff --git a/spine-as3/src/spine/BoneData.as b/spine-as3/src/spine/BoneData.as new file mode 100644 index 000000000..f73b2d298 --- /dev/null +++ b/spine-as3/src/spine/BoneData.as @@ -0,0 +1,35 @@ +package spine { + +public class BoneData { + internal var _parent:BoneData; + internal var _name:String; + public var length:Number; + public var x:Number; + public var y:Number; + public var rotation:Number; + public var scaleX:Number = 1; + public var scaleY:Number = 1; + + /** @param parent May be null. */ + public function BoneData (name:String, parent:BoneData) { + if (name == null) + throw new ArgumentError("name cannot be null."); + _name = name; + _parent = parent; + } + + /** @return May be null. */ + public function get parent () : BoneData { + return _parent; + } + + public function get name () : String { + return _name; + } + + public function toString () : String { + return _name; + } +} + +} diff --git a/spine-as3/src/spine/Skeleton.as b/spine-as3/src/spine/Skeleton.as new file mode 100644 index 000000000..80973ad1c --- /dev/null +++ b/spine-as3/src/spine/Skeleton.as @@ -0,0 +1,197 @@ +package spine { +import spine.attachments.Attachment; + +public class Skeleton { + internal var _data:SkeletonData; + internal var _bones:Vector.; + internal var _slots:Vector.; + internal var _drawOrder:Vector.; + internal var _skin:Skin; + public var r:int = 1; + public var g:int = 1; + public var b:int = 1; + public var a:int = 1; + public var time:Number; + public var flipX:Boolean; + public var flipY:Boolean; + + public function Skeleton (data:SkeletonData) { + if (data == null) + throw new ArgumentError("data cannot be null."); + _data = data; + + _bones = new Vector.(); + for each (var boneData:BoneData in data.bones) { + var parent:Bone = boneData.parent == null ? null : _bones[data.bones.indexOf(boneData.parent)]; + _bones.push(new Bone(boneData, parent)); + } + + _slots = new Vector.(); + _drawOrder = new Vector.(); + for each (var slotData:SlotData in data.slots) { + var bone:Bone = _bones[data.bones.indexOf(slotData.boneData)]; + var slot:Slot = new Slot(slotData, this, bone); + _slots.push(slot); + _drawOrder.push(slot); + } + } + + /** Updates the world transform for each bone. */ + public function updateWorldTransform () : void { + for each (var bone:Bone in _bones) + bone.updateWorldTransform(flipX, flipY); + } + + /** Sets the bones and slots to their bind pose values. */ + public function setToBindPose () : void { + setBonesToBindPose(); + setSlotsToBindPose(); + } + + public function setBonesToBindPose () : void { + for each (var bone:Bone in _bones) + bone.setToBindPose(); + } + + public function setSlotsToBindPose () : void { + for each (var slot:Slot in _slots) + slot.setToBindPose(); + } + + public function get data () : SkeletonData { + return _data; + } + + public function get bones () : Vector. { + return _bones; + } + + public function get rootBone () : SkeletonData { + if (_bones.length == 0) + return null; + return _bones[0]; + } + + /** @return May be null. */ + public function findBone (boneName:String) : Bone { + if (boneName == null) + throw new ArgumentError("boneName cannot be null."); + for each (var bone:Bone in _bones) + if (bone.data.name == boneName) + return bone; + return null; + } + + /** @return -1 if the bone was not found. */ + public function findBoneIndex (boneName:String) : int { + if (boneName == null) + throw new ArgumentError("boneName cannot be null."); + var i:int = 0; + for each (var bone:Bone in _bones) { + if (bone.data.name == boneName) + return i; + i++; + } + return -1; + } + + public function get slots () : Vector. { + return _slots; + } + + /** @return May be null. */ + public function findSlot (slotName:String) : Slot { + if (slotName == null) + throw new ArgumentError("slotName cannot be null."); + for each (var slot:Slot in _slots) + if (slot.data.name == slotName) + return slot; + return null; + } + + /** @return -1 if the bone was not found. */ + public function findSlotIndex (slotName:String) : int { + if (slotName == null) + throw new ArgumentError("slotName cannot be null."); + var i:int = 0; + for each (var slot:Slot in _slots) { + if (slot.data.name == slotName) + return i; + i++; + } + return -1; + } + + public function get drawOrder () : Vector. { + return _drawOrder; + } + + public function get skin () : Skin { + return _skin; + } + + public function set skinName (skinName:String) : void { + var skin:Skin = data.findSkin(skinName); + if (skin == null) + throw new ArgumentError("Skin not found: " + skinName); + this.skin = skin; + } + + /** Sets the skin used to look up attachments not found in the {@link SkeletonData#getDefaultSkin() default skin}. Attachments + * from the new skin are attached if the corresponding attachment from the old skin was attached. + * @param newSkin May be null. */ + public function set skin (newSkin:Skin) : void { + if (skin != null && newSkin != null) + newSkin.attachAll(this, skin); + skin = newSkin; + } + + /** @return May be null. */ + public function getAttachmentForSlotName (slotName:String, attachmentName:String) : Attachment { + return getAttachmentForSlotIndex(data.findSlotIndex(slotName), attachmentName); + } + + /** @return May be null. */ + public function getAttachmentForSlotIndex (slotIndex:int, attachmentName:String) : Attachment { + if (attachmentName == null) + throw new ArgumentError("attachmentName cannot be null."); + if (skin != null) { + var attachment:Attachment = skin.getAttachment(slotIndex, attachmentName); + if (attachment != null) + return attachment; + } + if (data.defaultSkin != null) + return data.defaultSkin.getAttachment(slotIndex, attachmentName); + return null; + } + + /** @param attachmentName May be null. */ + public function setAttachment (slotName:String, attachmentName:String) : void { + if (slotName == null) + throw new ArgumentError("slotName cannot be null."); + var i:int = 0; + for each (var slot:Slot in _slots) { + if (slot.data.name == slotName) { + var attachment:Attachment = null; + if (attachmentName != null) { + attachment = getAttachmentForSlotIndex(i, attachmentName); + if (attachment == null) + throw new ArgumentError("Attachment not found: " + attachmentName + ", for slot: " + slotName); + } + slot.attachment = attachment; + return; + } + } + throw new ArgumentError("Slot not found: " + slotName); + } + + public function update (delta:Number) : void { + time += delta; + } + + public function toString () : String { + return _data.name != null ? _data.name : super.toString(); + } +} + +} diff --git a/spine-as3/src/spine/SkeletonData.as b/spine-as3/src/spine/SkeletonData.as new file mode 100644 index 000000000..743348de4 --- /dev/null +++ b/spine-as3/src/spine/SkeletonData.as @@ -0,0 +1,117 @@ +package spine { +import spine.animation.Animation; + +public class SkeletonData { + public var name:String; + public var bones:Vector. = new Vector.(); // Ordered parents first. + public var slots:Vector. = new Vector.(); // Bind pose draw order. + public var skins:Vector. = new Vector.(); + public var defaultSkin:Skin; + public var animations:Vector. = new Vector.(); + + // --- Bones. + + public function addBone (bone:BoneData) : void { + if (bone == null) + throw new ArgumentError("bone cannot be null."); + bones.push(bone); + } + + /** @return May be null. */ + public function findBone (boneName:String) : BoneData { + if (boneName == null) + throw new ArgumentError("boneName cannot be null."); + for (var i:int = 0, n:int = bones.length; i < n; i++) { + var bone:BoneData = bones[i]; + if (bone._name == boneName) + return bone; + } + return null; + } + + /** @return -1 if the bone was not found. */ + public function findBoneIndex (boneName:String) : int { + if (boneName == null) + throw new ArgumentError("boneName cannot be null."); + for (var i:int = 0, n:int = bones.length; i < n; i++) + if (bones[i]._name == boneName) + return i; + return -1; + } + + // --- Slots. + + public function addSlot (slot:SlotData) : void { + if (slot == null) + throw new ArgumentError("slot cannot be null."); + slots.push(slot); + } + + /** @return May be null. */ + public function findSlot (slotName:String) : SlotData { + if (slotName == null) + throw new ArgumentError("slotName cannot be null."); + for (var i:int = 0, n:int = slots.length; i < n; i++) { + var slot:SlotData = slots[i]; + if (slot._name == slotName) + return slot; + } + return null; + } + + /** @return -1 if the bone was not found. */ + public function findSlotIndex (slotName:String) : int { + if (slotName == null) + throw new ArgumentError("slotName cannot be null."); + for (var i:int = 0, n:int = slots.length; i < n; i++) + if (slots[i]._name == slotName) + return i; + return -1; + } + + // --- Skins. + + public function addSkin (skin:Skin) : void { + if (skin == null) + throw new ArgumentError("skin cannot be null."); + skins.push(skin); + } + + /** @return May be null. */ + public function findSkin (skinName:String) : Skin { + if (skinName == null) + throw new ArgumentError("skinName cannot be null."); + for each (var skin:Skin in skins) + if (skin._name == skinName) + return skin; + return null; + } + + // --- Animations. + + public function addAnimation (animation:Animation) : void { + if (animation == null) + throw new ArgumentError("animation cannot be null."); + animations.push(animation); + } + + /** @return May be null. */ + public function findAnimation (animationName:String) : Animation { + if (animationName == null) + throw new ArgumentError("animationName cannot be null."); + for (var i:int = 0, n:int = animations.length; i < n; i++) { + var animation:Animation = animations[i]; + if (animation.name == animationName) + return animation; + } + return null; + } + + // --- + + public function toString () : String { + return name != null ? name : super.toString(); + } +} + +} diff --git a/spine-as3/src/spine/SkeletonJson.as b/spine-as3/src/spine/SkeletonJson.as new file mode 100644 index 000000000..483511b6e --- /dev/null +++ b/spine-as3/src/spine/SkeletonJson.as @@ -0,0 +1,249 @@ +package spine { +import spine.animation.Animation; +import spine.animation.AttachmentTimeline; +import spine.animation.ColorTimeline; +import spine.animation.CurveTimeline; +import spine.animation.RotateTimeline; +import spine.animation.ScaleTimeline; +import spine.animation.Timeline; +import spine.animation.TranslateTimeline; +import spine.attachments.Attachment; +import spine.attachments.AttachmentLoader; +import spine.attachments.AttachmentType; +import spine.attachments.RegionAttachment; + +public class SkeletonJson { + static public const TIMELINE_SCALE:String = "scale"; + static public const TIMELINE_ROTATE:String = "rotate"; + static public const TIMELINE_TRANSLATE:String = "translate"; + static public const TIMELINE_ATTACHMENT:String = "attachment"; + static public const TIMELINE_COLOR:String = "color"; + + public var attachmentLoader:AttachmentLoader; + public var scale:Number = 1; + + public function SkeletonJson (attachmentLoader:AttachmentLoader = null) { + this.attachmentLoader = attachmentLoader; + } + + public function readSkeletonData (json:String, name:String) : SkeletonData { + if (json == null) + throw new ArgumentError("json cannot be null."); + + var skeletonData:SkeletonData = new SkeletonData(); + skeletonData.name = name; + + var root:Object = JSON.parse(json); + + // Bones. + var boneData:BoneData; + for each (var boneMap:Object in root["bones"]) { + var parent:BoneData = null; + var parentName:String = boneMap["parent"]; + if (parentName) { + parent = skeletonData.findBone(parentName); + if (!parent) + throw new Error("Parent bone not found: " + parentName); + } + boneData = new BoneData(boneMap["name"], parent); + boneData.length = (boneMap["length"] || 0) * scale; + boneData.x = (boneMap["x"] || 0) * scale; + boneData.y = (boneMap["y"] || 0) * scale; + boneData.rotation = (boneMap["rotation"] || 0); + boneData.scaleX = boneMap["scaleX"] || 1; + boneData.scaleY = boneMap["scaleY"] || 1; + skeletonData.addBone(boneData); + } + + // Slots. + for each (var slotMap:Object in root["slots"]) { + var boneName:String = slotMap["bone"]; + boneData = skeletonData.findBone(boneName); + if (!boneData) + throw new Error("Slot bone not found: " + boneName); + var slotData:SlotData = new SlotData(slotMap["name"], boneData); + + var color:String = slotMap["color"]; + if (color) { + slotData.r = toColor(color, 0); + slotData.g = toColor(color, 1); + slotData.b = toColor(color, 2); + slotData.a = toColor(color, 3); + } + + slotData.attachmentName = slotMap["attachment"]; + + skeletonData.addSlot(slotData); + } + + // Skins. + var skins:Object = root["skins"]; + for (var skinName:String in skins) { + var skinMap:Object = skins[skinName]; + var skin:Skin = new Skin(skinName); + for (var slotName:String in skinMap) { + var slotIndex:int = skeletonData.findSlotIndex(slotName); + var slotEntry:Object = skinMap[slotName]; + for (var attachmentName:String in slotEntry) { + var attachment:Attachment = readAttachment(skin, attachmentName, slotEntry[attachmentName]); + if (attachment != null) + skin.addAttachment(slotIndex, attachmentName, attachment); + } + } + skeletonData.addSkin(skin); + if (skin.name == "default") + skeletonData.defaultSkin = skin; + } + + // Animations. + var animations:Object = root["animations"]; + for (var animationName:String in animations) + readAnimation(animationName, animations[animationName], skeletonData); + + return skeletonData; + } + + private function readAttachment (skin:Skin, name:String, map:Object) : Attachment { + name = map["name"] || name; + + var type:AttachmentType = AttachmentType.valueOf(map["type"] || "region"); + var attachment:Attachment = attachmentLoader.newAttachment(skin, type, name); + + if (attachment is RegionAttachment) { + var regionAttachment:RegionAttachment = attachment as RegionAttachment; + regionAttachment.x = (map["x"] || 0) * scale; + regionAttachment.y = (map["y"] || 0) * scale; + regionAttachment.scaleX = map["scaleX"] || 1; + regionAttachment.scaleY = map["scaleY"] || 1; + regionAttachment.rotation = map["rotation"] || 0; + regionAttachment.width = (map["width"] || 32) * scale; + regionAttachment.height = (map["height"] || 32) * scale; + regionAttachment.updateOffset(); + } + + return attachment; + } + + private function readAnimation (name:String, map:Object, skeletonData:SkeletonData) : void { + var timelines:Vector. = new Vector.(); + var duration:Number = 0; + + var bones:Object = map["bones"]; + for (var boneName:String in bones) { + var boneIndex:int = skeletonData.findBoneIndex(boneName); + if (boneIndex == -1) + throw new Error("Bone not found: " + boneName); + var boneMap:Object = bones[boneName]; + + for (var timelineName:Object in boneMap) { + var timelineMap:Object = boneMap[timelineName]; + if (timelineName == TIMELINE_ROTATE) { + var timeline:RotateTimeline = new RotateTimeline(count(timelineMap)); + timeline.boneIndex = boneIndex; + + var frameIndex:int = 0; + for each (var valueMap:Object in timelineMap) { + timeline.setFrame(frameIndex, valueMap["time"], valueMap["angle"]); + readCurve(timeline, frameIndex, valueMap); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.frameCount * 2 - 2]); + + } else if (timelineName == TIMELINE_TRANSLATE || timelineName == TIMELINE_SCALE) { + var timeline1:TranslateTimeline; + var timelineScale:Number = 1; + if (timelineName == TIMELINE_SCALE) + timeline1 = new ScaleTimeline(count(timelineMap)); + else { + timeline1 = new TranslateTimeline(count(timelineMap)); + timelineScale = scale; + } + timeline1.boneIndex = boneIndex; + + var frameIndex1:int = 0; + for each (var valueMap1:Object in timelineMap) { + var x:Number = (valueMap1["x"] || 0) * timelineScale; + var y:Number = (valueMap1["y"] || 0) * timelineScale; + timeline1.setFrame(frameIndex1, valueMap1["time"], x, y); + readCurve(timeline1, frameIndex1, valueMap1); + frameIndex1++; + } + timelines.push(timeline1); + duration = Math.max(duration, timeline1.frames[timeline1.frameCount * 3 - 3]); + + } else + throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); + } + } + + var slots:Object = map["slots"]; + for (var slotName:String in slots) { + var slotMap:Object = slots[slotName]; + var slotIndex:int = skeletonData.findSlotIndex(slotName); + + for (var timelineName2:Object in boneMap) { + var timelineMap2:Object = boneMap[timelineName2]; + if (timelineName2 == TIMELINE_COLOR) { + var timeline2:ColorTimeline = new ColorTimeline(count(timelineMap2)); + timeline2.slotIndex = slotIndex; + + var frameIndex2:int = 0; + for each (var valueMap2:Object in timelineMap2) { + var color:String = valueMap["color"]; + var r:Number = toColor(color, 0); + var g:Number = toColor(color, 1); + var b:Number = toColor(color, 2); + var a:Number = toColor(color, 3); + timeline2.setFrame(frameIndex2, valueMap2["time"], r, g, b, a); + readCurve(timeline2, frameIndex2, valueMap); + frameIndex2++; + } + timelines.push(timeline2); + duration = Math.max(duration, timeline2.frames[timeline2.frameCount * 5 - 5]); + + } else if (timelineName2 == TIMELINE_ATTACHMENT) { + var timeline3:AttachmentTimeline = new AttachmentTimeline(count(timelineMap2)); + timeline3.slotIndex = slotIndex; + + var frameIndex3:int = 0; + for each (var valueMap3:Object in timelineMap2) { + timeline3.setFrame(frameIndex3++, valueMap3["time"], valueMap3["name"]); + } + timelines.push(timeline); + duration = Math.max(duration, timeline3.frames[timeline3.frameCount - 1]); + + } else + throw new Error("Invalid timeline type for a slot: " + timelineName2 + " (" + slotName + ")"); + } + } + + skeletonData.addAnimation(new Animation(name, timelines, duration)); + } + + private function readCurve (timeline:CurveTimeline, frameIndex:int, valueMap:Object) : void { + var curve:Object = valueMap["curve"]; + if (curve == null) + return; + if (curve == "stepped") + timeline.setStepped(frameIndex); + else if (curve is Array) { + timeline.setCurve(frameIndex, curve[0], curve[1], curve[2], curve[3]); + } + } + + static private function toColor (hexString:String, colorIndex:int) : Number { + if (hexString.length != 8) + throw new ArgumentError("Color hexidecimal length must be 8, recieved: " + hexString); + return parseInt(hexString.substring(colorIndex * 2, 2), 16) / 255; + } + + static private function count (map:Object) : int { + var count:int = 0; + for (var key:String in map) + count++; + return count; + } +} + +} diff --git a/spine-as3/src/spine/Skin.as b/spine-as3/src/spine/Skin.as new file mode 100644 index 000000000..68d21d7e1 --- /dev/null +++ b/spine-as3/src/spine/Skin.as @@ -0,0 +1,50 @@ +package spine { +import spine.attachments.Attachment; + +/** Stores attachments by slot index and attachment name. */ +public class Skin { + internal var _name:String; + private var attachments:Object = new Object(); + + public function Skin (name:String) { + if (name == null) + throw new ArgumentError("name cannot be null."); + _name = name; + } + + public function addAttachment (slotIndex:int, name:String, attachment:Attachment) : void { + if (attachment == null) + throw new ArgumentError("attachment cannot be null."); + attachments[slotIndex + ":" + name] = attachment; + } + + /** @return May be null. */ + public function getAttachment (slotIndex:int, name:String) : Attachment { + return attachments[slotIndex + ":" + name]; + } + + public function get name () : String { + return _name; + } + + public function toString () : String { + return _name; + } + + /** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */ + public function attachAll (skeleton:Skeleton, oldSkin:Skin) : void { + for each (var key:String in oldSkin.attachments) { + var colon:int = key.indexOf(":"); + var slotIndex:int = parseInt(key.substring(0, colon)); + var name:String = key.substring(colon + 1); + var slot:Slot = skeleton.slots[slotIndex]; + if (slot.attachment.name == name) { + var attachment:Attachment = getAttachment(slotIndex, name); + if (attachment != null) + slot.attachment = attachment; + } + } + } +} + +} diff --git a/spine-as3/src/spine/Slot.as b/spine-as3/src/spine/Slot.as new file mode 100644 index 000000000..61063aa14 --- /dev/null +++ b/spine-as3/src/spine/Slot.as @@ -0,0 +1,75 @@ +package spine { +import spine.attachments.Attachment; + +public class Slot { + internal var _data:SlotData; + internal var _bone:Bone; + internal var _skeleton:Skeleton; + public var r:Number; + public var g:Number; + public var b:Number; + public var a:Number; + internal var _attachment:Attachment; + private var _attachmentTime:Number; + + public function Slot (data:SlotData, skeleton:Skeleton, bone:Bone) { + if (data == null) + throw new ArgumentError("data cannot be null."); + if (skeleton == null) + throw new ArgumentError("skeleton cannot be null."); + if (bone == null) + throw new ArgumentError("bone cannot be null."); + _data = data; + _skeleton = skeleton; + _bone = bone; + setToBindPose(); + } + + public function get data () : SlotData { + return _data; + } + + public function get skeleton () : Skeleton { + return _skeleton; + } + + public function get bone () : Bone { + return _bone; + } + + /** @return May be null. */ + public function get attachment () : Attachment { + return _attachment; + } + + /** Sets the attachment and resets {@link #getAttachmentTime()}. + * @param attachment May be null. */ + public function set attachment (attachment:Attachment) : void { + _attachment = attachment; + _attachmentTime = _skeleton.time; + } + + public function set attachmentTime (time:Number) : void { + _attachmentTime = skeleton.time - time; + } + + /** Returns the time since the attachment was set. */ + public function get attachmentTime () : Number { + return skeleton.time - _attachmentTime; + } + + public function setToBindPose () : void { + var slotIndex:int = skeleton.data.slots.indexOf(data); + r = _data.r; + g = _data.g; + b = _data.b; + a = _data.a; + attachment = _data.attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, data.attachmentName); + } + + public function toString () : String { + return _data.name; + } +} + +} diff --git a/spine-as3/src/spine/SlotData.as b/spine-as3/src/spine/SlotData.as new file mode 100644 index 000000000..d5884993e --- /dev/null +++ b/spine-as3/src/spine/SlotData.as @@ -0,0 +1,34 @@ +package spine { + +public class SlotData { + internal var _name:String; + internal var _boneData:BoneData; + public var r:Number = 1; + public var g:Number = 1; + public var b:Number = 1; + public var a:Number = 1; + public var attachmentName:String; + + public function SlotData (name:String, boneData:BoneData) { + if (name == null) + throw new ArgumentError("name cannot be null."); + if (boneData == null) + throw new ArgumentError("boneData cannot be null."); + _name = name; + _boneData = boneData; + } + + public function get name () : String { + return _name; + } + + public function get boneData () : BoneData { + return _boneData; + } + + public function toString () : String { + return _name; + } +} + +} diff --git a/spine-as3/src/spine/animation/Animation.as b/spine-as3/src/spine/animation/Animation.as new file mode 100644 index 000000000..ea8b890a6 --- /dev/null +++ b/spine-as3/src/spine/animation/Animation.as @@ -0,0 +1,83 @@ +package spine.animation { +import spine.Skeleton; + +public class Animation { + internal var _name:String; + private var _timelines:Vector.; + public var duration:Number; + + public function Animation (name:String, timelines:Vector., duration:Number) { + if (name == null) + throw new ArgumentError("name cannot be null."); + if (timelines == null) + throw new ArgumentError("timelines cannot be null."); + _name = name; + _timelines = timelines; + this.duration = duration; + } + + public function get timelines () : Vector. { + return _timelines; + } + + /** Poses the skeleton at the specified time for this animation. */ + public function apply (skeleton:Skeleton, time:Number, loop:Boolean) : void { + if (skeleton == null) + throw new ArgumentError("skeleton cannot be null."); + + if (loop && duration != 0) + time %= duration; + + for (var i:int = 0, n:int = timelines.length; i < n; i++) + timelines[i].apply(skeleton, time, 1); + } + + /** Poses the skeleton at the specified time for this animation mixed with the current pose. + * @param alpha The amount of this animation that affects the current pose. */ + public function mix (skeleton:Skeleton, time:Number, loop:Boolean, alpha:Number) : void { + if (skeleton == null) + throw new ArgumentError("skeleton cannot be null."); + + if (loop && duration != 0) + time %= duration; + + for (var i:int = 0, n:int = timelines.length; i < n; i++) + timelines[i].apply(skeleton, time, alpha); + } + + public function get name () : String { + return _name; + } + + public function toString () : String { + return _name; + } + + /** @param target After the first and before the last entry. */ + static public function binarySearch (values:Vector., target:Number, step:int) : int { + var low:int = 0; + var high:int = values.length / step - 2; + if (high == 0) + return step; + var current:int = high >>> 1; + while (true) { + if (values[(current + 1) * step] <= target) + low = current + 1; + else + high = current; + if (low == high) + return (low + 1) * step; + current = (low + high) >>> 1; + } + return 0; // Can't happen. + } + + static public function linearSearch (values:Vector., target:Number, step:int) : int { + for (var i:int = 0, last:int = values.length - step; i <= last; i += step) + if (values[i] > target) + return i; + return -1; + } +} + +} diff --git a/spine-as3/src/spine/animation/AttachmentTimeline.as b/spine-as3/src/spine/animation/AttachmentTimeline.as new file mode 100644 index 000000000..b33525c4d --- /dev/null +++ b/spine-as3/src/spine/animation/AttachmentTimeline.as @@ -0,0 +1,42 @@ +package spine.animation { +import spine.Skeleton; + +public class AttachmentTimeline implements Timeline { + public var slotIndex:int; + private var _frameCount:int; + public var frames:Vector. = new Vector.(); // time, ... + public var attachmentNames:Vector. = new Vector.(); + + public function AttachmentTimeline (frameCount:int) { + _frameCount = frameCount; + frames.length = frameCount; + attachmentNames = new String[frameCount]; + attachmentNames.length = frameCount; + } + + public function get frameCount () : int { + return _frameCount; + } + + /** Sets the time and value of the specified keyframe. */ + public function setFrame (frameIndex:int, time:Number, attachmentName:String) : void { + frames[frameIndex] = time; + attachmentNames[frameIndex] = attachmentName; + } + + public function apply (skeleton:Skeleton, time:Number, alpha:Number) : void { + if (time < frames[0]) + return; // Time is before first frame. + + var frameIndex:int; + if (time >= frames[frames.length - 1]) // Time is after last frame. + frameIndex = frames.length - 1; + else + frameIndex = Animation.binarySearch(frames, time, 1) - 1; + + var attachmentName:String = attachmentNames[frameIndex]; + skeleton.slots[slotIndex].setAttachment(attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName)); + } +} + +} diff --git a/spine-as3/src/spine/animation/ColorTimeline.as b/spine-as3/src/spine/animation/ColorTimeline.as new file mode 100644 index 000000000..346c76ef7 --- /dev/null +++ b/spine-as3/src/spine/animation/ColorTimeline.as @@ -0,0 +1,73 @@ +package spine.animation { +import spine.Skeleton; +import spine.Slot; + +public class ColorTimeline extends CurveTimeline { + static private const LAST_FRAME_TIME:int = -5; + static private const FRAME_R:int = 1; + static private const FRAME_G:int = 2; + static private const FRAME_B:int = 3; + static private const FRAME_A:int = 4; + + public var slotIndex:int; + public var frames:Vector. = new Vector.(); // time, r, g, b, a, ... + + public function ColorTimeline (frameCount:int) { + super(frameCount); + frames.length = frameCount * 5; + } + + /** Sets the time and value of the specified keyframe. */ + public function setFrame (frameIndex:int, time:Number, r:Number, g:Number, b:Number, a:Number) : void { + frameIndex *= 5; + frames[frameIndex] = time; + frames[frameIndex + 1] = r; + frames[frameIndex + 2] = g; + frames[frameIndex + 3] = b; + frames[frameIndex + 4] = a; + } + + override public function apply (skeleton:Skeleton, time:Number, alpha:Number) : void { + if (time < frames[0]) + return; // Time is before first frame. + + var slot:Slot = skeleton.slots[slotIndex]; + + if (time >= frames[frames.length - 5]) { // Time is after last frame. + var i:int = frames.length - 1; + slot.r = frames[i - 3]; + slot.g = frames[i - 2]; + slot.b = frames[i - 1]; + slot.a = frames[i]; + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex:int = Animation.binarySearch(frames, time, 5); + var lastFrameR:Number = frames[frameIndex - 4]; + var lastFrameG:Number = frames[frameIndex - 3]; + var lastFrameB:Number = frames[frameIndex - 2]; + var lastFrameA:Number = frames[frameIndex - 1]; + var frameTime:Number = frames[frameIndex]; + var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); + percent = getCurvePercent(frameIndex / 5 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + + var r:Number = lastFrameR + (frames[frameIndex + FRAME_R] - lastFrameR) * percent; + var g:Number = lastFrameG + (frames[frameIndex + FRAME_G] - lastFrameG) * percent; + var b:Number = lastFrameB + (frames[frameIndex + FRAME_B] - lastFrameB) * percent; + var a:Number = lastFrameA + (frames[frameIndex + FRAME_A] - lastFrameA) * percent; + if (alpha < 1) { + slot.r += (r - slot.r) * alpha; + slot.g += (g - slot.g) * alpha; + slot.b += (b - slot.b) * alpha; + slot.a += (a - slot.a) * alpha; + } else { + slot.r = r; + slot.g = g; + slot.b = b; + slot.a = a; + } + } +} + +} diff --git a/spine-as3/src/spine/animation/CurveTimeline.as b/spine-as3/src/spine/animation/CurveTimeline.as new file mode 100644 index 000000000..19c6445cb --- /dev/null +++ b/spine-as3/src/spine/animation/CurveTimeline.as @@ -0,0 +1,92 @@ +package spine.animation { +import spine.Skeleton; + +/** Base class for frames that use an interpolation bezier curve. */ +public class CurveTimeline implements Timeline { + static private const LINEAR:Number = 0; + static private const STEPPED:Number = -1; + static private const BEZIER_SEGMENTS:int = 10; + + private var curves:Vector. = new Vector.(); // dfx, dfy, ddfx, ddfy, dddfx, dddfy, ... + private var _frameCount:int; + + public function CurveTimeline (frameCount:int) { + _frameCount = frameCount; + curves.length = frameCount * 6; + } + + public function apply (skeleton:Skeleton, time:Number, alpha:Number) : void { + } + + public function get frameCount () : int { + return _frameCount; + } + + public function setLinear (frameIndex:int) : void { + curves[frameIndex * 6] = LINEAR; + } + + public function setStepped (frameIndex:int) : void { + curves[frameIndex * 6] = STEPPED; + } + + /** Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next. + * cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of + * the difference between the keyframe's values. */ + public function setCurve (frameIndex:int, cx1:Number, cy1:Number, cx2:Number, cy2:Number) : void { + var subdiv_step:Number = 1 / BEZIER_SEGMENTS; + var subdiv_step2:Number = subdiv_step * subdiv_step; + var subdiv_step3:Number = subdiv_step2 * subdiv_step; + var pre1:Number = 3 * subdiv_step; + var pre2:Number = 3 * subdiv_step2; + var pre4:Number = 6 * subdiv_step2; + var pre5:Number = 6 * subdiv_step3; + var tmp1x:Number = -cx1 * 2 + cx2; + var tmp1y:Number = -cy1 * 2 + cy2; + var tmp2x:Number = (cx1 - cx2) * 3 + 1; + var tmp2y:Number = (cy1 - cy2) * 3 + 1; + var i:int = frameIndex * 6; + curves[i] = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3; + curves[i + 1] = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3; + curves[i + 2] = tmp1x * pre4 + tmp2x * pre5; + curves[i + 3] = tmp1y * pre4 + tmp2y * pre5; + curves[i + 4] = tmp2x * pre5; + curves[i + 5] = tmp2y * pre5; + } + + public function getCurvePercent (frameIndex:int, percent:Number) : Number { + var curveIndex:int = frameIndex * 6; + var dfx:Number = curves[curveIndex]; + if (dfx == LINEAR) + return percent; + if (dfx == STEPPED) + return 0; + var dfy:Number = curves[curveIndex + 1]; + var ddfx:Number = curves[curveIndex + 2]; + var ddfy:Number = curves[curveIndex + 3]; + var dddfx:Number = curves[curveIndex + 4]; + var dddfy:Number = curves[curveIndex + 5]; + var x:Number = dfx; + var y:Number = dfy; + var i:int = BEZIER_SEGMENTS - 2; + while (true) { + if (x >= percent) { + var lastX:Number = x - dfx; + var lastY:Number = y - dfy; + return lastY + (y - lastY) * (percent - lastX) / (x - lastX); + } + if (i == 0) + break; + i--; + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + x += dfx; + y += dfy; + } + return y + (1 - y) * (percent - x) / (1 - x); // Last point is 1,1. + } +} + +} diff --git a/spine-as3/src/spine/animation/RotateTimeline.as b/spine-as3/src/spine/animation/RotateTimeline.as new file mode 100644 index 000000000..bf7247c4c --- /dev/null +++ b/spine-as3/src/spine/animation/RotateTimeline.as @@ -0,0 +1,62 @@ +package spine.animation { +import spine.Bone; +import spine.Skeleton; + +public class RotateTimeline extends CurveTimeline { + static private const LAST_FRAME_TIME:int = -2; + static private const FRAME_VALUE:int = 1; + + public var boneIndex:int; + public var frames:Vector. = new Vector.(); // time, value, ... + + public function RotateTimeline (frameCount:int) { + super(frameCount); + frames.length = frameCount * 2; + } + + /** Sets the time and angle of the specified keyframe. */ + public function setFrame (frameIndex:int, time:Number, angle:Number) : void { + frameIndex *= 2; + frames[frameIndex] = time; + frames[frameIndex + 1] = angle; + } + + override public function apply (skeleton:Skeleton, time:Number, alpha:Number) : void { + if (time < frames[0]) + return; // Time is before first frame. + + var bone:Bone = skeleton.bones[boneIndex]; + + var amount:Number; + if (time >= frames[frames.length - 2]) { // Time is after last frame. + amount = bone.data.rotation + frames[frames.length - 1] - bone.rotation; + while (amount > 180) + amount -= 360; + while (amount < -180) + amount += 360; + bone.rotation += amount * alpha; + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex:int = Animation.binarySearch(frames, time, 2); + var lastFrameValue:Number = frames[frameIndex - 1]; + var frameTime:Number = frames[frameIndex]; + var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); + percent = getCurvePercent(frameIndex / 2 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + + amount = frames[frameIndex + FRAME_VALUE] - lastFrameValue; + while (amount > 180) + amount -= 360; + while (amount < -180) + amount += 360; + amount = bone.data.rotation + (lastFrameValue + amount * percent) - bone.rotation; + while (amount > 180) + amount -= 360; + while (amount < -180) + amount += 360; + bone.rotation += amount * alpha; + } +} + +} diff --git a/spine-as3/src/spine/animation/ScaleTimeline.as b/spine-as3/src/spine/animation/ScaleTimeline.as new file mode 100644 index 000000000..c0c7a6ca9 --- /dev/null +++ b/spine-as3/src/spine/animation/ScaleTimeline.as @@ -0,0 +1,34 @@ +package spine.animation { +import spine.Bone; +import spine.Skeleton; + +public class ScaleTimeline extends TranslateTimeline { + public function ScaleTimeline (frameCount:int) { + super(frameCount); + } + + override public function apply (skeleton:Skeleton, time:Number, alpha:Number) : void { + if (time < frames[0]) + return; // Time is before first frame. + + var bone:Bone = skeleton.bones[boneIndex]; + if (time >= frames[frames.length - 3]) { // Time is after last frame. + bone.scaleX += (bone.data.scaleX - 1 + frames[frames.length - 2] - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY - 1 + frames[frames.length - 1] - bone.scaleY) * alpha; + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex:int = Animation.binarySearch(frames, time, 3); + var lastFrameX:Number = frames[frameIndex - 2]; + var lastFrameY:Number = frames[frameIndex - 1]; + var frameTime:Number = frames[frameIndex]; + var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); + percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + + bone.scaleX += (bone.data.scaleX - 1 + lastFrameX + (frames[frameIndex + FRAME_X] - lastFrameX) * percent - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY - 1 + lastFrameY + (frames[frameIndex + FRAME_Y] - lastFrameY) * percent - bone.scaleY) * alpha; + } +} + +} diff --git a/spine-as3/src/spine/animation/Timeline.as b/spine-as3/src/spine/animation/Timeline.as new file mode 100644 index 000000000..06db0f994 --- /dev/null +++ b/spine-as3/src/spine/animation/Timeline.as @@ -0,0 +1,9 @@ +package spine.animation { +import spine.Skeleton; + +public interface Timeline { + /** Sets the value(s) for the specified time. */ + function apply (skeleton:Skeleton, time:Number, alpha:Number) : void; +} + +} diff --git a/spine-as3/src/spine/animation/TranslateTimeline.as b/spine-as3/src/spine/animation/TranslateTimeline.as new file mode 100644 index 000000000..2fbb3a3b2 --- /dev/null +++ b/spine-as3/src/spine/animation/TranslateTimeline.as @@ -0,0 +1,51 @@ +package spine.animation { +import spine.Bone; +import spine.Skeleton; + +public class TranslateTimeline extends CurveTimeline { + static internal const LAST_FRAME_TIME:int = -3; + static internal const FRAME_X:int = 1; + static internal const FRAME_Y:int = 2; + + public var boneIndex:int; + public var frames:Vector. = new Vector.(); // time, value, value, ... + + public function TranslateTimeline (frameCount:int) { + super(frameCount); + frames.length = frameCount * 3; + } + + /** Sets the time and value of the specified keyframe. */ + public function setFrame (frameIndex:int, time:Number, x:Number, y:Number) : void { + frameIndex *= 3; + frames[frameIndex] = time; + frames[frameIndex + 1] = x; + frames[frameIndex + 2] = y; + } + + override public function apply (skeleton:Skeleton, time:Number, alpha:Number) : void { + if (time < frames[0]) + return; // Time is before first frame. + + var bone:Bone = skeleton.bones[boneIndex]; + + if (time >= frames[frames.length - 3]) { // Time is after last frame. + bone.x += (bone.data.x + frames[frames.length - 2] - bone.x) * alpha; + bone.y += (bone.data.y + frames[frames.length - 1] - bone.y) * alpha; + return; + } + + // Interpolate between the last frame and the current frame. + var frameIndex:int = Animation.binarySearch(frames, time, 3); + var lastFrameX:Number = frames[frameIndex - 2]; + var lastFrameY:Number = frames[frameIndex - 1]; + var frameTime:Number = frames[frameIndex]; + var percent:Number = 1 - (time - frameTime) / (frames[frameIndex + LAST_FRAME_TIME] - frameTime); + percent = getCurvePercent(frameIndex / 3 - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); + + bone.x += (bone.data.x + lastFrameX + (frames[frameIndex + FRAME_X] - lastFrameX) * percent - bone.x) * alpha; + bone.y += (bone.data.y + lastFrameY + (frames[frameIndex + FRAME_Y] - lastFrameY) * percent - bone.y) * alpha; + } +} + +} diff --git a/spine-as3/src/spine/atlas/AtlasPage.as b/spine-as3/src/spine/atlas/AtlasPage.as new file mode 100644 index 000000000..5a1e73c8d --- /dev/null +++ b/spine-as3/src/spine/atlas/AtlasPage.as @@ -0,0 +1,15 @@ +package spine.atlas { + +public class AtlasPage { + public var name:String; + public var format:Format; + public var minFilter:TextureFilter; + public var magFilter:TextureFilter; + public var uWrap:TextureWrap; + public var vWrap:TextureWrap; + public var texture:Object; + public var width:int; + public var height:int; +} + +} diff --git a/spine-as3/src/spine/atlas/AtlasRegion.as b/spine-as3/src/spine/atlas/AtlasRegion.as new file mode 100644 index 000000000..01c9d8c73 --- /dev/null +++ b/spine-as3/src/spine/atlas/AtlasRegion.as @@ -0,0 +1,24 @@ +package spine.atlas { + +public class AtlasRegion { + public var page:AtlasPage; + public var name:String; + public var x:int; + public var y:int; + public var width:int; + public var height:int; + public var u:Number; + public var v:Number; + public var u2:Number; + public var v2:Number; + public var offsetX:Number; + public var offsetY:Number; + public var originalWidth:int; + public var originalHeight:int; + public var index:int; + public var rotate:Boolean; + public var splits:Vector.; + public var pads:Vector.; +} + +} diff --git a/spine-as3/src/spine/atlas/Format.as b/spine-as3/src/spine/atlas/Format.as new file mode 100644 index 000000000..287a7d206 --- /dev/null +++ b/spine-as3/src/spine/atlas/Format.as @@ -0,0 +1,21 @@ +package spine.atlas { + +public class Format { + public static const alpha:Format = new Format(0, "alpha"); + public static const intensity:Format = new Format(1, "intensity"); + public static const luminanceAlpha:Format = new Format(2, "luminanceAlpha"); + public static const rgb565:Format = new Format(3, "rgb565"); + public static const rgba4444:Format = new Format(4, "rgba4444"); + public static const rgb888:Format = new Format(5, "rgb888"); + public static const rgba8888:Format = new Format(6, "rgba8888"); + + public var ordinal:int; + public var name:String; + + public function Format (ordinal:int, name:String) { + this.ordinal = ordinal; + this.name = name; + } +} + +} diff --git a/spine-as3/src/spine/atlas/TextureFilter.as b/spine-as3/src/spine/atlas/TextureFilter.as new file mode 100644 index 000000000..ad8e398d3 --- /dev/null +++ b/spine-as3/src/spine/atlas/TextureFilter.as @@ -0,0 +1,21 @@ +package spine.atlas { + +public class TextureFilter { + public static const nearest:TextureFilter = new TextureFilter(0, "nearest"); + public static const linear:TextureFilter = new TextureFilter(1, "linear"); + public static const mipMap:TextureFilter = new TextureFilter(2, "mipMap"); + public static const mipMapNearestNearest:TextureFilter = new TextureFilter(3, "mipMapNearestNearest"); + public static const mipMapLinearNearest:TextureFilter = new TextureFilter(4, "mipMapLinearNearest"); + public static const mipMapNearestLinear:TextureFilter = new TextureFilter(5, "mipMapNearestLinear"); + public static const mipMapLinearLinear:TextureFilter = new TextureFilter(6, "mipMapLinearLinear"); + + public var ordinal:int; + public var name:String; + + public function TextureFilter (ordinal:int, name:String) { + this.ordinal = ordinal; + this.name = name; + } +} + +} diff --git a/spine-as3/src/spine/atlas/TextureWrap.as b/spine-as3/src/spine/atlas/TextureWrap.as new file mode 100644 index 000000000..79f6ecd4f --- /dev/null +++ b/spine-as3/src/spine/atlas/TextureWrap.as @@ -0,0 +1,17 @@ +package spine.atlas { + +public class TextureWrap { + public static const mirroredRepeat:TextureWrap = new TextureWrap(0, "mirroredRepeat"); + public static const clampToEdge:TextureWrap = new TextureWrap(1, "clampToEdge"); + public static const repeat:TextureWrap = new TextureWrap(2, "repeat"); + + public var ordinal:int; + public var name:String; + + public function TextureWrap (ordinal:int, name:String) { + this.ordinal = ordinal; + this.name = name; + } +} + +} diff --git a/spine-as3/src/spine/attachments/Attachment.as b/spine-as3/src/spine/attachments/Attachment.as new file mode 100644 index 000000000..2655c6fd7 --- /dev/null +++ b/spine-as3/src/spine/attachments/Attachment.as @@ -0,0 +1,21 @@ +package spine.attachments { + +public class Attachment { + internal var _name:String; + + public function Attachment (name:String) { + if (name == null) + throw new ArgumentError("name cannot be null."); + _name = name; + } + + public function get name () : String { + return _name; + } + + public function toString () : String { + return name; + } +} + +} diff --git a/spine-as3/src/spine/attachments/AttachmentLoader.as b/spine-as3/src/spine/attachments/AttachmentLoader.as new file mode 100644 index 000000000..437c90470 --- /dev/null +++ b/spine-as3/src/spine/attachments/AttachmentLoader.as @@ -0,0 +1,9 @@ +package spine.attachments { +import spine.Skin; + +public interface AttachmentLoader { + /** @return May be null to not load an attachment. */ + function newAttachment (skin:Skin, type:AttachmentType, name:String) : Attachment; +} + +} diff --git a/spine-as3/src/spine/attachments/AttachmentType.as b/spine-as3/src/spine/attachments/AttachmentType.as new file mode 100644 index 000000000..e7a2d6448 --- /dev/null +++ b/spine-as3/src/spine/attachments/AttachmentType.as @@ -0,0 +1,26 @@ +package spine.attachments { + +public class AttachmentType { + public static const region:AttachmentType = new AttachmentType(0, "region"); + public static const regionSequence:AttachmentType = new AttachmentType(1, "regionSequence"); + + public var ordinal:int; + public var name:String; + + public function AttachmentType (ordinal:int, name:String) { + this.ordinal = ordinal; + this.name = name; + } + + static public function valueOf (name:String) : AttachmentType { + switch (name) { + case "region": + return region; + case "regionSequence": + return regionSequence; + } + return null; + } +} + +} diff --git a/spine-as3/src/spine/attachments/RegionAttachment.as b/spine-as3/src/spine/attachments/RegionAttachment.as new file mode 100644 index 000000000..72d0de5c6 --- /dev/null +++ b/spine-as3/src/spine/attachments/RegionAttachment.as @@ -0,0 +1,106 @@ +package spine.attachments { +import spine.Bone; + +public class RegionAttachment extends Attachment { + public const X1:int = 0; + public const Y1:int = 1; + public const X2:int = 2; + public const Y2:int = 3; + public const X3:int = 4; + public const Y3:int = 5; + public const X4:int = 6; + public const Y4:int = 7; + + public var x:Number; + public var y:Number; + public var scaleX:Number = 1; + public var scaleY:Number = 1; + public var rotation:Number; + public var width:Number; + public var height:Number; + + public var texture:Object; + public var regionOffsetX:Number; // Pixels stripped from the bottom left, unrotated. + public var regionOffsetY:Number; + public var regionWidth:Number; // Unrotated, stripped size. + public var regionHeight:Number; + public var regionOriginalWidth:Number; // Unrotated, unstripped size. + public var regionOriginalHeight:Number; + + public var vertices:Vector. = new Vector.(); + public var offset:Vector. = new Vector.(); + public var uvs:Vector. = new Vector.(); + + public function RegionAttachment (name:String) { + super(name); + } + + public function setUVs (u:Number, v:Number, u2:Number, v2:Number, rotate:Boolean) : void { + if (rotate) { + uvs[X2] = u; + uvs[Y2] = v2; + uvs[X3] = u; + uvs[Y3] = v; + uvs[X4] = u2; + uvs[Y4] = v; + uvs[X1] = u2; + uvs[Y1] = v2; + } else { + uvs[X1] = u; + uvs[Y1] = v2; + uvs[X2] = u; + uvs[Y2] = v; + uvs[X3] = u2; + uvs[Y3] = v; + uvs[X4] = u2; + uvs[Y4] = v2; + } + } + + public function updateOffset () : void { + var regionScaleX:Number = width / regionOriginalWidth * scaleX; + var regionScaleY:Number = height / regionOriginalHeight * scaleY; + var localX:Number = -width / 2 * scaleX + regionOffsetX * regionScaleX; + var localY:Number = -height / 2 * scaleY + regionOffsetY * regionScaleY; + var localX2:Number = localX + regionWidth * regionScaleX; + var localY2:Number = localY + regionHeight * regionScaleY; + var radians:Number = rotation * Math.PI / 180; + var cos:Number = Math.cos(radians); + var sin:Number = Math.sin(radians); + var localXCos:Number = localX * cos + x; + var localXSin:Number = localX * sin; + var localYCos:Number = localY * cos + y; + var localYSin:Number = localY * sin; + var localX2Cos:Number = localX2 * cos + x; + var localX2Sin:Number = localX2 * sin; + var localY2Cos:Number = localY2 * cos + y; + var localY2Sin:Number = localY2 * sin; + offset[X1] = localXCos - localYSin; + offset[Y1] = localYCos + localXSin; + offset[X2] = localXCos - localY2Sin; + offset[Y2] = localY2Cos + localXSin; + offset[X3] = localX2Cos - localY2Sin; + offset[Y3] = localY2Cos + localX2Sin; + offset[X4] = localX2Cos - localYSin; + offset[Y4] = localYCos + localX2Sin; + } + + public function updateVertices (bone:Bone) : void { + var x:Number = bone.worldX; + var y:Number = bone.worldY; + var m00:Number = bone.m00; + var m01:Number = bone.m01; + var m10:Number = bone.m10; + var m11:Number = bone.m11; + vertices[X1] = offset[X1] * m00 + offset[Y1] * m01 + x; + vertices[Y1] = offset[X1] * m10 + offset[Y1] * m11 + y; + vertices[X2] = offset[X2] * m00 + offset[Y2] * m01 + x; + vertices[Y2] = offset[X2] * m10 + offset[Y2] * m11 + y; + vertices[X3] = offset[X3] * m00 + offset[Y3] * m01 + x; + vertices[Y3] = offset[X3] * m10 + offset[Y3] * m11 + y; + vertices[X4] = offset[X4] * m00 + offset[Y4] * m01 + x; + vertices[Y4] = offset[X4] * m10 + offset[Y4] * m11 + y; + } +} + +} diff --git a/spine-starling/spine-starling-example/.actionScriptProperties b/spine-starling/spine-starling-example/.actionScriptProperties new file mode 100644 index 000000000..9ed01a488 --- /dev/null +++ b/spine-starling/spine-starling-example/.actionScriptProperties @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spine-starling/spine-starling-example/.project b/spine-starling/spine-starling-example/.project new file mode 100644 index 000000000..dc21b1cdd --- /dev/null +++ b/spine-starling/spine-starling-example/.project @@ -0,0 +1,17 @@ + + + spine-starling-example + + + + + + com.adobe.flexbuilder.project.flexbuilder + + + + + + com.adobe.flexbuilder.project.actionscriptnature + + diff --git a/spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs b/spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..1c746094a --- /dev/null +++ b/spine-starling/spine-starling-example/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Tue Apr 30 19:02:42 CEST 2013 +eclipse.preferences.version=1 +encoding/=utf-8 diff --git a/spine-starling/spine-starling-example/html-template/history/history.css b/spine-starling/spine-starling-example/html-template/history/history.css new file mode 100644 index 000000000..dbc47c61b --- /dev/null +++ b/spine-starling/spine-starling-example/html-template/history/history.css @@ -0,0 +1,6 @@ +/* This CSS stylesheet defines styles used by required elements in a flex application page that supports browser history */ + +#ie_historyFrame { width: 0px; height: 0px; display:none } +#firefox_anchorDiv { width: 0px; height: 0px; display:none } +#safari_formDiv { width: 0px; height: 0px; display:none } +#safari_rememberDiv { width: 0px; height: 0px; display:none } diff --git a/spine-starling/spine-starling-example/html-template/history/history.js b/spine-starling/spine-starling-example/html-template/history/history.js new file mode 100644 index 000000000..00a8bfee7 --- /dev/null +++ b/spine-starling/spine-starling-example/html-template/history/history.js @@ -0,0 +1,678 @@ +BrowserHistoryUtils = { + addEvent: function(elm, evType, fn, useCapture) { + useCapture = useCapture || false; + if (elm.addEventListener) { + elm.addEventListener(evType, fn, useCapture); + return true; + } + else if (elm.attachEvent) { + var r = elm.attachEvent('on' + evType, fn); + return r; + } + else { + elm['on' + evType] = fn; + } + } +} + +BrowserHistory = (function() { + // type of browser + var browser = { + ie: false, + ie8: false, + firefox: false, + safari: false, + opera: false, + version: -1 + }; + + // Default app state URL to use when no fragment ID present + var defaultHash = ''; + + // Last-known app state URL + var currentHref = document.location.href; + + // Initial URL (used only by IE) + var initialHref = document.location.href; + + // Initial URL (used only by IE) + var initialHash = document.location.hash; + + // History frame source URL prefix (used only by IE) + var historyFrameSourcePrefix = 'history/historyFrame.html?'; + + // History maintenance (used only by Safari) + var currentHistoryLength = -1; + + // Flag to denote the existence of onhashchange + var browserHasHashChange = false; + + var historyHash = []; + + var initialState = createState(initialHref, initialHref + '#' + initialHash, initialHash); + + var backStack = []; + var forwardStack = []; + + var currentObjectId = null; + + //UserAgent detection + var useragent = navigator.userAgent.toLowerCase(); + + if (useragent.indexOf("opera") != -1) { + browser.opera = true; + } else if (useragent.indexOf("msie") != -1) { + browser.ie = true; + browser.version = parseFloat(useragent.substring(useragent.indexOf('msie') + 4)); + if (browser.version == 8) + { + browser.ie = false; + browser.ie8 = true; + } + } else if (useragent.indexOf("safari") != -1) { + browser.safari = true; + browser.version = parseFloat(useragent.substring(useragent.indexOf('safari') + 7)); + } else if (useragent.indexOf("gecko") != -1) { + browser.firefox = true; + } + + if (browser.ie == true && browser.version == 7) { + window["_ie_firstload"] = false; + } + + function hashChangeHandler() + { + currentHref = document.location.href; + var flexAppUrl = getHash(); + //ADR: to fix multiple + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + pl[i].browserURLChange(flexAppUrl); + } + } else { + getPlayer().browserURLChange(flexAppUrl); + } + } + + // Accessor functions for obtaining specific elements of the page. + function getHistoryFrame() + { + return document.getElementById('ie_historyFrame'); + } + + function getFormElement() + { + return document.getElementById('safari_formDiv'); + } + + function getRememberElement() + { + return document.getElementById("safari_remember_field"); + } + + // Get the Flash player object for performing ExternalInterface callbacks. + // Updated for changes to SWFObject2. + function getPlayer(id) { + var i; + + if (id && document.getElementById(id)) { + var r = document.getElementById(id); + if (typeof r.SetVariable != "undefined") { + return r; + } + else { + var o = r.getElementsByTagName("object"); + var e = r.getElementsByTagName("embed"); + for (i = 0; i < o.length; i++) { + if (typeof o[i].browserURLChange != "undefined") + return o[i]; + } + for (i = 0; i < e.length; i++) { + if (typeof e[i].browserURLChange != "undefined") + return e[i]; + } + } + } + else { + var o = document.getElementsByTagName("object"); + var e = document.getElementsByTagName("embed"); + for (i = 0; i < e.length; i++) { + if (typeof e[i].browserURLChange != "undefined") + { + return e[i]; + } + } + for (i = 0; i < o.length; i++) { + if (typeof o[i].browserURLChange != "undefined") + { + return o[i]; + } + } + } + return undefined; + } + + function getPlayers() { + var i; + var players = []; + if (players.length == 0) { + var tmp = document.getElementsByTagName('object'); + for (i = 0; i < tmp.length; i++) + { + if (typeof tmp[i].browserURLChange != "undefined") + players.push(tmp[i]); + } + } + if (players.length == 0 || players[0].object == null) { + var tmp = document.getElementsByTagName('embed'); + for (i = 0; i < tmp.length; i++) + { + if (typeof tmp[i].browserURLChange != "undefined") + players.push(tmp[i]); + } + } + return players; + } + + function getIframeHash() { + var doc = getHistoryFrame().contentWindow.document; + var hash = String(doc.location.search); + if (hash.length == 1 && hash.charAt(0) == "?") { + hash = ""; + } + else if (hash.length >= 2 && hash.charAt(0) == "?") { + hash = hash.substring(1); + } + return hash; + } + + /* Get the current location hash excluding the '#' symbol. */ + function getHash() { + // It would be nice if we could use document.location.hash here, + // but it's faulty sometimes. + var idx = document.location.href.indexOf('#'); + return (idx >= 0) ? document.location.href.substr(idx+1) : ''; + } + + /* Get the current location hash excluding the '#' symbol. */ + function setHash(hash) { + // It would be nice if we could use document.location.hash here, + // but it's faulty sometimes. + if (hash == '') hash = '#' + document.location.hash = hash; + } + + function createState(baseUrl, newUrl, flexAppUrl) { + return { 'baseUrl': baseUrl, 'newUrl': newUrl, 'flexAppUrl': flexAppUrl, 'title': null }; + } + + /* Add a history entry to the browser. + * baseUrl: the portion of the location prior to the '#' + * newUrl: the entire new URL, including '#' and following fragment + * flexAppUrl: the portion of the location following the '#' only + */ + function addHistoryEntry(baseUrl, newUrl, flexAppUrl) { + + //delete all the history entries + forwardStack = []; + + if (browser.ie) { + //Check to see if we are being asked to do a navigate for the first + //history entry, and if so ignore, because it's coming from the creation + //of the history iframe + if (flexAppUrl == defaultHash && document.location.href == initialHref && window['_ie_firstload']) { + currentHref = initialHref; + return; + } + if ((!flexAppUrl || flexAppUrl == defaultHash) && window['_ie_firstload']) { + newUrl = baseUrl + '#' + defaultHash; + flexAppUrl = defaultHash; + } else { + // for IE, tell the history frame to go somewhere without a '#' + // in order to get this entry into the browser history. + getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl; + } + setHash(flexAppUrl); + } else { + + //ADR + if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) { + initialState = createState(baseUrl, newUrl, flexAppUrl); + } else if(backStack.length > 0 && backStack[backStack.length - 1].flexAppUrl == flexAppUrl) { + backStack[backStack.length - 1] = createState(baseUrl, newUrl, flexAppUrl); + } + + if (browser.safari && !browserHasHashChange) { + // for Safari, submit a form whose action points to the desired URL + if (browser.version <= 419.3) { + var file = window.location.pathname.toString(); + file = file.substring(file.lastIndexOf("/")+1); + getFormElement().innerHTML = '
'; + //get the current elements and add them to the form + var qs = window.location.search.substring(1); + var qs_arr = qs.split("&"); + for (var i = 0; i < qs_arr.length; i++) { + var tmp = qs_arr[i].split("="); + var elem = document.createElement("input"); + elem.type = "hidden"; + elem.name = tmp[0]; + elem.value = tmp[1]; + document.forms.historyForm.appendChild(elem); + } + document.forms.historyForm.submit(); + } else { + top.location.hash = flexAppUrl; + } + // We also have to maintain the history by hand for Safari + historyHash[history.length] = flexAppUrl; + _storeStates(); + } else { + // Otherwise, just tell the browser to go there + setHash(flexAppUrl); + } + } + backStack.push(createState(baseUrl, newUrl, flexAppUrl)); + } + + function _storeStates() { + if (browser.safari) { + getRememberElement().value = historyHash.join(","); + } + } + + function handleBackButton() { + //The "current" page is always at the top of the history stack. + var current = backStack.pop(); + if (!current) { return; } + var last = backStack[backStack.length - 1]; + if (!last && backStack.length == 0){ + last = initialState; + } + forwardStack.push(current); + } + + function handleForwardButton() { + //summary: private method. Do not call this directly. + + var last = forwardStack.pop(); + if (!last) { return; } + backStack.push(last); + } + + function handleArbitraryUrl() { + //delete all the history entries + forwardStack = []; + } + + /* Called periodically to poll to see if we need to detect navigation that has occurred */ + function checkForUrlChange() { + + if (browser.ie) { + if (currentHref != document.location.href && currentHref + '#' != document.location.href) { + //This occurs when the user has navigated to a specific URL + //within the app, and didn't use browser back/forward + //IE seems to have a bug where it stops updating the URL it + //shows the end-user at this point, but programatically it + //appears to be correct. Do a full app reload to get around + //this issue. + if (browser.version < 7) { + currentHref = document.location.href; + document.location.reload(); + } else { + if (getHash() != getIframeHash()) { + // this.iframe.src = this.blankURL + hash; + var sourceToSet = historyFrameSourcePrefix + getHash(); + getHistoryFrame().src = sourceToSet; + currentHref = document.location.href; + } + } + } + } + + if (browser.safari && !browserHasHashChange) { + // For Safari, we have to check to see if history.length changed. + if (currentHistoryLength >= 0 && history.length != currentHistoryLength) { + //alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|")); + var flexAppUrl = getHash(); + if (browser.version < 528.16 /* Anything earlier than Safari 4.0 */) + { + // If it did change and we're running Safari 3.x or earlier, + // then we have to look the old state up in our hand-maintained + // array since document.location.hash won't have changed, + // then call back into BrowserManager. + currentHistoryLength = history.length; + flexAppUrl = historyHash[currentHistoryLength]; + } + + //ADR: to fix multiple + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + pl[i].browserURLChange(flexAppUrl); + } + } else { + getPlayer().browserURLChange(flexAppUrl); + } + _storeStates(); + } + } + if (browser.firefox && !browserHasHashChange) { + if (currentHref != document.location.href) { + var bsl = backStack.length; + + var urlActions = { + back: false, + forward: false, + set: false + } + + if ((window.location.hash == initialHash || window.location.href == initialHref) && (bsl == 1)) { + urlActions.back = true; + // FIXME: could this ever be a forward button? + // we can't clear it because we still need to check for forwards. Ugg. + // clearInterval(this.locationTimer); + handleBackButton(); + } + + // first check to see if we could have gone forward. We always halt on + // a no-hash item. + if (forwardStack.length > 0) { + if (forwardStack[forwardStack.length-1].flexAppUrl == getHash()) { + urlActions.forward = true; + handleForwardButton(); + } + } + + // ok, that didn't work, try someplace back in the history stack + if ((bsl >= 2) && (backStack[bsl - 2])) { + if (backStack[bsl - 2].flexAppUrl == getHash()) { + urlActions.back = true; + handleBackButton(); + } + } + + if (!urlActions.back && !urlActions.forward) { + var foundInStacks = { + back: -1, + forward: -1 + } + + for (var i = 0; i < backStack.length; i++) { + if (backStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { + arbitraryUrl = true; + foundInStacks.back = i; + } + } + for (var i = 0; i < forwardStack.length; i++) { + if (forwardStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { + arbitraryUrl = true; + foundInStacks.forward = i; + } + } + handleArbitraryUrl(); + } + + // Firefox changed; do a callback into BrowserManager to tell it. + currentHref = document.location.href; + var flexAppUrl = getHash(); + //ADR: to fix multiple + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + pl[i].browserURLChange(flexAppUrl); + } + } else { + getPlayer().browserURLChange(flexAppUrl); + } + } + } + } + + var _initialize = function () { + + browserHasHashChange = ("onhashchange" in document.body); + + if (browser.ie) + { + var scripts = document.getElementsByTagName('script'); + for (var i = 0, s; s = scripts[i]; i++) { + if (s.src.indexOf("history.js") > -1) { + var iframe_location = (new String(s.src)).replace("history.js", "historyFrame.html"); + } + } + historyFrameSourcePrefix = iframe_location + "?"; + var src = historyFrameSourcePrefix; + + var iframe = document.createElement("iframe"); + iframe.id = 'ie_historyFrame'; + iframe.name = 'ie_historyFrame'; + iframe.src = 'javascript:false;'; + + try { + document.body.appendChild(iframe); + } catch(e) { + setTimeout(function() { + document.body.appendChild(iframe); + }, 0); + } + } + + if (browser.safari && !browserHasHashChange) + { + var rememberDiv = document.createElement("div"); + rememberDiv.id = 'safari_rememberDiv'; + document.body.appendChild(rememberDiv); + rememberDiv.innerHTML = ''; + + var formDiv = document.createElement("div"); + formDiv.id = 'safari_formDiv'; + document.body.appendChild(formDiv); + + var reloader_content = document.createElement('div'); + reloader_content.id = 'safarireloader'; + var scripts = document.getElementsByTagName('script'); + for (var i = 0, s; s = scripts[i]; i++) { + if (s.src.indexOf("history.js") > -1) { + html = (new String(s.src)).replace(".js", ".html"); + } + } + reloader_content.innerHTML = ''; + document.body.appendChild(reloader_content); + reloader_content.style.position = 'absolute'; + reloader_content.style.left = reloader_content.style.top = '-9999px'; + iframe = reloader_content.getElementsByTagName('iframe')[0]; + + if (document.getElementById("safari_remember_field").value != "" ) { + historyHash = document.getElementById("safari_remember_field").value.split(","); + } + } + + if (browserHasHashChange) + document.body.onhashchange = hashChangeHandler; + } + + return { + historyHash: historyHash, + backStack: function() { return backStack; }, + forwardStack: function() { return forwardStack }, + getPlayer: getPlayer, + initialize: function(src) { + _initialize(src); + }, + setURL: function(url) { + document.location.href = url; + }, + getURL: function() { + return document.location.href; + }, + getTitle: function() { + return document.title; + }, + setTitle: function(title) { + try { + backStack[backStack.length - 1].title = title; + } catch(e) { } + //if on safari, set the title to be the empty string. + if (browser.safari) { + if (title == "") { + try { + var tmp = window.location.href.toString(); + title = tmp.substring((tmp.lastIndexOf("/")+1), tmp.lastIndexOf("#")); + } catch(e) { + title = ""; + } + } + } + document.title = title; + }, + setDefaultURL: function(def) + { + defaultHash = def; + def = getHash(); + //trailing ? is important else an extra frame gets added to the history + //when navigating back to the first page. Alternatively could check + //in history frame navigation to compare # and ?. + if (browser.ie) + { + window['_ie_firstload'] = true; + var sourceToSet = historyFrameSourcePrefix + def; + var func = function() { + getHistoryFrame().src = sourceToSet; + window.location.replace("#" + def); + setInterval(checkForUrlChange, 50); + } + try { + func(); + } catch(e) { + window.setTimeout(function() { func(); }, 0); + } + } + + if (browser.safari) + { + currentHistoryLength = history.length; + if (historyHash.length == 0) { + historyHash[currentHistoryLength] = def; + var newloc = "#" + def; + window.location.replace(newloc); + } else { + //alert(historyHash[historyHash.length-1]); + } + setInterval(checkForUrlChange, 50); + } + + + if (browser.firefox || browser.opera) + { + var reg = new RegExp("#" + def + "$"); + if (window.location.toString().match(reg)) { + } else { + var newloc ="#" + def; + window.location.replace(newloc); + } + setInterval(checkForUrlChange, 50); + } + + }, + + /* Set the current browser URL; called from inside BrowserManager to propagate + * the application state out to the container. + */ + setBrowserURL: function(flexAppUrl, objectId) { + if (browser.ie && typeof objectId != "undefined") { + currentObjectId = objectId; + } + //fromIframe = fromIframe || false; + //fromFlex = fromFlex || false; + //alert("setBrowserURL: " + flexAppUrl); + //flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ; + + var pos = document.location.href.indexOf('#'); + var baseUrl = pos != -1 ? document.location.href.substr(0, pos) : document.location.href; + var newUrl = baseUrl + '#' + flexAppUrl; + + if (document.location.href != newUrl && document.location.href + '#' != newUrl) { + currentHref = newUrl; + addHistoryEntry(baseUrl, newUrl, flexAppUrl); + currentHistoryLength = history.length; + } + }, + + browserURLChange: function(flexAppUrl) { + var objectId = null; + if (browser.ie && currentObjectId != null) { + objectId = currentObjectId; + } + + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { + var pl = getPlayers(); + for (var i = 0; i < pl.length; i++) { + try { + pl[i].browserURLChange(flexAppUrl); + } catch(e) { } + } + } else { + try { + getPlayer(objectId).browserURLChange(flexAppUrl); + } catch(e) { } + } + + currentObjectId = null; + }, + getUserAgent: function() { + return navigator.userAgent; + }, + getPlatform: function() { + return navigator.platform; + } + + } + +})(); + +// Initialization + +// Automated unit testing and other diagnostics + +function setURL(url) +{ + document.location.href = url; +} + +function backButton() +{ + history.back(); +} + +function forwardButton() +{ + history.forward(); +} + +function goForwardOrBackInHistory(step) +{ + history.go(step); +} + +//BrowserHistoryUtils.addEvent(window, "load", function() { BrowserHistory.initialize(); }); +(function(i) { + var u =navigator.userAgent;var e=/*@cc_on!@*/false; + var st = setTimeout; + if(/webkit/i.test(u)){ + st(function(){ + var dr=document.readyState; + if(dr=="loaded"||dr=="complete"){i()} + else{st(arguments.callee,10);}},10); + } else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){ + document.addEventListener("DOMContentLoaded",i,false); + } else if(e){ + (function(){ + var t=document.createElement('doc:rdy'); + try{t.doScroll('left'); + i();t=null; + }catch(e){st(arguments.callee,0);}})(); + } else{ + window.onload=i; + } +})( function() {BrowserHistory.initialize();} ); diff --git a/spine-starling/spine-starling-example/html-template/history/historyFrame.html b/spine-starling/spine-starling-example/html-template/history/historyFrame.html new file mode 100644 index 000000000..07e3806f0 --- /dev/null +++ b/spine-starling/spine-starling-example/html-template/history/historyFrame.html @@ -0,0 +1,29 @@ + + + + + + + + Hidden frame for Browser History support. + + diff --git a/spine-starling/spine-starling-example/html-template/index.template.html b/spine-starling/spine-starling-example/html-template/index.template.html new file mode 100644 index 000000000..3b89e4ee5 --- /dev/null +++ b/spine-starling/spine-starling-example/html-template/index.template.html @@ -0,0 +1,109 @@ + + + + + + ${title} + + + + + + + + + + + + + +
+

+ To view this page ensure that Adobe Flash Player version + ${version_major}.${version_minor}.${version_revision} or greater is installed. +

+ +
+ + + + diff --git a/spine-starling/spine-starling-example/html-template/playerProductInstall.swf b/spine-starling/spine-starling-example/html-template/playerProductInstall.swf new file mode 100644 index 0000000000000000000000000000000000000000..bdc3437856cb0ae54bb9423700ba6ec89f35282c GIT binary patch literal 657 zcmV;C0&e|7S5pT30{{ScoOM%8YZE~jel|&yP13aKhpyI8)Pu*a7cZru!IYFhQ!%kE z;zt>GCuViByG~|XgJ(bJp~q+`f){V4c=Tk!n-K9Tcv0|Qh}4-)Z5q%$%)ak4^FGh} zG4mKh>p=QFFsz{%nRVYDpaejJ54{eo7BqCbU1T$6A?_UfdU|tzr7->Edg5~QJ`!s!OO;20fpVHsv=YsdQ{lvI<6(v2yrdS7`6LQi8#uy`}SX?Ni6O)r6`%Pye4YxmY_|vs1r$ zYS62JJit*Qq5)1^TgC)o6KZQEG=%VHP4mC>rXSoh>x{G-y~501s42xbb%oj5teYed zUazfuM*8z%%PQW6Lm}m@hf8V%w#-l*H+45VumzOSNh6MI zfwTnD68J}cRU>5EordGe5i?c`=PYmF$$^*q^20~+G3o1>u%sdEL~sE;XrvE~96_TY z1oQ%v(6hbD$HElG!xl|cjZOyoWIw@E;qK|`oT|Xk&*+o6#W@8T{oeJ8I9m-_V~Lc) rrowHdr=QEu;UGRC%}bhmYZ>GFiMOQQ+m?EJQA~aL;e`Gll9T{P!97I~ literal 0 HcmV?d00001 diff --git a/spine-starling/spine-starling-example/html-template/swfobject.js b/spine-starling/spine-starling-example/html-template/swfobject.js new file mode 100644 index 000000000..bf35c07c8 --- /dev/null +++ b/spine-starling/spine-starling-example/html-template/swfobject.js @@ -0,0 +1,777 @@ +/*! SWFObject v2.2 + is released under the MIT License +*/ + +var swfobject = function() { + + var UNDEF = "undefined", + OBJECT = "object", + SHOCKWAVE_FLASH = "Shockwave Flash", + SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", + FLASH_MIME_TYPE = "application/x-shockwave-flash", + EXPRESS_INSTALL_ID = "SWFObjectExprInst", + ON_READY_STATE_CHANGE = "onreadystatechange", + + win = window, + doc = document, + nav = navigator, + + plugin = false, + domLoadFnArr = [main], + regObjArr = [], + objIdArr = [], + listenersArr = [], + storedAltContent, + storedAltContentId, + storedCallbackFn, + storedCallbackObj, + isDomLoaded = false, + isExpressInstallActive = false, + dynamicStylesheet, + dynamicStylesheetMedia, + autoHideShow = true, + + /* Centralized function for browser feature detection + - User agent string detection is only used when no good alternative is possible + - Is executed directly for optimal performance + */ + ua = function() { + var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, + u = nav.userAgent.toLowerCase(), + p = nav.platform.toLowerCase(), + windows = p ? /win/.test(p) : /win/.test(u), + mac = p ? /mac/.test(p) : /mac/.test(u), + webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit + ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html + playerVersion = [0,0,0], + d = null; + if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { + d = nav.plugins[SHOCKWAVE_FLASH].description; + if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+ + plugin = true; + ie = false; // cascaded feature detection for Internet Explorer + d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); + playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); + playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); + playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; + } + } + else if (typeof win.ActiveXObject != UNDEF) { + try { + var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); + if (a) { // a will return null when ActiveX is disabled + d = a.GetVariable("$version"); + if (d) { + ie = true; // cascaded feature detection for Internet Explorer + d = d.split(" ")[1].split(","); + playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + } + } + catch(e) {} + } + return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; + }(), + + /* Cross-browser onDomLoad + - Will fire an event as soon as the DOM of a web page is loaded + - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/ + - Regular onload serves as fallback + */ + onDomLoad = function() { + if (!ua.w3) { return; } + if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically + callDomLoadFunctions(); + } + if (!isDomLoaded) { + if (typeof doc.addEventListener != UNDEF) { + doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false); + } + if (ua.ie && ua.win) { + doc.attachEvent(ON_READY_STATE_CHANGE, function() { + if (doc.readyState == "complete") { + doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); + callDomLoadFunctions(); + } + }); + if (win == top) { // if not inside an iframe + (function(){ + if (isDomLoaded) { return; } + try { + doc.documentElement.doScroll("left"); + } + catch(e) { + setTimeout(arguments.callee, 0); + return; + } + callDomLoadFunctions(); + })(); + } + } + if (ua.wk) { + (function(){ + if (isDomLoaded) { return; } + if (!/loaded|complete/.test(doc.readyState)) { + setTimeout(arguments.callee, 0); + return; + } + callDomLoadFunctions(); + })(); + } + addLoadEvent(callDomLoadFunctions); + } + }(); + + function callDomLoadFunctions() { + if (isDomLoaded) { return; } + try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early + var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span")); + t.parentNode.removeChild(t); + } + catch (e) { return; } + isDomLoaded = true; + var dl = domLoadFnArr.length; + for (var i = 0; i < dl; i++) { + domLoadFnArr[i](); + } + } + + function addDomLoadEvent(fn) { + if (isDomLoaded) { + fn(); + } + else { + domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ + } + } + + /* Cross-browser onload + - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/ + - Will fire an event as soon as a web page including all of its assets are loaded + */ + function addLoadEvent(fn) { + if (typeof win.addEventListener != UNDEF) { + win.addEventListener("load", fn, false); + } + else if (typeof doc.addEventListener != UNDEF) { + doc.addEventListener("load", fn, false); + } + else if (typeof win.attachEvent != UNDEF) { + addListener(win, "onload", fn); + } + else if (typeof win.onload == "function") { + var fnOld = win.onload; + win.onload = function() { + fnOld(); + fn(); + }; + } + else { + win.onload = fn; + } + } + + /* Main function + - Will preferably execute onDomLoad, otherwise onload (as a fallback) + */ + function main() { + if (plugin) { + testPlayerVersion(); + } + else { + matchVersions(); + } + } + + /* Detect the Flash Player version for non-Internet Explorer browsers + - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description: + a. Both release and build numbers can be detected + b. Avoid wrong descriptions by corrupt installers provided by Adobe + c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports + - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available + */ + function testPlayerVersion() { + var b = doc.getElementsByTagName("body")[0]; + var o = createElement(OBJECT); + o.setAttribute("type", FLASH_MIME_TYPE); + var t = b.appendChild(o); + if (t) { + var counter = 0; + (function(){ + if (typeof t.GetVariable != UNDEF) { + var d = t.GetVariable("$version"); + if (d) { + d = d.split(" ")[1].split(","); + ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + } + else if (counter < 10) { + counter++; + setTimeout(arguments.callee, 10); + return; + } + b.removeChild(o); + t = null; + matchVersions(); + })(); + } + else { + matchVersions(); + } + } + + /* Perform Flash Player and SWF version matching; static publishing only + */ + function matchVersions() { + var rl = regObjArr.length; + if (rl > 0) { + for (var i = 0; i < rl; i++) { // for each registered object element + var id = regObjArr[i].id; + var cb = regObjArr[i].callbackFn; + var cbObj = {success:false, id:id}; + if (ua.pv[0] > 0) { + var obj = getElementById(id); + if (obj) { + if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match! + setVisibility(id, true); + if (cb) { + cbObj.success = true; + cbObj.ref = getObjectById(id); + cb(cbObj); + } + } + else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported + var att = {}; + att.data = regObjArr[i].expressInstall; + att.width = obj.getAttribute("width") || "0"; + att.height = obj.getAttribute("height") || "0"; + if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); } + if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); } + // parse HTML object param element's name-value pairs + var par = {}; + var p = obj.getElementsByTagName("param"); + var pl = p.length; + for (var j = 0; j < pl; j++) { + if (p[j].getAttribute("name").toLowerCase() != "movie") { + par[p[j].getAttribute("name")] = p[j].getAttribute("value"); + } + } + showExpressInstall(att, par, id, cb); + } + else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF + displayAltContent(obj); + if (cb) { cb(cbObj); } + } + } + } + else { // if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content) + setVisibility(id, true); + if (cb) { + var o = getObjectById(id); // test whether there is an HTML object element or not + if (o && typeof o.SetVariable != UNDEF) { + cbObj.success = true; + cbObj.ref = o; + } + cb(cbObj); + } + } + } + } + } + + function getObjectById(objectIdStr) { + var r = null; + var o = getElementById(objectIdStr); + if (o && o.nodeName == "OBJECT") { + if (typeof o.SetVariable != UNDEF) { + r = o; + } + else { + var n = o.getElementsByTagName(OBJECT)[0]; + if (n) { + r = n; + } + } + } + return r; + } + + /* Requirements for Adobe Express Install + - only one instance can be active at a time + - fp 6.0.65 or higher + - Win/Mac OS only + - no Webkit engines older than version 312 + */ + function canExpressInstall() { + return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312); + } + + /* Show the Adobe Express Install dialog + - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 + */ + function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { + isExpressInstallActive = true; + storedCallbackFn = callbackFn || null; + storedCallbackObj = {success:false, id:replaceElemIdStr}; + var obj = getElementById(replaceElemIdStr); + if (obj) { + if (obj.nodeName == "OBJECT") { // static publishing + storedAltContent = abstractAltContent(obj); + storedAltContentId = null; + } + else { // dynamic publishing + storedAltContent = obj; + storedAltContentId = replaceElemIdStr; + } + att.id = EXPRESS_INSTALL_ID; + if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; } + if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; } + doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; + var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", + fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; + if (typeof par.flashvars != UNDEF) { + par.flashvars += "&" + fv; + } + else { + par.flashvars = fv; + } + // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it, + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work + if (ua.ie && ua.win && obj.readyState != 4) { + var newObj = createElement("div"); + replaceElemIdStr += "SWFObjectNew"; + newObj.setAttribute("id", replaceElemIdStr); + obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + obj.parentNode.removeChild(obj); + } + else { + setTimeout(arguments.callee, 10); + } + })(); + } + createSWF(att, par, replaceElemIdStr); + } + } + + /* Functions to abstract and display alternative content + */ + function displayAltContent(obj) { + if (ua.ie && ua.win && obj.readyState != 4) { + // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it, + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work + var el = createElement("div"); + obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content + el.parentNode.replaceChild(abstractAltContent(obj), el); + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + obj.parentNode.removeChild(obj); + } + else { + setTimeout(arguments.callee, 10); + } + })(); + } + else { + obj.parentNode.replaceChild(abstractAltContent(obj), obj); + } + } + + function abstractAltContent(obj) { + var ac = createElement("div"); + if (ua.win && ua.ie) { + ac.innerHTML = obj.innerHTML; + } + else { + var nestedObj = obj.getElementsByTagName(OBJECT)[0]; + if (nestedObj) { + var c = nestedObj.childNodes; + if (c) { + var cl = c.length; + for (var i = 0; i < cl; i++) { + if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) { + ac.appendChild(c[i].cloneNode(true)); + } + } + } + } + } + return ac; + } + + /* Cross-browser dynamic SWF creation + */ + function createSWF(attObj, parObj, id) { + var r, el = getElementById(id); + if (ua.wk && ua.wk < 312) { return r; } + if (el) { + if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content + attObj.id = id; + } + if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML + var att = ""; + for (var i in attObj) { + if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries + if (i.toLowerCase() == "data") { + parObj.movie = attObj[i]; + } + else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword + att += ' class="' + attObj[i] + '"'; + } + else if (i.toLowerCase() != "classid") { + att += ' ' + i + '="' + attObj[i] + '"'; + } + } + } + var par = ""; + for (var j in parObj) { + if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries + par += ''; + } + } + el.outerHTML = '' + par + ''; + objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only) + r = getElementById(attObj.id); + } + else { // well-behaving browsers + var o = createElement(OBJECT); + o.setAttribute("type", FLASH_MIME_TYPE); + for (var m in attObj) { + if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries + if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword + o.setAttribute("class", attObj[m]); + } + else if (m.toLowerCase() != "classid") { // filter out IE specific attribute + o.setAttribute(m, attObj[m]); + } + } + } + for (var n in parObj) { + if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element + createObjParam(o, n, parObj[n]); + } + } + el.parentNode.replaceChild(o, el); + r = o; + } + } + return r; + } + + function createObjParam(el, pName, pValue) { + var p = createElement("param"); + p.setAttribute("name", pName); + p.setAttribute("value", pValue); + el.appendChild(p); + } + + /* Cross-browser SWF removal + - Especially needed to safely and completely remove a SWF in Internet Explorer + */ + function removeSWF(id) { + var obj = getElementById(id); + if (obj && obj.nodeName == "OBJECT") { + if (ua.ie && ua.win) { + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + removeObjectInIE(id); + } + else { + setTimeout(arguments.callee, 10); + } + })(); + } + else { + obj.parentNode.removeChild(obj); + } + } + } + + function removeObjectInIE(id) { + var obj = getElementById(id); + if (obj) { + for (var i in obj) { + if (typeof obj[i] == "function") { + obj[i] = null; + } + } + obj.parentNode.removeChild(obj); + } + } + + /* Functions to optimize JavaScript compression + */ + function getElementById(id) { + var el = null; + try { + el = doc.getElementById(id); + } + catch (e) {} + return el; + } + + function createElement(el) { + return doc.createElement(el); + } + + /* Updated attachEvent function for Internet Explorer + - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks + */ + function addListener(target, eventType, fn) { + target.attachEvent(eventType, fn); + listenersArr[listenersArr.length] = [target, eventType, fn]; + } + + /* Flash Player and SWF content version matching + */ + function hasPlayerVersion(rv) { + var pv = ua.pv, v = rv.split("."); + v[0] = parseInt(v[0], 10); + v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0" + v[2] = parseInt(v[2], 10) || 0; + return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; + } + + /* Cross-browser dynamic CSS creation + - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php + */ + function createCSS(sel, decl, media, newStyle) { + if (ua.ie && ua.mac) { return; } + var h = doc.getElementsByTagName("head")[0]; + if (!h) { return; } // to also support badly authored HTML pages that lack a head element + var m = (media && typeof media == "string") ? media : "screen"; + if (newStyle) { + dynamicStylesheet = null; + dynamicStylesheetMedia = null; + } + if (!dynamicStylesheet || dynamicStylesheetMedia != m) { + // create dynamic stylesheet + get a global reference to it + var s = createElement("style"); + s.setAttribute("type", "text/css"); + s.setAttribute("media", m); + dynamicStylesheet = h.appendChild(s); + if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) { + dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1]; + } + dynamicStylesheetMedia = m; + } + // add style rule + if (ua.ie && ua.win) { + if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) { + dynamicStylesheet.addRule(sel, decl); + } + } + else { + if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) { + dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}")); + } + } + } + + function setVisibility(id, isVisible) { + if (!autoHideShow) { return; } + var v = isVisible ? "visible" : "hidden"; + if (isDomLoaded && getElementById(id)) { + getElementById(id).style.visibility = v; + } + else { + createCSS("#" + id, "visibility:" + v); + } + } + + /* Filter to avoid XSS attacks + */ + function urlEncodeIfNecessary(s) { + var regex = /[\\\"<>\.;]/; + var hasBadChars = regex.exec(s) != null; + return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s; + } + + /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only) + */ + var cleanup = function() { + if (ua.ie && ua.win) { + window.attachEvent("onunload", function() { + // remove listeners to avoid memory leaks + var ll = listenersArr.length; + for (var i = 0; i < ll; i++) { + listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]); + } + // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect + var il = objIdArr.length; + for (var j = 0; j < il; j++) { + removeSWF(objIdArr[j]); + } + // cleanup library's main closures to avoid memory leaks + for (var k in ua) { + ua[k] = null; + } + ua = null; + for (var l in swfobject) { + swfobject[l] = null; + } + swfobject = null; + }); + } + }(); + + return { + /* Public API + - Reference: http://code.google.com/p/swfobject/wiki/documentation + */ + registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) { + if (ua.w3 && objectIdStr && swfVersionStr) { + var regObj = {}; + regObj.id = objectIdStr; + regObj.swfVersion = swfVersionStr; + regObj.expressInstall = xiSwfUrlStr; + regObj.callbackFn = callbackFn; + regObjArr[regObjArr.length] = regObj; + setVisibility(objectIdStr, false); + } + else if (callbackFn) { + callbackFn({success:false, id:objectIdStr}); + } + }, + + getObjectById: function(objectIdStr) { + if (ua.w3) { + return getObjectById(objectIdStr); + } + }, + + embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { + var callbackObj = {success:false, id:replaceElemIdStr}; + if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { + setVisibility(replaceElemIdStr, false); + addDomLoadEvent(function() { + widthStr += ""; // auto-convert to string + heightStr += ""; + var att = {}; + if (attObj && typeof attObj === OBJECT) { + for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs + att[i] = attObj[i]; + } + } + att.data = swfUrlStr; + att.width = widthStr; + att.height = heightStr; + var par = {}; + if (parObj && typeof parObj === OBJECT) { + for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs + par[j] = parObj[j]; + } + } + if (flashvarsObj && typeof flashvarsObj === OBJECT) { + for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs + if (typeof par.flashvars != UNDEF) { + par.flashvars += "&" + k + "=" + flashvarsObj[k]; + } + else { + par.flashvars = k + "=" + flashvarsObj[k]; + } + } + } + if (hasPlayerVersion(swfVersionStr)) { // create SWF + var obj = createSWF(att, par, replaceElemIdStr); + if (att.id == replaceElemIdStr) { + setVisibility(replaceElemIdStr, true); + } + callbackObj.success = true; + callbackObj.ref = obj; + } + else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install + att.data = xiSwfUrlStr; + showExpressInstall(att, par, replaceElemIdStr, callbackFn); + return; + } + else { // show alternative content + setVisibility(replaceElemIdStr, true); + } + if (callbackFn) { callbackFn(callbackObj); } + }); + } + else if (callbackFn) { callbackFn(callbackObj); } + }, + + switchOffAutoHideShow: function() { + autoHideShow = false; + }, + + ua: ua, + + getFlashPlayerVersion: function() { + return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; + }, + + hasFlashPlayerVersion: hasPlayerVersion, + + createSWF: function(attObj, parObj, replaceElemIdStr) { + if (ua.w3) { + return createSWF(attObj, parObj, replaceElemIdStr); + } + else { + return undefined; + } + }, + + showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) { + if (ua.w3 && canExpressInstall()) { + showExpressInstall(att, par, replaceElemIdStr, callbackFn); + } + }, + + removeSWF: function(objElemIdStr) { + if (ua.w3) { + removeSWF(objElemIdStr); + } + }, + + createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) { + if (ua.w3) { + createCSS(selStr, declStr, mediaStr, newStyleBoolean); + } + }, + + addDomLoadEvent: addDomLoadEvent, + + addLoadEvent: addLoadEvent, + + getQueryParamValue: function(param) { + var q = doc.location.search || doc.location.hash; + if (q) { + if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark + if (param == null) { + return urlEncodeIfNecessary(q); + } + var pairs = q.split("&"); + for (var i = 0; i < pairs.length; i++) { + if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { + return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); + } + } + } + return ""; + }, + + // For internal usage only + expressInstallCallback: function() { + if (isExpressInstallActive) { + var obj = getElementById(EXPRESS_INSTALL_ID); + if (obj && storedAltContent) { + obj.parentNode.replaceChild(storedAltContent, obj); + if (storedAltContentId) { + setVisibility(storedAltContentId, true); + if (ua.ie && ua.win) { storedAltContent.style.display = "block"; } + } + if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); } + } + isExpressInstallActive = false; + } + } + }; +}(); diff --git a/spine-starling/spine-starling-example/src/Game.as b/spine-starling/spine-starling-example/src/Game.as new file mode 100644 index 000000000..bf5a1ebca --- /dev/null +++ b/spine-starling/spine-starling-example/src/Game.as @@ -0,0 +1,38 @@ +package { + +import spine.SkeletonAnimationSprite; +import spine.SkeletonData; +import spine.StarlingSkeletonJson; + +import starling.display.Sprite; +import starling.textures.Texture; +import starling.textures.TextureAtlas; + +public class Game extends Sprite { + [Embed(source = "spineboy.xml", mimeType = "application/octet-stream")] + static public const SpineboyAtlasXml:Class; + + [Embed(source = "spineboy.png")] + static public const SpineboyAtlasTexture:Class; + + [Embed(source = "spineboy.json", mimeType = "application/octet-stream")] + static public const SpineboyJson:Class; + + public function Game () { + var texture:Texture = Texture.fromBitmap(new SpineboyAtlasTexture()); + var xml:XML = XML(new SpineboyAtlasXml()); + var atlas:TextureAtlas = new TextureAtlas(texture, xml); + + var json:StarlingSkeletonJson = new StarlingSkeletonJson(atlas); + var skeletonData:SkeletonData = json.readSkeletonData(new SpineboyJson()); + + var skeleton:SkeletonAnimationSprite = new SkeletonAnimationSprite(skeletonData); + skeleton.x = 320; + skeleton.y = 420; + skeleton.width = 100; + skeleton.height = 100; + skeleton.setAnimation("walk", true); + addChild(skeleton); + } +} +} diff --git a/spine-starling/spine-starling-example/src/Main.as b/spine-starling/spine-starling-example/src/Main.as new file mode 100644 index 000000000..ab6b7c99d --- /dev/null +++ b/spine-starling/spine-starling-example/src/Main.as @@ -0,0 +1,17 @@ + +package { + +import flash.display.Sprite; +import starling.core.Starling; + +[SWF(width = "640", height = "480", frameRate = "60", backgroundColor = "#dddddd")] +public class Main extends Sprite { + private var _starling:Starling; + + public function Main () { + _starling = new Starling(Game, stage); + _starling.start(); + } +} + +} diff --git a/spine-starling/spine-starling-example/src/spineboy.json b/spine-starling/spine-starling-example/src/spineboy.json new file mode 100644 index 000000000..57b0f6cbe --- /dev/null +++ b/spine-starling/spine-starling-example/src/spineboy.json @@ -0,0 +1,787 @@ +{ +"bones": [ + { "name": "root" }, + { "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 }, + { "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 }, + { "name": "left lower leg", "parent": "left upper leg", "length": 56.45, "x": 51.78, "y": 3.46, "rotation": -16.65 }, + { "name": "left foot", "parent": "left lower leg", "length": 46.5, "x": 64.02, "y": -8.67, "rotation": 102.43 }, + { "name": "right upper leg", "parent": "hip", "length": 45.76, "x": -18.27, "rotation": -101.13 }, + { "name": "right lower leg", "parent": "right upper leg", "length": 58.52, "x": 50.21, "y": 0.6, "rotation": -10.7 }, + { "name": "right foot", "parent": "right lower leg", "length": 45.45, "x": 64.88, "y": 0.04, "rotation": 110.3 }, + { "name": "torso", "parent": "hip", "length": 85.82, "x": -6.42, "y": 1.97, "rotation": 94.95 }, + { "name": "neck", "parent": "torso", "length": 18.38, "x": 83.64, "y": -1.78, "rotation": 0.9 }, + { "name": "head", "parent": "neck", "length": 68.28, "x": 19.09, "y": 6.97, "rotation": -8.94 }, + { "name": "right shoulder", "parent": "torso", "length": 49.95, "x": 81.9, "y": 6.79, "rotation": 130.6 }, + { "name": "right arm", "parent": "right shoulder", "length": 36.74, "x": 49.95, "y": -0.12, "rotation": 40.12 }, + { "name": "right hand", "parent": "right arm", "length": 15.32, "x": 36.9, "y": 0.34, "rotation": 2.35 }, + { "name": "left shoulder", "parent": "torso", "length": 44.19, "x": 78.96, "y": -15.75, "rotation": -156.96 }, + { "name": "left arm", "parent": "left shoulder", "length": 35.62, "x": 44.19, "y": -0.01, "rotation": 28.16 }, + { "name": "left hand", "parent": "left arm", "length": 11.52, "x": 35.62, "y": 0.07, "rotation": 2.7 }, + { "name": "pelvis", "parent": "hip", "x": 1.41, "y": -6.57 } +], +"slots": [ + { "name": "left shoulder", "bone": "left shoulder", "attachment": "left-shoulder" }, + { "name": "left arm", "bone": "left arm", "attachment": "left-arm" }, + { "name": "left hand", "bone": "left hand", "attachment": "left-hand" }, + { "name": "left foot", "bone": "left foot", "attachment": "left-foot" }, + { "name": "left lower leg", "bone": "left lower leg", "attachment": "left-lower-leg" }, + { "name": "left upper leg", "bone": "left upper leg", "attachment": "left-upper-leg" }, + { "name": "pelvis", "bone": "pelvis", "attachment": "pelvis" }, + { "name": "right foot", "bone": "right foot", "attachment": "right-foot" }, + { "name": "right lower leg", "bone": "right lower leg", "attachment": "right-lower-leg" }, + { "name": "right upper leg", "bone": "right upper leg", "attachment": "right-upper-leg" }, + { "name": "torso", "bone": "torso", "attachment": "torso" }, + { "name": "neck", "bone": "neck", "attachment": "neck" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "eyes", "bone": "head", "attachment": "eyes" }, + { "name": "right shoulder", "bone": "right shoulder", "attachment": "right-shoulder" }, + { "name": "right arm", "bone": "right arm", "attachment": "right-arm" }, + { "name": "right hand", "bone": "right hand", "attachment": "right-hand" } +], +"skins": { + "default": { + "left shoulder": { + "left-shoulder": { "x": 23.74, "y": 0.11, "rotation": 62.01, "width": 34, "height": 53 } + }, + "left arm": { + "left-arm": { "x": 15.11, "y": -0.44, "rotation": 33.84, "width": 35, "height": 29 } + }, + "left hand": { + "left-hand": { "x": 0.75, "y": 1.86, "rotation": 31.14, "width": 35, "height": 38 } + }, + "left foot": { + "left-foot": { "x": 24.35, "y": 8.88, "rotation": 3.32, "width": 65, "height": 30 } + }, + "left lower leg": { + "left-lower-leg": { "x": 24.55, "y": -1.92, "rotation": 105.75, "width": 49, "height": 64 } + }, + "left upper leg": { + "left-upper-leg": { "x": 26.12, "y": -1.85, "rotation": 89.09, "width": 33, "height": 67 } + }, + "pelvis": { + "pelvis": { "x": -4.83, "y": 10.62, "width": 63, "height": 47 } + }, + "right foot": { + "right-foot": { "x": 19.02, "y": 8.47, "rotation": 1.52, "width": 67, "height": 30 } + }, + "right lower leg": { + "right-lower-leg": { "x": 23.28, "y": -2.59, "rotation": 111.83, "width": 51, "height": 64 } + }, + "right upper leg": { + "right-upper-leg": { "x": 23.03, "y": 0.25, "rotation": 101.13, "width": 44, "height": 70 } + }, + "torso": { + "torso": { "x": 44.57, "y": -7.08, "rotation": -94.95, "width": 68, "height": 92 } + }, + "neck": { + "neck": { "x": 9.42, "y": -3.66, "rotation": -100.15, "width": 34, "height": 28 } + }, + "head": { + "head": { "x": 53.94, "y": -5.75, "rotation": -86.9, "width": 121, "height": 132 } + }, + "eyes": { + "eyes": { "x": 28.94, "y": -32.92, "rotation": -86.9, "width": 34, "height": 27 }, + "eyes-closed": { "x": 28.77, "y": -32.86, "rotation": -86.9, "width": 34, "height": 27 } + }, + "right shoulder": { + "right-shoulder": { "x": 25.86, "y": 0.03, "rotation": 134.44, "width": 52, "height": 51 } + }, + "right arm": { + "right-arm": { "x": 18.34, "y": -2.64, "rotation": 94.32, "width": 21, "height": 45 } + }, + "right hand": { + "right-hand": { "x": 6.82, "y": 1.25, "rotation": 91.96, "width": 32, "height": 32 } + } + } +}, +"animations": { + "walk": { + "bones": { + "left upper leg": { + "rotate": [ + { "time": 0, "angle": -26.55 }, + { "time": 0.1333, "angle": -8.78 }, + { "time": 0.2666, "angle": 9.51 }, + { "time": 0.4, "angle": 30.74 }, + { "time": 0.5333, "angle": 25.33 }, + { "time": 0.6666, "angle": 26.11 }, + { "time": 0.8, "angle": -7.7 }, + { "time": 0.9333, "angle": -21.19 }, + { "time": 1.0666, "angle": -26.55 } + ], + "translate": [ + { "time": 0, "x": -3, "y": -2.25 }, + { "time": 0.4, "x": -2.18, "y": -2.25 }, + { "time": 1.0666, "x": -3, "y": -2.25 } + ] + }, + "right upper leg": { + "rotate": [ + { "time": 0, "angle": 42.45 }, + { "time": 0.1333, "angle": 52.1 }, + { "time": 0.2666, "angle": 5.96 }, + { "time": 0.5333, "angle": -16.93 }, + { "time": 0.6666, "angle": 1.89 }, + { + "time": 0.8, + "angle": 28.06, + "curve": [ 0.462, 0.11, 1, 1 ] + }, + { + "time": 0.9333, + "angle": 58.68, + "curve": [ 0.5, 0.02, 1, 1 ] + }, + { "time": 1.0666, "angle": 42.45 } + ], + "translate": [ + { "time": 0, "x": 8.11, "y": -2.36 }, + { "time": 0.1333, "x": 10.03, "y": -2.56 }, + { "time": 0.4, "x": 2.76, "y": -2.97 }, + { "time": 0.5333, "x": 2.76, "y": -2.81 }, + { "time": 0.9333, "x": 8.67, "y": -2.54 }, + { "time": 1.0666, "x": 8.11, "y": -2.36 } + ] + }, + "left lower leg": { + "rotate": [ + { "time": 0, "angle": -10.21 }, + { "time": 0.1333, "angle": -55.64 }, + { "time": 0.2666, "angle": -68.12 }, + { "time": 0.5333, "angle": 5.11 }, + { "time": 0.6666, "angle": -28.29 }, + { "time": 0.8, "angle": 4.08 }, + { "time": 0.9333, "angle": 3.53 }, + { "time": 1.0666, "angle": -10.21 } + ] + }, + "left foot": { + "rotate": [ + { "time": 0, "angle": -3.69 }, + { "time": 0.1333, "angle": -10.42 }, + { "time": 0.2666, "angle": -17.14 }, + { "time": 0.4, "angle": -2.83 }, + { "time": 0.5333, "angle": -3.87 }, + { "time": 0.6666, "angle": 2.78 }, + { "time": 0.8, "angle": 1.68 }, + { "time": 0.9333, "angle": -8.54 }, + { "time": 1.0666, "angle": -3.69 } + ] + }, + "right shoulder": { + "rotate": [ + { + "time": 0, + "angle": 20.89, + "curve": [ 0.264, 0, 0.75, 1 ] + }, + { + "time": 0.1333, + "angle": 3.72, + "curve": [ 0.272, 0, 0.841, 1 ] + }, + { "time": 0.6666, "angle": -278.28 }, + { "time": 1.0666, "angle": 20.89 } + ], + "translate": [ + { "time": 0, "x": -7.84, "y": 7.19 }, + { "time": 0.1333, "x": -6.36, "y": 6.42 }, + { "time": 0.6666, "x": -11.07, "y": 5.25 }, + { "time": 1.0666, "x": -7.84, "y": 7.19 } + ] + }, + "right arm": { + "rotate": [ + { + "time": 0, + "angle": -4.02, + "curve": [ 0.267, 0, 0.804, 0.99 ] + }, + { + "time": 0.1333, + "angle": -13.99, + "curve": [ 0.341, 0, 1, 1 ] + }, + { + "time": 0.6666, + "angle": 36.54, + "curve": [ 0.307, 0, 0.787, 0.99 ] + }, + { "time": 1.0666, "angle": -4.02 } + ] + }, + "right hand": { + "rotate": [ + { "time": 0, "angle": 22.92 }, + { "time": 0.4, "angle": -8.97 }, + { "time": 0.6666, "angle": 0.51 }, + { "time": 1.0666, "angle": 22.92 } + ] + }, + "left shoulder": { + "rotate": [ + { "time": 0, "angle": -1.47 }, + { "time": 0.1333, "angle": 13.6 }, + { "time": 0.6666, "angle": 280.74 }, + { "time": 1.0666, "angle": -1.47 } + ], + "translate": [ + { "time": 0, "x": -1.76, "y": 0.56 }, + { "time": 0.6666, "x": -2.47, "y": 8.14 }, + { "time": 1.0666, "x": -1.76, "y": 0.56 } + ] + }, + "left hand": { + "rotate": [ + { + "time": 0, + "angle": 11.58, + "curve": [ 0.169, 0.37, 0.632, 1.55 ] + }, + { + "time": 0.1333, + "angle": 28.13, + "curve": [ 0.692, 0, 0.692, 0.99 ] + }, + { + "time": 0.6666, + "angle": -27.42, + "curve": [ 0.117, 0.41, 0.738, 1.76 ] + }, + { "time": 0.8, "angle": -36.32 }, + { "time": 1.0666, "angle": 11.58 } + ] + }, + "left arm": { + "rotate": [ + { "time": 0, "angle": -8.27 }, + { "time": 0.1333, "angle": 18.43 }, + { "time": 0.6666, "angle": 0.88 }, + { "time": 1.0666, "angle": -8.27 } + ] + }, + "torso": { + "rotate": [ + { "time": 0, "angle": -10.28 }, + { + "time": 0.1333, + "angle": -15.38, + "curve": [ 0.545, 0, 1, 1 ] + }, + { + "time": 0.4, + "angle": -9.78, + "curve": [ 0.58, 0.17, 1, 1 ] + }, + { "time": 0.6666, "angle": -15.75 }, + { "time": 0.9333, "angle": -7.06 }, + { "time": 1.0666, "angle": -10.28 } + ], + "translate": [ + { "time": 0, "x": -3.67, "y": 1.68 }, + { "time": 0.1333, "x": -3.67, "y": 0.68 }, + { "time": 0.4, "x": -3.67, "y": 1.97 }, + { "time": 0.6666, "x": -3.67, "y": -0.14 }, + { "time": 1.0666, "x": -3.67, "y": 1.68 } + ] + }, + "right foot": { + "rotate": [ + { "time": 0, "angle": -5.25 }, + { "time": 0.2666, "angle": -4.08 }, + { "time": 0.4, "angle": -6.45 }, + { "time": 0.5333, "angle": -5.39 }, + { "time": 0.8, "angle": -11.68 }, + { "time": 0.9333, "angle": 0.46 }, + { "time": 1.0666, "angle": -5.25 } + ] + }, + "right lower leg": { + "rotate": [ + { "time": 0, "angle": -3.39 }, + { "time": 0.1333, "angle": -45.53 }, + { "time": 0.2666, "angle": -2.59 }, + { "time": 0.5333, "angle": -19.53 }, + { "time": 0.6666, "angle": -64.8 }, + { + "time": 0.8, + "angle": -82.56, + "curve": [ 0.557, 0.18, 1, 1 ] + }, + { "time": 1.0666, "angle": -3.39 } + ] + }, + "hip": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 1.0666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0 }, + { + "time": 0.1333, + "x": 0, + "y": -7.61, + "curve": [ 0.272, 0.86, 1, 1 ] + }, + { "time": 0.4, "x": 0, "y": 8.7 }, + { "time": 0.5333, "x": 0, "y": -0.41 }, + { + "time": 0.6666, + "x": 0, + "y": -7.05, + "curve": [ 0.235, 0.89, 1, 1 ] + }, + { "time": 0.8, "x": 0, "y": 2.92 }, + { "time": 0.9333, "x": 0, "y": 6.78 }, + { "time": 1.0666, "x": 0, "y": 0 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 3.6 }, + { "time": 0.1333, "angle": 17.49 }, + { "time": 0.2666, "angle": 6.1 }, + { "time": 0.4, "angle": 3.45 }, + { "time": 0.5333, "angle": 5.17 }, + { "time": 0.6666, "angle": 18.36 }, + { "time": 0.8, "angle": 6.09 }, + { "time": 0.9333, "angle": 2.28 }, + { "time": 1.0666, "angle": 3.6 } + ] + }, + "head": { + "rotate": [ + { + "time": 0, + "angle": 3.6, + "curve": [ 0, 0, 0.704, 1.61 ] + }, + { "time": 0.1666, "angle": -0.2 }, + { "time": 0.2666, "angle": 6.1 }, + { "time": 0.4, "angle": 3.45 }, + { + "time": 0.5333, + "angle": 5.17, + "curve": [ 0, 0, 0.704, 1.61 ] + }, + { "time": 0.7, "angle": 1.1 }, + { "time": 0.8, "angle": 6.09 }, + { "time": 0.9333, "angle": 2.28 }, + { "time": 1.0666, "angle": 3.6 } + ] + } + } + }, + "jump": { + "bones": { + "hip": { + "rotate": [ + { "time": 0, "angle": 0, "curve": "stepped" }, + { "time": 0.9333, "angle": 0, "curve": "stepped" }, + { "time": 1.3666, "angle": 0 } + ], + "translate": [ + { "time": 0, "x": -11.57, "y": -3 }, + { "time": 0.2333, "x": -16.2, "y": -19.43 }, + { + "time": 0.3333, + "x": 7.66, + "y": -8.48, + "curve": [ 0.057, 0.06, 0.712, 1 ] + }, + { "time": 0.3666, "x": 15.38, "y": 5.01 }, + { "time": 0.4666, "x": -7.84, "y": 57.22 }, + { + "time": 0.6, + "x": -10.81, + "y": 96.34, + "curve": [ 0.241, 0, 1, 1 ] + }, + { "time": 0.7333, "x": -7.01, "y": 54.7 }, + { "time": 0.8, "x": -10.58, "y": 32.2 }, + { "time": 0.9333, "x": -31.99, "y": 0.45 }, + { "time": 1.0666, "x": -12.48, "y": -29.47 }, + { "time": 1.3666, "x": -11.57, "y": -3 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "left upper leg": { + "rotate": [ + { "time": 0, "angle": 17.13 }, + { "time": 0.2333, "angle": 44.35 }, + { "time": 0.3333, "angle": 16.46 }, + { "time": 0.4, "angle": -9.88 }, + { "time": 0.4666, "angle": -11.42 }, + { "time": 0.5666, "angle": 23.46 }, + { "time": 0.7666, "angle": 71.82 }, + { "time": 0.9333, "angle": 65.53 }, + { "time": 1.0666, "angle": 51.01 }, + { "time": 1.3666, "angle": 17.13 } + ], + "translate": [ + { "time": 0, "x": -3, "y": -2.25, "curve": "stepped" }, + { "time": 0.9333, "x": -3, "y": -2.25, "curve": "stepped" }, + { "time": 1.3666, "x": -3, "y": -2.25 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "left lower leg": { + "rotate": [ + { "time": 0, "angle": -16.25 }, + { "time": 0.2333, "angle": -52.21 }, + { "time": 0.4, "angle": 15.04 }, + { "time": 0.4666, "angle": -8.95 }, + { "time": 0.5666, "angle": -39.53 }, + { "time": 0.7666, "angle": -27.27 }, + { "time": 0.9333, "angle": -3.52 }, + { "time": 1.0666, "angle": -61.92 }, + { "time": 1.3666, "angle": -16.25 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "left foot": { + "rotate": [ + { "time": 0, "angle": 0.33 }, + { "time": 0.2333, "angle": 6.2 }, + { "time": 0.3333, "angle": 14.73 }, + { "time": 0.4, "angle": -15.54 }, + { "time": 0.4333, "angle": -21.2 }, + { "time": 0.5666, "angle": -7.55 }, + { "time": 0.7666, "angle": -0.67 }, + { "time": 0.9333, "angle": -0.58 }, + { "time": 1.0666, "angle": 14.64 }, + { "time": 1.3666, "angle": 0.33 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "right upper leg": { + "rotate": [ + { "time": 0, "angle": 25.97 }, + { "time": 0.2333, "angle": 46.43 }, + { "time": 0.3333, "angle": 22.61 }, + { "time": 0.4, "angle": 2.13 }, + { + "time": 0.4666, + "angle": 0.04, + "curve": [ 0, 0, 0.637, 0.98 ] + }, + { "time": 0.6, "angle": 65.55 }, + { "time": 0.7666, "angle": 64.93 }, + { "time": 0.9333, "angle": 41.08 }, + { "time": 1.0666, "angle": 66.25 }, + { "time": 1.3666, "angle": 25.97 } + ], + "translate": [ + { "time": 0, "x": 5.74, "y": 0.61 }, + { "time": 0.2333, "x": 4.79, "y": 1.79 }, + { "time": 0.3333, "x": 6.05, "y": -4.55 }, + { "time": 0.9333, "x": 4.79, "y": 1.79, "curve": "stepped" }, + { "time": 1.0666, "x": 4.79, "y": 1.79 }, + { "time": 1.3666, "x": 5.74, "y": 0.61 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "right lower leg": { + "rotate": [ + { "time": 0, "angle": -27.46 }, + { "time": 0.2333, "angle": -64.03 }, + { "time": 0.4, "angle": -48.36 }, + { "time": 0.5666, "angle": -76.86 }, + { "time": 0.7666, "angle": -26.89 }, + { "time": 0.9, "angle": -18.97 }, + { "time": 0.9333, "angle": -14.18 }, + { "time": 1.0666, "angle": -80.45 }, + { "time": 1.3666, "angle": -27.46 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "right foot": { + "rotate": [ + { "time": 0, "angle": 1.08 }, + { "time": 0.2333, "angle": 16.02 }, + { "time": 0.3, "angle": 12.94 }, + { "time": 0.3333, "angle": 15.16 }, + { "time": 0.4, "angle": -14.7 }, + { "time": 0.4333, "angle": -12.85 }, + { "time": 0.4666, "angle": -19.18 }, + { "time": 0.5666, "angle": -15.82 }, + { "time": 0.6, "angle": -3.59 }, + { "time": 0.7666, "angle": -3.56 }, + { "time": 0.9333, "angle": 1.86 }, + { "time": 1.0666, "angle": 16.02 }, + { "time": 1.3666, "angle": 1.08 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "torso": { + "rotate": [ + { "time": 0, "angle": -13.35 }, + { "time": 0.2333, "angle": -48.95 }, + { "time": 0.4333, "angle": -35.77 }, + { "time": 0.6, "angle": -4.59 }, + { "time": 0.7666, "angle": 14.61 }, + { "time": 0.9333, "angle": 15.74 }, + { "time": 1.0666, "angle": -32.44 }, + { "time": 1.3666, "angle": -13.35 } + ], + "translate": [ + { "time": 0, "x": -3.67, "y": 1.68, "curve": "stepped" }, + { "time": 0.9333, "x": -3.67, "y": 1.68, "curve": "stepped" }, + { "time": 1.3666, "x": -3.67, "y": 1.68 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "neck": { + "rotate": [ + { "time": 0, "angle": 12.78 }, + { "time": 0.2333, "angle": 16.46 }, + { "time": 0.4, "angle": 26.49 }, + { "time": 0.6, "angle": 15.51 }, + { "time": 0.7666, "angle": 1.34 }, + { "time": 0.9333, "angle": 2.35 }, + { "time": 1.0666, "angle": 6.08 }, + { "time": 1.3, "angle": 21.23 }, + { "time": 1.3666, "angle": 12.78 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "head": { + "rotate": [ + { "time": 0, "angle": 5.19 }, + { "time": 0.2333, "angle": 20.27 }, + { "time": 0.4, "angle": 15.27 }, + { "time": 0.6, "angle": -24.69 }, + { "time": 0.7666, "angle": -11.02 }, + { "time": 0.9333, "angle": -24.38 }, + { "time": 1.0666, "angle": 11.99 }, + { "time": 1.3, "angle": 4.86 }, + { "time": 1.3666, "angle": 5.19 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "left shoulder": { + "rotate": [ + { + "time": 0, + "angle": 0.05, + "curve": [ 0, 0, 0.62, 1 ] + }, + { + "time": 0.2333, + "angle": 279.66, + "curve": [ 0.218, 0.67, 0.66, 0.99 ] + }, + { + "time": 0.5, + "angle": 62.27, + "curve": [ 0.462, 0, 0.764, 0.58 ] + }, + { "time": 0.9333, "angle": 28.91 }, + { "time": 1.0666, "angle": -8.62 }, + { "time": 1.1666, "angle": -18.43 }, + { "time": 1.3666, "angle": 0.05 } + ], + "translate": [ + { "time": 0, "x": -1.76, "y": 0.56, "curve": "stepped" }, + { "time": 0.9333, "x": -1.76, "y": 0.56, "curve": "stepped" }, + { "time": 1.3666, "x": -1.76, "y": 0.56 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "left hand": { + "rotate": [ + { "time": 0, "angle": 11.58, "curve": "stepped" }, + { "time": 0.9333, "angle": 11.58, "curve": "stepped" }, + { "time": 1.3666, "angle": 11.58 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "left arm": { + "rotate": [ + { "time": 0, "angle": 0.51 }, + { "time": 0.4333, "angle": 12.82 }, + { "time": 0.6, "angle": 47.55 }, + { "time": 0.9333, "angle": 12.82 }, + { "time": 1.1666, "angle": -6.5 }, + { "time": 1.3666, "angle": 0.51 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "right shoulder": { + "rotate": [ + { + "time": 0, + "angle": 43.82, + "curve": [ 0, 0, 0.62, 1 ] + }, + { + "time": 0.2333, + "angle": -8.74, + "curve": [ 0.304, 0.58, 0.709, 0.97 ] + }, + { + "time": 0.5333, + "angle": -208.02, + "curve": [ 0.462, 0, 0.764, 0.58 ] + }, + { "time": 0.9333, "angle": -246.72 }, + { "time": 1.0666, "angle": -307.13 }, + { "time": 1.1666, "angle": 37.15 }, + { "time": 1.3666, "angle": 43.82 } + ], + "translate": [ + { "time": 0, "x": -7.84, "y": 7.19, "curve": "stepped" }, + { "time": 0.9333, "x": -7.84, "y": 7.19, "curve": "stepped" }, + { "time": 1.3666, "x": -7.84, "y": 7.19 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "right arm": { + "rotate": [ + { "time": 0, "angle": -4.02 }, + { "time": 0.6, "angle": 17.5 }, + { "time": 0.9333, "angle": -4.02 }, + { "time": 1.1666, "angle": -16.72 }, + { "time": 1.3666, "angle": -4.02 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "right hand": { + "rotate": [ + { "time": 0, "angle": 22.92, "curve": "stepped" }, + { "time": 0.9333, "angle": 22.92, "curve": "stepped" }, + { "time": 1.3666, "angle": 22.92 } + ], + "translate": [ + { "time": 0, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 0.9333, "x": 0, "y": 0, "curve": "stepped" }, + { "time": 1.3666, "x": 0, "y": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 0.9333, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + }, + "root": { + "rotate": [ + { "time": 0, "angle": 0 }, + { "time": 0.4333, "angle": -14.52 }, + { "time": 0.8, "angle": 9.86 }, + { "time": 1.3666, "angle": 0 } + ], + "scale": [ + { "time": 0, "x": 1, "y": 1, "curve": "stepped" }, + { "time": 1.3666, "x": 1, "y": 1 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/spine-starling/spine-starling-example/src/spineboy.png b/spine-starling/spine-starling-example/src/spineboy.png new file mode 100644 index 0000000000000000000000000000000000000000..a34d38af0761184152511545d5cd808427b0c50e GIT binary patch literal 113804 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 Hu0mjf&Eo+* literal 0 HcmV?d00001 diff --git a/spine-starling/spine-starling-example/src/spineboy.xml b/spine-starling/spine-starling-example/src/spineboy.xml new file mode 100644 index 000000000..ce9a1ae12 --- /dev/null +++ b/spine-starling/spine-starling-example/src/spineboy.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spine-starling/spine-starling/.actionScriptProperties b/spine-starling/spine-starling/.actionScriptProperties new file mode 100644 index 000000000..6d664a1a1 --- /dev/null +++ b/spine-starling/spine-starling/.actionScriptProperties @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spine-starling/spine-starling/.flexLibProperties b/spine-starling/spine-starling/.flexLibProperties new file mode 100644 index 000000000..1fbacb45b --- /dev/null +++ b/spine-starling/spine-starling/.flexLibProperties @@ -0,0 +1,6 @@ + + + + + + diff --git a/spine-starling/spine-starling/.project b/spine-starling/spine-starling/.project new file mode 100644 index 000000000..c658a3a4e --- /dev/null +++ b/spine-starling/spine-starling/.project @@ -0,0 +1,18 @@ + + + spine-starling + + + + + + com.adobe.flexbuilder.project.flexbuilder + + + + + + com.adobe.flexbuilder.project.aslibnature + com.adobe.flexbuilder.project.actionscriptnature + + diff --git a/spine-starling/spine-starling/.settings/FlexPrettyPrintCommand.prefs b/spine-starling/spine-starling/.settings/FlexPrettyPrintCommand.prefs new file mode 100644 index 000000000..5ef23d336 --- /dev/null +++ b/spine-starling/spine-starling/.settings/FlexPrettyPrintCommand.prefs @@ -0,0 +1,202 @@ +#Tue Apr 30 18:56:15 CEST 2013 +ASRearr_AddDefaultHeaderForProperties=1 +ASRearr_AddDefaultHeaderForStaticProperties=1 +ASRearr_BlankLinesBeforeElement= +ASRearr_CopyrightHeader=style\=1|width\=80|blankLines\=2|fillChar\=-|text\= Copyright 2013\n All rights reserved.|linesBefore\=1| +ASRearr_ElementFunctionVisibilityOrder=public\:true,protected\:true,internal\:true,private\:true, +ASRearr_ElementOrder=Import,Include,Namespace Definition,Default Namespace,Namespace Use,Static Property,Static Function,Static Initializer,Constructor,Property,Function, +ASRearr_ElementPropertyVisibilityOrder=public\:true,protected\:true,internal\:true,private\:true, +ASRearr_ElementSortFunctions=true +ASRearr_ElementSortImports=true +ASRearr_ElementSortIncludes=true +ASRearr_ElementSortMetatags=false +ASRearr_ElementSortNamespaces=true +ASRearr_ElementSortProperties=true +ASRearr_ElementSortStaticFunctions=true +ASRearr_ElementSortStaticProperties=true +ASRearr_ElementStaticFunctionVisibilityOrder=public\:true,protected\:true,internal\:true,private\:true, +ASRearr_ElementStaticPropertyVisibilityOrder=public\:true,protected\:true,internal\:true,private\:true, +ASRearr_GroupGettersAndSettersWithProperties=false +ASRearr_GroupGettersAndSettersWithStaticProperties=false +ASRearr_ImportOrder=adobe,com,flash,mx, +ASRearr_MajorSectionHeader=style\=1|width\=60|blankLines\=4|fillChar\=-|text\=|linesBefore\=1| +ASRearr_MetatagOrder=ArrayElementType,Bindable,DefaultProperty,Deprecated,Effect,Embed,Event,Exclude,ExcludeClass,IconFile,Inspectable,InstanceType,NonCommittingChangeEvent,RemoteClass,Style,SWF,Transient, +ASRearr_MinorSectionHeader=style\=1|width\=40|blankLines\=0|fillChar\=-|text\=|linesBefore\=1| +ASRearr_ModifierOrder_Class=,override,native,public,private,protected,internal,static,dynamic,final +ASRearr_ModifierOrder_Function=,override,native,public,private,protected,internal,static,dynamic,final +ASRearr_ModifierOrder_Property=,override,native,public,private,protected,internal,static,dynamic,final +ASRearr_MoveImportsOutsideClass=true +ASRearr_RemoveExistingCopyrightHeaders=false +ASRearr_RemoveExistingSectionHeaders=false +ASRearr_SectionHeaderMap=\#\r\n\#Tue Apr 30 18\:56\:15 CEST 2013\r\n +ASRearr_SortGettersAndSettersWithAssociatedProperties=true +ASRearr_SortGettersAndSettersWithAssociatedStaticProperties=true +ASRearr_UseCopyrightGeneration=false +ASRearr_UseElementFunctionVisibilityOrder=true +ASRearr_UseElementOrder=true +ASRearr_UseElementPropertyVisibilityOrder=true +ASRearr_UseElementStaticFunctionVisibilityOrder=true +ASRearr_UseElementStaticPropertyVisibilityOrder=true +ASRearr_UseGlobalModifierOrder=true +ASRearr_UseImportOrder=true +ASRearr_UseMetatagOrder=false +ASRearr_UseModifierOrder_Class=true +ASRearr_UseModifierOrder_Function=true +ASRearr_UseModifierOrder_Property=true +ASRearr_UseSectionHeaders=false +ASRearr_UseSectionHeadersInMXML=false +ActionScript.keepRelativeIndentInDocComments=true +ActionScript.metatagsOnSameLineAsTargetFunction=Bindable +ActionScript.metatagsOnSameLineAsTargetProperty=Bindable, +ActionScript.spacesBeforeArguments=0 +ActionScript.spacesBeforeFormalParameters=1 +Actionscript.DocCommentKeepBlankLines=true +Actionscript.MLCommentAsteriskMode=0 +Actionscript.MLCommentHeaderOnSeparateLine=false +Actionscript.MLCommentKeepBlankLines=true +Actionscript.MLCommentReflowLines=false +Actionscript.addBracesToCases=1 +Actionscript.addBracesToConditionals=1 +Actionscript.addBracesToLoops=1 +Actionscript.advancedCRBeforeBraceSettings=2047 +Actionscript.advancedSpacesAroundEqualsInMetatags=0 +Actionscript.advancedSpacesAroundEqualsInOptionalParameters=0 +Actionscript.advancedSpacesInsideArrayDeclBrackets=1 +Actionscript.advancedSpacesInsideArrayRefBrackets=0 +Actionscript.advancedSpacesInsideLiteralBraces=1 +Actionscript.advancedSpacesInsideParensInArgumentLists=0 +Actionscript.advancedSpacesInsideParensInOtherPlaces=0 +Actionscript.advancedSpacesInsideParensInParameterLists=0 +Actionscript.advancedUseSpacesAroundEqualsInMetatags=false +Actionscript.advancedUseSpacesAroundEqualsInOptionalParameters=false +Actionscript.advancedWrappingAlignArrayItems=false +Actionscript.advancedWrappingAlignObjectItems=false +Actionscript.advancedWrappingAllArgs=false +Actionscript.advancedWrappingAllArrayItems=false +Actionscript.advancedWrappingAllObjectItems=false +Actionscript.advancedWrappingAllParms=false +Actionscript.advancedWrappingElements=165 +Actionscript.advancedWrappingEnforceMax=false +Actionscript.advancedWrappingFirstArg=false +Actionscript.advancedWrappingFirstArrayItem=false +Actionscript.advancedWrappingFirstObjectItem=false +Actionscript.advancedWrappingFirstParm=false +Actionscript.advancedWrappingGraceColumns=5 +Actionscript.advancedWrappingPreservePhrases=true +Actionscript.alignDeclEquals=false +Actionscript.alignDeclEqualsMode=1 +Actionscript.alignLineCommentsAtColumn=0 +Actionscript.alwaysGenerateIndent=false +Actionscript.blankLinesAtFunctionEnd=0 +Actionscript.blankLinesAtFunctionStart=0 +Actionscript.blankLinesBeforeClasses=1 +Actionscript.blankLinesBeforeControlStatements=0 +Actionscript.blankLinesBeforeFunctions=1 +Actionscript.blankLinesBeforeImportBlock=0 +Actionscript.blankLinesBeforeProperties=0 +Actionscript.blankLinesToKeep=0 +Actionscript.braceStyle=4 +Actionscript.breakLinesBeforeArithmeticOperator=false +Actionscript.breakLinesBeforeAssignment=false +Actionscript.breakLinesBeforeComma=false +Actionscript.breakLinesBeforeLogicalOperator=false +Actionscript.collapseSpacesForAdjacentParens=true +Actionscript.doRearrangeWhileFormatting=false +Actionscript.docCommentHangingIndentTabs=0 +Actionscript.docCommentReflow=false +Actionscript.dontIndentPackageItems=true +Actionscript.dontIndentSwitchCases=true +Actionscript.keepBlankLines=true +Actionscript.keepElseIfOnSameLine=true +Actionscript.keepSLCommentsOnColumn1=true +Actionscript.keepSpacesBeforeLineComments=false +Actionscript.leaveExtraWhitespaceAroundVarDecls=true +Actionscript.leaveSingleLineFunctions=false +Actionscript.maxLineLength=200 +Actionscript.newLineBeforeBindableFunction=true +Actionscript.newLineBeforeBindableProperty=true +Actionscript.noNewCRsBeforeBreak=false +Actionscript.noNewCRsBeforeContinue=false +Actionscript.noNewCRsBeforeExpression=false +Actionscript.noNewCRsBeforeReturn=false +Actionscript.noNewCRsBeforeThrow=false +Actionscript.putCatchOnNewLine=false +Actionscript.putElseOnNewLine=false +Actionscript.putEmptyStatementsOnNewLine=true +Actionscript.putOpenBraceOnNewLine=false +Actionscript.putWhileOnNewLine=false +Actionscript.spacesAfterColonsInDeclarations=0 +Actionscript.spacesAfterColonsInFunctions=1 +Actionscript.spacesAfterComma=1 +Actionscript.spacesAfterLabel=1 +Actionscript.spacesAroundAssignment=1 +Actionscript.spacesAroundBinarySymbolicOperator=1 +Actionscript.spacesAroundColons=1 +Actionscript.spacesBeforeColonsInDeclarations=0 +Actionscript.spacesBeforeColonsInFunctions=1 +Actionscript.spacesBeforeComma=0 +Actionscript.spacesBeforeControlOpenParen=1 +Actionscript.spacesInsideParens=0 +Actionscript.tabCountForHangingIndent=1 +Actionscript.unindentExpressionTerminators=false +Actionscript.useAdvancedWrapping=false +Actionscript.useBraceStyle=false +Actionscript.useDocCommentWrapping=false +Actionscript.useGlobalCRBeforeBrace=true +Actionscript.useGlobalSpacesAroundColons=false +Actionscript.useGlobalSpacesInsideParens=true +Actionscript.useGnuBraceIndent=false +Actionscript.useLineCommentWrapping=false +Actionscript.useMLCommentWrapping=false +Actionscript.wrapArrayDeclMode=1 +Actionscript.wrapEmbeddedXMLMode=2 +Actionscript.wrapExpressionMode=1 +Actionscript.wrapIndentStyle=1000 +Actionscript.wrapMethodCallMode=1 +Actionscript.wrapMethodDeclMode=1 +Flex.useTabs=true +MXML.KeepScriptCDataOnSameLine=false +MXML.ScriptCDataIndentTabs=1 +MXML.ScriptIndentTabs=1 +MXML.addNewlineAfterLastAttr=false +MXML.alwaysUseMaxLineLength=false +MXML.attrGroups=name\=properties|sort\=11|includeStates\=true|wrap\=54|attrs\=allowDisjointSelection,allowMultipleSelection,allowThumbOverlap,allowTrackClick,autoLayout,autoRepeat,automationName,cachePolicy,class,clipContent,condenseWhite,conversion,creationIndex,creationPolicy,currentState,data,dataDescriptor,dataProvider,dataTipFormatFunction,dayNames,defaultButton,direction,disabledDays,disabledRanges,displayedMonth,displayedYear,doubleClickEnabled,emphasized,enabled,explicitHeight,explicitMaxHeight,explicitMaxWidth,explicitMinHeight,explicitMinWidth,explicitWidth,firstDayOfWeek,focusEnabled,fontContext,height,horizontalLineScrollSize,horizontalPageScrollSize,horizontalScrollBar,horizontalScrollPolicy,horizontalScrollPosition,htmlText,icon,iconField,id,imeMode,includeInLayout,indeterminate,label,labelField,labelFunction,labelPlacement,labels,layout,lineScrollSize,listData,liveDragging,maxChars,maxHeight,maxScrollPosition,maxWidth,maxYear,maximum,measuredHeight,measuredMinHeight,measuredMinWidth,measuredWidth,menuBarItemRenderer,menuBarItems,menus,minHeight,minScrollPosition,minWidth,minYear,minimum,mode,monthNames,monthSymbol,mouseFocusEnabled,pageScrollSize,pageSize,percentHeight,percentWidth,scaleX,scaleY,scrollPosition,selectable,selectableRange,selected,selectedDate,selectedField,selectedIndex,selectedRanges,showDataTip,showRoot,showToday,sliderDataTipClass,sliderThumbClass,snapInterval,source,states,stepSize,stickyHighlighting,styleName,text,thumbCount,tickInterval,tickValues,toggle,toolTip,transitions,truncateToFit,validationSubField,value,verticalLineScrollSize,verticalPageScrollSize,verticalScrollBar,verticalScrollPolicy,verticalScrollPosition,width,x,y,yearNavigationEnabled,yearSymbol,|data\=-1|\nname\=xml_namespaces|sort\=11|includeStates\=true|wrap\=54|attrs\=xmlns,xmlns\:.*,|data\=-1|\nname\=events|sort\=11|includeStates\=true|wrap\=54|attrs\=add,added,activate,addedToStage,buttonDown,change,childAdd,childIndexChange,childRemove,clickHandler,clear,click,complete,contextMenu,copy,creationComplete,currentStateChange,currentStateChanging,cut,dataChange,deactivate,doubleClick,dragComplete,dragDrop,dragEnter,dragExit,dragOver,dragStart,effectEnd,effectStart,enterFrame,enterState,exitFrame,exitState,focusIn,focusOut,frameConstructed,hide,httpStatus,init,initialize,invalid,ioError,itemClick,itemRollOut,itemRollOver,keyDown,keyFocusChange,keyUp,menuHide,menuShow,middleClick,middleMouseDown,middleMouseUp,mouseDown,mouseUp,mouseOver,mouseMove,mouseOut,mouseFocusChange,mouseWheel,mouseDownOutside,mouseWheelOutside,move,nativeDragComplete,nativeDragDrop,nativeDragEnter,nativeDragExit,nativeDragOver,nativeDragStart,nativeDragUpdate,open,paste,preinitialize,progress,record,remove,removed,removedFromStage,render,resize,rightClick,rightMouseDown,rightMouseUp,rollOut,rollOver,scroll,securityError,selectAll,show,tabChildrenChange,tabEnabledChange,tabIndexChange,thumbDrag,thumbPress,thumbRelease,toolTipCreate,toolTipEnd,toolTipHide,toolTipShow,toolTipShown,toolTipStart,updateComplete,unload,valid,valueCommit,|data\=-1|\nname\=styles|sort\=11|includeStates\=true|wrap\=54|attrs\=backgroundAlpha,backgroundAttachment,backgroundColor,backgroundDisabledColor,backgroundImage,backgroundSize,backgroundSkin,barColor,barSkin,borderColor,borderSides,borderSkin,borderStyle,borderThickness,bottom,color,cornerRadius,dataTipOffset,dataTipPrecision,dataTipStyleName,disabledColor,disabledIcon,disabledIconColor,disabledSkin,disbledOverlayAlpha,downArrowDisabledSkin,downArrowDownSkin,downArrowOverSkin,downArrowUpSkin,downIcon,downSkin,dropShadowColor,dropShadowEnabled,errorColor,fillAlphas,fillColors,focusAlpha,focusBlendMode,focusRoundedCorners,focusSkin,focusThickness,fontAntiAliasType,fontFamily,fontGridFitType,fontSharpness,fontSize,fontStyle,fontThickness,fontWeight,fontfamily,headerColors,headerStyleName,highlightAlphas,horizontalAlign,horizontalCenter,horizontalGap,horizontalScrollBarStyleName,icon,iconColor,indeterminateMoveInterval,indeterminateSkin,itemDownSkin,itemOverSkin,itemUpSkin,kerning,labelOffset,labelStyleName,labelWidth,leading,left,letterSpacing,maskSkin,menuStyleName,nextMonthDisabledSkin,nextMonthDownSkin,nextMonthOverSkin,nextMonthSkin,nextMonthUpSkin,nextYearDisabledSkin,nextYearDownSkin,nextYearOverSkin,nextYearSkin,nextYearUpSkin,overIcon,overSkin,paddingBottom,paddingLeft,paddingRight,paddingTop,prevMonthDisabledSkin,prevMonthDownSkin,prevMonthOverSkin,prevMonthSkin,prevMonthUpSkin,prevYearDisabledSkin,prevYearDownSkin,prevYearOverSkin,prevYearSkin,prevYearUpSkin,repeatDelay,repeatInterval,right,rollOverColor,rollOverIndicatorSkin,selectedDisabledIcon,selectedDisabledSkin,selectedDownIcon,selectedDownSkin,selectedOverIcon,selectedOverSkin,selectedUpIcon,selectedUpSkin,selectionColor,selectionIndicatorSkin,shadowColor,shadowDirection,shadowDistance,showTrackHighlight,skin,slideDuration,slideEasingFunction,strokeColor,strokeWidth,textAlign,textDecoration,textIndent,textRollOverColor,textSelectedColor,themeColor,thumbDisabledSkin,thumbDownSkin,thumbIcon,thumbOffset,thumbOverSkin,thumbUpSkin,tickColor,tickLength,tickOffset,tickThickness,todayColor,todayIndicatorSkin,todayStyleName,top,tracHighlightSkin,trackColors,trackHeight,trackMargin,trackSkin,upArrowDisabledSkin,upArrowDownSkin,upArrowOverSkin,upArrowUpSkin,upIcon,upSkin,verticalAlign,verticalCenter,verticalGap,verticalScrollBarStyleName,weekDayStyleName,|data\=-1|\nname\=effects|sort\=11|includeStates\=true|wrap\=54|attrs\=addedEffect,completeEffect,creationCompleteEffect,focusInEffect,focusOutEffect,hideEffect,mouseDownEffect,mouseUpEffect,moveEffect,removedEffect,resizeEffect,rollOutEffect,rollOverEffect,showEffect,|data\=-1|\nname\=Special_Group--Other Attributes|sort\=11|includeStates\=true|wrap\=54|attrs\=|data\=-1|\n +MXML.attrWrapMode=52 +MXML.attrsPerLine=1 +MXML.attrsToKeepOnSameLine=4 +MXML.blankLinesAfterParentTags=0 +MXML.blankLinesAfterSpecificParentTags=0 +MXML.blankLinesAtCDataStart=0 +MXML.blankLinesBeforeClosingTags=0 +MXML.blankLinesBeforeComments=0 +MXML.blankLinesBeforeTags=0 +MXML.blankLinesBetweenSiblingTags=0 +MXML.doRemoveNamespacesWhileFormatting=false +MXML.indentTagClose=true +MXML.keepBlankLines=true +MXML.keepRelativeIndentInMultilineComments=true +MXML.maxLineLength=200 +MXML.onlyFormatASIfCDATABlock=false +MXML.parentTagsToHaveBlankLinesAddedAfterThem= +MXML.sortAttrData= +MXML.sortAttrMode=0 +MXML.sortExtraAttrs=false +MXML.spacesAroundEquals=0 +MXML.spacesBeforeEmptyTagEnd=0 +MXML.spacesInsideAttributeBraces=0 +MXML.tabCountForHangingIndent=1 +MXML.tagsCanFormat=mx\:List,fx\:List, +MXML.tagsCannotFormat=mx\:String,fx\:String, +MXML.tagsDoNotFormatInside=.*\:Model,.*\:XML, +MXML.tagsToHaveBlankLinesAddedBeforeThem= +MXML.tagsWithASContent=.*\:add,.*\:added,.*\:activate,.*\:addedToStage,.*\:buttonDown,.*\:change,.*\:childAdd,.*\:childIndexChange,.*\:childRemove,.*\:clickHandler,.*\:clear,.*\:click,.*\:complete,.*\:contextMenu,.*\:copy,.*\:creationComplete,.*\:currentStateChange,.*\:currentStateChanging,.*\:cut,.*\:dataChange,.*\:deactivate,.*\:doubleClick,.*\:dragComplete,.*\:dragDrop,.*\:dragEnter,.*\:dragExit,.*\:dragOver,.*\:dragStart,.*\:effectEnd,.*\:effectStart,.*\:enterFrame,.*\:enterState,.*\:exitFrame,.*\:exitState,.*\:focusIn,.*\:focusOut,.*\:frameConstructed,.*\:hide,.*\:httpStatus,.*\:init,.*\:initialize,.*\:invalid,.*\:ioError,.*\:itemClick,.*\:itemRollOut,.*\:itemRollOver,.*\:keyDown,.*\:keyFocusChange,.*\:keyUp,.*\:menuHide,.*\:menuShow,.*\:middleClick,.*\:middleMouseDown,.*\:middleMouseUp,.*\:mouseDown,.*\:mouseUp,.*\:mouseOver,.*\:mouseMove,.*\:mouseOut,.*\:mouseFocusChange,.*\:mouseWheel,.*\:mouseDownOutside,.*\:mouseWheelOutside,.*\:move,.*\:nativeDragComplete,.*\:nativeDragDrop,.*\:nativeDragEnter,.*\:nativeDragExit,.*\:nativeDragOver,.*\:nativeDragStart,.*\:nativeDragUpdate,.*\:open,.*\:paste,.*\:preinitialize,.*\:progress,.*\:record,.*\:remove,.*\:removed,.*\:removedFromStage,.*\:render,.*\:resize,.*\:rightClick,.*\:rightMouseDown,.*\:rightMouseUp,.*\:rollOut,.*\:rollOver,.*\:scroll,.*\:securityError,.*\:selectAll,.*\:show,.*\:tabChildrenChange,.*\:tabEnabledChange,.*\:tabIndexChange,.*\:thumbDrag,.*\:thumbPress,.*\:thumbRelease,.*\:toolTipCreate,.*\:toolTipEnd,.*\:toolTipHide,.*\:toolTipShow,.*\:toolTipShown,.*\:toolTipStart,.*\:updateComplete,.*\:unload,.*\:valid,.*\:valueCommit,.*\:Script, +MXML.useAttrsToKeepOnSameLine=false +MXML.useFormattingOfBoundAttributes=false +MXML.useSpacesInsideAttributeBraces=false +MXML.useTagsDoNotFormatInside=false +MXML.wrapIndentStyle=1001 +MXMLRearr_RearrangeTagOrdering=.*\:Binding,.*\:Component,.*\:Declarations,.*\:Definition,.*\:DesignLayer,.*\:Library,.*\:Metadata,.*\:Model,.*\:Private,.*\:Reparent,.*\:Script,.*\:Style,.*\:XML,.*\:XMLList,.*\:operation,.*\:request,.*\:method,.*\:arguments,.*\:states,.*\:layout,\#\#\#UnmatchedTags\#\#\#, +MXMLRearr_RearrangeWhileFormatting=false +MXMLRearr_UseRearrangeTagOrdering=false +UseProjectSettings=false +eclipse.preferences.version=1 diff --git a/spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs b/spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..4ef613960 --- /dev/null +++ b/spine-starling/spine-starling/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Mon Apr 22 14:45:38 CEST 2013 +eclipse.preferences.version=1 +encoding/=utf-8 diff --git a/spine-starling/spine-starling/libs/starling.swc b/spine-starling/spine-starling/libs/starling.swc new file mode 100644 index 0000000000000000000000000000000000000000..9c9e08f17265f6a012e264b2324b27e88d709ada GIT binary patch literal 134592 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À&-d|jlTaUq}Mu+JPXytKf7_kMG0 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 BG_e2x literal 0 HcmV?d00001 diff --git a/spine-starling/spine-starling/src/spine/SkeletonAnimationSprite.as b/spine-starling/spine-starling/src/spine/SkeletonAnimationSprite.as new file mode 100644 index 000000000..716d4f578 --- /dev/null +++ b/spine-starling/spine-starling/src/spine/SkeletonAnimationSprite.as @@ -0,0 +1,66 @@ +package spine { +import spine.AnimationState; +import spine.AnimationStateData; +import spine.SkeletonData; + +import starling.events.EnterFrameEvent; + +public class SkeletonAnimationSprite extends SkeletonSprite { + public var states:Vector. = new Vector.(); + + public function SkeletonAnimationSprite (skeletonData:SkeletonData) { + super(skeletonData); + addAnimationState(); + } + + override protected function onEnterFrame (event:EnterFrameEvent) : void { + super.onEnterFrame(event); + + var deltaTime:Number = event.passedTime * timeScale; + for each (var state:AnimationState in states) { + state.update(deltaTime); + state.apply(skeleton); + } + skeleton.updateWorldTransform(); + } + + public function addAnimationState (stateData:AnimationStateData = null) : void { + if (!stateData) + stateData = new AnimationStateData(skeleton.data); + states.push(new AnimationState(stateData)); + } + + public function setAnimationStateData (stateData:AnimationStateData, stateIndex:int = 0) : void { + if (stateIndex < 0 || stateIndex >= states.length) + throw new ArgumentError("stateIndex out of range."); + if (!stateData) + throw new ArgumentError("stateData cannot be null."); + states[stateIndex] = new AnimationState(stateData); + } + + public function setMix (fromAnimation:String, toAnimation:String, duration:Number, stateIndex:int = 0) : void { + if (stateIndex < 0 || stateIndex >= states.length) + throw new ArgumentError("stateIndex out of range."); + states[stateIndex].data.setMixByName(fromAnimation, toAnimation, duration); + } + + public function setAnimation (name:String, loop:Boolean, stateIndex:int = 0) : void { + if (stateIndex < 0 || stateIndex >= states.length) + throw new ArgumentError("stateIndex out of range."); + states[stateIndex].setAnimationByName(name, loop); + } + + public function addAnimation (name:String, loop:Boolean, delay:Number = 0, stateIndex:int = 0) : void { + if (stateIndex < 0 || stateIndex >= states.length) + throw new ArgumentError("stateIndex out of range."); + states[stateIndex].addAnimationByName(name, loop, delay); + } + + public function clearAnimation (stateIndex:int = 0) : void { + if (stateIndex < 0 || stateIndex >= states.length) + throw new ArgumentError("stateIndex out of range."); + states[stateIndex].clearAnimation(); + } +} + +} diff --git a/spine-starling/spine-starling/src/spine/SkeletonImage.as b/spine-starling/spine-starling/src/spine/SkeletonImage.as new file mode 100644 index 000000000..38d160d96 --- /dev/null +++ b/spine-starling/spine-starling/src/spine/SkeletonImage.as @@ -0,0 +1,21 @@ +package spine { + +import starling.display.Image; +import starling.textures.Texture; +import starling.utils.VertexData; + +public class SkeletonImage extends Image { + public function SkeletonImage (texture:Texture) { + super(texture); + } + + public function get vertexData () : VertexData { + return mVertexData; + } + + override public function get tinted () : Boolean { + return true; + } +} + +} diff --git a/spine-starling/spine-starling/src/spine/SkeletonSprite.as b/spine-starling/spine-starling/src/spine/SkeletonSprite.as new file mode 100644 index 000000000..c422f64fd --- /dev/null +++ b/spine-starling/spine-starling/src/spine/SkeletonSprite.as @@ -0,0 +1,207 @@ +package spine { +import flash.geom.Matrix; +import flash.geom.Point; +import flash.geom.Rectangle; + +import spine.Bone; +import spine.Skeleton; +import spine.SkeletonData; +import spine.Slot; +import spine.attachments.RegionAttachment; + +import starling.core.RenderSupport; +import starling.display.DisplayObject; +import starling.events.EnterFrameEvent; +import starling.events.Event; +import starling.utils.MatrixUtil; + +public class SkeletonSprite extends DisplayObject { + static private var tempPoint:Point = new Point(); + static private var tempMatrix:Matrix = new Matrix(); + + private var _skeleton:Skeleton; + public var timeScale:Number = 1; + + public function SkeletonSprite (skeletonData:SkeletonData) { + _skeleton = new Skeleton(skeletonData); + _skeleton.updateWorldTransform(); + + addEventListener(Event.ENTER_FRAME, onEnterFrame); + + Bone.yDown = true; + } + + protected function onEnterFrame (event:EnterFrameEvent) : void { + _skeleton.update(event.passedTime * timeScale); + } + + override public function render (support:RenderSupport, alpha:Number) : void { + var drawOrder:Vector. = skeleton.drawOrder; + for (var i:int = 0, n:int = drawOrder.length; i < n; i++) { + var slot:Slot = drawOrder[i]; + var regionAttachment:RegionAttachment = slot.attachment as RegionAttachment; + if (regionAttachment != null) { + regionAttachment.updateVertices(slot.bone); + var vertices:Vector. = regionAttachment.vertices; + var r:Number = skeleton.r * slot.r; + var g:Number = skeleton.g * slot.g; + var b:Number = skeleton.b * slot.b; + var a:Number = skeleton.a * slot.a; + + var image:SkeletonImage = regionAttachment.texture as SkeletonImage; + var vertexData:Vector. = image.vertexData.rawData; + + vertexData[0] = vertices[2]; + vertexData[1] = vertices[3]; + vertexData[2] = r; + vertexData[3] = g; + vertexData[4] = b; + vertexData[5] = a; + + vertexData[8] = vertices[4]; + vertexData[9] = vertices[5]; + vertexData[10] = r; + vertexData[11] = g; + vertexData[12] = b; + vertexData[13] = a; + + vertexData[16] = vertices[0]; + vertexData[17] = vertices[1]; + vertexData[18] = r; + vertexData[19] = g; + vertexData[20] = b; + vertexData[21] = a; + + vertexData[24] = vertices[6]; + vertexData[25] = vertices[7]; + vertexData[26] = r; + vertexData[27] = g; + vertexData[28] = b; + vertexData[29] = a; + + support.batchQuad(image, alpha, image.texture); + } + } + } + + override public function getBounds (targetSpace:DisplayObject, resultRect:Rectangle = null) : Rectangle { + var minX:Number = Number.MAX_VALUE, minY:Number = Number.MAX_VALUE; + var maxX:Number = Number.MIN_VALUE, maxY:Number = Number.MIN_VALUE; + var scaleX:Number = this.scaleX; + var scaleY:Number = this.scaleY; + var slots:Vector. = skeleton.slots; + var value:Number; + for (var i:int = 0, n:int = slots.length; i < n; i++) { + var slot:Slot = slots[i]; + var regionAttachment:RegionAttachment = slot.attachment as RegionAttachment; + if (!regionAttachment) + continue; + + regionAttachment.updateVertices(slot.bone); + var vertices:Vector. = regionAttachment.vertices; + + value = vertices[0] * scaleX; + if (value < minX) + minX = value; + if (value > maxX) + maxX = value; + + value = vertices[1] * scaleY; + if (value < minY) + minY = value; + if (value > maxY) + maxY = value; + + value = vertices[2] * scaleX; + if (value < minX) + minX = value; + if (value > maxX) + maxX = value; + + value = vertices[3] * scaleY; + if (value < minY) + minY = value; + if (value > maxY) + maxY = value; + + value = vertices[4] * scaleX; + if (value < minX) + minX = value; + if (value > maxX) + maxX = value; + + value = vertices[5] * scaleY; + if (value < minY) + minY = value; + if (value > maxY) + maxY = value; + + value = vertices[6] * scaleX; + if (value < minX) + minX = value; + if (value > maxX) + maxX = value; + + value = vertices[7] * scaleY; + if (value < minY) + minY = value; + if (value > maxY) + maxY = value; + } + + if (!resultRect) + resultRect = new Rectangle(); + + // FIXME + resultRect.setTo(0, 0, 0, 0); + return resultRect; + // No idea why the below makes rendering very small. :( Returning 0,0 0x0 renders fine?? + if (targetSpace == this) { + resultRect.x = minX; + resultRect.y = minY; + resultRect.width = maxX - minX; + resultRect.height = maxY - minY; + } else if (targetSpace == parent && rotation == 0.0) { + resultRect.x = x + minX - pivotX * scaleX; + resultRect.y = y + minY - pivotY * scaleY; + resultRect.width = (maxX - minX) * scaleX; + resultRect.height = (maxY - minY) * scaleY; + if (scaleX < 0) { + resultRect.width *= -1; + resultRect.x -= resultRect.width; + } + if (scaleY < 0) { + resultRect.height *= -1; + resultRect.y -= resultRect.height; + } + } else { + getTransformationMatrix(targetSpace, tempMatrix); + MatrixUtil.transformCoords(tempMatrix, minX, minY, tempPoint); + minX = tempPoint.x; + minY = tempPoint.y; + MatrixUtil.transformCoords(tempMatrix, maxX, maxY, tempPoint); + if (minX > tempPoint.x) { + maxX = minX; + minX = tempPoint.x; + } else + maxX = tempPoint.x; + if (minY > tempPoint.y) { + maxY = minY; + minY = tempPoint.y; + } else + maxY = tempPoint.y; + resultRect.x = minX; + resultRect.y = minY; + resultRect.width = maxX - minX; + resultRect.height = maxY - minY; + } + return resultRect; + } + + public function get skeleton () : Skeleton { + return _skeleton; + } +} + +} + diff --git a/spine-starling/spine-starling/src/spine/StarlingAtlasAttachmentLoader.as b/spine-starling/spine-starling/src/spine/StarlingAtlasAttachmentLoader.as new file mode 100644 index 000000000..618f1a912 --- /dev/null +++ b/spine-starling/spine-starling/src/spine/StarlingAtlasAttachmentLoader.as @@ -0,0 +1,39 @@ +package spine { +import spine.Bone; +import spine.Skin; +import spine.attachments.Attachment; +import spine.attachments.AttachmentLoader; +import spine.attachments.AttachmentType; +import spine.attachments.RegionAttachment; + +import starling.textures.Texture; +import starling.textures.TextureAtlas; + +public class StarlingAtlasAttachmentLoader implements AttachmentLoader { + private var atlas:TextureAtlas; + + public function StarlingAtlasAttachmentLoader (atlas:TextureAtlas) { + this.atlas = atlas; + + Bone.yDown = true; + } + + public function newAttachment (skin:Skin, type:AttachmentType, name:String) : Attachment { + if (type == AttachmentType.region) { + var regionAttachment:RegionAttachment = new RegionAttachment(name); + var texture:Texture = atlas.getTexture(name); + regionAttachment.texture = new SkeletonImage(texture); + regionAttachment.regionOffsetX = texture.frame.x; + regionAttachment.regionOffsetY = texture.frame.y; + regionAttachment.regionWidth = texture.width; + regionAttachment.regionHeight = texture.height; + regionAttachment.regionOriginalWidth = texture.width; + regionAttachment.regionOriginalHeight = texture.height; + return regionAttachment; + } + + throw new Error("Unknown attachment type: " + type); + } +} + +} diff --git a/spine-starling/spine-starling/src/spine/StarlingSkeletonJson.as b/spine-starling/spine-starling/src/spine/StarlingSkeletonJson.as new file mode 100644 index 000000000..c77f4d2bd --- /dev/null +++ b/spine-starling/spine-starling/src/spine/StarlingSkeletonJson.as @@ -0,0 +1,34 @@ +package spine { +import flash.utils.ByteArray; + +import spine.Bone; +import spine.SkeletonData; +import spine.SkeletonJson; +import spine.attachments.AttachmentLoader; + +import starling.textures.TextureAtlas; + +public class StarlingSkeletonJson { + private var json:SkeletonJson; + + /** @param object A TextureAtlas or AttachmentLoader. */ + public function StarlingSkeletonJson (object:*) { + if (object is TextureAtlas) + json = new SkeletonJson(new StarlingAtlasAttachmentLoader(object)); + else if (object is AttachmentLoader) + json = new SkeletonJson(AttachmentLoader(object)); + else + throw new Error("object must be a TextureAtlas or AttachmentLoader."); + + Bone.yDown = true; + } + + /** @param object A String or ByteArray. */ + public function readSkeletonData (object:*, name:String = null) : SkeletonData { + if (object is String) return json.readSkeletonData(String(object), name); + if (object is ByteArray) return json.readSkeletonData(object.readUTFBytes(object.length), name); + throw new Error("object must be a String or ByteArray."); + } +} + +}