diff --git a/spine-lua/TextureAtlas.lua b/spine-lua/TextureAtlas.lua index d586002b2..d6692ea5a 100644 --- a/spine-lua/TextureAtlas.lua +++ b/spine-lua/TextureAtlas.lua @@ -186,7 +186,15 @@ function TextureAtlas:parse (atlasContent, imageLoader) region.name = line region.page = page - if readValue() == "true" then region.rotate = true end + local rotateValue = readValue() + if rotateValue == "true" then + region.degrees = 90 + elseif rotateValue == "false" then + region.degrees = 0 + else + region.degrees = tonumber(rotateValue) + end + if region.degrees == 90 then region.rotate = true end local tuple = readTuple() local x = parseInt(tuple[1]) diff --git a/spine-lua/TextureAtlasRegion.lua b/spine-lua/TextureAtlasRegion.lua index 34fcf8922..bb2fe7c96 100644 --- a/spine-lua/TextureAtlasRegion.lua +++ b/spine-lua/TextureAtlasRegion.lua @@ -44,6 +44,7 @@ function TextureAtlasRegion.new () self.y = 0 self.index = 0 self.rotate = false + self.degrees = 0 self.texture = nil setmetatable(self, TextureAtlasRegion) diff --git a/spine-lua/attachments/MeshAttachment.lua b/spine-lua/attachments/MeshAttachment.lua index c260c5fec..9537ff96b 100644 --- a/spine-lua/attachments/MeshAttachment.lua +++ b/spine-lua/attachments/MeshAttachment.lua @@ -61,6 +61,11 @@ function MeshAttachment:updateUVs () local v = 0 local width = 0 local height = 0 + + local regionUVs = self.regionUVs + if not self.uvs or (#self.uvs ~= #regionUVs) then self.uvs = utils.newNumberArray(#regionUVs) end + local uvs = self.uvs + if not self.region then u = 0 v = 0 @@ -70,38 +75,55 @@ function MeshAttachment:updateUVs () local region = self.region local textureWidth = region.page.width local textureHeight = region.page.height - if region.rotate then + + if region.degrees == 90 then u = region.u - (region.originalHeight - region.offsetY - region.height) / textureWidth v = region.v - (region.originalWidth - region.offsetX - region.width) / textureHeight - width = region.originalHeight / textureWidth - height = region.originalWidth / textureHeight + width = region.originalHeight / textureWidth + height = region.originalWidth / textureHeight + local i = 0 + local n = #uvs + while i < n do + uvs[i + 1] = u + regionUVs[i + 2] * width; + uvs[i + 2] = v + (1 - regionUVs[i + 1]) * height; + i = i + 2 + end + elseif region.degrees == 180 then + u = region.u - (region.originalWidth - region.offsetX - region.width) / textureWidth + v = region.v - region.offsetY / textureHeight + width = region.originalWidth / textureWidth + height = region.originalHeight / textureHeight + local i = 0 + local n = #uvs + while i < n do + uvs[i + 1] = u + (1 - regionUVs[i + 1]) * width; + uvs[i + 2] = v + (1 - regionUVs[i + 2]) * height; + i = i + 2 + end + elseif region.degrees == 270 then + u = region.u - region.offsetY / textureWidth + v = region.v - region.offsetX / textureHeight + width = region.originalHeight / textureWidth + height = region.originalWidth / textureHeight + local i = 0 + local n = #uvs + while i < n do + uvs[i + 1] = u + (1 - regionUVs[i + 2]) * width; + uvs[i + 2] = v + regionUVs[i + 1] * height; + i = i + 2 + end else u = region.u - region.offsetX / textureWidth; v = region.v - (region.originalHeight - region.offsetY - region.height) / textureHeight; width = region.originalWidth / textureWidth; height = region.originalHeight / textureHeight; - end - end - - local regionUVs = self.regionUVs - if not self.uvs or (#self.uvs ~= #regionUVs) then self.uvs = utils.newNumberArray(#regionUVs) end - local uvs = self.uvs - - if self.region and self.region.rotate then - local i = 0 - local n = #uvs - while i < n do - uvs[i + 1] = u + regionUVs[i + 2] * width; - uvs[i + 2] = v + height - regionUVs[i + 1] * height; - i = i + 2 - end - else - local i = 0 - local n = #uvs - while i < n do - uvs[i + 1] = u + regionUVs[i + 1] * width; - uvs[i + 2] = v + regionUVs[i + 2] * height; - i = i + 2 + local i = 0 + local n = #uvs + while i < n do + uvs[i + 1] = u + regionUVs[i + 1] * width; + uvs[i + 2] = v + regionUVs[i + 2] * height; + i = i + 2 + end end end end