private static SkinningWeights ResetSkinningWeights(List <int> bonesIndices, SkinningWeights originSkinningWeights) { var skinningWeights = new SkinningWeights(); var overallWeight = 0f; var newOverallWeight = 0f; for (var i = 0; i < 4; i++) { overallWeight += originSkinningWeights[i].Weight; if (bonesIndices.Contains(i)) { skinningWeights[i] = new BoneWeight(); } else { skinningWeights[i] = originSkinningWeights[i]; newOverallWeight += skinningWeights[i].Weight; } } if (Mathf.Abs(overallWeight) > Mathf.ZeroTolerance && Mathf.Abs(newOverallWeight) > Mathf.ZeroTolerance) { var factor = overallWeight / newOverallWeight; for (var i = 0; i < 4; i++) { var boneWeight = skinningWeights[i]; boneWeight.Weight *= factor; skinningWeights[i] = boneWeight; } } return(skinningWeights); }
private static void BakeSkinningTransform(SkinningWeights newSkinningWeights, Node node) { if (node is PointObject) { var point = (PointObject)node; var originTranslation = point.TransformedPosition; var boneArray = node.Parent.Parent.AsWidget.BoneArray; var localToParentTransform = node.Parent.AsWidget.CalcLocalToParentTransform(); var transformedPosition = originTranslation * localToParentTransform * boneArray.CalcWeightedRelativeTransform(newSkinningWeights).CalcInversed() * localToParentTransform.CalcInversed(); var translation = (transformedPosition - point.Offset) / point.Parent.AsWidget.Size; SetAnimableProperty.Perform(node, nameof(PointObject.Position), translation); } else { var widget = node.AsWidget; var originLocalToParent = node.AsWidget.CalcLocalToParentTransform(); var transform = (originLocalToParent * widget.Parent.AsWidget.BoneArray.CalcWeightedRelativeTransform(newSkinningWeights).CalcInversed()).ToTransform2(); SetAnimableProperty.Perform(node, nameof(Widget.Rotation), transform.Rotation); var localToParentTransform = Matrix32.Translation(-(widget.Pivot * widget.Size)) * Matrix32.Transformation( Vector2.Zero, widget.Scale, widget.Rotation * Mathf.Pi / 180f, Vector2.Zero); SetAnimableProperty.Perform(node, nameof(Widget.Position), transform.Translation - localToParentTransform.T); } }
private static bool CanApplyBone(SkinningWeights skinningWeights) { for (var i = 0; i < 4; i++) { if (skinningWeights[i].Index == 0) { return(true); } } return(false); }
private static SkinningWeights CalcSkinningWeight(Vector2 position, List <Bone> bones) { var skinningWeights = new SkinningWeights(); var i = 0; while (i < bones.Count && i < 4) { var bone = bones[i]; skinningWeights[i] = new BoneWeight { Weight = bone.CalcWeightForPoint(position), Index = bone.Index }; i++; } return(skinningWeights); }
public SkinningWeights ParseSkinningWeights() { SkinningWeights v = new SkinningWeights(); ParseToken('['); v.Bone0.Index = ParseInt(); v.Bone0.Weight = ParseFloat(); v.Bone1.Index = ParseInt(); v.Bone1.Weight = ParseFloat(); v.Bone2.Index = ParseInt(); v.Bone2.Weight = ParseFloat(); v.Bone3.Index = ParseInt(); v.Bone3.Weight = ParseFloat(); ParseToken(']'); if (v.Bone0.Weight == 0 && v.Bone1.Weight == 0 && v.Bone2.Weight == 0 && v.Bone3.Weight == 0) { return(null); } return(v); }
private static void UntieBones(object obj, string propName, List <Bone> bones) { var originSkinningWeights = (SkinningWeights)obj.GetType().GetProperty(propName).GetValue(obj); var indices = new List <int>(); for (int i = 0; i < 4; i++) { if (bones.Any(b => b.Index == originSkinningWeights[i].Index)) { indices.Add(i); } } if (indices.Count != 0) { var skinningWeights = new SkinningWeights(); for (int i = 0; i < 4; i++) { skinningWeights[i] = indices.Contains(i) ? new BoneWeight() : originSkinningWeights[i]; } Core.Operations.SetProperty.Perform(obj, propName, skinningWeights); } }
private static SkinningWeights CalcSkinningWeight(SkinningWeights oldSkinningWeights, Vector2 position, List <Bone> bones) { var skinningWeights = new SkinningWeights(); var i = 0; var overallWeight = 0f; while (oldSkinningWeights[i].Index != 0) { skinningWeights[i] = oldSkinningWeights[i]; overallWeight += skinningWeights[i].Weight; i++; } var j = 0; while (j < bones.Count && i < 4) { var weight = bones[j].CalcWeightForPoint(position); if (Mathf.Abs(weight) > Mathf.ZeroTolerance) { skinningWeights[i] = new BoneWeight { Weight = weight, Index = bones[j].Index }; overallWeight += skinningWeights[i].Weight; i++; } j++; } if (overallWeight != 0) { for (i = 0; i < 4; i++) { var bw = skinningWeights[i]; bw.Weight /= overallWeight; skinningWeights[i] = bw; } } return(skinningWeights); }
private static void AddLinks(IDictionary <Bone, HashSet <RollNodeView> > links, SkinningWeights skinningWeights, RollNodeView view, NodeList nodes) { if (skinningWeights?.IsEmpty() ?? true) { return; } AddLink(links, skinningWeights.Bone0.Index, view, nodes); AddLink(links, skinningWeights.Bone1.Index, view, nodes); AddLink(links, skinningWeights.Bone2.Index, view, nodes); AddLink(links, skinningWeights.Bone3.Index, view, nodes); }
public static Vector2 ApplySkinning(this Animesh mesh, Vector2 vector, SkinningWeights weights) => mesh.ParentWidget.BoneArray.ApplySkinningToVector(vector, weights);