public AvatarSkeleton(AvatarLad lad, Dictionary <uint, double> visualParamInputs) { foreach (BoneInfo bone in DefaultSkeleton.Bones) { var newBone = new BoneInfo(bone); Bones.Add(newBone); BuildBonesRef(newBone); } foreach (KeyValuePair <uint, AvatarLad.VisualParam> kvp in lad.VisualParams) { double val; if (visualParamInputs.TryGetValue(kvp.Key, out val)) { foreach (AvatarLad.BoneParam bp in kvp.Value.Bones) { Vector3 scale = bp.Scale * val; Vector3 offset = bp.Offset * val; BoneInfo bone; if (BonesRef.TryGetValue(bp.Name, out bone)) { bone.Scale = bone.Scale.ElementMultiply(scale); bone.Position += offset; } foreach (CollisionVolume colvol in bone.CollisionVolumes) { colvol.Scale = colvol.Scale.ElementMultiply(scale); } } } } }
public static void CompleteParams(Dictionary <uint, double> param) { AvatarLad lad = BaseBakes.DefaultAvatarLad; foreach (AvatarLad.DriverParam m in lad.DriverParams) { double val; AvatarLad.VisualParam driver; AvatarLad.VisualParam driven; if (param.TryGetValue(m.FromId, out val)) { /* already got that parameter */ } else if (lad.VisualParams.TryGetValue(m.FromId, out driver)) { val = driver.DefaultValue; } else { continue; } if (!param.ContainsKey(m.ToId)) { if (m.HaveWeight) { driver = lad.VisualParams[m.FromId]; driven = lad.VisualParams[m.ToId]; if (val <= m.Min1) { val = (m.Min1 == m.Max1 && m.Min1 <= driver.MinimumValue) ? driven.MaximumValue : driven.MinimumValue; } else if (val <= m.Max1) { double t = (val - m.Min1) / (m.Max1 - m.Min1); val = driven.MinimumValue.Lerp(driven.MaximumValue, t); } else if (val <= m.Max2) { val = driven.MaximumValue; } else if (val <= m.Min2 && m.Min2 > m.Max2) { double t = (val - m.Max2) / (m.Min2 - m.Max2); val = driven.MaximumValue.Lerp(driven.MinimumValue, t); } else { val = (m.Max2 >= driver.MaximumValue) ? driven.MaximumValue : driven.MinimumValue; } } param.Add(m.ToId, val); } } }