示例#1
0
        protected override void UpdateTool(InputSource inputSource)
        {
            if (_currentTargetBehavior?.Grabbable ?? false)
            {
                _grabTool.Update(inputSource, Target);
                if (_grabTool.GrabActive)
                {
                    // If a grab is active, nothing should change about the current target.
                    return;
                }
            }

            var newTarget = FindTarget(inputSource);

            if (Target == newTarget)
            {
                return;
            }

            if (Target != null && _currentTargetBehavior != null)
            {
                var mwUser = _currentTargetBehavior.GetMWUnityUser(inputSource.UserGameObject);
                if (mwUser != null)
                {
                    _currentTargetBehavior.Target.StopAction(mwUser);
                }
            }

            TargetBehavior newBehavior = null;

            if (newTarget != null)
            {
                newBehavior = newTarget.GetBehavior <TargetBehavior>();
                var mwUser = newBehavior.GetMWUnityUser(inputSource.UserGameObject);
                if (mwUser != null)
                {
                    newBehavior.Target.StartAction(mwUser);
                }
            }

            OnTargetChanged(Target, newTarget, inputSource);
            Target = newTarget;

            if (newBehavior != null)
            {
                if (newBehavior.GetDesiredToolType() != inputSource.CurrentTool.GetType())
                {
                    inputSource.HoldTool(newBehavior.GetDesiredToolType());
                }

                _currentTargetBehavior = newBehavior;
            }
        }
        protected override void UpdateTool(InputSource inputSource)
        {
            if (_currentTargetBehavior?.Grabbable ?? false)
            {
                _grabTool.Update(inputSource, Target);
                if (_grabTool.GrabActive)
                {
                    // If a grab is active, nothing should change about the current target.
                    return;
                }
            }

            Vector3?hitPoint;
            var     newTarget = FindTarget(inputSource, out hitPoint);

            if ((Target == null || !Godot.Object.IsInstanceValid(Target)) && (newTarget == null || !Godot.Object.IsInstanceValid(newTarget)))
            {
                return;
            }

            if (Target == newTarget)
            {
                var mwUser = _currentTargetBehavior.GetMWUnityUser(inputSource.UserNode);
                if (mwUser == null)
                {
                    return;
                }

                CurrentTargetPoint = hitPoint.Value;
                _currentTargetBehavior.Context.UpdateTargetPoint(mwUser, CurrentTargetPoint);
                return;
            }

            TargetBehavior newBehavior = null;

            if (newTarget != null && Godot.Object.IsInstanceValid(newTarget))
            {
                newBehavior = newTarget.GetBehavior <TargetBehavior>();

                // FIXME: This is workaround. Sometimes newBehavior is null even if new Target is an Actor!
                if (newBehavior == null /*&& newTarget is MixedRealityExtension.Core.Actor*/)
                {
                    return;
                }

                if (newBehavior.GetDesiredToolType() != inputSource.CurrentTool.GetType())
                {
                    inputSource.HoldTool(newBehavior.GetDesiredToolType());
                }
                else
                {
                    OnTargetChanged(
                        Target,
                        CurrentTargetPoint,
                        newTarget,
                        hitPoint.Value,
                        newBehavior,
                        inputSource);
                }
            }
            else
            {
                OnTargetChanged(
                    Target,
                    CurrentTargetPoint,
                    null,
                    Vector3.Zero,
                    null,
                    inputSource);

                inputSource.DropTool();
            }
        }
示例#3
0
        protected override void UpdateTool(InputSource inputSource)
        {
            if (_currentTargetBehavior?.Grabbable ?? false)
            {
                _grabTool.Update(inputSource, Target);
                if (_grabTool.GrabActive)
                {
                    // If a grab is active, nothing should change about the current target.
                    return;
                }
            }

            Vector3?hitPoint;
            var     newTarget = FindTarget(inputSource, out hitPoint);

            if (Target == null && newTarget == null)
            {
                return;
            }

            if (Target == newTarget)
            {
                var mwUser = _currentTargetBehavior.GetMWUnityUser(inputSource.UserGameObject);
                if (mwUser == null)
                {
                    return;
                }

                CurrentTargetPoint = hitPoint.Value;
                _currentTargetBehavior.Context.UpdateTargetPoint(mwUser, CurrentTargetPoint);
                return;
            }

            TargetBehavior newBehavior = null;

            if (newTarget != null)
            {
                newBehavior = newTarget.GetBehavior <TargetBehavior>();

                if (newBehavior.GetDesiredToolType() != inputSource.CurrentTool.GetType())
                {
                    inputSource.HoldTool(newBehavior.GetDesiredToolType());
                }
                else
                {
                    OnTargetChanged(
                        Target,
                        CurrentTargetPoint,
                        newTarget,
                        hitPoint.Value,
                        newBehavior,
                        inputSource);
                }
            }
            else
            {
                OnTargetChanged(
                    Target,
                    CurrentTargetPoint,
                    null,
                    Vector3.zero,
                    null,
                    inputSource);

                inputSource.DropTool();
            }
        }