: SubComponent Physics.GetLocalToPlayfieldMatrixInVpx(MainComponent.transform.localToWorldMatrix, worldToPlayfield);
- public abstract PhysicsMaterialData PhysicsMaterialData { get; }
-
private bool HasCachedColliders => false;// _colliderMesh != null && !_collidersDirty;
private void Start()
@@ -99,30 +102,49 @@ private void OnDisable()
GetComponentInParent()?.DisableCollider(MainComponent.gameObject.GetInstanceID());
}
- protected PhysicsMaterialData GetPhysicsMaterialData(float elasticity = 1f, float elasticityFalloff = 1f,
- float friction = 0f, float scatterAngleDeg = 0f, bool overwrite = true)
+ internal PhysicsMaterialData GetPhysicsMaterialData()
{
- if (!overwrite && PhysicsMaterial != null) {
- //Debug.Log("load special Physics Material Data:" + PhysicsMaterial.name);
- PhysicsMaterialData physicsMaterialData = new PhysicsMaterialData();
- physicsMaterialData.Elasticity = PhysicsMaterial.Elasticity;
- physicsMaterialData.ElasticityFalloff = PhysicsMaterial.ElasticityFalloff;
- physicsMaterialData.Friction = PhysicsMaterial.Friction;
- physicsMaterialData.ScatterAngleRad = PhysicsMaterial.ScatterAngle;
-
- physicsMaterialData.ElasticityOverVelocityLUT = PhysicsMaterial.ElasticityOverVelocityLUT;
- physicsMaterialData.UseElasticityOverVelocity = PhysicsMaterial.UseElasticictyOverVelocity;
-
+ if (!PhysicsOverwrite && PhysicsMaterial != null) {
+ var physicsMaterialData = new PhysicsMaterialData {
+ Elasticity = PhysicsMaterial.Elasticity,
+ ElasticityFalloff = PhysicsMaterial.ElasticityFalloff,
+ Friction = PhysicsMaterial.Friction,
+ ScatterAngleRad = PhysicsMaterial.ScatterAngle
+ };
return physicsMaterialData;
}
+
return new PhysicsMaterialData {
- Elasticity = elasticity,
- ElasticityFalloff = elasticityFalloff,
- Friction = friction,
- ScatterAngleRad = math.radians(scatterAngleDeg)
+ Elasticity = PhysicsElasticity,
+ ElasticityFalloff = PhysicsElasticityFalloff,
+ Friction = PhysicsFriction,
+ ScatterAngleRad = math.radians(PhysicsScatter)
};
}
+ internal PhysicsMaterialData GetPhysicsMaterialData(
+ ref NativeParallelHashMap> elasticityOverVelocityLUTs,
+ ref NativeParallelHashMap> frictionOverVelocityLUTs)
+ {
+ var materialData = GetPhysicsMaterialData();
+ if (!PhysicsOverwrite && PhysicsMaterial != null) {
+ if (PhysicsMaterial.UseElasticityOverVelocity) {
+ if (!elasticityOverVelocityLUTs.ContainsKey(gameObject.GetInstanceID())) {
+ elasticityOverVelocityLUTs.Add(gameObject.GetInstanceID(), PhysicsMaterial.GetElasticityOverVelocityLUT());
+ }
+ materialData.UseElasticityOverVelocity = true;
+ }
+ if (PhysicsMaterial.UseFrictionOverVelocity) {
+ if (!frictionOverVelocityLUTs.ContainsKey(gameObject.GetInstanceID())) {
+ frictionOverVelocityLUTs.Add(gameObject.GetInstanceID(), PhysicsMaterial.GetFrictionOverVelocityLUT());
+ }
+ materialData.UseFrictionOverVelocity = true;
+ }
+ }
+
+ return materialData;
+ }
+
#region Kinematics
[Tooltip("If set, transforming this object during gameplay will transform the colliders as well.")]
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/DropTargetBank/DropTargetBankApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/DropTargetBank/DropTargetBankApi.cs
index 498b264db..e19db085c 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/DropTargetBank/DropTargetBankApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/DropTargetBank/DropTargetBankApi.cs
@@ -62,19 +62,16 @@ internal DropTargetBankApi(GameObject go, Player player, PhysicsEngine physicsEn
_dropTargetBankComponent = go.GetComponentInChildren();
_player = player;
_physicsEngine = physicsEngine;
+ SequenceCompletedSwitch = new DeviceSwitch(DropTargetBankComponent.SequenceCompletedSwitchItem, false, SwitchDefault.NormallyOpen, _player, _physicsEngine);
+ ResetCoil = new DeviceCoil(_player, OnResetCoilEnabled);
}
void IApi.OnInit(BallManager ballManager)
{
- SequenceCompletedSwitch = new DeviceSwitch(DropTargetBankComponent.SequenceCompletedSwitchItem, false, SwitchDefault.NormallyOpen, _player, _physicsEngine);
- ResetCoil = new DeviceCoil(_player, OnResetCoilEnabled);
-
for (var index = 0; index < _dropTargetBankComponent.BankSize; index++) {
var dropTargetApi = _player.TableApi.DropTarget(_dropTargetBankComponent.DropTargets[index]);
dropTargetApi.Switch += OnSwitch;
-
_dropTargetApis.Add(dropTargetApi);
-
}
Init?.Invoke(this, EventArgs.Empty);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/EventArgs.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/EventArgs.cs
index 41c14ea55..db5f9c759 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/EventArgs.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/EventArgs.cs
@@ -14,9 +14,10 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+using System;
+
namespace VisualPinball.Unity
{
-
///
/// Event data when the game item either reaches resting or end
/// position.
@@ -39,6 +40,7 @@ public HitEventArgs(int ballId)
}
}
+
public readonly struct SwitchEventArgs
{
public readonly bool IsEnabled;
@@ -50,4 +52,14 @@ public SwitchEventArgs(bool isEnabled, int ballId = 0)
BallId = ballId;
}
}
+
+ public class NoIdCoilEventArgs : EventArgs
+ {
+ public readonly bool IsEnergized;
+
+ public NoIdCoilEventArgs(bool isEnergized)
+ {
+ IsEnergized = isEnergized;
+ }
+ }
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperApi.cs
index d7313ee28..cacd5d335 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperApi.cs
@@ -15,7 +15,6 @@
// along with this program. If not, see .
// ReSharper disable EventNeverSubscribedTo.Global
-#pragma warning disable 67
using System;
using Unity.Mathematics;
@@ -35,7 +34,6 @@ public class FlipperApi : CollidableApi
public event EventHandler Init;
-
///
/// Event emitted when the flipper was touched by the ball, but did
/// not collide.
@@ -72,15 +70,14 @@ public class FlipperApi : CollidableApi Header.Id = value;
}
- public bool IsFullyTransformable => false;
-
public ColliderHeader Header;
public float3 Position;
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs
index 9d044290d..f49bfed86 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperColliderComponent.cs
@@ -76,7 +76,15 @@ public class FlipperColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => true;
+
+ #endregion
#region FlipperTricks
///
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs
index 6dac0a04e..e4cfbb727 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperComponent.cs
@@ -23,8 +23,8 @@
using System;
using System.Collections.Generic;
+using Unity.Collections;
using Unity.Mathematics;
-using UnityEditor;
using UnityEngine;
using VisualPinball.Engine.Game.Engines;
using VisualPinball.Engine.Math;
@@ -318,7 +318,7 @@ public override void CopyFromObject(GameObject go)
#region Editor Tooling
- #if UNITY_EDITOR
+#if UNITY_EDITOR
protected void OnDrawGizmosSelected()
{
@@ -327,9 +327,9 @@ protected void OnDrawGizmosSelected()
if (poly == null) {
return;
}
-
+
Gizmos.matrix = Matrix4x4.identity;
- Handles.matrix = Matrix4x4.identity;
+ UnityEditor.Handles.matrix = Matrix4x4.identity;
// Draw enclosing polygon
Gizmos.color = Color.cyan;
@@ -357,8 +357,8 @@ protected void OnDrawGizmosSelected()
if (start == end) {
return;
}
- var last = IsLeft ? arrow[0] : arrow[arrow.Count-1];
- var tmpA = IsLeft ? start + 90F + 3F : end +90F - 3F;
+ var last = IsLeft ? arrow[0] : arrow[arrow.Count - 1];
+ var tmpA = IsLeft ? start + 90F + 3F : end + 90F - 3F;
var a = Quaternion.Euler(0, 0, tmpA) * new Vector3(0, -FlipperRadiusMax + 15F, height);
var b = Quaternion.Euler(0, 0, tmpA) * new Vector3(0F, -FlipperRadiusMax + 25F, height);
Gizmos.DrawLine(transform.TransformPoint(last.TranslateToWorld()), transform.TransformPoint(a.TranslateToWorld()));
@@ -366,7 +366,7 @@ protected void OnDrawGizmosSelected()
Gizmos.color = Color.white;
}
- #endif
+#endif
#endregion
@@ -496,8 +496,7 @@ internal FlipperState CreateState()
internal FlipperTricksData GetFlipperTricksData(FlipperColliderComponent colliderComponent, FlipperStaticData staticData)
{
- return new FlipperTricksData
- {
+ return new FlipperTricksData {
UseFlipperTricksPhysics = colliderComponent.useFlipperTricksPhysics,
SOSRampUp = colliderComponent.SOSRampUp,
SOSEM = colliderComponent.SOSEM,
@@ -520,8 +519,8 @@ internal FlipperTricksData GetFlipperTricksData(FlipperColliderComponent collide
LiveCatchInaccurateBounceSpeedMultiplier = colliderComponent.LiveCatchInaccurateBounceSpeedMultiplier,
LiveCatchMinimalBounceSpeedMultiplier = colliderComponent.LiveCatchMinmalBounceSpeedMultiplier,
- //initialize
- OriginalAngleEnd = staticData.AngleEnd,
+ //initialize
+ OriginalAngleEnd = staticData.AngleEnd,
OriginalRampUpSpeed = staticData.RampUpSpeed,
OriginalTorqueDamping = staticData.TorqueDamping,
OriginalTorqueDampingAngle = staticData.TorqueDampingAngle
@@ -550,7 +549,7 @@ internal FlipperStaticData GetStaticData(FlipperColliderComponent colliderCompon
}
// model inertia of flipper as that of rod of length flipper around its end
- var inertia = (float) (1.0 / 3.0) * colliderComponent.Mass * (flipperRadius * flipperRadius);
+ var inertia = (float)(1.0 / 3.0) * colliderComponent.Mass * (flipperRadius * flipperRadius);
return new FlipperStaticData {
Inertia = inertia,
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs
index a827579d5..fd103a97c 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateCollider.cs
@@ -39,8 +39,6 @@ public int Id
}
}
- public bool IsFullyTransformable => false;
-
public ColliderHeader Header;
public LineCollider LineSeg0;
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateColliderComponent.cs
index 69fa828ab..2e2b72409 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateColliderComponent.cs
@@ -64,6 +64,16 @@ public class GateColliderComponent : ColliderComponent,
#endregion
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => 1;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => 0;
+ protected override bool PhysicsOverwrite => true;
+
+ #endregion
+
#region IGateColliderData
public float AngleMin { get => _angleMin; set => _angleMin = value; }
@@ -73,8 +83,6 @@ public class GateColliderComponent : ColliderComponent,
#endregion
- public override PhysicsMaterialData PhysicsMaterialData => GetPhysicsMaterialData(Elasticity, friction: Friction);
-
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.GateApi ?? new GateApi(gameObject, player, physicsEngine);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateLifterApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateLifterApi.cs
index 3a25993eb..6823c0573 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateLifterApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateLifterApi.cs
@@ -43,11 +43,11 @@ internal GateLifterApi(GameObject go, Player player, PhysicsEngine physicsEngine
_gateLifterComponent = go.GetComponent();
_player = player;
_physicsEngine = physicsEngine;
+ LifterCoil = new DeviceCoil(_player, OnLifterCoilEnabled, OnLifterCoilDisabled);
}
void IApi.OnInit(BallManager ballManager)
{
- LifterCoil = new DeviceCoil(_player, OnLifterCoilEnabled, OnLifterCoilDisabled);
_gateApi = _player.TableApi.Gate(_gateComponent);
Init?.Invoke(this, EventArgs.Empty);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderComponent.cs
index c0a22d8c6..88c44eddb 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderComponent.cs
@@ -59,7 +59,15 @@ public class DropTargetColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter, OverwritePhysics);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => OverwritePhysics;
+
+ #endregion
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> (MainComponent as DropTargetComponent)?.DropTargetApi ?? new DropTargetApi(gameObject, player, physicsEngine);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/HitTargetColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/HitTargetColliderComponent.cs
index ab07aa57d..6aafb9a23 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/HitTargetColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/HitTargetColliderComponent.cs
@@ -56,7 +56,15 @@ public class HitTargetColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter, OverwritePhysics);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => OverwritePhysics;
+
+ #endregion
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> (MainComponent as HitTargetComponent)?.HitTargetApi ?? new HitTargetApi(gameObject, player, physicsEngine);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetCollider.cs
index 4b92c7c00..f533dd31b 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetCollider.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetCollider.cs
@@ -23,14 +23,14 @@ internal static class TargetCollider
{
public static void DropTargetCollide(ref BallState ball, ref NativeQueue.ParallelWriter hitEvents,
ref DropTargetAnimationState animation, in float3 normal, in CollisionEventData collEvent,
- in ColliderHeader collHeader, ref Random random)
+ in ColliderHeader collHeader, ref PhysicsState state)
{
if (animation.IsDropped) {
return;
}
var dot = -math.dot(collEvent.HitNormal, ball.Velocity);
- BallCollider.Collide3DWall(ref ball, in collHeader.Material, in collEvent, in normal, ref random);
+ BallCollider.Collide3DWall(ref ball, in collHeader.Material, in collEvent, in normal, ref state);
if (collHeader.FireEvents && dot >= collHeader.Threshold && !animation.IsDropped) {
animation.HitEvent = true;
@@ -41,10 +41,10 @@ public static void DropTargetCollide(ref BallState ball, ref NativeQueue.ParallelWriter hitEvents,
ref HitTargetAnimationData animationData, in float3 normal, in CollisionEventData collEvent,
- in ColliderHeader collHeader, ref Random random)
+ in ColliderHeader collHeader, ref PhysicsState state)
{
var dot = -math.dot(collEvent.HitNormal, ball.Velocity);
- BallCollider.Collide3DWall(ref ball, in collHeader.Material, in collEvent, in normal, ref random);
+ BallCollider.Collide3DWall(ref ball, in collHeader.Material, in collEvent, in normal, ref state);
if (collHeader.FireEvents && dot >= collHeader.Threshold) {
animationData.HitEvent = true;
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetComponent.cs
index 27b3ff281..5a6e089bc 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/TargetComponent.cs
@@ -117,12 +117,12 @@ public override IEnumerable SetData(HitTargetData data)
Size = data.Size.ToUnityVector3();
_targetType = data.TargetType;
- #if UNITY_EDITOR
+#if UNITY_EDITOR
var mf = GetComponent();
if (mf) {
_meshName = Path.GetFileNameWithoutExtension(AssetDatabase.GetAssetPath(mf.sharedMesh));
}
- #endif
+#endif
return updatedComponents;
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs
index 3a9a10a1a..0139aec62 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs
@@ -220,6 +220,7 @@ public interface IApiCoil : IApiWireDest
///
/// Whether the coil was enabled (power) or disabled (no power).
void OnCoil(bool enabled);
+ event EventHandler CoilStatusChanged;
}
///
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Kicker/KickerColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Kicker/KickerColliderComponent.cs
index e1cb12cdc..644f7e888 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Kicker/KickerColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Kicker/KickerColliderComponent.cs
@@ -49,12 +49,21 @@ public class KickerColliderComponent : ColliderComponent 1;
+ protected override float PhysicsElasticityFalloff => 1;
+ protected override float PhysicsFriction => 0;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => true;
+
+ #endregion
+
private void Awake()
{
PhysicsEngine = GetComponentInParent();
}
- public override PhysicsMaterialData PhysicsMaterialData => GetPhysicsMaterialData(scatterAngleDeg: Scatter);
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine) =>
MainComponent.KickerApi ?? new KickerApi(gameObject, player, physicsEngine);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorApi.cs
index dceb394d8..1d3a4e678 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorApi.cs
@@ -43,8 +43,8 @@ public IApiSwitch Switch(string deviceItem)
ScoreMotorComponent.MotorRunningSwitchItem => _motorRunningSwitch,
ScoreMotorComponent.MotorStepSwitchItem => _motorStepSwitch,
_ => throw new ArgumentException($"Unknown switch \"{deviceItem}\". "
- + "Valid names are \"{ScoreReelDisplayComponent.MotorRunningSwitchItem}\", and "
- + "\"{ScoreReelDisplayComponent.MotorStepSwitchItem}\".")
+ + $"Valid names are \"{ScoreMotorComponent.MotorRunningSwitchItem}\", and "
+ + $"\"{ScoreMotorComponent.MotorStepSwitchItem}\".")
};
}
@@ -53,21 +53,23 @@ internal ScoreMotorApi(GameObject go, Player player, PhysicsEngine physicsEngine
_scoreMotorComponent = go.GetComponentInChildren();
_player = player;
_physicsEngine = physicsEngine;
+ _motorRunningSwitch = new DeviceSwitch(ScoreMotorComponent.MotorRunningSwitchItem, false, SwitchDefault.NormallyOpen, _player, _physicsEngine);
+ _motorStepSwitch = new DeviceSwitch(ScoreMotorComponent.MotorStepSwitchItem, true, SwitchDefault.NormallyOpen, _player, _physicsEngine);
_scoreMotorComponent.OnSwitchChanged += HandleSwitchChanged;
}
- void IApi.OnInit(BallManager ballManager)
- {
- _motorRunningSwitch = new DeviceSwitch(ScoreMotorComponent.MotorRunningSwitchItem, false, SwitchDefault.NormallyOpen, _player, _physicsEngine);
- _motorStepSwitch = new DeviceSwitch(ScoreMotorComponent.MotorStepSwitchItem, true, SwitchDefault.NormallyOpen, _player, _physicsEngine);
+ #region Events
+ void IApi.OnInit(BallManager ballManager)
+ {
Init?.Invoke(this, EventArgs.Empty);
}
private void HandleSwitchChanged(object sender, SwitchEventArgs2 e)
{
- ((DeviceSwitch)Switch(e.Id)).SetSwitch(e.IsEnabled);
+ var deviceSwitch = (DeviceSwitch)Switch(e.Id);
+ deviceSwitch.SetSwitch(e.IsEnabled);
}
void IApi.OnDestroy()
@@ -76,5 +78,7 @@ void IApi.OnDestroy()
Logger.Info($"Destroying {_scoreMotorComponent.name}");
}
+
+ #endregion
}
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorComponent.cs
index 9cf911f60..4b678927b 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/ScoreMotorComponent.cs
@@ -21,7 +21,6 @@
using NLog;
using UnityEngine;
using VisualPinball.Engine.Game.Engines;
-using VisualPinball.Engine.VPT.Gate;
using Logger = NLog.Logger;
namespace VisualPinball.Unity
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/StepRotatorMechApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/StepRotatorMechApi.cs
index 473576ca7..0017d3590 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/StepRotatorMechApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/StepRotatorMechApi.cs
@@ -52,6 +52,13 @@ internal StepRotatorMechApi(GameObject go, Player player, PhysicsEngine physicsE
_component = go.GetComponentInChildren();
_player = player;
_physicsEngine = physicsEngine;
+ _motorCoil = new DeviceCoil(_player, OnMotorCoilEnabled, OnMotorCoilDisabled);
+ _switches = _component.Marks.ToDictionary(m => m.SwitchId, m => new DeviceSwitch(m.SwitchId, false, SwitchDefault.NormallyOpen, _player, _physicsEngine));
+ var i = 0;
+ foreach (var sw in _switches.Values) {
+ sw.SetSwitch(i == 0);
+ i++;
+ }
}
void IApi.OnInit(BallManager ballManager)
@@ -60,15 +67,7 @@ void IApi.OnInit(BallManager ballManager)
_currentStep = 0;
_direction = Direction.Forward;
- _motorCoil = new DeviceCoil(_player, OnMotorCoilEnabled, OnMotorCoilDisabled);
-
_marks = _component.Marks.ToDictionary(m => m.SwitchId, m => m);
- _switches = _component.Marks.ToDictionary(m => m.SwitchId, m => new DeviceSwitch(m.SwitchId, false, SwitchDefault.NormallyOpen, _player, _physicsEngine));
- var i = 0;
- foreach (var sw in _switches.Values) {
- sw.SetSwitch(i == 0);
- i++;
- }
Init?.Invoke(this, EventArgs.Empty);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/MetalWireGuide/MetalWireGuideColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/MetalWireGuide/MetalWireGuideColliderComponent.cs
index d1cce7147..b696eac34 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/MetalWireGuide/MetalWireGuideColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/MetalWireGuide/MetalWireGuideColliderComponent.cs
@@ -53,7 +53,16 @@ public class MetalWireGuideColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter, OverwritePhysics);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => OverwritePhysics;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.MetalWireGuideApi ?? new MetalWireGuideApi(gameObject, player, physicsEngine);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/PhysicsMaterialAsset.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/PhysicsMaterialAsset.cs
index 2b28322b1..8b1c7ca3d 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/PhysicsMaterialAsset.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/PhysicsMaterialAsset.cs
@@ -16,9 +16,10 @@
// ReSharper disable InconsistentNaming
-using UnityEngine;
-using UnityEditor;
+using System;
using Unity.Collections;
+using UnityEngine;
+using UnityEngine.Serialization;
namespace VisualPinball.Unity
{
@@ -36,45 +37,47 @@ public class PhysicsMaterialAsset : ScriptableObject
public float Elasticity;
public float ElasticityFalloff;
+
+ public bool UseElasticityOverVelocity => ElasticityOverVelocity.keys.Length > 0;
public AnimationCurve ElasticityOverVelocity;
- public bool UseElasticictyOverVelocity;
- public FixedList512Bytes ElasticityOverVelocityLUT;
+
public float Friction;
+
+ public bool UseFrictionOverVelocity => FrictionOverVelocity.keys.Length > 0;
public AnimationCurve FrictionOverVelocity;
- public bool UseFrictionOverVelocity;
- public FixedList512Bytes FrictionOverVelocityLUT;
+
// public AnimationCurve FrictionOverAngularMomentum;
public float ScatterAngle;
- void OnValidate()
+ ///
+ /// Returns a lookup-table of 128 values.
+ ///
+ /// The range goes from 0 to 64 velocity units, meaning an entry covers 0.5 units.
+ ///
+ /// Lookup table
+ ///
+ public FixedList512Bytes GetElasticityOverVelocityLUT()
{
- ElasticityOverVelocityLUT.Clear();
- if (ElasticityOverVelocity.keys.Length > 0)
- {
- for (int i = 0; i < 100; i++)
- {
- ElasticityOverVelocityLUT.Add(ElasticityOverVelocity.Evaluate(i));
- }
- UseElasticictyOverVelocity = true;
+ var lut = new FixedList512Bytes();
+ if (ElasticityOverVelocity.keys.Length == 0) {
+ throw new InvalidOperationException("Curve ElasticityOverVelocity is empty.");
}
- else
- UseElasticictyOverVelocity = false;
-
- FrictionOverVelocityLUT.Clear();
- if (FrictionOverVelocity.keys.Length > 0)
- {
- for (int i = 0; i < 100; i++)
- {
- FrictionOverVelocityLUT.Add(ElasticityOverVelocity.Evaluate(i));
- }
- UseFrictionOverVelocity = true;
+ for (var i = 0; i < 127; i++) {
+ lut.Add(ElasticityOverVelocity.Evaluate(i / 2f));
}
- else
- UseFrictionOverVelocity = false;
-
+ return lut;
}
-
-
+ public FixedList512Bytes GetFrictionOverVelocityLUT()
+ {
+ var lut = new FixedList512Bytes();
+ if (FrictionOverVelocity.keys.Length == 0) {
+ throw new InvalidOperationException("Curve ElasticityOverVelocity is empty.");
+ }
+ for (var i = 0; i < 127; i++) {
+ lut.Add(FrictionOverVelocity.Evaluate(i));
+ }
+ return lut;
+ }
}
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Playfield/PlayfieldColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Playfield/PlayfieldColliderComponent.cs
index 6995c8d53..0e09e3247 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Playfield/PlayfieldColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Playfield/PlayfieldColliderComponent.cs
@@ -52,9 +52,18 @@ public class PlayfieldColliderComponent : ColliderComponent Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => true;
+
+ #endregion
+
[NonSerialized] public bool ShowAllColliderMeshes = false;
- public override PhysicsMaterialData PhysicsMaterialData => GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter);
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.PlayfieldApi ?? new PlayfieldApi(gameObject, player, physicsEngine);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs
index edcd05e21..6722ac319 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs
@@ -62,6 +62,8 @@ public class PlungerApi : CollidableApi.
+using System;
using Unity.Mathematics;
-using UnityEngine;
using VisualPinball.Engine.Common;
using VisualPinball.Engine.VPT.Plunger;
using Random = Unity.Mathematics.Random;
@@ -32,6 +32,7 @@ namespace VisualPinball.Unity
internal struct PlungerCollider : ICollider
{
public int Id
+
{
get => Header.Id;
set {
@@ -42,16 +43,19 @@ public int Id
}
}
- public bool IsFullyTransformable => false;
-
public ColliderHeader Header;
public LineCollider LineSegBase;
public LineZCollider JointBase0;
public LineZCollider JointBase1;
- private readonly float2 _size;
- private readonly float _stroke;
+ public LineCollider LineSegSide0;
+ public LineCollider LineSegSide1;
+ public LineCollider LineSegEnd;
+ public LineZCollider JointEnd0;
+ public LineZCollider JointEnd1;
+
+ public float PosY;
public ColliderBounds Bounds { get; private set; }
@@ -64,14 +68,25 @@ public PlungerCollider(PlungerComponent comp, PlungerColliderComponent collComp,
var x2 = comp.Width;
var y = comp.Height;
- _size = new float2(comp.Width, comp.Height);
- _stroke = collComp.Stroke;
+ var frameTop = -collComp.Stroke;
+ var frameBottom = 0;
+ var frameLen = frameBottom - frameTop;
+ var restPos = collComp.ParkPosition;
+ var position = frameTop + restPos * frameLen;
// static
LineSegBase = new LineCollider(new float2(x, y), new float2(x2, y), zHeight, zHeight + Plunger.PlungerHeight, info);
JointBase0 = new LineZCollider(new float2(x, y), zHeight, zHeight + Plunger.PlungerHeight, info);
JointBase1 = new LineZCollider(new float2(x2, y), zHeight, zHeight + Plunger.PlungerHeight, info);
+ // dynamic
+ LineSegSide0 = new LineCollider(new float2(x + 0.0001f, position), new float2(x, y), zHeight, zHeight + Plunger.PlungerHeight, info);
+ LineSegSide1 = new LineCollider(new float2(x2, y), new float2(x2 + 0.0001f, position), zHeight, zHeight + Plunger.PlungerHeight, info);
+ LineSegEnd = new LineCollider(new float2(x2, position), new float2(x, position), zHeight, zHeight + Plunger.PlungerHeight, info);
+ JointEnd0 = new LineZCollider(new float2(x, position), zHeight, zHeight + Plunger.PlungerHeight, info);
+ JointEnd1 = new LineZCollider(new float2(x2, position), zHeight, zHeight + Plunger.PlungerHeight, info);
+
+ PosY = 0;
Bounds = new ColliderBounds(Header.ItemId, Header.Id, new Aabb(
new float3(-comp.Width - 10, comp.Height, 0),
new float3(comp.Width + 10, -100, 50)
@@ -105,7 +120,7 @@ private void Transform(PlungerCollider collider, float4x4 matrix)
{
#if UNITY_EDITOR
if (!IsTransformable(matrix)) {
- throw new System.InvalidOperationException($"Matrix {matrix} cannot transform plunger.");
+ throw new InvalidOperationException($"Matrix {matrix} cannot transform plunger.");
}
#endif
@@ -114,6 +129,14 @@ private void Transform(PlungerCollider collider, float4x4 matrix)
LineSegBase = collider.LineSegBase.Transform(matrix);
JointBase0 = collider.JointBase0.Transform(matrix);
JointBase1 = collider.JointBase1.Transform(matrix);
+
+ LineSegSide0 = collider.LineSegSide0.Transform(matrix);
+ LineSegSide1 = collider.LineSegSide1.Transform(matrix);
+ LineSegEnd = collider.LineSegEnd.Transform(matrix);
+ JointEnd0 = collider.JointEnd0.Transform(matrix);
+ JointEnd1 = collider.JointEnd1.Transform(matrix);
+
+ PosY = matrix.GetTranslation().y;
}
public Aabb GetTransformedAabb(float4x4 matrix)
@@ -132,7 +155,7 @@ public PlungerCollider TransformAabb(float4x4 matrix)
#region Narrowphase
public float HitTest(ref CollisionEventData collEvent, ref InsideOfs insideOfs,
- ref PlungerMovementState movement, in PlungerColliderState colliderState, in PlungerStaticState staticState, in BallState ball, float dTime)
+ ref PlungerMovementState movement, in PlungerStaticState staticState, in BallState ball, float dTime)
{
var hitTime = dTime; //start time
var isHit = false;
@@ -152,13 +175,13 @@ public float HitTest(ref CollisionEventData collEvent, ref InsideOfs insideOfs,
var newTime = LineSegBase.HitTest(ref newCollEvent, ref insideOfs, in ball, dTime);
UpdateCollision(ref collEvent, ref newCollEvent, ref isHit, ref hitTime, in newTime);
- newTime = LineCollider.HitTest(ref newCollEvent, ref insideOfs, in colliderState.LineSegSide0, in ball, hitTime);
+ newTime = LineCollider.HitTest(ref newCollEvent, ref insideOfs, in LineSegSide0, in ball, hitTime);
UpdateCollision(ref collEvent, ref newCollEvent, ref isHit, ref hitTime, in newTime);
newTime = JointBase0.HitTest(ref newCollEvent, in ball, hitTime);
UpdateCollision(ref collEvent, ref newCollEvent, ref isHit, ref hitTime, in newTime);
- newTime = LineCollider.HitTest(ref newCollEvent, ref insideOfs, in colliderState.LineSegSide1, in ball, hitTime);
+ newTime = LineCollider.HitTest(ref newCollEvent, ref insideOfs, in LineSegSide1, in ball, hitTime);
UpdateCollision(ref collEvent, ref newCollEvent, ref isHit, ref hitTime, in newTime);
newTime = JointBase1.HitTest(ref newCollEvent, in ball, hitTime);
@@ -207,13 +230,13 @@ public float HitTest(ref CollisionEventData collEvent, ref InsideOfs insideOfs,
var deltaY = movement.Speed * xferRatio;
// check the moving bits
- newTime = LineCollider.HitTest(ref newCollEvent, ref insideOfs, in colliderState.LineSegEnd, in ballTmp, hitTime);
+ newTime = LineCollider.HitTest(ref newCollEvent, ref insideOfs, in LineSegEnd, in ballTmp, hitTime);
UpdateCollision(ref collEvent, ref newCollEvent, ref isHit, ref hitTime, in newTime, deltaY);
- newTime = LineZCollider.HitTest(ref newCollEvent, in colliderState.JointEnd0, in ballTmp, hitTime);
+ newTime = LineZCollider.HitTest(ref newCollEvent, in JointEnd0, in ballTmp, hitTime);
UpdateCollision(ref collEvent, ref newCollEvent, ref isHit, ref hitTime, in newTime, deltaY);
- newTime = LineZCollider.HitTest(ref newCollEvent, in colliderState.JointEnd1, in ballTmp, hitTime);
+ newTime = LineZCollider.HitTest(ref newCollEvent, in JointEnd1, in ballTmp, hitTime);
UpdateCollision(ref collEvent, ref newCollEvent, ref isHit, ref hitTime, in newTime, deltaY);
// check only if the plunger is not in a controlled retract motion
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerColliderComponent.cs
index b1d8ae794..deb14a055 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerColliderComponent.cs
@@ -16,7 +16,6 @@
// ReSharper disable InconsistentNaming
-using Unity.Mathematics;
using UnityEngine;
using VisualPinball.Engine.VPT.Plunger;
@@ -55,7 +54,16 @@ public class PlungerColliderComponent : ColliderComponent GetPhysicsMaterialData();
+ #region Physics Material
+
+ protected override float PhysicsElasticity => 1;
+ protected override float PhysicsElasticityFalloff => 1;
+ protected override float PhysicsFriction => 0;
+ protected override float PhysicsScatter => 0;
+ protected override bool PhysicsOverwrite => true;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.PlungerApi ?? new PlungerApi(gameObject, player, physicsEngine);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerComponent.cs
index 4b7d05399..8ad3d2939 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerComponent.cs
@@ -61,7 +61,6 @@ public Vector3 Position {
public const string PullCoilId = "c_pull";
public const string FireCoilId = "c_autofire";
-
#endregion
#region Runtime
@@ -256,23 +255,12 @@ internal PlungerState CreateState()
return default;
}
- var zHeight = Position.z;
- var x = -Width;
- var x2 = Width;
- var y = Height;
-
var frameTop = -collComponent.Stroke;
var frameBottom = 0;
var frameLen = frameBottom - frameTop;
var restPos = collComponent.ParkPosition;
var position = frameTop + restPos * frameLen;
- var info = new ColliderInfo {
- ItemId = GetInstanceID(),
- FireEvents = true,
- ItemType = ItemType.Plunger,
- };
-
return new PlungerState(
new PlungerStaticState {
MomentumXfer = collComponent.MomentumXfer,
@@ -286,13 +274,6 @@ internal PlungerState CreateState()
SpeedFire = collComponent.SpeedFire,
NumFrames = (int)(collComponent.Stroke * (float)(PlungerMeshGenerator.PlungerFrameCount / 80.0f)) + 1, // 25 frames per 80 units travel
},
- new PlungerColliderState {
- LineSegSide0 = new LineCollider(new float2(x + 0.0001f, position), new float2(x, y), zHeight, zHeight + Plunger.PlungerHeight, info),
- LineSegSide1 = new LineCollider(new float2(x2, y), new float2(x2 + 0.0001f, position), zHeight, zHeight + Plunger.PlungerHeight, info),
- LineSegEnd = new LineCollider(new float2(x2, position), new float2(x, position), zHeight, zHeight + Plunger.PlungerHeight, info),
- JointEnd0 = new LineZCollider(new float2(x, position), zHeight, zHeight + Plunger.PlungerHeight, info),
- JointEnd1 = new LineZCollider(new float2(x2, position), zHeight, zHeight + Plunger.PlungerHeight, info),
- },
new PlungerMovementState {
FireBounce = 0f,
Position = position,
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerDisplacementPhysics.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerDisplacementPhysics.cs
index 8bd332457..852b3f4f9 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerDisplacementPhysics.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerDisplacementPhysics.cs
@@ -22,9 +22,8 @@ namespace VisualPinball.Unity
{
internal static class PlungerDisplacementPhysics
{
- internal static void UpdateDisplacement(int itemId, ref PlungerMovementState movement,
- ref PlungerColliderState colliderState, in PlungerStaticState staticState, float dTime,
- ref NativeQueue.ParallelWriter events)
+ internal static void UpdateDisplacement(int itemId, ref PlungerMovementState movement, ref PlungerCollider collider,
+ in PlungerStaticState staticState, float dTime, ref NativeQueue.ParallelWriter events)
{
// figure the travel distance
var dx = dTime * movement.Speed;
@@ -96,23 +95,25 @@ internal static void UpdateDisplacement(int itemId, ref PlungerMovementState mov
}
// update the display
- UpdateCollider(movement.Position, ref colliderState);
+ UpdateCollider(movement.Position, ref collider);
}
- private static void UpdateCollider(float len, ref PlungerColliderState colliderState)
+ private static void UpdateCollider(float len, ref PlungerCollider collider)
{
- colliderState.LineSegSide0.V1y = len;
- colliderState.LineSegSide1.V2y = len;
+ var yPos = collider.PosY + len;
- colliderState.LineSegEnd.V2y = len;
- colliderState.LineSegEnd.V1y = len; // + 0.0001f;
+ collider.LineSegSide0.V1y = yPos;
+ collider.LineSegSide1.V2y = yPos;
- colliderState.JointEnd0.XyY = len;
- colliderState.JointEnd1.XyY = len; // + 0.0001f;
+ collider.LineSegEnd.V2y = yPos;
+ collider.LineSegEnd.V1y = yPos; // + 0.0001f;
- colliderState.LineSegSide0.CalcNormal();
- colliderState.LineSegSide1.CalcNormal();
- colliderState.LineSegEnd.CalcNormal();
+ collider.JointEnd0.XyY = yPos;
+ collider.JointEnd1.XyY = yPos; // + 0.0001f;
+
+ collider.LineSegSide0.CalcNormal();
+ collider.LineSegSide1.CalcNormal();
+ collider.LineSegEnd.CalcNormal();
}
}
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerState.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerState.cs
index 2d7a4b008..7b64c6d87 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerState.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerState.cs
@@ -19,15 +19,13 @@ namespace VisualPinball.Unity
internal struct PlungerState
{
internal PlungerStaticState Static;
- internal PlungerColliderState Collider;
internal PlungerMovementState Movement;
internal PlungerVelocityState Velocity;
internal PlungerAnimationState Animation;
- public PlungerState(PlungerStaticState @static, PlungerColliderState collider, PlungerMovementState movement, PlungerVelocityState velocity, PlungerAnimationState animation)
+ public PlungerState(PlungerStaticState @static, PlungerMovementState movement, PlungerVelocityState velocity, PlungerAnimationState animation)
{
Static = @static;
- Collider = collider;
Movement = movement;
Velocity = velocity;
Animation = animation;
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticState.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticState.cs
index 487268844..195bf81f9 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticState.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticState.cs
@@ -18,6 +18,8 @@ namespace VisualPinball.Unity
{
internal struct PlungerStaticState
{
+ public int ColliderId;
+
// collision
public float MomentumXfer;
public float ScatterVelocity;
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Primitive/PrimitiveColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Primitive/PrimitiveColliderComponent.cs
index dba5462c1..8faf23531 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Primitive/PrimitiveColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Primitive/PrimitiveColliderComponent.cs
@@ -59,7 +59,16 @@ public class PrimitiveColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter, OverwritePhysics);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => OverwritePhysics;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=>MainComponent.PrimitiveApi ?? new PrimitiveApi(gameObject, player, physicsEngine);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Ramp/RampColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Ramp/RampColliderComponent.cs
index d652516ff..cded13108 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Ramp/RampColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Ramp/RampColliderComponent.cs
@@ -59,7 +59,16 @@ public class RampColliderComponent : ColliderComponent
#endregion
- public override PhysicsMaterialData PhysicsMaterialData => GetPhysicsMaterialData(Elasticity, friction: Friction, scatterAngleDeg: Scatter, overwrite: OverwritePhysics);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => 1;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => OverwritePhysics;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.RampApi ?? new RampApi(gameObject, player, physicsEngine);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Rubber/RubberColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Rubber/RubberColliderComponent.cs
index ba5d54559..4d474bdc3 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Rubber/RubberColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Rubber/RubberColliderComponent.cs
@@ -54,7 +54,16 @@ public class RubberColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter, OverwritePhysics);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => OverwritePhysics;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.RubberApi ?? new RubberApi(gameObject, player, physicsEngine);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs
index a55d8827a..979e3ea63 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerCollider.cs
@@ -39,8 +39,6 @@ public int Id
}
}
- public bool IsFullyTransformable => false;
-
public ColliderHeader Header;
public LineCollider LineSeg0;
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerColliderComponent.cs
index a54b2b669..c0d22127d 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerColliderComponent.cs
@@ -36,7 +36,16 @@ public class SpinnerColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => 1;
+ protected override float PhysicsFriction => 0;
+ protected override float PhysicsScatter => 0;
+ protected override bool PhysicsOverwrite => true;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.SpinnerApi ?? new SpinnerApi(gameObject, player, physicsEngine);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceColliderComponent.cs
index 3c97bc593..eefb5c983 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceColliderComponent.cs
@@ -66,7 +66,16 @@ public class SurfaceColliderComponent : ColliderComponent GetPhysicsMaterialData(Elasticity, ElasticityFalloff, Friction, Scatter, OverwritePhysics);
+ #region Physics Material
+
+ protected override float PhysicsElasticity => Elasticity;
+ protected override float PhysicsElasticityFalloff => ElasticityFalloff;
+ protected override float PhysicsFriction => Friction;
+ protected override float PhysicsScatter => Scatter;
+ protected override bool PhysicsOverwrite => OverwritePhysics;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.SurfaceApi ?? new SurfaceApi(gameObject, player, physicsEngine);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Teleporter/TeleporterApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Teleporter/TeleporterApi.cs
index 288927336..962fde19b 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Teleporter/TeleporterApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Teleporter/TeleporterApi.cs
@@ -43,11 +43,11 @@ internal TeleporterApi(GameObject go, Player player, PhysicsEngine physicsEngine
_component = go.GetComponentInChildren();
_player = player;
_physicsEngine = physicsEngine;
+ _teleporterCoil = new DeviceCoil(_player, OnTeleport);
}
void IApi.OnInit(BallManager ballManager)
{
- _teleporterCoil = new DeviceCoil(_player, OnTeleport);
_fromKicker = _player.TableApi.Kicker(_component.FromKicker);
_toKicker = _player.TableApi.Kicker(_component.ToKicker);
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerApi.cs
index b30d8e6d6..b9f30913d 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerApi.cs
@@ -91,7 +91,6 @@ void IApiHittable.OnHit(int ballId, bool isUnHit)
UnHit?.Invoke(this, new HitEventArgs(ballId));
Switch?.Invoke(this, new SwitchEventArgs(false, ballId));
OnSwitch(false);
-
} else {
Hit?.Invoke(this, new HitEventArgs(ballId));
Switch?.Invoke(this, new SwitchEventArgs(true, ballId));
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerColliderComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerColliderComponent.cs
index 1d78689b8..5b4413a16 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerColliderComponent.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerColliderComponent.cs
@@ -50,7 +50,16 @@ public class TriggerColliderComponent : ColliderComponent GetPhysicsMaterialData();
+ #region Physics Material
+
+ protected override float PhysicsElasticity => 1;
+ protected override float PhysicsElasticityFalloff => 1;
+ protected override float PhysicsFriction => 0;
+ protected override float PhysicsScatter => 0;
+ protected override bool PhysicsOverwrite => true;
+
+ #endregion
+
protected override IApiColliderGenerator InstantiateColliderApi(Player player, PhysicsEngine physicsEngine)
=> MainComponent.TriggerApi ?? new TriggerApi(gameObject, player, physicsEngine);
}
diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughApi.cs
index f2463291c..4b0ed59e9 100644
--- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughApi.cs
+++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughApi.cs
@@ -167,23 +167,7 @@ public class TroughApi : ItemApi,
internal TroughApi(GameObject go, Player player, PhysicsEngine physicsEngine) : base(go, player, physicsEngine)
{
- }
-
- void IApi.OnInit(BallManager ballManager)
- {
- base.OnInit(ballManager);
-
- // reference playfield elements
- _drainSwitch = TableApi.Switch(MainComponent.PlayfieldEntrySwitch, MainComponent.PlayfieldEntrySwitchItem);
- _ejectCoil = TableApi.Coil(MainComponent.PlayfieldExitKicker, MainComponent.PlayfieldExitKickerItem);
- _ejectKicker = TableApi.Kicker(MainComponent.PlayfieldExitKicker);
-
- // setup entry handler
- if (_drainSwitch != null) {
- _drainSwitch.Switch += OnEntry;
- }
-
- // setup switches
+ // set up switches
if (MainComponent.Type != TroughType.ModernOpto && MainComponent.Type != TroughType.ModernMech) {
EntrySwitch = CreateSwitch(TroughComponent.EntrySwitchId, false, SwitchDefault.NormallyOpen);
_switchLookup[TroughComponent.EntrySwitchId] = EntrySwitch;
@@ -222,9 +206,24 @@ void IApi.OnInit(BallManager ballManager)
_switchLookup[TroughComponent.JamSwitchId] = JamSwitch;
}
- // setup coils
+ // set up coils
EntryCoil = new DeviceCoil(Player, OnEntryCoilEnabled);
ExitCoil = new DeviceCoil(Player, () => EjectBall());
+ }
+
+ void IApi.OnInit(BallManager ballManager)
+ {
+ base.OnInit(ballManager);
+
+ // reference playfield elements
+ _drainSwitch = TableApi.Switch(MainComponent.PlayfieldEntrySwitch, MainComponent.PlayfieldEntrySwitchItem);
+ _ejectCoil = TableApi.Coil(MainComponent.PlayfieldExitKicker, MainComponent.PlayfieldExitKickerItem);
+ _ejectKicker = TableApi.Kicker(MainComponent.PlayfieldExitKicker);
+
+ // setup entry handler
+ if (_drainSwitch != null) {
+ _drainSwitch.Switch += OnEntry;
+ }
// fill up the ball stack
var ballCount = MainComponent.Type == TroughType.ClassicSingleBall ? 1 : MainComponent.BallCount;
|