diff --git a/CHANGELOG.md b/CHANGELOG.md index 5188d775e..8bf3b9593 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,11 @@ ## Unreleased -Built with [Unity 2020.2](https://github.com/freezy/VisualPinball.Engine/pull/255). +Built with Unity 2020.3. ### Added +- Remove Hybrid Renderer ([#316](https://github.com/freezy/VisualPinball.Engine/pull/316)). +- Create and use Unity assets when importing ([#320](https://github.com/freezy/VisualPinball.Engine/pull/302)). - Native support for nFozzy flipper physics ([#305](https://github.com/freezy/VisualPinball.Engine/pull/305)). - Automated camera clipping ([#304](https://github.com/freezy/VisualPinball.Engine/pull/304/files)). - DMD and segment display support ([Documentation](https://docs.visualpinball.org/creators-guide/manual/displays.html)). diff --git a/VisualPinball.Engine.Test/Fixtures~/PlungerTest.vpx b/VisualPinball.Engine.Test/Fixtures~/PlungerTest.vpx index 1b237841b..976c79dce 100644 Binary files a/VisualPinball.Engine.Test/Fixtures~/PlungerTest.vpx and b/VisualPinball.Engine.Test/Fixtures~/PlungerTest.vpx differ diff --git a/VisualPinball.Engine/VPT/PbrMaterial.cs b/VisualPinball.Engine/VPT/PbrMaterial.cs index acd4c0ce0..9aba68234 100644 --- a/VisualPinball.Engine/VPT/PbrMaterial.cs +++ b/VisualPinball.Engine/VPT/PbrMaterial.cs @@ -33,8 +33,6 @@ public class PbrMaterial public bool HasNormalMap => NormalMap != null; public BlendMode MapBlendMode => GetBlendMode(); - public readonly bool VertexLerpWithUvEnabled; - public Color Color => _material?.BaseColor.WithAlpha(255) ?? new Color(0xffffffff, ColorFormat.Bgr); public bool IsMetal => _material?.IsMetal ?? false; public bool IsOpacityActive => _material?.IsOpacityActive ?? false; @@ -55,19 +53,17 @@ public class PbrMaterial private readonly Material _material; - public PbrMaterial(Material material = null, Texture map = null, Texture normalMap = null, Texture envMap = null, bool vertexLerp = false, string id = null) + public PbrMaterial(Material material = null, Texture map = null, Texture normalMap = null, Texture envMap = null, string id = null) { _material = material; Map = map; NormalMap = normalMap; EnvMap = envMap; - VertexLerpWithUvEnabled = vertexLerp; Id = id ?? string.Join("-", new[] { _material?.Name.ToNormalizedName() ?? NameNoMaterial, Map?.Name.ToNormalizedName() ?? NameNoMap, NormalMap?.Name.ToNormalizedName() ?? NameNoNormalMap, EnvMap?.Name.ToNormalizedName() ?? NameNoEnvMap, - vertexLerp ? "skinned" : NameNoLerp } .Reverse() .SkipWhile(s => s.StartsWith("__no_")) @@ -127,7 +123,6 @@ public override string ToString() sb.AppendLine($"Map {Map?.ToString() ?? "none"}".Trim()); sb.AppendLine($"MapBlendMode {MapBlendMode}"); sb.AppendLine($"NormalMap {NormalMap?.ToString() ?? "none"}".Trim()); - sb.AppendLine($"Skinned? {VertexLerpWithUvEnabled}"); return sb.ToString(); } diff --git a/VisualPinball.Engine/VPT/Plunger/PlungerMeshGenerator.cs b/VisualPinball.Engine/VPT/Plunger/PlungerMeshGenerator.cs index 43b0c9967..2a7bc8ab5 100644 --- a/VisualPinball.Engine/VPT/Plunger/PlungerMeshGenerator.cs +++ b/VisualPinball.Engine/VPT/Plunger/PlungerMeshGenerator.cs @@ -77,7 +77,7 @@ public RenderObject GetRenderObject(Table.Table table, string id, Origin origin, return new RenderObject( id, asRightHanded ? flatMesh.Transform(Matrix3D.RightHanded) : flatMesh, - new PbrMaterial(id: $"__plunger_flat_{_data.Name}", material: mat, map: tex, vertexLerp: true), + new PbrMaterial(id: $"__plunger_flat_{_data.Name}", material: mat, map: tex), true ); case Rod: @@ -86,7 +86,7 @@ public RenderObject GetRenderObject(Table.Table table, string id, Origin origin, return new RenderObject( id, asRightHanded ? rodMesh.Transform(Matrix3D.RightHanded) : rodMesh, - new PbrMaterial(id: $"__plunger_rod_{_data.Name}", material: mat, map: tex, vertexLerp: true), + new PbrMaterial(id: $"__plunger_rod_{_data.Name}", material: mat, map: tex), true ); case Spring: @@ -95,7 +95,7 @@ public RenderObject GetRenderObject(Table.Table table, string id, Origin origin, return new RenderObject( id, asRightHanded ? springMesh.Transform(Matrix3D.RightHanded) : springMesh, - new PbrMaterial(id: $"__plunger_spring_{_data.Name}", material: mat, map: tex, vertexLerp: true), + new PbrMaterial(id: $"__plunger_spring_{_data.Name}", material: mat, map: tex), true ); default: diff --git a/VisualPinball.Unity/Assets/Resources/Prefabs/DefaultBall.prefab b/VisualPinball.Unity/Assets/Resources/Prefabs/DefaultBall.prefab index f6106a510..b0f27b09b 100644 --- a/VisualPinball.Unity/Assets/Resources/Prefabs/DefaultBall.prefab +++ b/VisualPinball.Unity/Assets/Resources/Prefabs/DefaultBall.prefab @@ -27,7 +27,7 @@ Transform: m_GameObject: {fileID: 8289283333368007096} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.05, y: 0.05, z: 0.05} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 diff --git a/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md b/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md index 4130d082a..47a267ed2 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md @@ -37,12 +37,6 @@ This camera can be moved [using Unity's gizmos](https://docs.unity3d.com/Manual/ > [!TIP] > A quick way to fix the game camera is to align it with the scene view camera. To do that, select the camera in the hierarchy, then click on the *GameObject* menu and select *Align with view*. -One last thing we need to do before playing is enable version 2 of the [Hybrid Renderer](https://docs.unity3d.com/Packages/com.unity.rendering.hybrid@0.10/manual/index.html) we're using. Go to *Edit -> Project Settings*, select *Player* on the left, open the *Other Settings* tab, scroll down a bit on the right and add `ENABLE_HYBRID_RENDERER_V2` under *Script Define Symbols*. - -![Enable hybrid renderer](unity-settings-hybridv2.png) - -Then click on *Apply* and close the window. - Let's start the game by clicking on the play button. This will run your scene. Test that the shift keys move the flippers. `ENTER` will launch a ball. If you expand *Table1* in the hierarchy and select the *Trough*, you can watch its status in the inspector in real time. Cool! You can also right-click on the scene view tab and select *Maximize*. diff --git a/VisualPinball.Unity/Documentation~/creators-guide/setup/unity-settings-hybridv2.png b/VisualPinball.Unity/Documentation~/creators-guide/setup/unity-settings-hybridv2.png deleted file mode 100644 index f46e31c26..000000000 Binary files a/VisualPinball.Unity/Documentation~/creators-guide/setup/unity-settings-hybridv2.png and /dev/null differ diff --git a/VisualPinball.Unity/VisualPinball.Unity.Test/VPT/TroughTests.cs b/VisualPinball.Unity/VisualPinball.Unity.Test/VPT/TroughTests.cs index d5aacbad6..6dbf5bbf4 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Test/VPT/TroughTests.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Test/VPT/TroughTests.cs @@ -26,6 +26,9 @@ namespace VisualPinball.Unity.Test { public class TroughTests { + + #if !WRITE_VP106 && !WRITE_VP107 + [Test] public void ShouldWriteImportedTroughData() { @@ -40,5 +43,7 @@ public void ShouldWriteImportedTroughData() File.Delete(tmpFileName); Object.DestroyImmediate(go); } + + #endif } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Extensions/MeshExtensions.cs b/VisualPinball.Unity/VisualPinball.Unity/Extensions/MeshExtensions.cs index 051a08ba6..f9d5f802d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Extensions/MeshExtensions.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Extensions/MeshExtensions.cs @@ -108,24 +108,7 @@ public static void ApplyToUnityMesh(this Mesh vpMesh, UnityEngine.Mesh mesh) mesh.triangles = vpMesh.Indices; // animation - if (vpMesh.AnimationFrames.Count == 1) { - - // if there's only one frame, we assume a linear interpolation and just - // add it in form of UV sets. we then have a shader that interpolates - // the mesh. - - var deltaVertices = new Vector3[vpMesh.Vertices.Length]; - var deltaNormals = new Vector3[vpMesh.Vertices.Length]; - - var blendVertices = vpMesh.AnimationFrames[0]; - for (var i = 0; i < vpMesh.Vertices.Length; i++) { - deltaVertices[i] = blendVertices[i].ToUnityVector3() - vertices[i]; - deltaNormals[i] = blendVertices[i].ToUnityNormalVector3() - normals[i]; - } - mesh.SetUVs(Mesh.AnimationUVChannelVertices, deltaVertices); - mesh.SetUVs(Mesh.AnimationUVChannelNormals, deltaNormals); - - } else if (vpMesh.AnimationFrames.Count > 0) { + if (vpMesh.AnimationFrames.Count > 0) { var deltaWeight = 1f / vpMesh.AnimationFrames.Count; var deltaVertices = new Vector3[vpMesh.Vertices.Length]; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index 06507c25a..a8c7011b9 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -50,7 +50,7 @@ public class Player : MonoBehaviour public TableApi TableApi { get; private set; } // shortcuts - public Matrix4x4 TableToWorld => GetComponentInChildren().transform.localToWorldMatrix; + public GameObject Playfield => GetComponentInChildren().gameObject; [NonSerialized] public IGamelogicEngine GamelogicEngine; @@ -73,6 +73,15 @@ public class Player : MonoBehaviour private readonly Dictionary _slingshots = new Dictionary(); internal readonly Dictionary Flippers = new Dictionary(); + internal readonly Dictionary FlipperTransforms = new Dictionary(); + internal readonly Dictionary BumperSkirtTransforms = new Dictionary(); + internal readonly Dictionary BumperRingTransforms = new Dictionary(); + internal readonly Dictionary GateWireTransforms = new Dictionary(); + internal readonly Dictionary SpinnerPlateTransforms = new Dictionary(); + internal readonly Dictionary TriggerTransforms = new Dictionary(); + internal readonly Dictionary PlungerSkinnedMeshRenderers = new Dictionary(); + internal readonly Dictionary Balls = new Dictionary(); + internal IEnumerable ColliderGenerators => _colliderGenerators; @@ -124,7 +133,7 @@ private void Awake() Table = tableComponent.Table; //tableComponent.CreateTable(tableComponent.Data); _tableContainer = tableComponent.TableContainer; - BallManager = new BallManager(Table, TableToWorld); + BallManager = new BallManager(Table, this); _inputManager = new InputManager(); _inputManager.Enable(HandleInput); @@ -196,6 +205,15 @@ public void RegisterBumper(Bumper bumper, Entity entity, Entity parentEntity, Ga _switchPlayer.RegisterSwitch(bumper, bumperApi); _coilPlayer.RegisterCoil(bumper, bumperApi); _wirePlayer.RegisterWire(bumper, bumperApi); + + var ringAnimationAuth = go.GetComponentInChildren(); + if (ringAnimationAuth) { + BumperRingTransforms[entity] = ringAnimationAuth.gameObject.transform; + } + var skirtAnimationAuth = go.GetComponentInChildren(); + if (skirtAnimationAuth) { + BumperSkirtTransforms[entity] = skirtAnimationAuth.gameObject.transform; + } } public void RegisterFlipper(Flipper flipper, Entity entity, Entity parentEntity, GameObject go) @@ -219,6 +237,8 @@ public void RegisterFlipper(Flipper flipper, Entity entity, Entity parentEntity, if (EngineProvider.Exists) { EngineProvider.Get().OnRegisterFlipper(entity, flipper.Name); } + + FlipperTransforms[entity] = go.transform; } public void RegisterGate(Gate gate, Entity entity, Entity parentEntity, GameObject go) @@ -234,6 +254,11 @@ public void RegisterGate(Gate gate, Entity entity, Entity parentEntity, GameObje } _rotatables[entity] = gateApi; _switchPlayer.RegisterSwitch(gate, gateApi); + + var wireAnimAuthoring = go.GetComponentInChildren(); + if (wireAnimAuthoring) { + GateWireTransforms[entity] = wireAnimAuthoring.gameObject.transform; + } } public void RegisterHitTarget(HitTarget hitTarget, Entity entity, Entity parentEntity, GameObject go) @@ -276,7 +301,7 @@ public void RegisterLamp(Light lamp, GameObject go) _wirePlayer.RegisterWire(lamp, lightApi); } - public void RegisterPlunger(Plunger plunger, Entity entity, Entity parentEntity, InputActionReference actionRef) + public void RegisterPlunger(Plunger plunger, Entity entity, Entity parentEntity, InputActionReference actionRef, GameObject go) { var plungerApi = new PlungerApi(plunger, entity, parentEntity, this); TableApi.Plungers[plunger.Name] = plungerApi; @@ -291,6 +316,8 @@ public void RegisterPlunger(Plunger plunger, Entity entity, Entity parentEntity, actionRef.action.performed += plungerApi.OnAnalogPlunge; _actions.Add((actionRef.action, plungerApi.OnAnalogPlunge)); } + + PlungerSkinnedMeshRenderers[entity] = go.GetComponentsInChildren(); } public void RegisterPrimitive(Primitive primitive, Entity entity, Entity parentEntity, GameObject go) @@ -358,6 +385,11 @@ public void RegisterSpinner(Spinner spinner, Entity entity, Entity parentEntity, _spinnables[entity] = spinnerApi; _rotatables[entity] = spinnerApi; _switchPlayer.RegisterSwitch(spinner, spinnerApi); + + var plateAnimAuthoring = go.GetComponentInChildren(); + if (plateAnimAuthoring) { + SpinnerPlateTransforms[entity] = plateAnimAuthoring.gameObject.transform; + } } public void RegisterTrigger(Trigger trigger, Entity entity, Entity parentEntity, GameObject go) @@ -372,6 +404,8 @@ public void RegisterTrigger(Trigger trigger, Entity entity, Entity parentEntity, _hittables[entity] = triggerApi; } _switchPlayer.RegisterSwitch(trigger, triggerApi); + + TriggerTransforms[entity] = go.transform; } public void RegisterTrigger(Trigger trigger, Entity entity) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Import/ConvertedItem.cs b/VisualPinball.Unity/VisualPinball.Unity/Import/ConvertedItem.cs index ff873e5cd..6f5ff7a45 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Import/ConvertedItem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Import/ConvertedItem.cs @@ -192,7 +192,8 @@ public void SetAnimationAuthoring(string name) where T : Component, IItemAnim public IConvertedItem AddConvertToEntity(bool componentsAdded) { if (!componentsAdded) { - _gameObject.AddComponent(); + var cte = _gameObject.AddComponent(); + cte.ConversionMode = ConvertToEntity.Mode.ConvertAndInjectGameObject; } return this; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs index 5df0c0a0c..f454ae162 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Collision/StaticCollisionSystem.cs @@ -95,12 +95,12 @@ protected override void OnUpdate() switch (coll.Type) { case ColliderType.Bumper: { var bumperStaticData = GetComponent(coll.Entity); - var ringData = GetComponent(bumperStaticData.RingEntity); - var skirtData = GetComponent(bumperStaticData.SkirtEntity); + var ringData = GetComponent(coll.Entity); + var skirtData = GetComponent(coll.Entity); BumperCollider.Collide(ref ballData, ref events, ref collEvent, ref ringData, ref skirtData, in ballEntity, in coll, bumperStaticData, ref random); - SetComponent(bumperStaticData.RingEntity, ringData); - SetComponent(bumperStaticData.SkirtEntity, skirtData); + SetComponent(coll.Entity, ringData); + SetComponent(coll.Entity, skirtData); break; } @@ -120,12 +120,12 @@ protected override void OnUpdate() case ColliderType.Gate: { var gateStaticData = GetComponent(coll.Entity); - var gateMovementData = GetComponent(gateStaticData.WireEntity); + var gateMovementData = GetComponent(coll.Entity); GateCollider.Collide( ref ballData, ref collEvent, ref gateMovementData, ref events, in ballEntity, in coll, in gateStaticData ); - SetComponent(gateStaticData.WireEntity, gateMovementData); + SetComponent(coll.Entity, gateMovementData); break; } @@ -149,12 +149,12 @@ protected override void OnUpdate() case ColliderType.Spinner: { var spinnerStaticData = GetComponent(coll.Entity); - var spinnerMovementData = GetComponent(spinnerStaticData.PlateEntity); + var spinnerMovementData = GetComponent(coll.Entity); SpinnerCollider.Collide( in ballData, ref collEvent, ref spinnerMovementData, in spinnerStaticData ); - SetComponent(spinnerStaticData.PlateEntity, spinnerMovementData); + SetComponent(coll.Entity, spinnerMovementData); break; } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/DefaultPhysicsEngine.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/DefaultPhysicsEngine.cs index d13f00d4d..ea3bc5634 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/DefaultPhysicsEngine.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/DefaultPhysicsEngine.cs @@ -63,10 +63,10 @@ public void Init(TableAuthoring tableAuthoring, BallManager ballManager) _worldToLocal = transform.worldToLocalMatrix; } - public void BallCreate(in float3 worldPos, in float3 localPos, + public void BallCreate(GameObject ballGo, int id, in float3 worldPos, in float3 localPos, in float3 localVel, in float scale, in float mass, in float radius, in Entity kickerRef) { - _ballManager.CreateEntity(in worldPos, in localPos, in localVel,scale * radius * 2, + _ballManager.CreateEntity(ballGo, id, in worldPos, in localPos, in localVel,scale * radius * 2, in mass, in radius, in kickerRef); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/IPhysicsEngine.cs b/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/IPhysicsEngine.cs index 1583023a3..4f0ff4a8e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/IPhysicsEngine.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Physics/Engine/IPhysicsEngine.cs @@ -16,6 +16,7 @@ using Unity.Entities; using Unity.Mathematics; +using UnityEngine; using VisualPinball.Engine.Common; namespace VisualPinball.Unity @@ -39,6 +40,8 @@ public interface IPhysicsEngine : IEngine /// /// Create a new ball and returns its entity. /// + /// Created game object of the ball + /// Unique ID of the ball /// Position in world space /// Position in local space /// Velocity in local space @@ -46,7 +49,7 @@ public interface IPhysicsEngine : IEngine /// Physics mass /// Radius in local space /// If created within a kicker, this is the kicker entity - void BallCreate(in float3 worldPos, in float3 localPos, in float3 localVel, + void BallCreate(GameObject ballGo, int id, in float3 worldPos, in float3 localPos, in float3 localVel, in float scale, in float mass, in float radius, in Entity kickerRef); /// diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs index 6f40b50ca..055973f3e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs @@ -49,9 +49,7 @@ public Shader GetShader() private Shader GetShader(PbrMaterial vpxMaterial) { - return vpxMaterial.VertexLerpWithUvEnabled - ? Shader.Find("Visual Pinball/Built-In/LerpVertex") - : GetShader(); + return GetShader(); } public static Material GetDefaultMaterial(BlendMode blendMode) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallManager.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallManager.cs index d993f56db..6c83675b0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallManager.cs @@ -36,16 +36,18 @@ public class BallManager public int NumBalls { get; private set; } private readonly Table _table; - private readonly Matrix4x4 _ltw; + private readonly GameObject _playfield; + private readonly Player _player; private static EntityManager EntityManager => World.DefaultGameObjectInjectionWorld.EntityManager; private static Mesh _unitySphereMesh; // used to cache ball mesh from GameObject - public BallManager(Table table, Matrix4x4 ltw) + public BallManager(Table table, Player player) { _table = table; - _ltw = ltw; + _player = player; + _playfield = player.Playfield; } public void CreateBall(IBallCreationPosition ballCreator, float radius = 25f, float mass = 1f) @@ -59,51 +61,55 @@ public void CreateBall(IBallCreationPosition ballCreator, float radius, float ma var localVel = ballCreator.GetBallCreationVelocity(_table).ToUnityFloat3(); localPos.z += radius; - var worldPos = _ltw.MultiplyPoint(localPos); + var ltw = _playfield.transform.localToWorldMatrix; + var worldPos = ltw.MultiplyPoint(localPos); var scale3 = new Vector3( - _ltw.GetColumn(0).magnitude, - _ltw.GetColumn(1).magnitude, - _ltw.GetColumn(2).magnitude + ltw.GetColumn(0).magnitude, + ltw.GetColumn(1).magnitude, + ltw.GetColumn(2).magnitude ); var scale = (scale3.x + scale3.y + scale3.z) / 3.0f; // scale is only scale (without radiusfloat now, not vector. + + var ballId = NumBallsCreated++; + var ballPrefab = RenderPipeline.Current.BallConverter.CreateDefaultBall(); + var ballGo = Object.Instantiate(ballPrefab, _playfield.transform); + ballGo.name = $"Ball{ballId}"; + ballGo.transform.localScale = new Vector3(radius, radius, radius) * 2f; + ballGo.transform.localPosition = localPos; + // create ball entity EngineProvider .Get() - .BallCreate(worldPos, localPos, localVel, scale, mass, radius, in kickerRef); + .BallCreate(ballGo, ballId, worldPos, localPos, localVel, scale, mass, radius, in kickerRef); } - public void CreateEntity(in float3 worldPos, in float3 localPos, in float3 localVel, in float scale, + public void CreateEntity(GameObject ballGo, int id, in float3 worldPos, in float3 localPos, in float3 localVel, in float scale, in float mass, in float radius, in Entity kickerEntity) { - var ballPrefab = RenderPipeline.Current.BallConverter.CreateDefaultBall(); - - // Create entity prefab from the game object hierarchy once - var settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null); - var prefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(ballPrefab, settings); - // Efficiently instantiate a bunch of entities from the already converted entity prefab - var entity = EntityManager.Instantiate(prefab); + var entity = EntityManager.CreateEntity( + typeof(OverlappingStaticColliderBufferElement), + typeof(OverlappingDynamicBufferElement), + typeof(BallInsideOfBufferElement), + typeof(BallLastPositionsBufferElement), + typeof(BallData), + typeof(CollisionEventData) + ); + + _player.Balls[entity] = ballGo; var world = World.DefaultGameObjectInjectionWorld; var ecbs = world.GetOrCreateSystem(); var ecb = ecbs.CreateCommandBuffer(); - ecb.AddComponent(entity, new Translation { - Value = worldPos - }); - - ecb.AddComponent(entity, new Scale { - Value = scale - }); - ecb.AddBuffer(entity); ecb.AddBuffer(entity); ecb.AddBuffer(entity); ecb.AddBuffer(entity); ecb.AddComponent(entity, new BallData { - Id = NumBallsCreated++, + Id = id, IsFrozen = false, Position = localPos, Radius = radius, @@ -147,6 +153,11 @@ public void CreateEntity(in float3 worldPos, in float3 localPos, in float3 local public void DestroyEntity(Entity ballEntity) { + // destroy game object + Object.DestroyImmediate(_player.Balls[ballEntity]); + _player.Balls.Remove(ballEntity); + + // destroy entity World.DefaultGameObjectInjectionWorld .GetOrCreateSystem() .CreateCommandBuffer() diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallMovementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallMovementSystem.cs index abb8133c0..e82e08254 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallMovementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Ball/BallMovementSystem.cs @@ -17,7 +17,6 @@ using Unity.Entities; using Unity.Mathematics; using Unity.Profiling; -using Unity.Transforms; using UnityEngine; namespace VisualPinball.Unity @@ -27,6 +26,8 @@ namespace VisualPinball.Unity internal class BallMovementSystem : SystemBase { private float4x4 _baseTransform; + private Player _player; + private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("BallMovementSystem"); protected override void OnStartRunning() @@ -39,22 +40,29 @@ protected override void OnStartRunning() ltw.m20, ltw.m21, ltw.m22, ltw.m23, ltw.m30, ltw.m31, ltw.m32, ltw.m33 ); + _player = Object.FindObjectOfType(); } protected override void OnUpdate() { var ltw = _baseTransform; var marker = PerfMarker; - Entities.WithName("BallMovementJob").ForEach((ref Translation translation, ref Rotation rot, in BallData ball) => { + Entities.WithoutBurst().WithName("BallMovementJob").ForEach((Entity entity, in BallData ball) => { marker.Begin(); + if (!_player.Balls.ContainsKey(entity)) { + marker.End(); + return; + } + // calculate/adapt height of ball var zHeight = !ball.IsFrozen ? ball.Position.z : ball.Position.z - ball.Radius; - translation.Value = math.transform(ltw, new float3(ball.Position.x, ball.Position.y, zHeight)); var or = ball.Orientation; - rot.Value = quaternion.LookRotation(or.c2, or.c1); + var ballTransform = _player.Balls[entity].transform; + ballTransform.localPosition = new Vector3(ball.Position.x, ball.Position.y, zHeight); + ballTransform.localRotation = Quaternion.LookRotation(or.c2, or.c1); marker.End(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperApi.cs index 645e10711..b10a88da5 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperApi.cs @@ -50,10 +50,9 @@ public BumperApi(Bumper item, Entity entity, Entity parentEntity, Player player) void IApiCoil.OnCoil(bool enabled, bool _) { if (enabled) { - var bumperData = EntityManager.GetComponentData(Entity); - var ringAnimation = EntityManager.GetComponentData(bumperData.RingEntity); + var ringAnimation = EntityManager.GetComponentData(Entity); ringAnimation.IsHit = true; - EntityManager.SetComponentData(bumperData.RingEntity, ringAnimation); + EntityManager.SetComponentData(Entity, ringAnimation); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperAuthoring.cs index 612627b22..130e1a93c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperAuthoring.cs @@ -24,6 +24,7 @@ using System.Collections.Generic; using System.Linq; using Unity.Entities; +using Unity.Mathematics; using UnityEngine; using VisualPinball.Engine.Game; using VisualPinball.Engine.VPT.Bumper; @@ -58,6 +59,41 @@ public void Convert(Entity entity, EntityManager dstManager, GameObjectConversio Threshold = Data.Threshold }); + var table = Table; + var bumper = Item; + + // add ring data + if (GetComponentInChildren()) { + dstManager.AddComponentData(entity, new BumperRingAnimationData { + + // dynamic + IsHit = false, + Offset = 0, + AnimateDown = false, + DoAnimate = false, + + // static + DropOffset = bumper.Data.RingDropOffset, + HeightScale = bumper.Data.HeightScale, + Speed = bumper.Data.RingSpeed, + ScaleZ = table.GetScaleZ() + }); + } + + // add ring data + if (GetComponentInChildren()) { + dstManager.AddComponentData(entity, new BumperSkirtAnimationData { + BallPosition = default, + AnimationCounter = 0f, + DoAnimate = false, + DoUpdate = false, + EnableAnimation = true, + Rotation = new float2(0, 0), + HitEvent = bumper.Data.HitEvent, + Center = bumper.Data.Center.ToUnityFloat2() + }); + } + transform.GetComponentInParent().RegisterBumper(Item, entity, ParentEntity, gameObject); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingAnimationAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingAnimationAuthoring.cs index 0671453ec..fce104451 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingAnimationAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingAnimationAuthoring.cs @@ -23,38 +23,8 @@ namespace VisualPinball.Unity { [AddComponentMenu("Visual Pinball/Animation/Bumper Ring Animation")] - public class BumperRingAnimationAuthoring : ItemAnimationAuthoring, IConvertGameObjectToEntity + public class BumperRingAnimationAuthoring : ItemAnimationAuthoring { public override IEnumerable ValidParents { get; } = new Type[0]; // animation components only apply to their own - - public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) - { - var table = Table; - var bumper = Item; - var bumperEntity = MainEntity; - - // update parent - var bumperStaticData = dstManager.GetComponentData(bumperEntity); - bumperStaticData.RingEntity = entity; - dstManager.SetComponentData(bumperEntity, bumperStaticData); - - // add ring data - dstManager.AddComponentData(entity, new BumperRingAnimationData { - - // dynamic - IsHit = false, - Offset = 0, - AnimateDown = false, - DoAnimate = false, - - // static - DropOffset = bumper.Data.RingDropOffset, - HeightScale = bumper.Data.HeightScale, - Speed = bumper.Data.RingSpeed, - ScaleZ = table.GetScaleZ() - }); - - LinkToParentEntity(entity, dstManager); - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingMovementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingMovementSystem.cs index 1124f6eaa..74e273dfb 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingMovementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperRingMovementSystem.cs @@ -16,7 +16,7 @@ using Unity.Entities; using Unity.Profiling; -using Unity.Transforms; +using UnityEngine; namespace VisualPinball.Unity { @@ -25,14 +25,27 @@ internal class BumperRingMovementSystem : SystemBase { private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("BumperRingMovementSystem"); + private Player _player; + + protected override void OnStartRunning() + { + base.OnStartRunning(); + _player = Object.FindObjectOfType(); + } + protected override void OnUpdate() { var marker = PerfMarker; - Entities.WithName("BumperRingMovementJob").ForEach((ref Translation trans, in BumperRingAnimationData data) => { + Entities.WithoutBurst().WithName("BumperRingMovementJob").ForEach((Entity entity, in BumperRingAnimationData data) => { marker.Begin(); - trans.Value.z = data.Offset; + var localPos = _player.BumperRingTransforms[entity].transform.localPosition; + _player.BumperRingTransforms[entity].transform.localPosition= new Vector3( + localPos.x, + localPos.y, + data.Offset + ); marker.End(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtAnimationAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtAnimationAuthoring.cs index 1da770a70..ffc5ed998 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtAnimationAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtAnimationAuthoring.cs @@ -24,33 +24,8 @@ namespace VisualPinball.Unity { [AddComponentMenu("Visual Pinball/Animation/Bumper Skirt Animation")] - public class BumperSkirtAnimationAuthoring : ItemAnimationAuthoring, IConvertGameObjectToEntity + public class BumperSkirtAnimationAuthoring : ItemAnimationAuthoring { public override IEnumerable ValidParents { get; } = new Type[0]; // animation components only apply to their own - - public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) - { - var bumper = Item; - var bumperEntity = MainEntity; - - // update parent - var bumperStaticData = dstManager.GetComponentData(bumperEntity); - bumperStaticData.SkirtEntity = entity; - dstManager.SetComponentData(bumperEntity, bumperStaticData); - - // add ring data - dstManager.AddComponentData(entity, new BumperSkirtAnimationData { - BallPosition = default, - AnimationCounter = 0f, - DoAnimate = false, - DoUpdate = false, - EnableAnimation = true, - Rotation = new float2(0, 0), - HitEvent = bumper.Data.HitEvent, - Center = bumper.Data.Center.ToUnityFloat2() - }); - - LinkToParentEntity(entity, dstManager); - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtMovementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtMovementSystem.cs index 55cac914d..1a95291c3 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtMovementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperSkirtMovementSystem.cs @@ -17,7 +17,7 @@ using Unity.Entities; using Unity.Mathematics; using Unity.Profiling; -using Unity.Transforms; +using UnityEngine; namespace VisualPinball.Unity { @@ -26,14 +26,22 @@ internal class BumperSkirtMovementSystem : SystemBase { private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("BumperSkirtMovementSystem"); + private Player _player; + + protected override void OnStartRunning() + { + base.OnStartRunning(); + _player = Object.FindObjectOfType(); + } + protected override void OnUpdate() { var marker = PerfMarker; - Entities.WithName("BumperSkirtMovementJob").ForEach((ref Rotation rot, in BumperSkirtAnimationData data) => { + Entities.WithoutBurst().WithName("BumperSkirtMovementJob").ForEach((Entity entity, in BumperSkirtAnimationData data) => { marker.Begin(); - rot.Value = quaternion.EulerXYZ(math.radians(data.Rotation.x), math.radians(data.Rotation.y), 0f); + _player.BumperSkirtTransforms[entity].localRotation = quaternion.EulerXYZ(math.radians(data.Rotation.x), math.radians(data.Rotation.y), 0f); marker.End(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperStaticData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperStaticData.cs index 4c8605922..6d2a56cfa 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperStaticData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Bumper/BumperStaticData.cs @@ -23,7 +23,5 @@ internal struct BumperStaticData : IComponentData public float Force; public float Threshold; public bool HitEvent; - public Entity RingEntity; - public Entity SkirtEntity; } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperAuthoring.cs index 631145ac9..5579b3733 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperAuthoring.cs @@ -52,8 +52,6 @@ public class FlipperAuthoring : ItemMainRenderableAuthoring Data.EndAngle < Data.StartAngle; - private static readonly Color EndAngleMeshColor = new Color32(0, 255, 248, 10); - public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { Convert(entity, dstManager); @@ -368,7 +366,6 @@ private FlipperMovementData GetMovementData(FlipperStaticData d) AngleSpeed = 0f, AngularMomentum = 0f, EnableRotateEvent = 0, - BaseRotation = baseRotation, }; } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperMovementData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperMovementData.cs index 4f6c0b3bf..61a439a7d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperMovementData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperMovementData.cs @@ -25,14 +25,13 @@ internal struct FlipperMovementData : IComponentData public float AngleSpeed; public float AngularMomentum; public sbyte EnableRotateEvent; - public quaternion BaseRotation; public uint LastHitTime; public uint StartRotateToEndTime; public float AngleAtRotateToEnd; public override string ToString() { - return $"FlipperMovementData(Angle: {Angle}, AngleSpeed: {AngleSpeed}, AngularMomentum: {AngularMomentum}, BaseRotation: {BaseRotation})"; + return $"FlipperMovementData(Angle: {Angle}, AngleSpeed: {AngleSpeed}, AngularMomentum: {AngularMomentum})"; } public void ApplyImpulse(in float3 rotI, float inertia) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperRotateSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperRotateSystem.cs index f0ba9963b..4fba2f034 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperRotateSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Flipper/FlipperRotateSystem.cs @@ -17,7 +17,7 @@ using Unity.Entities; using Unity.Mathematics; using Unity.Profiling; -using Unity.Transforms; +using UnityEngine; namespace VisualPinball.Unity { @@ -27,14 +27,22 @@ internal class FlipperRotateSystem : SystemBase { private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("FlipperRotateSystem"); + private Player _player; + + protected override void OnStartRunning() + { + base.OnStartRunning(); + _player = Object.FindObjectOfType(); + } + protected override void OnUpdate() { var marker = PerfMarker; - Entities.WithName("FlipperRotateJob").ForEach((ref Rotation rot, in FlipperMovementData movement) => { + Entities.WithoutBurst().WithName("FlipperRotateJob").ForEach((Entity entity, in FlipperMovementData movement) => { marker.Begin(); - rot.Value = math.mul(movement.BaseRotation, quaternion.EulerXYZ(0, 0, movement.Angle)); + _player.FlipperTransforms[entity].localRotation = quaternion.Euler(0, 0, movement.Angle); marker.End(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateAuthoring.cs index b3d654e1b..db69bfd01 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateAuthoring.cs @@ -61,6 +61,17 @@ public void Convert(Entity entity, EntityManager dstManager, GameObjectConversio GravityFactor = Data.GravityFactor, TwoWay = Data.TwoWay }); + + // add movement data + if (GetComponentInChildren()) { + dstManager.AddComponentData(entity, new GateMovementData { + Angle = Data.AngleMin, + AngleSpeed = 0, + ForcedMove = false, + IsOpen = false, + HitDirection = false + }); + } // register transform.GetComponentInParent().RegisterGate(Item, entity, ParentEntity, gameObject); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateDisplacementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateDisplacementSystem.cs index 2fa22b0ae..8ccbe89b2 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateDisplacementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateDisplacementSystem.cs @@ -52,12 +52,10 @@ protected override void OnUpdate() Entities .WithName("GateDisplacementJob") - .ForEach((Entity entity, in GateStaticData data) => { + .ForEach((Entity entity, ref GateMovementData movementData, in GateStaticData data) => { marker.Begin(); - var movementData = GetComponent(data.WireEntity); - if (data.TwoWay) { if (math.abs(movementData.Angle) > data.AngleMax) { if (movementData.Angle < 0.0) { @@ -120,8 +118,6 @@ protected override void OnUpdate() } movementData.Angle += movementData.AngleSpeed * dTime; - SetComponent(data.WireEntity, movementData); - marker.End(); }).Run(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateMovementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateMovementSystem.cs index cd00da0cd..8f5c132e1 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateMovementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateMovementSystem.cs @@ -17,7 +17,7 @@ using Unity.Entities; using Unity.Mathematics; using Unity.Profiling; -using Unity.Transforms; +using UnityEngine; namespace VisualPinball.Unity { @@ -26,14 +26,22 @@ internal class GateMovementSystem : SystemBase { private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("GateMovementSystem"); + private Player _player; + + protected override void OnStartRunning() + { + base.OnStartRunning(); + _player = Object.FindObjectOfType(); + } + protected override void OnUpdate() { var marker = PerfMarker; - Entities.WithName("GateMovementJob").ForEach((ref Rotation rot, in GateMovementData movementData) => { + Entities.WithoutBurst().WithName("GateMovementJob").ForEach((Entity entity, in GateMovementData movementData) => { marker.Begin(); - rot.Value = quaternion.RotateX(-movementData.Angle); + _player.GateWireTransforms[entity].localRotation = quaternion.RotateX(-movementData.Angle); marker.End(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateStaticData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateStaticData.cs index e5ef22567..4c220073a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateStaticData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateStaticData.cs @@ -26,6 +26,5 @@ internal struct GateStaticData : IComponentData public float GravityFactor; public float Damping; public bool TwoWay; - public Entity WireEntity; } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateVelocitySystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateVelocitySystem.cs index 01df0167b..a9a52d404 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateVelocitySystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateVelocitySystem.cs @@ -33,12 +33,10 @@ protected override void OnUpdate() var marker = PerfMarker; Entities .WithName("GateVelocityJob") - .ForEach((in GateStaticData data) => { + .ForEach((ref GateMovementData movementData, in GateStaticData data) => { marker.Begin(); - var movementData = GetComponent(data.WireEntity); - if (!movementData.IsOpen) { if (math.abs(movementData.Angle) < data.AngleMin + 0.01f && math.abs(movementData.AngleSpeed) < 0.01f) { // stop a bit earlier to prevent a nearly endless animation (especially for slow balls) @@ -51,8 +49,6 @@ protected override void OnUpdate() } } - SetComponent(data.WireEntity, movementData); - marker.End(); }).Run(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateWireAnimationAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateWireAnimationAuthoring.cs index 37dcb6c79..08d3973f7 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateWireAnimationAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Gate/GateWireAnimationAuthoring.cs @@ -16,34 +16,12 @@ using System; using System.Collections.Generic; -using Unity.Entities; using VisualPinball.Engine.VPT.Gate; namespace VisualPinball.Unity { - public class GateWireAnimationAuthoring : ItemAnimationAuthoring, IConvertGameObjectToEntity + public class GateWireAnimationAuthoring : ItemAnimationAuthoring { public override IEnumerable ValidParents { get; } = new Type[0]; // animation components only apply to their own - - public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) - { - var gateEntity = MainEntity; - - // update parent - var gateStaticData = dstManager.GetComponentData(gateEntity); - gateStaticData.WireEntity = entity; - dstManager.SetComponentData(gateEntity, gateStaticData); - - // add movement data - dstManager.AddComponentData(entity, new GateMovementData { - Angle = Data.AngleMin, - AngleSpeed = 0, - ForcedMove = false, - IsOpen = false, - HitDirection = false - }); - - LinkToParentEntity(entity, dstManager); - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/ItemMeshAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/ItemMeshAuthoring.cs index fe61b447a..5999d3429 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/ItemMeshAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/ItemMeshAuthoring.cs @@ -97,7 +97,7 @@ public void CreateMesh(string parentName, ITextureProvider texProvider, IMateria mf.sharedMesh = mesh; // apply material - if (ro.Mesh.AnimationFrames.Count > 1) { // if number of animations frames are 1, the blend vertices are in the uvs are handle by the lerp shader. + if (ro.Mesh.AnimationFrames.Count > 0) { // if number of animations frames are 1, the blend vertices are in the uvs are handle by the lerp shader. var smr = loadFromAsset ? gameObject.GetComponent() : gameObject.AddComponent(); smr.sharedMaterial = ro.Material.ToUnityMaterial(matProvider, texProvider, MainAuthoring.Item.GetType()); smr.sharedMesh = mesh; diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationData.cs index 4df472936..4153c8a1a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationData.cs @@ -20,9 +20,6 @@ namespace VisualPinball.Unity { internal struct PlungerAnimationData : IComponentData { - public int CurrentFrame; - public int NumFrames; - public bool IsDirty; - + public float Position; } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationSystem.cs index 33cdeafa9..17922fb69 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAnimationSystem.cs @@ -15,6 +15,7 @@ // along with this program. If not, see . using Unity.Entities; +using Unity.Mathematics; using Unity.Profiling; namespace VisualPinball.Unity @@ -27,11 +28,9 @@ internal class PlungerAnimationSystem : SystemBase protected override void OnUpdate() { var marker = PerfMarker; - var animationDatas = GetComponentDataFromEntity(); - Entities - .WithNativeDisableParallelForRestriction(animationDatas) - .ForEach((in PlungerMovementData movementData, in PlungerStaticData staticData) => + Entities.WithName("PlungerAnimationJob") + .ForEach((ref PlungerAnimationData animationData, in PlungerMovementData movementData, in PlungerStaticData staticData) => { marker.Begin(); @@ -40,35 +39,7 @@ protected override void OnUpdate() //Debug.Log($"[plunger] frame0 = {frame0} frame = {frame}"); - if (animationDatas.HasComponent(staticData.RodEntity)) { - var rodAnimData = animationDatas[staticData.RodEntity]; - if (rodAnimData.CurrentFrame != frame) { - rodAnimData.CurrentFrame = frame; - rodAnimData.NumFrames = staticData.NumFrames; - rodAnimData.IsDirty = true; - animationDatas[staticData.RodEntity] = rodAnimData; - } - } - - if (animationDatas.HasComponent(staticData.SpringEntity)) { - var springAnimData = animationDatas[staticData.SpringEntity]; - if (springAnimData.CurrentFrame != frame) { - springAnimData.CurrentFrame = frame; - springAnimData.NumFrames = staticData.NumFrames; - springAnimData.IsDirty = true; - animationDatas[staticData.SpringEntity] = springAnimData; - } - } - - if (animationDatas.HasComponent(staticData.FlatEntity)) { - var flatAnimData = animationDatas[staticData.FlatEntity]; - if (flatAnimData.CurrentFrame != frame) { - flatAnimData.CurrentFrame = frame; - flatAnimData.NumFrames = staticData.NumFrames; - flatAnimData.IsDirty = true; - animationDatas[staticData.FlatEntity] = flatAnimData; - } - } + animationData.Position = math.clamp((float)frame / staticData.NumFrames, 0, 1); marker.End(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs index 8cf7a2d9b..bb27aecb8 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerApi.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using Unity.Entities; +using UnityEngine; using UnityEngine.InputSystem; using VisualPinball.Engine.VPT.Plunger; using VisualPinball.Engine.VPT.Table; diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAuthoring.cs index c1d476c1f..88e5c6ee0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerAuthoring.cs @@ -42,15 +42,6 @@ public class PlungerAuthoring : ItemMainRenderableAuthoring); protected override Type ColliderAuthoringType { get; } = typeof(ItemColliderAuthoring); - private static readonly int LerpPosition = Shader.PropertyToID("_LerpPosition"); - private static readonly int UVChannelVertices = Shader.PropertyToID("_UVChannelVertices"); - private static readonly int UVChannelNormals = Shader.PropertyToID("_UVChannelNormals"); - - private void Start() - { - UpdateParkPosition(1 - Data.ParkPosition); - } - public override IEnumerable ValidParents => PlungerColliderAuthoring.ValidParentTypes .Concat(PlungerFlatMeshAuthoring.ValidParentTypes) .Concat(PlungerRodMeshAuthoring.ValidParentTypes) @@ -60,8 +51,9 @@ private void Start() public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { Convert(entity, dstManager); - var table = gameObject.GetComponentInParent().Item; - transform.GetComponentInParent().RegisterPlunger(Item, entity, ParentEntity, analogPlungerAction); + var go = gameObject; + var table = go.GetComponentInParent().Item; + transform.GetComponentInParent().RegisterPlunger(Item, entity, ParentEntity, analogPlungerAction, go); var zHeight = table.GetSurfaceHeight(Data.Surface, Data.Center.X, Data.Center.Y); var x = Data.Center.X - Data.Width; @@ -125,6 +117,10 @@ public void Convert(Entity entity, EntityManager dstManager, GameObjectConversio RetractWaitLoop = 0, MechStrength = Data.MechStrength }); + + dstManager.AddComponentData(entity, new PlungerAnimationData { + Position = _data.ParkPosition + }); } public override void Restore() @@ -196,28 +192,12 @@ public void OnTypeChanged(int plungerTypeBefore, int plungerTypeAfter) } break; } - - UpdateParkPosition(1 - Data.ParkPosition); } public void UpdateParkPosition(float pos) { - SetMaterialProperty(UVChannelVertices, Mesh.AnimationUVChannelVertices); - SetMaterialProperty(UVChannelNormals, Mesh.AnimationUVChannelNormals); - switch (Data.Type) { - case PlungerType.PlungerTypeFlat: { - SetMaterialProperty(LerpPosition, pos); - break; - } - case PlungerType.PlungerTypeCustom: { - SetMaterialProperty(LerpPosition, pos); - SetMaterialProperty(LerpPosition, pos); - break; - } - case PlungerType.PlungerTypeModern: { - SetMaterialProperty(LerpPosition, pos); - break; - } + foreach (var skinnedMeshRenderer in GetComponentsInChildren()) { + skinnedMeshRenderer.SetBlendShapeWeight(0, pos); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerFlatMeshAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerFlatMeshAuthoring.cs index 0d0d836d3..b914caffa 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerFlatMeshAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerFlatMeshAuthoring.cs @@ -33,27 +33,5 @@ public class PlungerFlatMeshAuthoring : PlungerMeshAuthoring public override IEnumerable ValidParents => ValidParentTypes; protected override string MeshId => PlungerMeshGenerator.Flat; - - internal override void SetChildEntity(ref PlungerStaticData staticData, Entity entity) - { - staticData.FlatEntity = entity; - } - - protected override IEnumerable GetVertices(PlungerMeshGenerator meshGenerator, int frame) - { - return meshGenerator.BuildFlatVertices(frame); - } - - protected override void PostConvert(Entity entity, EntityManager dstManager, PlungerMeshGenerator meshGenerator) - { - // add mesh data - var uvBuffer = dstManager.AddBuffer(entity); - for (var frame = 0; frame < meshGenerator.NumFrames; frame++) { - var vertices = meshGenerator.BuildFlatVertices(frame); - foreach (var v in vertices) { - uvBuffer.Add(new PlungerUvBufferElement(new float2(v.Tu, v.Tv))); - } - } - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerMeshAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerMeshAuthoring.cs index f218921ed..0060d6f6f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerMeshAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerMeshAuthoring.cs @@ -21,37 +21,11 @@ namespace VisualPinball.Unity { - public abstract class PlungerMeshAuthoring : ItemMeshAuthoring, IConvertGameObjectToEntity + public abstract class PlungerMeshAuthoring : ItemMeshAuthoring { - internal abstract void SetChildEntity(ref PlungerStaticData staticData, Entity entity); - - protected abstract IEnumerable GetVertices(PlungerMeshGenerator meshGenerator, int frame); - protected override bool IsVisible { get => Data.IsVisible; set => Data.IsVisible = value; } - - public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) - { - var plunger = transform.parent.gameObject.GetComponent().Item; - var plungerEntity = new Entity {Index = plunger.Index, Version = plunger.Version}; - - // update parent - var plungerStaticData = dstManager.GetComponentData(plungerEntity); - SetChildEntity(ref plungerStaticData, entity); - dstManager.SetComponentData(plungerEntity, plungerStaticData); - - // add animation data - dstManager.AddComponentData(entity, new PlungerAnimationData { - CurrentFrame = 0 - }); - - PostConvert(entity, dstManager, plunger.MeshGenerator); - } - - protected virtual void PostConvert(Entity entity, EntityManager dstManager, PlungerMeshGenerator meshGenerator) - { - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerRodMeshAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerRodMeshAuthoring.cs index 0895dc870..8b338b34d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerRodMeshAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerRodMeshAuthoring.cs @@ -32,15 +32,5 @@ public class PlungerRodMeshAuthoring : PlungerMeshAuthoring public override IEnumerable ValidParents => ValidParentTypes; protected override string MeshId => PlungerMeshGenerator.Rod; - - internal override void SetChildEntity(ref PlungerStaticData staticData, Entity entity) - { - staticData.RodEntity = entity; - } - - protected override IEnumerable GetVertices(PlungerMeshGenerator meshGenerator, int frame) - { - return meshGenerator.BuildRodVertices(frame); - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerSpringMeshAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerSpringMeshAuthoring.cs index 62fce4b8b..58fdf8817 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerSpringMeshAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerSpringMeshAuthoring.cs @@ -32,15 +32,5 @@ public class PlungerSpringMeshAuthoring : PlungerMeshAuthoring public override IEnumerable ValidParents => ValidParentTypes; protected override string MeshId => PlungerMeshGenerator.Spring; - - internal override void SetChildEntity(ref PlungerStaticData staticData, Entity entity) - { - staticData.SpringEntity = entity; - } - - protected override IEnumerable GetVertices(PlungerMeshGenerator meshGenerator, int frame) - { - return meshGenerator.BuildSpringVertices(frame); - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticData.cs index 2ba17f5c4..d686a06ec 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerStaticData.cs @@ -20,11 +20,6 @@ namespace VisualPinball.Unity { internal struct PlungerStaticData : IComponentData { - // general - public Entity RodEntity; - public Entity SpringEntity; - public Entity FlatEntity; - // collision public float MomentumXfer; public float ScatterVelocity; diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerTransformationSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerTransformationSystem.cs index 68d67a8f7..2cecc5280 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerTransformationSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerTransformationSystem.cs @@ -17,7 +17,6 @@ using Unity.Entities; using Unity.Mathematics; using Unity.Profiling; -using Unity.Rendering; using UnityEngine; namespace VisualPinball.Unity @@ -26,27 +25,26 @@ namespace VisualPinball.Unity internal class PlungerTransformationSystem : SystemBase { private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("PlungerTransformationSystem"); - private static readonly int LerpPosition = Shader.PropertyToID("_LerpPosition"); - private static readonly int UVChannelVertices = Shader.PropertyToID("_UVChannelVertices"); - private static readonly int UVChannelNormals = Shader.PropertyToID("_UVChannelNormals"); + + private Player _player; + + protected override void OnStartRunning() + { + base.OnStartRunning(); + _player = Object.FindObjectOfType(); + } protected override void OnUpdate() { var marker = PerfMarker; - Entities.WithoutBurst().ForEach((Entity entity, ref PlungerAnimationData animationData, in RenderMesh renderMesh) => { - - if (!animationData.IsDirty) { - return; - } - animationData.IsDirty = false; + Entities.WithoutBurst().WithName("PlungerTransformationJob").ForEach((Entity entity, in PlungerAnimationData animationData) => { marker.Begin(); - var weight = math.clamp((float)animationData.CurrentFrame / animationData.NumFrames, 0, 1); - renderMesh.material.SetFloat(LerpPosition, weight); - renderMesh.material.SetFloat(UVChannelVertices, Engine.VPT.Mesh.AnimationUVChannelVertices); - renderMesh.material.SetFloat(UVChannelNormals, Engine.VPT.Mesh.AnimationUVChannelNormals); + foreach (var skinnedMeshRenderer in _player.PlungerSkinnedMeshRenderers[entity]) { + skinnedMeshRenderer.SetBlendShapeWeight(0, animationData.Position); + } marker.End(); }).Run(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerUvBufferElement.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerUvBufferElement.cs deleted file mode 100644 index bed5b2fc1..000000000 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerUvBufferElement.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Visual Pinball Engine -// Copyright (C) 2021 freezy and VPE Team -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using Unity.Entities; -using Unity.Mathematics; - -namespace VisualPinball.Unity -{ - [InternalBufferCapacity(1)] - internal struct PlungerUvBufferElement : IBufferElementData - { - public float2 Value; - - public PlungerUvBufferElement(float2 v) - { - Value = v; - } - } -} diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerUvBufferElement.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerUvBufferElement.cs.meta deleted file mode 100644 index 3d1565b22..000000000 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Plunger/PlungerUvBufferElement.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7b6e73a52d48cf04d87b79234f446827 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerAuthoring.cs index ddcf2b0d1..a622c20f2 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerAuthoring.cs @@ -61,6 +61,13 @@ public void Convert(Entity entity, EntityManager dstManager, GameObjectConversio Height = Data.Height }); + if (GetComponentInChildren()) { + dstManager.AddComponentData(entity, new SpinnerMovementData { + Angle = math.radians(math.clamp(0.0f, Data.AngleMin, Data.AngleMax)), + AngleSpeed = 0f + }); + } + // register transform.GetComponentInParent().RegisterSpinner(Item, entity, ParentEntity, gameObject); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerDisplacementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerDisplacementSystem.cs index 254cadab8..d263929cb 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerDisplacementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerDisplacementSystem.cs @@ -55,12 +55,10 @@ protected override void OnUpdate() Entities .WithName("SpinnerDisplacementJob") - .ForEach((Entity entity, in SpinnerStaticData data) => { + .ForEach((Entity entity, ref SpinnerMovementData movementData, in SpinnerStaticData data) => { marker.Begin(); - var movementData = GetComponent(data.PlateEntity); - // those are already converted to radian during authoring. var angleMin = data.AngleMin; var angleMax = data.AngleMax; @@ -121,8 +119,6 @@ protected override void OnUpdate() } } - SetComponent(data.PlateEntity, movementData); - marker.End(); }).Run(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerMovementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerMovementSystem.cs index 07e11f4fe..e2eeaef50 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerMovementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerMovementSystem.cs @@ -18,6 +18,7 @@ using Unity.Mathematics; using Unity.Profiling; using Unity.Transforms; +using UnityEngine; namespace VisualPinball.Unity { @@ -26,14 +27,22 @@ internal class SpinnerMovementSystem : SystemBase { private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("SpinnerMovementSystem"); + private Player _player; + + protected override void OnStartRunning() + { + base.OnStartRunning(); + _player = Object.FindObjectOfType(); + } + protected override void OnUpdate() { var marker = PerfMarker; - Entities.WithName("SpinnerMovementJob").ForEach((ref Rotation rot, in SpinnerMovementData movementData) => { + Entities.WithoutBurst().WithName("SpinnerMovementJob").ForEach((Entity entity, in SpinnerMovementData movementData) => { marker.Begin(); - rot.Value = quaternion.RotateX(-movementData.Angle); + _player.SpinnerPlateTransforms[entity].localRotation = quaternion.RotateX(-movementData.Angle); marker.End(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerPlateAnimationAuthoring.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerPlateAnimationAuthoring.cs index 7f4fd4b13..c5bd032ae 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerPlateAnimationAuthoring.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerPlateAnimationAuthoring.cs @@ -22,25 +22,8 @@ namespace VisualPinball.Unity { - public class SpinnerPlateAnimationAuthoring : ItemAnimationAuthoring, IConvertGameObjectToEntity + public class SpinnerPlateAnimationAuthoring : ItemAnimationAuthoring { public override IEnumerable ValidParents { get; } = new Type[0]; // animation components only apply to their own - - public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) - { - var spinnerEntity = MainEntity; - - // update parent - var spinnerStaticData = dstManager.GetComponentData(spinnerEntity); - spinnerStaticData.PlateEntity = entity; - dstManager.SetComponentData(spinnerEntity, spinnerStaticData); - - dstManager.AddComponentData(entity, new SpinnerMovementData { - Angle = math.radians(math.clamp(0.0f, Data.AngleMin, Data.AngleMax)), - AngleSpeed = 0f - }); - - LinkToParentEntity(entity, dstManager); - } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerStaticData.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerStaticData.cs index 5e307de84..2d2c4b737 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerStaticData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerStaticData.cs @@ -25,6 +25,6 @@ internal struct SpinnerStaticData : IComponentData public float Height; public float Damping; public float Elasticity; - public Entity PlateEntity; + //public Entity PlateEntity; } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerVelocitySystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerVelocitySystem.cs index 63fd27e29..7768dd619 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerVelocitySystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Spinner/SpinnerVelocitySystem.cs @@ -31,18 +31,14 @@ protected override void OnUpdate() var marker = PerfMarker; Entities .WithName("SpinnerVelocityJob") - .ForEach((in SpinnerStaticData data) => { + .ForEach((ref SpinnerMovementData movementData, in SpinnerStaticData data) => { marker.Begin(); - var movementData = GetComponent(data.PlateEntity); - // Center of gravity towards bottom of object, makes it stop vertical movementData.AngleSpeed -= math.sin(movementData.Angle) * (float)(0.0025 * PhysicsConstants.PhysFactor); movementData.AngleSpeed *= data.Damping; - SetComponent(data.PlateEntity, movementData); - marker.End(); }).Run(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceApi.cs index c3621a774..03fcb2c40 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SurfaceApi.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using Unity.Entities; +using Unity.Entities.CodeGeneratedJobForEach; using VisualPinball.Engine.VPT.Table; namespace VisualPinball.Unity @@ -55,6 +56,9 @@ internal SurfaceApi(Engine.VPT.Surface.Surface item, Entity entity, Entity paren void IApiColliderGenerator.CreateColliders(Table table, List colliders) { var colliderGenerator = new SurfaceColliderGenerator(this); + if (Data.DragPoints.Length == 0) { + return; + } colliderGenerator.GenerateColliders(table, colliders); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerMovementSystem.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerMovementSystem.cs index 7864b4993..a8b064390 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerMovementSystem.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trigger/TriggerMovementSystem.cs @@ -25,31 +25,30 @@ namespace VisualPinball.Unity [UpdateInGroup(typeof(TransformMeshesSystemGroup))] internal class TriggerMovementSystem : SystemBase { - private float4x4 _baseTransform; private static readonly ProfilerMarker PerfMarker = new ProfilerMarker("TriggerMovementSystem"); + private Player _player; + protected override void OnStartRunning() { - var root = Object.FindObjectOfType(); - var ltw = root.gameObject.transform.localToWorldMatrix; - _baseTransform = new float4x4( - ltw.m00, ltw.m01, ltw.m02, ltw.m03, - ltw.m10, ltw.m11, ltw.m12, ltw.m13, - ltw.m20, ltw.m21, ltw.m22, ltw.m23, - ltw.m30, ltw.m31, ltw.m32, ltw.m33 - ); + base.OnStartRunning(); + _player = Object.FindObjectOfType(); } protected override void OnUpdate() { - var ltw = _baseTransform; var marker = PerfMarker; - Entities.WithName("TriggerMovementJob").ForEach((ref Translation translation, in TriggerMovementData data) => { + + Entities.WithoutBurst().WithName("TriggerMovementJob").ForEach((Entity entity, in TriggerMovementData data) => { marker.Begin(); - var t = math.transform(math.inverse(ltw), translation.Value); - translation.Value = math.transform(ltw, new float3(t.x, t.y, data.HeightOffset)); + var localPos = _player.TriggerTransforms[entity].transform.localPosition; + _player.TriggerTransforms[entity].transform.localPosition= new Vector3( + localPos.x, + localPos.y, + data.HeightOffset + ); marker.End(); diff --git a/package.json b/package.json index c834ff457..1edef8a4e 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "com.unity.burst": "1.4.4", "com.unity.collections": "0.15.0-preview.21", "com.unity.entities": "0.17.0-preview.41", - "com.unity.rendering.hybrid": "0.11.0-preview.42", "com.unity.jobs": "0.8.0-preview.23", "com.unity.mathematics": "1.2.1", "com.unity.inputsystem": "1.0.2",