Пример #1
0
 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);
                 }
             }
         }
     }
 }
Пример #2
0
        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);
                }
            }
        }