public bool Update(IMotionSource motionSource, IOutputTarget outputTarget) { if (_isLoading) { for (var i = 0; i < 9; i++) { ETarget[i] = Mathf.Lerp(ETarget[i], 0f, 0.05f); } for (var i = 0; i < 3; i++) { XTarget[i] = Mathf.Lerp(XTarget[i], 0.5f, 0.05f); RTarget[i] = Mathf.Lerp(RTarget[i], 0f, 0.05f); } } else if (motionSource != null) { UpdateMotion(motionSource); DebugDraw.DrawCircle(motionSource.TargetPosition + motionSource.TargetUp * RangeMinL0Slider.val * motionSource.ReferenceLength, motionSource.TargetUp, motionSource.TargetRight, Color.white, 0.05f); DebugDraw.DrawCircle(motionSource.TargetPosition + motionSource.TargetUp * RangeMaxL0Slider.val * motionSource.ReferenceLength, motionSource.TargetUp, motionSource.TargetRight, Color.white, 0.05f); } UpdateValues(outputTarget); return(true); }
private void UpdateMotionSource() { if (_desiredMotionSourceIndex != _currentMotionSourceIndex) { if (_currentMotionSource != null) { _currentMotionSource.OnDestroy(this); _currentMotionSource = null; } if (_desiredMotionSourceIndex >= 0) { _currentMotionSource = _motionSources[_desiredMotionSourceIndex]; _currentMotionSource.OnInit(this); } _currentMotionSourceIndex = _desiredMotionSourceIndex; } if (_currentMotionSource != null) { byte pos = 0; byte speed = 0; if (_currentMotionSource.OnUpdate(ref pos, ref speed)) { SendLaunchPosition(pos, speed); } } }
public bool UpdateMotion(IMotionSource motionSource) { var length = motionSource.ReferenceLength * ReferenceLengthScaleSlider.val; var radius = motionSource.ReferenceRadius * ReferenceRadiusScaleSlider.val; var referenceEnding = motionSource.ReferencePosition + motionSource.ReferenceUp * length; var diffPosition = motionSource.TargetPosition - motionSource.ReferencePosition; var diffEnding = motionSource.TargetPosition - referenceEnding; var aboveTarget = (Vector3.Dot(diffPosition, motionSource.TargetUp) < 0 && Vector3.Dot(diffEnding, motionSource.TargetUp) < 0) || Vector3.Dot(diffPosition, motionSource.ReferenceUp) < 0; for (var i = 0; i < 5; i++) { DebugDraw.DrawCircle(Vector3.Lerp(motionSource.ReferencePosition, referenceEnding, i / 4.0f), motionSource.ReferenceUp, motionSource.ReferenceRight, Color.grey, radius); } var t = Mathf.Clamp(Vector3.Dot(motionSource.TargetPosition - motionSource.ReferencePosition, motionSource.ReferenceUp), 0f, length); var closestPoint = motionSource.ReferencePosition + motionSource.ReferenceUp * t; if (Vector3.Magnitude(closestPoint - motionSource.TargetPosition) <= radius) { if (diffPosition.magnitude > 0.0001f) { XTarget[0] = 1 - Mathf.Clamp01((closestPoint - motionSource.ReferencePosition).magnitude / length); if (aboveTarget) { XTarget[0] = XTarget[0] > 0 ? 1 : 0; } var diffOnPlane = Vector3.ProjectOnPlane(diffPosition, motionSource.ReferencePlaneNormal); var rightOffset = Vector3.Project(diffOnPlane, motionSource.ReferenceRight); var forwardOffset = Vector3.Project(diffOnPlane, motionSource.ReferenceForward); XTarget[1] = forwardOffset.magnitude * Mathf.Sign(Vector3.Dot(forwardOffset, motionSource.ReferenceForward)); XTarget[2] = rightOffset.magnitude * Mathf.Sign(Vector3.Dot(rightOffset, motionSource.ReferenceRight)); } else { XTarget[0] = 1; XTarget[1] = 0; XTarget[2] = 0; } var correctedRight = Vector3.ProjectOnPlane(motionSource.TargetRight, motionSource.ReferenceUp); if (Vector3.Dot(correctedRight, motionSource.ReferenceRight) < 0) { correctedRight -= 2 * Vector3.Project(correctedRight, motionSource.ReferenceRight); } RTarget[0] = Vector3.SignedAngle(motionSource.ReferenceRight, correctedRight, motionSource.ReferenceUp) / 180; RTarget[1] = -Vector3.SignedAngle(motionSource.ReferenceUp, Vector3.ProjectOnPlane(motionSource.TargetUp, motionSource.ReferenceForward), motionSource.ReferenceForward) / 90; RTarget[2] = Vector3.SignedAngle(motionSource.ReferenceUp, Vector3.ProjectOnPlane(motionSource.TargetUp, motionSource.ReferenceRight), motionSource.ReferenceRight) / 90; ETarget[0] = OutputV0CurveEditorSettings.Evaluate(XTarget, RTarget); ETarget[1] = OutputA0CurveEditorSettings.Evaluate(XTarget, RTarget); ETarget[2] = OutputA1CurveEditorSettings.Evaluate(XTarget, RTarget); ETarget[3] = OutputA2CurveEditorSettings.Evaluate(XTarget, RTarget); if (_lastNoCollisionTime != null) { _lastNoCollisionSmoothingEnabled = true; _lastNoCollisionSmoothingStartTime = Time.time; _lastNoCollisionSmoothingDuration = Mathf.Clamp(Time.time - _lastNoCollisionTime.Value, 0.5f, 2); _lastNoCollisionTime = null; } return(true); } else { if (_lastNoCollisionTime == null) { _lastNoCollisionTime = Time.time; } return(false); } }