diff --git a/CHANGELOG.md b/CHANGELOG.md index 516a59c06..30b568115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ Built with Unity 2021.2. - Put game-, mesh-, collision- animation data into separate components ([#227](https://github.com/freezy/VisualPinball.Engine/pull/227), [Documentation](https://docs.visualpinball.org/creators-guide/editor/unity-components.html)). ### Fixed +- Ball stuttering when rolling over dropped target ([#375](https://github.com/freezy/VisualPinball.Engine/pull/375)). - Plunger disappearing due to too small bounding box. - Fixed switch status when multiple mappings point to the same ID ([#347](https://github.com/freezy/VisualPinball.Engine/pull/347)). - Lighting setup. It's now usable ([#330](https://github.com/freezy/VisualPinball.Engine/pull/330)). diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticNarrowPhaseSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticNarrowPhaseSystem.cs index 60c6cf866..d5dafba9a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticNarrowPhaseSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticNarrowPhaseSystem.cs @@ -18,6 +18,7 @@ using Unity.Entities; using Unity.Mathematics; using Unity.Profiling; +using VisualPinball.Engine.VPT; namespace VisualPinball.Unity { @@ -79,8 +80,10 @@ protected override void OnUpdate() var end = traversalOrder ? colliderIds.Length : -1; var dt = traversalOrder ? 1 : -1; + for (var i = start; i != end; i += dt) { ref var coll = ref colliders[colliderIds[i].Value].Value; + var saveCollision = true; var newCollEvent = new CollisionEventData(); float newTime = 0; @@ -125,15 +128,41 @@ protected override void OnUpdate() SetComponent(coll.Entity, plungerMovementData); } break; + case ColliderType.Line: + case ColliderType.Line3D: + case ColliderType.Circle: + case ColliderType.LineZ: + case ColliderType.Plane: + case ColliderType.Point: + case ColliderType.Triangle: + // hit target + if (coll.Header.ItemType == ItemType.HitTarget) { + if (HasComponent(coll.Entity)) { + var dropTargetAnimationData = GetComponent(coll.Entity); + if (dropTargetAnimationData.IsDropped || dropTargetAnimationData.MoveAnimation) { // QUICKFIX so that DT is not triggered twice + saveCollision = false; + } + else { + newTime = Collider.HitTest(ref coll, ref newCollEvent, ref insideOfs, in ballData, collEvent.HitTime); + } + } + if (HasComponent(coll.Entity)) { + newTime = Collider.HitTest(ref coll, ref newCollEvent, ref insideOfs, in ballData, collEvent.HitTime); + } + } + else + newTime = Collider.HitTest(ref coll, ref newCollEvent, ref insideOfs, in ballData, collEvent.HitTime); + break; default: newTime = Collider.HitTest(ref coll, ref newCollEvent, ref insideOfs, in ballData, collEvent.HitTime); - break; + break; } } } - - SaveCollisions(ref collEvent, ref newCollEvent, ref contacts, in ballEntity, in coll, newTime); + if (saveCollision) { + SaveCollisions(ref collEvent, ref newCollEvent, ref contacts, in ballEntity, in coll, newTime); + } } // no negative time allowed diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderGenerator.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderGenerator.cs index 894a018f3..70e677a31 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderGenerator.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/HitTarget/DropTargetColliderGenerator.cs @@ -31,17 +31,25 @@ public DropTargetColliderGenerator(IApiColliderGenerator api, ITargetData data, internal void GenerateColliders(float playfieldHeight, ICollection colliders) { var localToPlayfield = MeshGenerator.GetTransformationMatrix(); + + // QUICK FIX and TODO for Cupiii + /* hitmesh should not be generated by the Mesh generator. Drop Targets need special Hitshapes, that shoujld be very simple and cannot be activated from behind. var hitMesh = MeshGenerator.GetMesh(); for (var i = 0; i < hitMesh.Vertices.Length; i++) { hitMesh.Vertices[i].MultiplyMatrix(localToPlayfield); } + var addedEdges = EdgeSet.Get(); + GenerateCollidables(hitMesh, addedEdges, Data.IsLegacy, colliders); + */ + var addedEdges = EdgeSet.Get(); var tempMatrix = new Matrix3D().RotateZMatrix(MathF.DegToRad(Data.RotZ)); var fullMatrix = new Matrix3D().Multiply(tempMatrix); - if (!Data.IsLegacy) { + //if (!Data.IsLegacy) // Always generate special hitshapes (QUICKFIX) + { var rgv3D = new Vertex3D[DropTargetHitPlaneVertices.Length]; var hitShapeOffset = 0.18f;