浏览代码

[lua] Port IK constraint changes

See

https://github.com/EsotericSoftware/spine-runtimes/commit/33bce01feed1debd9cde6b7747a1aa2d07e00b02
https://github.com/EsotericSoftware/spine-runtimes/commit/f9862b10b373b8347c2b249d1086ef4049263153
badlogic 4 年之前
父节点
当前提交
22613ea84c
共有 1 个文件被更改,包括 18 次插入10 次删除
  1. 18 10
      spine-lua/spine-lua/IkConstraint.lua

+ 18 - 10
spine-lua/spine-lua/IkConstraint.lua

@@ -83,7 +83,7 @@ function IkConstraint:update ()
 	if boneCount == 1 then
 	if boneCount == 1 then
 		self:apply1(bones[1], target.worldX, target.worldY, self.compress, self.stretch, self.data.uniform, self.mix)
 		self:apply1(bones[1], target.worldX, target.worldY, self.compress, self.stretch, self.data.uniform, self.mix)
 	elseif boneCount == 2 then
 	elseif boneCount == 2 then
-		self:apply2(bones[1], bones[2], target.worldX, target.worldY, self.bendDirection, self.stretch, self.softness, self.mix)
+		self:apply2(bones[1], bones[2], target.worldX, target.worldY, self.bendDirection, self.stretch, self.data.uniform, self.softness, self.mix)
 	end
 	end
 end
 end
 
 
@@ -146,12 +146,13 @@ function IkConstraint:apply1 (bone, targetX, targetY, compress, stretch, uniform
 	bone:updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY)
 	bone:updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX, bone.ashearY)
 	end
 	end
 
 
-function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch, softness, alpha)
+function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch, uniform, softness, alpha)
 	local px = parent.ax
 	local px = parent.ax
 	local py = parent.ay
 	local py = parent.ay
 	local psx = parent.ascaleX
 	local psx = parent.ascaleX
-	local sx = psx
 	local psy = parent.ascaleY
 	local psy = parent.ascaleY
+	local sx = psx
+	local sy = psy
 	local csx = child.ascaleX
 	local csx = child.ascaleX
 	local os1 = 0
 	local os1 = 0
 	local os2 = 0
 	local os2 = 0
@@ -183,7 +184,7 @@ function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch,
 	local c = parent.c
 	local c = parent.c
 	local d = parent.d
 	local d = parent.d
 	local u = math_abs(psx - psy) <= 0.0001
 	local u = math_abs(psx - psy) <= 0.0001
-	if not u then
+	if not u or stretch then
 		cy = 0
 		cy = 0
 		cwx = a * cx + parent.worldX
 		cwx = a * cx + parent.worldX
 		cwy = c * cx + parent.worldY
 		cwy = c * cx + parent.worldY
@@ -217,7 +218,7 @@ function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch,
 	local ty = (y * a - x * c) * id - py
 	local ty = (y * a - x * c) * id - py
 	local dd = tx * tx + ty * ty
 	local dd = tx * tx + ty * ty
 	if softness ~= 0 then
 	if softness ~= 0 then
-		softness = softness * (psx * (csx + 1) / 2)
+		softness = softness * (psx * (csx + 1) * 0.5)
 		local td = math_sqrt(dd)
 		local td = math_sqrt(dd)
 		local sd = td - l1 - l2 * psx + softness
 		local sd = td - l1 - l2 * psx + softness
 		if sd > 0 then
 		if sd > 0 then
@@ -234,11 +235,18 @@ function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch,
 		local cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2)
 		local cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2)
 		if cos < -1 then
 		if cos < -1 then
 			cos = -1
 			cos = -1
+			a2 = math_pi * bendDir
 		elseif cos > 1 then
 		elseif cos > 1 then
 			cos = 1
 			cos = 1
-			if stretch then sx = sx * ((math_sqrt(dd) / (l1 + l2) - 1) * alpha + 1) end
+			a2 = 0
+			if stretch then
+				a = ((math_sqrt(dd) / (l1 + l2) - 1) * alpha + 1)
+				sx = sx * a
+				if uniform then sy = sy * a end
+			end
+		else
+			a2 = math_acos(cos) * bendDir
 		end
 		end
-		a2 = math_acos(cos) * bendDir
 		a = l1 + l2 * cos
 		a = l1 + l2 * cos
 		b = l2 * math_sin(a2)
 		b = l2 * math_sin(a2)
 		a1 = math_atan2(ty * a - tx * b, tx * a + ty * b)
 		a1 = math_atan2(ty * a - tx * b, tx * a + ty * b)
@@ -256,7 +264,7 @@ function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch,
 		if d >= 0 then
 		if d >= 0 then
 			local q = math_sqrt(d)
 			local q = math_sqrt(d)
 			if c1 < 0 then q = -q end
 			if c1 < 0 then q = -q end
-			q = -(c1 + q) / 2
+			q = -(c1 + q) * 0.5
 			local r0 = q / c2
 			local r0 = q / c2
 			local r1 = c / q
 			local r1 = c / q
 			local r = r1
 			local r = r1
@@ -296,7 +304,7 @@ function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch,
 					maxY = y
 					maxY = y
 				end
 				end
 			end
 			end
-			if dd <= (minDist + maxDist) / 2 then
+			if dd <= (minDist + maxDist) * 0.5 then
 				a1 = ta - math_atan2(minY * bendDir, minX)
 				a1 = ta - math_atan2(minY * bendDir, minX)
 				a2 = minAngle * bendDir
 				a2 = minAngle * bendDir
 			else
 			else
@@ -313,7 +321,7 @@ function IkConstraint:apply2 (parent, child, targetX, targetY, bendDir, stretch,
 	elseif a1 < -180 then
 	elseif a1 < -180 then
 		a1 = a1 + 360
 		a1 = a1 + 360
 	end
 	end
-	parent:updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0)
+	parent:updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, sy, 0, 0)
 	rotation = child.rotation
 	rotation = child.rotation
 	a2 = (math_deg(a2 + os) - child.ashearX) * s2 + os2 - rotation
 	a2 = (math_deg(a2 + os) - child.ashearX) * s2 + os2 - rotation
 	if a2 > 180 then
 	if a2 > 180 then