Implement new mesh:update() function (#1987)

This commit is contained in:
Denis Claros 2021-12-03 08:41:27 -04:00 committed by GitHub
parent 9fabc60323
commit 9639bcc817
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -91,7 +91,9 @@ spine.Skeleton.new = function(skeletonData, group)
self.group = group or display.newGroup() self.group = group or display.newGroup()
self.drawingGroup = nil self.drawingGroup = nil
self.premultipliedAlpha = false self.premultipliedAlpha = false
self.batches = 0 self.slotData = {}
self.drawingGroup = display.newGroup()
self.group:insert(self.drawingGroup)
self.tempColor = spine.Color.newWith(1, 1, 1, 1) self.tempColor = spine.Color.newWith(1, 1, 1, 1)
self.tempColor2 = spine.Color.newWith(-1, 1, 1, 1) self.tempColor2 = spine.Color.newWith(-1, 1, 1, 1)
self.tempVertex = { self.tempVertex = {
@ -124,22 +126,75 @@ end
local worldVertices = spine.utils.newNumberArray(10000 * 8) local worldVertices = spine.utils.newNumberArray(10000 * 8)
function spine.Skeleton:hideSlot(slot)
if not self.slotData[slot] then return end
self.slotData[slot].mesh.isVisible = false
end
function spine.Skeleton:createSlot(slot, params)
local mesh = display.newMesh(self.drawingGroup, 0, 0, {
mode = "indexed",
vertices = params.vertices,
uvs = params.uvs,
indices = params.indices
})
mesh.x, mesh.y = mesh.path:getVertexOffset()
mesh.blendMode = params.blendMode
mesh.fill = params.texture
local color = params.color
mesh:setFillColor(color.r, color.g, color.b, color.a)
self.slotData[slot] = {
mesh = mesh,
indices = params.indices,
texture = params.texture,
uvs = params.uvs,
}
end
function spine.Skeleton:updateSlot(slot, params)
if not self.slotData[slot] then
return self:createSlot(slot, params)
end
local slotData = self.slotData[slot]
local mesh = slotData.mesh
if #params.indices ~= #slotData.indices or #params.uvs ~= #slotData.uvs then
slotData.mesh:removeSelf()
self.slotData[slot] = nil
return self:createSlot(slot, params)
end
mesh.path:update({
vertices = params.vertices,
uvs = params.uvs,
indices = params.indices
})
mesh.isVisible = true
mesh.x, mesh.y = mesh.path:getVertexOffset()
mesh:toFront()
local color = params.color
mesh:setFillColor(color.r, color.g, color.b, color.a)
if slotData.texture ~= params.texture then
slotData.texture = params.texture
mesh.fill = params.texture
end
if mesh.blendMode ~= params.blendMode then
mesh.blendMode = params.blendMode
end
end
function spine.Skeleton:updateWorldTransform() function spine.Skeleton:updateWorldTransform()
spine.Skeleton.updateWorldTransform_super(self) spine.Skeleton.updateWorldTransform_super(self)
local premultipliedAlpha = self.premultipliedAlpha local premultipliedAlpha = self.premultipliedAlpha
self.batches = 0
if (self.vertexEffect) then self.vertexEffect:beginEffect(self) end if (self.vertexEffect) then self.vertexEffect:beginEffect(self) end
-- Remove old drawing group, we will start anew
if self.drawingGroup then self.drawingGroup:removeSelf() end
local drawingGroup = display.newGroup()
self.drawingGroup = drawingGroup
self.group:insert(drawingGroup)
local drawOrder = self.drawOrder local drawOrder = self.drawOrder
local currentGroup = nil
local groupVertices = {} local groupVertices = {}
local groupIndices = {} local groupIndices = {}
local groupUvs = {} local groupUvs = {}
@ -150,12 +205,12 @@ function spine.Skeleton:updateWorldTransform()
local lastTexture = nil local lastTexture = nil
local blendMode = nil local blendMode = nil
local lastBlendMode = nil local lastBlendMode = nil
local renderable = {
vertices = nil,
uvs = nil
}
for _,slot in ipairs(drawOrder) do for k, v in pairs(self.slotData) do
self:hideSlot(k)
end
for i,slot in ipairs(drawOrder) do
local attachment = slot.attachment local attachment = slot.attachment
local vertices = nil local vertices = nil
local uvs = nil local uvs = nil
@ -200,7 +255,15 @@ function spine.Skeleton:updateWorldTransform()
if not lastBlendMode then lastBlendMode = blendMode end if not lastBlendMode then lastBlendMode = blendMode end
if (texture ~= lastTexture or not colorEquals(color, lastColor) or blendMode ~= lastBlendMode) then if (texture ~= lastTexture or not colorEquals(color, lastColor) or blendMode ~= lastBlendMode) then
self:flush(groupVertices, groupUvs, groupIndices, lastTexture, lastColor, lastBlendMode, drawingGroup) local lastSlot = drawOrder[i-1]
self:updateSlot(lastSlot, {
texture = lastTexture,
color = lastColor,
blendMode = lastBlendMode,
vertices = groupVertices,
uvs = groupUvs,
indices = groupIndices
})
lastTexture = texture lastTexture = texture
lastColor:setFrom(color) lastColor:setFrom(color)
lastBlendMode = blendMode lastBlendMode = blendMode
@ -225,27 +288,22 @@ function spine.Skeleton:updateWorldTransform()
end end
if #groupVertices > 0 then if #groupVertices > 0 then
self:flush(groupVertices, groupUvs, groupIndices, texture, color, blendMode, drawingGroup) local slot = drawOrder[#drawOrder]
self:updateSlot(slot, {
texture = texture,
color = color,
blendMode = blendMode,
vertices = groupVertices,
uvs = groupUvs,
indices = groupIndices,
})
end end
self.clipper:clipEnd2() self.clipper:clipEnd2()
if (self.vertexEffect) then self.vertexEffect:endEffect() end if (self.vertexEffect) then self.vertexEffect:endEffect() end
end end
function spine.Skeleton:flush(groupVertices, groupUvs, groupIndices, texture, color, blendMode, drawingGroup)
local mesh = display.newMesh(drawingGroup, 0, 0, {
mode = "indexed",
vertices = groupVertices,
uvs = groupUvs,
indices = groupIndices
})
mesh.fill = texture
mesh:setFillColor(color.r, color.g, color.b)
mesh.alpha = color.a
mesh.blendMode = blendMode
mesh:translate(mesh.path:getVertexOffset())
self.batches = self.batches + 1
end
function spine.Skeleton:batch(vertices, uvs, numVertices, indices, groupVertices, groupUvs, groupIndices) function spine.Skeleton:batch(vertices, uvs, numVertices, indices, groupVertices, groupUvs, groupIndices)
local numIndices = #indices local numIndices = #indices