void SelectAvatarDescriptor(VRC.SDK3.Avatars.Components.VRCAvatarDescriptor desc)
    {
        if (desc == activeDescriptor)
        {
            return;
        }

        activeDescriptor = desc;
        if (activeDescriptor != null)
        {
            //Init stage parameters
            int paramCount = desc.GetExpressionParameterCount();
            parameterNames    = new string[paramCount + 1];
            parameterNames[0] = "[None]";
            for (int i = 0; i < paramCount; i++)
            {
                var    param = desc.GetExpressionParameter(i);
                string name  = "[None]";
                if (param != null && !string.IsNullOrEmpty(param.name))
                {
                    name = string.Format("{0}, {1}", param.name, param.valueType.ToString(), i + 1);
                }
                parameterNames[i + 1] = name;
            }
        }
        else
        {
            parameterNames = null;
        }
    }
Ejemplo n.º 2
0
        public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar)
        {
            if (avatar.expressionsMenu is null)
            {
                return(Enumerable.Empty <ValidateResult>());
            }

            return(ValidateExpressionsMenu(avatar.expressionsMenu));
        }
Ejemplo n.º 3
0
 public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar)
 {
     // Write validation code.
     // Return validation result if have error.
     yield return(new ValidateResult(
                      null,
                      ValidateResult.ValidateResultType.Error,
                      "Write result message."));
 }
Ejemplo n.º 4
0
        public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar)
        {
            var humanoidBoneNames = Enum.GetNames(typeof(HumanBodyBones))
                                    .SelectMany(n => new string[] { n, ToContainSpace(n) })
                                    .Distinct()
                                    .ToArray();

            var playableLayers = VRCAvatarUtility.GetBaseAnimationLayers(avatar);

            if (!playableLayers.Any())
            {
                yield break;
            }

            foreach (var playableLayer in playableLayers)
            {
                if (playableLayer.type == VRCAvatarDescriptor.AnimLayerType.FX)
                {
                    continue;
                }

                var animatorController = playableLayer.animatorController as AnimatorController;

                if (animatorController is null)
                {
                    continue;
                }

                foreach (var state in animatorController.layers.SelectMany(l => l.stateMachine.states))
                {
                    var clip = state.state.motion as AnimationClip;

                    if (clip is null)
                    {
                        continue;
                    }

                    foreach (var binding in AnimationUtility.GetCurveBindings(clip))
                    {
                        // Transformを操作するもの以外が含まれているか検出
                        if (binding.type != typeof(Transform) &&
                            !(binding.type == typeof(Animator) && humanoidBoneNames.Any(n => binding.propertyName.StartsWith(n))))
                        {
                            yield return(new ValidateResult(
                                             clip,
                                             ValidateResult.ValidateResultType.Error,
                                             $"{clip.name} have key changed other than Transform"));
                        }
                    }
                }
            }
        }
Ejemplo n.º 5
0
 public void Start()
 {
     LyumaAv3Emulator[] emulators = FindObjectsOfType <LyumaAv3Emulator>();
     if (emulators == null || emulators.Length == 0)
     {
         return;
     }
     emulator = emulators[0];
     if (emulator != null && emulator.runtimes != null)
     {
         if (emulator.runtimes.Count > 0)
         {
             avatarDescriptor = emulator.runtimes[0].GetComponent <VRC.SDK3.Avatars.Components.VRCAvatarDescriptor>();
         }
     }
 }
Ejemplo n.º 6
0
        public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar)
        {
            var exParamsAsset = VRCAvatarUtility.GetExpressionParametersAsset(avatar);

            if (exParamsAsset is null)
            {
                yield break;
            }

            var exParams = exParamsAsset.parameters.Where(p => !string.IsNullOrEmpty(p.name)).ToArray();

            if (!exParams.Any())
            {
                yield break;
            }

            var parameterlist = VRCAvatarUtility.GetParameters(avatar.baseAnimationLayers.Select(l => l.animatorController as AnimatorController));

            bool found = false;

            foreach (var exParam in exParams)
            {
                var exParamName = exParam.name;
                var exParamType = exParam.valueType == VRCExpressionParameters.ValueType.Float ?
                                  AnimatorControllerParameterType.Float :
                                  AnimatorControllerParameterType.Int;

                found = false;
                foreach (var param in parameterlist)
                {
                    if (exParamName == param.name && exParamType == param.type)
                    {
                        found = true;
                        break;
                    }
                }
                if (!found)
                {
                    yield return(new ValidateResult(
                                     exParamsAsset,
                                     ValidateResult.ValidateResultType.Error,
                                     $"{exParamName} is not found in AnimatorControllers"));
                }
            }
        }
Ejemplo n.º 7
0
        public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar)
        {
            var animationClips = VRCAvatarUtility.GetAnimationClips(avatar);

            foreach (var animationClip in animationClips)
            {
                foreach (var binding in AnimationUtility.GetCurveBindings(animationClip))
                {
                    if (!avatar.transform.Find(binding.path))
                    {
                        yield return(new ValidateResult(
                                         animationClip,
                                         ValidateResult.ValidateResultType.Warning,
                                         $"`{animationClip.name}` have missing path. ({binding.path})"));
                    }
                }
            }
        }
Ejemplo n.º 8
0
        public IEnumerable <ValidateResult> Validate(VRCAvatarDescriptor avatar)
        {
            var controllers = VRCAvatarUtility.GetControllers(avatar);

            foreach (var controller in controllers)
            {
                // 一番上のLayerは内部的にweight0であっても強制的に1になるので調べない
                for (int i = 1; i < controller.layers.Length; i++)
                {
                    var layer = controller.layers[i];
                    if (layer.defaultWeight == 0)
                    {
                        yield return(new ValidateResult(
                                         controller,
                                         ValidateResult.ValidateResultType.Warning,
                                         $"`{layer.name}` Layer in {controller.name} is weight 0."));
                    }
                }
            }
        }
    void SelectAvatarDescriptor(VRC.SDK3.Avatars.Components.VRCAvatarDescriptor desc)
    {
        if (desc == activeDescriptor)
        {
            return;
        }

        activeDescriptor = desc;
        if (activeDescriptor != null)
        {
            //Init stage parameters
            for (int i = 0; i < 16; i++)
            {
                InitStage(i);
            }
            void InitStage(int i)
            {
                var    param = desc.GetExpressionParameter(i);
                string name  = "[None]";

                if (param != null && !string.IsNullOrEmpty(param.name))
                {
                    name = string.Format("{0}, {1}", param.name, param.valueType.ToString(), i + 1);
                }
                ParameterNames[i + 1] = name;
            }
        }
        else
        {
            //Clear
            for (int i = 0; i < 16; i++)
            {
                ParameterNames[i + 1] = "[None]";
            }
        }
    }
Ejemplo n.º 10
0
 public static IEnumerable <AnimationClip> GetAnimationClips(VRCAvatarDescriptor avatar)
 => GetControllers(avatar)
 .SelectMany(controller => controller.animationClips);
Ejemplo n.º 11
0
 public static VRCExpressionParameters GetExpressionParametersAsset(VRCAvatarDescriptor avatar)
 => avatar.expressionParameters;
Ejemplo n.º 12
0
 public static IEnumerable <VRCAvatarDescriptor.CustomAnimLayer> GetBaseAnimationLayers(VRCAvatarDescriptor avatar)
 => avatar.baseAnimationLayers
 .Where(l => l.animatorController != null);
Ejemplo n.º 13
0
 public static IEnumerable <AnimatorController> GetControllers(VRCAvatarDescriptor avatar)
 => avatar.baseAnimationLayers
 .Union(avatar.specialAnimationLayers)
 .Select(l => l.animatorController as AnimatorController)
 .Where(c => c != null);
Ejemplo n.º 14
0
 public static Dictionary <int, IEnumerable <ValidateResult> > ValidateAvatars3(VRCAvatarDescriptor avatar, IEnumerable <RuleItem> rules)
 {
     return(rules.Select((rule, index) => new { Rule = rule, Index = index })
            .Where(rulePair => rulePair.Rule.Enabled)
            .Select(rulePair =>
     {
         var rule = RuleUtility.FilePath2IRule(rulePair.Rule.FilePath);
         var results = rule.Validate(avatar);
         return new KeyValuePair <int, IEnumerable <ValidateResult> >(rulePair.Index + 1, results);
     })
            .ToDictionary(resultPair => resultPair.Key, resultPair => resultPair.Value));
 }
Ejemplo n.º 15
0
 public void OnSwitchAvatar(VRCAvatarDescriptor avatar)
 {
     this.avatar     = avatar;
     HasNeverValided = true;
 }