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(); } }
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(); } }