Exemplo n.º 1
0
        private void AvatarParameterDriverSettings(VRC_AvatarParameterDriver driver, Animator animator)
        {
            if (!_hooked || animator != AvatarAnimator)
            {
                return;
            }

            foreach (var parameter in driver.parameters)
            {
                var param = RadialMenu.GetParam(parameter.name);
                if (param == null)
                {
                    continue;
                }

                switch (parameter.type)
                {
                case VRC_AvatarParameterDriver.ChangeType.Set:
                    param.Set(RadialMenu, parameter.value);
                    break;

                case VRC_AvatarParameterDriver.ChangeType.Add:
                    param.Add(RadialMenu, parameter.value);
                    break;

                case VRC_AvatarParameterDriver.ChangeType.Random:
                    param.Random(RadialMenu, parameter.valueMin, parameter.valueMax, parameter.chance);
                    break;

                default: throw new ArgumentOutOfRangeException();
                }
            }
        }
Exemplo n.º 2
0
        public override void InitForAvatar()
        {
            StartVrcHooks();

            AvatarAnimator.applyRootMotion           = false;
            AvatarAnimator.runtimeAnimatorController = null;
            AvatarAnimator.updateMode  = AnimatorUpdateMode.Normal;
            AvatarAnimator.cullingMode = AnimatorCullingMode.CullCompletely;
            DestroyGraphs();

            var layerList = _avatarDescriptor.baseAnimationLayers.ToList();

            layerList.AddRange(_avatarDescriptor.specialAnimationLayers);
            layerList.Sort(ModuleVrc3Styles.Data.LayerSort);

            _playableGraph = PlayableGraph.Create("Gesture Manager 3.1");
            var externalOutput = AnimationPlayableOutput.Create(_playableGraph, "Gesture Manager", AvatarAnimator);
            var playableMixer  = AnimationLayerMixerPlayable.Create(_playableGraph, layerList.Count + 1);

            externalOutput.SetSourcePlayable(playableMixer);

            _fromBlend.Clear();
            _avatarClips.Clear();
            _weightControllers      = new RadialWeightController[layerList.Count];
            _humanAnimatorPlayables = new AnimatorControllerPlayable[layerList.Count];

            for (var i = 0; i < layerList.Count; i++)
            {
                var vrcAnimLayer = layerList[i];
                var iGraph       = i + 1;

                if (vrcAnimLayer.animatorController)
                {
                    foreach (var clip in vrcAnimLayer.animatorController.animationClips)
                    {
                        _avatarClips.Add(clip);
                    }
                }

                var isFx     = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.FX;
                var isAdd    = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.Additive;
                var isPose   = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.IKPose || vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.TPose;
                var isAction = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.Sitting || vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.Action;
                var limit    = isPose || isAction;

                var controller = vrcAnimLayer.animatorController ? vrcAnimLayer.animatorController : ModuleVrc3Styles.Data.ControllerOf[vrcAnimLayer.type];
                var mask       = vrcAnimLayer.isDefault || isFx ? ModuleVrc3Styles.Data.MaskOf[vrcAnimLayer.type] : vrcAnimLayer.mask;

                if (!controller)
                {
                    continue;
                }

                _humanAnimatorPlayables[i] = AnimatorControllerPlayable.Create(_playableGraph, Vrc3ProxyOverride.OverrideController(controller));
                _weightControllers[i]      = new RadialWeightController(playableMixer, iGraph);
                for (var j = 0; j < _humanAnimatorPlayables[i].GetLayerCount(); j++)
                {
                    _humanAnimatorPlayables[i].SetLayerWeight(j, 1f);
                }

                playableMixer.ConnectInput(iGraph, _humanAnimatorPlayables[i], 0, 1);
                _fromBlend[vrcAnimLayer.type] = _weightControllers[i];

                if (limit)
                {
                    playableMixer.SetInputWeight(iGraph, 0f);
                }
                if (isAdd)
                {
                    playableMixer.SetLayerAdditive((uint)iGraph, true);
                }
                if (mask)
                {
                    playableMixer.SetLayerMaskFromAvatarMask((uint)iGraph, mask);
                }
            }

            _playableGraph.SetTimeUpdateMode(DirectorUpdateMode.GameTime);
            _playableGraph.Play();
            _playableGraph.Evaluate(0f);

            RadialMenu.Set(AvatarAnimator, Menu, Parameters, _humanAnimatorPlayables);
            RadialMenu.GetParam("TrackingType")?.InternalSet(1f);
            RadialMenu.GetParam("Upright")?.InternalSet(1f);
            RadialMenu.GetParam("Grounded")?.InternalSet(1f);
            RadialMenu.GetParam("VelocityX")?.Amplify(-7f);
            RadialMenu.GetParam("VelocityZ")?.Amplify(7f);
            RadialMenu.GetParam("AvatarVersion")?.InternalSet(3f);
            RadialMenu.GetParam("Seated")?.OnChange(OnSeatedModeChange);
        }