private static EditableBoneWeight Lerp(EditableBoneWeight first, EditableBoneWeight second, float t) { EditableBoneWeight result = new EditableBoneWeight(); foreach (BoneWeightChannel channel in first) { if (!channel.enabled) { continue; } BoneWeightData data = channel.boneWeightData; data.weight *= (1f - t); if (data.weight > 0f) { result.AddChannel(data, true); } } foreach (BoneWeightChannel channel in second) { if (!channel.enabled) { continue; } BoneWeightData data = channel.boneWeightData; data.weight *= t; if (data.weight > 0f) { result.AddChannel(data, true); } } result.UnifyChannelsWithSameBoneIndex(); if (result.GetWeightSum() > 1f) { result.NormalizeChannels(); } result.FilterChannels(0f); result.ClampChannels(4, true); return(result); }
private void SetWeight(float value, bool createNewChannel = true) { if (boneIndex == -1) { return; } Debug.Assert(selection != null); for (int i = 0; i < spriteMeshData.vertices.Count; ++i) { if (selection.Count == 0 && emptySelectionEditsAll || selection.Count > 0 && selection.IsSelected(i)) { EditableBoneWeight editableBoneWeight = spriteMeshData.vertices[i].editableBoneWeight; int channel = editableBoneWeight.GetChannelFromBoneIndex(boneIndex); if (channel == -1) { if (createNewChannel) { editableBoneWeight.AddChannel(new BoneWeightData(boneIndex, 0f), true); channel = editableBoneWeight.GetChannelFromBoneIndex(boneIndex); } else { continue; } } BoneWeightData data = editableBoneWeight.GetBoneWeightData(channel); data.weight += value; editableBoneWeight.SetBoneWeightData(channel, data); if (editableBoneWeight.GetWeightSum() > 1f) { editableBoneWeight.CompensateOtherChannels(channel); } editableBoneWeight.FilterChannels(0f); } } }
public static void NormalizeChannels(this EditableBoneWeight editableBoneWeight) { ValidateChannels(editableBoneWeight); float sum = editableBoneWeight.GetWeightSum(); if (sum == 0f || sum == 1f) { return; } for (int i = 0; i < editableBoneWeight.GetChannelCount(); ++i) { if (editableBoneWeight.IsChannelEnabled(i)) { BoneWeightData data = editableBoneWeight.GetBoneWeightData(i); data.weight = data.weight / sum; editableBoneWeight.SetBoneWeightData(i, data); } } }