From d69f514681dfb0b439c05edf85d20978b9aba2d2 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 13:39:24 +0300 Subject: [PATCH 01/11] remove findslot from skeleton and make it into a table, for faster lookups --- spine-lua/Animation.lua | 16 ++++++++-------- spine-lua/Skeleton.lua | 10 ++-------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index 9f33f3144..8d5fb15c3 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -36,7 +36,7 @@ function Animation.new (name, timelines, duration) function self:apply (skeleton, time, loop) if not skeleton then error("skeleton cannot be nil.", 2) end - if loop and duration > 0 then time = time % duration end + if loop and duration then time = time % duration end for i,timeline in ipairs(self.timelines) do timeline:apply(skeleton, time, 1) @@ -46,7 +46,7 @@ function Animation.new (name, timelines, duration) function self:mix (skeleton, time, loop, alpha) if not skeleton then error("skeleton cannot be nil.", 2) end - if loop and duration > 0 then time = time % duration end + if loop and duration then time = time % duration end for i,timeline in ipairs(self.timelines) do timeline:apply(skeleton, time, alpha) @@ -371,11 +371,11 @@ function Animation.ColorTimeline.new () local g = lastFrameG + (frames[frameIndex + FRAME_G] - lastFrameG) * percent local b = lastFrameB + (frames[frameIndex + FRAME_B] - lastFrameB) * percent local a = lastFrameA + (frames[frameIndex + FRAME_A] - lastFrameA) * percent - if alpha < 1 then - slot:setColor(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:setColor(r, g, b, a) - end + --if alpha < 1 then + -- slot:setColor(slot.r + (r - color.r) * alpha, slot.g + (g - color.g) * alpha, slot.b + (b - color.b) * alpha, slot.a + (a - color.a) * alpha) + --else + slot:setColor(r, g, b, a) + --end end return self @@ -415,7 +415,7 @@ function Animation.AttachmentTimeline.new () local attachmentName = self.attachmentNames[frameIndex] local attachment if attachmentName then attachment = skeleton:getAttachment(self.slotName, attachmentName) end - skeleton:findSlot(self.slotName):setAttachment(attachment) + skeleton.slotsByName[self.slotName]:setAttachment(attachment) end return self diff --git a/spine-lua/Skeleton.lua b/spine-lua/Skeleton.lua index 2626de810..50d27a589 100644 --- a/spine-lua/Skeleton.lua +++ b/spine-lua/Skeleton.lua @@ -35,6 +35,7 @@ function Skeleton.new (skeletonData) data = skeletonData, bones = {}, slots = {}, + slotsByName = {}, drawOrder = {} } @@ -73,14 +74,6 @@ function Skeleton.new (skeletonData) return nil end - function self:findSlot (slotName) - if not slotName then error("slotName cannot be nil.", 2) end - for i,slot in ipairs(self.slots) do - if slot.data.name == slotName then return slot end - end - return nil - end - function self:setSkin (skinName) local newSkin if skinName then @@ -147,6 +140,7 @@ function Skeleton.new (skeletonData) local bone = self.bones[spine.utils.indexOf(skeletonData.bones, slotData.boneData)] local slot = Slot.new(slotData, self, bone) table.insert(self.slots, slot) + self.slotsByName[slot.data.name] = slot table.insert(self.drawOrder, slot) end From c5016f0da01336d7b5be231ba1eedb965398b97d Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 13:42:48 +0300 Subject: [PATCH 02/11] remove findslotindex from skeletondata and make it into a table, for faster lookups --- spine-lua/Skeleton.lua | 2 +- spine-lua/SkeletonData.lua | 9 +-------- spine-lua/SkeletonJson.lua | 8 ++++---- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/spine-lua/Skeleton.lua b/spine-lua/Skeleton.lua index 50d27a589..63e05b968 100644 --- a/spine-lua/Skeleton.lua +++ b/spine-lua/Skeleton.lua @@ -99,7 +99,7 @@ function Skeleton.new (skeletonData) function self:getAttachment (slotName, attachmentName) if not slotName then error("slotName cannot be nil.", 2) end if not attachmentName then error("attachmentName cannot be nil.", 2) end - local slotIndex = self.data:findSlotIndex(slotName) + local slotIndex = skeletonData.nameIndices[slotName] if slotIndex == -1 then error("Slot not found: " .. slotName, 2) end if self.skin then local attachment = self.skin:getAttachment(slotIndex, attachmentName) diff --git a/spine-lua/SkeletonData.lua b/spine-lua/SkeletonData.lua index db776b153..a9e70c29e 100644 --- a/spine-lua/SkeletonData.lua +++ b/spine-lua/SkeletonData.lua @@ -28,6 +28,7 @@ function SkeletonData.new () local self = { bones = {}, slots = {}, + nameIndices = {}, skins = {}, animations = {} } @@ -56,14 +57,6 @@ function SkeletonData.new () return nil end - function self:findSlotIndex (slotName) - if not slotName then error("slotName cannot be nil.", 2) end - for i,slot in ipairs(self.slots) do - if slot.name == slotName then return i end - end - return -1 - end - function self:findSkin (skinName) if not skinName then error("skinName cannot be nil.", 2) end for i,skin in ipairs(self.skins) do diff --git a/spine-lua/SkeletonJson.lua b/spine-lua/SkeletonJson.lua index a837ceb13..4fd745629 100644 --- a/spine-lua/SkeletonJson.lua +++ b/spine-lua/SkeletonJson.lua @@ -102,8 +102,8 @@ function SkeletonJson.new (attachmentLoader) end slotData.attachmentName = slotMap["attachment"] - - table.insert(skeletonData.slots, slotData) + table.insert(skeletonData.slots, slotData) + skeletonData.nameIndices[slotData.name] = #skeletonData.slots end end @@ -113,7 +113,7 @@ function SkeletonJson.new (attachmentLoader) for skinName,skinMap in pairs(map) do local skin = Skin.new(skinName) for slotName,slotMap in pairs(skinMap) do - local slotIndex = skeletonData:findSlotIndex(slotName) + local slotIndex = skeletonData.nameIndices[slotName] for attachmentName,attachmentMap in pairs(slotMap) do local attachment = readAttachment(attachmentName, attachmentMap, self.scale) if attachment then @@ -213,7 +213,7 @@ function SkeletonJson.new (attachmentLoader) local slotsMap = map["slots"] if slotsMap then for slotName,timelineMap in pairs(slotsMap) do - local slotIndex = skeletonData:findSlotIndex(slotName) + local slotIndex = skeletonData.nameIndices[slotName] for timelineName,values in pairs(timelineMap) do if timelineName == TIMELINE_COLOR then From d270c5e8daffd744177a91c45727d48551ce19b7 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 14:04:47 +0300 Subject: [PATCH 03/11] change name of nameIndices to slotNameIndices to reflect the contents better --- spine-lua/Skeleton.lua | 2 +- spine-lua/SkeletonData.lua | 2 +- spine-lua/SkeletonJson.lua | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spine-lua/Skeleton.lua b/spine-lua/Skeleton.lua index 63e05b968..843aea829 100644 --- a/spine-lua/Skeleton.lua +++ b/spine-lua/Skeleton.lua @@ -99,7 +99,7 @@ function Skeleton.new (skeletonData) function self:getAttachment (slotName, attachmentName) if not slotName then error("slotName cannot be nil.", 2) end if not attachmentName then error("attachmentName cannot be nil.", 2) end - local slotIndex = skeletonData.nameIndices[slotName] + local slotIndex = skeletonData.slotNameIndices[slotName] if slotIndex == -1 then error("Slot not found: " .. slotName, 2) end if self.skin then local attachment = self.skin:getAttachment(slotIndex, attachmentName) diff --git a/spine-lua/SkeletonData.lua b/spine-lua/SkeletonData.lua index a9e70c29e..00045cdcb 100644 --- a/spine-lua/SkeletonData.lua +++ b/spine-lua/SkeletonData.lua @@ -28,7 +28,7 @@ function SkeletonData.new () local self = { bones = {}, slots = {}, - nameIndices = {}, + slotNameIndices = {}, skins = {}, animations = {} } diff --git a/spine-lua/SkeletonJson.lua b/spine-lua/SkeletonJson.lua index 4fd745629..823869b1a 100644 --- a/spine-lua/SkeletonJson.lua +++ b/spine-lua/SkeletonJson.lua @@ -103,7 +103,7 @@ function SkeletonJson.new (attachmentLoader) slotData.attachmentName = slotMap["attachment"] table.insert(skeletonData.slots, slotData) - skeletonData.nameIndices[slotData.name] = #skeletonData.slots + skeletonData.slotNameIndices[slotData.name] = #skeletonData.slots end end @@ -113,7 +113,7 @@ function SkeletonJson.new (attachmentLoader) for skinName,skinMap in pairs(map) do local skin = Skin.new(skinName) for slotName,slotMap in pairs(skinMap) do - local slotIndex = skeletonData.nameIndices[slotName] + local slotIndex = skeletonData.slotNameIndices[slotName] for attachmentName,attachmentMap in pairs(slotMap) do local attachment = readAttachment(attachmentName, attachmentMap, self.scale) if attachment then @@ -213,7 +213,7 @@ function SkeletonJson.new (attachmentLoader) local slotsMap = map["slots"] if slotsMap then for slotName,timelineMap in pairs(slotsMap) do - local slotIndex = skeletonData.nameIndices[slotName] + local slotIndex = skeletonData.slotNameIndices[slotName] for timelineName,values in pairs(timelineMap) do if timelineName == TIMELINE_COLOR then From 776cc3958d2b6545bb33669260953c175287433e Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 14:17:27 +0300 Subject: [PATCH 04/11] only update attachments if they change --- spine-lua/Animation.lua | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index 8d5fb15c3..4ba650705 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -413,9 +413,16 @@ function Animation.AttachmentTimeline.new () end local attachmentName = self.attachmentNames[frameIndex] - local attachment - if attachmentName then attachment = skeleton:getAttachment(self.slotName, attachmentName) end - skeleton.slotsByName[self.slotName]:setAttachment(attachment) + local slot = skeleton.slotsByName[self.slotName] + if attachmentName then + if not slot.attachment then + slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) + elseif attachmentName and slot.attachment.name ~= attachmentName then + slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) + end + end + + end return self From 64cb985e93ee2ad8572c928015d044a270c7ffba Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 14:36:28 +0300 Subject: [PATCH 05/11] fix tabs --- spine-lua/SkeletonJson.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spine-lua/SkeletonJson.lua b/spine-lua/SkeletonJson.lua index 823869b1a..a3d77428e 100644 --- a/spine-lua/SkeletonJson.lua +++ b/spine-lua/SkeletonJson.lua @@ -29,7 +29,7 @@ local SlotData = require "spine-lua.SlotData" local Skin = require "spine-lua.Skin" local AttachmentLoader = require "spine-lua.AttachmentLoader" local Animation = require "spine-lua.Animation" - +- local TIMELINE_SCALE = "scale" local TIMELINE_ROTATE = "rotate" local TIMELINE_TRANSLATE = "translate" @@ -102,8 +102,8 @@ function SkeletonJson.new (attachmentLoader) end slotData.attachmentName = slotMap["attachment"] - table.insert(skeletonData.slots, slotData) - skeletonData.slotNameIndices[slotData.name] = #skeletonData.slots + table.insert(skeletonData.slots, slotData) + skeletonData.slotNameIndices[slotData.name] = #skeletonData.slots end end From 2fb6081a17f6b25a9a85b52b3c512fcca9c12387 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 14:50:31 +0300 Subject: [PATCH 06/11] fix tabs --- spine-lua/Animation.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index 4ba650705..4da1a62a6 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -413,14 +413,14 @@ function Animation.AttachmentTimeline.new () end local attachmentName = self.attachmentNames[frameIndex] - local slot = skeleton.slotsByName[self.slotName] - if attachmentName then - if not slot.attachment then - slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) - elseif attachmentName and slot.attachment.name ~= attachmentName then - slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) - end + local slot = skeleton.slotsByName[self.slotName] + if attachmentName then + if not slot.attachment then + slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) + elseif attachmentName and slot.attachment.name ~= attachmentName then + slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) end + end end From e334e0123cab24c6d00cc8999700cadc8a48e959 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 14:52:52 +0300 Subject: [PATCH 07/11] remove useless condition --- spine-lua/Animation.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index 4da1a62a6..6c575ff96 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -417,7 +417,7 @@ function Animation.AttachmentTimeline.new () if attachmentName then if not slot.attachment then slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) - elseif attachmentName and slot.attachment.name ~= attachmentName then + elseif slot.attachment.name ~= attachmentName then slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) end end From 3a0ba4a70a61c51d1ead547ebbe212eaad91b40a Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 15:39:15 +0300 Subject: [PATCH 08/11] if there is no attachment, remove it also.. --- spine-lua/Animation.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index 6c575ff96..47dfdceae 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -415,14 +415,14 @@ function Animation.AttachmentTimeline.new () local attachmentName = self.attachmentNames[frameIndex] local slot = skeleton.slotsByName[self.slotName] if attachmentName then - if not slot.attachment then - slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) - elseif slot.attachment.name ~= attachmentName then - slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) - end + if not slot.attachment then + slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) + elseif slot.attachment.name ~= attachmentName then + slot:setAttachment(skeleton:getAttachment(self.slotName, attachmentName)) + end + else + slot:setAttachment(nil) end - - end return self From 1ea5aa54f06e68b557c92acc4212eb3536d63b48 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 16:10:43 +0300 Subject: [PATCH 09/11] fix some screwups and formatting, restore find-functions --- spine-lua/Animation.lua | 8 ++++---- spine-lua/Skeleton.lua | 7 ++++++- spine-lua/SkeletonData.lua | 7 ++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index 47dfdceae..55993e088 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -371,11 +371,11 @@ function Animation.ColorTimeline.new () local g = lastFrameG + (frames[frameIndex + FRAME_G] - lastFrameG) * percent local b = lastFrameB + (frames[frameIndex + FRAME_B] - lastFrameB) * percent local a = lastFrameA + (frames[frameIndex + FRAME_A] - lastFrameA) * percent - --if alpha < 1 then - -- slot:setColor(slot.r + (r - color.r) * alpha, slot.g + (g - color.g) * alpha, slot.b + (b - color.b) * alpha, slot.a + (a - color.a) * alpha) - --else + if alpha < 1 then + slot:setColor(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:setColor(r, g, b, a) - --end + end end return self diff --git a/spine-lua/Skeleton.lua b/spine-lua/Skeleton.lua index 843aea829..b19ad86c9 100644 --- a/spine-lua/Skeleton.lua +++ b/spine-lua/Skeleton.lua @@ -35,7 +35,7 @@ function Skeleton.new (skeletonData) data = skeletonData, bones = {}, slots = {}, - slotsByName = {}, + slotsByName = {}, drawOrder = {} } @@ -74,6 +74,11 @@ function Skeleton.new (skeletonData) return nil end + function self:findSlot (slotName) + if not slotName then error("slotName cannot be nil.", 2) end + return slotsByName[slotName] + end + function self:setSkin (skinName) local newSkin if skinName then diff --git a/spine-lua/SkeletonData.lua b/spine-lua/SkeletonData.lua index 00045cdcb..531f9613e 100644 --- a/spine-lua/SkeletonData.lua +++ b/spine-lua/SkeletonData.lua @@ -28,7 +28,7 @@ function SkeletonData.new () local self = { bones = {}, slots = {}, - slotNameIndices = {}, + slotNameIndices = {}, skins = {}, animations = {} } @@ -57,6 +57,11 @@ function SkeletonData.new () return nil end + function self:findSlotIndex (slotName) + if not slotName then error("slotName cannot be nil.", 2) end + return slotNameIndices[slotName] or -1 + end + function self:findSkin (skinName) if not skinName then error("skinName cannot be nil.", 2) end for i,skin in ipairs(self.skins) do From 97097943a8d7905df0059307b9a931aeb0f0a7b8 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 16:12:59 +0300 Subject: [PATCH 10/11] more reformatting and ignoring of old non-fixed stuff.. --- spine-lua/Animation.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spine-lua/Animation.lua b/spine-lua/Animation.lua index 55993e088..205427150 100644 --- a/spine-lua/Animation.lua +++ b/spine-lua/Animation.lua @@ -36,7 +36,7 @@ function Animation.new (name, timelines, duration) function self:apply (skeleton, time, loop) if not skeleton then error("skeleton cannot be nil.", 2) end - if loop and duration then time = time % duration end + if loop and duration > 0 then time = time % duration end for i,timeline in ipairs(self.timelines) do timeline:apply(skeleton, time, 1) @@ -46,7 +46,7 @@ function Animation.new (name, timelines, duration) function self:mix (skeleton, time, loop, alpha) if not skeleton then error("skeleton cannot be nil.", 2) end - if loop and duration then time = time % duration end + if loop and duration > 0 then time = time % duration end for i,timeline in ipairs(self.timelines) do timeline:apply(skeleton, time, alpha) @@ -374,7 +374,7 @@ function Animation.ColorTimeline.new () if alpha < 1 then slot:setColor(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:setColor(r, g, b, a) + slot:setColor(r, g, b, a) end end From 96ff408022fa9c833e101f44870f7ecd9b9db020 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 13 Jun 2013 16:13:53 +0300 Subject: [PATCH 11/11] more reformatting --- spine-lua/SkeletonJson.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spine-lua/SkeletonJson.lua b/spine-lua/SkeletonJson.lua index a3d77428e..0125d5833 100644 --- a/spine-lua/SkeletonJson.lua +++ b/spine-lua/SkeletonJson.lua @@ -29,7 +29,6 @@ local SlotData = require "spine-lua.SlotData" local Skin = require "spine-lua.Skin" local AttachmentLoader = require "spine-lua.AttachmentLoader" local Animation = require "spine-lua.Animation" -- local TIMELINE_SCALE = "scale" local TIMELINE_ROTATE = "rotate" local TIMELINE_TRANSLATE = "translate" @@ -104,6 +103,7 @@ function SkeletonJson.new (attachmentLoader) slotData.attachmentName = slotMap["attachment"] table.insert(skeletonData.slots, slotData) skeletonData.slotNameIndices[slotData.name] = #skeletonData.slots + end end