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();
            }
        }
示例#2
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();
            }
        }