|
@@ -29,6 +29,21 @@
|
|
|
|
|
|
local setmetatable = setmetatable
|
|
|
local table_insert = table.insert
|
|
|
+local AttachmentType = require "spine-lua.attachments.AttachmentType"
|
|
|
+
|
|
|
+local SkinEntry = {}
|
|
|
+SkinEntry.__index = SkinEntry
|
|
|
+
|
|
|
+function SkinEntry.new (slotIndex, name, attachment)
|
|
|
+ local self = {
|
|
|
+ slotIndex = slotIndex,
|
|
|
+ name = name,
|
|
|
+ attachment = attachment
|
|
|
+ }
|
|
|
+ setmetatable(self, SkinEntry)
|
|
|
+
|
|
|
+ return self
|
|
|
+end
|
|
|
|
|
|
local Skin = {}
|
|
|
Skin.__index = Skin
|
|
@@ -38,19 +53,91 @@ function Skin.new (name)
|
|
|
|
|
|
local self = {
|
|
|
name = name,
|
|
|
- attachments = {}
|
|
|
+ attachments = {},
|
|
|
+ bones = {},
|
|
|
+ constraints = {}
|
|
|
}
|
|
|
setmetatable(self, Skin)
|
|
|
|
|
|
return self
|
|
|
end
|
|
|
|
|
|
-function Skin:addAttachment (slotIndex, name, attachment)
|
|
|
+function Skin:setAttachment (slotIndex, name, attachment)
|
|
|
if not name then error("name cannot be nil.", 2) end
|
|
|
if not self.attachments[slotIndex] then self.attachments[slotIndex] = {} end
|
|
|
self.attachments[slotIndex][name] = attachment
|
|
|
end
|
|
|
|
|
|
+function Skin:addSkin (skin)
|
|
|
+ for i, bone in ipairs(skin.bones) do
|
|
|
+ local contained = false
|
|
|
+ for j, otherBone in ipairs(self.bones) do
|
|
|
+ if otherBone == bone then
|
|
|
+ contained = true
|
|
|
+ break
|
|
|
+ end
|
|
|
+ end
|
|
|
+ if not contained then table_insert(self.bones, bone) end
|
|
|
+ end
|
|
|
+
|
|
|
+ for i, constraint in ipairs(skin.constraints) do
|
|
|
+ local contained = false
|
|
|
+ for j, otherConstraint in ipairs(self.constraints) do
|
|
|
+ if otherConstraint == constraint then
|
|
|
+ contained = true
|
|
|
+ break
|
|
|
+ end
|
|
|
+ end
|
|
|
+ if not contained then table_insert(self.constraints, constraint) end
|
|
|
+ end
|
|
|
+
|
|
|
+ local attachments = skin:getAttachments()
|
|
|
+ for i, entry in ipairs(attachments) do
|
|
|
+ self:setAttachment(entry.slotIndex, entry.name, entry.attachment)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+function Skin:copySkin (skin)
|
|
|
+ for i, bone in ipairs(skin.bones) do
|
|
|
+ local contained = false
|
|
|
+ for j, otherBone in ipairs(self.bones) do
|
|
|
+ if otherBone == bone then
|
|
|
+ contained = true
|
|
|
+ break
|
|
|
+ end
|
|
|
+ end
|
|
|
+ if not contained then table_insert(self.bones, bone) end
|
|
|
+ end
|
|
|
+
|
|
|
+ for i, constraint in ipairs(skin.constraints) do
|
|
|
+ local contained = false
|
|
|
+ for j, otherConstraint in ipairs(self.constraints) do
|
|
|
+ if otherConstraint == constraint then
|
|
|
+ contained = true
|
|
|
+ break
|
|
|
+ end
|
|
|
+ end
|
|
|
+ if not contained then table_insert(self.constraints, constraint) end
|
|
|
+ end
|
|
|
+
|
|
|
+ local attachments = skin:getAttachments()
|
|
|
+ for i, entry in ipairs(attachments) do
|
|
|
+ entry.attachment = entry.attachment:copy()
|
|
|
+ self:setAttachment(entry.slotIndex, entry.name, entry.attachment)
|
|
|
+ end
|
|
|
+
|
|
|
+ attachments = self:getAttachments()
|
|
|
+ for i, entry in ipairs(attachments) do
|
|
|
+ if entry.attachment.type == AttachmentType.mesh then
|
|
|
+ local mesh = entry.attachment
|
|
|
+ if mesh.parentMesh then
|
|
|
+ mesh:setParentMesh(self:getAttachment(entry.slotIndex, mesh:getParentMesh().name))
|
|
|
+ mesh:updateUVs()
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
function Skin:getAttachment (slotIndex, name)
|
|
|
if not name then error("name cannot be nil.", 2) end
|
|
|
local dictionary = self.attachments[slotIndex]
|
|
@@ -61,6 +148,46 @@ function Skin:getAttachment (slotIndex, name)
|
|
|
end
|
|
|
end
|
|
|
|
|
|
+function Skin:removeAttachment (slotIndex, name)
|
|
|
+ local slotAttachments = self.attachments[slotIndex]
|
|
|
+ if slotAttachments then
|
|
|
+ slotAttachments[name] = nil
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+function Skin:getAttachments ()
|
|
|
+ local entries = {}
|
|
|
+ for slotIndex, slotAttachments in pairs(self.attachments) do
|
|
|
+ if slotAttachments then
|
|
|
+ for name, attachment in pairs(slotAttachments) do
|
|
|
+ if attachment then
|
|
|
+ table_insert(entries, SkinEntry.new(slotIndex, name, attachment))
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ return entries
|
|
|
+end
|
|
|
+
|
|
|
+function Skin:getAttachmentsForSlot (slotIndex)
|
|
|
+ local entries = {}
|
|
|
+ local slotAttachments = self.attachments[slotIndex]
|
|
|
+ if slotAttachments then
|
|
|
+ for name, attachment in pairs(slotAttachments) do
|
|
|
+ if attachment then
|
|
|
+ table_insert(entries, SkinEntry.new(slotIndex, name, attachment))
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ return entries
|
|
|
+end
|
|
|
+
|
|
|
+function Skin:clear ()
|
|
|
+ self.attachments = {}
|
|
|
+ self.bones = {}
|
|
|
+ self.constraints = {}
|
|
|
+end
|
|
|
+
|
|
|
function Skin:attachAll(skeleton, oldSkin)
|
|
|
for i, slot in ipairs(skeleton.slots) do
|
|
|
local slotAttachment = slot.attachment
|