mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-21 01:36:02 +08:00
[love] Fixed up Love2D rendering for 3.6
This commit is contained in:
parent
0a2ca732cd
commit
ba4abfa6d8
@ -45,6 +45,7 @@ spine.RegionAttachment = require "spine-lua.attachments.RegionAttachment"
|
|||||||
spine.MeshAttachment = require "spine-lua.attachments.MeshAttachment"
|
spine.MeshAttachment = require "spine-lua.attachments.MeshAttachment"
|
||||||
spine.VertexAttachment = require "spine-lua.attachments.VertexAttachment"
|
spine.VertexAttachment = require "spine-lua.attachments.VertexAttachment"
|
||||||
spine.PathAttachment = require "spine-lua.attachments.PathAttachment"
|
spine.PathAttachment = require "spine-lua.attachments.PathAttachment"
|
||||||
|
spine.PointAttachment = require "spine-lua.attachments.PointAttachment"
|
||||||
spine.Skeleton = require "spine-lua.Skeleton"
|
spine.Skeleton = require "spine-lua.Skeleton"
|
||||||
spine.Bone = require "spine-lua.Bone"
|
spine.Bone = require "spine-lua.Bone"
|
||||||
spine.Slot = require "spine-lua.Slot"
|
spine.Slot = require "spine-lua.Slot"
|
||||||
@ -113,8 +114,7 @@ function PolygonBatcher:begin ()
|
|||||||
self.drawCalls = 0
|
self.drawCalls = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
function PolygonBatcher:draw (texture, vertices, indices)
|
function PolygonBatcher:draw (texture, vertices, numVertices, indices)
|
||||||
local numVertices = #vertices / 8
|
|
||||||
local numIndices = #indices
|
local numIndices = #indices
|
||||||
local mesh = self.mesh
|
local mesh = self.mesh
|
||||||
|
|
||||||
@ -192,6 +192,9 @@ function SkeletonRenderer.new ()
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local worldVertices = spine.utils.newNumberArray(10000 * 8)
|
||||||
|
local tmpColor = spine.Color.newWith(0, 0, 0, 0)
|
||||||
|
|
||||||
function SkeletonRenderer:draw (skeleton)
|
function SkeletonRenderer:draw (skeleton)
|
||||||
local batcher = self.batcher
|
local batcher = self.batcher
|
||||||
local premultipliedAlpha = self.premultipliedAlpha
|
local premultipliedAlpha = self.premultipliedAlpha
|
||||||
@ -207,13 +210,16 @@ function SkeletonRenderer:draw (skeleton)
|
|||||||
local vertices = nil
|
local vertices = nil
|
||||||
local indics = nil
|
local indics = nil
|
||||||
local texture = nil
|
local texture = nil
|
||||||
|
local color = tmpColor
|
||||||
if attachment then
|
if attachment then
|
||||||
if attachment.type == spine.AttachmentType.region then
|
if attachment.type == spine.AttachmentType.region then
|
||||||
vertices = attachment:updateWorldVertices(slot, premultipliedAlpha)
|
numVertices = 4
|
||||||
|
vertices = self:computeRegionVertices(slot, attachment, premultipliedAlpha, color)
|
||||||
indices = SkeletonRenderer.QUAD_TRIANGLES
|
indices = SkeletonRenderer.QUAD_TRIANGLES
|
||||||
texture = attachment.region.renderObject.texture
|
texture = attachment.region.renderObject.texture
|
||||||
elseif attachment.type == spine.AttachmentType.mesh then
|
elseif attachment.type == spine.AttachmentType.mesh then
|
||||||
vertices = attachment:updateWorldVertices(slot, premultipliedAlpha)
|
numVertices = attachment.worldVerticesLength / 2
|
||||||
|
vertices = self:computeMeshVertices(slot, attachment, premultipliedAlpha, color)
|
||||||
indices = attachment.triangles
|
indices = attachment.triangles
|
||||||
texture = attachment.region.renderObject.texture
|
texture = attachment.region.renderObject.texture
|
||||||
end
|
end
|
||||||
@ -234,7 +240,7 @@ function SkeletonRenderer:draw (skeleton)
|
|||||||
batcher:stop()
|
batcher:stop()
|
||||||
batcher:begin()
|
batcher:begin()
|
||||||
end
|
end
|
||||||
batcher:draw(texture, vertices, indices)
|
batcher:draw(texture, vertices, numVertices, indices)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -243,6 +249,91 @@ function SkeletonRenderer:draw (skeleton)
|
|||||||
love.graphics.setBlendMode(lastLoveBlendMode)
|
love.graphics.setBlendMode(lastLoveBlendMode)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function SkeletonRenderer:computeRegionVertices(slot, region, pma, color)
|
||||||
|
local skeleton = slot.bone.skeleton
|
||||||
|
local skeletonColor = skeleton.color
|
||||||
|
local slotColor = slot.color
|
||||||
|
local regionColor = region.color
|
||||||
|
local alpha = skeletonColor.a * slotColor.a * regionColor.a
|
||||||
|
local multiplier = alpha
|
||||||
|
if pma then multiplier = 1 end
|
||||||
|
color:set(skeletonColor.r * slotColor.r * regionColor.r * multiplier,
|
||||||
|
skeletonColor.g * slotColor.g * regionColor.g * multiplier,
|
||||||
|
skeletonColor.b * slotColor.b * regionColor.b * multiplier,
|
||||||
|
alpha)
|
||||||
|
|
||||||
|
local vertices = worldVertices
|
||||||
|
region:computeWorldVertices(slot.bone, vertices, 0, 8)
|
||||||
|
|
||||||
|
local uvs = region.uvs
|
||||||
|
|
||||||
|
vertices[3] = uvs[1]
|
||||||
|
vertices[4] = uvs[2]
|
||||||
|
vertices[5] = color.r
|
||||||
|
vertices[6] = color.g
|
||||||
|
vertices[7] = color.b
|
||||||
|
vertices[8] = color.a
|
||||||
|
|
||||||
|
vertices[11] = uvs[3]
|
||||||
|
vertices[12] = uvs[4]
|
||||||
|
vertices[13] = color.r
|
||||||
|
vertices[14] = color.g
|
||||||
|
vertices[15] = color.b
|
||||||
|
vertices[16] = color.a
|
||||||
|
|
||||||
|
vertices[19] = uvs[5]
|
||||||
|
vertices[20] = uvs[6]
|
||||||
|
vertices[21] = color.r
|
||||||
|
vertices[22] = color.g
|
||||||
|
vertices[23] = color.b
|
||||||
|
vertices[24] = color.a
|
||||||
|
|
||||||
|
vertices[27] = uvs[7]
|
||||||
|
vertices[28] = uvs[8]
|
||||||
|
vertices[29] = color.r
|
||||||
|
vertices[30] = color.g
|
||||||
|
vertices[31] = color.b
|
||||||
|
vertices[32] = color.a
|
||||||
|
|
||||||
|
return vertices
|
||||||
|
end
|
||||||
|
|
||||||
|
function SkeletonRenderer:computeMeshVertices(slot, mesh, pma, color)
|
||||||
|
local skeleton = slot.bone.skeleton
|
||||||
|
local skeletonColor = skeleton.color
|
||||||
|
local slotColor = slot.color
|
||||||
|
local meshColor = mesh.color
|
||||||
|
local alpha = skeletonColor.a * slotColor.a * meshColor.a
|
||||||
|
local multiplier = alpha
|
||||||
|
if pma then multiplier = 1 end
|
||||||
|
color:set(skeletonColor.r * slotColor.r * meshColor.r * multiplier,
|
||||||
|
skeletonColor.g * slotColor.g * meshColor.g * multiplier,
|
||||||
|
skeletonColor.b * slotColor.b * meshColor.b * multiplier,
|
||||||
|
alpha)
|
||||||
|
|
||||||
|
local numVertices = mesh.worldVerticesLength / 2
|
||||||
|
local vertices = worldVertices
|
||||||
|
mesh:computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, 8)
|
||||||
|
|
||||||
|
local uvs = mesh.uvs
|
||||||
|
local i = 1
|
||||||
|
local n = numVertices + 1
|
||||||
|
local u = 1
|
||||||
|
local v = 3
|
||||||
|
while i < n do
|
||||||
|
vertices[v] = uvs[u]
|
||||||
|
vertices[v + 1] = uvs[u + 1]
|
||||||
|
vertices[v + 2] = color.r
|
||||||
|
vertices[v + 3] = color.g
|
||||||
|
vertices[v + 4] = color.b
|
||||||
|
vertices[v + 5] = color.a
|
||||||
|
i = i + 1
|
||||||
|
u = u + 2
|
||||||
|
v = v + 8
|
||||||
|
end
|
||||||
|
return vertices
|
||||||
|
end
|
||||||
|
|
||||||
spine.PolygonBatcher = PolygonBatcher
|
spine.PolygonBatcher = PolygonBatcher
|
||||||
spine.SkeletonRenderer = SkeletonRenderer
|
spine.SkeletonRenderer = SkeletonRenderer
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user