From 78bd61c056aa1c34487d4dddeb0bc81cd7f8bd79 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 16:58:29 +0200 Subject: [PATCH 01/13] live-catch: Implemented always on LiveCatch - but getting data for livecatch already --- .../Physics/Collision/StaticCollisionSystem.cs | 5 ++++- .../VPT/Flipper/FlipperCollider.cs | 16 +++++++++++++++- .../VPT/Flipper/FlipperDisplacementSystem.cs | 7 ++++++- .../VPT/Flipper/FlipperTricksData.cs | 5 +++++ .../VPT/Flipper/FlipperVelocitySystem.cs | 6 +----- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs index 75583ccc0..a06c93714 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs @@ -116,7 +116,10 @@ protected override void OnUpdate() var flipperMaterialData = GetComponent(coll.Entity); var flipperHitData = GetComponent(coll.Entity); var flipperTricksData = GetComponent(coll.Entity); - + // do liveCatch - check before collision + ((FlipperCollider*)collider)->LiveCatch( + ref ballData, in flipperTricksData, in flipperMaterialData, timeMsec + ) ; ((FlipperCollider*)collider)->Collide( ref ballData, ref collEvent, ref flipperMovementData, ref events, in ballEntity, in flipperTricksData,in flipperMaterialData, in flipperVelocityData, in flipperHitData, timeMsec diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index 271a39c56..73fcebb1b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NLog; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; @@ -574,7 +575,7 @@ private float HitTestFlipperEnd(ref CollisionEventData collEvent, ref FlipperHit // hit limits ??? if (contactAng >= angleMax && angleSpeed > 0 || contactAng <= angleMin && angleSpeed < 0) { - angleSpeed = 0; // rotation stopped + angleSpeed = 0f; // rotation stopped } // Unit Tangent vector velocity of contact point(rotate normal right) @@ -717,6 +718,19 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #endregion + public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + #region LiveCatch + public void LiveCatch(ref BallData ball, in FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) + { + if (ball.Velocity.y > 6) + { + Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.liveCatchTime*1000, tricks.liveCatchTime*1000-msec); + ball.Velocity.y = 0.6f; + } + } + + #endregion + #region Collision public void Collide(ref BallData ball, ref CollisionEventData collEvent, ref FlipperMovementData movementData, diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs index a59133b74..69dace71b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs @@ -50,8 +50,9 @@ protected override void OnUpdate() var dTime = _simulateCycleSystemGroup.HitTime; var events = _eventQueue.AsParallelWriter(); var marker = PerfMarker; + var currentTime = Time.ElapsedTime; - Entities.WithName("FlipperDisplacementJob").ForEach((Entity entity, ref FlipperMovementData state, in FlipperTricksData tricks,in FlipperStaticData data) => { + Entities.WithName("FlipperDisplacementJob").ForEach((Entity entity, ref FlipperMovementData state, ref FlipperTricksData tricks, in FlipperStaticData data) => { marker.Begin(); @@ -76,6 +77,10 @@ protected override void OnUpdate() var handleEvent = false; + if (state.Angle == tricks.AngleEnd) { + tricks.liveCatchTime = currentTime; + } + if (state.Angle >= angleMax) { // hit stop? if (state.AngleSpeed > 0) { diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs index 6037c82e1..e2ef4c3fd 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs @@ -38,6 +38,9 @@ internal struct FlipperTricksData : IComponentData public bool WasInContact; + // time used for live Catch + public double liveCatchTime; + // externals public bool useFlipperTricksPhysics; public float SOSRampUp; @@ -47,5 +50,7 @@ internal struct FlipperTricksData : IComponentData public float EOSANew; public float EOSRampup; public float Overshoot; + public bool useFlipperLiveCatch; + } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs index cf696bc45..678f3c02d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs @@ -71,11 +71,7 @@ protected override void OnUpdate() } // hold coil is weaker - float eosAngle; - if (tricks.useFlipperTricksPhysics) - eosAngle = math.radians(tricks.TorqueDampingAngle); - else - eosAngle = math.radians(tricks.TorqueDampingAngle); + float eosAngle = math.radians(tricks.TorqueDampingAngle); if (math.abs(mState.Angle - tricks.AngleEnd) < eosAngle) { // fade in/out damping, depending on angle to end var lerp = math.pow(math.abs(mState.Angle - tricks.AngleEnd) / eosAngle, 4); From 6d17bbe503c71f15e4afb73fff3ec5555225a0d8 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 17:22:00 +0200 Subject: [PATCH 02/13] live-catch: Add Live-Catch variables to FlipperTricksdata and rename some. --- .../VPT/Flipper/FlipperCollider.cs | 5 +++-- .../VPT/Flipper/FlipperComponent.cs | 2 +- .../VPT/Flipper/FlipperDisplacementSystem.cs | 2 +- .../VPT/Flipper/FlipperTricksData.cs | 15 ++++++++++++--- .../VPT/Flipper/FlipperVelocitySystem.cs | 6 +++--- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index 73fcebb1b..d56ab7407 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -722,9 +722,10 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #region LiveCatch public void LiveCatch(ref BallData ball, in FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { + if (ball.Velocity.y > 6) { - Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.liveCatchTime*1000, tricks.liveCatchTime*1000-msec); + Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime*1000, tricks.FlipperAngleEndTime*1000-msec); ball.Velocity.y = 0.6f; } } @@ -800,7 +801,7 @@ public void Collide(ref BallData ball, ref CollisionEventData collEvent, ref Fli * 0 = no falloff, 1 = half the COR at 1 m/s (18.53 speed units) */ var epsilon = Math.ElasticityWithFalloff(_header.Material.Elasticity, _header.Material.ElasticityFalloff, bnv); - if (tricks.useFlipperTricksPhysics) + if (tricks.UseFlipperTricksPhysics) epsilon *= tricks.ElasticityMultiplier; var pv1 = angResp / matData.Inertia; diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs index e2b59df78..1d920b621 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs @@ -581,7 +581,7 @@ private FlipperTricksData GetFlipperTricksData(FlipperColliderComponent collider { return new FlipperTricksData { - useFlipperTricksPhysics = colliderComponent.useFlipperTricksPhysics, + UseFlipperTricksPhysics = colliderComponent.useFlipperTricksPhysics, SOSRampUp = colliderComponent.SOSRampUp, SOSEM = colliderComponent.SOSEM, EOSReturn = colliderComponent.EOSReturn, diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs index 69dace71b..bdd63878f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperDisplacementSystem.cs @@ -78,7 +78,7 @@ protected override void OnUpdate() var handleEvent = false; if (state.Angle == tricks.AngleEnd) { - tricks.liveCatchTime = currentTime; + tricks.FlipperAngleEndTime = currentTime; } if (state.Angle >= angleMax) { diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs index e2ef4c3fd..e6514bb9c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs @@ -39,10 +39,11 @@ internal struct FlipperTricksData : IComponentData public bool WasInContact; // time used for live Catch - public double liveCatchTime; + public double FlipperAngleEndTime; // externals - public bool useFlipperTricksPhysics; + // Flipper Tricksdeu absolut + public bool UseFlipperTricksPhysics; public float SOSRampUp; public float SOSEM; public float EOSReturn; @@ -50,7 +51,15 @@ internal struct FlipperTricksData : IComponentData public float EOSANew; public float EOSRampup; public float Overshoot; - public bool useFlipperLiveCatch; + + // Live Catch + public bool UseFlipperLiveCatch; + public float LiveCatchDistanceMin; // vp units from base + public float LiveCatchDistanceMax; // vp units from base + public float LiveCatchMinimalBallSpeed; + public float LiveCatchPerfectTime; + public float LiveCatchFullTime; + public float LiveCatchInaccuracySpeed; } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs index 678f3c02d..8c9670477 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperVelocitySystem.cs @@ -48,7 +48,7 @@ protected override void OnUpdate() desiredTorque *= -data.ReturnRatio; } - if (tricks.useFlipperTricksPhysics) { + if (tricks.UseFlipperTricksPhysics) { // check if solenoid was just activated or deactivated if (solenoid.Value != tricks.lastSolState) { @@ -75,7 +75,7 @@ protected override void OnUpdate() if (math.abs(mState.Angle - tricks.AngleEnd) < eosAngle) { // fade in/out damping, depending on angle to end var lerp = math.pow(math.abs(mState.Angle - tricks.AngleEnd) / eosAngle, 4); - if (tricks.useFlipperTricksPhysics) + if (tricks.UseFlipperTricksPhysics) desiredTorque *= lerp + tricks.TorqueDamping * (1 - lerp); else desiredTorque *= lerp + tricks.TorqueDamping * (1 - lerp); @@ -128,7 +128,7 @@ protected override void OnUpdate() mState.AngleSpeed = mState.AngularMomentum / data.Inertia; vState.AngularAcceleration = torque / data.Inertia; - if (tricks.useFlipperTricksPhysics) + if (tricks.UseFlipperTricksPhysics) { // Flippertricks, case 3 (OnFlipperDown) and 4 (OnFlipperUpResting) if (!tricks.WasInContact && vState.IsInContact) From d07bfaeb21422f83c77bbf565e98a383e6d5200b Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 17:48:06 +0200 Subject: [PATCH 03/13] live-catch: Add Properties to FlipperComponent and inspector, typo --- .../VPT/Flipper/FlipperColliderInspector.cs | 35 +++++++++++++++++-- .../VPT/Flipper/FlipperColliderComponent.cs | 34 +++++++++++++++++- .../VPT/Flipper/FlipperTricksData.cs | 2 +- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs index bba9fdea3..caf72e21d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs @@ -52,6 +52,13 @@ public class FlipperColliderInspector : ColliderInspector GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter); - #region Flipper_Tricks + #region FlipperTricks /// /// If set, apply Flipper Tricks Physics (nFozzy/RothBauerW) /// @@ -120,6 +120,38 @@ public class FlipperColliderComponent : ColliderComponent + /// If set, apply Flipper Tricks Physics (nFozzy/RothBauerW) + /// + #endregion + [Tooltip("The nFozzy's LiveCatch Physics")] + public bool useFlipperLiveCatch = false; + + [Min(0f)] + [Tooltip("Minimum distance in vp units from flipper base live catch dampening will occur")] + public float LiveCatchDistanceMin = 30f; + + [Min(0f)] + [Tooltip("Maxium distance in vp units from flipper base live catch dampening will occur")] + public float LiveCatchDistanceMax = 114f; + + [Min(0f)] + [Tooltip("Minimal ball speed for live catch")] + public float LiveCatchMinimalBallSpeed = 6f; + + [Min(0f)] + [Tooltip("Maximum Time in msecs for (perfect or imperfect) live catch")] + public float LiveCatchFullTime = 16; + + [Min(0f)] + [Tooltip("Maximum Time in msecs for a perfect live catch")] + public float LiveCatchPerfectTime = 8; + + [Min(0f)] + [Tooltip("Maximum bounce speed for an inaccurate live catch")] + public float LiveCatchInaccuracySpeed = 32; + protected override IApiColliderGenerator InstantiateColliderApi(Player player, Entity entity) => new FlipperApi(gameObject, entity, player); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs index e6514bb9c..cc8334d41 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs @@ -42,7 +42,7 @@ internal struct FlipperTricksData : IComponentData public double FlipperAngleEndTime; // externals - // Flipper Tricksdeu absolut + // Flipper Tricks public bool UseFlipperTricksPhysics; public float SOSRampUp; public float SOSEM; From 4c3054ddac9c4540fff54ba46d055924a91fe749 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 18:11:26 +0200 Subject: [PATCH 04/13] lice-catch: add Collision Event to Livecatch to get normal vector of the ball --- .../Physics/Collision/StaticCollisionSystem.cs | 2 +- .../VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs | 2 +- .../VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs index a06c93714..b292b7997 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs @@ -118,7 +118,7 @@ protected override void OnUpdate() var flipperTricksData = GetComponent(coll.Entity); // do liveCatch - check before collision ((FlipperCollider*)collider)->LiveCatch( - ref ballData, in flipperTricksData, in flipperMaterialData, timeMsec + ref ballData, ref collEvent, ref flipperTricksData, in flipperMaterialData, timeMsec ) ; ((FlipperCollider*)collider)->Collide( ref ballData, ref collEvent, ref flipperMovementData, ref events, diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index d56ab7407..dfc6fcd62 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -720,7 +720,7 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); #region LiveCatch - public void LiveCatch(ref BallData ball, in FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) + public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { if (ball.Velocity.y > 6) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs index 068b48b76..32519ad48 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs @@ -122,7 +122,7 @@ public class FlipperColliderComponent : ColliderComponent - /// If set, apply Flipper Tricks Physics (nFozzy/RothBauerW) + /// If set, apply Live Catch (nFozzy/RothBauerW) /// #endregion [Tooltip("The nFozzy's LiveCatch Physics")] From 44221e5b3107aa8b6b6f4071eb1b7c1d34030d01 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 18:37:50 +0200 Subject: [PATCH 05/13] live-catch: copy values from component to FlipperTricksData at runtime --- .../VPT/Flipper/FlipperCollider.cs | 15 ++++++++++----- .../VPT/Flipper/FlipperComponent.cs | 10 +++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index dfc6fcd62..19e51a806 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -722,12 +722,17 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #region LiveCatch public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { + var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; - if (ball.Velocity.y > 6) - { - Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime*1000, tricks.FlipperAngleEndTime*1000-msec); - ball.Velocity.y = 0.6f; - } + // only test for LiveCatch if Ballspeed is greater as set Minimal Speed (default = 6) + if (normalSpeed >= tricks.LiveCatchMinimalBallSpeed) + + if (ball.Velocity.y > 6) + { + Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); + Logger.Info("LiveCatchTest - normalspeed = {0}", normalSpeed); + ball.Velocity.y = 0.6f; + } } #endregion diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs index 1d920b621..e3e07645c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs @@ -592,7 +592,15 @@ private FlipperTricksData GetFlipperTricksData(FlipperColliderComponent collider AngleEnd = staticData.AngleEnd, TorqueDamping = staticData.TorqueDamping, TorqueDampingAngle = staticData.TorqueDampingAngle, - RampUpSpeed = staticData.RampUpSpeed, + RampUpSpeed = staticData.RampUpSpeed, + + UseFlipperLiveCatch = colliderComponent.useFlipperLiveCatch, + LiveCatchDistanceMin = colliderComponent.LiveCatchDistanceMin, // vp units from base + LiveCatchDistanceMax = colliderComponent.LiveCatchDistanceMax, // vp units from base + LiveCatchMinimalBallSpeed = colliderComponent.LiveCatchMinimalBallSpeed, + LiveCatchPerfectTime = colliderComponent.LiveCatchPerfectTime, + LiveCatchFullTime = colliderComponent.LiveCatchFullTime, + LiveCatchInaccuracySpeed = colliderComponent.LiveCatchInaccuracySpeed, //initialize OriginalAngleEnd = staticData.AngleEnd, From 5b2a8032731a9e64633fbfb6e53cafd6cc01e6f4 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 19:46:58 +0200 Subject: [PATCH 06/13] live catch: add live catch logic, minimal bounce (as multiplicator), wording: inaccurate, --- .../VPT/Flipper/FlipperColliderInspector.cs | 13 +++++--- .../VPT/Flipper/FlipperCollider.cs | 33 ++++++++++++++----- .../VPT/Flipper/FlipperColliderComponent.cs | 8 +++-- .../VPT/Flipper/FlipperComponent.cs | 3 +- .../VPT/Flipper/FlipperTricksData.cs | 3 +- 5 files changed, 43 insertions(+), 17 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs index caf72e21d..8b71b651c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs @@ -58,7 +58,8 @@ public class FlipperColliderInspector : ColliderInspector= tricks.LiveCatchMinimalBallSpeed) + // different to nFozzys implementation we calculate all speeds based on the angle of the flipper, not y direction. + if (normalSpeed >= tricks.LiveCatchMinimalBallSpeed) { + float catchTime = (float)(msec - tricks.FlipperAngleEndTime * 1000); + if (catchTime <= tricks.LiveCatchFullTime){ + // we have a live catch, so stop the ball for now. + ball.Velocity += normalSpeed * collEvent.HitNormal; + // do we have some bounce + // as a difference to the nFozzy implementation, we don't deal with hard-coded speeds, but multiplier to current speed against the flipper. + var liveCatchBounceMultiplier = tricks.LiveCatchMinimalBounceSpeedMultiplier; + Logger.Info("We have a live catch"); + if (catchTime > tricks.LiveCatchPerfectTime) { + // but it's imperfect, so we have add some bounce + // example: hit after 10 msecs, fulltime is 16, perfect time is 8, should be (10-8)/(16-8)*inaccuracySpeedMultiplier + liveCatchBounceMultiplier = (catchTime - tricks.LiveCatchPerfectTime) / (tricks.LiveCatchFullTime - tricks.LiveCatchPerfectTime) * (tricks.LiveCatchInaccurateBounceSpeedMultiplier-tricks.LiveCatchMinimalBounceSpeedMultiplier) + tricks.LiveCatchMinimalBounceSpeedMultiplier; + + } + Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); + ball.Velocity -= collEvent.HitNormal * normalSpeed * liveCatchBounceMultiplier; + ball.AngularMomentum.x = 0; + ball.AngularMomentum.y = 0; - if (ball.Velocity.y > 6) - { - Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); - Logger.Info("LiveCatchTest - normalspeed = {0}", normalSpeed); - ball.Velocity.y = 0.6f; } + Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); + Logger.Info("LiveCatchTest - normalspeed = {0}, catchTime = {1}", normalSpeed, catchTime); + + } } #endregion diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs index 32519ad48..e3badacb3 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs @@ -149,8 +149,12 @@ public class FlipperColliderComponent : ColliderComponent new FlipperApi(gameObject, entity, player); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs index e3e07645c..496791714 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs @@ -600,7 +600,8 @@ private FlipperTricksData GetFlipperTricksData(FlipperColliderComponent collider LiveCatchMinimalBallSpeed = colliderComponent.LiveCatchMinimalBallSpeed, LiveCatchPerfectTime = colliderComponent.LiveCatchPerfectTime, LiveCatchFullTime = colliderComponent.LiveCatchFullTime, - LiveCatchInaccuracySpeed = colliderComponent.LiveCatchInaccuracySpeed, + LiveCatchInaccurateBounceSpeedMultiplier = colliderComponent.LiveCatchInaccurateBounceSpeedMultiplier, + LiveCatchMinimalBounceSpeedMultiplier = colliderComponent.LiveCatchMinmalBounceSpeedMultiplier, //initialize OriginalAngleEnd = staticData.AngleEnd, diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs index cc8334d41..69442df92 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperTricksData.cs @@ -59,7 +59,8 @@ internal struct FlipperTricksData : IComponentData public float LiveCatchMinimalBallSpeed; public float LiveCatchPerfectTime; public float LiveCatchFullTime; - public float LiveCatchInaccuracySpeed; + public float LiveCatchMinimalBounceSpeedMultiplier; + public float LiveCatchInaccurateBounceSpeedMultiplier; } } From b2bb545eae23f4879607d5528ca956fcaff4548c Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 19:51:13 +0200 Subject: [PATCH 07/13] live-catch: comment out logging --- .../VPT/Flipper/FlipperCollider.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index d8312a6ab..b4c75631c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -14,13 +14,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NLog; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; using VisualPinball.Engine.Common; using VisualPinball.Engine.Game; +// using NLog; namespace VisualPinball.Unity { @@ -718,7 +718,7 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #endregion - public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + //public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); #region LiveCatch public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; @@ -733,21 +733,22 @@ public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref F // do we have some bounce // as a difference to the nFozzy implementation, we don't deal with hard-coded speeds, but multiplier to current speed against the flipper. var liveCatchBounceMultiplier = tricks.LiveCatchMinimalBounceSpeedMultiplier; - Logger.Info("We have a live catch"); + //Logger.Info("We have a live catch"); if (catchTime > tricks.LiveCatchPerfectTime) { // but it's imperfect, so we have add some bounce // example: hit after 10 msecs, fulltime is 16, perfect time is 8, should be (10-8)/(16-8)*inaccuracySpeedMultiplier liveCatchBounceMultiplier = (catchTime - tricks.LiveCatchPerfectTime) / (tricks.LiveCatchFullTime - tricks.LiveCatchPerfectTime) * (tricks.LiveCatchInaccurateBounceSpeedMultiplier-tricks.LiveCatchMinimalBounceSpeedMultiplier) + tricks.LiveCatchMinimalBounceSpeedMultiplier; } - Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); + //Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); + // re-add speed (to the flipper, since the rubber has still to be calculated) ball.Velocity -= collEvent.HitNormal * normalSpeed * liveCatchBounceMultiplier; + // kill momentum, but not z... (why is this in nFozzy's?) ball.AngularMomentum.x = 0; ball.AngularMomentum.y = 0; - } - Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); - Logger.Info("LiveCatchTest - normalspeed = {0}, catchTime = {1}", normalSpeed, catchTime); + //Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); + //Logger.Info("LiveCatchTest - normalspeed = {0}, catchTime = {1}", normalSpeed, catchTime); } } From 9d84475027c4e7e1f610fcabec26955994cc5cb1 Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 19:53:11 +0200 Subject: [PATCH 08/13] Revert "live-catch: comment out logging" This reverts commit b2bb545eae23f4879607d5528ca956fcaff4548c. --- .../VPT/Flipper/FlipperCollider.cs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index b4c75631c..d8312a6ab 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -14,13 +14,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using NLog; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; using Unity.Mathematics; using VisualPinball.Engine.Common; using VisualPinball.Engine.Game; -// using NLog; namespace VisualPinball.Unity { @@ -718,7 +718,7 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #endregion - //public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); #region LiveCatch public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; @@ -733,22 +733,21 @@ public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref F // do we have some bounce // as a difference to the nFozzy implementation, we don't deal with hard-coded speeds, but multiplier to current speed against the flipper. var liveCatchBounceMultiplier = tricks.LiveCatchMinimalBounceSpeedMultiplier; - //Logger.Info("We have a live catch"); + Logger.Info("We have a live catch"); if (catchTime > tricks.LiveCatchPerfectTime) { // but it's imperfect, so we have add some bounce // example: hit after 10 msecs, fulltime is 16, perfect time is 8, should be (10-8)/(16-8)*inaccuracySpeedMultiplier liveCatchBounceMultiplier = (catchTime - tricks.LiveCatchPerfectTime) / (tricks.LiveCatchFullTime - tricks.LiveCatchPerfectTime) * (tricks.LiveCatchInaccurateBounceSpeedMultiplier-tricks.LiveCatchMinimalBounceSpeedMultiplier) + tricks.LiveCatchMinimalBounceSpeedMultiplier; } - //Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); - // re-add speed (to the flipper, since the rubber has still to be calculated) + Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); ball.Velocity -= collEvent.HitNormal * normalSpeed * liveCatchBounceMultiplier; - // kill momentum, but not z... (why is this in nFozzy's?) ball.AngularMomentum.x = 0; ball.AngularMomentum.y = 0; + } - //Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); - //Logger.Info("LiveCatchTest - normalspeed = {0}, catchTime = {1}", normalSpeed, catchTime); + Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); + Logger.Info("LiveCatchTest - normalspeed = {0}, catchTime = {1}", normalSpeed, catchTime); } } From b3932e0c2e328ec4d036852ba80844752a6cc45f Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 20:20:22 +0200 Subject: [PATCH 09/13] live-catch: add Max and min distance from flipperposition checks and new default values. --- .../VPT/Flipper/FlipperCollider.cs | 14 +++++++++++++- .../VPT/Flipper/FlipperColliderComponent.cs | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index d8312a6ab..71f233754 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -722,7 +722,19 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #region LiveCatch public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; - + // Vector from position of the flipper ball to ball + var flipperToBall = ball.Position - matData.Position; + var HatTangent = Math.CrossZ(1f, collEvent.HitNormal); + var ballPosition = math.dot(HatTangent, flipperToBall); + Logger.Info("BallPosition = {0}", ballPosition); + if (math.abs(ballPosition) > tricks.LiveCatchDistanceMax) { + Logger.Info("BallPosition = {0} -> no calculation", ballPosition); + return; + } + if (math.abs(ballPosition) < tricks.LiveCatchDistanceMin) { + Logger.Info("BallPosition = {0} -> no calculation", ballPosition); + return; + } // only test for LiveCatch if Ballspeed is greater as set Minimal Speed (default = 6) // different to nFozzys implementation we calculate all speeds based on the angle of the flipper, not y direction. if (normalSpeed >= tricks.LiveCatchMinimalBallSpeed) { diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs index e3badacb3..45f3b6fff 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs @@ -130,11 +130,11 @@ public class FlipperColliderComponent : ColliderComponent Date: Sat, 27 Aug 2022 20:23:04 +0200 Subject: [PATCH 10/13] live-catch: Comment out Logging so that burst can be re-enabled --- .../VPT/Flipper/FlipperCollider.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index 71f233754..540d8bbe3 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -using NLog; +//using NLog; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; @@ -718,7 +718,7 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #endregion - public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + //public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); #region LiveCatch public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; @@ -726,13 +726,13 @@ public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref F var flipperToBall = ball.Position - matData.Position; var HatTangent = Math.CrossZ(1f, collEvent.HitNormal); var ballPosition = math.dot(HatTangent, flipperToBall); - Logger.Info("BallPosition = {0}", ballPosition); + //Logger.Info("BallPosition = {0}", ballPosition); if (math.abs(ballPosition) > tricks.LiveCatchDistanceMax) { - Logger.Info("BallPosition = {0} -> no calculation", ballPosition); + //Logger.Info("BallPosition = {0} -> no calculation", ballPosition); return; } if (math.abs(ballPosition) < tricks.LiveCatchDistanceMin) { - Logger.Info("BallPosition = {0} -> no calculation", ballPosition); + //Logger.Info("BallPosition = {0} -> no calculation", ballPosition); return; } // only test for LiveCatch if Ballspeed is greater as set Minimal Speed (default = 6) @@ -745,21 +745,21 @@ public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref F // do we have some bounce // as a difference to the nFozzy implementation, we don't deal with hard-coded speeds, but multiplier to current speed against the flipper. var liveCatchBounceMultiplier = tricks.LiveCatchMinimalBounceSpeedMultiplier; - Logger.Info("We have a live catch"); + //Logger.Info("We have a live catch"); if (catchTime > tricks.LiveCatchPerfectTime) { // but it's imperfect, so we have add some bounce // example: hit after 10 msecs, fulltime is 16, perfect time is 8, should be (10-8)/(16-8)*inaccuracySpeedMultiplier liveCatchBounceMultiplier = (catchTime - tricks.LiveCatchPerfectTime) / (tricks.LiveCatchFullTime - tricks.LiveCatchPerfectTime) * (tricks.LiveCatchInaccurateBounceSpeedMultiplier-tricks.LiveCatchMinimalBounceSpeedMultiplier) + tricks.LiveCatchMinimalBounceSpeedMultiplier; } - Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); + //Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); ball.Velocity -= collEvent.HitNormal * normalSpeed * liveCatchBounceMultiplier; ball.AngularMomentum.x = 0; ball.AngularMomentum.y = 0; } - Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); - Logger.Info("LiveCatchTest - normalspeed = {0}, catchTime = {1}", normalSpeed, catchTime); + //Logger.Info("LiveCatchTest - Ball with y-speed {0}, at CollisionTime: {1}, livecatchTime is {2}, difference is {3} msecs", ball.Velocity.y, msec, tricks.FlipperAngleEndTime * 1000, tricks.FlipperAngleEndTime * 1000 - msec); + //Logger.Info("LiveCatchTest - normalspeed = {0}, catchTime = {1}", normalSpeed, catchTime); } } From f5d5e7868a8854aa30e00a224f9b303933c2150e Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sat, 27 Aug 2022 20:49:17 +0200 Subject: [PATCH 11/13] live-catch: Typo. --- .../VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index 540d8bbe3..5885bbdbb 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -724,8 +724,8 @@ public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref F var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; // Vector from position of the flipper ball to ball var flipperToBall = ball.Position - matData.Position; - var HatTangent = Math.CrossZ(1f, collEvent.HitNormal); - var ballPosition = math.dot(HatTangent, flipperToBall); + var HitTangent = Math.CrossZ(1f, collEvent.HitNormal); + var ballPosition = math.dot(HitTangent, flipperToBall); //Logger.Info("BallPosition = {0}", ballPosition); if (math.abs(ballPosition) > tricks.LiveCatchDistanceMax) { //Logger.Info("BallPosition = {0} -> no calculation", ballPosition); From 256beb365e92a7ec22c05a5153dd7827735b2b8e Mon Sep 17 00:00:00 2001 From: Cupiii Date: Sun, 28 Aug 2022 20:28:00 +0200 Subject: [PATCH 12/13] Live-catch: allow Live catch to be turned off in FlipperCollider component. --- .../VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index 5885bbdbb..cd27e5147 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -721,6 +721,8 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM //public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); #region LiveCatch public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { + if (!tricks.UseFlipperLiveCatch) + return; var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; // Vector from position of the flipper ball to ball var flipperToBall = ball.Position - matData.Position; From 691d015f189cb5520455da8cf34c67ef666f02ab Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 5 Sep 2022 22:28:46 +0200 Subject: [PATCH 13/13] live-catch: Minor cleanup. --- .../VPT/Flipper/FlipperColliderInspector.cs | 117 ++++++++++-------- .../Collision/StaticCollisionSystem.cs | 4 +- .../VPT/Flipper/FlipperCollider.cs | 18 ++- .../VPT/Flipper/FlipperColliderComponent.cs | 11 +- 4 files changed, 83 insertions(+), 67 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs index 8b71b651c..c143a6f95 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Flipper/FlipperColliderInspector.cs @@ -39,27 +39,34 @@ public class FlipperColliderInspector : ColliderInspector(coll.Entity); var flipperTricksData = GetComponent(coll.Entity); // do liveCatch - check before collision - ((FlipperCollider*)collider)->LiveCatch( + FlipperCollider.LiveCatch( ref ballData, ref collEvent, ref flipperTricksData, in flipperMaterialData, timeMsec - ) ; + ); ((FlipperCollider*)collider)->Collide( ref ballData, ref collEvent, ref flipperMovementData, ref events, in ballEntity, in flipperTricksData,in flipperMaterialData, in flipperVelocityData, in flipperHitData, timeMsec diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs index cd27e5147..43696584c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperCollider.cs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -//using NLog; +using NLog; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using Unity.Entities; @@ -36,6 +36,10 @@ internal struct FlipperCollider : ICollider public ColliderBounds Bounds { get; private set; } + public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + #region Setup + public FlipperCollider(CircleCollider hitCircleBase, float flipperRadius, float startRadius, float endRadius, float startAngle, float endAngle, ColliderInfo info) : this() { var bounds = hitCircleBase.Bounds; @@ -144,6 +148,8 @@ public unsafe void Allocate(BlobBuilder builder, ref BlobBuilderArray insideOfs, @@ -718,16 +724,16 @@ private void GetRelativeVelocity(in float3 normal, in BallData ball, in FlipperM #endregion - //public static readonly Logger Logger = LogManager.GetCurrentClassLogger(); #region LiveCatch - public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { + + public static void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref FlipperTricksData tricks, in FlipperStaticData matData, uint msec ) { if (!tricks.UseFlipperLiveCatch) return; var normalSpeed = math.dot(collEvent.HitNormal, ball.Velocity) * -1f; // Vector from position of the flipper ball to ball var flipperToBall = ball.Position - matData.Position; - var HitTangent = Math.CrossZ(1f, collEvent.HitNormal); - var ballPosition = math.dot(HitTangent, flipperToBall); + var hitTangent = Math.CrossZ(1f, collEvent.HitNormal); + var ballPosition = math.dot(hitTangent, flipperToBall); //Logger.Info("BallPosition = {0}", ballPosition); if (math.abs(ballPosition) > tricks.LiveCatchDistanceMax) { //Logger.Info("BallPosition = {0} -> no calculation", ballPosition); @@ -752,7 +758,7 @@ public void LiveCatch(ref BallData ball, ref CollisionEventData collEvent, ref F // but it's imperfect, so we have add some bounce // example: hit after 10 msecs, fulltime is 16, perfect time is 8, should be (10-8)/(16-8)*inaccuracySpeedMultiplier liveCatchBounceMultiplier = (catchTime - tricks.LiveCatchPerfectTime) / (tricks.LiveCatchFullTime - tricks.LiveCatchPerfectTime) * (tricks.LiveCatchInaccurateBounceSpeedMultiplier-tricks.LiveCatchMinimalBounceSpeedMultiplier) + tricks.LiveCatchMinimalBounceSpeedMultiplier; - + } //Logger.Info("Bounce Multiplicator is {0}, catchtime {1}", liveCatchBounceMultiplier, catchTime); ball.Velocity -= collEvent.HitNormal * normalSpeed * liveCatchBounceMultiplier; diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs index 45f3b6fff..4261caf7f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs @@ -16,7 +16,6 @@ // ReSharper disable InconsistentNaming -using System; using Unity.Entities; using UnityEngine; using VisualPinball.Engine.VPT.Flipper; @@ -127,25 +126,27 @@ public class FlipperColliderComponent : ColliderComponent