Exemple #1
0
        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);
        }
Exemple #2
0
 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);
     }
 }
Exemple #3
0
 private static bool CanApplyBone(SkinningWeights skinningWeights)
 {
     for (var i = 0; i < 4; i++)
     {
         if (skinningWeights[i].Index == 0)
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
        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);
 }
Exemple #9
0
 public static Vector2 ApplySkinning(this Animesh mesh, Vector2 vector, SkinningWeights weights) =>
 mesh.ParentWidget.BoneArray.ApplySkinningToVector(vector, weights);