From e60ecf7ad4f217c50756482da640d6f95ce02597 Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 4 Oct 2021 23:20:54 +0200 Subject: [PATCH 01/58] lights: Add separate prefab for inserts. --- VisualPinball.Engine/VPT/Light/Light.cs | 3 + .../Resources/Prefabs/Light (Builtin).prefab | 165 ++++++++------ .../Prefabs/Light (Builtin).prefab.meta | 2 +- .../Prefabs/Light - Insert (Builtin).prefab | 207 ++++++++++++++++++ .../Light - Insert (Builtin).prefab.meta | 7 + .../Import/VpxSceneConverter.cs | 2 +- .../VPT/Light/LightExtensions.cs | 7 +- .../Rendering/IPrefabProvider.cs | 6 + .../Standard/StandardPrefabProvider.cs | 52 +++-- .../VPT/Light/LightComponent.cs | 18 +- .../VPT/Light/LightInsertMeshComponent.cs | 12 +- 11 files changed, 376 insertions(+), 105 deletions(-) create mode 100644 VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab create mode 100644 VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab.meta diff --git a/VisualPinball.Engine/VPT/Light/Light.cs b/VisualPinball.Engine/VPT/Light/Light.cs index 3da93a154..fcf4a024c 100644 --- a/VisualPinball.Engine/VPT/Light/Light.cs +++ b/VisualPinball.Engine/VPT/Light/Light.cs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using System; using System.IO; using VisualPinball.Engine.Game; using VisualPinball.Engine.Math; @@ -29,6 +30,8 @@ public class Light : Item, IRenderable private readonly LightMeshGenerator _meshGenerator; + public bool IsInsertLight(Table.Table table) => !Data.ShowBulbMesh && string.Equals(Data.OffImage, table.Data.Image, StringComparison.OrdinalIgnoreCase); + public Light(LightData data) : base(data) { _meshGenerator = new LightMeshGenerator(Data); diff --git a/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab b/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab index 9e8f3718f..31b06c212 100644 --- a/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab +++ b/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab @@ -9,8 +9,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 2649789736405374282} - - component: {fileID: -7726742479185607768} - - component: {fileID: 8134916103503386669} + - component: {fileID: 4750229237398323307} m_Layer: 0 m_Name: Light (Builtin) m_TagString: Untagged @@ -31,10 +30,11 @@ Transform: m_Children: - {fileID: 3878378365098062784} - {fileID: 6343396272821131885} + - {fileID: 4222681214933490337} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &-7726742479185607768 +--- !u!114 &4750229237398323307 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -58,68 +58,6 @@ MonoBehaviour: BlinkInterval: 0 FadeSpeedUp: 0 FadeSpeedDown: 0 ---- !u!108 &8134916103503386669 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 550864702806823459} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 2 - m_Shape: 0 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 47.746483 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 0 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 2 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 1 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 --- !u!1 &3112338884683058496 GameObject: m_ObjectHideFlags: 0 @@ -147,7 +85,7 @@ Transform: m_GameObject: {fileID: 3112338884683058496} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 20, y: 20, z: 20} m_Children: [] m_Father: {fileID: 2649789736405374282} m_RootOrder: 0 @@ -228,7 +166,7 @@ Transform: m_GameObject: {fileID: 6207005947276562095} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 20, y: 20, z: 20} m_Children: [] m_Father: {fileID: 2649789736405374282} m_RootOrder: 1 @@ -282,3 +220,96 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &7031967719973800860 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4222681214933490337} + - component: {fileID: 1799189321192003275} + m_Layer: 0 + m_Name: Source + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4222681214933490337 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7031967719973800860} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.09030962, y: 0.026130915, z: 0.6205269} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2649789736405374282} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &1799189321192003275 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7031967719973800860} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 47.746483 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 2 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 1 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 diff --git a/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab.meta b/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab.meta index 00e8b1d56..777e6675b 100644 --- a/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab.meta +++ b/VisualPinball.Unity/Assets/Resources/Prefabs/Light (Builtin).prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 24c87dc2ea2263b48b6be1b03f90eb88 +guid: b689c951e6196b44aa743ee7e633846a PrefabImporter: externalObjects: {} userData: diff --git a/VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab b/VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab new file mode 100644 index 000000000..473957ee1 --- /dev/null +++ b/VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab @@ -0,0 +1,207 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &550864702806823459 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2649789736405374282} + - component: {fileID: 4750229237398323307} + m_Layer: 0 + m_Name: Light - Insert (Builtin) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2649789736405374282 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 550864702806823459} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 179995335602121591} + - {fileID: 4222681214933490337} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4750229237398323307 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 550864702806823459} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9e53d77b7d585c94b89513d95571354e, type: 3} + m_Name: + m_EditorClassIdentifier: + _isLocked: 0 + _editorLayer: 0 + _editorLayerName: + _editorLayerVisibility: 1 + Position: {x: 0, y: 0, z: 0} + _surface: {fileID: 0} + BulbSize: 20 + State: 0 + BlinkPattern: + BlinkInterval: 0 + FadeSpeedUp: 0 + FadeSpeedDown: 0 +--- !u!1 &5987759878404274838 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 179995335602121591} + - component: {fileID: 4762606870770787496} + - component: {fileID: 5251209611439210537} + m_Layer: 0 + m_Name: Insert + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &179995335602121591 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5987759878404274838} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0, y: -0, z: 0.1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2649789736405374282} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4762606870770787496 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5987759878404274838} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2a11a120b7da4b4db6fd330516311db, type: 3} + m_Name: + m_EditorClassIdentifier: + InsertHeight: 20 + PositionZ: 0.1 + _dragPoints: [] +--- !u!33 &5251209611439210537 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5987759878404274838} + m_Mesh: {fileID: 0} +--- !u!1 &7031967719973800860 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4222681214933490337} + - component: {fileID: 1799189321192003275} + m_Layer: 0 + m_Name: Source + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4222681214933490337 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7031967719973800860} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -50} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2649789736405374282} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &1799189321192003275 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7031967719973800860} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 0 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 462.10742 + m_Range: 0.1 + m_SpotAngle: 75 + m_InnerSpotAngle: 1 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 2 + m_AreaSize: {x: 0.5, y: 0.5} + m_BounceIntensity: 1 + m_ColorTemperature: 2700 + m_UseColorTemperature: 1 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0.01 + m_ShadowAngle: 0 diff --git a/VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab.meta b/VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab.meta new file mode 100644 index 000000000..25e88cf22 --- /dev/null +++ b/VisualPinball.Unity/Assets/Resources/Prefabs/Light - Insert (Builtin).prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d51e304383510344c8e8029ec59eeebc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs index 146fb2b48..0ca1aa533 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs @@ -327,7 +327,7 @@ private IVpxPrefab InstantiatePrefab(IItem item) case Gate gate: return gate.InstantiatePrefab(); case HitTarget hitTarget: return hitTarget.InstantiatePrefab(); case Kicker kicker: return kicker.InstantiatePrefab(); - case Light lt: return lt.InstantiatePrefab(); + case Light lt: return lt.InstantiatePrefab(_sourceTable); case Plunger plunger: return plunger.InstantiatePrefab(); case Primitive primitive: return primitive.InstantiatePrefab(_playfieldGo); case Ramp ramp: return ramp.InstantiatePrefab(); diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightExtensions.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightExtensions.cs index fa8974bf4..ba3152d42 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightExtensions.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightExtensions.cs @@ -15,14 +15,17 @@ // along with this program. If not, see . using VisualPinball.Engine.VPT.Light; +using VisualPinball.Engine.VPT.Table; namespace VisualPinball.Unity.Editor { public static class LightExtensions { - internal static IVpxPrefab InstantiatePrefab(this Light light) + internal static IVpxPrefab InstantiatePrefab(this Light light, Table table) { - var prefab = RenderPipeline.Current.PrefabProvider.CreateLight(); + var prefab = light.IsInsertLight(table) + ? RenderPipeline.Current.PrefabProvider.CreateInsertLight() + : RenderPipeline.Current.PrefabProvider.CreateLight(); return new VpxPrefab(prefab, light); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/IPrefabProvider.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/IPrefabProvider.cs index 1692db5cd..751eccc77 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/IPrefabProvider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/IPrefabProvider.cs @@ -51,6 +51,12 @@ public interface IPrefabProvider /// Prefab of the light (still needs to be instantiated) GameObject CreateLight(); + /// + /// Creates an insert light prefab. + /// + /// Prefab of the light (still needs to be instantiated) + GameObject CreateInsertLight(); + /// /// Creates a spinner prefab. /// diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardPrefabProvider.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardPrefabProvider.cs index 6b6780a53..79085f635 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardPrefabProvider.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardPrefabProvider.cs @@ -24,19 +24,19 @@ public class StandardPrefabProvider : IPrefabProvider { public GameObject CreateBumper() { - return UnityEngine.Resources.Load("Prefabs/Bumper (Builtin)"); + return Resources.Load("Prefabs/Bumper (Builtin)"); } public GameObject CreateGate(int type) { switch (type) { case GateType.GateLongPlate: - return UnityEngine.Resources.Load("Prefabs/Gate - Long Plate (Builtin)"); + return Resources.Load("Prefabs/Gate - Long Plate (Builtin)"); case GateType.GatePlate: - return UnityEngine.Resources.Load("Prefabs/Gate - Plate (Builtin)"); + return Resources.Load("Prefabs/Gate - Plate (Builtin)"); case GateType.GateWireRectangle: - return UnityEngine.Resources.Load("Prefabs/Gate - Wire Rectangle (Builtin)"); + return Resources.Load("Prefabs/Gate - Wire Rectangle (Builtin)"); case GateType.GateWireW: - return UnityEngine.Resources.Load("Prefabs/Gate - Wire W (Builtin)"); + return Resources.Load("Prefabs/Gate - Wire W (Builtin)"); default: throw new ArgumentException(nameof(type), $"Unknown gate type {type}."); } @@ -46,48 +46,54 @@ public GameObject CreateKicker(int type) { switch (type) { case KickerType.KickerCup: - return UnityEngine.Resources.Load("Prefabs/Kicker - Cup (Builtin)"); + return Resources.Load("Prefabs/Kicker - Cup (Builtin)"); case KickerType.KickerCup2: - return UnityEngine.Resources.Load("Prefabs/Kicker - Cup 2 (Builtin)"); + return Resources.Load("Prefabs/Kicker - Cup 2 (Builtin)"); case KickerType.KickerGottlieb: - return UnityEngine.Resources.Load("Prefabs/Kicker - Gottlieb (Builtin)"); + return Resources.Load("Prefabs/Kicker - Gottlieb (Builtin)"); case KickerType.KickerHole: - return UnityEngine.Resources.Load("Prefabs/Kicker - Hole (Builtin)"); + return Resources.Load("Prefabs/Kicker - Hole (Builtin)"); case KickerType.KickerHoleSimple: - return UnityEngine.Resources.Load("Prefabs/Kicker - Simple Hole (Builtin)"); + return Resources.Load("Prefabs/Kicker - Simple Hole (Builtin)"); case KickerType.KickerWilliams: - return UnityEngine.Resources.Load("Prefabs/Kicker - Williams (Builtin)"); + return Resources.Load("Prefabs/Kicker - Williams (Builtin)"); case KickerType.KickerInvisible: - return UnityEngine.Resources.Load("Prefabs/Kicker - Invisible (Builtin)"); + return Resources.Load("Prefabs/Kicker - Invisible (Builtin)"); default: throw new ArgumentException(nameof(type), $"Unknown kicker type {type}."); } } + public GameObject CreateLight() { - return UnityEngine.Resources.Load("Prefabs/Light (Builtin)"); + return Resources.Load("Prefabs/Light (Builtin)"); + } + + public GameObject CreateInsertLight() + { + return Resources.Load("Prefabs/Light - Insert (Builtin)"); } public GameObject CreateSpinner() { - return UnityEngine.Resources.Load("Prefabs/Spinner (Builtin)"); + return Resources.Load("Prefabs/Spinner (Builtin)"); } public GameObject CreateHitTarget(int type) { switch (type) { case TargetType.HitFatTargetRectangle: - return UnityEngine.Resources.Load("Prefabs/Hit Target - Rectangle Fat (Builtin)"); + return Resources.Load("Prefabs/Hit Target - Rectangle Fat (Builtin)"); case TargetType.HitFatTargetSlim: - return UnityEngine.Resources.Load("Prefabs/Hit Target - Rectangle Fat Narrow (Builtin)"); + return Resources.Load("Prefabs/Hit Target - Rectangle Fat Narrow (Builtin)"); case TargetType.HitFatTargetSquare: - return UnityEngine.Resources.Load("Prefabs/Hit Target - Square Fat (Builtin)"); + return Resources.Load("Prefabs/Hit Target - Square Fat (Builtin)"); case TargetType.HitTargetRectangle: - return UnityEngine.Resources.Load("Prefabs/Hit Target - Rectangle (Builtin)"); + return Resources.Load("Prefabs/Hit Target - Rectangle (Builtin)"); case TargetType.HitTargetRound: - return UnityEngine.Resources.Load("Prefabs/Hit Target - Round (Builtin)"); + return Resources.Load("Prefabs/Hit Target - Round (Builtin)"); case TargetType.HitTargetSlim: - return UnityEngine.Resources.Load("Prefabs/Hit Target - Narrow (Builtin)"); + return Resources.Load("Prefabs/Hit Target - Narrow (Builtin)"); default: throw new ArgumentException(nameof(type), $"Unknown hit target type {type}."); } @@ -97,11 +103,11 @@ public GameObject CreateDropTarget(int type) { switch (type) { case TargetType.DropTargetBeveled: - return UnityEngine.Resources.Load("Prefabs/Drop Target - Beveled (Builtin)"); + return Resources.Load("Prefabs/Drop Target - Beveled (Builtin)"); case TargetType.DropTargetFlatSimple: - return UnityEngine.Resources.Load("Prefabs/Drop Target - Simple Flat (Builtin)"); + return Resources.Load("Prefabs/Drop Target - Simple Flat (Builtin)"); case TargetType.DropTargetSimple: - return UnityEngine.Resources.Load("Prefabs/Drop Target - Simple (Builtin)"); + return Resources.Load("Prefabs/Drop Target - Simple (Builtin)"); default: throw new ArgumentException(nameof(type), $"Unknown drop target type {type}."); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs index 455d4eaca..216b5c10b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs @@ -155,10 +155,12 @@ private void Awake() player.RegisterLamp(this); _unityLight = GetComponentInChildren(); - _fullIntensity = _unityLight.intensity; + if (_unityLight) { + _fullIntensity = _unityLight.intensity; + } } - public void FadeTo(float seconds, float value) + public void FadeTo(float value) { StopAllCoroutines(); StartCoroutine(nameof(Fade), value); @@ -225,18 +227,18 @@ public override IEnumerable SetData(LightData data) FadeSpeedUp = data.FadeSpeedUp; FadeSpeedDown = data.FadeSpeedDown; - // physical params - var unityLight = GetComponentInChildren(true); - if (unityLight) { - RenderPipeline.Current.LightConverter.UpdateLight(unityLight, data); - } - // insert mesh var insertMeshComponent = GetComponentInChildren(); if (insertMeshComponent) { insertMeshComponent.DragPoints = data.DragPoints; } + // physical params + var unityLight = GetComponentInChildren(true); + if (unityLight) { + RenderPipeline.Current.LightConverter.UpdateLight(unityLight, data, insertMeshComponent); + } + return updatedComponents; } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs index 3ca2c0abc..a4ce628d5 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs @@ -42,8 +42,6 @@ public class LightInsertMeshComponent : MeshComponent #endregion - public const string InsertObjectName = "Insert"; - public override IEnumerable ValidParents => Type.EmptyTypes; protected override Mesh GetMesh(LightData data) @@ -56,6 +54,14 @@ protected override Mesh GetMesh(LightData data) } protected override PbrMaterial GetMaterial(LightData data, Table table) - => new PbrMaterial(table.GetMaterial(table.Data.PlayfieldMaterial), table.GetTexture(table.Data.Image)); + { + var mat = table.GetMaterial(table.Data.PlayfieldMaterial); + if (mat != null) { + mat.Name += " (Playfield Insert)"; + } else { + mat = new Engine.VPT.Material("Playfield Insert"); + } + return new PbrMaterial(mat, table.GetTexture(table.Data.Image)); + } } } From 4f52e6df91725fb294d4054250741ca3ffc9af43 Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 4 Oct 2021 23:25:16 +0200 Subject: [PATCH 02/58] patcher: Position some of T2's insert lights. --- VisualPinball.Engine/VPT/Material.cs | 2 + .../VPT/TransformInspector.cs | 2 +- .../Patcher/Tables/Terminator2.cs | 123 ++++++++++++++++++ .../Rendering/ILightConverter.cs | 26 +++- .../Standard/StandardLightConverter.cs | 18 ++- .../VisualPinball.Unity/VPT/Light/LightApi.cs | 4 +- 6 files changed, 170 insertions(+), 5 deletions(-) diff --git a/VisualPinball.Engine/VPT/Material.cs b/VisualPinball.Engine/VPT/Material.cs index 0fad356e9..5f18d0be8 100644 --- a/VisualPinball.Engine/VPT/Material.cs +++ b/VisualPinball.Engine/VPT/Material.cs @@ -16,6 +16,7 @@ #region ReSharper // ReSharper disable FieldCanBeMadeReadOnly.Global +// ReSharper disable InconsistentNaming #endregion using System; @@ -140,6 +141,7 @@ public Material(string name) : this() BaseColor = new Color(255, 255, 255, 255); Glossiness = new Color(0, 0, 0, 255); ClearCoat = new Color(0, 0, 0, 255); + Opacity = 1f; UpdateData(); } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/TransformInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/TransformInspector.cs index ceefc9fdb..6548edc05 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/TransformInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/TransformInspector.cs @@ -71,8 +71,8 @@ protected virtual void OnEnable() var item = itemTransform.GetComponent(); - useDefault = useDefault && itemTransform.GetComponentInParent() == null; _itemSelected = itemTransform.GetComponent() != null; + useDefault = useDefault && !_itemSelected && itemTransform.GetComponent() == null; // must be main but not the table itself if (item != null && !(item is TableComponent)) { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 2e9d8cea3..e87ecc7bd 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -15,10 +15,15 @@ // along with this program. If not, see . // ReSharper disable StringLiteralTypo +// ReSharper disable InconsistentNaming +// ReSharper disable UnusedMember.Global + +using UnityEngine; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Terminator 2 (Williams 1991)", AuthorName = "NFOZZY")] + [MetaMatch(TableName = "Terminator 2 - Judgment Day (Williams 1991)", AuthorName = "g5k")] public class Terminator2 { [NameMatch("LeftRampCover")] @@ -48,5 +53,123 @@ public void FixSw17(KickerComponent kickerComponent) kickerComponent.Coils[0].Speed = 5; kickerComponent.Coils[0].Angle = 60; } + + + #region Lights + + [NameMatch("L61")] + [NameMatch("L62")] + [NameMatch("L63")] + [NameMatch("L64")] + [NameMatch("L65")] + public void LeftYellowRound(GameObject go) + { + LightPos(go, -4.3f, -18.2f, -50f); + LightColor(go, Color.yellow); + } + + [NameMatch("L71")] + [NameMatch("L72")] + [NameMatch("L73")] + [NameMatch("L74")] + [NameMatch("L75")] + public void RightYellowRound(GameObject go) + { + LightPos(go, 2.6f, -15.9f, -50f); + LightColor(go, Color.yellow); + } + + [NameMatch("L53")] + [NameMatch("L54")] + [NameMatch("L55")] + [NameMatch("L56")] + [NameMatch("L57")] + [NameMatch("L58")] + public void RightRedRect(GameObject go) + { + LightPos(go, 8.5f, -11.7f, -50f); + SpotAngle(go, 122f, 48f); + Intensity(go, 4500f); + } + + [NameMatch("L11")] + [NameMatch("L12")] + [NameMatch("L14")] + [NameMatch("L15")] + public void InsertMultipliers(GameObject go) + { + SpotAngle(go, 96.4f, 47.8f); + Intensity(go, 3400f); + } + + [NameMatch("L11")] public void Insert2xPos(GameObject go) => LightPos(go, 28.6f, 9.6f, -50f); + [NameMatch("L12")] public void Insert4xPos(GameObject go) => LightPos(go, 22.4f, 25.1f, -50f); + [NameMatch("L13")] public void InsertHoldBonus(GameObject go) + { + SpotAngle(go, 96.4f, 47.8f); + LightPos(go, 0f, 35f, -50f); + Intensity(go, 1850f); + } + [NameMatch("L14")] public void Insert6xPos(GameObject go) => LightPos(go, -24.7f, 25.1f, -50f); + [NameMatch("L15")] public void Insert8xPos(GameObject go) => LightPos(go, -31.3f, 10.7f, -50f); + + [NameMatch("F117")] + public void AutoFire(GameObject go) + { + SpotAngle(go, 70f, 15f); + Intensity(go, 4000f); + + LightPos(go, -52f, 3.3f, -50f); + Duplicate(go, -18f, 0f, -50f); + Duplicate(go, 16f, 0f, -50f); + Duplicate(go, 52f, 3.3f, -50f); + } + + #region Helpers + + private static void LightColor(GameObject go, Color color) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SetColor(light, color); + } + } + + private static void SpotAngle(GameObject go, float outer, float inner) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SpotLight(light, outer, inner); + } + } + + private static void Intensity(GameObject go, float intensityLumen) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SetIntensity(light, intensityLumen); + } + } + + private static void LightPos(GameObject go, float x, float y, float z) + { + var light = go.GetComponentInChildren(); + if (light != null) { + light.gameObject.transform.localPosition = new Vector3(x, y, z); + } + } + + private static void Duplicate(GameObject go, float x, float y, float z) + { + var light = go.GetComponentInChildren(); + if (light != null) { + var newGo = Object.Instantiate(light.gameObject, go.transform, true); + newGo.transform.localPosition = new Vector3(x, y, z); + } + } + + #endregion + + #endregion } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs index 77116cd77..3facf1021 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using UnityEngine; using VisualPinball.Engine.VPT.Light; using Light = UnityEngine.Light; @@ -29,6 +30,29 @@ public interface ILightConverter /// /// Which light to update /// VPX light data - void UpdateLight(Light light, LightData data); + /// If set, light is an insert. + void UpdateLight(Light light, LightData data, bool isInsert); + + /// + /// Sets the color of a given light. + /// + /// Which light to update + /// New color + void SetColor(Light light, Color color); + + /// + /// Sets the intensity of a given light. + /// + /// Which light to update + /// Intensity in Lumen + void SetIntensity(Light light, float intensityLumen); + + /// + /// Sets the spotlight parameters of a light (doesn't set it to spotlight) + /// + /// Which light to update + /// Outer angle + /// Inner angle in percent of outer angle + void SpotLight(Light light, float outer, float innerPercent); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs index ea000fc07..2755d10d0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs @@ -25,7 +25,7 @@ namespace VisualPinball.Unity { public class StandardLightConverter : ILightConverter { - public void UpdateLight(Light light, LightData data) + public void UpdateLight(Light light, LightData data, bool isInsert) { // Set color and position light.color = data.Color2.ToUnityColor(); @@ -39,5 +39,21 @@ public void UpdateLight(Light light, LightData data) light.shadowBias = 0f; light.shadowNearPlane = 0f; } + + public void SetColor(Light light, Color color) + { + light.color = color; + } + + public void SetIntensity(Light light, float intensityLumen) + { + light.intensity = intensityLumen; + } + + public void SpotLight(Light light, float outer, float innerPercent) + { + light.spotAngle = outer; + light.innerSpotAngle = outer * innerPercent * 0.01f; + } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs index 428a61dec..cebddbb21 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs @@ -93,7 +93,7 @@ private void Set(int lightStatus, float value) switch (lightStatus) { case LightStatus.LightStateOff: { if (MainComponent.FadeSpeedDown > 0) { - _lightComponent.FadeTo(MainComponent.FadeSpeedDown, 0); + _lightComponent.FadeTo(0); } else { _lightComponent.Enabled = false; @@ -103,7 +103,7 @@ private void Set(int lightStatus, float value) case LightStatus.LightStateOn: { if (MainComponent.FadeSpeedUp > 0) { - _lightComponent.FadeTo(MainComponent.FadeSpeedUp, value); + _lightComponent.FadeTo(value); } else { _lightComponent.Enabled = true; From 6f908d6cf0cf183d733bfa5fbef8e3444968ed32 Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 4 Oct 2021 23:39:08 +0200 Subject: [PATCH 03/58] editor: Fix lamps mapping not being persisted. --- .../VisualPinball.Unity/Mappings/LampMapping.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs index 222a5fc8e..02e19c198 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs @@ -17,6 +17,7 @@ // ReSharper disable InconsistentNaming using System; +using UnityEngine; namespace VisualPinball.Unity { @@ -29,7 +30,9 @@ public class LampMapping public string Description = string.Empty; - public ILampDeviceComponent Device; + [SerializeReference] + public MonoBehaviour _device; + public ILampDeviceComponent Device { get => _device as ILampDeviceComponent; set => _device = value as MonoBehaviour; } public string DeviceItem = string.Empty; From 8de5bb6a3c0ee75fa9ac6e537cfb68c93335060d Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 4 Oct 2021 23:44:40 +0200 Subject: [PATCH 04/58] editor: Match lamps case insensitively. --- .../VisualPinball.Unity/Mappings/MappingConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index be3a8ab5e..af91b5232 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -460,7 +460,7 @@ private static ILampDeviceComponent GuessLampDevice(ILampDeviceComponent[] lamps ? $"l{numericLampId}" : engineLamp.Id; - return lamps.FirstOrDefault(l => l.name == matchKey); + return lamps.FirstOrDefault(l => string.Equals(l.name, matchKey, StringComparison.OrdinalIgnoreCase)); } private static GamelogicEngineLamp GuessLampDeviceItem(GamelogicEngineLamp engineLamp, ILampDeviceComponent device) From 8fe1473b3d68a93687d3f02d8856abf2d631aa84 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 5 Oct 2021 00:19:34 +0200 Subject: [PATCH 05/58] lamps: Fix exiting loop after first unmapped entry. Also turns off lamps on start. --- .../Patcher/Tables/Terminator2.cs | 78 ++++++++++--------- .../VisualPinball.Unity/Game/LampPlayer.cs | 4 +- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index e87ecc7bd..10552e204 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -57,41 +57,6 @@ public void FixSw17(KickerComponent kickerComponent) #region Lights - [NameMatch("L61")] - [NameMatch("L62")] - [NameMatch("L63")] - [NameMatch("L64")] - [NameMatch("L65")] - public void LeftYellowRound(GameObject go) - { - LightPos(go, -4.3f, -18.2f, -50f); - LightColor(go, Color.yellow); - } - - [NameMatch("L71")] - [NameMatch("L72")] - [NameMatch("L73")] - [NameMatch("L74")] - [NameMatch("L75")] - public void RightYellowRound(GameObject go) - { - LightPos(go, 2.6f, -15.9f, -50f); - LightColor(go, Color.yellow); - } - - [NameMatch("L53")] - [NameMatch("L54")] - [NameMatch("L55")] - [NameMatch("L56")] - [NameMatch("L57")] - [NameMatch("L58")] - public void RightRedRect(GameObject go) - { - LightPos(go, 8.5f, -11.7f, -50f); - SpotAngle(go, 122f, 48f); - Intensity(go, 4500f); - } - [NameMatch("L11")] [NameMatch("L12")] [NameMatch("L14")] @@ -113,6 +78,14 @@ public void InsertMultipliers(GameObject go) [NameMatch("L14")] public void Insert6xPos(GameObject go) => LightPos(go, -24.7f, 25.1f, -50f); [NameMatch("L15")] public void Insert8xPos(GameObject go) => LightPos(go, -31.3f, 10.7f, -50f); + [NameMatch("L15")] + public void BallSave(GameObject go) + { + LightPos(go, 0, -19.6f, -50f); + SpotAngle(go, 64f, 67f); + Intensity(go, 1200f); + } + [NameMatch("F117")] public void AutoFire(GameObject go) { @@ -125,6 +98,41 @@ public void AutoFire(GameObject go) Duplicate(go, 52f, 3.3f, -50f); } + [NameMatch("L53")] + [NameMatch("L54")] + [NameMatch("L55")] + [NameMatch("L56")] + [NameMatch("L57")] + [NameMatch("L58")] + public void RightRedRect(GameObject go) + { + LightPos(go, 8.5f, -11.7f, -50f); + SpotAngle(go, 122f, 48f); + Intensity(go, 4500f); + } + + [NameMatch("L61")] + [NameMatch("L62")] + [NameMatch("L63")] + [NameMatch("L64")] + [NameMatch("L65")] + public void LeftYellowRound(GameObject go) + { + LightPos(go, -4.3f, -18.2f, -50f); + LightColor(go, Color.yellow); + } + + [NameMatch("L71")] + [NameMatch("L72")] + [NameMatch("L73")] + [NameMatch("L74")] + [NameMatch("L75")] + public void RightYellowRound(GameObject go) + { + LightPos(go, 2.6f, -15.9f, -50f); + LightColor(go, Color.yellow); + } + #region Helpers private static void LightColor(GameObject go, Color color) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs index cfa7fc4ca..2848f4366 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs @@ -53,7 +53,7 @@ public void OnStart() if (lampMapping.Device == null) { Logger.Warn($"Ignoring unassigned lamp \"{lampMapping.Id}\"."); - break; + continue; } AssignLampMapping(lampMapping.Id, lampMapping); @@ -67,6 +67,8 @@ public void OnStart() } } + // turn it off + _lamps[lampMapping.Device].OnLamp(0f, ColorChannel.Alpha); } if (_lampAssignments.Count > 0) { From f6abb7a19b4cfddeb68f6baa61e3ac70593210d5 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 5 Oct 2021 23:43:54 +0200 Subject: [PATCH 06/58] dmd: Add emission node. --- .../Display/DotMatrixDisplayGraph.shadergraph | 410 +++++++++++++++++- .../Inspectors/DotMatrixDisplayInspector.cs | 8 + .../Display/DotMatrixDisplayComponent.cs | 14 + 3 files changed, 419 insertions(+), 13 deletions(-) diff --git a/VisualPinball.Unity/Assets/Shaders/Srp/Display/DotMatrixDisplayGraph.shadergraph b/VisualPinball.Unity/Assets/Shaders/Srp/Display/DotMatrixDisplayGraph.shadergraph index b90e6d284..258f5cb91 100644 --- a/VisualPinball.Unity/Assets/Shaders/Srp/Display/DotMatrixDisplayGraph.shadergraph +++ b/VisualPinball.Unity/Assets/Shaders/Srp/Display/DotMatrixDisplayGraph.shadergraph @@ -17,6 +17,9 @@ }, { "m_Id": "355af990f31d4b91969f5a1d85c0e524" + }, + { + "m_Id": "1fcaaabba6354a7ea01b55bbb16087d6" } ], "m_Keywords": [], @@ -83,6 +86,15 @@ }, { "m_Id": "3930f3e174464ad483bf5dfc32f941dd" + }, + { + "m_Id": "c0ef6eda9aa241c089a8c97ea98ccd35" + }, + { + "m_Id": "3e559fc89f98495daa87f9a9a83c3e6d" + }, + { + "m_Id": "43b86669fec34ffebed1498171e47274" } ], "m_GroupDatas": [], @@ -97,7 +109,21 @@ }, "m_InputSlot": { "m_Node": { - "m_Id": "5e3f39ce35b74ffcb64ad89380f95b94" + "m_Id": "3e559fc89f98495daa87f9a9a83c3e6d" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "386fcbc47636417199e958b1ab89b4b7" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c0ef6eda9aa241c089a8c97ea98ccd35" }, "m_SlotId": 0 } @@ -133,17 +159,45 @@ { "m_OutputSlot": { "m_Node": { - "m_Id": "915771b37c834feb95561bee0773591f" + "m_Id": "3e559fc89f98495daa87f9a9a83c3e6d" }, "m_SlotId": 0 }, "m_InputSlot": { "m_Node": { - "m_Id": "5989918dd1294dc48c01714e8dab3238" + "m_Id": "5e3f39ce35b74ffcb64ad89380f95b94" }, "m_SlotId": 0 } }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "43b86669fec34ffebed1498171e47274" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3e559fc89f98495daa87f9a9a83c3e6d" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "915771b37c834feb95561bee0773591f" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c0ef6eda9aa241c089a8c97ea98ccd35" + }, + "m_SlotId": 1 + } + }, { "m_OutputSlot": { "m_Node": { @@ -256,6 +310,20 @@ "m_SlotId": 3 } }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c0ef6eda9aa241c089a8c97ea98ccd35" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "5989918dd1294dc48c01714e8dab3238" + }, + "m_SlotId": 0 + } + }, { "m_OutputSlot": { "m_Node": { @@ -315,8 +383,8 @@ ], "m_VertexContext": { "m_Position": { - "x": 10.66672134399414, - "y": -948.6666259765625 + "x": 154.66656494140626, + "y": -1156.0001220703125 }, "m_Blocks": [ { @@ -332,8 +400,8 @@ }, "m_FragmentContext": { "m_Position": { - "x": 10.66672134399414, - "y": -560.0 + "x": 155.33334350585938, + "y": -629.3334350585938 }, "m_Blocks": [ { @@ -513,6 +581,53 @@ "m_BareResource": false } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "1f7989ec260f4a26931027a955db33f0", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "1fcaaabba6354a7ea01b55bbb16087d6", + "m_Guid": { + "m_GuidSerialized": "9acb2d53-46b0-4fad-a7c2-5414a709d865" + }, + "m_Name": "Emission", + "m_DefaultReferenceName": "Vector1_1fcaaabba6354a7ea01b55bbb16087d6", + "m_OverrideReferenceName": "__Emission", + "m_GeneratePropertyBlock": true, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_Value": 1.0, + "m_FloatType": 0, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", @@ -528,6 +643,21 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "322004d512c142f29eaaf7eb579ffc83", + "m_Id": 2, + "m_DisplayName": "Intensity", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Intensity", + "m_StageCapability": 3, + "m_Value": 800.0, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.BlockNode", @@ -644,9 +774,9 @@ "m_Expanded": true, "m_Position": { "serializedVersion": "2", - "x": -444.6667785644531, - "y": -948.6666870117188, - "width": 214.6666717529297, + "x": -510.6667785644531, + "y": -958.0001220703125, + "width": 208.0, "height": 374.0 } }, @@ -743,6 +873,49 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.HighDefinition.EmissionNode", + "m_ObjectId": "3e559fc89f98495daa87f9a9a83c3e6d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Emission Node", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -171.33328247070313, + "y": -906.0000610351563, + "width": 229.3333282470703, + "height": 186.0 + } + }, + "m_Slots": [ + { + "m_Id": "80c5b8e752414a589e157a082c1876f0" + }, + { + "m_Id": "322004d512c142f29eaaf7eb579ffc83" + }, + { + "m_Id": "751e5e2717a84b6e95e1d013224de5bf" + }, + { + "m_Id": "a718235381784603bb6c139dea579167" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "_intensityUnit": 0, + "m_NormalizeColor": false +} + { "m_SGVersion": 1, "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", @@ -766,6 +939,41 @@ } } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "43b86669fec34ffebed1498171e47274", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -1722.666748046875, + "y": -503.3332824707031, + "width": 125.33338165283203, + "height": 34.000003814697269 + } + }, + "m_Slots": [ + { + "m_Id": "f15c0863146c4d569fb25b836a2cacc2" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "1fcaaabba6354a7ea01b55bbb16087d6" + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Texture2DInputMaterialSlot", @@ -1083,6 +1291,21 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "751e5e2717a84b6e95e1d013224de5bf", + "m_Id": 3, + "m_DisplayName": "Exposure Weight", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Exposure Weight", + "m_StageCapability": 3, + "m_Value": 0.800000011920929, + "m_DefaultValue": 1.0, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", @@ -1206,6 +1429,36 @@ "inspectorFoldoutMask": 0 } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "80c5b8e752414a589e157a082c1876f0", + "m_Id": 1, + "m_DisplayName": "Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Color", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", @@ -1230,6 +1483,30 @@ "m_Space": 0 } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "81ac6aeaac01402b8b87d7d8b5117195", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", @@ -1318,9 +1595,9 @@ "m_Expanded": true, "m_Position": { "serializedVersion": "2", - "x": -444.0, - "y": -518.0, - "width": 214.66664123535157, + "x": -511.33343505859377, + "y": -528.0000610351563, + "width": 208.0, "height": 374.0 } }, @@ -1472,6 +1749,36 @@ "m_OutputChannel": 0 } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "a718235381784603bb6c139dea579167", + "m_Id": 0, + "m_DisplayName": "Output", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Output", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 1, + "m_DefaultColor": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.PropertyNode", @@ -1700,6 +2007,44 @@ "m_ObjectId": "bdc3a45891fa4a00b64f72f0271fe623" } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AddNode", + "m_ObjectId": "c0ef6eda9aa241c089a8c97ea98ccd35", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Add", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": -188.00006103515626, + "y": -608.6668090820313, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "1f7989ec260f4a26931027a955db33f0" + }, + { + "m_Id": "81ac6aeaac01402b8b87d7d8b5117195" + }, + { + "m_Id": "db45a4406ef4487c9e3bec32ba8ebbf1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.PropertyNode", @@ -1876,6 +2221,30 @@ "m_SerializedDescriptor": "VertexDescription.Position" } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "db45a4406ef4487c9e3bec32ba8ebbf1", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + } +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.Internal.Texture2DShaderProperty", @@ -1946,6 +2315,21 @@ "m_Labels": [] } +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f15c0863146c4d569fb25b836a2cacc2", + "m_Id": 0, + "m_DisplayName": "Emission", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [] +} + { "m_SGVersion": 0, "m_Type": "UnityEditor.ShaderGraph.BlockNode", diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DotMatrixDisplayInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DotMatrixDisplayInspector.cs index 85fccf124..ef6fb3c5e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DotMatrixDisplayInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Inspectors/DotMatrixDisplayInspector.cs @@ -68,6 +68,14 @@ public override void OnInspectorGUI() mb.Roundness = roundness; } } + + var emission = EditorGUILayout.Slider("Emission (nits)", _mb.Emission, 1f, 500f); + if (emission != _mb.Emission) { + RecordUndo("Change DMD Dot Emission", this); + foreach (var mb in _mbs) { + mb.Emission = emission; + } + } } [MenuItem("GameObject/Visual Pinball/Dot Matrix Display", false, 12)] diff --git a/VisualPinball.Unity/VisualPinball.Unity/Display/DotMatrixDisplayComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/Display/DotMatrixDisplayComponent.cs index dda247ea4..26c9b2695 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Display/DotMatrixDisplayComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Display/DotMatrixDisplayComponent.cs @@ -47,6 +47,7 @@ public override float AspectRatio { [SerializeField] private int _height = 32; [SerializeField] private float _padding = 0.2f; [SerializeField] private float _roundness = 0.35f; + [SerializeField] private float _emission = 100f; [NonSerialized] private DisplayFrameFormat _frameFormat = DisplayFrameFormat.Dmd4; [NonSerialized] private Color32[] _colorBuffer; @@ -58,6 +59,7 @@ public override float AspectRatio { private static readonly int DimensionsProp = Shader.PropertyToID("__Dimensions"); private static readonly int PaddingProp = Shader.PropertyToID("__Padding"); private static readonly int RoundnessProp = Shader.PropertyToID("__Roundness"); + private static readonly int EmissionProp = Shader.PropertyToID("__Emission"); public int Width { @@ -116,6 +118,18 @@ public float Roundness } } + public float Emission + { + get => _emission; + set { + _emission = value; + var mr = gameObject.GetComponent(); + if (mr != null) { + mr.sharedMaterial.SetFloat(EmissionProp, value); + } + } + } + public override void UpdateDimensions(int width, int height, bool flipX = false) { Logger.Info($"Updating dimensions for DMD \"{_id}\" to {width}x{height}."); From 9efb14cffd05b7c47236f2c8d650e5be5c3c3426 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 5 Oct 2021 23:44:17 +0200 Subject: [PATCH 07/58] patcher: Position all insert lights. --- .../Patcher/Tables/Terminator2.cs | 293 ++++++++++++++++-- .../Rendering/ILightConverter.cs | 2 + .../Standard/StandardLightConverter.cs | 3 + 3 files changed, 274 insertions(+), 24 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 10552e204..7ca826f95 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -57,35 +57,198 @@ public void FixSw17(KickerComponent kickerComponent) #region Lights + #region General Shapes + + [NameMatch("L43")] + [NameMatch("L44")] + [NameMatch("L45")] + [NameMatch("L46")] + [NameMatch("L47")] + [NameMatch("L48")] + [NameMatch("L53")] + [NameMatch("L54")] + [NameMatch("L55")] + [NameMatch("L56")] + [NameMatch("L57")] + [NameMatch("L58")] + public void Rectangles(GameObject go) + { + SpotAngle(go, 122f, 48f); + Intensity(go, 4500f); + } + + [NameMatch("L16")] + [NameMatch("L22a")] + [NameMatch("L22b")] + [NameMatch("L23")] + [NameMatch("L24")] + public void MidSizedCircles(GameObject go) + { + SpotAngle(go, 64f, 67f); + Intensity(go, 1200f); + } + + [NameMatch("L76")] + [NameMatch("L77")] + [NameMatch("L78")] + public void SmallSizedCircles(GameObject go) + { + SpotAngle(go, 45f, 13f); + Intensity(go, 700f); + } + + [NameMatch("L61")] + [NameMatch("L62")] + [NameMatch("L63")] + [NameMatch("L64")] + [NameMatch("L65")] + [NameMatch("L71")] + [NameMatch("L72")] + [NameMatch("L73")] + [NameMatch("L74")] + [NameMatch("L75")] + public void InnerYellowCircles(GameObject go) + { + LightColor(go, Color.yellow); + } + [NameMatch("L11")] [NameMatch("L12")] + [NameMatch("L13")] [NameMatch("L14")] [NameMatch("L15")] - public void InsertMultipliers(GameObject go) + [NameMatch("L21")] + [NameMatch("L25")] + [NameMatch("L26")] + [NameMatch("L27")] + [NameMatch("L28")] + [NameMatch("L41")] + [NameMatch("L42")] + [NameMatch("L66")] + [NameMatch("L67")] + [NameMatch("L68")] + [NameMatch("L81")] + [NameMatch("L82")] + [NameMatch("L83")] + [NameMatch("L85")] + public void MidSizedTriangles(GameObject go) { SpotAngle(go, 96.4f, 47.8f); + } + + [NameMatch("L31")] + [NameMatch("L32")] + [NameMatch("L33")] + [NameMatch("L34")] + [NameMatch("L35")] + [NameMatch("L36")] + [NameMatch("L37")] + [NameMatch("L38")] + public void SmallSizedTriangles(GameObject go) + { + SpotAngle(go, 80f, 45f); + } + + [NameMatch("L36")] + [NameMatch("L37")] + [NameMatch("L38")] + public void SmallSizedTrianglesRed(GameObject go) + { + Intensity(go, 1000f); + } + + [NameMatch("L31")] + [NameMatch("L32")] + [NameMatch("L33")] + [NameMatch("L34")] + [NameMatch("L35")] + public void SmallSizedTrianglesWhite(GameObject go) + { + Intensity(go, 700f); + LightColor(go, Color.white); + } + + [NameMatch("L11")] + [NameMatch("L12")] + [NameMatch("L14")] + [NameMatch("L15")] + [NameMatch("L26")] + [NameMatch("L41")] + [NameMatch("L66")] + public void MidSizedTrianglesGreen(GameObject go) + { Intensity(go, 3400f); } - [NameMatch("L11")] public void Insert2xPos(GameObject go) => LightPos(go, 28.6f, 9.6f, -50f); - [NameMatch("L12")] public void Insert4xPos(GameObject go) => LightPos(go, 22.4f, 25.1f, -50f); - [NameMatch("L13")] public void InsertHoldBonus(GameObject go) + [NameMatch("L13")] + [NameMatch("L21")] + [NameMatch("L27")] + [NameMatch("L81")] + [NameMatch("L82")] + public void MidSizedTrianglesRed(GameObject go) { - SpotAngle(go, 96.4f, 47.8f); - LightPos(go, 0f, 35f, -50f); Intensity(go, 1850f); } + + [NameMatch("L85")] + public void MidSizedTrianglesWhite(GameObject go) + { + Intensity(go, 1850f); + LightColor(go, Color.white); + } + + [NameMatch("L28")] + public void MidSizedTrianglesBlue(GameObject go) + { + Intensity(go, 12000f); + LightColor(go, new Color(0f, 0.4f, 1)); + } + + [NameMatch("L25")] + [NameMatch("L42")] + [NameMatch("L67")] + public void MidSizedTrianglesYellow(GameObject go) + { + Intensity(go, 1850f); + LightColor(go, Color.yellow); + } + + #endregion + + [NameMatch("L11")] public void Insert2xPos(GameObject go) => LightPos(go, 28.6f, 9.6f, -50f); + [NameMatch("L12")] public void Insert4xPos(GameObject go) => LightPos(go, 22.4f, 25.1f, -50f); + [NameMatch("L13")] public void InsertHoldBonus(GameObject go) => LightPos(go, 0f, 35f, -50f); [NameMatch("L14")] public void Insert6xPos(GameObject go) => LightPos(go, -24.7f, 25.1f, -50f); [NameMatch("L15")] public void Insert8xPos(GameObject go) => LightPos(go, -31.3f, 10.7f, -50f); + [NameMatch("L16")] public void BallSave(GameObject go) => LightPos(go, 0, -19.6f, -50f); - [NameMatch("L15")] - public void BallSave(GameObject go) + [NameMatch("L17")] + public void T2Mouth(GameObject go) { - LightPos(go, 0, -19.6f, -50f); - SpotAngle(go, 64f, 67f); - Intensity(go, 1200f); + LightPos(go, 0f, 0f, -50f); + SpotAngle(go, 73f, 10f); + Intensity(go, 340f); } + [NameMatch("L21")] + public void Kickback(GameObject go) => LightPos(go, -3f, -13.5f, -50f); + + [NameMatch("L22a")] + [NameMatch("L22b")] + public void Special(GameObject go) => LightPos(go, 0, -15f, -50f); + + [NameMatch("L23")] + [NameMatch("L24")] + public void HurryUp(GameObject go) => LightPos(go, 0, -16f, -50f); + + [NameMatch("L25")] + [NameMatch("L26")] + [NameMatch("L27")] + [NameMatch("L28")] + [NameMatch("L85")] + public void LockLane(GameObject go) => LightPos(go, -6f, -35f, -50f); + + [NameMatch("F117")] public void AutoFire(GameObject go) { @@ -98,41 +261,115 @@ public void AutoFire(GameObject go) Duplicate(go, 52f, 3.3f, -50f); } + [NameMatch("L31")] + [NameMatch("L32")] + [NameMatch("L33")] + [NameMatch("L34")] + [NameMatch("L35")] + public void LeftSmallTriangles(GameObject go) => LightPos(go, -21f, -10f, -50f); + + [NameMatch("L36")] + [NameMatch("L37")] + [NameMatch("L38")] + public void TopSmallTriangles(GameObject go) => LightPos(go, 1.7f, -25f, -50f); + + [NameMatch("L41")] + [NameMatch("L42")] + public void LockVideo(GameObject go) => LightPos(go, -8.2f, -35f, -50f); + + [NameMatch("L43")] + [NameMatch("L44")] + [NameMatch("L45")] + [NameMatch("L46")] + [NameMatch("L47")] + public void LeftRedRect(GameObject go) => LightPos(go, -6.1f, -12.3f, -50f); + + [NameMatch("L48")] + public void LeftBottomRedRect(GameObject go) => LightPos(go, -2.4f, 16.6f, -50f); + + + [NameMatch("L51a")] + [NameMatch("L51b")] + public void T2Eyes(GameObject go) + { + LightPos(go, -2.2f, 0.8f, -50f); + SpotAngle(go, 27f, 60f); + Intensity(go, 1000f); + } + [NameMatch("L53")] [NameMatch("L54")] [NameMatch("L55")] [NameMatch("L56")] [NameMatch("L57")] [NameMatch("L58")] - public void RightRedRect(GameObject go) - { - LightPos(go, 8.5f, -11.7f, -50f); - SpotAngle(go, 122f, 48f); - Intensity(go, 4500f); - } + public void RightRedRect(GameObject go) => LightPos(go, 8.5f, -11.7f, -50f); [NameMatch("L61")] [NameMatch("L62")] [NameMatch("L63")] [NameMatch("L64")] [NameMatch("L65")] - public void LeftYellowRound(GameObject go) - { - LightPos(go, -4.3f, -18.2f, -50f); - LightColor(go, Color.yellow); - } + public void LeftYellowCircle(GameObject go) => LightPos(go, -4.3f, -18.2f, -50f); + + [NameMatch("L66")] + [NameMatch("L67")] + public void LeftOuterTriangles(GameObject go) => LightPos(go, -14f, -24f, -50f); + + [NameMatch("L68")] + public void Million(GameObject go) => LightPos(go, -6.6f, -31f, -50f); [NameMatch("L71")] [NameMatch("L72")] [NameMatch("L73")] [NameMatch("L74")] [NameMatch("L75")] - public void RightYellowRound(GameObject go) + public void RightYellowCircle(GameObject go) => LightPos(go, 2.6f, -15.9f, -50f); + + [NameMatch("L76")] + [NameMatch("L77")] + [NameMatch("L78")] + public void LiteKickback(GameObject go) => LightPos(go, -10.6f, 0f, -50f); + + [NameMatch("L81")] public void L81(GameObject go) => LightPos(go, 15f, -40f, -50f); + [NameMatch("L82")] public void L82(GameObject go) => LightPos(go, 10f, -28f, -50f); + [NameMatch("L83")] public void L83(GameObject go) => LightPos(go, 13f, -37f, -50f); + + [NameMatch("L86")] + [NameMatch("L87")] + [NameMatch("L88")] + public void TopTriangles(GameObject go) + { + LightPos(go, 0f, 6f, -50f); + Intensity(go, 6700f); + SpotAngle(go, 80f, 40f); + } + + [NameMatch("Light2")] + [NameMatch("Light3")] + [NameMatch("Light4")] + [NameMatch("Light5")] + public void Boxes(GameObject go) + { + LightPos(go, 0f, -7, -50f); + PyramidAngle(go, 40f, 2.74f); + } + + [NameMatch("Light4")] + public void BlueBox(GameObject go) + { + Intensity(go, 12000f); + LightColor(go, new Color(0f, 0.4f, 1)); + } + + [NameMatch("Light5")] + public void YellowBox(GameObject go) { - LightPos(go, 2.6f, -15.9f, -50f); + Intensity(go, 670f); LightColor(go, Color.yellow); } + #region Helpers private static void LightColor(GameObject go, Color color) @@ -151,6 +388,14 @@ private static void SpotAngle(GameObject go, float outer, float inner) } } + private static void PyramidAngle(GameObject go, float angle, float ar) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.PyramidAngle(light, angle, ar); + } + } + private static void Intensity(GameObject go, float intensityLumen) { var lights = go.GetComponentsInChildren(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs index 3facf1021..7b4d696d1 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs @@ -54,5 +54,7 @@ public interface ILightConverter /// Outer angle /// Inner angle in percent of outer angle void SpotLight(Light light, float outer, float innerPercent); + + void PyramidAngle(Light light, float angle, float aspectRatio); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs index 2755d10d0..940f8f9d7 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs @@ -55,5 +55,8 @@ public void SpotLight(Light light, float outer, float innerPercent) light.spotAngle = outer; light.innerSpotAngle = outer * innerPercent * 0.01f; } + public void PyramidAngle(Light light, float angle, float aspectRatio) + { + } } } From dffc8b8780de677e17e529e949e6576de095d111 Mon Sep 17 00:00:00 2001 From: freezy Date: Wed, 6 Oct 2021 00:09:31 +0200 Subject: [PATCH 08/58] lights: Add support for multiple sources per light. --- .../VisualPinball.Unity/VPT/Light/LightApi.cs | 92 +++++++++++-------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs index cebddbb21..1a7d45d9c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs @@ -37,13 +37,13 @@ public int State { } private int _state; - private readonly LightComponent _lightComponent; + private readonly LightComponent[] _lightComponents; void IApiWireDest.OnChange(bool enabled) => Set( enabled ? LightStatus.LightStateOn : LightStatus.LightStateOff, enabled ? 1.0f : 0f); - public Color Color { get => _lightComponent.Color; set => _lightComponent.Color = value; } + public Color Color { get => _lightComponents[0].Color; set => Do(l => l.Color = value); } IApiWireDest IApiWireDeviceDest.Wire(string deviceItem) => this; @@ -54,24 +54,27 @@ void IApiLamp.OnLamp(float value, ColorChannel channel) Set(value == 0.0f ? LightStatus.LightStateOff : LightStatus.LightStateOn, value); break; } - case ColorChannel.Red: { - var color = _lightComponent.Color; - color.r = value; - _lightComponent.Color = color; + case ColorChannel.Red: + Do(l => { + var color = l.Color; + color.r = value; + l.Color = color; + }); break; - } - case ColorChannel.Green: { - var color = _lightComponent.Color; - color.g = value; - _lightComponent.Color = color; + case ColorChannel.Green: + Do(l => { + var color = l.Color; + color.g = value; + l.Color = color; + }); break; - } - case ColorChannel.Blue: { - var color = _lightComponent.Color; - color.b = value; - _lightComponent.Color = color; + case ColorChannel.Blue: + Do(l => { + var color = l.Color; + color.b = value; + l.Color = color; + }); break; - } default: throw new ArgumentOutOfRangeException(nameof(channel), channel, null); } @@ -79,42 +82,51 @@ void IApiLamp.OnLamp(float value, ColorChannel channel) void IApiLamp.OnLampColor(Color color) { - _lightComponent.Color = color; + Do(l => l.Color = color); } internal LightApi(GameObject go, Player player) : base(go, player) { - _lightComponent = go.GetComponentInChildren(); - _state = _lightComponent.State; + _lightComponents = go.GetComponentsInChildren(); + _state = _lightComponents[0].State; + } + + private void Do(Action action) + { + foreach (var t in _lightComponents) { + action(t); + } } private void Set(int lightStatus, float value) { switch (lightStatus) { - case LightStatus.LightStateOff: { - if (MainComponent.FadeSpeedDown > 0) { - _lightComponent.FadeTo(0); - - } else { - _lightComponent.Enabled = false; - } + case LightStatus.LightStateOff: + Do(l => { + if (l.FadeSpeedDown > 0) { + l.FadeTo(0); + + } else { + l.Enabled = false; + } + }); break; - } - - case LightStatus.LightStateOn: { - if (MainComponent.FadeSpeedUp > 0) { - _lightComponent.FadeTo(value); - - } else { - _lightComponent.Enabled = true; - } + case LightStatus.LightStateOn: + Do(l => { + if (l.FadeSpeedUp > 0) { + l.FadeTo(value); + + } else { + l.Enabled = true; + } + }); break; - } - case LightStatus.LightStateBlinking: { - _lightComponent.StartBlinking(); + case LightStatus.LightStateBlinking: + Do(l => { + l.StartBlinking(); + }); break; - } default: throw new ArgumentOutOfRangeException(); From c11142652603cfbe1d90e051137fd2d82199b433 Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 7 Oct 2021 00:02:12 +0200 Subject: [PATCH 09/58] lamps: Simplify RGB handling and add GI support. --- .../Game/Engines/GamelogicEngineLamp.cs | 70 ++++++-- VisualPinball.Engine/Math/Color.cs | 20 ++- .../Managers/Coil/CoilListViewItemRenderer.cs | 7 +- .../Managers/Coil/CoilManager.cs | 2 +- .../Managers/Lamp/LampListData.cs | 33 ++-- .../Managers/Lamp/LampListViewItemRenderer.cs | 55 +++--- .../Managers/Lamp/LampManager.cs | 5 +- .../Mappings/CoilPopulationTests.cs | 2 +- .../Game/CameraController.cs | 2 - .../VisualPinball.Unity/Game/CoilPlayer.cs | 2 +- .../Game/Engine/IGamelogicEngine.cs | 15 +- .../VisualPinball.Unity/Game/LampPlayer.cs | 167 +++++++----------- .../Mappings/LampMapping.cs | 12 +- .../Mappings/MappingConfig.cs | 47 ++--- .../Mappings/MappingEnums.cs | 6 - 15 files changed, 231 insertions(+), 214 deletions(-) diff --git a/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs b/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs index 3b63f363b..c75d50e26 100644 --- a/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs +++ b/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs @@ -17,30 +17,68 @@ // ReSharper disable InconsistentNaming using System; +using VisualPinball.Engine.Math; namespace VisualPinball.Engine.Game.Engines { [Serializable] public class GamelogicEngineLamp : IGamelogicEngineDeviceItem { - public string Id { get; set; } - public int InternalId; - public string Description { get; set; } - public string DeviceHint; - public string DeviceItemHint; - public string MainLampIdOfGreen; - public string MainLampIdOfBlue; - - public GamelogicEngineLamp(string id) - { - Id = id; - InternalId = int.TryParse(id, out var internalId) ? internalId : 0; + /// + /// The unique ID of this lamp, as the gamelogic engine addresses it. + /// + public string Id { get; set; } + + /// + /// Some gamelogic engines use integers for the ID. In order to avoid repetitive casting, we store it as integer as well. + /// + public int InternalId; + + /// + /// Which channel this lamp corresponds to. + /// + public ColorChannel Channel = ColorChannel.Alpha; + + /// + /// An optional description of the lamp. + /// + public string Description { get; set; } + + /// + /// How the gamelogic engine triggers the lamp. Either through GI or through the normal lamp API. + /// + /// + /// + /// Note that lamps connected to coils will appear under coils. + /// + public LampSource Source = LampSource.Lamp; + + /// + /// A regular expression to match the component on the playfield. + /// + public string DeviceHint; + + /// + /// A regular expression to match the lamp component within the component. + /// + public string DeviceItemHint; + + public GamelogicEngineLamp(string id) + { + Id = id; + InternalId = int.TryParse(id, out var internalId) ? internalId : 0; + } + + public GamelogicEngineLamp(string id, int internalId) + { + Id = id; + InternalId = internalId; + } } - public GamelogicEngineLamp(string id, int internalId) + public enum LampSource { - Id = id; - InternalId = internalId; - } + Lamp = 0, + GI = 1, } } diff --git a/VisualPinball.Engine/Math/Color.cs b/VisualPinball.Engine/Math/Color.cs index 0e6025f75..88df01e34 100644 --- a/VisualPinball.Engine/Math/Color.cs +++ b/VisualPinball.Engine/Math/Color.cs @@ -98,7 +98,25 @@ public enum ColorFormat public enum ColorChannel { - Red, Green, Blue, Alpha + /// + /// The red channel for RGB lamps. + /// + Red, + + /// + /// The green channel for RGB lamps. + /// + Green, + + /// + /// The blue channel for RBG lamps. + /// + Blue, + + /// + /// The intensity for white lamps. + /// + Alpha, } public static class Colors diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilListViewItemRenderer.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilListViewItemRenderer.cs index 2cc684f24..30618a602 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilListViewItemRenderer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilListViewItemRenderer.cs @@ -76,7 +76,7 @@ public void Render(TableComponent tableComponent, CoilListData data, Rect cellRe private void UpdateId(CoilListData data, string id) { if (data.Destination == CoilDestination.Lamp) { - var lampEntry = _tableComponent.MappingConfig.Lamps.FirstOrDefault(l => l.Id == data.Id && l.Source == LampSource.Coils); + var lampEntry = _tableComponent.MappingConfig.Lamps.FirstOrDefault(l => l.Id == data.Id && l.IsCoil); if (lampEntry != null) { lampEntry.Id = id; LampManager.Refresh(); @@ -95,7 +95,7 @@ private void RenderDestination(CoilListData coilListData, Rect cellRect, Action< { if (coilListData.Destination == CoilDestination.Lamp) { - var lampEntry = _tableComponent.MappingConfig.Lamps.FirstOrDefault(l => l.Id == coilListData.Id && l.Source == LampSource.Coils); + var lampEntry = _tableComponent.MappingConfig.Lamps.FirstOrDefault(l => l.Id == coilListData.Id && l.IsCoil); if (lampEntry != null) { _tableComponent.MappingConfig.RemoveLamp(lampEntry); LampManager.Refresh(); @@ -104,7 +104,8 @@ private void RenderDestination(CoilListData coilListData, Rect cellRect, Action< } else if (index == CoilDestination.Lamp) { _tableComponent.MappingConfig.AddLamp(new LampMapping { Id = coilListData.Id, - Source = LampSource.Coils, + Source = LampSource.Lamp, + IsCoil = true, Description = coilListData.Description }); LampManager.Refresh(); diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilManager.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilManager.cs index 6f08d7bf2..61685980f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Coil/CoilManager.cs @@ -138,7 +138,7 @@ protected override void RemoveData(string undoName, CoilListData data) // todo if it's a lamp, also delete the lamp entry. if (data.CoilMapping.Destination == CoilDestination.Lamp) { - var lampEntry = TableComponent.MappingConfig.Lamps.FirstOrDefault(l => l.Id == data.Id && l.Source == LampSource.Coils); + var lampEntry = TableComponent.MappingConfig.Lamps.FirstOrDefault(l => l.Id == data.Id && l.IsCoil); if (lampEntry != null) { TableComponent.MappingConfig.RemoveLamp(lampEntry); LampManager.Refresh(); diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs index 94e3d596f..8714a48a1 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs @@ -15,6 +15,7 @@ // along with this program. If not, see . using VisualPinball.Engine.Game.Engines; +using VisualPinball.Engine.Math; namespace VisualPinball.Unity.Editor { @@ -25,39 +26,40 @@ public class LampListData : IManagerListData, IDeviceListData DeviceComponent => Device; public LampListData(LampMapping lampMapping) { Id = lampMapping.Id; + InternalId = lampMapping.InternalId; + IsCoil = lampMapping.IsCoil; Source = lampMapping.Source; Description = lampMapping.Description; Device = lampMapping.Device; DeviceItem = lampMapping.DeviceItem; Type = lampMapping.Type; - Green = lampMapping.Green; - Blue = lampMapping.Blue; + Channel = lampMapping.Channel; LampMapping = lampMapping; } @@ -65,13 +67,14 @@ public LampListData(LampMapping lampMapping) public void Update() { LampMapping.Id = Id; + LampMapping.InternalId = InternalId; + LampMapping.IsCoil = IsCoil; LampMapping.Source = Source; LampMapping.Description = Description; LampMapping.Device = Device; LampMapping.DeviceItem = DeviceItem; LampMapping.Type = Type; - LampMapping.Green = Green; - LampMapping.Blue = Blue; + LampMapping.Channel = Channel; } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs index 9f17aee45..a952fa733 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs @@ -19,6 +19,8 @@ using UnityEditor; using UnityEngine; using VisualPinball.Engine.Game.Engines; +using VisualPinball.Engine.Math; +using Color = UnityEngine.Color; namespace VisualPinball.Unity.Editor { @@ -32,9 +34,10 @@ private enum LampListColumn { Id = 0, Description = 1, - Element = 2, + Source = 2, Type = 3, - Color = 4, + Element = 4, + Channel = 5, } private readonly List _gleLamps; @@ -56,7 +59,7 @@ public void Render(TableComponent tableComponent, LampListData data, Rect cellRe switch ((LampListColumn)column) { case LampListColumn.Id: - if (data.Source == LampSource.Coils) { + if (data.IsCoil) { RenderCoilId(lampStatuses, data, cellRect); } else { RenderId(lampStatuses, ref data.Id, id => data.Id = id, data, cellRect, updateAction); @@ -65,19 +68,19 @@ public void Render(TableComponent tableComponent, LampListData data, Rect cellRe case LampListColumn.Description: RenderDescription(data, cellRect, updateAction); break; - case LampListColumn.Element: - RenderDevice(data, cellRect, updateAction); + case LampListColumn.Source: + RenderSource(data, cellRect, updateAction); break; case LampListColumn.Type: RenderType(data, cellRect, updateAction); break; - case LampListColumn.Color: - switch (data.Type) { - case LampType.RgbMulti: - RenderRgb(lampStatuses, data, cellRect, updateAction); - break; - } + case LampListColumn.Element: + RenderDevice(data, cellRect, updateAction); break; + case LampListColumn.Channel: + RenderChannel(data, cellRect, updateAction); + break; + } EditorGUI.EndDisabledGroup(); } @@ -123,17 +126,27 @@ private void RenderType(LampListData lampListData, Rect cellRect, Action lampStatuses, LampListData data, Rect cellRect, Action updateAction) + private void RenderSource(LampListData lampListData, Rect cellRect, Action updateAction) { - var pad = 2; - var width = cellRect.width / 3; - var c = cellRect; - c.width = width - pad; - RenderId(lampStatuses, ref data.Id, id => data.Id = id, data, c, updateAction); - c.x += width + pad; - RenderId(lampStatuses, ref data.Green, id => data.Green = id, data, c, updateAction); - c.x += width + pad; - RenderId(lampStatuses, ref data.Blue, id => data.Blue = id, data, c, updateAction); + EditorGUI.BeginChangeCheck(); + var source = (LampSource)EditorGUI.EnumPopup(cellRect, lampListData.Source); + if (EditorGUI.EndChangeCheck()) { + lampListData.Source = source; + updateAction(lampListData); + } + } + + private void RenderChannel(LampListData lampListData, Rect cellRect, Action updateAction) + { + if (lampListData.Type != LampType.RgbMulti) { + return; + } + EditorGUI.BeginChangeCheck(); + var channel = (ColorChannel)EditorGUI.EnumPopup(cellRect, lampListData.Channel); + if (EditorGUI.EndChangeCheck()) { + lampListData.Channel = channel; + updateAction(lampListData); + } } protected override Texture GetIcon(LampListData lampListData) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs index 59342eb04..2c106b9c4 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs @@ -149,12 +149,13 @@ protected override void CloneData(string undoName, string newName, LampListData TableComponent.MappingConfig.AddLamp(new LampMapping { Id = data.Id, + InternalId = data.InternalId, Description = data.Description, Device = data.Device, DeviceItem = data.DeviceItem, Type = data.Type, - Blue = data.Blue, - Green = data.Green, + Source = data.Source, + IsCoil = data.IsCoil, }); } #endregion diff --git a/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/CoilPopulationTests.cs b/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/CoilPopulationTests.cs index 0d53f05f0..60d083bb1 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/CoilPopulationTests.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/CoilPopulationTests.cs @@ -169,7 +169,7 @@ public void ShouldAddLamps() tableComponent.MappingConfig.Coils.Count.Should().Be(1); tableComponent.MappingConfig.Lamps.Count.Should().Be(1); tableComponent.MappingConfig.Lamps[0].Id.Should().Be("yyy"); - tableComponent.MappingConfig.Lamps[0].Source.Should().Be(LampSource.Coils); + tableComponent.MappingConfig.Lamps[0].IsCoil.Should().Be(true); } [Test] diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/CameraController.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/CameraController.cs index 2bea86cc4..862757c43 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/CameraController.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/CameraController.cs @@ -139,8 +139,6 @@ public void FixedUpdate() if(Mouse.current != null) { - Debug.Log("I has mouse"); - var trans = Camera.transform; var altitude = trans.transform.parent; var azimuth = altitude.parent; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs index a284be581..dc47a0529 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs @@ -110,7 +110,7 @@ private void HandleCoilEvent(object sender, CoilEventArgs coilEvent) foreach (var destConfig in _coilAssignments[coilEvent.Id]) { if (destConfig.IsLampCoil) { - _lampPlayer.HandleLampEvent(new LampEventArgs(coilEvent.Id, coilEvent.IsEnabled ? 1 : 0, LampSource.Coils)); + _lampPlayer.HandleLampEvent(new LampEventArgs(coilEvent.Id, coilEvent.IsEnabled ? 1 : 0, true)); continue; } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs index b5110e621..da574383c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs @@ -204,18 +204,25 @@ public readonly struct LampEventArgs /// public readonly LampSource Source; - public LampEventArgs(string id, int value) + /// + /// True if it was triggered by a coil. + /// + public readonly bool IsCoil; + + public LampEventArgs(string id, int value, LampSource source = LampSource.Lamp) { Id = id; Value = value; - Source = LampSource.Lamps; + Source = source; + IsCoil = false; } - public LampEventArgs(string id, int value, LampSource source) + public LampEventArgs(string id, int value, bool isCoil) { Id = id; Value = value; - Source = source; + Source = LampSource.Lamp; + IsCoil = isCoil; } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs index 2848f4366..fbff30b9b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; +using System.Security.Authentication.ExtendedProtection; using NLog; using VisualPinball.Engine.Math; using Color = UnityEngine.Color; @@ -25,8 +26,19 @@ namespace VisualPinball.Unity { public class LampPlayer { + /// + /// List of all registered lamp APIs. + /// private readonly Dictionary _lamps = new Dictionary(); + + /// + /// Links the GLE's IDs to the lamps. + /// private readonly Dictionary> _lampAssignments = new Dictionary>(); + + /// + /// Links the GLE's IDs to the mappings. + /// private readonly Dictionary> _lampMappings = new Dictionary>(); private TableComponent _tableComponent; @@ -56,16 +68,7 @@ public void OnStart() continue; } - AssignLampMapping(lampMapping.Id, lampMapping); - - if (lampMapping.Type == LampType.RgbMulti) { - if (!string.IsNullOrEmpty(lampMapping.Green)) { - AssignLampMapping(lampMapping.Green, lampMapping); - } - if (!string.IsNullOrEmpty(lampMapping.Blue)) { - AssignLampMapping(lampMapping.Blue, lampMapping); - } - } + AssignLampMapping(lampMapping); // turn it off _lamps[lampMapping.Device].OnLamp(0f, ColorChannel.Alpha); @@ -81,11 +84,61 @@ public void OnStart() public void HandleLampEvent(LampEventArgs lampEvent) { - HandleLampEvent(null, lampEvent); + if (_lampAssignments.ContainsKey(lampEvent.Id)) { + foreach (var component in _lampAssignments[lampEvent.Id]) { + var mapping = _lampMappings[lampEvent.Id][component]; + if (mapping.Source != lampEvent.Source || mapping.IsCoil != lampEvent.IsCoil) { + // so, if we have a coil here that happens to have the same name as a lamp, + // or a GI light with the same name as an other lamp, skip. + continue; + } + if (_lamps.ContainsKey(component)) { + var lamp = _lamps[component]; + switch (mapping.Type) { + case LampType.SingleOnOff: { + var value = lampEvent.Value > 0 ? 1f : 0f; + lamp.OnLamp(value, ColorChannel.Alpha); + LampStatuses[lampEvent.Id] = value; + break; + } + + case LampType.Rgb: + case LampType.RgbMulti: + case LampType.SingleFading: { + var value = lampEvent.Value / 255f; + lamp.OnLamp(value, mapping.Type == LampType.RgbMulti ? mapping.Channel : ColorChannel.Alpha); + LampStatuses[lampEvent.Id] = value; + break; + } + + default: + Logger.Error($"Unknown mapping type \"{mapping.Type}\" of lamp ID {lampEvent.Id} for light {component}."); + break; + } + + } else { + Logger.Error($"Cannot trigger unknown lamp {component}."); + } + } +#if UNITY_EDITOR + UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); +#endif + } } - private void AssignLampMapping(string id, LampMapping lampMapping) + public void OnDestroy() + { + if (_lampAssignments.Count > 0 && _gamelogicEngine != null) { + _gamelogicEngine.OnLampColorChanged -= HandleLampColorEvent; + _gamelogicEngine.OnLampChanged -= HandleLampEvent; + _gamelogicEngine.OnLampsChanged -= HandleLampsEvent; + } + } + + + private void AssignLampMapping(LampMapping lampMapping) { + var id = lampMapping.Id; if (!_lampAssignments.ContainsKey(id)) { _lampAssignments[id] = new List(); } @@ -129,23 +182,7 @@ private void HandleLampsEvent(object sender, LampsEventArgs lampsEvent) var colors = new Dictionary(); var lamps = new Dictionary(); foreach (var lampEvent in lampsEvent.LampsChanged) { - HandleLampEvent(lampEvent, (lamp, mapping, itemName) => { - var color = colors.ContainsKey(mapping.Id) ? colors[mapping.Id] : lamp.Color; - if (lampEvent.Id == mapping.Id) { - color.r = lampEvent.Value / 255f; - - } else if (lampEvent.Id == mapping.Green) { - color.g = lampEvent.Value / 255f; - - } else if (lampEvent.Id == mapping.Blue) { - color.b = lampEvent.Value / 255f; - - } else { - Logger.Error($"Cannot assign lamp {lampEvent.Id} to an RGB value of light {itemName}"); - } - colors[mapping.Id] = color; - lamps[mapping.Id] = lamp; - }); + HandleLampEvent(lampEvent); } foreach (var mappingId in colors.Keys) { @@ -156,77 +193,7 @@ private void HandleLampsEvent(object sender, LampsEventArgs lampsEvent) private void HandleLampEvent(object sender, LampEventArgs lampEvent) { - HandleLampEvent(lampEvent, (lamp, mapping, itemName) => { - if (lampEvent.Id == mapping.Id) { - lamp.OnLamp(lampEvent.Value / 255f, ColorChannel.Red); - - } else if (lampEvent.Id == mapping.Green) { - lamp.OnLamp(lampEvent.Value / 255f, ColorChannel.Green); - - } else if (lampEvent.Id == mapping.Blue) { - lamp.OnLamp(lampEvent.Value / 255f, ColorChannel.Blue); - - } else { - Logger.Error($"Cannot assign lamp {lampEvent.Id} to an RGB value of light {itemName}"); - } - LampStatuses[lampEvent.Id] = lamp.Color.grayscale; - }); - } - - private void HandleLampEvent(LampEventArgs lampEvent, Action handleRgb) - { - if (_lampAssignments.ContainsKey(lampEvent.Id)) { - foreach (var component in _lampAssignments[lampEvent.Id]) { - var mapping = _lampMappings[lampEvent.Id][component]; - if (mapping.Source != lampEvent.Source) { - // so, if we have a coil here that happens to have the same name as a lamp, - // skip if the source isn't the same. - continue; - } - if (_lamps.ContainsKey(component)) { - var lamp = _lamps[component]; - switch (mapping.Type) { - case LampType.SingleOnOff: { - var value = lampEvent.Value > 0 ? 1f : 0f; - lamp.OnLamp(value, ColorChannel.Alpha); - LampStatuses[lampEvent.Id] = value; - break; - } - - case LampType.Rgb: - case LampType.SingleFading: { - var value = lampEvent.Value / 255f; - lamp.OnLamp(value, ColorChannel.Alpha); - LampStatuses[lampEvent.Id] = value; - break; - } - - case LampType.RgbMulti: - handleRgb(lamp, mapping, component); - break; - - default: - Logger.Error($"Unknown mapping type \"{mapping.Type}\" of lamp ID {lampEvent.Id} for light {component}."); - break; - } - - } else { - Logger.Error($"Cannot trigger unknown lamp {component}."); - } - } -#if UNITY_EDITOR - UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); -#endif - } - } - - public void OnDestroy() - { - if (_lampAssignments.Count > 0 && _gamelogicEngine != null) { - _gamelogicEngine.OnLampColorChanged -= HandleLampColorEvent; - _gamelogicEngine.OnLampChanged -= HandleLampEvent; - _gamelogicEngine.OnLampsChanged -= HandleLampsEvent; - } + HandleLampEvent(lampEvent); } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs index 02e19c198..b7270b540 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs @@ -18,6 +18,8 @@ using System; using UnityEngine; +using VisualPinball.Engine.Game.Engines; +using VisualPinball.Engine.Math; namespace VisualPinball.Unity { @@ -26,7 +28,11 @@ public class LampMapping { public string Id = string.Empty; - public LampSource Source = LampSource.Lamps; + public int InternalId; + + public LampSource Source = LampSource.Lamp; + + public bool IsCoil; public string Description = string.Empty; @@ -38,8 +44,6 @@ public class LampMapping public LampType Type = LampType.SingleOnOff; - public string Green = string.Empty; - - public string Blue = string.Empty; + public ColorChannel Channel = ColorChannel.Alpha; } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index af91b5232..9f8f9e770 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -245,12 +245,13 @@ private CoilDestination GuessCoilDestination(GamelogicEngineCoil engineCoil) AddLamp(new LampMapping { Id = engineCoil.Id, Description = engineCoil.Description, - Source = LampSource.Coils + Source = LampSource.Lamp, + IsCoil = true, }); return CoilDestination.Lamp; } - private static ICoilDeviceComponent GuessCoilDevice(ICoilDeviceComponent[] coilDevices, GamelogicEngineCoil engineCoil) + private static ICoilDeviceComponent GuessCoilDevice(IEnumerable coilDevices, GamelogicEngineCoil engineCoil) { foreach (var device in coilDevices) { if (string.Equals(device.name, engineCoil.Id, StringComparison.OrdinalIgnoreCase)) { @@ -323,7 +324,7 @@ public void RemoveCoil(CoilMapping coilMapping) { Coils.Remove(coilMapping); if (coilMapping.Destination == CoilDestination.Lamp) { - var lamp = Lamps.FirstOrDefault(l => l.Id == coilMapping.Id && l.Source == LampSource.Coils); + var lamp = Lamps.FirstOrDefault(l => l.Id == coilMapping.Id && l.IsCoil); if (lamp != null) { Lamps.Remove(lamp); } @@ -333,7 +334,7 @@ public void RemoveCoil(CoilMapping coilMapping) public void RemoveAllCoils() { Coils.Clear(); - Lamps = Lamps.Where(l => l.Source != LampSource.Coils).ToList(); + Lamps = Lamps.Where(l => !l.IsCoil).ToList(); } #endregion @@ -359,7 +360,7 @@ public void RemoveAllWires() #region Lamps - /// + /// /// Auto-matches the lamps provided by the gamelogic engine with the /// lamps on the playfield. /// @@ -368,54 +369,26 @@ public void RemoveAllWires() public void PopulateLamps(GamelogicEngineLamp[] engineLamps, TableComponent tableComponent) { var lamps = tableComponent.GetComponentsInChildren(); - var gbLamps = new List(); foreach (var engineLamp in GetLamps(engineLamps)) { - var lampMapping = Lamps.FirstOrDefault(mappingsLampData => mappingsLampData.Id == engineLamp.Id && mappingsLampData.Source != LampSource.Coils); + var lampMapping = Lamps.FirstOrDefault(mappingsLampData => mappingsLampData.Id == engineLamp.Id && !mappingsLampData.IsCoil); if (lampMapping != null) { continue; } - // we'll handle those in a second loop when all the R lamps are added - if (!string.IsNullOrEmpty(engineLamp.MainLampIdOfGreen) || !string.IsNullOrEmpty(engineLamp.MainLampIdOfBlue)) { - gbLamps.Add(engineLamp); - continue; - } - var description = string.IsNullOrEmpty(engineLamp.Description) ? string.Empty : engineLamp.Description; var device = GuessLampDevice(lamps, engineLamp); var deviceItem = device != null ? GuessLampDeviceItem(engineLamp, device) : null; AddLamp(new LampMapping { Id = engineLamp.Id, + Channel = engineLamp.Channel, + Source = engineLamp.Source, Description = description, Device = device, DeviceItem = deviceItem != null ? deviceItem.Id : string.Empty, }); } - - foreach (var gbLamp in gbLamps) { - var rLampId = !string.IsNullOrEmpty(gbLamp.MainLampIdOfGreen) ? gbLamp.MainLampIdOfGreen : gbLamp.MainLampIdOfBlue; - var rLamp = Lamps.FirstOrDefault(c => c.Id == rLampId); - if (rLamp == null) { - var device = GuessLampDevice(lamps, gbLamp); - var deviceItem = GuessLampDeviceItem(gbLamp, device); - rLamp = new LampMapping { - Id = rLampId, - Device = device, - DeviceItem = deviceItem != null ? deviceItem.Id : string.Empty, - }; - AddLamp(rLamp); - } - - rLamp.Type = LampType.RgbMulti; - if (!string.IsNullOrEmpty(gbLamp.MainLampIdOfGreen)) { - rLamp.Green = gbLamp.Id; - - } else { - rLamp.Blue = gbLamp.Id; - } - } } /// @@ -501,7 +474,7 @@ public void RemoveLamp(LampMapping lampMapping) public void RemoveAllLamps() { - Lamps = Lamps.Where(l => l.Source == LampSource.Coils).ToList(); + Lamps = Lamps.Where(l => l.IsCoil).ToList(); } #endregion diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingEnums.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingEnums.cs index 42d2aa927..df128f8df 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingEnums.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingEnums.cs @@ -48,12 +48,6 @@ public enum WireType Pulse = 1, } - public enum LampSource - { - Lamps = 0, - Coils = 1, - } - public enum LampType { SingleOnOff = 0, From 324ed97b32487c2edf0cdaf770f7e5e7f2444ad5 Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 7 Oct 2021 21:54:26 +0200 Subject: [PATCH 10/58] lamps: Add fading steps for GI. --- .../Game/Engines/GamelogicEngineLamp.cs | 5 +++++ .../Managers/Lamp/LampListData.cs | 5 +++++ .../Managers/Lamp/LampListViewItemRenderer.cs | 17 +++++++++++++++++ .../VisualPinball.Unity/Mappings/LampMapping.cs | 2 ++ .../Mappings/MappingConfig.cs | 14 ++++++++++++++ 5 files changed, 43 insertions(+) diff --git a/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs b/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs index c75d50e26..9b48fd12c 100644 --- a/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs +++ b/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs @@ -39,6 +39,11 @@ public class GamelogicEngineLamp : IGamelogicEngineDeviceItem /// public ColorChannel Channel = ColorChannel.Alpha; + /// + /// If it's a fading light, this is the value at maximal intensity. + /// + public int FadingSteps; + /// /// An optional description of the lamp. /// diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs index 8714a48a1..3a0f45d4d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs @@ -41,6 +41,9 @@ public class LampListData : IManagerListData, IDeviceListData _gleLamps; @@ -80,6 +81,9 @@ public void Render(TableComponent tableComponent, LampListData data, Rect cellRe case LampListColumn.Channel: RenderChannel(data, cellRect, updateAction); break; + case LampListColumn.FadingSteps: + RenderFadingSteps(data, cellRect, updateAction); + break; } EditorGUI.EndDisabledGroup(); @@ -149,6 +153,19 @@ private void RenderChannel(LampListData lampListData, Rect cellRect, Action updateAction) + { + if (lampListData.Type != LampType.SingleFading) { + return; + } + EditorGUI.BeginChangeCheck(); + var value = EditorGUI.IntField(cellRect, lampListData.FadingSteps); + if (EditorGUI.EndChangeCheck()) { + lampListData.FadingSteps = value; + updateAction(lampListData); + } + } + protected override Texture GetIcon(LampListData lampListData) { return lampListData.Device != null diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs index b7270b540..eaaef8de5 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/LampMapping.cs @@ -32,6 +32,8 @@ public class LampMapping public LampSource Source = LampSource.Lamp; + public int FadingSteps; + public bool IsCoil; public string Description = string.Empty; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index 9f8f9e770..991bd8d23 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -23,6 +23,7 @@ using UnityEngine; using VisualPinball.Engine.Common; using VisualPinball.Engine.Game.Engines; +using VisualPinball.Engine.Math; namespace VisualPinball.Unity { @@ -387,6 +388,8 @@ public void PopulateLamps(GamelogicEngineLamp[] engineLamps, TableComponent tabl Description = description, Device = device, DeviceItem = deviceItem != null ? deviceItem.Id : string.Empty, + Type = GuessLampType(engineLamp), + FadingSteps = engineLamp.FadingSteps, }); } } @@ -462,6 +465,17 @@ private static GamelogicEngineLamp GuessLampDeviceItem(GamelogicEngineLamp engin return null; } + private static LampType GuessLampType(GamelogicEngineLamp engineLamp) + { + if (engineLamp.Channel != ColorChannel.Alpha) { + return LampType.RgbMulti; + } + + return engineLamp.FadingSteps > 0 + ? LampType.SingleFading + : LampType.SingleOnOff; + } + public void AddLamp(LampMapping lampMapping) { Lamps.Add(lampMapping); From 763787de3f6dba1faffe5e87ff0c8a28652b36dc Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 7 Oct 2021 22:11:49 +0200 Subject: [PATCH 11/58] Revert "lights: Add support for multiple sources per light." This reverts commit dffc8b8780de677e17e529e949e6576de095d111. --- .../VisualPinball.Unity/VPT/Light/LightApi.cs | 92 ++++++++----------- 1 file changed, 40 insertions(+), 52 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs index 1a7d45d9c..cebddbb21 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs @@ -37,13 +37,13 @@ public int State { } private int _state; - private readonly LightComponent[] _lightComponents; + private readonly LightComponent _lightComponent; void IApiWireDest.OnChange(bool enabled) => Set( enabled ? LightStatus.LightStateOn : LightStatus.LightStateOff, enabled ? 1.0f : 0f); - public Color Color { get => _lightComponents[0].Color; set => Do(l => l.Color = value); } + public Color Color { get => _lightComponent.Color; set => _lightComponent.Color = value; } IApiWireDest IApiWireDeviceDest.Wire(string deviceItem) => this; @@ -54,27 +54,24 @@ void IApiLamp.OnLamp(float value, ColorChannel channel) Set(value == 0.0f ? LightStatus.LightStateOff : LightStatus.LightStateOn, value); break; } - case ColorChannel.Red: - Do(l => { - var color = l.Color; - color.r = value; - l.Color = color; - }); + case ColorChannel.Red: { + var color = _lightComponent.Color; + color.r = value; + _lightComponent.Color = color; break; - case ColorChannel.Green: - Do(l => { - var color = l.Color; - color.g = value; - l.Color = color; - }); + } + case ColorChannel.Green: { + var color = _lightComponent.Color; + color.g = value; + _lightComponent.Color = color; break; - case ColorChannel.Blue: - Do(l => { - var color = l.Color; - color.b = value; - l.Color = color; - }); + } + case ColorChannel.Blue: { + var color = _lightComponent.Color; + color.b = value; + _lightComponent.Color = color; break; + } default: throw new ArgumentOutOfRangeException(nameof(channel), channel, null); } @@ -82,51 +79,42 @@ void IApiLamp.OnLamp(float value, ColorChannel channel) void IApiLamp.OnLampColor(Color color) { - Do(l => l.Color = color); + _lightComponent.Color = color; } internal LightApi(GameObject go, Player player) : base(go, player) { - _lightComponents = go.GetComponentsInChildren(); - _state = _lightComponents[0].State; - } - - private void Do(Action action) - { - foreach (var t in _lightComponents) { - action(t); - } + _lightComponent = go.GetComponentInChildren(); + _state = _lightComponent.State; } private void Set(int lightStatus, float value) { switch (lightStatus) { - case LightStatus.LightStateOff: - Do(l => { - if (l.FadeSpeedDown > 0) { - l.FadeTo(0); - - } else { - l.Enabled = false; - } - }); + case LightStatus.LightStateOff: { + if (MainComponent.FadeSpeedDown > 0) { + _lightComponent.FadeTo(0); + + } else { + _lightComponent.Enabled = false; + } break; - case LightStatus.LightStateOn: - Do(l => { - if (l.FadeSpeedUp > 0) { - l.FadeTo(value); - - } else { - l.Enabled = true; - } - }); + } + + case LightStatus.LightStateOn: { + if (MainComponent.FadeSpeedUp > 0) { + _lightComponent.FadeTo(value); + + } else { + _lightComponent.Enabled = true; + } break; + } - case LightStatus.LightStateBlinking: - Do(l => { - l.StartBlinking(); - }); + case LightStatus.LightStateBlinking: { + _lightComponent.StartBlinking(); break; + } default: throw new ArgumentOutOfRangeException(); From fd1c3de1a48587ac149016f26e2629c464b30586 Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 7 Oct 2021 22:29:19 +0200 Subject: [PATCH 12/58] lights: Fix multi-light support and add proper fading. --- .../VisualPinball.Unity/Game/LampPlayer.cs | 26 ++++++++++++------- .../VPT/Light/LightComponent.cs | 26 ++++++++++++------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs index fbff30b9b..6246db88c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs @@ -94,28 +94,34 @@ public void HandleLampEvent(LampEventArgs lampEvent) } if (_lamps.ContainsKey(component)) { var lamp = _lamps[component]; + var value = 0f; + var channel = ColorChannel.Alpha; switch (mapping.Type) { - case LampType.SingleOnOff: { - var value = lampEvent.Value > 0 ? 1f : 0f; - lamp.OnLamp(value, ColorChannel.Alpha); - LampStatuses[lampEvent.Id] = value; + case LampType.SingleOnOff: + value = lampEvent.Value > 0 ? 1f : 0f; break; - } case LampType.Rgb: + value = lampEvent.Value / 255f; // todo test + + break; case LampType.RgbMulti: - case LampType.SingleFading: { - var value = lampEvent.Value / 255f; - lamp.OnLamp(value, mapping.Type == LampType.RgbMulti ? mapping.Channel : ColorChannel.Alpha); - LampStatuses[lampEvent.Id] = value; + value = lampEvent.Value / 255f; // todo test + channel = mapping.Channel; + break; + + case LampType.SingleFading: + value = lampEvent.Value / (float)mapping.FadingSteps; break; - } default: Logger.Error($"Unknown mapping type \"{mapping.Type}\" of lamp ID {lampEvent.Id} for light {component}."); break; } + lamp.OnLamp(value, channel); + LampStatuses[lampEvent.Id] = value; + } else { Logger.Error($"Cannot trigger unknown lamp {component}."); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs index 216b5c10b..1408a440e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs @@ -130,19 +130,25 @@ public override void UpdateTransforms() #region Runtime - private UnityEngine.Light _unityLight; + private UnityEngine.Light[] _unityLights; private float _fullIntensity; public bool Enabled { set { StopAllCoroutines(); - _unityLight.enabled = value; + foreach (var unityLight in _unityLights) { + unityLight.enabled = value; + } } } public Color Color { - get => _unityLight.color; - set => _unityLight.color = value; + get => _unityLights[0].color; + set { + foreach (var unityLight in _unityLights) { + unityLight.color = value; + } + } } private void Awake() @@ -154,9 +160,9 @@ private void Awake() } player.RegisterLamp(this); - _unityLight = GetComponentInChildren(); - if (_unityLight) { - _fullIntensity = _unityLight.intensity; + _unityLights = GetComponentsInChildren(); + if (_unityLights.Length > 0) { + _fullIntensity = _unityLights[0].intensity; } } @@ -195,7 +201,7 @@ private IEnumerator Fade(float value) { var counter = 0f; - var a = _unityLight.intensity; + var a = _unityLights[0].intensity; var b = _fullIntensity * value; var duration = a < b ? FadeSpeedUp * (_fullIntensity - a) / _fullIntensity @@ -203,7 +209,9 @@ private IEnumerator Fade(float value) while (counter < duration) { counter += Time.deltaTime; - _unityLight.intensity = Mathf.Lerp(a, b, counter / duration); + foreach (var unityLight in _unityLights) { + unityLight.intensity = Mathf.Lerp(a, b, counter / duration); + } yield return null; } } From 22d626e8e1ef5ea2fac1ac5b2729f63a91adc953 Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 7 Oct 2021 23:06:58 +0200 Subject: [PATCH 13/58] lights: Fix population tests. --- .../Mappings/LampPopulationTests.cs | 49 ++++++------------- 1 file changed, 14 insertions(+), 35 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/LampPopulationTests.cs b/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/LampPopulationTests.cs index eb0d2ecc3..1be443979 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/LampPopulationTests.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Test/Mappings/LampPopulationTests.cs @@ -18,6 +18,7 @@ using FluentAssertions; using NUnit.Framework; using VisualPinball.Engine.Game.Engines; +using VisualPinball.Engine.Math; using VisualPinball.Engine.VPT.Table; using VisualPinball.Unity.Editor; @@ -132,50 +133,28 @@ public void ShouldMapAnRgbLamp() var tableComponent = go.GetComponent(); var gameEngineLamps = new[] { - new GamelogicEngineLamp("rgb") { Description = "RGB", DeviceHint = "rgb"}, - new GamelogicEngineLamp("g") { MainLampIdOfGreen = "rgb"}, - new GamelogicEngineLamp("b") { MainLampIdOfBlue = "rgb"} + new GamelogicEngineLamp("r") { Description = "red", DeviceHint = "rgb", Channel = ColorChannel.Red}, + new GamelogicEngineLamp("g") { Description = "green", DeviceHint = "rgb", Channel = ColorChannel.Green}, + new GamelogicEngineLamp("b") { Description = "blue", DeviceHint = "rgb", Channel = ColorChannel.Blue}, }; tableComponent.MappingConfig.Clear(); tableComponent.MappingConfig.PopulateLamps(gameEngineLamps, tableComponent); - tableComponent.MappingConfig.Lamps.Should().HaveCount(1); - tableComponent.MappingConfig.Lamps[0].Id.Should().Be("rgb"); - tableComponent.MappingConfig.Lamps[0].Green.Should().Be("g"); - tableComponent.MappingConfig.Lamps[0].Blue.Should().Be("b"); - tableComponent.MappingConfig.Lamps[0].Description.Should().Be("RGB"); + tableComponent.MappingConfig.Lamps.Should().HaveCount(3); + tableComponent.MappingConfig.Lamps[2].Id.Should().Be("r"); + tableComponent.MappingConfig.Lamps[2].Channel.Should().Be(ColorChannel.Red); + tableComponent.MappingConfig.Lamps[1].Id.Should().Be("g"); + tableComponent.MappingConfig.Lamps[1].Channel.Should().Be(ColorChannel.Green); + tableComponent.MappingConfig.Lamps[0].Id.Should().Be("b"); + tableComponent.MappingConfig.Lamps[0].Channel.Should().Be(ColorChannel.Blue); + tableComponent.MappingConfig.Lamps[0].Device.name.Should().Be("my_rgb_light"); + tableComponent.MappingConfig.Lamps[1].Device.name.Should().Be("my_rgb_light"); + tableComponent.MappingConfig.Lamps[2].Device.name.Should().Be("my_rgb_light"); tableComponent.MappingConfig.Lamps[0].DeviceItem.Should().Be(LightComponent.LampIdDefault); } - [Test] - public void ShouldCreateMapAnRgbLampIfRisMissing() - { - var table = new TableBuilder() - .AddLight("my_rgb_light") - .Build(); - - var go = VpxImportEngine.ImportIntoScene(table, options: ConvertOptions.SkipNone); - var tableComponent = go.GetComponent(); - - var gameEngineLamps = new[] { - new GamelogicEngineLamp("g") { Description = "RGB", MainLampIdOfGreen = "rgb"}, - new GamelogicEngineLamp("b") { MainLampIdOfBlue = "rgb"} - }; - - tableComponent.MappingConfig.Clear(); - tableComponent.MappingConfig.PopulateLamps(gameEngineLamps, tableComponent); - - tableComponent.MappingConfig.Lamps.Should().HaveCount(1); - tableComponent.MappingConfig.Lamps[0].Id.Should().Be("rgb"); - tableComponent.MappingConfig.Lamps[0].Green.Should().Be("g"); - tableComponent.MappingConfig.Lamps[0].Blue.Should().Be("b"); - tableComponent.MappingConfig.Lamps[0].Description.Should().BeEmpty(); - tableComponent.MappingConfig.Lamps[0].Device.Should().BeNull(); - tableComponent.MappingConfig.Lamps[0].DeviceItem.Should().BeEmpty(); - } - [Test] public void ShouldReturnAllLampIds() { From 093199cf7f443acd6f09fcc78b40991fd34edbd2 Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 8 Oct 2021 00:09:08 +0200 Subject: [PATCH 14/58] light: Add light group. --- .../VPT/Light/LightGroupInspector.cs | 79 +++++++++++++++++ .../VPT/Light/LightGroupInspector.cs.meta | 11 +++ .../VisualPinball.Unity/Game/Player.cs | 7 +- .../VisualPinball.Unity/VPT/IApi.cs | 4 +- .../VPT/Light/LightComponent.cs | 9 ++ .../VPT/Light/LightGroupApi.cs | 86 +++++++++++++++++++ .../VPT/Light/LightGroupApi.cs.meta | 11 +++ .../VPT/Light/LightGroupComponent.cs | 64 ++++++++++++++ .../VPT/Light/LightGroupComponent.cs.meta | 11 +++ 9 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs create mode 100644 VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs.meta create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs.meta create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs new file mode 100644 index 000000000..da82e7f6f --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs @@ -0,0 +1,79 @@ +// 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 . + +// ReSharper disable AssignmentInConditionalExpression + +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace VisualPinball.Unity.Editor +{ + [CustomEditor(typeof(LightGroupComponent)), CanEditMultipleObjects] + public class LightGroupInspector : ItemInspector + { + private LightGroupComponent _lightGroupComponent; + private SerializedProperty _lightGroupProperty; + + protected override MonoBehaviour UndoTarget => target as MonoBehaviour; + + protected override void OnEnable() + { + base.OnEnable(); + + _lightGroupComponent = target as LightGroupComponent; + _lightGroupProperty = serializedObject.FindProperty(nameof(LightGroupComponent.Lights)); + } + + public override void OnInspectorGUI() + { + BeginEditing(); + + OnPreInspectorGUI(); + + PropertyField(_lightGroupProperty, "Lights"); + + GUILayout.Space(10); + if (GUILayout.Button("Add Children")) { + var lights = _lightGroupComponent.GetComponentsInChildren(); + foreach (var light in lights) { + if (_lightGroupComponent.Lights.ToList().Contains(light)) { + continue; + } + _lightGroupProperty.InsertArrayElementAtIndex(_lightGroupProperty.arraySize); + _lightGroupProperty.GetArrayElementAtIndex(_lightGroupProperty.arraySize - 1).objectReferenceValue = light; + } + } + + if (GUILayout.Button("Replace With Children")) { + var lights = _lightGroupComponent.GetComponentsInChildren(); + _lightGroupProperty.ClearArray(); + foreach (var light in lights) { + _lightGroupProperty.InsertArrayElementAtIndex(_lightGroupProperty.arraySize); + _lightGroupProperty.GetArrayElementAtIndex(_lightGroupProperty.arraySize - 1).objectReferenceValue = light; + } + } + + if (GUILayout.Button("Clear")) { + _lightGroupProperty.ClearArray(); + } + + base.OnInspectorGUI(); + + EndEditing(); + } + } +} diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs.meta b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs.meta new file mode 100644 index 000000000..1aba2e750 --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 94ce8eed531658b4cbdf8ce9cda376fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index 6591491b0..fc6666c1b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -221,7 +221,12 @@ public void RegisterKicker(KickerComponent component, Entity entity, Entity pare public void RegisterLamp(LightComponent component) { - Register(new LightApi(component.gameObject, this), component); + Register(component.GetApi(this), component); + } + + public void RegisterLampGroup(LightGroupComponent component) + { + Register(new LightGroupApi(component.Lights.Select(l => l.GetApi(this)).ToArray()), component); } public void RegisterPlunger(PlungerComponent component, Entity entity, Entity parentEntity, InputActionReference actionRef) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs index daaa208ee..c76362684 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/IApi.cs @@ -27,9 +27,11 @@ namespace VisualPinball.Unity /// public interface IApi { - void OnDestroy(); + public event EventHandler Init; void OnInit(BallManager ballManager); + + void OnDestroy(); } /// diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs index 1408a440e..95225d379 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs @@ -81,6 +81,15 @@ public class LightComponent : MainRenderableComponent, ILampDeviceCom #endregion + #region API + + public LightApi GetApi(Player player) => _api ??= new LightApi(gameObject, player); + + [NonSerialized] + private LightApi _api; + + #endregion + #region Wiring public IEnumerable AvailableLamps => new[] { diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs new file mode 100644 index 000000000..9700fb4ef --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs @@ -0,0 +1,86 @@ +// 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 System; +using VisualPinball.Engine.Math; +using Color = UnityEngine.Color; + +namespace VisualPinball.Unity +{ + public class LightGroupApi : IApi, IApiLamp, IApiWireDeviceDest + { + private readonly LightApi[] _apis; + + public LightGroupApi(LightApi[] apis) + { + _apis = apis; + } + + #region IApi + + /// + /// Event emitted when the table is started. + /// + public event EventHandler Init; + + void IApi.OnInit(BallManager ballManager) + { + Init?.Invoke(this, EventArgs.Empty); + } + + void IApi.OnDestroy() + { + } + + #endregion + + #region IApiLamp + + public Color Color + { + get => _color; + set { + _color = value; + Do(l => l.Color = value); + } + } + + private Color _color; + + void IApiWireDest.OnChange(bool enabled) => Do(l => l.OnChange(enabled)); + + void IApiLamp.OnLamp(float value, ColorChannel channel) => Do(l => l.OnLamp(value, channel)); + + void IApiLamp.OnLampColor(Color color) => Do(l => l.OnLampColor(color)); + + #endregion + + #region IApiWireDeviceDest + + IApiWireDest IApiWireDeviceDest.Wire(string deviceItem) => this; + + #endregion + + private void Do(Action action) + { + foreach (var api in _apis) { + if (api is T t) { + action(t); + } + } + } + } +} diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs.meta new file mode 100644 index 000000000..3cbc15dcd --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: baa09739346fe9f449d17e9f91528d81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs new file mode 100644 index 000000000..5054117b6 --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs @@ -0,0 +1,64 @@ +// 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 . + +// ReSharper disable InconsistentNaming + +using System; +using System.Collections.Generic; +using NLog; +using UnityEngine; +using VisualPinball.Engine.Game.Engines; +using Logger = NLog.Logger; + +namespace VisualPinball.Unity +{ + [AddComponentMenu("Visual Pinball/Game Item/Light Group")] + public class LightGroupComponent : MonoBehaviour, ILampDeviceComponent + { + public LightComponent[] Lights = Array.Empty(); + + #region Wiring + + public IEnumerable AvailableLamps => new[] { + new GamelogicEngineLamp(LightComponent.LampIdDefault), + }; + + public IEnumerable AvailableDeviceItems => AvailableLamps; + IEnumerable IWireableComponent.AvailableWireDestinations => AvailableLamps; + IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableLamps; + + #endregion + + #region Runtime + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + private void Awake() + { + var player = GetComponentInParent(); + if (player == null) { + Logger.Error($"Cannot find player for lamp group {name}."); + return; + } + + player.RegisterLampGroup(this); + } + + #endregion + + + } +} diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta new file mode 100644 index 000000000..3b067e2eb --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a14cb1b4771bcf4ea644878f499a6a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From bf6f3031a304aae244f255e4e30237c6cbcd49d3 Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 8 Oct 2021 00:57:57 +0200 Subject: [PATCH 15/58] patcher: Add abstract table patcher. --- .../Import/VpxSceneConverter.cs | 30 +-- .../VPT/Light/LightGroupInspector.cs | 11 + .../VPT/Light/LightInspector.cs | 12 + .../VPT/Trough/TroughExtensions.cs | 2 +- .../Matcher/Item/ItemMatchAttribute.cs | 1 - .../Matcher/Item/NameMatchAttribute.cs | 1 - .../Matcher/Item/RenderPipelineAttribute.cs | 1 - .../Matcher/TablePatcher.cs | 237 ++++++++++++++++++ .../Matcher/TablePatcher.cs.meta | 11 + .../Patcher/Patcher.cs | 16 +- .../Tables/CreatureFromTheBlackLagoon.cs | 5 +- .../Patcher/Tables/Goldorak.cs | 6 +- .../Patcher/Tables/IndianaJones.cs | 6 +- .../Patcher/Tables/JurassicPark.cs | 3 +- .../Patcher/Tables/Mississippi.cs | 3 +- .../Patcher/Tables/Terminator2.cs | 75 ++---- .../Patcher/Tables/TomAndJerry.cs | 3 +- .../Patcher/Tables/WipeOut.cs | 4 +- .../VisualPinball.Unity.Patcher.asmdef | 39 +-- .../Import/PatcherManager.cs | 1 + .../VPT/Trough/TroughExtensions.cs | 40 +++ .../VPT/Trough/TroughExtensions.cs.meta | 11 + 22 files changed, 403 insertions(+), 115 deletions(-) create mode 100644 VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs create mode 100644 VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs.meta create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs.meta diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs index 0ca1aa533..92782a9be 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs @@ -268,6 +268,11 @@ private Dictionary UpdateGameItems(Dictionary components) _tableGo.AddComponent(); var dga = _tableGo.AddComponent(); - // add trough if none available - if (!_sourceContainer.HasTrough) { - CreateTrough(components); - } - // populate hardware _tableComponent.RepopulateHardware(dga); } - private void CreateTrough(Dictionary components) - { - var troughData = new TroughData("Trough") { - BallCount = 4, - SwitchCount = 4, - Type = TroughType.ModernMech - }; - if (_sourceContainer.Has("BallRelease")) { - troughData.PlayfieldExitKicker = "BallRelease"; - } - if (_sourceContainer.Has("Drain")) { - troughData.PlayfieldEntrySwitch = "Drain"; - } - var item = new Trough(troughData) { - StorageIndex = _sourceContainer.ItemDatas.Count() - }; - - InstantiateAndPersistPrefab(item, components); - } - private void CreateFileHierarchy() { if (!Directory.Exists("Assets/Tables/")) { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs index da82e7f6f..9598519bf 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightGroupInspector.cs @@ -16,6 +16,7 @@ // ReSharper disable AssignmentInConditionalExpression +using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; @@ -74,6 +75,16 @@ public override void OnInspectorGUI() base.OnInspectorGUI(); EndEditing(); + + GUILayout.Space(10); + if (GUILayout.Button("Select Light Sources")) { + var selection = new List(); + foreach (var lightComponent in _lightGroupComponent.Lights) { + selection.AddRange(lightComponent.GetComponentsInChildren().Select(l => l.gameObject)); + } + + Selection.objects = selection.ToArray(); + } } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightInspector.cs index de1c861b4..b546a100a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Light/LightInspector.cs @@ -16,9 +16,13 @@ // ReSharper disable AssignmentInConditionalExpression +using System.Collections.Generic; +using System.Linq; using UnityEditor; +using UnityEngine; using VisualPinball.Engine.VPT; using VisualPinball.Engine.VPT.Light; +using Light = VisualPinball.Engine.VPT.Light.Light; namespace VisualPinball.Unity.Editor { @@ -79,6 +83,14 @@ public override void OnInspectorGUI() base.OnInspectorGUI(); EndEditing(); + + GUILayout.Space(10); + if (GUILayout.Button("Select Light Source")) { + Selection.objects = MainComponent + .GetComponentsInChildren() + .Select(l => l.gameObject as Object) + .ToArray(); + } } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Trough/TroughExtensions.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Trough/TroughExtensions.cs index dbe8bca21..eaad4a58f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Trough/TroughExtensions.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Trough/TroughExtensions.cs @@ -23,7 +23,7 @@ public static class TroughExtensions { internal static IVpxPrefab InstantiatePrefab(this Trough trough) { - var prefab = UnityEngine.Resources.Load("Prefabs/Trough"); + var prefab = Resources.Load("Prefabs/Trough"); return new VpxPrefab(prefab, trough); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs index 1bc3fcb38..2a77ae2a2 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs @@ -16,7 +16,6 @@ using System; using UnityEngine; -using VisualPinball.Engine.Game; using VisualPinball.Engine.VPT.Table; namespace VisualPinball.Unity.Patcher diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/NameMatchAttribute.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/NameMatchAttribute.cs index c5e8fba01..240f93d20 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/NameMatchAttribute.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/NameMatchAttribute.cs @@ -16,7 +16,6 @@ using System; using UnityEngine; -using VisualPinball.Engine.Game; using VisualPinball.Engine.VPT.Table; namespace VisualPinball.Unity.Patcher diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/RenderPipelineAttribute.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/RenderPipelineAttribute.cs index 062e63532..cbe9baaee 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/RenderPipelineAttribute.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/RenderPipelineAttribute.cs @@ -15,7 +15,6 @@ // along with this program. If not, see . using UnityEngine; -using VisualPinball.Engine.Game; using VisualPinball.Engine.VPT.Table; namespace VisualPinball.Unity.Patcher.Matcher.Item diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs new file mode 100644 index 000000000..4603c2ec9 --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -0,0 +1,237 @@ +// 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 System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using VisualPinball.Engine.VPT; +using VisualPinball.Engine.VPT.Trough; +using VisualPinball.Unity.Editor; +using Object = UnityEngine.Object; + +namespace VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher +{ + [Api] + public abstract class TablePatcher + { + public virtual void PostPatch(GameObject tableGo) + { + CreateTrough(tableGo, Playfield(tableGo)); + } + + #region GameObject Helpers + + /// + /// Returns the playfield of a given table game object. + /// + /// Table game object + /// + protected static GameObject Playfield(GameObject tableGo) + { + var pf = tableGo.GetComponentInChildren(); + if (pf) { + return pf.gameObject; + } + + Debug.LogWarning($"Cannot find playfield of \"{tableGo.name}\"."); + return tableGo; + + } + + /// + /// Creates an empty game object. + /// + /// Parent of the new game object + /// Name of the new game object + /// + protected static GameObject CreateEmptyGameObject(GameObject parentGo, string name) + { + var newGo = new GameObject(name); + newGo.transform.SetParent(parentGo.transform); + return newGo; + } + + #endregion + + #region Element Helpers + + /// + /// Creates a trough. + /// + /// Table game object, for retrieving references + /// Parent game object of the new trough + /// Name of the new trough + /// Name of the exit kicker + /// Name of the entry switch + protected static void CreateTrough(GameObject tableGo, GameObject parentGo, + string name = "Trough", string exitKicker = "BallRelease", string entrySwitch = "Drain") + { + var trough = new Trough(new TroughData { + BallCount = 4, + SwitchCount = 4, + Type = TroughType.ModernMech, + }); + + var troughGo = trough.InstantiateEditorPrefab(parentGo.transform); + var troughComponent = troughGo.GetComponent(); + + var kickers = tableGo.GetComponentsInChildren(); + foreach (var kicker in kickers) { + if (string.Equals(kicker.name, exitKicker, StringComparison.OrdinalIgnoreCase)) { + troughComponent.PlayfieldExitKicker = kicker; + } + if (string.Equals(kicker.name, entrySwitch, StringComparison.OrdinalIgnoreCase)) { + troughComponent.PlayfieldEntrySwitch = kicker; + } + } + + if (troughComponent.PlayfieldEntrySwitch == null) { + var triggers = tableGo.GetComponentsInChildren(); + foreach (var trigger in triggers) { + + if (string.Equals(trigger.name, entrySwitch, StringComparison.OrdinalIgnoreCase)) { + troughComponent.PlayfieldEntrySwitch = trigger; + } + } + } + + troughGo.name = name; + } + + #endregion + + #region Light Helpers + + /// + /// Adds a light group component to an existing game object. + /// + /// Table game object for retrieving light references. + /// Game object to which the light group is added to. + /// A list of light names that are part of the light group. + protected static void AddLightGroup(GameObject tableGo, GameObject go, params string[] names) + { + var nameIndex = new HashSet(names); + var lightComponentGroup = go.AddComponent(); + var lights = tableGo + .GetComponentsInChildren() + .Where(lc => nameIndex.Contains(lc.name)); + lightComponentGroup.Lights = lights.ToArray(); + } + + /// + /// Sets the light color of a light source. + /// + /// + /// Supports multiple light sources. + /// + /// Game object of the light source + /// New color of the light source + protected static void LightColor(GameObject go, Color color) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SetColor(light, color); + } + } + + /// + /// Sets the angle of a spot light. + /// + /// + /// Supports multiple light sources. + /// + /// Game object of the spot light + /// Outer angle of the spot + /// Inner angle of the spot, in percent of the outer angle + protected static void SpotAngle(GameObject go, float outer, float inner) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SpotLight(light, outer, inner); + } + } + + /// + /// Sets a light source to pyramid spotlight and sets its parameters. + /// + /// + /// Supports multiple light sources. + /// + /// Game object of the light source + /// Angle of the pyramid + /// Aspect ratio of the pyramid + protected static void PyramidAngle(GameObject go, float angle, float ar) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.PyramidAngle(light, angle, ar); + } + } + + /// + /// Sets the intensity of a light source in lumen. + /// + /// + /// Supports multiple light sources. + /// + /// Game object of the light source + /// Intensity of the light in lumen + protected static void Intensity(GameObject go, float intensityLumen) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SetIntensity(light, intensityLumen); + } + } + + /// + /// Sets the light position. + /// + /// + /// Supports multiple light sources. Note that this only applies to the light source, not to the light itself. + /// + /// Game object of the light source + /// X-position of the source relative to the light + /// Y-position of the source relative to the light + /// Z-position of the source relative to the light + protected static void LightPos(GameObject go, float x, float y, float z) + { + var light = go.GetComponentInChildren(); + if (light != null) { + light.gameObject.transform.localPosition = new Vector3(x, y, z); + } + } + + /// + /// Duplicates a light source. + /// + /// Game object of the light source + /// X-position of the new light source, relative to the lamp + /// Y-position of the new light source, relative to the lamp + /// Z-position of the new light source, relative to the lamp + protected static void Duplicate(GameObject go, float x, float y, float z) + { + var light = go.GetComponentInChildren(); + if (light != null) { + var newGo = Object.Instantiate(light.gameObject, go.transform, true); + newGo.transform.localPosition = new Vector3(x, y, z); + } + } + + #endregion + } +} diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs.meta b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs.meta new file mode 100644 index 000000000..dc0d95ed9 --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f2db227803e55c64fac564f27a2464b2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs index e0e3ab6f5..e773a70bc 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs @@ -22,14 +22,13 @@ using System.Reflection; using NLog; using UnityEngine; -using VisualPinball.Engine.Game; -using VisualPinball.Engine.VPT; using VisualPinball.Engine.VPT.Table; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; using Logger = NLog.Logger; namespace VisualPinball.Unity.Patcher { - public class Patcher : IPatcher + public sealed class Patcher : IPatcher { private readonly List _patchers = new List(); private FileTableContainer _tableContainer; @@ -59,6 +58,8 @@ public void ApplyPatches(GameObject gameObject, GameObject tableGameObject) { foreach (var patcher in _patchers) { var methods = patcher.GetType().GetMembers().Where(member => member.MemberType == MemberTypes.Method); + + foreach (var method in methods) { var methodMatchers = Attribute .GetCustomAttributes(method, typeof(ItemMatchAttribute)) @@ -135,5 +136,14 @@ public void ApplyPatches(GameObject gameObject, GameObject tableGameObject) } } } + + public void PostPatch(GameObject go) + { + foreach (var patcher in _patchers) { + if (patcher is TablePatcher p) { + p.PostPatch(go); + } + } + } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs index cc2f249d4..0425f05ed 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs @@ -15,13 +15,16 @@ // along with this program. If not, see . // ReSharper disable StringLiteralTypo +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global using UnityEngine; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Creature From The Black Lagoon", AuthorName = "fuzzel, flupper1, rothbauerw")] - public class CreatureFromTheBlackLagoon + public class CreatureFromTheBlackLagoon : TablePatcher { [NameMatch("batleft", Ref = "Playfield/Flippers/LeftFlipper")] [NameMatch("batright", Ref = "Playfield/Flippers/RightFlipper")] diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs index df26bf556..307da3e5d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs @@ -15,14 +15,16 @@ // along with this program. If not, see . // ReSharper disable StringLiteralTypo +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global using UnityEngine; -using VisualPinball.Engine.VPT.Primitive; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Goldorak", AuthorName = "Rom (Future PinBall) Javier VPX")] - public class Goldorak + public class Goldorak : TablePatcher { [NameMatch("LFLogo", Ref = "Playfield/Flippers/LeftFlipper")] [NameMatch("RFLogo", Ref = "Playfield/Flippers/RightFlipper")] diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs index d17554eee..488fcfe67 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs @@ -15,15 +15,17 @@ // along with this program. If not, see . // ReSharper disable StringLiteralTypo +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global using UnityEngine; using UnityEngine.Rendering; -using VisualPinball.Engine.VPT.Primitive; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Indiana Jones - The Pinball Adventure", AuthorName = "ninuzzu,tom tower")] - public class IndianaJones + public class IndianaJones : TablePatcher { [NameMatch("LeftFlipperSh", IgnoreCase = false)] [NameMatch("RightFlipperSh")] diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs index 3daf52e35..3a7c17a42 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs @@ -20,11 +20,12 @@ using UnityEngine; using UnityEngine.Rendering; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Jurassic Park (Data East)", AuthorName = "Dark & Friends")] - public class JurassicPark + public class JurassicPark : TablePatcher { #region Shader Properties diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs index deffbc61c..706cc0641 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs @@ -19,11 +19,12 @@ // ReSharper disable UnusedMember.Global using UnityEngine; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Mississipi", AuthorName = "jpsalas, akiles50000, Loserman")] - public class Mississippi + public class Mississippi : TablePatcher { [NameMatch("lrail1", Ref = "Playfield/Ramps/lrail1/LeftWall")] // left outside wall to the left [NameMatch("rrail1", Ref = "Playfield/Ramps/rrail1/LeftWall")] // left inside wall to the right diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 7ca826f95..2656a8bb7 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -17,15 +17,32 @@ // ReSharper disable StringLiteralTypo // ReSharper disable InconsistentNaming // ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global using UnityEngine; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Terminator 2 (Williams 1991)", AuthorName = "NFOZZY")] [MetaMatch(TableName = "Terminator 2 - Judgment Day (Williams 1991)", AuthorName = "g5k")] - public class Terminator2 + public class Terminator2 : TablePatcher { + + public override void PostPatch(GameObject tableGo) + { + var pf = Playfield(tableGo); + + // create GI light groups + var gi = CreateEmptyGameObject(pf, "GI"); + var gi2 = CreateEmptyGameObject(gi, "GI2"); + var gi3 = CreateEmptyGameObject(gi, "GI3"); + AddLightGroup(tableGo, gi2, "B1", "B2", "B3", "GI_1", "GI_2", "GI_3", "GI_4", "GI_5", "GI_6", "GI_7", "GI_8", "GI_9", "GI_10", "GI_11", "GI_12", "GI_13", "GI_14", "GI_15", "GI_16", "GI_17", "GI_18", "GI_19", "GI_20"); + AddLightGroup(tableGo, gi3, "GI_21", "GI_22", "GI_23", "GI_24", "GI_25", "GI_26", "GI_27", "GI_28", "GI_29", "GI_30", "GI_31", "GI_32", "GI_33", "GI_34", "GI_35", "GI_36"); + + base.PostPatch(tableGo); + } + [NameMatch("LeftRampCover")] [NameMatch("LeftRampSign")] [NameMatch("RightRampCover")] @@ -57,7 +74,7 @@ public void FixSw17(KickerComponent kickerComponent) #region Lights - #region General Shapes + #region Insert Shapes [NameMatch("L43")] [NameMatch("L44")] @@ -215,6 +232,8 @@ public void MidSizedTrianglesYellow(GameObject go) #endregion + #region Insert Positions + [NameMatch("L11")] public void Insert2xPos(GameObject go) => LightPos(go, 28.6f, 9.6f, -50f); [NameMatch("L12")] public void Insert4xPos(GameObject go) => LightPos(go, 22.4f, 25.1f, -50f); [NameMatch("L13")] public void InsertHoldBonus(GameObject go) => LightPos(go, 0f, 35f, -50f); @@ -369,58 +388,6 @@ public void YellowBox(GameObject go) LightColor(go, Color.yellow); } - - #region Helpers - - private static void LightColor(GameObject go, Color color) - { - var lights = go.GetComponentsInChildren(); - foreach (var light in lights) { - RenderPipeline.Current.LightConverter.SetColor(light, color); - } - } - - private static void SpotAngle(GameObject go, float outer, float inner) - { - var lights = go.GetComponentsInChildren(); - foreach (var light in lights) { - RenderPipeline.Current.LightConverter.SpotLight(light, outer, inner); - } - } - - private static void PyramidAngle(GameObject go, float angle, float ar) - { - var lights = go.GetComponentsInChildren(); - foreach (var light in lights) { - RenderPipeline.Current.LightConverter.PyramidAngle(light, angle, ar); - } - } - - private static void Intensity(GameObject go, float intensityLumen) - { - var lights = go.GetComponentsInChildren(); - foreach (var light in lights) { - RenderPipeline.Current.LightConverter.SetIntensity(light, intensityLumen); - } - } - - private static void LightPos(GameObject go, float x, float y, float z) - { - var light = go.GetComponentInChildren(); - if (light != null) { - light.gameObject.transform.localPosition = new Vector3(x, y, z); - } - } - - private static void Duplicate(GameObject go, float x, float y, float z) - { - var light = go.GetComponentInChildren(); - if (light != null) { - var newGo = Object.Instantiate(light.gameObject, go.transform, true); - newGo.transform.localPosition = new Vector3(x, y, z); - } - } - #endregion #endregion diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs index 702b90f12..c25426998 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs @@ -20,11 +20,12 @@ using UnityEngine; using VisualPinball.Unity.Patcher.Matcher.Table; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [TableNameMatch("TomandJerry")] - public class TomAndJerry + public class TomAndJerry : TablePatcher { [NameMatch("ShadowsRamp")] [NameMatch("JerryHAMMERshadow")] diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs index 2127aa09d..efdd82ba9 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs @@ -19,12 +19,12 @@ // ReSharper disable UnusedMember.Global using UnityEngine; -using VisualPinball.Engine.VPT.Primitive; +using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Wipe Out Premier 1993", AuthorName = "Edizzle & Kiwi")] - public class WipeOut + public class WipeOut : TablePatcher { [NameMatch("Prim_RightFlipper", Ref="Playfield/Flippers/RightFlipper")] [NameMatch("Prim_LeftFlipper", Ref="Playfield/Flippers/LeftFlipper")] diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef b/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef index 1cf9828d9..741aae468 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef @@ -1,19 +1,20 @@ -{ - "name": "VisualPinball.Unity.Patcher", - "rootNamespace": "", - "references": [ - "VisualPinball.Engine", - "VisualPinball.Unity" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file +{ + "name": "VisualPinball.Unity.Patcher", + "rootNamespace": "VisualPinball.Unity.Patcher", + "references": [ + "VisualPinball.Engine", + "VisualPinball.Unity", + "Unity.Entities.Hybrid" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs b/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs index 24f812e12..e5bc641da 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs @@ -9,6 +9,7 @@ public interface IPatcher { void Set(FileTableContainer tableContainer, string filename); void ApplyPatches(GameObject gameObject, GameObject tableGameObject); + void PostPatch(GameObject tableGameObject); } public static class PatcherManager diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs new file mode 100644 index 000000000..7a5567244 --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs @@ -0,0 +1,40 @@ +// 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 UnityEngine; +using VisualPinball.Engine.VPT.Trough; + +namespace VisualPinball.Unity.Editor +{ + public static class TroughExtensions + { + #if UNITY_EDITOR + + public static GameObject InstantiateEditorPrefab(this Trough trough, Transform parent) + { + var prefab = Resources.Load("Prefabs/Trough"); + var troughGo = UnityEditor.PrefabUtility.InstantiatePrefab(prefab, parent) as GameObject; + if (!troughGo) { + return troughGo; + } + var troughComponent = troughGo.GetComponent(); + troughComponent.SetData(trough.Data); + return troughGo; + } + + #endif + } +} diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs.meta new file mode 100644 index 000000000..d60d562c1 --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Trough/TroughExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d3b53362f5dd54443b525fef2aac51a8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 12b40ac4222b2d46ba414b3a83947a48500240c7 Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 10 Oct 2021 22:34:05 +0200 Subject: [PATCH 16/58] lights: Add light group component. --- .../Matcher/Item/ItemMatchAttribute.cs | 2 + .../Patcher/Patcher.cs | 4 + .../Patcher/Tables/Terminator2.cs | 141 +++++++++++++++++- .../Rendering/ILightConverter.cs | 4 + .../Rendering/IMaterialConverter.cs | 19 +++ .../Standard/StandardLightConverter.cs | 9 ++ .../Standard/StandardMaterialConverter.cs | 21 ++- .../VisualPinball.Unity/VPT/Table/TableApi.cs | 4 + 8 files changed, 194 insertions(+), 10 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs index 2a77ae2a2..81fbd9a46 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/Item/ItemMatchAttribute.cs @@ -28,6 +28,8 @@ public abstract class ItemMatchAttribute : Attribute /// public string Ref; + public float FloatParam; + public abstract bool Matches(FileTableContainer tableContainer, GameObject obj); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs index e773a70bc..3b37de2a0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs @@ -116,6 +116,10 @@ public void ApplyPatches(GameObject gameObject, GameObject tableGameObject) } else if (pi.ParameterType == typeof(FileTableContainer)) { patcherParams[pi.Position] = _tableContainer; + // param from matcher + } else if (pi.ParameterType == typeof(float) && pi.Name == "param") { + patcherParams[pi.Position] = methodMatcher.FloatParam; + } else { Logger.Warn($"Unknown parameter {pi.ParameterType} {pi.Name} in patch method {patcher.GetType()}.{methodInfo.Name}(), skipping."); validArgs = false; diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 2656a8bb7..f9cdadff8 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -19,6 +19,7 @@ // ReSharper disable UnusedMember.Global // ReSharper disable UnusedType.Global +using UnityEditor; using UnityEngine; using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; @@ -35,14 +36,31 @@ public override void PostPatch(GameObject tableGo) // create GI light groups var gi = CreateEmptyGameObject(pf, "GI"); - var gi2 = CreateEmptyGameObject(gi, "GI2"); - var gi3 = CreateEmptyGameObject(gi, "GI3"); - AddLightGroup(tableGo, gi2, "B1", "B2", "B3", "GI_1", "GI_2", "GI_3", "GI_4", "GI_5", "GI_6", "GI_7", "GI_8", "GI_9", "GI_10", "GI_11", "GI_12", "GI_13", "GI_14", "GI_15", "GI_16", "GI_17", "GI_18", "GI_19", "GI_20"); - AddLightGroup(tableGo, gi3, "GI_21", "GI_22", "GI_23", "GI_24", "GI_25", "GI_26", "GI_27", "GI_28", "GI_29", "GI_30", "GI_31", "GI_32", "GI_33", "GI_34", "GI_35", "GI_36"); + var gi1 = CreateEmptyGameObject(gi, "CPU"); + var gi2 = CreateEmptyGameObject(gi, "Left Playfield"); + var gi3 = CreateEmptyGameObject(gi, "Right Playfield"); + AddLightGroup(tableGo, gi1, "Light2", "Light3", "Light4", "Light5"); + AddLightGroup(tableGo, gi2, "GI_35", "GI_1", "GI_3", "GI_4", "GI_12", "GI_7", + "GI_8", "GI_9", "GI_13", "GI_14", "GI_23", "GI_24", "GI_25", "GI_38"); + AddLightGroup(tableGo, gi3, "GI_36", "GI_2", "GI_5", "GI_6", "GI_10", "GI_11", "GI_15", "GI_16", "GI_18", "GI_19", "GI_17", + "GI_20", "GI_21", "GI_22", "GI_26", "GI_27", "GI_28", "GI_30", "GI_29", "GI_31", "GI_32", "GI_33", "GI_34", "GI_37", "B1", "B2", "B3"); + base.PostPatch(tableGo); } + [NameMatch("batleft", Ref = "Playfield/Flippers/LeftFlipper")] + [NameMatch("batright", Ref = "Playfield/Flippers/RightFlipper")] + public void ReparentFlippers(PrimitiveComponent flipper, GameObject gameObject, ref GameObject parent) + { + PatcherUtil.Reparent(gameObject, parent); + + flipper.Position.x = 0; + flipper.Position.y = 0; + + flipper.ObjectRotation.z = 0; + } + [NameMatch("LeftRampCover")] [NameMatch("LeftRampSign")] [NameMatch("RightRampCover")] @@ -71,9 +89,124 @@ public void FixSw17(KickerComponent kickerComponent) kickerComponent.Coils[0].Angle = 60; } + #region Materials + + [NameMatch("_Plastics")] + public void fixPlasticsMaterial(GameObject go) + { + var material = go.GetComponent().sharedMaterial; + RenderPipeline.Current.MaterialConverter.SetDiffusionProfile(material, DiffusionProfileTemplate.Plastics); + RenderPipeline.Current.MaterialConverter.SetMaterialType(material, MaterialType.Translucent); + } + + #endregion #region Lights + #region Global Illumination + + [NameMatch("B1")] + [NameMatch("B2")] + [NameMatch("B3")] + [NameMatch("GI_1")] + [NameMatch("GI_2")] + [NameMatch("GI_3")] + [NameMatch("GI_4")] + [NameMatch("GI_5")] + [NameMatch("GI_6")] + [NameMatch("GI_7")] + [NameMatch("GI_8")] + [NameMatch("GI_9")] + [NameMatch("GI_10")] + [NameMatch("GI_11")] + [NameMatch("GI_12")] + [NameMatch("GI_13")] + [NameMatch("GI_14")] + [NameMatch("GI_15")] + [NameMatch("GI_16")] + [NameMatch("GI_17")] + [NameMatch("GI_18")] + [NameMatch("GI_19")] + [NameMatch("GI_20")] + [NameMatch("GI_21")] + [NameMatch("GI_22")] + [NameMatch("GI_23")] + [NameMatch("GI_24")] + [NameMatch("GI_25")] + [NameMatch("GI_26")] + [NameMatch("GI_27")] + [NameMatch("GI_28")] + [NameMatch("GI_29")] + [NameMatch("GI_30")] + [NameMatch("GI_31")] + [NameMatch("GI_32")] + [NameMatch("GI_33")] + [NameMatch("GI_34")] + [NameMatch("GI_35")] + [NameMatch("GI_36")] + [NameMatch("GI_37")] + [NameMatch("GI_38")] + public void GiIntensity(GameObject go) + { + foreach (var l in go.GetComponentsInChildren()) { + RenderPipeline.Current.LightConverter.SetIntensity(l, 1000f); + RenderPipeline.Current.LightConverter.SetTemperature(l, 2700); + } + } + + [NameMatch("GI_3", FloatParam = 0.01f)] + [NameMatch("GI_4", FloatParam = 0.01f)] + [NameMatch("GI_5", FloatParam = 0.02f)] + [NameMatch("GI_6", FloatParam = 0.01f)] + [NameMatch("GI_10", FloatParam = 0.01f)] + [NameMatch("GI_11", FloatParam = 0.01f)] + [NameMatch("GI_12", FloatParam = 0.01f)] + [NameMatch("GI_15", FloatParam = 0.02f)] + [NameMatch("GI_16", FloatParam = 0.02f)] + [NameMatch("GI_18", FloatParam = 0.01f)] + [NameMatch("GI_19", FloatParam = 0.02f)] + [NameMatch("GI_20", FloatParam = 0.02f)] + [NameMatch("GI_33", FloatParam = 0.02f)] + [NameMatch("GI_34", FloatParam = 0.02f)] + [NameMatch("GI_37", FloatParam = 0.01f)] + [NameMatch("GI_38", FloatParam = 0.01f)] + public void GiDynamicShadow(GameObject go, float param) + { + foreach (var l in go.GetComponentsInChildren()) { + RenderPipeline.Current.LightConverter.SetShadow(l, true, false, param); + } + } + + [NameMatch("GI_7", FloatParam = 0.01f)] // leaks + [NameMatch("GI_8", FloatParam = 0.01f)] // leaks + [NameMatch("GI_9", FloatParam = 0.01f)] // leaks + [NameMatch("GI_13", FloatParam = 0.01f)] // leaks + [NameMatch("GI_14", FloatParam = 0.01f)] // leaks + [NameMatch("GI_22", FloatParam = 0.01f)] // leaks + [NameMatch("GI_23", FloatParam = 0.01f)] // leaks + [NameMatch("GI_24", FloatParam = 0.01f)] // leaks (not too badly) + [NameMatch("GI_25", FloatParam = 0.01f)] // leaks (not too badly) + [NameMatch("GI_29", FloatParam = 0.01f)] // leaks + [NameMatch("GI_30", FloatParam = 0.01f)] // leaks + [NameMatch("GI_31", FloatParam = 0.01f)] // leaks + [NameMatch("GI_32", FloatParam = 0.01f)] // leaks + [NameMatch("GI_35", FloatParam = 0.01f)] // leaks (not too badly) + public void GiStaticShadow(GameObject go, float param) + { + foreach (var l in go.GetComponentsInChildren()) { + RenderPipeline.Current.LightConverter.SetShadow(l, true, false, param); + } + } + + [NameMatch("GI_27")] + [NameMatch("GI_28")] + public void GiDisable(GameObject go) + { + go.SetActive(false); + } + + #endregion + #region Insert Shapes [NameMatch("L43")] diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs index 7b4d696d1..92bc60b15 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs @@ -40,6 +40,8 @@ public interface ILightConverter /// New color void SetColor(Light light, Color color); + void SetShadow(Light light, bool enabled, bool isDynamic, float nearPlane = 0.01f); + /// /// Sets the intensity of a given light. /// @@ -47,6 +49,8 @@ public interface ILightConverter /// Intensity in Lumen void SetIntensity(Light light, float intensityLumen); + void SetTemperature(Light light, float temperature); + /// /// Sets the spotlight parameters of a light (doesn't set it to spotlight) /// diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs index 6028bcde9..70332bb9f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs @@ -57,6 +57,25 @@ public interface IMaterialConverter /// Merged material Material MergeMaterials(PbrMaterial vpxMaterial, Material unityTextureMaterial); + void SetDiffusionProfile(Material material, DiffusionProfileTemplate template); + + void SetMaterialType(Material material, MaterialType materialType); + int NormalMapProperty { get; } } + + public enum DiffusionProfileTemplate + { + Plastics + } + + public enum MaterialType + { + Standard, + SubsurfaceScattering, + Anisotropy, + Iridescence, + SpecularColor, + Translucent + } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs index 940f8f9d7..e8134186c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs @@ -44,11 +44,20 @@ public void SetColor(Light light, Color color) { light.color = color; } + public void SetShadow(Light light, bool enabled, bool isDynamic, float nearPlane = 0.01f) + { + light.shadows = enabled ? LightShadows.Soft : LightShadows.None; + light.shadowNearPlane = nearPlane; + } public void SetIntensity(Light light, float intensityLumen) { light.intensity = intensityLumen; } + public void SetTemperature(Light light, float temperature) + { + + } public void SpotLight(Light light, float outer, float innerPercent) { diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs index c7b2051e1..ab5a0e6a3 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs @@ -24,8 +24,8 @@ namespace VisualPinball.Unity { public class StandardMaterialConverter : IMaterialConverter { - public Material DotMatrixDisplay => UnityEngine.Resources.Load("Materials/Dot Matrix Display (Builtin)"); - public Material SegmentDisplay => UnityEngine.Resources.Load("Materials/Segment Display (Builtin)"); + public Material DotMatrixDisplay => Resources.Load("Materials/Dot Matrix Display (Builtin)"); + public Material SegmentDisplay => Resources.Load("Materials/Segment Display (Builtin)"); public int NormalMapProperty => NormalMap; @@ -58,11 +58,11 @@ public static Material GetDefaultMaterial(BlendMode blendMode) switch (blendMode) { case BlendMode.Opaque: - return UnityEngine.Resources.Load("Materials/Table Opaque (Builtin)"); + return Resources.Load("Materials/Table Opaque (Builtin)"); case BlendMode.Cutout: - return UnityEngine.Resources.Load("Materials/Table Cutout (Builtin)"); + return Resources.Load("Materials/Table Cutout (Builtin)"); case BlendMode.Translucent: - return UnityEngine.Resources.Load("Materials/Table Translucent (Builtin)"); + return Resources.Load("Materials/Table Translucent (Builtin)"); default: throw new ArgumentOutOfRangeException("Undefined blend mode " + blendMode); } @@ -127,7 +127,7 @@ public Material CreateMaterial(PbrMaterial vpxMaterial, ITextureProvider texture public Material MergeMaterials(PbrMaterial vpxMaterial, Material texturedMaterial) { - var nonTexturedMaterial = CreateMaterial(vpxMaterial, null, null); + var nonTexturedMaterial = CreateMaterial(vpxMaterial, null); var mergedMaterial = new Material(GetShader()); mergedMaterial.CopyPropertiesFromMaterial(texturedMaterial); @@ -138,5 +138,14 @@ public Material MergeMaterials(PbrMaterial vpxMaterial, Material texturedMateria return mergedMaterial; } + + public void SetDiffusionProfile(Material material, DiffusionProfileTemplate template) + { + // don't think that standard renderer supports this.. + } + + public void SetMaterialType(Material material, MaterialType materialType) + { + } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs index 0a4ea8b19..793bc4552 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs @@ -33,6 +33,7 @@ public class TableApi : IApi private readonly Dictionary _hitTargetsByName = new Dictionary(); private readonly Dictionary _kickersByName = new Dictionary(); private readonly Dictionary _lightsByName = new Dictionary(); + private readonly Dictionary _lightGroupsByName = new Dictionary(); private readonly Dictionary _plungersByName = new Dictionary(); private readonly Dictionary _rampsByName = new Dictionary(); private readonly Dictionary _rubbersByName = new Dictionary(); @@ -49,6 +50,7 @@ public class TableApi : IApi private readonly Dictionary _hitTargetsByComponent = new Dictionary(); private readonly Dictionary _kickersByComponent = new Dictionary(); private readonly Dictionary _lightsByComponent = new Dictionary(); + private readonly Dictionary _lightGroupsByComponent = new Dictionary(); private readonly Dictionary _plungersByComponent = new Dictionary(); private readonly Dictionary _rampsByComponent = new Dictionary(); private readonly Dictionary _rubbersByComponent = new Dictionary(); @@ -217,6 +219,7 @@ private Dictionary GetNameDictionary(Type t) where T : IApi if (t == typeof(HitTargetApi)) return _hitTargetsByName as Dictionary; if (t == typeof(KickerApi)) return _kickersByName as Dictionary; if (t == typeof(LightApi)) return _lightsByName as Dictionary; + if (t == typeof(LightGroupApi)) return _lightGroupsByName as Dictionary; if (t == typeof(PlungerApi)) return _plungersByName as Dictionary; if (t == typeof(RampApi)) return _rampsByName as Dictionary; if (t == typeof(RubberApi)) return _rubbersByName as Dictionary; @@ -237,6 +240,7 @@ private Dictionary GetComponentDictionary(Type t) where T : if (t == typeof(HitTargetApi)) return _hitTargetsByComponent as Dictionary; if (t == typeof(KickerApi)) return _kickersByComponent as Dictionary; if (t == typeof(LightApi)) return _lightsByComponent as Dictionary; + if (t == typeof(LightGroupApi)) return _lightGroupsByComponent as Dictionary; if (t == typeof(PlungerApi)) return _plungersByComponent as Dictionary; if (t == typeof(RampApi)) return _rampsByComponent as Dictionary; if (t == typeof(RubberApi)) return _rubbersByComponent as Dictionary; From 52823704b761bf220d0c9b50852541c89658a475 Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 11 Oct 2021 00:19:39 +0200 Subject: [PATCH 17/58] t2: Fix material for playfield and inserts. --- VisualPinball.Engine/VPT/PbrMaterial.cs | 20 +++++++++++++++++++ .../VPT/Table/TableMeshGenerator.cs | 4 +++- .../Import/VpxSceneConverter.cs | 10 +++++----- .../Patcher/Tables/Terminator2.cs | 13 ++++++++++-- .../VisualPinball.Unity.Patcher.asmdef | 1 + .../Rendering/IMaterialConverter.cs | 17 ++-------------- .../Standard/StandardMaterialConverter.cs | 7 ++++++- .../VPT/Light/LightInsertMeshComponent.cs | 7 ++++--- 8 files changed, 52 insertions(+), 27 deletions(-) diff --git a/VisualPinball.Engine/VPT/PbrMaterial.cs b/VisualPinball.Engine/VPT/PbrMaterial.cs index b62eff922..c77529d8c 100644 --- a/VisualPinball.Engine/VPT/PbrMaterial.cs +++ b/VisualPinball.Engine/VPT/PbrMaterial.cs @@ -39,6 +39,10 @@ public class PbrMaterial public bool IsOpacityActive => _material?.IsOpacityActive ?? false; public float Opacity => MathF.Min(1, MathF.Max(0, _material?.Opacity ?? 1f)); public float Roughness => _material?.Roughness ?? 0.5f; + + public MaterialType MaterialType = MaterialType.Translucent; + public DiffusionProfileTemplate DiffusionProfile = DiffusionProfileTemplate.None; + private float Edge => _material?.Edge ?? 0f; public const string NameNoMaterial = "__std"; @@ -155,4 +159,20 @@ public enum BlendMode Cutout, Translucent } + + public enum DiffusionProfileTemplate + { + None, + Plastics + } + + public enum MaterialType + { + SubsurfaceScattering = 0, + Standard = 1, + Anisotropy = 2, + Iridescence = 3, + SpecularColor = 4, + Translucent = 5, + } } diff --git a/VisualPinball.Engine/VPT/Table/TableMeshGenerator.cs b/VisualPinball.Engine/VPT/Table/TableMeshGenerator.cs index b3347c1ff..9a712325e 100644 --- a/VisualPinball.Engine/VPT/Table/TableMeshGenerator.cs +++ b/VisualPinball.Engine/VPT/Table/TableMeshGenerator.cs @@ -45,7 +45,9 @@ public Mesh GetMesh(Table table, bool asRightHanded = true) public PbrMaterial GetMaterial(Table table) { - return new PbrMaterial(table.GetMaterial(_data.PlayfieldMaterial), table.GetTexture(_data.Image)); + return new PbrMaterial(table.GetMaterial(_data.PlayfieldMaterial), table.GetTexture(_data.Image)) { + MaterialType = MaterialType.Standard + }; } public void SetFromPrimitive(Primitive.Primitive primitive) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs index 92782a9be..319d92c2e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs @@ -155,6 +155,11 @@ public GameObject Convert(bool applyPatch = true, string tableName = null) ConfigurePlayer(componentLookup); + // patch + if (_applyPatch) { + _patcher?.PostPatch(_tableGo); + } + return _tableGo; } @@ -268,11 +273,6 @@ private Dictionary UpdateGameItems(Dictionary().sharedMaterial, 0.96f); + + // GLE + Object.DestroyImmediate(tableGo.GetComponent()); + var pinmameGle = tableGo.AddComponent(); + pinmameGle.Game = new Engine.PinMAME.Games.Terminator2(); + pinmameGle.romId = "t2_l82"; + // create GI light groups var gi = CreateEmptyGameObject(pf, "GI"); var gi1 = CreateEmptyGameObject(gi, "CPU"); @@ -45,7 +55,6 @@ public override void PostPatch(GameObject tableGo) AddLightGroup(tableGo, gi3, "GI_36", "GI_2", "GI_5", "GI_6", "GI_10", "GI_11", "GI_15", "GI_16", "GI_18", "GI_19", "GI_17", "GI_20", "GI_21", "GI_22", "GI_26", "GI_27", "GI_28", "GI_30", "GI_29", "GI_31", "GI_32", "GI_33", "GI_34", "GI_37", "B1", "B2", "B3"); - base.PostPatch(tableGo); } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef b/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef index 741aae468..74b35105d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/VisualPinball.Unity.Patcher.asmdef @@ -4,6 +4,7 @@ "references": [ "VisualPinball.Engine", "VisualPinball.Unity", + "VisualPinball.Engine.PinMAME.Unity", "Unity.Entities.Hybrid" ], "includePlatforms": [ diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs index 70332bb9f..8d17c2c8f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/IMaterialConverter.cs @@ -61,21 +61,8 @@ public interface IMaterialConverter void SetMaterialType(Material material, MaterialType materialType); - int NormalMapProperty { get; } - } + void SetSmoothness(Material material, float smoothness); - public enum DiffusionProfileTemplate - { - Plastics - } - - public enum MaterialType - { - Standard, - SubsurfaceScattering, - Anisotropy, - Iridescence, - SpecularColor, - Translucent + int NormalMapProperty { get; } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs index ab5a0e6a3..ccd1802a0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardMaterialConverter.cs @@ -107,7 +107,7 @@ public Material CreateMaterial(PbrMaterial vpxMaterial, ITextureProvider texture unityMaterial.SetFloat(Metallic, metallicValue); // roughness / glossiness - unityMaterial.SetFloat(Smoothness, vpxMaterial.Roughness); + SetSmoothness(unityMaterial, vpxMaterial.Roughness); // map if (vpxMaterial.HasMap && textureProvider != null) { @@ -139,6 +139,11 @@ public Material MergeMaterials(PbrMaterial vpxMaterial, Material texturedMateria return mergedMaterial; } + public void SetSmoothness(Material unityMaterial, float smoothness) + { + unityMaterial.SetFloat(Smoothness, smoothness); + } + public void SetDiffusionProfile(Material material, DiffusionProfileTemplate template) { // don't think that standard renderer supports this.. diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs index a4ce628d5..8e2555d0d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightInsertMeshComponent.cs @@ -58,10 +58,11 @@ protected override PbrMaterial GetMaterial(LightData data, Table table) var mat = table.GetMaterial(table.Data.PlayfieldMaterial); if (mat != null) { mat.Name += " (Playfield Insert)"; - } else { - mat = new Engine.VPT.Material("Playfield Insert"); + return new PbrMaterial(mat, table.GetTexture(table.Data.Image)); } - return new PbrMaterial(mat, table.GetTexture(table.Data.Image)); + + mat = new Engine.VPT.Material("Playfield Insert"); + return new PbrMaterial(mat, table.GetTexture(table.Data.Image)) { DiffusionProfile = DiffusionProfileTemplate.Plastics }; } } } From a89aa645e288246455a1f918e3e226e54d9b9081 Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 11 Oct 2021 00:24:58 +0200 Subject: [PATCH 18/58] t2: More patches. --- .../Matcher/TablePatcher.cs | 15 +- .../Patcher/Tables/Terminator2.cs | 137 +++++++++++++++--- .../VPT/Surface/SlingshotComponent.cs | 2 + 3 files changed, 136 insertions(+), 18 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index 4603c2ec9..6ebeeaae6 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -65,6 +65,17 @@ protected static GameObject CreateEmptyGameObject(GameObject parentGo, string na return newGo; } + protected static GameObject GetOrCreateGameObject(GameObject parentGo, string name) + { + for (var i = 0; i < parentGo.transform.childCount; i++) { + if (parentGo.transform.GetChild(i).gameObject.name == name) { + return parentGo.transform.GetChild(i).gameObject; + } + } + + return CreateEmptyGameObject(parentGo, name); + } + #endregion #region Element Helpers @@ -122,7 +133,7 @@ protected static void CreateTrough(GameObject tableGo, GameObject parentGo, /// Table game object for retrieving light references. /// Game object to which the light group is added to. /// A list of light names that are part of the light group. - protected static void AddLightGroup(GameObject tableGo, GameObject go, params string[] names) + protected static LightGroupComponent AddLightGroup(GameObject tableGo, GameObject go, params string[] names) { var nameIndex = new HashSet(names); var lightComponentGroup = go.AddComponent(); @@ -130,6 +141,8 @@ protected static void AddLightGroup(GameObject tableGo, GameObject go, params st .GetComponentsInChildren() .Where(lc => nameIndex.Contains(lc.name)); lightComponentGroup.Lights = lights.ToArray(); + + return lightComponentGroup; } /// diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 1301a826a..6c6c4619d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -19,10 +19,14 @@ // ReSharper disable UnusedMember.Global // ReSharper disable UnusedType.Global +using System.Linq; +using UnityEditor; using UnityEngine; +using VisualPinball.Engine.Math; using VisualPinball.Engine.PinMAME; using VisualPinball.Engine.VPT; using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; +using Color = UnityEngine.Color; namespace VisualPinball.Unity.Patcher { @@ -31,44 +35,52 @@ namespace VisualPinball.Unity.Patcher public class Terminator2 : TablePatcher { + #region Global + public override void PostPatch(GameObject tableGo) { - var pf = Playfield(tableGo); + var playfieldGo = Playfield(tableGo); // playfield material - RenderPipeline.Current.MaterialConverter.SetSmoothness(pf.GetComponent().sharedMaterial, 0.96f); + RenderPipeline.Current.MaterialConverter.SetSmoothness(playfieldGo.GetComponent().sharedMaterial, 0.96f); + + SetupPinMame(tableGo, playfieldGo); + + + base.PostPatch(tableGo); + } + + private void SetupPinMame(GameObject tableGo, GameObject playfieldGo) + { + var tableComponent = tableGo.GetComponent(); // GLE Object.DestroyImmediate(tableGo.GetComponent()); var pinmameGle = tableGo.AddComponent(); pinmameGle.Game = new Engine.PinMAME.Games.Terminator2(); pinmameGle.romId = "t2_l82"; + tableComponent.RepopulateHardware(pinmameGle); + TableSelector.Instance.TableUpdated(); // create GI light groups - var gi = CreateEmptyGameObject(pf, "GI"); + var gi = CreateEmptyGameObject(playfieldGo, "GI"); var gi1 = CreateEmptyGameObject(gi, "CPU"); var gi2 = CreateEmptyGameObject(gi, "Left Playfield"); var gi3 = CreateEmptyGameObject(gi, "Right Playfield"); - AddLightGroup(tableGo, gi1, "Light2", "Light3", "Light4", "Light5"); - AddLightGroup(tableGo, gi2, "GI_35", "GI_1", "GI_3", "GI_4", "GI_12", "GI_7", + var giCpu = AddLightGroup(tableGo, gi1, "Light2", "Light3", "Light4", "Light5"); + var giLeftPlayfield = AddLightGroup(tableGo, gi2, "GI_35", "GI_1", "GI_3", "GI_4", "GI_12", "GI_7", "GI_8", "GI_9", "GI_13", "GI_14", "GI_23", "GI_24", "GI_25", "GI_38"); - AddLightGroup(tableGo, gi3, "GI_36", "GI_2", "GI_5", "GI_6", "GI_10", "GI_11", "GI_15", "GI_16", "GI_18", "GI_19", "GI_17", + var giRightPlayfield = AddLightGroup(tableGo, gi3, "GI_36", "GI_2", "GI_5", "GI_6", "GI_10", "GI_11", "GI_15", "GI_16", "GI_18", "GI_19", "GI_17", "GI_20", "GI_21", "GI_22", "GI_26", "GI_27", "GI_28", "GI_30", "GI_29", "GI_31", "GI_32", "GI_33", "GI_34", "GI_37", "B1", "B2", "B3"); - base.PostPatch(tableGo); + // map GI light groups + tableComponent.MappingConfig.Lamps.First(lm => lm.Id == "2").Device = giRightPlayfield; + tableComponent.MappingConfig.Lamps.First(lm => lm.Id == "3").Device = giCpu; + tableComponent.MappingConfig.Lamps.First(lm => lm.Id == "4").Device = giLeftPlayfield; } - [NameMatch("batleft", Ref = "Playfield/Flippers/LeftFlipper")] - [NameMatch("batright", Ref = "Playfield/Flippers/RightFlipper")] - public void ReparentFlippers(PrimitiveComponent flipper, GameObject gameObject, ref GameObject parent) - { - PatcherUtil.Reparent(gameObject, parent); - - flipper.Position.x = 0; - flipper.Position.y = 0; + #endregion - flipper.ObjectRotation.z = 0; - } [NameMatch("LeftRampCover")] [NameMatch("LeftRampSign")] @@ -98,6 +110,97 @@ public void FixSw17(KickerComponent kickerComponent) kickerComponent.Coils[0].Angle = 60; } + #region Flippers + + [NameMatch("batleft", Ref = "Playfield/Flippers/LeftFlipper")] + [NameMatch("batright", Ref = "Playfield/Flippers/RightFlipper")] + public void ReparentFlippers(PrimitiveComponent flipper, GameObject gameObject, ref GameObject parent) + { + PatcherUtil.Reparent(gameObject, parent); + + flipper.Position.x = 0; + flipper.Position.y = 0; + + flipper.ObjectRotation.z = 0; + } + + [NameMatch("LeftFlipper")] + [NameMatch("RightFlipper")] + public void DeleteFlipperMeshes(GameObject go) + { + go.GetComponentInChildren().gameObject.SetActive(false); + go.GetComponentInChildren().gameObject.SetActive(false); + } + + #endregion + + #region Slingshots + + [NameMatch("LSling2")] + [NameMatch("RSling2")] + [NameMatch("_SteelBits")] + public void DisableObsoleteSlingshotElements(GameObject go) + { + go.SetActive(false); + } + + [NameMatch("LSling")] + [NameMatch("LSling1")] + [NameMatch("RSling")] + [NameMatch("RSling1")] + public void ShowSlingshotRubbers(GameObject go) + { + go.GetComponent().enabled = true; + } + + [NameMatch("LSling")] + public void AddLeftSlingshotDragPoints(RubberComponent rubberComponent) + { + var dp = rubberComponent.DragPoints.ToList(); + dp.RemoveAt(9); + dp.RemoveAt(10); + dp.Insert(9, new DragPointData(208.9f, 1597.3f)); + dp.Insert(10, new DragPointData(202.9f, 1580.6f)); + rubberComponent.DragPoints = dp.ToArray(); + } + + [NameMatch("RSling")] + public void AddRightSlingshotDragPoints(RubberComponent rubberComponent) + { + var dp = rubberComponent.DragPoints.ToList(); + dp.RemoveAt(4); + dp.RemoveAt(5); + dp.Insert(4, new DragPointData(661.6f, 1583f)); + dp.Insert(5, new DragPointData(657f, 1595.7f)); + rubberComponent.DragPoints = dp.ToArray(); + } + + [NameMatch("SLING1")] + [NameMatch("SLING2")] + public void EnableSlingshotArm(GameObject go) + { + go.GetComponent().enabled = true; + } + + [NameMatch("LeftSlingshot")] + public void SetupLeftSlingshot(GameObject go) + { + var playfieldGo = go.GetComponentInParent().gameObject; + var ssParentGo = GetOrCreateGameObject(playfieldGo, "Slingshots"); + + var prefab = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject; + var ss = prefab!.GetComponent(); + + ss.name = "Left Slingshot"; + ss.SlingshotSurface = go.GetComponent(); + ss.RubberOff = playfieldGo.transform.Find("Rubbers/LSling").GetComponent(); + ss.RubberOn = playfieldGo.transform.Find("Rubbers/LSling1").GetComponent(); + ss.CoilArm = playfieldGo.transform.Find("Primitives/SLING2").GetComponent(); + ss.RebuildMeshes(); + } + + #endregion + #region Materials [NameMatch("_Plastics")] diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs index 7670e4d91..fd44883df 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs @@ -212,6 +212,8 @@ public void SetEditorScale(Vector3 pos) { } #endregion + public static GameObject LoadPrefab() => Resources.Load("Prefabs/Slingshot"); + private DragPointData[] DragPointsAt(float pos) { if (RubberOn == null || RubberOff == null) { From f31d658263eaae46fc8b9ab660f2e04c98e4a837 Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 11 Oct 2021 21:30:28 +0200 Subject: [PATCH 19/58] t2: Fix slingshots. --- .../Matcher/TablePatcher.cs | 2 +- .../Patcher/Tables/Terminator2.cs | 50 +++++++++++++------ .../VPT/Surface/SlingshotComponent.cs | 1 + 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index 6ebeeaae6..9b95ac058 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -61,7 +61,7 @@ protected static GameObject Playfield(GameObject tableGo) protected static GameObject CreateEmptyGameObject(GameObject parentGo, string name) { var newGo = new GameObject(name); - newGo.transform.SetParent(parentGo.transform); + newGo.transform.SetParent(parentGo.transform, false); return newGo; } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 6c6c4619d..02fed6080 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -46,11 +46,15 @@ public override void PostPatch(GameObject tableGo) SetupPinMame(tableGo, playfieldGo); + // slingshots + SetupLeftSlingshot(playfieldGo.transform.Find("Walls/LeftSlingshot").gameObject); + SetupRightSlingshot(playfieldGo.transform.Find("Walls/RightSlingshot").gameObject); + base.PostPatch(tableGo); } - private void SetupPinMame(GameObject tableGo, GameObject playfieldGo) + private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo) { var tableComponent = tableGo.GetComponent(); @@ -144,15 +148,6 @@ public void DisableObsoleteSlingshotElements(GameObject go) go.SetActive(false); } - [NameMatch("LSling")] - [NameMatch("LSling1")] - [NameMatch("RSling")] - [NameMatch("RSling1")] - public void ShowSlingshotRubbers(GameObject go) - { - go.GetComponent().enabled = true; - } - [NameMatch("LSling")] public void AddLeftSlingshotDragPoints(RubberComponent rubberComponent) { @@ -182,20 +177,43 @@ public void EnableSlingshotArm(GameObject go) go.GetComponent().enabled = true; } - [NameMatch("LeftSlingshot")] - public void SetupLeftSlingshot(GameObject go) + private static void SetupLeftSlingshot(GameObject go) { var playfieldGo = go.GetComponentInParent().gameObject; var ssParentGo = GetOrCreateGameObject(playfieldGo, "Slingshots"); - var prefab = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject; - var ss = prefab!.GetComponent(); + var ssGo = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject; + var ss = ssGo!.GetComponent(); ss.name = "Left Slingshot"; ss.SlingshotSurface = go.GetComponent(); ss.RubberOff = playfieldGo.transform.Find("Rubbers/LSling").GetComponent(); ss.RubberOn = playfieldGo.transform.Find("Rubbers/LSling1").GetComponent(); - ss.CoilArm = playfieldGo.transform.Find("Primitives/SLING2").GetComponent(); + //ss.CoilArm = playfieldGo.transform.Find("Primitives/SLING2").GetComponent(); + + EditorUtility.SetDirty(ssGo); + PrefabUtility.RecordPrefabInstancePropertyModifications(ss); + + ss.RebuildMeshes(); + } + + private static void SetupRightSlingshot(GameObject go) + { + var playfieldGo = go.GetComponentInParent().gameObject; + var ssParentGo = GetOrCreateGameObject(playfieldGo, "Slingshots"); + + var ssGo = PrefabUtility.InstantiatePrefab(SlingshotComponent.LoadPrefab(), ssParentGo.transform) as GameObject; + var ss = ssGo!.GetComponent(); + + ss.name = "Right Slingshot"; + ss.SlingshotSurface = go.GetComponent(); + ss.RubberOff = playfieldGo.transform.Find("Rubbers/RSling").GetComponent(); + ss.RubberOn = playfieldGo.transform.Find("Rubbers/RSling1").GetComponent(); + //ss.CoilArm = playfieldGo.transform.Find("Primitives/SLING1").GetComponent(); + + EditorUtility.SetDirty(ssGo); + PrefabUtility.RecordPrefabInstancePropertyModifications(ss); + ss.RebuildMeshes(); } @@ -285,7 +303,7 @@ public void GiIntensity(GameObject go) public void GiDynamicShadow(GameObject go, float param) { foreach (var l in go.GetComponentsInChildren()) { - RenderPipeline.Current.LightConverter.SetShadow(l, true, false, param); + RenderPipeline.Current.LightConverter.SetShadow(l, true, true, param); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs index fd44883df..c54637bef 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs @@ -181,6 +181,7 @@ private Mesh GetMesh() .GetTransformedMesh(pf.PlayfieldHeight, r0.Height, pf.PlayfieldDetailLevel) .ToUnityMesh(); + mesh.name = $"{name} (Mesh)"; _meshes[pos] = mesh; return mesh; From 14d4d2fd7676f2a46441a8be92547266f8997ece Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 11 Oct 2021 21:54:19 +0200 Subject: [PATCH 20/58] editor: Add icons for flasher and light group. --- .../Editor/Icons/large_blue/light_flasher.png | Bin 0 -> 5131 bytes .../Icons/large_blue/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/large_blue/light_group.png | Bin 0 -> 8658 bytes .../Icons/large_blue/light_group.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/large_gray/light_flasher.png | Bin 0 -> 5152 bytes .../Icons/large_gray/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/large_gray/light_group.png | Bin 0 -> 8659 bytes .../Icons/large_gray/light_group.png.meta | 108 ++++++++++++++++++ .../Icons/large_green/light_flasher.png | Bin 0 -> 5149 bytes .../Icons/large_green/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/large_green/light_group.png | Bin 0 -> 8672 bytes .../Icons/large_green/light_group.png.meta | 108 ++++++++++++++++++ .../Icons/large_orange/light_flasher.png | Bin 0 -> 5152 bytes .../Icons/large_orange/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/large_orange/light_group.png | Bin 0 -> 8675 bytes .../Icons/large_orange/light_group.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/small_blue/light_flasher.png | Bin 0 -> 484 bytes .../Icons/small_blue/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/small_blue/light_group.png | Bin 0 -> 782 bytes .../Icons/small_blue/light_group.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/small_gray/light_flasher.png | Bin 0 -> 496 bytes .../Icons/small_gray/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/small_gray/light_group.png | Bin 0 -> 788 bytes .../Icons/small_gray/light_group.png.meta | 108 ++++++++++++++++++ .../Icons/small_green/light_flasher.png | Bin 0 -> 485 bytes .../Icons/small_green/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/small_green/light_group.png | Bin 0 -> 783 bytes .../Icons/small_green/light_group.png.meta | 108 ++++++++++++++++++ .../Icons/small_orange/light_flasher.png | Bin 0 -> 496 bytes .../Icons/small_orange/light_flasher.png.meta | 108 ++++++++++++++++++ .../Editor/Icons/small_orange/light_group.png | Bin 0 -> 787 bytes .../Icons/small_orange/light_group.png.meta | 108 ++++++++++++++++++ .../VisualPinball.Unity.Editor/Utils/Icons.cs | 14 ++- .../VPT/Light/LightGroupComponent.cs.meta | 2 +- 34 files changed, 1740 insertions(+), 4 deletions(-) create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_group.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_group.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_green/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_green/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_green/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_green/light_group.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_group.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_group.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_gray/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_gray/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_gray/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_gray/light_group.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_green/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_green/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_green/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_green/light_group.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_flasher.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_flasher.png.meta create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_group.png create mode 100644 VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_group.png.meta diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_flasher.png b/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_flasher.png new file mode 100644 index 0000000000000000000000000000000000000000..cbc5bfed55be65f7d0c7d39e7ba1cb88f224e754 GIT binary patch literal 5131 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 CW__dp literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_flasher.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_flasher.png.meta new file mode 100644 index 000000000..692ef0196 --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_flasher.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: e6e248795a18ee047a379e32da191a98 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_group.png b/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_group.png new file mode 100644 index 0000000000000000000000000000000000000000..70b1d144de8ea75fb9d7464519694317ccc5e9e6 GIT binary patch literal 8658 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 literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_group.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_group.png.meta new file mode 100644 index 000000000..ca0e3df3e --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/large_blue/light_group.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 6a45ecf4c0ab9bb4a9e22f42cf23baeb +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_flasher.png b/VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_flasher.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff7f984b18302554250743264c3ce0be148a01f GIT binary patch literal 5152 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 K=0(3UFaIxj0FLnh literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_flasher.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_flasher.png.meta new file mode 100644 index 000000000..fe8c507ea --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_flasher.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: a40b3d2a10078044d89e53806008c529 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_group.png b/VisualPinball.Unity/Assets/Editor/Icons/large_gray/light_group.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc0e9073cd7e4c5963ed7942c5aec7a40e17432 GIT binary patch literal 8659 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 Q_kCc;c2B3Wt<1Ck14x5)7ytkO literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_flasher.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_flasher.png.meta new file mode 100644 index 000000000..9b3e3740d --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_flasher.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 34b11994d23f3534e949a1f4ecbbe740 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_group.png b/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_group.png new file mode 100644 index 0000000000000000000000000000000000000000..16b532407a648287544a88b3bff90e7e99487aed GIT binary patch literal 8672 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 Rg6#?%KVpBl+R7*4KLCllGXMYp literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_group.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_group.png.meta new file mode 100644 index 000000000..b8d970966 --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/large_green/light_group.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: c46067de66c404f44abe1c701ae0c665 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_flasher.png b/VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_flasher.png new file mode 100644 index 0000000000000000000000000000000000000000..81aaf880339a88dc387436f23aa749064786b7fe GIT binary patch literal 5152 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 literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_group.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_group.png.meta new file mode 100644 index 000000000..71be46dce --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/large_orange/light_group.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: fbc38e515316e10469ebe7069403cf73 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_flasher.png b/VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_flasher.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9a76255b5cd73fad6319a7876d02904212178d GIT binary patch literal 484 zcmVC!Z5 zyP{D~O0NODarc3;uq?rV`_3I@Uom;{ zi$AT{umof}b`yG!-T^D2bnHnD`e+CCvjZHen(ZBZ-6emCgf!Z5v|j}DZsh!nf&Q816HI)Ems}~Gs-!Fte^%H;N^bycEJLPx+b+0bd33D5 zC#7r2CxrvjWRI5~hQ=KImaj3JysDsJ(BIo{?-(|0MbOPeN{?N9_Ji;GZl=z2Aw)ST z-Cgc{dYlc)5&0Ylx;yC~xiTBnRTd?MrNYlg{_g|8cc)+bE{yf4v?8dqBB-2Qg#R|`M*J} z^B=~xsRq?9Zk_J{U~8TKsL*|{UH?x!+F9pC0PB1W0CNDC0KlvOi5q&-IzRpIA3S%=(9p4rNs zOwpSJ`IWso1kkz!Yb%2gcM0fN2W>5FW!emAn0ritCLmX6>$!WPc<8CLpxoKY{C31- zXf4EYQLOW`!5NVadjBng9IC=EZC(Vsv6aak@vDe+-U7gv7!u<0M460mk5~cT5|U&~ zYcDw@#2)>Z<*LL+;b2*|Vgj^r9i`-JN$;8x5B2(lUPC1g6L&LQ&z0#U4$-4@5!@$+ zFk|ZgOSKVyPZGK}90L0VR!6z4;^XF0xVW1ZAo(Bqv{=|;~4et`~cYIOG>d*(oi!YcSdiFN6)=avVMNpcUYA$TTXsYvX z>14RgHW4bDxZcK6F8Gz{sBDCU*s`PKdVA~qEz8{8Cc~zh=vkB^Xy9O=Qj&E%ak5Qu zW!BdD1Jf(^722=Rj(r74S6##O9&$=l_@DJOpVnGX9zWR<66vi3y^b~NJB>%x-4l5M zgw8$aEhtP{DT^uYYih#B1O3}_`ETCXaseG%E}&z}1$1mV4^RO34!S}zj~s!>3jhEB M07*qoM6N<$f{zwvA^-pY literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_group.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_group.png.meta new file mode 100644 index 000000000..4f9711e30 --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/small_blue/light_group.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 68aff253cda433f4cac498b99c5dabd0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/small_gray/light_flasher.png b/VisualPinball.Unity/Assets/Editor/Icons/small_gray/light_flasher.png new file mode 100644 index 0000000000000000000000000000000000000000..a824e7f9d458d72dfaf312045e5be55d49517db6 GIT binary patch literal 496 zcmVbMqU7{xQ>CZeXB?5 ztmu33ojxtdFo(#**9n7LZxPEu;=5C$XS5^sts{6UHQ7749;aA1b7Q^mT`)xM5ZgRU zt@q>@Q$70ZC{nYdXupWiThH+q6Z&g}6HJuDORALmlzEo2KPyZKsn!72hF`jR+svq9 zd9cjC6H?WjPYR1jeS16&XlV4-ZzzqKaH@i)LfLO`F{8B=lQNT#%6IaQAAG?Cle0%V z&xJ0B;aT6aCxz;WeDoC7XV>eWs4^SnPZlMGp~7E!uJ;PyqtmZlC&qe| mn<$iWP)9`zlMfAYJ_|0|$DRe(*pZ^?>Hm$KDKx=FU0CNDC0KhB(i5vQhES>&gPZU+Eg@L18q z1piXW*t%`Z2Aw3v@zHtomOh;j;N0Mgy-G1TrJskGV_IV|B<_f7;XvK7P6gPGea`~- zQI5=3>|~POB*^dV(#e5lDcG{e5n>mB_I1$Kx-9ZK0_xVDL!bf34cdB`o+utVDlI6x zvdEttF&Wwlv7D6FShU;uHt6~f5At_a_+!lTVEeMjV@Lcd(i&Rp!Vx1C0|W?*OYju*9G*JRN^pkdu-2Tkv9^D z=uv6}w}D%jv6+LV+KAsL0o@x8f%5{Zqg*!radSzv(AX{~UTLWy42e>^Qr8;0j6kBy zS%=hv(ve@s?&Cc+NzDa4K1roITJ*l;QO&HVohP+}baaH2Ks8g1OQ?ILUaCn%2b3r% zwZpYwbj>Nxt4BI}=I8GFM8n zh9^$!C~>2$u_vaNoGY|%p$&TrkXqf6>D|SYsPI4NX0;@(FWEAaTZW|Rvy8bAR|~CL~c|E zTp;!aa-TxkKmk%y0f8$7gOn)q6hjU_z=9Had?4?R$Gf&|F$alRP)5)R^nXE>mW65D zc3GodX}JdQLEWcJlm{-`(MP#88_ZO^1W$35l@h2+&z7Ao}4p1S&WlCPM& z_)VWyWS9do8M_I+NAG~;P%`$U27R;x`_%ysRZaGezU~wYXKpzYzK<-C+ozXIl+HXk zq|hCG_k=XsQM6wL^kL-qtAYNR<`YbGhZj^SovX-1$^NXcNolzOu(A9y)!TMK70a_@ z{-e^e=6q5(AWimo>tSfj(QoM*v&pLp3KiXcdxsgrmIvKTO3Sg6FMjad-p$l`E`%sm zT6U*9pB@*3QbfK6g6_`xN2<&Qb(2L&ZmICok?VZ|`04a(--)pv2F?Vv7odCSfho$8AevLs`s)8Kca{V~A3*|y^5%3p!8xcn3(5=V3+Vp_ zwa&bo+NT;+`*Q0{2LPjW=Dou9t@izY64A~&BLY}wN&r{@zzhIxGLSf-Z`uH;Knd;x z0L%fP){M#c^AkcXHDgquRndYivn3{+ZBcU95< zw#4LUBkbj@tTX6$2z}7~uL0zbs_;vj7r<_-qE9XHi^w|D0Kn%E62kICnT&9cSOH!W zk~Gr0R~!<;i2lpE%CXUQXjryl0<>WrrQ~bL?wS%0?S_b5O(hN!cZI5We!A?j$ zC@uMQ>N!4Rozz0GXwf&^FkxsUd5~!xD@d@>)w96e5$p$3}O2^?! zaJphAOC#9f!Ld=;9fh38CKEc|MegtTODU^;9}vEL$?Pz)w~2S%NXN1WN&{ofMH6uv z>-<|<8Sb-t literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/small_green/light_group.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/small_green/light_group.png.meta new file mode 100644 index 000000000..1b50c7d9d --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/small_green/light_group.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 5c0bc5111675cea41ba8e8feff34ceae +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_flasher.png b/VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_flasher.png new file mode 100644 index 0000000000000000000000000000000000000000..d43c9b6d651070724a73e13355e0d3641ae4931e GIT binary patch literal 496 zcmVsd7(1+lYDSuKmU66^LxH(+ZG{k9fZm#bOQdbP$fm7 z8@FB7s8>>~034`$pJe5c%XU1Y+yosFJK~rWB#1NCD{9Bw1OR#teBh zr@%NWDdrQ3)DEd=t=u-wW$PENVkye^y17I=iPYn6=#zEltk;vl$P0iK*D>(5Z}ljh z6@4$h)29U)<`9|sI$?0@En+!HeRt~Y8SRLD>j)l8P4-T%$0-)h+*mJs7Yva*#5T!F z>pgjnu^xSP6sg%!v|mK%t>^fQ3H>#~2`0+n1yxFYiXG&FkaHQ&a)n>7rx6A zRGy&r1d+5r>x8S;1ul(a^4fB{=P9zPy=Kk|pu=>+E>AJ2kv1bqd0 z-=NmypNF=o2GuTZP2K>&)|&i_Lidw){pWbJu_hM*tjP-im;t~90Im{{xS?NK2dF>^ z?kfOH0brq-ld$JDgfiF6QGsS3`ZP4?d9^{{_@K>AX!FE~M$By__#G1SUfbTve`00rv8R70R z1H2_9$(Gh$a!Bw!`ajD>ijA&A#iA7hp!V}91z$~imlSxY*9PBui*<2c4TshOb1JE>Gfi;hbk)%1$mep1^=M_Whf*ux*wLN|}` z)!h?$0ff%o>CNey)KU~vxh$v&9}e_i%lL2J&@zG!EhFgAGJ*~*=K%@;zX3=ZFymLz R1(pB+002ovPDHLkV1l<_X%YYc literal 0 HcmV?d00001 diff --git a/VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_group.png.meta b/VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_group.png.meta new file mode 100644 index 000000000..9b8d361d7 --- /dev/null +++ b/VisualPinball.Unity/Assets/Editor/Icons/small_orange/light_group.png.meta @@ -0,0 +1,108 @@ +fileFormatVersion: 2 +guid: 8556b8d36238d3945ab0b87bf995aa62 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 2 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs index a23abd9e2..50d9fcb34 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Utils/Icons.cs @@ -40,11 +40,13 @@ public IconVariant(string name, IconSize size, IconColor color) private const string BoltName = "bolt"; private const string CoilName = "coil"; private const string DropTargetName = "drop_target"; + private const string FlasherName = "light_flasher"; private const string FlipperName = "flipper"; private const string GateName = "gate"; private const string HitTargetName = "hit_target"; private const string KeyName = "keyboard"; private const string KickerName = "kicker"; + private const string LightGroupName = "light_group"; private const string LightName = "light"; private const string PlayfieldName = "playfield"; private const string PlungerName = "plunger"; @@ -62,9 +64,9 @@ public IconVariant(string name, IconSize size, IconColor color) private const string SwitchNoName = "switch_no"; private static readonly string[] Names = { - BumperName, BoltName, CoilName, DropTargetName, FlipperName, HitTargetName, GateName, KeyName, KickerName, LightName, PlayfieldName, - PlungerName, PlugName, PrimitiveName, RampName, RubberName, SpinnerName, SurfaceName, TableName, TriggerName, TroughName, - SlingshotName, SwitchNcName, SwitchNoName + BumperName, BoltName, CoilName, DropTargetName, FlasherName, FlipperName, HitTargetName, GateName, KeyName, KickerName, LightGroupName, + LightName, PlayfieldName, PlungerName, PlugName, PrimitiveName, RampName, RubberName, SpinnerName, SurfaceName, TableName, TriggerName, + TroughName, SlingshotName, SwitchNcName, SwitchNoName }; private readonly Dictionary _icons = new Dictionary(); @@ -97,11 +99,13 @@ private Icons() public static Texture2D Bumper(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(BumperName, size, color); public static Texture2D DropTarget(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(DropTargetName, size, color); + public static Texture2D Flasher(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(FlasherName, size, color); public static Texture2D Flipper(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(FlipperName, size, color); public static Texture2D Gate(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(GateName, size, color); public static Texture2D HitTarget(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(HitTargetName, size, color); public static Texture2D Kicker(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(KickerName, size, color); public static Texture2D Light(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(LightName, size, color); + public static Texture2D LightGroup(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(LightGroupName, size, color); public static Texture2D Playfield(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(PlayfieldName, size, color); public static Texture2D Plunger(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(PlungerName, size, color); public static Texture2D Plug(IconSize size = IconSize.Large, IconColor color = IconColor.Gray) => Instance.GetItem(PlugName, size, color); @@ -125,11 +129,13 @@ public static Texture2D ByComponent(T mb, IconSize size = IconSize.Large, Ico switch (mb) { case BumperComponent _: return Bumper(size, color); case DropTargetComponent _: return DropTarget(size, color); + //case FlasherComponent _: return Flasher(size, color); case FlipperComponent _: return Flipper(size, color); case GateComponent _: return Gate(size, color); case HitTargetComponent _: return HitTarget(size, color); case KickerComponent _: return Kicker(size, color); case LightComponent _: return Light(size, color); + case LightGroupComponent _: return LightGroup(size, color); case PlungerComponent _: return Plunger(size, color); case PlayfieldComponent _: return Playfield(size, color); case PrimitiveComponent _: return Primitive(size, color); @@ -156,6 +162,7 @@ public static void DisableGizmoIcons() DisableGizmo(); DisableGizmo(); DisableGizmo(); + //DisableGizmo(); DisableGizmo(); DisableGizmo(); DisableGizmo(); @@ -169,6 +176,7 @@ public static void DisableGizmoIcons() DisableGizmo(); DisableGizmo(); DisableGizmo(); + DisableGizmo(); DisableGizmo(); DisableGizmo(); DisableGizmo(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta index 3b067e2eb..52c35ae2f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightGroupComponent.cs.meta @@ -5,7 +5,7 @@ MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 - icon: {instanceID: 0} + icon: {fileID: 2800000, guid: 8556b8d36238d3945ab0b87bf995aa62, type: 3} userData: assetBundleName: assetBundleVariant: From 40f1417ec35f2bec9ceec310f781f529ae09eb00 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 12 Oct 2021 00:02:49 +0200 Subject: [PATCH 21/58] mapping: Properly auto-populate coil lamps. --- .../Game/Engines/GamelogicEngineCoil.cs | 6 ++- .../Game/Engines/GamelogicEngineLamp.cs | 13 ++++-- .../Game/Engines/GamelogicEngineSwitch.cs | 7 ++- .../Engines/IGamelogicEngineDeviceItem.cs | 2 + .../Patcher/Tables/Terminator2.cs | 44 ++++++++++++++++++- .../Mappings/MappingConfig.cs | 24 ++++++---- .../VPT/Table/TableComponent.cs | 8 +--- 7 files changed, 80 insertions(+), 24 deletions(-) diff --git a/VisualPinball.Engine/Game/Engines/GamelogicEngineCoil.cs b/VisualPinball.Engine/Game/Engines/GamelogicEngineCoil.cs index 9b3aa916c..6ddae5e92 100644 --- a/VisualPinball.Engine/Game/Engines/GamelogicEngineCoil.cs +++ b/VisualPinball.Engine/Game/Engines/GamelogicEngineCoil.cs @@ -27,8 +27,8 @@ public class GamelogicEngineCoil : IGamelogicEngineDeviceItem public string Description { get => _description; set => _description = value; } public int InternalId; - public string DeviceHint; - public string DeviceItemHint; + public string DeviceHint { get => _deviceHint; set => _deviceHint = value; } + public string DeviceItemHint { get => _deviceItemHint; set => _deviceItemHint = value; } public bool IsLamp; /// @@ -38,6 +38,8 @@ public class GamelogicEngineCoil : IGamelogicEngineDeviceItem private string _description; private string _id; + private string _deviceHint; + private string _deviceItemHint; public GamelogicEngineCoil(string id) { diff --git a/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs b/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs index 9b48fd12c..732faa1ce 100644 --- a/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs +++ b/VisualPinball.Engine/Game/Engines/GamelogicEngineLamp.cs @@ -27,7 +27,7 @@ public class GamelogicEngineLamp : IGamelogicEngineDeviceItem /// /// The unique ID of this lamp, as the gamelogic engine addresses it. /// - public string Id { get; set; } + public string Id { get => _id; set => _id = value; } /// /// Some gamelogic engines use integers for the ID. In order to avoid repetitive casting, we store it as integer as well. @@ -47,7 +47,7 @@ public class GamelogicEngineLamp : IGamelogicEngineDeviceItem /// /// An optional description of the lamp. /// - public string Description { get; set; } + public string Description { get => _description; set => _description = value; } /// /// How the gamelogic engine triggers the lamp. Either through GI or through the normal lamp API. @@ -61,12 +61,17 @@ public class GamelogicEngineLamp : IGamelogicEngineDeviceItem /// /// A regular expression to match the component on the playfield. /// - public string DeviceHint; + public string DeviceHint { get => _deviceHint; set => _deviceHint = value; } /// /// A regular expression to match the lamp component within the component. /// - public string DeviceItemHint; + public string DeviceItemHint { get => _deviceItemHint; set => _deviceItemHint = value; } + + private string _description; + private string _id; + private string _deviceHint; + private string _deviceItemHint; public GamelogicEngineLamp(string id) { diff --git a/VisualPinball.Engine/Game/Engines/GamelogicEngineSwitch.cs b/VisualPinball.Engine/Game/Engines/GamelogicEngineSwitch.cs index 5697adb3b..f88d61a37 100644 --- a/VisualPinball.Engine/Game/Engines/GamelogicEngineSwitch.cs +++ b/VisualPinball.Engine/Game/Engines/GamelogicEngineSwitch.cs @@ -61,12 +61,15 @@ public class GamelogicEngineSwitch : IGamelogicEngineDeviceItem public string Description { get => _description; set => _description = value; } public string InputActionHint; public string InputMapHint; - public string DeviceHint; - public string DeviceItemHint; + + public string DeviceHint { get => _deviceHint; set => _deviceHint = value; } + public string DeviceItemHint { get => _deviceItemHint; set => _deviceItemHint = value; } public SwitchConstantHint ConstantHint = SwitchConstantHint.None; private string _description; private string _id; + private string _deviceHint; + private string _deviceItemHint; public GamelogicEngineSwitch(string id) { diff --git a/VisualPinball.Engine/Game/Engines/IGamelogicEngineDeviceItem.cs b/VisualPinball.Engine/Game/Engines/IGamelogicEngineDeviceItem.cs index 4825356ee..2cd6da680 100644 --- a/VisualPinball.Engine/Game/Engines/IGamelogicEngineDeviceItem.cs +++ b/VisualPinball.Engine/Game/Engines/IGamelogicEngineDeviceItem.cs @@ -20,5 +20,7 @@ public interface IGamelogicEngineDeviceItem { string Id { get; } string Description { get; } + string DeviceHint { get; } + string DeviceItemHint { get; } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 02fed6080..b833e6ca7 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -50,7 +50,6 @@ public override void PostPatch(GameObject tableGo) SetupLeftSlingshot(playfieldGo.transform.Find("Walls/LeftSlingshot").gameObject); SetupRightSlingshot(playfieldGo.transform.Find("Walls/RightSlingshot").gameObject); - base.PostPatch(tableGo); } @@ -222,17 +221,58 @@ private static void SetupRightSlingshot(GameObject go) #region Materials [NameMatch("_Plastics")] - public void fixPlasticsMaterial(GameObject go) + [NameMatch("_RightRampPlastic")] + public void FixPlasticsMaterial(GameObject go) { var material = go.GetComponent().sharedMaterial; RenderPipeline.Current.MaterialConverter.SetDiffusionProfile(material, DiffusionProfileTemplate.Plastics); RenderPipeline.Current.MaterialConverter.SetMaterialType(material, MaterialType.Translucent); } + [NameMatch("_HKShip")] + public void FixShip(GameObject go) + { + var material = go.GetComponent().sharedMaterial; + RenderPipeline.Current.MaterialConverter.SetMaterialType(material, MaterialType.Standard); + RenderPipeline.Current.MaterialConverter.SetSmoothness(material, 1f); + } + #endregion #region Lights + #region Flashers + + [NameMatch("F118", FloatParam = 10000f)] + [NameMatch("F119", FloatParam = 10000f)] + [NameMatch("F120", FloatParam = 10000f)] + [NameMatch("F121", FloatParam = 10000f)] + [NameMatch("F122", FloatParam = 20000f)] + [NameMatch("F123", FloatParam = 20000f)] + [NameMatch("F125", FloatParam = 10000f)] + public void SlingFlashers(GameObject go, float param) + { + foreach (var l in go.GetComponentsInChildren()) { + RenderPipeline.Current.LightConverter.SetIntensity(l, param); + RenderPipeline.Current.LightConverter.SetTemperature(l, 3000); + RenderPipeline.Current.LightConverter.SetShadow(l, true, true, 0.001f); + } + } + + [NameMatch("F120")] + [NameMatch("F125")] + public void F120Pos(GameObject go) => LightPos(go, -160.8f, 17.6f, -6f); + [NameMatch("F121")] public void F121Pos(GameObject go) => LightPos(go, 0f, -12.5f, 15.7f); + [NameMatch("F122")] public void F122Pos(GameObject go) => LightPos(go, -4f, 97f, 25f); + [NameMatch("F123")] public void F123Pos(GameObject go) + { + LightPos(go, -6.9f, -21.9f, 94.1f); + //todo RenderPipeline.Current.LightConverter.Range(l, 0.3f); + } + //[NameMatch("F125")] public void F125Pos(GameObject go) => LightPos(go, 182.6f, -58.3f, 12.8f); + + #endregion + #region Global Illumination [NameMatch("B1")] diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index 991bd8d23..6195fae0d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -37,12 +37,15 @@ public class MappingConfig public bool IsEmpty() => (Coils == null || Coils.Count == 0) && (Switches == null || Switches.Count == 0) && (Lamps == null || Lamps.Count == 0); - public void Clear() + public void Clear(bool clearWires = true) { Switches.Clear(); Coils.Clear(); - Wires.Clear(); Lamps.Clear(); + + if (clearWires) { + Wires.Clear(); + } } #region Switches @@ -208,6 +211,7 @@ public void RemoveAllSwitches() public void PopulateCoils(GamelogicEngineCoil[] engineCoils, TableComponent tableComponent) { var coilDevices = tableComponent.GetComponentsInChildren(); + var lamps = tableComponent.GetComponentsInChildren(); foreach (var engineCoil in GetCoils(engineCoils)) { var coilMapping = Coils.FirstOrDefault(mappingsCoilData => mappingsCoilData.Id == engineCoil.Id); @@ -215,7 +219,7 @@ public void PopulateCoils(GamelogicEngineCoil[] engineCoils, TableComponent tabl continue; } - var destination = GuessCoilDestination(engineCoil); + var destination = GuessCoilDestination(engineCoil, lamps); var description = string.IsNullOrEmpty(engineCoil.Description) ? string.Empty : engineCoil.Description; var device = destination == CoilDestination.Playfield ? GuessCoilDevice(coilDevices, engineCoil) : null; var deviceItem = destination == CoilDestination.Playfield && device != null ? GuessCoilDeviceItem(engineCoil, device) : null; @@ -236,23 +240,27 @@ public void PopulateCoils(GamelogicEngineCoil[] engineCoils, TableComponent tabl } } - private CoilDestination GuessCoilDestination(GamelogicEngineCoil engineCoil) + private CoilDestination GuessCoilDestination(GamelogicEngineCoil engineCoil, ILampDeviceComponent[] lampDevices) { if (!engineCoil.IsLamp) { return CoilDestination.Playfield; } // if it's a lamp, add a new entry to the lamps. + var lampDevice = GuessLampDevice(lampDevices, engineCoil); + var lampDeviceItem = lampDevice != null ? GuessLampDeviceItem(engineCoil, lampDevice) : null; AddLamp(new LampMapping { Id = engineCoil.Id, Description = engineCoil.Description, Source = LampSource.Lamp, IsCoil = true, + Device = lampDevice, + DeviceItem = lampDeviceItem != null ? lampDeviceItem.Id : string.Empty, }); return CoilDestination.Lamp; } - private static ICoilDeviceComponent GuessCoilDevice(IEnumerable coilDevices, GamelogicEngineCoil engineCoil) + private static ICoilDeviceComponent GuessCoilDevice(IEnumerable coilDevices, IGamelogicEngineDeviceItem engineCoil) { foreach (var device in coilDevices) { if (string.Equals(device.name, engineCoil.Id, StringComparison.OrdinalIgnoreCase)) { @@ -269,7 +277,7 @@ private static ICoilDeviceComponent GuessCoilDevice(IEnumerable GetLamps(GamelogicEngineLamp[] engineLam return lamps; } - private static ILampDeviceComponent GuessLampDevice(ILampDeviceComponent[] lamps, GamelogicEngineLamp engineLamp) + private static ILampDeviceComponent GuessLampDevice(ILampDeviceComponent[] lamps, IGamelogicEngineDeviceItem engineLamp) { // first, match by regex if hint provided if (!string.IsNullOrEmpty(engineLamp.DeviceHint)) { @@ -439,7 +447,7 @@ private static ILampDeviceComponent GuessLampDevice(ILampDeviceComponent[] lamps return lamps.FirstOrDefault(l => string.Equals(l.name, matchKey, StringComparison.OrdinalIgnoreCase)); } - private static GamelogicEngineLamp GuessLampDeviceItem(GamelogicEngineLamp engineLamp, ILampDeviceComponent device) + private static GamelogicEngineLamp GuessLampDeviceItem(IGamelogicEngineDeviceItem engineLamp, ILampDeviceComponent device) { if (device == null) { return null; diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs index 60c1104ac..779e66aac 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs @@ -137,14 +137,10 @@ public Bounds GetTableBounds() public void RepopulateHardware(IGamelogicEngine gle) { - MappingConfig.RemoveAllSwitches(); + MappingConfig.Clear(false); MappingConfig.PopulateSwitches(gle.AvailableSwitches, this); - - MappingConfig.RemoveAllCoils(); - MappingConfig.PopulateCoils(gle.AvailableCoils, this); - - MappingConfig.RemoveAllLamps(); MappingConfig.PopulateLamps(gle.AvailableLamps, this); + MappingConfig.PopulateCoils(gle.AvailableCoils, this); // hook up plunger var plunger = GetComponentInChildren(); From 14d6c04a62d41ada6a2859b3fb3acb1346794b58 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 12 Oct 2021 00:21:59 +0200 Subject: [PATCH 22/58] kicker: Add direction gizmo. --- .../VPT/Kicker/KickerInspector.cs | 28 +++ .../Matcher/TablePatcher.cs | 3 +- .../Patcher/Tables/Terminator2.cs | 165 +++++++++++++++--- .../VisualPinball.Unity/Game/LampPlayer.cs | 6 +- .../VisualPinball.Unity/VPT/Light/LightApi.cs | 6 + 5 files changed, 182 insertions(+), 26 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Kicker/KickerInspector.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Kicker/KickerInspector.cs index e62a2d528..85f8c37b8 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Kicker/KickerInspector.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/VPT/Kicker/KickerInspector.cs @@ -16,8 +16,11 @@ // ReSharper disable AssignmentInConditionalExpression +using System; using System.Collections.Generic; +using Unity.Mathematics; using UnityEditor; +using UnityEngine; using VisualPinball.Engine.VPT; using VisualPinball.Engine.VPT.Kicker; @@ -85,5 +88,30 @@ public override void OnInspectorGUI() EndEditing(); } + + private void OnSceneGUI() + { + if (Event.current.type != EventType.Repaint) { + return; + } + + Handles.color = Color.cyan; + var transform = MainComponent.transform; + var position = transform.parent.TransformPoint(MainComponent.GetEditorPosition()); + + foreach (var coil in MainComponent.Coils) { + var from = MainComponent.GetBallCreationPosition().ToUnityVector3(); + var l = 20f * coil.Speed; + var dir = new Vector3( + l * math.cos(math.radians(coil.Angle)), + l * math.sin(math.radians(coil.Angle)), + l * math.sin(math.radians(coil.Inclination)) + ); + var to = from + dir; + var worldDir = transform.TransformDirection(math.normalize( to - from)); + + Handles.ArrowHandleCap(-1, position, Quaternion.LookRotation(worldDir), coil.Speed / 10f, EventType.Repaint); + } + } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index 9b95ac058..3826c1080 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -88,7 +88,7 @@ protected static GameObject GetOrCreateGameObject(GameObject parentGo, string na /// Name of the new trough /// Name of the exit kicker /// Name of the entry switch - protected static void CreateTrough(GameObject tableGo, GameObject parentGo, + protected static TroughComponent CreateTrough(GameObject tableGo, GameObject parentGo, string name = "Trough", string exitKicker = "BallRelease", string entrySwitch = "Drain") { var trough = new Trough(new TroughData { @@ -121,6 +121,7 @@ protected static void CreateTrough(GameObject tableGo, GameObject parentGo, } troughGo.name = name; + return troughComponent; } #endregion diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index b833e6ca7..9f320e845 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -19,6 +19,7 @@ // ReSharper disable UnusedMember.Global // ReSharper disable UnusedType.Global +using System; using System.Linq; using UnityEditor; using UnityEngine; @@ -27,6 +28,7 @@ using VisualPinball.Engine.VPT; using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; using Color = UnityEngine.Color; +using Object = UnityEngine.Object; namespace VisualPinball.Unity.Patcher { @@ -40,17 +42,28 @@ public class Terminator2 : TablePatcher public override void PostPatch(GameObject tableGo) { var playfieldGo = Playfield(tableGo); + playfieldGo.isStatic = true; // playfield material RenderPipeline.Current.MaterialConverter.SetSmoothness(playfieldGo.GetComponent().sharedMaterial, 0.96f); + SetupTrough(tableGo, playfieldGo); SetupPinMame(tableGo, playfieldGo); + SetupMapping(tableGo); // slingshots SetupLeftSlingshot(playfieldGo.transform.Find("Walls/LeftSlingshot").gameObject); SetupRightSlingshot(playfieldGo.transform.Find("Walls/RightSlingshot").gameObject); + } - base.PostPatch(tableGo); + private static void SetupTrough(GameObject tableGo, GameObject playfieldGo) + { + var troughComponent = CreateTrough(tableGo, playfieldGo); + troughComponent.Type = TroughType.TwoCoilsNSwitches; + troughComponent.BallCount = 3; + troughComponent.SwitchCount = 3; + troughComponent.JamSwitch = false; + troughComponent.RollTime = 300; } private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo) @@ -82,37 +95,117 @@ private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo) tableComponent.MappingConfig.Lamps.First(lm => lm.Id == "4").Device = giLeftPlayfield; } - #endregion + private static void SetupMapping(GameObject tableGo) + { + var tc = tableGo.GetComponent(); + var kickers = tableGo.GetComponentsInChildren(); + foreach (var kicker in kickers) { - [NameMatch("LeftRampCover")] - [NameMatch("LeftRampSign")] - [NameMatch("RightRampCover")] - [NameMatch("RightRampSign")] - [NameMatch("Plastics_LVL2")] - [NameMatch("BumperCaps")] - [NameMatch("RightRamp")] - public void FixZPosition(PrimitiveComponent primitive) + // shooter + LinkSwitch(tc, "sw78", "78", kicker); + LinkCoil(tc, "sw78", "09", kicker); + } + } + + protected static void LinkCoil(TableComponent tableComponent, string elementName, string coilId, ICoilDeviceComponent coilDevice) { - primitive.Position.z = 0; + if (!string.Equals(coilDevice.gameObject.name, elementName, StringComparison.OrdinalIgnoreCase)) { + return; + } + var coilMapping = tableComponent.MappingConfig.Coils.FirstOrDefault(cm => cm.Id == coilId); + if (coilMapping == null) { + return; + } + coilMapping.Device = coilDevice; + coilMapping.DeviceItem = coilDevice.AvailableCoils.First().Id; } - [NameMatch("Drain")] - public void FixDrain(KickerComponent kickerComponent) + protected static void LinkSwitch(TableComponent tableComponent, string elementName, string switchId, ISwitchDeviceComponent switchDevice) { - kickerComponent.Coils[0].Name = "Drain"; - kickerComponent.Coils[0].Speed = 15; - kickerComponent.Coils[0].Angle = 60; + if (!string.Equals(switchDevice.gameObject.name, elementName, StringComparison.OrdinalIgnoreCase)) { + return; + } + var switchMapping = tableComponent.MappingConfig.Switches.FirstOrDefault(sw => sw.Id == switchId); + if (switchMapping == null) { + return; + } + switchMapping.Device = switchDevice; + switchMapping.DeviceItem = switchDevice.AvailableSwitches.First().Id; } - [NameMatch("sw17")] - public void FixSw17(KickerComponent kickerComponent) + #endregion + + #region Geometry + + [NameMatch("_Apron")] + [NameMatch("_BackWall")] + [NameMatch("_Bulbs (GI - visible)")] + [NameMatch("_ChromeRails")] + [NameMatch("_ClearPlastics")] + [NameMatch("_CliffyPosts")] + [NameMatch("_HKShip")] + [NameMatch("_LeftOVerBits")] + [NameMatch("_LeftRampMetal")] + [NameMatch("_MetalPosts")] + [NameMatch("_Plastics")] + [NameMatch("_Posts")] + [NameMatch("_RedPlastics")] + [NameMatch("_RightRampPlastic")] + [NameMatch("_Rubbers")] + [NameMatch("_Screws")] + [NameMatch("_StarPosts")] + [NameMatch("_SteelBits")] + [NameMatch("_SteelWalls")] + [NameMatch("_Switches")] + [NameMatch("_Timber")] + [NameMatch("_Washers")] + [NameMatch("_WireSwitches")] + [NameMatch("_Wireforms")] + [NameMatch("_popbumperassy")] + [NameMatch("_wires")] + public void MakeStatic(GameObject go) + { + go.isStatic = true; + } + + [NameMatch("RubberPostPrim001")] + [NameMatch("RubberPostPrim002")] + [NameMatch("RubberPostPrim003")] + [NameMatch("RubberPostPrim004")] + [NameMatch("RubberPostPrim005")] + [NameMatch("RubberPostPrim006")] + [NameMatch("RubberPostPrim007")] + [NameMatch("RubberPostPrim008")] + [NameMatch("RubberPostPrim009")] + [NameMatch("RubberPostPrim010")] + [NameMatch("RubberPostPrim011")] + [NameMatch("RubberPostPrim012")] + [NameMatch("RubberPostPrim013")] + [NameMatch("RubberPostPrim014")] + [NameMatch("RubberPostPrim015")] + [NameMatch("RubberPostPrim016")] + public void PrimitiveCollider(GameObject go) + { + go.isStatic = true; + Object.DestroyImmediate(go.GetComponent()); + Object.DestroyImmediate(go.GetComponent()); + Object.DestroyImmediate(go.GetComponent()); + } + + [NameMatch("EndPointLp")] + [NameMatch("EndPointRp")] + [NameMatch("batleftshadow")] + [NameMatch("batrightshadow")] + [NameMatch("FlasherT1")] + [NameMatch("FlasherT2")] + public void Disable(GameObject go) { - kickerComponent.Coils[0].Name = "Eject"; - kickerComponent.Coils[0].Speed = 5; - kickerComponent.Coils[0].Angle = 60; + go.SetActive(false); } + #endregion + #region Flippers [NameMatch("batleft", Ref = "Playfield/Flippers/LeftFlipper")] @@ -218,6 +311,34 @@ private static void SetupRightSlingshot(GameObject go) #endregion + #region Kickers + + [NameMatch("BallRelease")] + public void FixSw17(KickerComponent kickerComponent) + { + kickerComponent.Coils[0].Name = "Eject"; + kickerComponent.Coils[0].Speed = 5; + kickerComponent.Coils[0].Angle = 60; + } + + [NameMatch("sw78")] + public void Shooter(KickerComponent kickerComponent) + { + kickerComponent.Coils[0].Name = "kicker_coil"; + kickerComponent.Coils[0].Speed = 50; + kickerComponent.Coils[0].Angle = 0; + } + + [NameMatch("sw76")] + public void SkullKicker(KickerComponent kickerComponent) + { + kickerComponent.Coils[0].Name = "kicker_coil"; + kickerComponent.Coils[0].Speed = 15; + kickerComponent.Coils[0].Angle = 72; + } + + #endregion + #region Materials [NameMatch("_Plastics")] @@ -260,7 +381,7 @@ public void SlingFlashers(GameObject go, float param) } [NameMatch("F120")] - [NameMatch("F125")] + [NameMatch("F125")] public void F120Pos(GameObject go) => LightPos(go, -160.8f, 17.6f, -6f); [NameMatch("F121")] public void F121Pos(GameObject go) => LightPos(go, 0f, -12.5f, 15.7f); [NameMatch("F122")] public void F122Pos(GameObject go) => LightPos(go, -4f, 97f, 25f); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs index 6246db88c..435a3a5ae 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/LampPlayer.cs @@ -71,7 +71,9 @@ public void OnStart() AssignLampMapping(lampMapping); // turn it off - _lamps[lampMapping.Device].OnLamp(0f, ColorChannel.Alpha); + if (_lamps.ContainsKey(lampMapping.Device)) { + _lamps[lampMapping.Device].OnLamp(0f, ColorChannel.Alpha); + } } if (_lampAssignments.Count > 0) { @@ -122,8 +124,6 @@ public void HandleLampEvent(LampEventArgs lampEvent) lamp.OnLamp(value, channel); LampStatuses[lampEvent.Id] = value; - } else { - Logger.Error($"Cannot trigger unknown lamp {component}."); } } #if UNITY_EDITOR diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs index cebddbb21..be14b0ae4 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightApi.cs @@ -38,6 +38,7 @@ public int State { private int _state; private readonly LightComponent _lightComponent; + private bool _initialized; void IApiWireDest.OnChange(bool enabled) => Set( enabled ? LightStatus.LightStateOn : LightStatus.LightStateOff, @@ -49,6 +50,10 @@ void IApiWireDest.OnChange(bool enabled) => Set( void IApiLamp.OnLamp(float value, ColorChannel channel) { + if (!_initialized) { + // might have disabled some lights in the editor.. + return; + } switch (channel) { case ColorChannel.Alpha: { Set(value == 0.0f ? LightStatus.LightStateOff : LightStatus.LightStateOn, value); @@ -128,6 +133,7 @@ void IApi.OnInit(BallManager ballManager) { base.OnInit(ballManager); Init?.Invoke(this, EventArgs.Empty); + _initialized = true; } void IApi.OnDestroy() From 9ce5690d54e49438dc62c100e1ebe6dd75bafcc9 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 12 Oct 2021 22:07:24 +0200 Subject: [PATCH 23/58] editor: Add toggle to lamp manager. --- .../Managers/Lamp/LampManager.cs | 45 +++++++++++++++++++ .../VPT/Light/LightComponent.cs | 8 ++++ 2 files changed, 53 insertions(+) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs index 2c106b9c4..481924a7e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; +using System.Linq; using NLog; using UnityEditor; using UnityEngine; @@ -42,6 +43,8 @@ internal class LampManager : ManagerWindow private LampListViewItemRenderer _listViewItemRenderer; + private ToggleAction _toggleAction = ToggleAction.All; + public static void Refresh() { if (HasOpenInstances()) { @@ -106,6 +109,43 @@ protected override void OnButtonBarGUI() Reload(); } } + + GUILayout.FlexibleSpace(); + + _toggleAction = (ToggleAction)EditorGUILayout.EnumPopup(_toggleAction); + if (GUILayout.Button("Lights Out", GUILayout.ExpandWidth(false))) { + Toggle(false); + } + if (GUILayout.Button("Lights On", GUILayout.ExpandWidth(false))) { + Toggle(true); + } + } + + private void Toggle(bool enable) + { + if (TableComponent != null) { + IEnumerable selection = _toggleAction switch { + ToggleAction.All => TableComponent.MappingConfig.Lamps, + ToggleAction.Inserts => TableComponent.MappingConfig.Lamps.Where(lm => !lm.IsCoil && lm.Source == LampSource.Lamp), + ToggleAction.GI => TableComponent.MappingConfig.Lamps.Where(lm => lm.Source == LampSource.GI), + ToggleAction.Flasher => TableComponent.MappingConfig.Lamps.Where(lm => lm.IsCoil), + _ => throw new ArgumentOutOfRangeException() + }; + + foreach (var lampMapping in selection) { + if (lampMapping.Device == null) { + continue; + } + + var lights = lampMapping.Device is LightGroupComponent lightGroupComponent + ? lightGroupComponent.Lights.SelectMany(l => l.GetComponentsInChildren()) + : lampMapping.Device.gameObject.GetComponentsInChildren(); + + foreach (var light in lights) { + light.enabled = enable; + } + } + } } protected override void OnListViewItemRenderer(LampListData data, Rect cellRect, int column) @@ -196,4 +236,9 @@ private void RecordUndo(string undoName) #endregion } + + internal enum ToggleAction + { + All, Inserts, GI, Flasher + } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs index 95225d379..548e798e0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs @@ -170,9 +170,17 @@ private void Awake() player.RegisterLamp(this); _unityLights = GetComponentsInChildren(); + + // remember intensity if (_unityLights.Length > 0) { _fullIntensity = _unityLights[0].intensity; } + // enable at 0 + foreach (var unityLight in _unityLights) { + unityLight.intensity = 0; + unityLight.enabled = true; + } + } public void FadeTo(float value) From 7e20dead9ad950508cd353fd38564a5c37132a36 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 12 Oct 2021 22:43:03 +0200 Subject: [PATCH 24/58] editor: Add selection to lamp manager. --- .../Managers/Lamp/LampManager.cs | 17 +++++++++++------ .../VPT/Light/LightComponent.cs | 1 - 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs index 481924a7e..b7afaff15 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs @@ -113,15 +113,20 @@ protected override void OnButtonBarGUI() GUILayout.FlexibleSpace(); _toggleAction = (ToggleAction)EditorGUILayout.EnumPopup(_toggleAction); - if (GUILayout.Button("Lights Out", GUILayout.ExpandWidth(false))) { - Toggle(false); + if (GUILayout.Button("Turn On", GUILayout.ExpandWidth(false))) { + Toggle(l => l.enabled = true); } - if (GUILayout.Button("Lights On", GUILayout.ExpandWidth(false))) { - Toggle(true); + if (GUILayout.Button("Turn Off", GUILayout.ExpandWidth(false))) { + Toggle(l => l.enabled = false); + } + if (GUILayout.Button("Select", GUILayout.ExpandWidth(false))) { + var lights = new List(); + Toggle(lights.Add); + Selection.objects = lights.Select(l => l.gameObject as Object).ToArray(); } } - private void Toggle(bool enable) + private void Toggle(Action action) { if (TableComponent != null) { IEnumerable selection = _toggleAction switch { @@ -142,7 +147,7 @@ private void Toggle(bool enable) : lampMapping.Device.gameObject.GetComponentsInChildren(); foreach (var light in lights) { - light.enabled = enable; + action(light); } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs index 548e798e0..e45cfa57e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs @@ -180,7 +180,6 @@ private void Awake() unityLight.intensity = 0; unityLight.enabled = true; } - } public void FadeTo(float value) From 273d1ad54b6fcb3ba3efcab7f39dfd20d91f7bc7 Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 12 Oct 2021 22:57:27 +0200 Subject: [PATCH 25/58] patcher: Fix trough setup. --- .../VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index 3826c1080..d2f5ad959 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -104,9 +104,11 @@ protected static TroughComponent CreateTrough(GameObject tableGo, GameObject par foreach (var kicker in kickers) { if (string.Equals(kicker.name, exitKicker, StringComparison.OrdinalIgnoreCase)) { troughComponent.PlayfieldExitKicker = kicker; + troughComponent.PlayfieldExitKickerItem = kicker.AvailableCoils.First().Id; } if (string.Equals(kicker.name, entrySwitch, StringComparison.OrdinalIgnoreCase)) { troughComponent.PlayfieldEntrySwitch = kicker; + troughComponent.PlayfieldEntrySwitchItem = kicker.AvailableSwitches.First().Id; } } From b2d7d9cc86c035413121d4e7e897e9fc07aaf751 Mon Sep 17 00:00:00 2001 From: freezy Date: Wed, 13 Oct 2021 00:01:50 +0200 Subject: [PATCH 26/58] lights: Don't fade flashers. --- .../VPT/Light/LightComponent.cs | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs index e45cfa57e..77708df20 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Light/LightComponent.cs @@ -58,6 +58,7 @@ public class LightComponent : MainRenderableComponent, ILampDeviceCom public float FadeSpeedUp; public float FadeSpeedDown; + private bool IsFlasher => FadeSpeedUp == 0f && FadeSpeedDown == 0f; #endregion @@ -177,15 +178,33 @@ private void Awake() } // enable at 0 foreach (var unityLight in _unityLights) { - unityLight.intensity = 0; - unityLight.enabled = true; + if (IsFlasher) { + unityLight.enabled = false; + + } else { + unityLight.enabled = true; + unityLight.intensity = 0; + } } } public void FadeTo(float value) { - StopAllCoroutines(); - StartCoroutine(nameof(Fade), value); + if (IsFlasher) { + foreach (var unityLight in _unityLights) { + if (value > 0) { + unityLight.intensity = value * _fullIntensity; + unityLight.enabled = true; + + } else { + unityLight.enabled = false; + } + } + + } else { + StopAllCoroutines(); + StartCoroutine(nameof(Fade), value); + } } public void StartBlinking() From 2fd2e60372a44618035cf758ba8d6532eaa9c85c Mon Sep 17 00:00:00 2001 From: freezy Date: Wed, 13 Oct 2021 00:35:04 +0200 Subject: [PATCH 27/58] mapping: Setup data for dynamic wires. --- .../Matcher/TablePatcher.cs | 44 ++++++++ .../Patcher/Tables/Terminator2.cs | 29 ----- .../VisualPinball.Unity/Game/CoilPlayer.cs | 37 +++++-- .../VisualPinball.Unity/Game/Player.cs | 6 +- .../VisualPinball.Unity/Game/SwitchHandler.cs | 4 +- .../VisualPinball.Unity/Game/WirePlayer.cs | 102 +++++++++++++++--- .../Mappings/WireMapping.cs | 7 ++ 7 files changed, 171 insertions(+), 58 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index d2f5ad959..d2cd02269 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -249,5 +249,49 @@ protected static void Duplicate(GameObject go, float x, float y, float z) } #endregion + + #region Mapping Helpers + + /// + /// Links a coil device to an existing coil mapping if it matches a given name. + /// + /// Table component for retrieving mappings. + /// The name that the coil device's GameObject has to match in order to be linked. + /// The ID of the coil mapping that the coil device will be linked to + /// The coil device to be linked + protected static void LinkCoil(TableComponent tableComponent, string elementName, string coilId, ICoilDeviceComponent coilDevice) + { + if (!string.Equals(coilDevice.gameObject.name, elementName, StringComparison.OrdinalIgnoreCase)) { + return; + } + var coilMapping = tableComponent.MappingConfig.Coils.FirstOrDefault(cm => cm.Id == coilId); + if (coilMapping == null) { + return; + } + coilMapping.Device = coilDevice; + coilMapping.DeviceItem = coilDevice.AvailableCoils.First().Id; + } + + /// + /// Links a switch device to an existing switch mapping if it matches a given name. + /// + /// Table component for retrieving mappings. + /// The name that the switch device's GameObject has to match in order to be linked. + /// The ID of the switch mapping that the switch device will be linked to + /// The switch device to be linked + protected static void LinkSwitch(TableComponent tableComponent, string elementName, string switchId, ISwitchDeviceComponent switchDevice) + { + if (!string.Equals(switchDevice.gameObject.name, elementName, StringComparison.OrdinalIgnoreCase)) { + return; + } + var switchMapping = tableComponent.MappingConfig.Switches.FirstOrDefault(sw => sw.Id == switchId); + if (switchMapping == null) { + return; + } + switchMapping.Device = switchDevice; + switchMapping.DeviceItem = switchDevice.AvailableSwitches.First().Id; + } + + #endregion } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 9f320e845..9158fb06c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -19,7 +19,6 @@ // ReSharper disable UnusedMember.Global // ReSharper disable UnusedType.Global -using System; using System.Linq; using UnityEditor; using UnityEngine; @@ -28,11 +27,9 @@ using VisualPinball.Engine.VPT; using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; using Color = UnityEngine.Color; -using Object = UnityEngine.Object; namespace VisualPinball.Unity.Patcher { - [MetaMatch(TableName = "Terminator 2 (Williams 1991)", AuthorName = "NFOZZY")] [MetaMatch(TableName = "Terminator 2 - Judgment Day (Williams 1991)", AuthorName = "g5k")] public class Terminator2 : TablePatcher { @@ -108,32 +105,6 @@ private static void SetupMapping(GameObject tableGo) } } - protected static void LinkCoil(TableComponent tableComponent, string elementName, string coilId, ICoilDeviceComponent coilDevice) - { - if (!string.Equals(coilDevice.gameObject.name, elementName, StringComparison.OrdinalIgnoreCase)) { - return; - } - var coilMapping = tableComponent.MappingConfig.Coils.FirstOrDefault(cm => cm.Id == coilId); - if (coilMapping == null) { - return; - } - coilMapping.Device = coilDevice; - coilMapping.DeviceItem = coilDevice.AvailableCoils.First().Id; - } - - protected static void LinkSwitch(TableComponent tableComponent, string elementName, string switchId, ISwitchDeviceComponent switchDevice) - { - if (!string.Equals(switchDevice.gameObject.name, elementName, StringComparison.OrdinalIgnoreCase)) { - return; - } - var switchMapping = tableComponent.MappingConfig.Switches.FirstOrDefault(sw => sw.Id == switchId); - if (switchMapping == null) { - return; - } - switchMapping.Device = switchDevice; - switchMapping.DeviceItem = switchDevice.AvailableSwitches.First().Id; - } - #endregion #region Geometry diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs index dc47a0529..69d9e0b0a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs @@ -15,6 +15,7 @@ // along with this program. If not, see . using System.Collections.Generic; +using System.Linq; using NLog; namespace VisualPinball.Unity @@ -34,6 +35,7 @@ public class CoilPlayer private TableComponent _tableComponent; private IGamelogicEngine _gamelogicEngine; private LampPlayer _lampPlayer; + private WirePlayer _wirePlayer; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -43,11 +45,12 @@ public class CoilPlayer internal IApiCoil Coil(ICoilDeviceComponent component, string coilItem) => _coilDevices.ContainsKey(component) ? _coilDevices[component].Coil(coilItem) : null; - public void Awake(TableComponent tableComponent, IGamelogicEngine gamelogicEngine, LampPlayer lampPlayer) + public void Awake(TableComponent tableComponent, IGamelogicEngine gamelogicEngine, LampPlayer lampPlayer, WirePlayer wirePlayer) { _tableComponent = tableComponent; _gamelogicEngine = gamelogicEngine; _lampPlayer = lampPlayer; + _wirePlayer = wirePlayer; } public void OnStart() @@ -74,16 +77,17 @@ public void OnStart() var device = _coilDevices[coilMapping.Device]; var coil = device.Coil(coilMapping.DeviceItem); if (coil != null) { - AssignCoilMapping(coilMapping.Id, coilMapping.Device, coilMapping.DeviceItem); + AssignCoilMapping(coilMapping, false); } else { Logger.Error($"Unknown coil \"{coilMapping.DeviceItem}\" in coil device \"{coilMapping.Device}\"."); } break; - case CoilDestination.Lamp: - AssignCoilMapping(coilMapping.Id, coilMapping.Device, coilMapping.DeviceItem, isLampCoil: true); + case CoilDestination.Lamp: { + AssignCoilMapping(coilMapping, true); break; + } } } @@ -93,13 +97,17 @@ public void OnStart() } } - private void AssignCoilMapping(string id, ICoilDeviceComponent device, string deviceCoilId, bool isLampCoil = false) + private void AssignCoilMapping(CoilMapping coilMapping, bool isLampCoil) { - if (!_coilAssignments.ContainsKey(id)) { - _coilAssignments[id] = new List(); + if (!_coilAssignments.ContainsKey(coilMapping.Id)) { + _coilAssignments[coilMapping.Id] = new List(); } - _coilAssignments[id].Add(new CoilDestConfig(device, deviceCoilId, isLampCoil)); - CoilStatuses[id] = false; + var hasDynamicWire = _tableComponent.MappingConfig.Wires.FirstOrDefault(w => + w.DestinationDevice == coilMapping.Device && + w.DestinationDeviceItem == coilMapping.DeviceItem) != null; + + _coilAssignments[coilMapping.Id].Add(new CoilDestConfig(coilMapping.Device, coilMapping.DeviceItem, isLampCoil, hasDynamicWire)); + CoilStatuses[coilMapping.Id] = false; } private void HandleCoilEvent(object sender, CoilEventArgs coilEvent) @@ -109,6 +117,11 @@ private void HandleCoilEvent(object sender, CoilEventArgs coilEvent) foreach (var destConfig in _coilAssignments[coilEvent.Id]) { + if (destConfig.HasDynamicWire) { + _wirePlayer.HandleCoilEvent(); + continue; + } + if (destConfig.IsLampCoil) { _lampPlayer.HandleLampEvent(new LampEventArgs(coilEvent.Id, coilEvent.IsEnabled ? 1 : 0, true)); continue; @@ -159,17 +172,19 @@ internal class CoilDestConfig public readonly ICoilDeviceComponent Device; public readonly string DeviceItem; public readonly bool IsLampCoil; + public readonly bool HasDynamicWire; - public CoilDestConfig(ICoilDeviceComponent device, string deviceItem, bool isLampCoil) + public CoilDestConfig(ICoilDeviceComponent device, string deviceItem, bool isLampCoil, bool hasDynamicWire) { Device = device; DeviceItem = deviceItem; IsLampCoil = isLampCoil; + HasDynamicWire = hasDynamicWire; } public override string ToString() { - return $"coil destination (device = {Device}, coild id = {DeviceItem}, lamp = {IsLampCoil})"; + return $"coil destination (device = {Device}, coild id = {DeviceItem}, lamp = {IsLampCoil}, wire = {HasDynamicWire})"; } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index fc6666c1b..8ce879b83 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -124,7 +124,7 @@ private void Awake() if (engineComponent != null) { GamelogicEngine = engineComponent; _lampPlayer.Awake(_tableComponent, GamelogicEngine); - _coilPlayer.Awake(_tableComponent, GamelogicEngine, _lampPlayer); + _coilPlayer.Awake(_tableComponent, GamelogicEngine, _lampPlayer, _wirePlayer); _switchPlayer.Awake(_tableComponent, GamelogicEngine, _inputManager); _wirePlayer.Awake(_tableComponent, _inputManager, _switchPlayer); _displayPlayer.Awake(GamelogicEngine); @@ -414,7 +414,7 @@ public void OnEvent(in EventData eventData) #region API - public void AddDynamicWire(string switchId, string coilId) + public void AddHardwareRule(string switchId, string coilId) { var switchMapping = _tableComponent.MappingConfig.Switches.FirstOrDefault(c => c.Id == switchId); var coilMapping = _tableComponent.MappingConfig.Coils.FirstOrDefault(c => c.Id == coilId); @@ -434,7 +434,7 @@ public void AddDynamicWire(string switchId, string coilId) _tableComponent.MappingConfig.AddWire(wireMapping); } - public void RemoveDynamicWire(string switchId, string coilId) + public void RemoveHardwareRule(string switchId, string coilId) { var switchMapping = _tableComponent.MappingConfig.Switches.FirstOrDefault(c => c.Id == switchId); var coilMapping = _tableComponent.MappingConfig.Coils.FirstOrDefault(c => c.Id == coilId); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs index 7576983b7..ca3ede906 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs @@ -84,7 +84,7 @@ public void AddWireDest(WireDestConfig wireConfig) public void RemoveWireDest(string destId) { foreach (var wire in _wires) { - if (wire.IsDynamic && wire.DeviceItem == destId) { + if (wire.IsHardwareRule && wire.DeviceItem == destId) { _wires.Remove(wire); return; } @@ -128,7 +128,7 @@ internal void OnSwitch(bool enabled) var dest = device.Wire(wireConfig.DeviceItem); if (dest != null) { - // close the switch now + // toggle switch dest.OnChange(enabled); // if it's pulse, schedule to re-open diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index 630210c20..56939dd52 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -18,6 +18,7 @@ using System.Linq; using NLog; using UnityEngine.InputSystem; +using UnityEngine.Networking.Types; namespace VisualPinball.Unity { @@ -33,6 +34,8 @@ public class WirePlayer private InputManager _inputManager; private SwitchPlayer _switchPlayer; + private Dictionary<(string, string), Queue> _dynamicWireSignals = new Dictionary<(string, string), Queue>(); + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); internal IApiWireDeviceDest WireDevice(IWireableComponent c) => _wireDevices.ContainsKey(c) ? _wireDevices[c] : null; @@ -56,7 +59,7 @@ public void OnStart() _inputManager.Enable(HandleKeyInput); } - internal void AddWire(WireMapping wireMapping, bool isDynamic = false) + internal void AddWire(WireMapping wireMapping, bool isHardwareRule = false) { switch (wireMapping.Source) { @@ -75,7 +78,7 @@ internal void AddWire(WireMapping wireMapping, bool isDynamic = false) var deviceSwitch = _switchPlayer.Switch(wireMapping.SourceDevice, wireMapping.SourceDeviceItem); if (deviceSwitch != null) { - deviceSwitch.AddWireDest(new WireDestConfig(wireMapping) { IsDynamic = isDynamic }); + deviceSwitch.AddWireDest(SetupWireDestConfig(wireMapping, isHardwareRule)); Logger.Info($"Wiring device switch \"{wireMapping.Src}\" to \"{wireMapping.Dst}\""); } else { @@ -88,7 +91,7 @@ internal void AddWire(WireMapping wireMapping, bool isDynamic = false) if (!_keyWireAssignments.ContainsKey(wireMapping.SourceInputAction)) { _keyWireAssignments[wireMapping.SourceInputAction] = new List(); } - _keyWireAssignments[wireMapping.SourceInputAction].Add(new WireDestConfig(wireMapping) { IsDynamic = isDynamic }); + _keyWireAssignments[wireMapping.SourceInputAction].Add(SetupWireDestConfig(wireMapping, isHardwareRule)); break; } @@ -101,6 +104,34 @@ internal void AddWire(WireMapping wireMapping, bool isDynamic = false) } } + private WireDestConfig SetupWireDestConfig(WireMapping wireMapping, bool isHardwareRule) + { + var wireDest = new WireDestConfig(wireMapping) { IsHardwareRule = isHardwareRule }; + if (!wireMapping.IsDynamic) { + return wireDest; + } + if (GetGamelogicEngineIds(wireMapping, out var srcId, out var destId)) { + wireMapping.DynamicSrcId = srcId; + wireMapping.DynamicDestId = destId; + _dynamicWireSignals[(srcId, destId)] = new Queue(); + + } else { + Logger.Warn($"GLE IDs not found for dynamic wire {wireMapping.Description} ({srcId} / {destId})."); + } + return wireDest; + } + + private bool GetGamelogicEngineIds(WireMapping wireMapping, out string src, out string dest) + { + var sourceMapping = _tableComponent.MappingConfig.Switches.FirstOrDefault(switchMapping => + switchMapping.Device == wireMapping.SourceDevice && switchMapping.DeviceItem == wireMapping.SourceDeviceItem); + var destMapping = _tableComponent.MappingConfig.Coils.FirstOrDefault(coilMapping => + coilMapping.Device == wireMapping.DestinationDevice && coilMapping.DeviceItem == wireMapping.DestinationDeviceItem); + src = sourceMapping?.Id; + dest = destMapping?.Id; + return sourceMapping != null && destMapping != null; + } + internal void RemoveWire(WireMapping wireMapping) { switch (wireMapping.Source) { @@ -132,7 +163,7 @@ internal void RemoveWire(WireMapping wireMapping) _keyWireAssignments[wireMapping.SourceInputAction] = new List(); } var assignment = _keyWireAssignments[wireMapping.SourceInputAction] - .FirstOrDefault(a => a.IsDynamic && a.Device == wireMapping.DestinationDevice && a.DeviceItem == wireMapping.DestinationDeviceItem); + .FirstOrDefault(a => a.IsHardwareRule && a.Device == wireMapping.DestinationDevice && a.DeviceItem == wireMapping.DestinationDeviceItem); _keyWireAssignments[wireMapping.SourceInputAction].Remove(assignment); break; } @@ -154,14 +185,24 @@ private void HandleKeyInput(object obj, InputActionChange change) var action = (InputAction)obj; if (_keyWireAssignments != null && _keyWireAssignments.ContainsKey(action.name)) { foreach (var wireConfig in _keyWireAssignments[action.name]) { - if (_wireDevices.ContainsKey(wireConfig.Device)) { - var device = _wireDevices[wireConfig.Device]; - var wire = device.Wire(wireConfig.DeviceItem); - if (wire != null) { - wire.OnChange(change == InputActionChange.ActionStarted); + if (!_wireDevices.ContainsKey(wireConfig.Device)) { + continue; + } + + var device = _wireDevices[wireConfig.Device]; + var wire = device.Wire(wireConfig.DeviceItem); + if (wire != null) { + var isEnabled = change == InputActionChange.ActionStarted; + if (!wireConfig.IsDynamic) { + wire.OnChange(isEnabled); + } else { - Logger.Warn($"Unknown wire \"{wireConfig.DeviceItem}\" in wire device \"{wireConfig.Device}\"."); + if (wireConfig.IsActive) { + wire.OnChange(isEnabled); + } } + } else { + Logger.Warn($"Unknown wire \"{wireConfig.DeviceItem}\" in wire device \"{wireConfig.Device}\"."); } } } @@ -169,6 +210,11 @@ private void HandleKeyInput(object obj, InputActionChange change) } } + public void HandleCoilEvent() + { + + } + public void OnDestroy() { if (_keyWireAssignments.Count > 0) { @@ -185,19 +231,49 @@ public class WireDestConfig public bool IsPulseSource; /// - /// If the destination is dynamic, it means it was added during - /// gameplay. MPF does this, and it's called a "hardware rule". We tag + /// Wires that are added during gameplay (MPF does this). We tag /// it as such here so we can filter when removing the wire. /// + public bool IsHardwareRule; + + /// + /// Unlike hardware rules, dynamic wires are permanently added, but + /// they dynamically enable and disable depending on the GLE.

+ /// + /// If a dynamic wire is enabled, it stays active until the output + /// signal isn't received from the GLE within a certain threshold + /// (). If it's disabled, no signal + /// is sent until we get it from the GLE. + ///

+ /// + /// + /// The goal is to compensate lag introduced by the GLE. The typical + /// use case are flippers. By additionally linking the flipper button + /// switch to the flipper coil with a dynamic wire, VPE will instantly + /// trigger the flipper coil and only stop doing so if no coil signal + /// is received from the GLE. + /// public bool IsDynamic; + /// + /// Threshold in milliseconds within a confirming signal from the GLE + /// is expected. Should the signal arrive outside the threshold, the + /// dynamic wire's enabled status will be toggled. + /// + public int DynamicThresholdMs; + + public bool IsActive = true; + public WireDestConfig(WireMapping wireMapping) { Device = wireMapping.DestinationDevice; DeviceItem = wireMapping.DestinationDeviceItem; PulseDelay = wireMapping.PulseDelay; + IsDynamic = wireMapping.IsDynamic; + DynamicThresholdMs = wireMapping.DynamicThresholdMs; IsPulseSource = false; - IsDynamic = false; + IsHardwareRule = false; + IsActive = !wireMapping.IsDynamic; } public WireDestConfig WithPulse(bool isPulseSource) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs index 57085eb4c..f781b258b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs @@ -51,6 +51,13 @@ public class WireMapping public int PulseDelay = 250; + public bool IsDynamic; + + public int DynamicThresholdMs; + + internal string DynamicSrcId; + internal string DynamicDestId; + public WireMapping() { } From 7d38eecd20b03431a51588c5cd66cd53fe0058c3 Mon Sep 17 00:00:00 2001 From: freezy Date: Wed, 13 Oct 2021 23:43:54 +0200 Subject: [PATCH 28/58] mapping: Setup player for dynamic wires. --- .../Managers/Wire/WireListData.cs | 7 +- .../Managers/Wire/WireListViewItemRenderer.cs | 19 ++++- .../Managers/Wire/WireManager.cs | 2 +- .../VisualPinball.Unity/Game/CoilPlayer.cs | 3 +- .../VisualPinball.Unity/Game/WirePlayer.cs | 80 +++++++++++++++++-- .../Mappings/WireMapping.cs | 5 +- .../VPT/Surface/SlingshotComponent.cs | 4 +- 7 files changed, 102 insertions(+), 18 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs index 56687e29a..2e8c6b1f6 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs @@ -32,7 +32,10 @@ public class WireListData : IManagerListData, IDeviceListData Name; set => Name = value; } @@ -61,6 +64,7 @@ public WireListData(WireMapping wireMapping) { SourceConstant = wireMapping.SourceConstant; SourceDevice = wireMapping.SourceDevice; SourceDeviceItem = wireMapping.SourceDeviceItem; + IsDynamic = wireMapping.IsDynamic; DestinationDevice = wireMapping.DestinationDevice; DestinationDeviceItem = wireMapping.DestinationDeviceItem; @@ -80,6 +84,7 @@ public void Update() WireMapping.SourceConstant = SourceConstant; WireMapping.SourceDevice = SourceDevice; WireMapping.SourceDeviceItem = SourceDeviceItem; + WireMapping.IsDynamic = IsDynamic; WireMapping.DestinationDevice = DestinationDevice; WireMapping.DestinationDeviceItem = DestinationDeviceItem; diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs index 5e2ff01d4..1e25d60ee 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs @@ -41,7 +41,8 @@ private enum WireListColumn Source = 1, SourceElement = 2, DestinationElement = 3, - PulseDelay = 4, + Dynamic = 4, + PulseDelay = 5, } private readonly InputManager _inputManager; @@ -57,7 +58,7 @@ public WireListViewItemRenderer(TableComponent tableComponent, InputManager inpu _destDevicePicker = new ObjectReferencePicker("Wire Destination", tableComponent, false); } - public void Render(TableComponent tableComponent, WireListData data, Rect cellRect, int column, Action updateAction) + public void Render(WireListData data, Rect cellRect, int column, Action updateAction) { switch ((WireListColumn)column) { @@ -73,6 +74,9 @@ public void Render(TableComponent tableComponent, WireListData data, Rect cellRe case WireListColumn.DestinationElement: RenderDestinationElement(data, cellRect, updateAction); break; + case WireListColumn.Dynamic: + RenderIsDynamic(data, cellRect, updateAction); + break; case WireListColumn.PulseDelay: RenderPulseDelay(data, cellRect, updateAction); break; @@ -231,6 +235,17 @@ protected override void RenderDeviceElement(WireListData listData, Rect cellRect }); } + + private void RenderIsDynamic(WireListData wireListData, Rect cellRect, Action updateAction) + { + EditorGUI.BeginChangeCheck(); + var isDynamic = EditorGUI.Toggle(cellRect, wireListData.IsDynamic); + if (EditorGUI.EndChangeCheck()) { + wireListData.IsDynamic = isDynamic; + updateAction(wireListData); + } + } + private void RenderPulseDelay(WireListData wireListData, Rect cellRect, Action updateAction) { if (wireListData.SourceDevice != null && !string.IsNullOrEmpty(wireListData.SourceDeviceItem)) { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireManager.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireManager.cs index 3dafeabf8..1e97c3825 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireManager.cs @@ -103,7 +103,7 @@ protected override void OnButtonBarGUI() protected override void OnListViewItemRenderer(WireListData data, Rect cellRect, int column) { - _listViewItemRenderer.Render(TableComponent, data, cellRect, column, wireListData => { + _listViewItemRenderer.Render(data, cellRect, column, wireListData => { RecordUndo(DataTypeName + " Data Change"); wireListData.Update(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs index 69d9e0b0a..326706187 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/CoilPlayer.cs @@ -118,7 +118,8 @@ private void HandleCoilEvent(object sender, CoilEventArgs coilEvent) foreach (var destConfig in _coilAssignments[coilEvent.Id]) { if (destConfig.HasDynamicWire) { - _wirePlayer.HandleCoilEvent(); + // goes back through the wire mapping, which will decide whether it has already sent the event or not + _wirePlayer.HandleCoilEvent(coilEvent.Id, coilEvent.IsEnabled); continue; } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index 56939dd52..6e7ab12a9 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -17,8 +17,11 @@ using System.Collections.Generic; using System.Linq; using NLog; +using Unity.Mathematics; +using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Networking.Types; +using Logger = NLog.Logger; namespace VisualPinball.Unity { @@ -29,12 +32,14 @@ public class WirePlayer ///
private readonly Dictionary _wireDevices = new Dictionary(); private readonly Dictionary> _keyWireAssignments = new Dictionary>(); + private readonly Dictionary> _gleDestAssignments = new Dictionary>(); + private readonly Dictionary> _gleSrcAssignments = new Dictionary>(); + private readonly Dictionary> _gleSignals = new Dictionary>(); private TableComponent _tableComponent; private InputManager _inputManager; private SwitchPlayer _switchPlayer; - private Dictionary<(string, string), Queue> _dynamicWireSignals = new Dictionary<(string, string), Queue>(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -52,6 +57,7 @@ public void OnStart() { var config = _tableComponent.MappingConfig; _keyWireAssignments.Clear(); + _gleDestAssignments.Clear(); foreach (var wireData in config.Wires) { AddWire(wireData); } @@ -111,9 +117,20 @@ private WireDestConfig SetupWireDestConfig(WireMapping wireMapping, bool isHardw return wireDest; } if (GetGamelogicEngineIds(wireMapping, out var srcId, out var destId)) { - wireMapping.DynamicSrcId = srcId; - wireMapping.DynamicDestId = destId; - _dynamicWireSignals[(srcId, destId)] = new Queue(); + var queue = new Queue(); + + _gleSignals[wireDest] = new Queue(); + + // reference the queue both by src and dest + if (!_gleSrcAssignments.ContainsKey(srcId)) { + _gleSrcAssignments[srcId] = new List(); + } + _gleSrcAssignments[srcId].Add(wireDest); + + if (!_gleDestAssignments.ContainsKey(destId)) { + _gleDestAssignments[destId] = new List(); + } + _gleDestAssignments[destId].Add(wireDest); } else { Logger.Warn($"GLE IDs not found for dynamic wire {wireMapping.Description} ({srcId} / {destId})."); @@ -197,8 +214,13 @@ private void HandleKeyInput(object obj, InputActionChange change) wire.OnChange(isEnabled); } else { + _gleSignals[wireConfig].Enqueue(Time.realtimeSinceStartup); if (wireConfig.IsActive) { + Logger.Info($"Skipping GLE for setting coil at {wireConfig.DeviceItem} @ ${wireConfig.Device.gameObject.name} to {isEnabled}."); wire.OnChange(isEnabled); + + } else { + } } } else { @@ -210,9 +232,52 @@ private void HandleKeyInput(object obj, InputActionChange change) } } - public void HandleCoilEvent() + public void HandleCoilEvent(string id, bool isEnabled) { + foreach (var wireConfig in _gleDestAssignments[id]) { + if (!_wireDevices.ContainsKey(wireConfig.Device)) { + continue; + } + var device = _wireDevices[wireConfig.Device]; + var wire = device.Wire(wireConfig.DeviceItem); + if (wire != null) { + var lagMs = GetLag(wireConfig); + if (lagMs > 0 && lagMs < WireDestConfig.DynamicThresholdMs) { + if (!wireConfig.IsActive) { + Logger.Info($"Enabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagMs}ms)."); + } + wireConfig.IsActive = true; + } else { + if (wireConfig.IsActive) { + Logger.Info($"Disabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagMs}ms)."); + } else { + Logger.Info($"NOT enabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagMs}ms)."); + } + wireConfig.IsActive = false; + } + + wire.OnChange(isEnabled); + + } else { + Logger.Warn($"Unknown dynamic wire \"{wireConfig.DeviceItem}\" in wire device \"{wireConfig.Device}\"."); + } + } + } + + private float GetLag(WireDestConfig wireConfig) + { + var timeNow = Time.realtimeSinceStartup; + var queue = _gleSignals[wireConfig]; + var lagMs = -1; + while (queue.Count > 0) { + var timeQueue = queue.Dequeue(); + lagMs = (int)math.round((timeNow - timeQueue) * 1000); + if (lagMs < WireDestConfig.DynamicThresholdMs) { + return lagMs; + } + } + return lagMs; } public void OnDestroy() @@ -260,9 +325,9 @@ public class WireDestConfig /// is expected. Should the signal arrive outside the threshold, the /// dynamic wire's enabled status will be toggled. ///
- public int DynamicThresholdMs; + public const int DynamicThresholdMs = 200; - public bool IsActive = true; + public bool IsActive; public WireDestConfig(WireMapping wireMapping) { @@ -270,7 +335,6 @@ public WireDestConfig(WireMapping wireMapping) DeviceItem = wireMapping.DestinationDeviceItem; PulseDelay = wireMapping.PulseDelay; IsDynamic = wireMapping.IsDynamic; - DynamicThresholdMs = wireMapping.DynamicThresholdMs; IsPulseSource = false; IsHardwareRule = false; IsActive = !wireMapping.IsDynamic; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs index f781b258b..62a008cdb 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs @@ -53,10 +53,7 @@ public class WireMapping public bool IsDynamic; - public int DynamicThresholdMs; - - internal string DynamicSrcId; - internal string DynamicDestId; + public int DynamicThresholdMs = 75; public WireMapping() { diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs index c54637bef..22501b46f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Surface/SlingshotComponent.cs @@ -74,7 +74,9 @@ private void Start() return; } var slingshotSurfaceApi = player.TableApi.Surface(SlingshotSurface.MainComponent); - slingshotSurfaceApi.Slingshot += OnSlingshot; + if (slingshotSurfaceApi != null) { + slingshotSurfaceApi.Slingshot += OnSlingshot; + } } private void OnDestroy() From dc31539a54d4e5eb1ddf52b018469d72630adacf Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 14 Oct 2021 00:04:54 +0200 Subject: [PATCH 29/58] chore: Minor cleanups. --- VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index 6e7ab12a9..ab1b16d20 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -216,11 +216,8 @@ private void HandleKeyInput(object obj, InputActionChange change) } else { _gleSignals[wireConfig].Enqueue(Time.realtimeSinceStartup); if (wireConfig.IsActive) { - Logger.Info($"Skipping GLE for setting coil at {wireConfig.DeviceItem} @ ${wireConfig.Device.gameObject.name} to {isEnabled}."); + // the dynamic wire is active, so trigger directly. wire.OnChange(isEnabled); - - } else { - } } } else { @@ -251,8 +248,6 @@ public void HandleCoilEvent(string id, bool isEnabled) } else { if (wireConfig.IsActive) { Logger.Info($"Disabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagMs}ms)."); - } else { - Logger.Info($"NOT enabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagMs}ms)."); } wireConfig.IsActive = false; } From 6257250b063c867e02fe37a1a4e900b929f5b317 Mon Sep 17 00:00:00 2001 From: jsm174 Date: Thu, 14 Oct 2021 08:40:55 -0400 Subject: [PATCH 30/58] t2: add cannon component --- .../VisualPinball.Unity/Game/Player.cs | 5 + .../VisualPinball.Unity/VPT/Mech.meta | 8 ++ .../VisualPinball.Unity/VPT/Mech/CannonApi.cs | 99 +++++++++++++++++ .../VPT/Mech/CannonApi.cs.meta | 11 ++ .../VPT/Mech/CannonComponent.cs | 103 ++++++++++++++++++ .../VPT/Mech/CannonComponent.cs.meta | 11 ++ .../VisualPinball.Unity/VPT/Table/TableApi.cs | 12 ++ 7 files changed, 249 insertions(+) create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Mech.meta create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs.meta create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs create mode 100644 VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs.meta diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index 8ce879b83..5a0496a79 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -229,6 +229,11 @@ public void RegisterLampGroup(LightGroupComponent component) Register(new LightGroupApi(component.Lights.Select(l => l.GetApi(this)).ToArray()), component); } + public void RegisterMech(CannonComponent component) + { + Register(new CannonApi(component.gameObject, this), component); + } + public void RegisterPlunger(PlungerComponent component, Entity entity, Entity parentEntity, InputActionReference actionRef) { var plungerApi = new PlungerApi(component.gameObject, entity, parentEntity, this); diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech.meta new file mode 100644 index 000000000..c7fc81b2b --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bc99a8c7acdb34bd08620e3062324648 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs new file mode 100644 index 000000000..844451986 --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs @@ -0,0 +1,99 @@ +using System; +using Logger = NLog.Logger; +using NLog; +using UnityEngine; +using Unity.Mathematics; + +namespace VisualPinball.Unity +{ + public class CannonApi : IApi, IApiSwitchDevice, IApiCoilDevice + { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + private readonly CannonComponent _cannonComponent; + private Player _player; + + private DeviceCoil GunMotorCoil; + + public DeviceSwitch GunHomeSwitch; + public DeviceSwitch GunMarkSwitch; + + public event EventHandler Init; + + public int position = 0; + public const int Length = 240; + + internal CannonApi(GameObject go, Player player) + { + _cannonComponent = go.GetComponentInChildren(); + _cannonComponent.SetAPI(this); + _player = player; + } + + IApiCoil IApiCoilDevice.Coil(string deviceItem) + { + return deviceItem == CannonComponent.GunMotorCoilItem ? GunMotorCoil : null; + } + + IApiSwitch IApiSwitchDevice.Switch(string deviceItem) + { + if (deviceItem == CannonComponent.GunHomeSwitchItem) + { + return GunHomeSwitch; + } + else if (deviceItem == CannonComponent.GunMarkSwitchItem) + { + return GunMarkSwitch; + } + + return null; + } + + void IApi.OnInit(BallManager ballManager) + { + GunMotorCoil = new DeviceCoil(OnGunMotorCoilEnabled, OnGunMotorCoilDisabled); + + GunHomeSwitch = new DeviceSwitch(CannonComponent.GunHomeSwitchItem, false, SwitchDefault.NormallyOpen, _player); + GunMarkSwitch = new DeviceSwitch(CannonComponent.GunMarkSwitchItem, false, SwitchDefault.NormallyOpen, _player); + + UpdatePosition(); + + Init?.Invoke(this, EventArgs.Empty); + } + + private void OnGunMotorCoilEnabled() + { + Logger.Info("OnGunMotorCoilEnabled"); + + _cannonComponent.IsEnabled = true; + } + + private void OnGunMotorCoilDisabled() + { + _cannonComponent.IsEnabled = false; + + Logger.Info("OnGunMotorCoilDisabled"); + } + + public void UpdatePosition(float y = 0) + { + position = (int)(math.abs(y / 0.75) * Length); + + Logger.Info($"UpdatePosition: y={y}, position={position}"); + + GunHomeSwitch.SetSwitch(position >= 0 && position <= 5); + GunMarkSwitch.SetSwitch(position >= 98 && position <= 105); + } + + void IApi.OnDestroy() + { + Logger.Info("Destroying cannon!"); + } + + public void OnChange(bool enabled) + { + throw new NotImplementedException(); + } + } +} + diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs.meta new file mode 100644 index 000000000..70bfb520b --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 22e0181ba659a436ab6bb57d9744d241 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs new file mode 100644 index 000000000..d1cf36d8b --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs @@ -0,0 +1,103 @@ +using System.Collections.Generic; +using UnityEngine; +using VisualPinball.Engine.Game.Engines; +using Logger = NLog.Logger; +using NLog; +using System; + +namespace VisualPinball.Unity +{ + [AddComponentMenu("Visual Pinball/Game Item/Cannon")] + public class CannonComponent : MonoBehaviour, ISwitchDeviceComponent, ICoilDeviceComponent + { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + private enum Direction + { + CounterClockwise = 0, + Clockwise = 1 + } + + public const string GunMotorCoilItem = "gun_motor_coil"; + + public IEnumerable AvailableCoils => new[] { + new GamelogicEngineCoil(GunMotorCoilItem) { + Description = "Gun Motor" + } + }; + + public const string GunMarkSwitchItem = "gun_mark_switch"; + public const string GunHomeSwitchItem = "gun_home_switch"; + + public IEnumerable AvailableSwitches => new[] { + new GamelogicEngineSwitch(GunMarkSwitchItem) { + Description = "Gun Mark" + }, + new GamelogicEngineSwitch(GunHomeSwitchItem) { + Description = "Gun Home" + } + }; + + public SwitchDefault SwitchDefault => SwitchDefault.NormallyOpen; + + IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableCoils; + IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableSwitches; + IEnumerable IWireableComponent.AvailableWireDestinations => AvailableCoils; + IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableCoils; + + public event EventHandler Init; + public bool IsEnabled = false; + private CannonApi _api; + private Direction _direction = Direction.CounterClockwise; + + public void SetAPI(CannonApi api) + { + _api = api; + } + + void Update() + { + if (!IsEnabled) + { + return; + } + + var rotation = transform.rotation; + + if (_direction == Direction.CounterClockwise) + { + rotation.y -= 0.02f; + + if (rotation.y <= -.75) + { + _direction = Direction.Clockwise; + } + } + else if (_direction == Direction.Clockwise) + { + rotation.y += 0.02f; + + if (rotation.y >= 0) + { + _direction = Direction.CounterClockwise; + } + } + + _api.UpdatePosition(rotation.y); + + transform.rotation = rotation; + } + + private void Awake() + { + var player = GetComponentInParent(); + if (player == null) + { + Logger.Error($"Cannot find player for cannon {name}."); + return; + } + + player.RegisterMech(this); + } + } +} diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs.meta b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs.meta new file mode 100644 index 000000000..384ef875c --- /dev/null +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f853fba4c41e47bfb470ad3b384e3c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs index 793bc4552..1c8e1a5da 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableApi.cs @@ -42,6 +42,7 @@ public class TableApi : IApi private readonly Dictionary _triggersByName = new Dictionary(); private readonly Dictionary _troughsByName = new Dictionary(); private readonly Dictionary _primitivesByName = new Dictionary(); + private readonly Dictionary _mechsByName = new Dictionary(); private readonly Dictionary _bumpersByComponent = new Dictionary(); private readonly Dictionary _flippersByComponent = new Dictionary(); @@ -59,6 +60,7 @@ public class TableApi : IApi private readonly Dictionary _triggersByComponent = new Dictionary(); private readonly Dictionary _troughsByComponent = new Dictionary(); private readonly Dictionary _primitivesByComponent = new Dictionary(); + private readonly Dictionary _mechsByComponent = new Dictionary(); #endregion @@ -189,6 +191,14 @@ public TableApi(Player player) public TroughApi Trough(string name) => Get(name); public TroughApi Trough(MonoBehaviour component) => Get(component); + /// + /// Returns a mech by name. + /// + /// Name of the mech + /// Primitive or `null` if no mech with that name exists. + public CannonApi Cannon(string name) => Get(name); + public CannonApi Cannon(MonoBehaviour component) => Get(component); + #endregion #region Registration @@ -228,6 +238,7 @@ private Dictionary GetNameDictionary(Type t) where T : IApi if (t == typeof(TriggerApi)) return _triggersByName as Dictionary; if (t == typeof(TroughApi)) return _troughsByName as Dictionary; if (t == typeof(PrimitiveApi)) return _primitivesByName as Dictionary; + if (t == typeof(CannonApi)) return _mechsByName as Dictionary; throw new ArgumentException($"Unknown API type {t}."); } @@ -249,6 +260,7 @@ private Dictionary GetComponentDictionary(Type t) where T : if (t == typeof(TriggerApi)) return _triggersByComponent as Dictionary; if (t == typeof(TroughApi)) return _troughsByComponent as Dictionary; if (t == typeof(PrimitiveApi)) return _primitivesByComponent as Dictionary; + if (t == typeof(CannonApi)) return _mechsByComponent as Dictionary; throw new ArgumentException($"Unknown API type {t}."); } From fd8b558f5cde0dfaf83f3a6e5cb2c91ae53d6421 Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 14 Oct 2021 00:17:05 +0200 Subject: [PATCH 31/58] gle: Add configurable flipper lag to default GLE. --- .../Game/Engine/DefaultGamelogicEngine.cs | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs index 9993e46b5..0bdcffb72 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs @@ -17,6 +17,7 @@ // ReSharper disable ConditionIsAlwaysTrueOrFalse using System; +using System.Collections; using System.Collections.Generic; using System.Diagnostics; using NLog; @@ -25,6 +26,9 @@ using VisualPinball.Engine.Game.Engines; using Logger = NLog.Logger; +// uncomment to simulate dual-wound flippers +// #define DUAL_WOUND_FLIPPERS + namespace VisualPinball.Unity { /// @@ -36,7 +40,7 @@ namespace VisualPinball.Unity [AddComponentMenu("Visual Pinball/Game Logic Engine/Default Game Logic")] public class DefaultGamelogicEngine : MonoBehaviour, IGamelogicEngine { - public string Name { get; } = "Default Game Engine"; + public string Name => "Default Game Engine"; public event EventHandler OnCoilChanged; public event EventHandler OnLampChanged; @@ -45,8 +49,6 @@ public class DefaultGamelogicEngine : MonoBehaviour, IGamelogicEngine public event EventHandler OnDisplaysAvailable; public event EventHandler OnDisplayFrame; - private const bool DualWoundFlippers = false; - private const int DmdWidth = 128; private const int DmdHeight = 32; private const string DisplayDmd = "dmd0"; @@ -135,8 +137,9 @@ public class DefaultGamelogicEngine : MonoBehaviour, IGamelogicEngine private Player _player; private BallManager _ballManager; - private bool _frameSent = false; + private bool _frameSent; private PlayfieldComponent _playfieldComponent; + private const float FlipperLag = 0.5f; private readonly Dictionary _switchTime = new Dictionary(); @@ -146,7 +149,7 @@ public DefaultGamelogicEngine() { Logger.Info("New Gamelogic engine instantiated."); - if (DualWoundFlippers) { + #if DUAL_WOUND_FLIPPERS _availableCoils.AddRange(new [] { new GamelogicEngineCoil(CoilLeftFlipperHold) { Description = "Left Flipper (Hold)", DeviceHint = "^(LeftFlipper|LFlipper|FlipperLeft|FlipperL)$", DeviceItemHint = FlipperComponent.HoldCoilItem }, new GamelogicEngineCoil(CoilRightFlipperHold) { Description = "Right Flipper (Hold)", DeviceHint = "^(RightFlipper|RFlipper|FlipperRight|FlipperR)$", DeviceItemHint = FlipperComponent.HoldCoilItem }, @@ -156,7 +159,7 @@ public DefaultGamelogicEngine() new GamelogicEngineSwitch(SwLeftFlipperEos) { Description = "Left Flipper (EOS)", DeviceHint = "^(LeftFlipper|LFlipper|FlipperLeft|FlipperL)$"}, new GamelogicEngineSwitch(SwRightFlipperEos) { Description = "Right Flipper (EOS)", DeviceHint = "^(RightFlipper|RFlipper|FlipperRight|FlipperR)$"}, }); - } + #endif } public void OnInit(Player player, TableApi tableApi, BallManager ballManager) @@ -266,7 +269,7 @@ private void Flip(string id, bool isClosed) switch (id) { case SwLeftFlipper: - if (DualWoundFlippers) { + #if DUAL_WOUND_FLIPPERS if (isClosed) { OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilLeftFlipperMain, true)); @@ -277,23 +280,22 @@ private void Flip(string id, bool isClosed) : new CoilEventArgs(CoilLeftFlipperMain, false) ); } - } else { - OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilLeftFlipperMain, isClosed)); - } - + #else + Wait(FlipperLag, () => OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilLeftFlipperMain, isClosed))); + #endif break; case SwLeftFlipperEos: - if (DualWoundFlippers) { + #if DUAL_WOUND_FLIPPERS if (isClosed) { OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilLeftFlipperMain, false)); OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilLeftFlipperHold, true)); } - } + #endif break; case SwRightFlipper: - if (DualWoundFlippers) { + #if DUAL_WOUND_FLIPPERS if (isClosed) { OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilRightFlipperMain, true)); } else { @@ -303,20 +305,27 @@ private void Flip(string id, bool isClosed) : new CoilEventArgs(CoilRightFlipperMain, false) ); } - } else { - OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilRightFlipperMain, isClosed)); - } + #else + Wait(FlipperLag, () => OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilRightFlipperMain, isClosed))); + #endif break; case SwRightFlipperEos: - if (DualWoundFlippers) { + #if DUAL_WOUND_FLIPPERS if (isClosed) { OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilRightFlipperMain, false)); OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilRightFlipperHold, true)); } - } + #endif break; } } + + private void Wait(float seconds, Action action) => StartCoroutine(_wait(seconds, action)); + + private static IEnumerator _wait(float time, Action callback){ + yield return new WaitForSeconds(time); + callback(); + } } } From 5e3db4945b2ebfd06c8fe40d0606b6f9f1bbaeaa Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 14 Oct 2021 22:14:40 +0200 Subject: [PATCH 32/58] player: Fix dynamic wire matching for key switches. --- .../VisualPinball.Unity/Game/WirePlayer.cs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index ab1b16d20..a8ee8de06 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -117,7 +117,6 @@ private WireDestConfig SetupWireDestConfig(WireMapping wireMapping, bool isHardw return wireDest; } if (GetGamelogicEngineIds(wireMapping, out var srcId, out var destId)) { - var queue = new Queue(); _gleSignals[wireDest] = new Queue(); @@ -132,18 +131,27 @@ private WireDestConfig SetupWireDestConfig(WireMapping wireMapping, bool isHardw } _gleDestAssignments[destId].Add(wireDest); + Logger.Warn($"Added dynamic wire \"{wireMapping.Description}\" ({srcId} -> {destId})."); + } else { - Logger.Warn($"GLE IDs not found for dynamic wire {wireMapping.Description} ({srcId} / {destId})."); + Logger.Warn($"GLE IDs not found for dynamic wire {wireMapping.Description} ({srcId} -> {destId})."); } return wireDest; } private bool GetGamelogicEngineIds(WireMapping wireMapping, out string src, out string dest) { - var sourceMapping = _tableComponent.MappingConfig.Switches.FirstOrDefault(switchMapping => - switchMapping.Device == wireMapping.SourceDevice && switchMapping.DeviceItem == wireMapping.SourceDeviceItem); + var sourceMapping = _tableComponent.MappingConfig.Switches.FirstOrDefault(switchMapping => { + return switchMapping.Source switch { + SwitchSource.InputSystem => switchMapping.InputActionMap == wireMapping.SourceInputActionMap && switchMapping.InputAction == wireMapping.SourceInputAction, + SwitchSource.Playfield => switchMapping.Device == wireMapping.SourceDevice && switchMapping.DeviceItem == wireMapping.SourceDeviceItem, + _ => false + }; + }); var destMapping = _tableComponent.MappingConfig.Coils.FirstOrDefault(coilMapping => - coilMapping.Device == wireMapping.DestinationDevice && coilMapping.DeviceItem == wireMapping.DestinationDeviceItem); + coilMapping.Device == wireMapping.DestinationDevice && + coilMapping.DeviceItem == wireMapping.DestinationDeviceItem); + src = sourceMapping?.Id; dest = destMapping?.Id; return sourceMapping != null && destMapping != null; @@ -320,7 +328,7 @@ public class WireDestConfig /// is expected. Should the signal arrive outside the threshold, the /// dynamic wire's enabled status will be toggled. /// - public const int DynamicThresholdMs = 200; + public const int DynamicThresholdMs = 600; public bool IsActive; From 12296d33f6d88d58ee9372c299489ae7625d541f Mon Sep 17 00:00:00 2001 From: freezy Date: Thu, 14 Oct 2021 23:55:45 +0200 Subject: [PATCH 33/58] player: Handle edge case for dynamic wire activation. --- .../Game/Engine/DefaultGamelogicEngine.cs | 23 +++++++++- .../VisualPinball.Unity/Game/WirePlayer.cs | 45 ++++++++++++++----- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs index 0bdcffb72..42dbf4c4f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs @@ -22,8 +22,10 @@ using System.Diagnostics; using NLog; using UnityEngine; +using UnityEngine.InputSystem; using VisualPinball.Engine.Common; using VisualPinball.Engine.Game.Engines; +using Debug = UnityEngine.Debug; using Logger = NLog.Logger; // uncomment to simulate dual-wound flippers @@ -145,6 +147,9 @@ public class DefaultGamelogicEngine : MonoBehaviour, IGamelogicEngine private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + [NonSerialized] + private bool _flippersEnabled = true; + public DefaultGamelogicEngine() { Logger.Info("New Gamelogic engine instantiated."); @@ -190,6 +195,16 @@ private void Update() _frameSent = true; } + + if (Keyboard.current.fKey.wasPressedThisFrame) { + Debug.Log("Flippers disabled"); + _flippersEnabled = false; + } + + if (Keyboard.current.fKey.wasReleasedThisFrame) { + Debug.Log("Flippers enabled"); + _flippersEnabled = true; + } } public void OnDestroy() @@ -281,7 +296,9 @@ private void Flip(string id, bool isClosed) ); } #else - Wait(FlipperLag, () => OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilLeftFlipperMain, isClosed))); + if (_flippersEnabled) { + Wait(FlipperLag, () => OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilLeftFlipperMain, isClosed))); + } #endif break; @@ -306,7 +323,9 @@ private void Flip(string id, bool isClosed) ); } #else - Wait(FlipperLag, () => OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilRightFlipperMain, isClosed))); + if (_flippersEnabled) { + Wait(FlipperLag, () => OnCoilChanged?.Invoke(this, new CoilEventArgs(CoilRightFlipperMain, isClosed))); + } #endif break; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index a8ee8de06..f09cddc8e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -237,30 +237,47 @@ private void HandleKeyInput(object obj, InputActionChange change) } } + /// + /// Gets called by the GLE for coils linked to a dynamic wire. + /// + /// GLE ID of the coil + /// Whether to enable or disable the coil. public void HandleCoilEvent(string id, bool isEnabled) { foreach (var wireConfig in _gleDestAssignments[id]) { if (!_wireDevices.ContainsKey(wireConfig.Device)) { continue; } + var now = Time.realtimeSinceStartup; var device = _wireDevices[wireConfig.Device]; var wire = device.Wire(wireConfig.DeviceItem); if (wire != null) { - var lagMs = GetLag(wireConfig); - if (lagMs > 0 && lagMs < WireDestConfig.DynamicThresholdMs) { + var lagSec = GetLag(wireConfig); + if (lagSec > 0 && lagSec < WireDestConfig.DynamicThresholdSec) { + + // switch event was less than threshold ago, so let's check if the wire is active if (!wireConfig.IsActive) { - Logger.Info($"Enabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagMs}ms)."); + // it wasn't active. so let's activate it + Logger.Info($"Enabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagSec}ms)."); + wireConfig.IsActive = true; + wireConfig.ActiveSince = now; + + // since it wasn't active before, we need to emit, because the wire didn't catch it. + wire.OnChange(isEnabled); + } + // if it was already active, do nothing, since it was emitted by the wire already, + // but that's only the case if it was *after* it became active. otherwise, emit. + if (now - lagSec < wireConfig.ActiveSince) { + wire.OnChange(isEnabled); } - wireConfig.IsActive = true; } else { if (wireConfig.IsActive) { - Logger.Info($"Disabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagMs}ms)."); + Logger.Info($"Disabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagSec}ms)."); } wireConfig.IsActive = false; } - wire.OnChange(isEnabled); } else { Logger.Warn($"Unknown dynamic wire \"{wireConfig.DeviceItem}\" in wire device \"{wireConfig.Device}\"."); @@ -272,15 +289,18 @@ private float GetLag(WireDestConfig wireConfig) { var timeNow = Time.realtimeSinceStartup; var queue = _gleSignals[wireConfig]; - var lagMs = -1; + var lagSec = -1f; + var numDequeue = 0; while (queue.Count > 0) { + numDequeue++; var timeQueue = queue.Dequeue(); - lagMs = (int)math.round((timeNow - timeQueue) * 1000); - if (lagMs < WireDestConfig.DynamicThresholdMs) { - return lagMs; + lagSec = timeNow - timeQueue; + if (lagSec < WireDestConfig.DynamicThresholdSec) { + return lagSec; } + lagSec = -1f - numDequeue; } - return lagMs; + return lagSec; } public void OnDestroy() @@ -328,9 +348,10 @@ public class WireDestConfig /// is expected. Should the signal arrive outside the threshold, the /// dynamic wire's enabled status will be toggled. ///
- public const int DynamicThresholdMs = 600; + public const float DynamicThresholdSec = 600 / 1000f; public bool IsActive; + public float ActiveSince; public WireDestConfig(WireMapping wireMapping) { From 830495f89f250f81b2bc51a8d882d48a4fc72e63 Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 15 Oct 2021 00:30:08 +0200 Subject: [PATCH 34/58] player: Detect coil deactivation at GLE. --- .../VisualPinball.Unity/Game/Player.cs | 9 ++- .../VisualPinball.Unity/Game/WirePlayer.cs | 55 +++++++++++++++---- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index 5a0496a79..975b8f964 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -43,6 +43,8 @@ public class Player : MonoBehaviour [NonSerialized] public BallManager BallManager; + public event EventHandler OnUpdate; + [HideInInspector] [SerializeField] public string debugUiId; [HideInInspector] [SerializeField] public string physicsEngineId; @@ -126,7 +128,7 @@ private void Awake() _lampPlayer.Awake(_tableComponent, GamelogicEngine); _coilPlayer.Awake(_tableComponent, GamelogicEngine, _lampPlayer, _wirePlayer); _switchPlayer.Awake(_tableComponent, GamelogicEngine, _inputManager); - _wirePlayer.Awake(_tableComponent, _inputManager, _switchPlayer); + _wirePlayer.Awake(_tableComponent, _inputManager, _switchPlayer, this); _displayPlayer.Awake(GamelogicEngine); } @@ -157,6 +159,11 @@ private void Start() } } + private void Update() + { + OnUpdate?.Invoke(this, EventArgs.Empty); + } + private void OnDestroy() { foreach (var i in _apis) { diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index f09cddc8e..a632e288b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -14,13 +14,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using System; using System.Collections.Generic; using System.Linq; using NLog; -using Unity.Mathematics; using UnityEngine; using UnityEngine.InputSystem; -using UnityEngine.Networking.Types; using Logger = NLog.Logger; namespace VisualPinball.Unity @@ -36,6 +35,7 @@ public class WirePlayer private readonly Dictionary> _gleSrcAssignments = new Dictionary>(); private readonly Dictionary> _gleSignals = new Dictionary>(); + private Player _player; private TableComponent _tableComponent; private InputManager _inputManager; private SwitchPlayer _switchPlayer; @@ -46,18 +46,22 @@ public class WirePlayer internal IApiWireDeviceDest WireDevice(IWireableComponent c) => _wireDevices.ContainsKey(c) ? _wireDevices[c] : null; internal void RegisterWireDevice(IWireableComponent component, IApiWireDeviceDest wireDeviceApi) => _wireDevices[component] = wireDeviceApi; - public void Awake(TableComponent tableComponent, InputManager inputManager, SwitchPlayer switchPlayer) + #region Lifecycle + + public void Awake(TableComponent tableComponent, InputManager inputManager, SwitchPlayer switchPlayer, Player player) { _tableComponent = tableComponent; _inputManager = inputManager; _switchPlayer = switchPlayer; + _player = player; } public void OnStart() { - var config = _tableComponent.MappingConfig; + _player.OnUpdate += Update; _keyWireAssignments.Clear(); _gleDestAssignments.Clear(); + var config = _tableComponent.MappingConfig; foreach (var wireData in config.Wires) { AddWire(wireData); } @@ -65,6 +69,18 @@ public void OnStart() _inputManager.Enable(HandleKeyInput); } + public void OnDestroy() + { + if (_keyWireAssignments.Count > 0) { + _inputManager.Disable(HandleKeyInput); + } + _player.OnUpdate -= Update; + } + + #endregion + + #region Setup + internal void AddWire(WireMapping wireMapping, bool isHardwareRule = false) { switch (wireMapping.Source) { @@ -202,6 +218,10 @@ internal void RemoveWire(WireMapping wireMapping) } } + #endregion + + #region Runtime + private void HandleKeyInput(object obj, InputActionChange change) { switch (change) { @@ -278,13 +298,31 @@ public void HandleCoilEvent(string id, bool isEnabled) wireConfig.IsActive = false; } - } else { Logger.Warn($"Unknown dynamic wire \"{wireConfig.DeviceItem}\" in wire device \"{wireConfig.Device}\"."); } } } + private void Update(object sender, EventArgs e) + { + foreach (var wireConfig in _gleSignals.Keys) { + if (!wireConfig.IsActive) { + continue; + } + var queue = _gleSignals[wireConfig]; + if (queue.Count == 0) { + continue; + } + var lagSec = Time.realtimeSinceStartup - queue.Peek(); + if (lagSec > WireDestConfig.DynamicThresholdSec) { + Logger.Info($"Disabling dynamic wire to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} due to inactivity."); + _wireDevices[wireConfig.Device].Wire(wireConfig.DeviceItem).OnChange(false); // todo save status in queue and emit other status + wireConfig.IsActive = false; + } + } + } + private float GetLag(WireDestConfig wireConfig) { var timeNow = Time.realtimeSinceStartup; @@ -303,12 +341,7 @@ private float GetLag(WireDestConfig wireConfig) return lagSec; } - public void OnDestroy() - { - if (_keyWireAssignments.Count > 0) { - _inputManager.Disable(HandleKeyInput); - } - } + #endregion } public class WireDestConfig From e25f5938482ae0d44f93aeb776692fb765b52688 Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 15 Oct 2021 23:13:13 +0200 Subject: [PATCH 35/58] player: Handle coils signals without switch. --- .../VisualPinball.Unity/Game/WirePlayer.cs | 95 ++++++++++++------- 1 file changed, 60 insertions(+), 35 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index a632e288b..e15f17c62 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -58,7 +58,7 @@ public void Awake(TableComponent tableComponent, InputManager inputManager, Swit public void OnStart() { - _player.OnUpdate += Update; + _player.OnUpdate += OnUpdate; _keyWireAssignments.Clear(); _gleDestAssignments.Clear(); var config = _tableComponent.MappingConfig; @@ -69,12 +69,31 @@ public void OnStart() _inputManager.Enable(HandleKeyInput); } + private void OnUpdate(object sender, EventArgs e) + { + foreach (var wireConfig in _gleSignals.Keys) { + if (!wireConfig.IsActive) { + continue; + } + var queue = _gleSignals[wireConfig]; + if (queue.Count == 0) { + continue; + } + var lagSec = Time.realtimeSinceStartup - queue.Peek(); + if (lagSec > WireDestConfig.DynamicThresholdSec) { + Logger.Info($"Disabling dynamic wire to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} due to inactivity."); + _wireDevices[wireConfig.Device].Wire(wireConfig.DeviceItem).OnChange(false); // todo save status in queue and emit other status + wireConfig.IsActive = false; + } + } + } + public void OnDestroy() { if (_keyWireAssignments.Count > 0) { _inputManager.Disable(HandleKeyInput); } - _player.OnUpdate -= Update; + _player.OnUpdate -= OnUpdate; } #endregion @@ -273,7 +292,7 @@ public void HandleCoilEvent(string id, bool isEnabled) var wire = device.Wire(wireConfig.DeviceItem); if (wire != null) { var lagSec = GetLag(wireConfig); - if (lagSec > 0 && lagSec < WireDestConfig.DynamicThresholdSec) { + if (lagSec > 0) { // switch event was less than threshold ago, so let's check if the wire is active if (!wireConfig.IsActive) { @@ -292,10 +311,9 @@ public void HandleCoilEvent(string id, bool isEnabled) } } else { - if (wireConfig.IsActive) { - Logger.Info($"Disabling dynamic wire from {id} to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} ({lagSec}ms)."); - } - wireConfig.IsActive = false; + // so we got a coil with no or too old switch in the queue. we assume this comes from the GLE + // without a corresponding switch event. + wire.OnChange(isEnabled); } } else { @@ -304,25 +322,6 @@ public void HandleCoilEvent(string id, bool isEnabled) } } - private void Update(object sender, EventArgs e) - { - foreach (var wireConfig in _gleSignals.Keys) { - if (!wireConfig.IsActive) { - continue; - } - var queue = _gleSignals[wireConfig]; - if (queue.Count == 0) { - continue; - } - var lagSec = Time.realtimeSinceStartup - queue.Peek(); - if (lagSec > WireDestConfig.DynamicThresholdSec) { - Logger.Info($"Disabling dynamic wire to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} due to inactivity."); - _wireDevices[wireConfig.Device].Wire(wireConfig.DeviceItem).OnChange(false); // todo save status in queue and emit other status - wireConfig.IsActive = false; - } - } - } - private float GetLag(WireDestConfig wireConfig) { var timeNow = Time.realtimeSinceStartup; @@ -346,11 +345,35 @@ private float GetLag(WireDestConfig wireConfig) public class WireDestConfig { + /// + /// Threshold in milliseconds within a confirming signal from the GLE + /// is expected. Should the signal arrive outside the threshold, the + /// dynamic wire's enabled status will be toggled. + /// + public const float DynamicThresholdSec = 600 / 1000f; + + /// + /// Reference to the destination device. + /// public readonly IWireableComponent Device; + + /// + /// The item within the device. + /// public readonly string DeviceItem; - public readonly int PulseDelay; + + /// + /// If true, this is a pulse source, in which case there is only the + /// enable event and the disable event is automatically triggered + /// after milliseconds. + /// public bool IsPulseSource; + /// + /// If it's a pulse source, the pulse delay in milliseconds. + /// + public readonly int PulseDelay; + /// /// Wires that are added during gameplay (MPF does this). We tag /// it as such here so we can filter when removing the wire. @@ -363,7 +386,7 @@ public class WireDestConfig /// /// If a dynamic wire is enabled, it stays active until the output /// signal isn't received from the GLE within a certain threshold - /// (). If it's disabled, no signal + /// (). If it's disabled, no signal /// is sent until we get it from the GLE. /// /// @@ -374,17 +397,19 @@ public class WireDestConfig /// trigger the flipper coil and only stop doing so if no coil signal /// is received from the GLE. /// - public bool IsDynamic; + public readonly bool IsDynamic; /// - /// Threshold in milliseconds within a confirming signal from the GLE - /// is expected. Should the signal arrive outside the threshold, the - /// dynamic wire's enabled status will be toggled. + /// Status flag for dynamic wires. If true, the wire will emit events + /// to the destination, otherwise it won't. /// - public const float DynamicThresholdSec = 600 / 1000f; + internal bool IsActive; - public bool IsActive; - public float ActiveSince; + /// + /// Status flag for dynamic wires. Timestamp () + /// when the wire became active. + /// + internal float ActiveSince; public WireDestConfig(WireMapping wireMapping) { From 8aafc730d780f62cd1f6c2f6dcc4ab61d2fd3f6c Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 15 Oct 2021 23:21:33 +0200 Subject: [PATCH 36/58] player: Scope dynamic wires by switch status. --- .../VisualPinball.Unity/Game/WirePlayer.cs | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index e15f17c62..e8cec9f9b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -33,7 +33,7 @@ public class WirePlayer private readonly Dictionary> _keyWireAssignments = new Dictionary>(); private readonly Dictionary> _gleDestAssignments = new Dictionary>(); private readonly Dictionary> _gleSrcAssignments = new Dictionary>(); - private readonly Dictionary> _gleSignals = new Dictionary>(); + private readonly Dictionary>> _gleSignals = new Dictionary>>(); private Player _player; private TableComponent _tableComponent; @@ -75,15 +75,17 @@ private void OnUpdate(object sender, EventArgs e) if (!wireConfig.IsActive) { continue; } - var queue = _gleSignals[wireConfig]; - if (queue.Count == 0) { - continue; - } - var lagSec = Time.realtimeSinceStartup - queue.Peek(); - if (lagSec > WireDestConfig.DynamicThresholdSec) { - Logger.Info($"Disabling dynamic wire to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} due to inactivity."); - _wireDevices[wireConfig.Device].Wire(wireConfig.DeviceItem).OnChange(false); // todo save status in queue and emit other status - wireConfig.IsActive = false; + foreach (var isEnabled in _gleSignals[wireConfig].Keys) { + var queue = _gleSignals[wireConfig][isEnabled]; + if (queue.Count == 0) { + continue; + } + var lagSec = Time.realtimeSinceStartup - queue.Peek(); + if (lagSec > WireDestConfig.DynamicThresholdSec) { + Logger.Info($"Disabling dynamic wire to {wireConfig.DeviceItem} @ {wireConfig.Device.gameObject.name} due to inactivity."); + _wireDevices[wireConfig.Device].Wire(wireConfig.DeviceItem).OnChange(!isEnabled); + wireConfig.IsActive = false; + } } } } @@ -153,7 +155,10 @@ private WireDestConfig SetupWireDestConfig(WireMapping wireMapping, bool isHardw } if (GetGamelogicEngineIds(wireMapping, out var srcId, out var destId)) { - _gleSignals[wireDest] = new Queue(); + _gleSignals[wireDest] = new Dictionary> { + [true] = new Queue(), + [false] = new Queue() + }; // reference the queue both by src and dest if (!_gleSrcAssignments.ContainsKey(srcId)) { @@ -261,7 +266,7 @@ private void HandleKeyInput(object obj, InputActionChange change) wire.OnChange(isEnabled); } else { - _gleSignals[wireConfig].Enqueue(Time.realtimeSinceStartup); + _gleSignals[wireConfig][isEnabled].Enqueue(Time.realtimeSinceStartup); if (wireConfig.IsActive) { // the dynamic wire is active, so trigger directly. wire.OnChange(isEnabled); @@ -291,7 +296,7 @@ public void HandleCoilEvent(string id, bool isEnabled) var device = _wireDevices[wireConfig.Device]; var wire = device.Wire(wireConfig.DeviceItem); if (wire != null) { - var lagSec = GetLag(wireConfig); + var lagSec = GetLag(wireConfig, isEnabled); if (lagSec > 0) { // switch event was less than threshold ago, so let's check if the wire is active @@ -322,10 +327,10 @@ public void HandleCoilEvent(string id, bool isEnabled) } } - private float GetLag(WireDestConfig wireConfig) + private float GetLag(WireDestConfig wireConfig, bool isEnabled) { var timeNow = Time.realtimeSinceStartup; - var queue = _gleSignals[wireConfig]; + var queue = _gleSignals[wireConfig][isEnabled]; var lagSec = -1f; var numDequeue = 0; while (queue.Count > 0) { From 7925cb0b40f91faccabf1d31470ab5d0b3c0d794 Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 00:22:01 +0200 Subject: [PATCH 37/58] player: Add dynamic wire support to switches. --- .../VisualPinball.Unity/Game/Player.cs | 1 + .../VisualPinball.Unity/Game/SwitchHandler.cs | 18 +-------- .../VisualPinball.Unity/Game/WirePlayer.cs | 37 ++++++++++++++++++- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index 975b8f964..d316905cb 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -96,6 +96,7 @@ public class Player : MonoBehaviour internal IApiSwitch Switch(ISwitchDeviceComponent component, string switchItem) => component != null ? _switchPlayer.Switch(component, switchItem) : null; internal IApiCoil Coil(ICoilDeviceComponent component, string coilItem) => component != null ? _coilPlayer.Coil(component, coilItem) : null; internal IApiWireDeviceDest WireDevice(IWireableComponent c) => _wirePlayer.WireDevice(c); + internal void HandleWireSwitchChange(WireDestConfig wireConfig, bool isEnabled) => _wirePlayer.HandleSwitchChange(wireConfig, isEnabled); public Dictionary SwitchStatusesClosed => _switchPlayer.SwitchStatusesClosed; public Dictionary CoilStatuses => _coilPlayer.CoilStatuses; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs index ca3ede906..055d7f05b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/SwitchHandler.cs @@ -123,23 +123,7 @@ internal void OnSwitch(bool enabled) // handle switch -> wire if (_wires != null) { foreach (var wireConfig in _wires) { - var device = _player.WireDevice(wireConfig.Device); - if (device != null) { - var dest = device.Wire(wireConfig.DeviceItem); - if (dest != null) { - - // toggle switch - dest.OnChange(enabled); - - // if it's pulse, schedule to re-open - if (enabled && wireConfig.IsPulseSource) { - SimulationSystemGroup.ScheduleAction(wireConfig.PulseDelay, () => dest.OnChange(false)); - } - } - - } else { - Logger.Warn($"Cannot find wire device \"{wireConfig.Device}\"."); - } + _player.HandleWireSwitchChange(wireConfig, enabled); } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index e8cec9f9b..967eb316b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -18,6 +18,7 @@ using System.Collections.Generic; using System.Linq; using NLog; +using Unity.Entities; using UnityEngine; using UnityEngine.InputSystem; using Logger = NLog.Logger; @@ -40,7 +41,7 @@ public class WirePlayer private InputManager _inputManager; private SwitchPlayer _switchPlayer; - + private static VisualPinballSimulationSystemGroup SimulationSystemGroup => World.DefaultGameObjectInjectionWorld.GetOrCreateSystem(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); internal IApiWireDeviceDest WireDevice(IWireableComponent c) => _wireDevices.ContainsKey(c) ? _wireDevices[c] : null; @@ -281,6 +282,40 @@ private void HandleKeyInput(object obj, InputActionChange change) } } + public void HandleSwitchChange(WireDestConfig wireConfig, bool isEnabled) + { + var device = _player.WireDevice(wireConfig.Device); + if (device != null) { + var wire = device.Wire(wireConfig.DeviceItem); + if (wire != null) { + + if (!wireConfig.IsDynamic) { + wire.OnChange(isEnabled); + + // if it's pulse, schedule to re-open + if (isEnabled && wireConfig.IsPulseSource) { + SimulationSystemGroup.ScheduleAction(wireConfig.PulseDelay, () => wire.OnChange(false)); + } + + } else { + _gleSignals[wireConfig][isEnabled].Enqueue(Time.realtimeSinceStartup); + if (wireConfig.IsActive) { + // the dynamic wire is active, so trigger directly. + wire.OnChange(isEnabled); + + // if it's pulse, schedule to re-open + if (isEnabled && wireConfig.IsPulseSource) { + SimulationSystemGroup.ScheduleAction(wireConfig.PulseDelay, () => wire.OnChange(false)); + } + } + } + } + + } else { + Logger.Warn($"Cannot find wire device \"{wireConfig.Device}\"."); + } + } + /// /// Gets called by the GLE for coils linked to a dynamic wire. /// From 38d6a4bde8745cccae7d160bf657e4947c1781ec Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 01:10:10 +0200 Subject: [PATCH 38/58] doc: Add fast flip doc and update CHANGELOG. --- CHANGELOG.md | 5 +++- .../creators-guide/editor/wire-manager.md | 24 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5740f02cd..1ac4b72b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,10 @@ Built with Unity 2020.3. ### Added +- Support for dynamic wires, also known as *Fast Flip* ([#329](https://github.com/freezy/VisualPinball.Engine/pull/329), [Documentation](https://docs.visualpinball.org/creators-guide/editor/wire-manager.html#dynamic)). +- Component for light groups, allowing easy grouping of GI lamps. ([#330](https://github.com/freezy/VisualPinball.Engine/pull/330)). - Slingshot component ([#329](https://github.com/freezy/VisualPinball.Engine/pull/329), [Documentation](https://docs.visualpinball.org/creators-guide/manual/mechanisms/slingshots.html)). -- Create insert meshes ([#320](https://github.com/freezy/VisualPinball.Engine/pull/320)) +- Create insert meshes ([#320](https://github.com/freezy/VisualPinball.Engine/pull/320)). - Full support for custom playfield meshes. - 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)). @@ -37,6 +39,7 @@ Built with Unity 2020.3. - 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 +- Lighting setup. It's now usable ([#330](https://github.com/freezy/VisualPinball.Engine/pull/330)). - Ball passing through collider plane and disappearing. - Alpha channel of color values is now correctly written ([#291](https://github.com/freezy/VisualPinball.Engine/pull/291)). - Layer names are correctly computed when importing a 10.6 file ([#291](https://github.com/freezy/VisualPinball.Engine/pull/291)). diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md index b77e5c893..4682cc308 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md @@ -5,7 +5,7 @@ description: VPE's wire manager lets you directly hook up any switch to any coil Using the [Switch Manager](switch-manager.md), you can wire playfield and cabinet switches to the [Gamelogic Engine](../manual/gamelogic-engine.md). Similarly, the [Coil Manager](coil-manager.md) and [Lamp Manager](#) let you connect playfield elements to the outputs of the Gamelogic Engine. -The **Wire Manager** allows you to *bypass* the gamelogic engine and connect switches directly to coils and lamps. This can be useful for debugging, but also for game logic that might not be covered by the gamelogic engine. +The **Wire Manager** allows you to *bypass* the gamelogic engine and connect switches directly to coils and lamps. Using the *dynamic* wires, this can be used to eliminate the flipper lag often introduced by emulated ROMs. But it also can be useful for debugging, or for game logic that might not be covered by the gamelogic engine. You can open the wire manager under *Visual Pinball -> Wire Manager*. @@ -51,6 +51,28 @@ Under **Destination** you can select the type of the element that will *receive* The **Destination Element** column is where you select which specific element in the destination column should receive switch changes. If *Device* was selected in the previous column, both the actual device and the element within the device have to be selected. +### Dynamic + +By checking the **Dynamic** box, the wire dynamically enables and disables depending on the gamelogic engine's output. Used with flippers, this feature is also known as *Fast Flip* and can be used to reduce the lag introduced by an emulated gamelogic engine like PinMAME. + +If it's enabled and a game is started, VPE compares the switches and coils linked to the gamelogic engine and tries to find the switch and coil IDs that correspond to the wire. If found, VPE monitors the coil signals of the gamelogic engine. If the time between the switch and the coil response is below a threshold, the wire is enabled and future coil signals from the gamelogic engine are discarded. In the same way, if the wire is active and no coil signal is received within the threshold, the wire is disabled again. + +> [!note] +> In order to match the switch and coil signals from the gamelogic engine, the switch and the coil need to be linked to the gamelogic engine using the *Switch Manager* and *Coil Manager* respectively. For example, it's not sufficient to just create a flipper button -> flipper coil wire and not link the flipper button to the flipper switch and the flipper coil to the flipper. + +There are a few edge cases that are handled as well. For example, if the wire is active and the gamelogic engine enables the coil without a switch signal (like the Phantom Flip in Monster Bash), the coil event is not discarded (VPE internally keeps a queue of switch events and if the queue is empty, coil events are still processed). + +However, by design, there are two caveats: + +1. When the wire is inactive, the first event always has the gamelogic engine lag, since VPE will only activate the wire when it's sure a coil event is emitted. +2. When the gamelogic engine stops emitting coil events, VPE continues emitting the coil event one more time until it discovers the absence of the coil event and thus sends the negative signal after the threshold to "undo" its mistake. + + +> [!note] +> [MPF](../../plugins/mpf/index.md) has a similar feature called [Hardware Rules](https://docs.missionpinball.org/en/dev/hardware/hw_rules.html#the-solution-hardware-rules). This is the preferred way, because the gamelogic engine explicitly notifies VPE about which wires to add and remove during gameplay. +> +> However, other gamelogic engines like PinMAME don't have this feature, that's why VPE comes with the *dynamic wire* feature that guesses when wire is active and when not. + ### Pulse Delay Internally, VPE connects switches to events. Some switchable game items only emit the *switch closed* event. Such items are spinners and targets. These are elements where the re-opening of the switch does not have any semantic value. From 37c2d55e7895e1dce64c76c7aa3cb945965a6c9b Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 12:24:10 +0200 Subject: [PATCH 39/58] editor: Measure and display lag in wire manager. --- .../Managers/Wire/WireListData.cs | 25 ++++---- .../Managers/Wire/WireListViewItemRenderer.cs | 57 ++++++++++++++++--- .../Managers/Wire/WireManager.cs | 6 +- .../VisualPinball.Unity/Game/Player.cs | 4 +- .../VisualPinball.Unity/Game/WirePlayer.cs | 52 ++++++++++++++++- .../Mappings/WireMapping.cs | 10 +++- .../VPT/Table/TableComponent.cs | 16 +++--- 7 files changed, 132 insertions(+), 38 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs index 2e8c6b1f6..ca925036b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListData.cs @@ -20,6 +20,8 @@ namespace VisualPinball.Unity.Editor { public class WireListData : IManagerListData, IDeviceListData { + public string Id; + [ManagerListColumn(Order = 0, HeaderName = "Description", Width = 150)] public string Name { get; private set; } @@ -27,10 +29,15 @@ public class WireListData : IManagerListData, IDeviceListData Name; set => Name = value; } - public string SourceInputActionMap; - public string SourceInputAction; - public SwitchConstant SourceConstant; - public ISwitchDeviceComponent SourceDevice; - public string SourceDeviceItem; - - public IWireableComponent DestinationDevice; - public string DestinationDeviceItem; - public readonly WireMapping WireMapping; public IDeviceComponent DeviceComponent => DestinationDevice; public string DeviceItem { get => DestinationDeviceItem; set => DestinationDeviceItem = value; } public int InternalId { get; set; } - public WireListData(WireMapping wireMapping) { + public WireListData(WireMapping wireMapping) + { + Id = wireMapping.Id; Description = wireMapping.Description; - Source = wireMapping.Source; SourceInputActionMap = wireMapping.SourceInputActionMap; SourceInputAction = wireMapping.SourceInputAction; diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs index 1e25d60ee..ba9b503d3 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Unity.Mathematics; using UnityEditor; using UnityEngine; using VisualPinball.Engine.Game.Engines; @@ -27,7 +28,7 @@ public class WireListViewItemRenderer: ListViewItemRenderer GleItems => new List(); protected override IGamelogicEngineDeviceItem InstantiateGleItem(string id) => null; - protected override Texture2D StatusIcon(bool status) => null; + protected override Texture2D StatusIcon(bool status) => Icons.Plug(IconSize.Small, status ? IconColor.Orange : IconColor.Gray); private struct InputSystemEntry { @@ -58,12 +59,15 @@ public WireListViewItemRenderer(TableComponent tableComponent, InputManager inpu _destDevicePicker = new ObjectReferencePicker("Wire Destination", tableComponent, false); } - public void Render(WireListData data, Rect cellRect, int column, Action updateAction) + public void Render(TableComponent tableComponent, WireListData data, Rect cellRect, int column, Action updateAction) { - switch ((WireListColumn)column) - { + EditorGUI.BeginDisabledGroup(Application.isPlaying); + var switchStatuses = Application.isPlaying + ? tableComponent.gameObject.GetComponent()?.WireStatuses + : null; + switch ((WireListColumn)column) { case WireListColumn.Description: - RenderDescription(data, cellRect, updateAction); + RenderDescription(switchStatuses, data, cellRect, updateAction); break; case WireListColumn.Source: RenderSource(data, cellRect, updateAction); @@ -75,12 +79,32 @@ public void Render(WireListData data, Rect cellRect, int column, Action statuses, WireListData listData, Rect cellRect, Action updateAction) + { + if (Application.isPlaying && statuses != null) { + var iconRect = cellRect; + iconRect.width = 20; + if (statuses.ContainsKey(listData.Id)) { + var status = statuses[listData.Id]; + var icon = StatusIcon(status.Item1); + var guiColor = GUI.color; + GUI.color = Color.clear; + EditorGUI.DrawTextureTransparent(iconRect, icon, ScaleMode.ScaleToFit); + GUI.color = guiColor; + } + cellRect.x += 25; + cellRect.width -= 25; + } + base.RenderDescription(listData, cellRect, updateAction); } private void RenderSource(WireListData wireListData, Rect cellRect, Action updateAction) @@ -236,8 +260,21 @@ protected override void RenderDeviceElement(WireListData listData, Rect cellRect } - private void RenderIsDynamic(WireListData wireListData, Rect cellRect, Action updateAction) + private void RenderIsDynamic(Dictionary statuses, WireListData wireListData, Rect cellRect, Action updateAction) { + if (Application.isPlaying && statuses != null) { + var status = statuses[wireListData.Id]; + var lag = status.Item2; + var displayLag = math.round(lag * 10000f) / 10f; + if (lag < 0) { + EditorGUI.LabelField(cellRect, "Measuring..."); + return; + } + if (lag > 0) { + EditorGUI.LabelField(cellRect, $"{displayLag} ms"); + return; + } + } EditorGUI.BeginChangeCheck(); var isDynamic = EditorGUI.Toggle(cellRect, wireListData.IsDynamic); if (EditorGUI.EndChangeCheck()) { @@ -250,8 +287,7 @@ private void RenderPulseDelay(WireListData wireListData, Rect cellRect, Action s.Id == wireListData.SourceDeviceItem); - if (switchable.IsPulseSwitch) - { + if (switchable.IsPulseSwitch) { var labelRect = cellRect; labelRect.x += labelRect.width - 20; labelRect.width = 20; @@ -269,6 +305,9 @@ private void RenderPulseDelay(WireListData wireListData, Rect cellRect, Action { + _listViewItemRenderer.Render(TableComponent, data, cellRect, column, wireListData => { RecordUndo(DataTypeName + " Data Change"); wireListData.Update(); @@ -124,7 +124,7 @@ protected override void AddNewData(string undoName, string newName) { RecordUndo(undoName); - TableComponent.MappingConfig.AddWire(new WireMapping()); + TableComponent.MappingConfig.AddWire(new WireMapping().WithId()); } protected override void RemoveData(string undoName, WireListData data) @@ -138,7 +138,7 @@ protected override void CloneData(string undoName, string newName, WireListData { RecordUndo(undoName); - TableComponent.MappingConfig.AddWire(new WireMapping()); + TableComponent.MappingConfig.AddWire(new WireMapping().WithId()); } #endregion diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs index d316905cb..ecdf5dd3a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Player.cs @@ -101,6 +101,7 @@ public class Player : MonoBehaviour public Dictionary SwitchStatusesClosed => _switchPlayer.SwitchStatusesClosed; public Dictionary CoilStatuses => _coilPlayer.CoilStatuses; public Dictionary LampStatuses => _lampPlayer.LampStatuses; + public Dictionary WireStatuses => _wirePlayer.WireStatuses; public float3 Gravity => _playfieldComponent.Gravity; #endregion @@ -440,7 +441,7 @@ public void AddHardwareRule(string switchId, string coilId) return; } - var wireMapping = new WireMapping($"Hardware rule: {switchId} -> {coilId}", switchMapping, coilMapping); + var wireMapping = new WireMapping($"Hardware rule: {switchId} -> {coilId}", switchMapping, coilMapping).WithId(); _wirePlayer.AddWire(wireMapping); // this is for showing it in the editor during runtime only @@ -460,6 +461,7 @@ public void RemoveHardwareRule(string switchId, string coilId) return; } + // todo this can be done more elegantly with Ids now. var wireMapping = new WireMapping($"Hardware rule: {switchId} -> {coilId}", switchMapping, coilMapping); _wirePlayer.RemoveWire(wireMapping); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs index 967eb316b..4f1135c8f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/WirePlayer.cs @@ -43,6 +43,7 @@ public class WirePlayer private static VisualPinballSimulationSystemGroup SimulationSystemGroup => World.DefaultGameObjectInjectionWorld.GetOrCreateSystem(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + internal Dictionary WireStatuses { get; } = new Dictionary(); internal IApiWireDeviceDest WireDevice(IWireableComponent c) => _wireDevices.ContainsKey(c) ? _wireDevices[c] : null; internal void RegisterWireDevice(IWireableComponent component, IApiWireDeviceDest wireDeviceApi) => _wireDevices[component] = wireDeviceApi; @@ -105,6 +106,7 @@ public void OnDestroy() internal void AddWire(WireMapping wireMapping, bool isHardwareRule = false) { + WireStatuses[wireMapping.Id] = (false, 0); switch (wireMapping.Source) { case SwitchSource.Playfield: { @@ -140,6 +142,7 @@ internal void AddWire(WireMapping wireMapping, bool isHardwareRule = false) } case SwitchSource.Constant: + // todo break; default: @@ -265,14 +268,22 @@ private void HandleKeyInput(object obj, InputActionChange change) var isEnabled = change == InputActionChange.ActionStarted; if (!wireConfig.IsDynamic) { wire.OnChange(isEnabled); + WireStatuses[wireConfig.Id] = (isEnabled, 0); } else { _gleSignals[wireConfig][isEnabled].Enqueue(Time.realtimeSinceStartup); if (wireConfig.IsActive) { // the dynamic wire is active, so trigger directly. wire.OnChange(isEnabled); + WireStatuses[wireConfig.Id] = (isEnabled, -2); + + } else { + WireStatuses[wireConfig.Id] = (WireStatuses[wireConfig.Id].Item1, -1); } } + #if UNITY_EDITOR + UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); + #endif } else { Logger.Warn($"Unknown wire \"{wireConfig.DeviceItem}\" in wire device \"{wireConfig.Device}\"."); } @@ -291,10 +302,17 @@ public void HandleSwitchChange(WireDestConfig wireConfig, bool isEnabled) if (!wireConfig.IsDynamic) { wire.OnChange(isEnabled); + WireStatuses[wireConfig.Id] = (isEnabled, 0); // if it's pulse, schedule to re-open if (isEnabled && wireConfig.IsPulseSource) { - SimulationSystemGroup.ScheduleAction(wireConfig.PulseDelay, () => wire.OnChange(false)); + SimulationSystemGroup.ScheduleAction(wireConfig.PulseDelay, () => { + wire.OnChange(false); + WireStatuses[wireConfig.Id] = (false, 0); + #if UNITY_EDITOR + UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); + #endif + }); } } else { @@ -302,13 +320,26 @@ public void HandleSwitchChange(WireDestConfig wireConfig, bool isEnabled) if (wireConfig.IsActive) { // the dynamic wire is active, so trigger directly. wire.OnChange(isEnabled); + WireStatuses[wireConfig.Id] = (isEnabled, -2); // if it's pulse, schedule to re-open if (isEnabled && wireConfig.IsPulseSource) { - SimulationSystemGroup.ScheduleAction(wireConfig.PulseDelay, () => wire.OnChange(false)); + SimulationSystemGroup.ScheduleAction(wireConfig.PulseDelay, () => { + wire.OnChange(false); + WireStatuses[wireConfig.Id] = (false, -2); + #if UNITY_EDITOR + UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); + #endif + }); } + + } else { + WireStatuses[wireConfig.Id] = (WireStatuses[wireConfig.Id].Item1, -1); } } + #if UNITY_EDITOR + UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); + #endif } } else { @@ -343,13 +374,24 @@ public void HandleCoilEvent(string id, bool isEnabled) // since it wasn't active before, we need to emit, because the wire didn't catch it. wire.OnChange(isEnabled); + WireStatuses[wireConfig.Id] = (isEnabled, lagSec); + + } else { + // just update lag time + WireStatuses[wireConfig.Id] = (WireStatuses[wireConfig.Id].Item1, lagSec); } + // if it was already active, do nothing, since it was emitted by the wire already, // but that's only the case if it was *after* it became active. otherwise, emit. if (now - lagSec < wireConfig.ActiveSince) { wire.OnChange(isEnabled); + WireStatuses[wireConfig.Id] = (isEnabled, lagSec); } + #if UNITY_EDITOR + UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); + #endif + } else { // so we got a coil with no or too old switch in the queue. we assume this comes from the GLE // without a corresponding switch event. @@ -392,6 +434,11 @@ public class WireDestConfig ///
public const float DynamicThresholdSec = 600 / 1000f; + /// + /// ID reference from the wire, to easily identify the wire. + /// + public readonly string Id; + /// /// Reference to the destination device. /// @@ -453,6 +500,7 @@ public class WireDestConfig public WireDestConfig(WireMapping wireMapping) { + Id = wireMapping.Id; Device = wireMapping.DestinationDevice; DeviceItem = wireMapping.DestinationDeviceItem; PulseDelay = wireMapping.PulseDelay; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs index 62a008cdb..6a62790fc 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs @@ -25,6 +25,8 @@ namespace VisualPinball.Unity [Serializable] public class WireMapping { + public string Id; + public string Description = string.Empty; /* Source */ @@ -53,8 +55,6 @@ public class WireMapping public bool IsDynamic; - public int DynamicThresholdMs = 75; - public WireMapping() { } @@ -72,6 +72,12 @@ public WireMapping(string description, SwitchMapping switchMapping, CoilMapping DestinationDeviceItem = coilMapping.DeviceItem; } + public WireMapping WithId() + { + Id = $"wire_{Guid.NewGuid().ToString().Substring(0, 8)}"; + return this; + } + [ExcludeFromCodeCoverage] public string Src { get { switch (Source) { diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs index 779e66aac..4f6d4ecdc 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs @@ -145,14 +145,14 @@ public void RepopulateHardware(IGamelogicEngine gle) // hook up plunger var plunger = GetComponentInChildren(); if (plunger) { - MappingConfig.AddWire(new WireMapping { - Description = "Manual Plunger", - Source = SwitchSource.InputSystem, - SourceInputActionMap = InputConstants.MapCabinetSwitches, - SourceInputAction = InputConstants.ActionPlunger, - DestinationDevice = plunger, - DestinationDeviceItem = PlungerComponent.PullCoilId - }); + var mapping = new WireMapping().WithId(); + mapping.Description = "Manual Plunger"; + mapping.Source = SwitchSource.InputSystem; + mapping.SourceInputActionMap = InputConstants.MapCabinetSwitches; + mapping.SourceInputAction = InputConstants.ActionPlunger; + mapping.DestinationDevice = plunger; + mapping.DestinationDeviceItem = PlungerComponent.PullCoilId; + MappingConfig.AddWire(mapping); } } } From 9b271d92df64c58328db354b11f51e89093f599d Mon Sep 17 00:00:00 2001 From: jsm174 Date: Sat, 16 Oct 2021 08:21:28 -0400 Subject: [PATCH 40/58] cannon: move business logic from component to api --- .../VisualPinball.Unity/VPT/Mech/CannonApi.cs | 85 +++++++++-- .../VPT/Mech/CannonComponent.cs | 143 +++++++----------- 2 files changed, 126 insertions(+), 102 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs index 844451986..7bc5473d0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs @@ -2,7 +2,6 @@ using Logger = NLog.Logger; using NLog; using UnityEngine; -using Unity.Mathematics; namespace VisualPinball.Unity { @@ -10,6 +9,14 @@ public class CannonApi : IApi, IApiSwitchDevice, IApiCoilDevice { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public const int Length = 240; + + private enum Direction + { + Forward = 0, + Reverse = 1 + } + private readonly CannonComponent _cannonComponent; private Player _player; @@ -20,13 +27,12 @@ public class CannonApi : IApi, IApiSwitchDevice, IApiCoilDevice public event EventHandler Init; - public int position = 0; - public const int Length = 240; + private Direction _direction; + private float _position; internal CannonApi(GameObject go, Player player) { _cannonComponent = go.GetComponentInChildren(); - _cannonComponent.SetAPI(this); _player = player; } @@ -54,9 +60,15 @@ void IApi.OnInit(BallManager ballManager) GunMotorCoil = new DeviceCoil(OnGunMotorCoilEnabled, OnGunMotorCoilDisabled); GunHomeSwitch = new DeviceSwitch(CannonComponent.GunHomeSwitchItem, false, SwitchDefault.NormallyOpen, _player); + GunHomeSwitch.SetSwitch(true); + GunMarkSwitch = new DeviceSwitch(CannonComponent.GunMarkSwitchItem, false, SwitchDefault.NormallyOpen, _player); + GunMarkSwitch.SetSwitch(false); + + _direction = Direction.Forward; + _position = 0; - UpdatePosition(); + _cannonComponent.OnGunMotorUpdatePosition += OnGunMotorUpdatePosition; Init?.Invoke(this, EventArgs.Empty); } @@ -75,24 +87,67 @@ private void OnGunMotorCoilDisabled() Logger.Info("OnGunMotorCoilDisabled"); } - public void UpdatePosition(float y = 0) + public float OnGunMotorUpdatePosition(float delta) { - position = (int)(math.abs(y / 0.75) * Length); + float speed = (Length * 2 / 6.5f) * delta; - Logger.Info($"UpdatePosition: y={y}, position={position}"); + if (_direction == Direction.Forward) + { + _position += speed; + + if (_position >= Length) + { + _position = Length - (_position - Length); - GunHomeSwitch.SetSwitch(position >= 0 && position <= 5); - GunMarkSwitch.SetSwitch(position >= 98 && position <= 105); + _direction = Direction.Reverse; + } + } + else + { + _position -= speed; + + if (_position <= 0) + { + _position = -_position; + + _direction = Direction.Forward; + } + } + + if (_position >= 0 && _position <= 5) + { + if (!GunHomeSwitch.IsEnabled) + { + GunHomeSwitch.SetSwitch(true); + } + } + else if (GunHomeSwitch.IsEnabled) + { + GunHomeSwitch.SetSwitch(false); + } + + if (_position >= 98 && _position <= 105) + { + if (!GunMarkSwitch.IsEnabled) + { + GunMarkSwitch.SetSwitch(true); + } + } + else if (GunMarkSwitch.IsEnabled) + { + GunMarkSwitch.SetSwitch(false); + } + + Logger.Info($"Position={_position}"); + + return _position / Length; } void IApi.OnDestroy() { - Logger.Info("Destroying cannon!"); - } + Logger.Info("Destroying cannon api!"); - public void OnChange(bool enabled) - { - throw new NotImplementedException(); + _cannonComponent.OnGunMotorUpdatePosition -= OnGunMotorUpdatePosition; } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs index d1cf36d8b..e08ac754a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs @@ -6,98 +6,67 @@ using System; namespace VisualPinball.Unity -{ - [AddComponentMenu("Visual Pinball/Game Item/Cannon")] - public class CannonComponent : MonoBehaviour, ISwitchDeviceComponent, ICoilDeviceComponent - { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - private enum Direction - { - CounterClockwise = 0, - Clockwise = 1 - } - - public const string GunMotorCoilItem = "gun_motor_coil"; +{ + [AddComponentMenu("Visual Pinball/Game Item/Cannon")] + public class CannonComponent : MonoBehaviour, ISwitchDeviceComponent, ICoilDeviceComponent + { + public delegate float OnGunMotorUpdatePositionHandler(float delta); - public IEnumerable AvailableCoils => new[] { - new GamelogicEngineCoil(GunMotorCoilItem) { - Description = "Gun Motor" - } - }; - - public const string GunMarkSwitchItem = "gun_mark_switch"; - public const string GunHomeSwitchItem = "gun_home_switch"; - - public IEnumerable AvailableSwitches => new[] { - new GamelogicEngineSwitch(GunMarkSwitchItem) { - Description = "Gun Mark" - }, - new GamelogicEngineSwitch(GunHomeSwitchItem) { - Description = "Gun Home" - } - }; - - public SwitchDefault SwitchDefault => SwitchDefault.NormallyOpen; - - IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableCoils; - IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableSwitches; - IEnumerable IWireableComponent.AvailableWireDestinations => AvailableCoils; - IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableCoils; - - public event EventHandler Init; - public bool IsEnabled = false; - private CannonApi _api; - private Direction _direction = Direction.CounterClockwise; + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public const string GunMotorCoilItem = "gun_motor_coil"; + + public IEnumerable AvailableCoils => new[] { + new GamelogicEngineCoil(GunMotorCoilItem) { + Description = "Gun Motor" + } + }; + + public const string GunMarkSwitchItem = "gun_mark_switch"; + public const string GunHomeSwitchItem = "gun_home_switch"; + + public IEnumerable AvailableSwitches => new[] { + new GamelogicEngineSwitch(GunMarkSwitchItem) { + Description = "Gun Mark" + }, + new GamelogicEngineSwitch(GunHomeSwitchItem) { + Description = "Gun Home" + } + }; + + public SwitchDefault SwitchDefault => SwitchDefault.NormallyOpen; + + IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableCoils; + IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableSwitches; + IEnumerable IWireableComponent.AvailableWireDestinations => AvailableCoils; + IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableCoils; + + public event OnGunMotorUpdatePositionHandler OnGunMotorUpdatePosition; + + public bool IsEnabled = false; - public void SetAPI(CannonApi api) + private void Awake() { - _api = api; - } - - void Update() - { - if (!IsEnabled) + var player = GetComponentInParent(); + if (player == null) { - return; - } - - var rotation = transform.rotation; - - if (_direction == Direction.CounterClockwise) - { - rotation.y -= 0.02f; - - if (rotation.y <= -.75) - { - _direction = Direction.Clockwise; - } - } - else if (_direction == Direction.Clockwise) - { - rotation.y += 0.02f; - - if (rotation.y >= 0) - { - _direction = Direction.CounterClockwise; - } - } - - _api.UpdatePosition(rotation.y); - - transform.rotation = rotation; - } + Logger.Error($"Cannot find player for cannon {name}."); + return; + } + + player.RegisterMech(this); + } - private void Awake() - { - var player = GetComponentInParent(); - if (player == null) - { - Logger.Error($"Cannot find player for cannon {name}."); - return; - } + private void Update() + { + if (!IsEnabled) return; - player.RegisterMech(this); - } + float position = OnGunMotorUpdatePosition(Time.deltaTime); + + var rotation = transform.rotation; + rotation.y = -(position * 0.65f); + + transform.rotation = rotation; + } } } From b3d4532c3a7e2f29ffd3e69622e6097f17f65f09 Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 21:41:54 +0200 Subject: [PATCH 41/58] editor: Make wires auto-populatable. --- .../Game/Engines/GamelogicEngineWire.cs | 44 ++++++++++++++++++ .../Game/Engines/GamelogicEngineWire.cs.meta | 11 +++++ .../Managers/Wire/WireListViewItemRenderer.cs | 11 ++--- .../Managers/Wire/WireManager.cs | 17 +++++++ .../Game/Engine/DefaultGamelogicEngine.cs | 5 +++ .../Game/Engine/IGamelogicEngine.cs | 9 ++++ .../Mappings/MappingConfig.cs | 45 ++++++++++++++++++- .../Mappings/WireMapping.cs | 24 ++++++++-- .../VPT/Table/TableComponent.cs | 22 +++++---- 9 files changed, 169 insertions(+), 19 deletions(-) create mode 100644 VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs create mode 100644 VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs.meta diff --git a/VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs b/VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs new file mode 100644 index 000000000..2dd4af532 --- /dev/null +++ b/VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs @@ -0,0 +1,44 @@ +// 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 . + +// ReSharper disable InconsistentNaming + +using System; + +namespace VisualPinball.Engine.Game.Engines +{ + [Serializable] + public class GamelogicEngineWire + { + public string Description; + public string SourceId; + public string DestinationId; + public DestinationType DestinationType; + + public GamelogicEngineWire(string srcId, string destId, DestinationType type, string description = "") + { + Description = description; + SourceId = srcId; + DestinationId = destId; + DestinationType = type; + } + } + + public enum DestinationType + { + Coil, Lamp, GI + } +} diff --git a/VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs.meta b/VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs.meta new file mode 100644 index 000000000..cf4af47a7 --- /dev/null +++ b/VisualPinball.Engine/Game/Engines/GamelogicEngineWire.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 008c0b52a3b92064c8088f04a57f300c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs index ba9b503d3..89ef4ecc7 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Wire/WireListViewItemRenderer.cs @@ -219,7 +219,7 @@ private void RenderSourceElementDevice(WireListData wireListData, Rect cellRect, }); } - private void RenderSourceElementDeviceItem(WireListData wireListData, Rect cellRect, Action updateAction) + private static void RenderSourceElementDeviceItem(WireListData wireListData, Rect cellRect, Action updateAction) { EditorGUI.BeginDisabledGroup(wireListData.SourceDevice == null); @@ -260,7 +260,7 @@ protected override void RenderDeviceElement(WireListData listData, Rect cellRect } - private void RenderIsDynamic(Dictionary statuses, WireListData wireListData, Rect cellRect, Action updateAction) + private static void RenderIsDynamic(IReadOnlyDictionary statuses, WireListData wireListData, Rect cellRect, Action updateAction) { if (Application.isPlaying && statuses != null) { var status = statuses[wireListData.Id]; @@ -283,7 +283,7 @@ private void RenderIsDynamic(Dictionary statuses, WireLis } } - private void RenderPulseDelay(WireListData wireListData, Rect cellRect, Action updateAction) + private static void RenderPulseDelay(WireListData wireListData, Rect cellRect, Action updateAction) { if (wireListData.SourceDevice != null && !string.IsNullOrEmpty(wireListData.SourceDeviceItem)) { var switchable = wireListData.SourceDevice.AvailableSwitches.First(s => s.Id == wireListData.SourceDeviceItem); @@ -305,13 +305,10 @@ private void RenderPulseDelay(WireListData wireListData, Rect cellRect, Action. +using System; using System.Collections.Generic; using NLog; using UnityEditor; using UnityEngine; +using VisualPinball.Engine.Game.Engines; using Logger = NLog.Logger; +using Object = UnityEngine.Object; namespace VisualPinball.Unity.Editor { @@ -91,6 +94,13 @@ protected override bool SetupCompleted() protected override void OnButtonBarGUI() { + if (GUILayout.Button("Populate All", GUILayout.ExpandWidth(false))) + { + RecordUndo("Populate all wire mappings"); + TableComponent.MappingConfig.PopulateWires(GetAvailableEngineWires(), TableComponent); + Reload(); + } + if (GUILayout.Button("Remove All", GUILayout.ExpandWidth(false))) { if (EditorUtility.DisplayDialog("Wire Manager", "Are you sure want to remove all wire mappings?", "Yes", "Cancel")) { @@ -144,6 +154,13 @@ protected override void CloneData(string undoName, string newName, WireListData #endregion #region Helper methods + + private GamelogicEngineWire[] GetAvailableEngineWires() + { + var gle = TableComponent.gameObject.GetComponent(); + return gle == null ? Array.Empty() : gle.AvailableWires; + } + private void DisplayMessage(string message) { GUILayout.BeginHorizontal(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs index 42dbf4c4f..08e31e031 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/DefaultGamelogicEngine.cs @@ -98,6 +98,11 @@ public class DefaultGamelogicEngine : MonoBehaviour, IGamelogicEngine new GamelogicEngineCoil(CoilTroughEntry) { Description = "Trough Entry", DeviceHint = "^Trough\\s*\\d?", DeviceItemHint = TroughComponent.EntryCoilId}, }; + public GamelogicEngineWire[] AvailableWires { get; } = { + new GamelogicEngineWire(SwLeftFlipper, CoilLeftFlipperMain, DestinationType.Coil, "Left Flipper"), + new GamelogicEngineWire(SwRightFlipper, CoilRightFlipperMain, DestinationType.Coil, "Right Flipper"), + }; + private const string GiSlingshotRightLower = "gi_1"; private const string GiSlingshotRightUpper = "gi_2"; private const string GiSlingshotLeftLower = "gi_3"; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs index da574383c..3ae0e9364 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Game/Engine/IGamelogicEngine.cs @@ -96,6 +96,15 @@ public interface IGamelogicEngine event EventHandler OnCoilChanged; #endregion + + #region Wires + + /// + /// A list of *dynamic* wires. + /// + GamelogicEngineWire[] AvailableWires { get; } + + #endregion } public class AvailableDisplays diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index 6195fae0d..b7e47e77f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -44,7 +44,9 @@ public void Clear(bool clearWires = true) Lamps.Clear(); if (clearWires) { - Wires.Clear(); + RemoveAllWires(); + } else { + RemoveDynamicWires(); } } @@ -350,6 +352,42 @@ public void RemoveAllCoils() #region Wires + public void PopulateWires(GamelogicEngineWire[] engineWires, TableComponent tableComponent) + { + foreach (var engineWire in engineWires) { + var srcMapping = Switches.FirstOrDefault(switchMapping => switchMapping.Id == engineWire.SourceId); + if (srcMapping == null) { + continue; + } + + switch (engineWire.DestinationType) { + case DestinationType.Coil: { + var destMapping = Coils.FirstOrDefault(coilMapping => coilMapping.Id == engineWire.DestinationId); + if (destMapping != null) { + AddWire(new WireMapping(engineWire.Description, srcMapping, destMapping).Dynamic().WithId()); + } + break; + } + case DestinationType.Lamp: { + var destMapping = Lamps.FirstOrDefault(lampMapping => lampMapping.Id == engineWire.DestinationId && lampMapping.Source == LampSource.Lamp); + if (destMapping != null) { + AddWire(new WireMapping(engineWire.Description, srcMapping, destMapping).Dynamic().WithId()); + } + break; + } + case DestinationType.GI: { + var destMapping = Lamps.FirstOrDefault(lampMapping => lampMapping.Id == engineWire.DestinationId && lampMapping.Source == LampSource.GI); + if (destMapping != null) { + AddWire(new WireMapping(engineWire.Description, srcMapping, destMapping).Dynamic().WithId()); + } + break; + } + default: + throw new ArgumentOutOfRangeException(); + } + } + } + public void AddWire(WireMapping wireMapping) { Wires.Add(wireMapping); @@ -360,6 +398,11 @@ public void RemoveWire(WireMapping wireMapping) Wires.Remove(wireMapping); } + public void RemoveDynamicWires() + { + Wires = Wires.Where(w => !w.IsDynamic).ToList(); + } + public void RemoveAllWires() { Wires.Clear(); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs index 6a62790fc..41be5c2c0 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/WireMapping.cs @@ -60,7 +60,21 @@ public WireMapping() } [ExcludeFromCodeCoverage] - public WireMapping(string description, SwitchMapping switchMapping, CoilMapping coilMapping) + public WireMapping(string description, SwitchMapping switchMapping, CoilMapping coilMapping) : this(description, switchMapping) + { + DestinationDevice = coilMapping.Device; + DestinationDeviceItem = coilMapping.DeviceItem; + } + + [ExcludeFromCodeCoverage] + public WireMapping(string description, SwitchMapping switchMapping, LampMapping lampMapping) : this(description, switchMapping) + { + DestinationDevice = lampMapping.Device; + DestinationDeviceItem = lampMapping.DeviceItem; + } + + [ExcludeFromCodeCoverage] + private WireMapping(string description, SwitchMapping switchMapping) { Description = description; Source = switchMapping.Source; @@ -68,8 +82,6 @@ public WireMapping(string description, SwitchMapping switchMapping, CoilMapping SourceDeviceItem = switchMapping.DeviceItem; SourceInputAction = switchMapping.InputAction; SourceInputActionMap = switchMapping.InputActionMap; - DestinationDevice = coilMapping.Device; - DestinationDeviceItem = coilMapping.DeviceItem; } public WireMapping WithId() @@ -78,6 +90,12 @@ public WireMapping WithId() return this; } + public WireMapping Dynamic() + { + IsDynamic = true; + return this; + } + [ExcludeFromCodeCoverage] public string Src { get { switch (Source) { diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs index 4f6d4ecdc..88b1c7649 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Table/TableComponent.cs @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.Linq; using UnityEngine; using VisualPinball.Engine.Common; using VisualPinball.Engine.VPT; @@ -141,18 +142,23 @@ public void RepopulateHardware(IGamelogicEngine gle) MappingConfig.PopulateSwitches(gle.AvailableSwitches, this); MappingConfig.PopulateLamps(gle.AvailableLamps, this); MappingConfig.PopulateCoils(gle.AvailableCoils, this); + MappingConfig.PopulateWires(gle.AvailableWires, this); // hook up plunger var plunger = GetComponentInChildren(); if (plunger) { - var mapping = new WireMapping().WithId(); - mapping.Description = "Manual Plunger"; - mapping.Source = SwitchSource.InputSystem; - mapping.SourceInputActionMap = InputConstants.MapCabinetSwitches; - mapping.SourceInputAction = InputConstants.ActionPlunger; - mapping.DestinationDevice = plunger; - mapping.DestinationDeviceItem = PlungerComponent.PullCoilId; - MappingConfig.AddWire(mapping); + const string description = "Manual Plunger"; + var plungerMapping = MappingConfig.Wires.FirstOrDefault(mc => mc.Description == description); + if (plungerMapping == null) { + var mapping = new WireMapping().WithId(); + mapping.Description = description; + mapping.Source = SwitchSource.InputSystem; + mapping.SourceInputActionMap = InputConstants.MapCabinetSwitches; + mapping.SourceInputAction = InputConstants.ActionPlunger; + mapping.DestinationDevice = plunger; + mapping.DestinationDeviceItem = PlungerComponent.PullCoilId; + MappingConfig.AddWire(mapping); + } } } } From da20a9382d3c608cf65d8073f64424fe67f43f2a Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 23:23:43 +0200 Subject: [PATCH 42/58] doc: Update links and include patcher in API generation. --- .../Documentation~/creators-guide/editor/coil-manager.md | 8 +++++--- .../Documentation~/creators-guide/editor/lamp-manager.md | 2 ++ .../Documentation~/creators-guide/editor/materials.md | 7 ++++--- .../creators-guide/editor/switch-manager.md | 2 ++ .../creators-guide/editor/unity-components.md | 7 +++---- .../Documentation~/creators-guide/editor/wire-manager.md | 4 +++- .../creators-guide/manual/gamelogic-engine.md | 2 ++ .../creators-guide/manual/mechanisms/troughs.md | 6 ++++++ VisualPinball.Unity/Documentation~/docfx.json | 3 ++- VisualPinball.Unity/Documentation~/plugins/index.md | 3 ++- VisualPinball.Unity/Documentation~/plugins/mpf/index.md | 1 + 11 files changed, 32 insertions(+), 13 deletions(-) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/coil-manager.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/coil-manager.md index 86e05ce98..4dbe2d771 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/coil-manager.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/coil-manager.md @@ -1,9 +1,11 @@ --- +uid: coil_manager +title: Coil Manager description: VPE's coil manager lets you hook up the coils of the playfield to the gamelogic engine. --- # Coil Manager -On a real pinball table most moving parts, including the flippers, are triggered by [coils](https://en.wikipedia.org/wiki/Inductor) (also called [solenoids](https://en.wikipedia.org/wiki/Solenoid)). In VPE it's the job of the [gamelogic engine](~/creators-guide/manual/gamelogic-engine.md) to trigger them when needed. +On a real pinball table most moving parts, including the flippers, are triggered by [coils](https://en.wikipedia.org/wiki/Inductor) (also called [solenoids](https://en.wikipedia.org/wiki/Solenoid)). In VPE it's the job of the [gamelogic engine](xref:gamelogic_engine) to trigger them when needed. Just as the coils are physically wired to the power driver board on a regular machine they can be virtually connected in VPE using the coil manager under *Visual Pinball -> Coil Manager*. @@ -29,8 +31,8 @@ The **Description** column is optional. If you're setting up a re-creation, you The **Destination** column defines where the element in the following column is located. There are three options: - *Playfield* lets you select a game element on the playfield that features the coil -- *Device* lets you choose a *coil device*, a mechanism which may include multiple coils, such as a [trough](../manual/mechanisms/troughs.md). -- *Lamp* sets the coil to be configured in the lamp manager (see [flashers in the lamp manager](lamp-manager.md#flashers) for more details). +- *Device* lets you choose a *coil device*, a mechanism which may include multiple coils, such as a [trough](xref:troughs). +- *Lamp* sets the coil to be configured in the lamp manager (see [flashers in the lamp manager](xref:lamp_manager#flashers) for more details). ### Element diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager.md index a7a5217e4..f31fcf1ab 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager.md @@ -1,4 +1,6 @@ --- +uid: lamp_manager +title: Lamp Manager description: The lamp manager lets you configure the lights, flashers, and general illumination of the playfield and connect them to the gamelogic engine. --- # Lamp Manager diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md index ae5577988..a0f1ba8d9 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/materials.md @@ -1,8 +1,11 @@ --- +uid: materials_index title: Materials description: How VPE deals with materials. --- +![Unity Materials](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@13.0/manual/images/HDRPFeatures-LitShader.png) + # Materials Materials are what you apply to an object in order to make it look or behave like something in the real world. Materials are one of the key components of a table, because they define the visuals and the physical behavior. However, the term *material* can be confusing, because it can have different meanings. So let's define them first. @@ -39,6 +42,4 @@ As mentioned above, there are two differences between Visual Pinball and VPE how When importing a `.vpx` file, VPE converts the "visual part" of Visual Pinball materials into materials for the current render pipeline. It does that by creating a new material for every material/texture combination in Visual Pinball. The materials are then written to the `Materials` asset folder of the imported table where they can be easily edited and referenced. Since Visual Pinball uses different shaders than Unity, the results of the conversion are approximations and should be heavily tweaked. -Since VPE uses the same physics engine as Visual Pinball, the physical values of the materials don't need to be converted, they are copied 1:1 into a new physics material and saved in the asset folder. - -In case you're using the Unity editor for authoring a Visual Pinball table, you can still edit the original VPX materials using the materials manager. However, you'll notice that the physical attributes are missing, since they are now handled by physical material assets. That means when exporting, VPE will apply the physics values from the assets to the internal materials (the match between the material editor and the asset is done via name). \ No newline at end of file +Since VPE uses the same physics engine as Visual Pinball, the physical values of the materials don't need to be converted, they are copied 1:1 into a new physics material and saved in the asset folder. \ No newline at end of file diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md index 04e3e6fd3..b80f0c220 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md @@ -1,4 +1,6 @@ --- +uid: switch_manager +title: Switch Manager description: VPE's switch manager lets you hook up the switches of the playfield to the gamelogic engine. --- # Switch Manager diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/unity-components.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/unity-components.md index d2d24d8a0..6324c6a96 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/unity-components.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/unity-components.md @@ -1,14 +1,13 @@ --- +uid: unity_components +title: Unity Components description: Working with mesh, collider and animation components. --- # Unity Components When loading or creating a table in Unity, what you're creating is a hierarchy of [GameObjects](https://docs.unity3d.com/Manual/GameObjects.html), the basic building blocks of Unity scenes. By default we group game items by their type when importing, but you can arrange them however you want. -To give the GameObjects behavior during gameplay, we add [components](https://docs.unity3d.com/Manual/Components.html) onto them. VPE comes with large number of components that are used to set up and control the game mechanisms of the table, and advanced programmers can contibute new ones. - -> [!note] -> During runtime, VPE converts the GameObjects and components into entities in Unity's [DOTS workflow](https://unity.com/dots). There are special components used to control this conversion which we call *Authoring Components*. +To give the GameObjects behavior during gameplay, we add [components](https://docs.unity3d.com/Manual/Components.html) onto them. VPE comes with a large number of components that are used to set up and control the game mechanisms of the table, and advanced programmers can contibute new ones. If you've never heard about GameObjects or components, we recommmend you read through the links in the first two paragraphs. They are short, to the point, and a much better introduction than we could provide here. diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md index 4682cc308..34f8b1272 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md @@ -1,9 +1,11 @@ --- +uid: wire_manager +title: Wire Manager description: VPE's wire manager lets you directly hook up any switch to any coil or lamp. --- # Wire Manager -Using the [Switch Manager](switch-manager.md), you can wire playfield and cabinet switches to the [Gamelogic Engine](../manual/gamelogic-engine.md). Similarly, the [Coil Manager](coil-manager.md) and [Lamp Manager](#) let you connect playfield elements to the outputs of the Gamelogic Engine. +Using the [Switch Manager](xref:switch_manager), you can wire playfield and cabinet switches to the [Gamelogic Engine](../manual/gamelogic-engine.md). Similarly, the [Coil Manager](xref:coil_manager) and [Lamp Manager](xref:lamp_manager) let you connect playfield elements to the outputs of the Gamelogic Engine. The **Wire Manager** allows you to *bypass* the gamelogic engine and connect switches directly to coils and lamps. Using the *dynamic* wires, this can be used to eliminate the flipper lag often introduced by emulated ROMs. But it also can be useful for debugging, or for game logic that might not be covered by the gamelogic engine. diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/gamelogic-engine.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/gamelogic-engine.md index 802e4120b..3abcc6ccf 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/manual/gamelogic-engine.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/gamelogic-engine.md @@ -1,4 +1,6 @@ --- +uid: gamelogic_engine +title: Gamelogic Engine description: VPE's gamelogic engine is the code driving your game's logic. --- # Gamelogic Engine diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md index ac78f9ea6..08005f843 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md @@ -1,3 +1,9 @@ +--- +uid: troughs +title: Troughs / Ball Drains +description: How VPE works with troughs (ball drains). +--- + # Troughs / Ball Drains If you are unfamiliar with ball troughs, have a quick look at [MPF's documentation](https://mpf-docs.readthedocs.io/en/latest/mechs/troughs/), which does an excellent job explaining them. diff --git a/VisualPinball.Unity/Documentation~/docfx.json b/VisualPinball.Unity/Documentation~/docfx.json index fa2e8fe2e..1ea0fa126 100644 --- a/VisualPinball.Unity/Documentation~/docfx.json +++ b/VisualPinball.Unity/Documentation~/docfx.json @@ -4,7 +4,8 @@ "src": [ { "files": [ - "VisualPinball.Unity/**.csproj" + "VisualPinball.Unity/**.csproj", + "VisualPinball.Unity.Patcher/**.csproj" ], "src": "../" } diff --git a/VisualPinball.Unity/Documentation~/plugins/index.md b/VisualPinball.Unity/Documentation~/plugins/index.md index 2b6e1f355..578d8ff1a 100644 --- a/VisualPinball.Unity/Documentation~/plugins/index.md +++ b/VisualPinball.Unity/Documentation~/plugins/index.md @@ -1,4 +1,5 @@ --- +uid: plugins_index title: Plugins description: Visual Pinball for Unity - Plugins --- @@ -8,6 +9,6 @@ description: Visual Pinball for Unity - Plugins VPE has a plug-in system that allows other software to integrate with it. Plugins are typically required on a per-table basis. VPE ships with a number of default plugins which are documented here. -## [Mission Pinball Framework](mpf/index.html) +## [Mission Pinball Framework](xref:mpf_index) The [Mission Pinball Framework](https://missionpinball.org/) is software written in Python that is used to drive real pinball machines. It integrates with VPE as a gamelogic engine. diff --git a/VisualPinball.Unity/Documentation~/plugins/mpf/index.md b/VisualPinball.Unity/Documentation~/plugins/mpf/index.md index c3d005e60..a93ce34a9 100644 --- a/VisualPinball.Unity/Documentation~/plugins/mpf/index.md +++ b/VisualPinball.Unity/Documentation~/plugins/mpf/index.md @@ -1,4 +1,5 @@ --- +uid: mpf_index title: Mission Pinball Framework description: Visual Pinball Engine integration with the Mission Pinball Framework. --- From 0aec43f443a422c974fc6f83f1d7e9689c9d6981 Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 23:24:44 +0200 Subject: [PATCH 43/58] patcher: Fix namespace and ignore pinmame in test project. --- .../Matcher/TablePatcher.cs | 10 +++++++++- .../VisualPinball.Unity.Patcher/Patcher/Patcher.cs | 1 - .../Patcher/Tables/CreatureFromTheBlackLagoon.cs | 1 - .../Patcher/Tables/Goldorak.cs | 1 - .../Patcher/Tables/IndianaJones.cs | 1 - .../Patcher/Tables/JurassicPark.cs | 1 - .../Patcher/Tables/Mississippi.cs | 1 - .../Patcher/Tables/Terminator2.cs | 6 +++--- .../Patcher/Tables/TomAndJerry.cs | 1 - .../Patcher/Tables/WipeOut.cs | 1 - .../TestProject~/ProjectSettings/ProjectSettings.asset | 3 ++- 11 files changed, 14 insertions(+), 13 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index d2cd02269..ddbe70072 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -23,11 +23,19 @@ using VisualPinball.Unity.Editor; using Object = UnityEngine.Object; -namespace VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher +namespace VisualPinball.Unity.Patcher { [Api] public abstract class TablePatcher { + /// + /// This method is executed once after all element-specific patches had + /// been applied.

+ /// + /// Override this method when you need to create new objects or make global + /// changes to the project. + ///

+ /// GameObject of the table. public virtual void PostPatch(GameObject tableGo) { CreateTrough(tableGo, Playfield(tableGo)); diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs index 3b37de2a0..f49376144 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs @@ -23,7 +23,6 @@ using NLog; using UnityEngine; using VisualPinball.Engine.VPT.Table; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; using Logger = NLog.Logger; namespace VisualPinball.Unity.Patcher diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs index 0425f05ed..498756f0a 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/CreatureFromTheBlackLagoon.cs @@ -19,7 +19,6 @@ // ReSharper disable UnusedMember.Global using UnityEngine; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs index 307da3e5d..9276d9264 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Goldorak.cs @@ -19,7 +19,6 @@ // ReSharper disable UnusedMember.Global using UnityEngine; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs index 488fcfe67..c2252b4f7 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/IndianaJones.cs @@ -20,7 +20,6 @@ using UnityEngine; using UnityEngine.Rendering; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs index 3a7c17a42..1b2e95f7f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/JurassicPark.cs @@ -20,7 +20,6 @@ using UnityEngine; using UnityEngine.Rendering; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs index 706cc0641..d4d9caafc 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Mississippi.cs @@ -19,7 +19,6 @@ // ReSharper disable UnusedMember.Global using UnityEngine; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 9158fb06c..5c08977db 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -23,9 +23,7 @@ using UnityEditor; using UnityEngine; using VisualPinball.Engine.Math; -using VisualPinball.Engine.PinMAME; using VisualPinball.Engine.VPT; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; using Color = UnityEngine.Color; namespace VisualPinball.Unity.Patcher @@ -65,11 +63,12 @@ private static void SetupTrough(GameObject tableGo, GameObject playfieldGo) private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo) { + #if !NO_PINMAME var tableComponent = tableGo.GetComponent(); // GLE Object.DestroyImmediate(tableGo.GetComponent()); - var pinmameGle = tableGo.AddComponent(); + var pinmameGle = tableGo.AddComponent(); pinmameGle.Game = new Engine.PinMAME.Games.Terminator2(); pinmameGle.romId = "t2_l82"; tableComponent.RepopulateHardware(pinmameGle); @@ -90,6 +89,7 @@ private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo) tableComponent.MappingConfig.Lamps.First(lm => lm.Id == "2").Device = giRightPlayfield; tableComponent.MappingConfig.Lamps.First(lm => lm.Id == "3").Device = giCpu; tableComponent.MappingConfig.Lamps.First(lm => lm.Id == "4").Device = giLeftPlayfield; + #endif } private static void SetupMapping(GameObject tableGo) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs index c25426998..84403f5bd 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/TomAndJerry.cs @@ -20,7 +20,6 @@ using UnityEngine; using VisualPinball.Unity.Patcher.Matcher.Table; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs index efdd82ba9..4330218b6 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/WipeOut.cs @@ -19,7 +19,6 @@ // ReSharper disable UnusedMember.Global using UnityEngine; -using VisualPinball.Unity.VisualPinball.Unity.Patcher.Matcher; namespace VisualPinball.Unity.Patcher { diff --git a/VisualPinball.Unity/VisualPinball.Unity.Test/TestProject~/ProjectSettings/ProjectSettings.asset b/VisualPinball.Unity/VisualPinball.Unity.Test/TestProject~/ProjectSettings/ProjectSettings.asset index fc810ffdf..72fa309c7 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Test/TestProject~/ProjectSettings/ProjectSettings.asset +++ b/VisualPinball.Unity/VisualPinball.Unity.Test/TestProject~/ProjectSettings/ProjectSettings.asset @@ -579,7 +579,8 @@ PlayerSettings: webGLLinkerTarget: 1 webGLThreadsSupport: 0 webGLDecompressionFallback: 0 - scriptingDefineSymbols: {} + scriptingDefineSymbols: + 1: NO_PINMAME additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} From 9b1b5bc55068d35e411a8bf5e2d615c372ee6742 Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 23:25:55 +0200 Subject: [PATCH 44/58] editor: Fix internal ID of lamps. --- .../VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs | 2 +- .../VisualPinball.Unity/Mappings/MappingConfig.cs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs index 3a0f45d4d..36196630b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListData.cs @@ -48,7 +48,7 @@ public class LampListData : IManagerListData, IDeviceListData DeviceComponent => Device; diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index b7e47e77f..65d56c56d 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -434,6 +434,7 @@ public void PopulateLamps(GamelogicEngineLamp[] engineLamps, TableComponent tabl AddLamp(new LampMapping { Id = engineLamp.Id, + InternalId = engineLamp.InternalId, Channel = engineLamp.Channel, Source = engineLamp.Source, Description = description, From 275013005ebec374ed34c455182bb7c033cc8bfe Mon Sep 17 00:00:00 2001 From: freezy Date: Sat, 16 Oct 2021 23:32:19 +0200 Subject: [PATCH 45/58] editor: Right-align coil ID in lamp manager. --- .../Managers/Lamp/LampListViewItemRenderer.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs index 2f43f219b..0cd142f56 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampListViewItemRenderer.cs @@ -92,10 +92,9 @@ public void Render(TableComponent tableComponent, LampListData data, Rect cellRe private void RenderCoilId(Dictionary lampStatuses, LampListData lampListData, Rect cellRect) { // add some padding - cellRect.x += 2; + cellRect.x = cellRect.width - 45; cellRect.width -= 4; - var statusAvail = Application.isPlaying && lampStatuses != null && lampStatuses.ContainsKey(lampListData.Id); var icon = Icons.Coil(IconSize.Small, statusAvail && lampStatuses[lampListData.Id] > 0 ? IconColor.Orange : IconColor.Gray); if (icon != null) { From c969eac58b55047bb1a76bfb90c5d81e11b2a84c Mon Sep 17 00:00:00 2001 From: jsm174 Date: Sat, 16 Oct 2021 17:38:17 -0400 Subject: [PATCH 46/58] cannon: updated to use OnUpdate in api --- .../VisualPinball.Unity/VPT/Mech/CannonApi.cs | 35 +++++++++++-------- .../VPT/Mech/CannonComponent.cs | 15 ++------ 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs index 7bc5473d0..2bc6f3448 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonApi.cs @@ -27,8 +27,9 @@ private enum Direction public event EventHandler Init; - private Direction _direction; + private bool _enabled; private float _position; + private Direction _direction; internal CannonApi(GameObject go, Player player) { @@ -57,6 +58,10 @@ IApiSwitch IApiSwitchDevice.Switch(string deviceItem) void IApi.OnInit(BallManager ballManager) { + _enabled = false; + _position = 0; + _direction = Direction.Forward; + GunMotorCoil = new DeviceCoil(OnGunMotorCoilEnabled, OnGunMotorCoilDisabled); GunHomeSwitch = new DeviceSwitch(CannonComponent.GunHomeSwitchItem, false, SwitchDefault.NormallyOpen, _player); @@ -65,31 +70,33 @@ void IApi.OnInit(BallManager ballManager) GunMarkSwitch = new DeviceSwitch(CannonComponent.GunMarkSwitchItem, false, SwitchDefault.NormallyOpen, _player); GunMarkSwitch.SetSwitch(false); - _direction = Direction.Forward; - _position = 0; - - _cannonComponent.OnGunMotorUpdatePosition += OnGunMotorUpdatePosition; + _player.OnUpdate += OnUpdate; Init?.Invoke(this, EventArgs.Empty); } private void OnGunMotorCoilEnabled() { - Logger.Info("OnGunMotorCoilEnabled"); + _enabled = true; - _cannonComponent.IsEnabled = true; + Logger.Info("OnGunMotorCoilEnabled"); } private void OnGunMotorCoilDisabled() { - _cannonComponent.IsEnabled = false; + _enabled = false; Logger.Info("OnGunMotorCoilDisabled"); } - public float OnGunMotorUpdatePosition(float delta) + private void OnUpdate(object sender, EventArgs eventArgs) { - float speed = (Length * 2 / 6.5f) * delta; + if (!_enabled) + { + return; + } + + float speed = (Length * 2 / 6.5f) * Time.deltaTime; if (_direction == Direction.Forward) { @@ -138,16 +145,16 @@ public float OnGunMotorUpdatePosition(float delta) GunMarkSwitch.SetSwitch(false); } - Logger.Info($"Position={_position}"); + _cannonComponent.UpdateRotation(_position / Length); - return _position / Length; + Logger.Debug($"Cannon position={_position}"); } void IApi.OnDestroy() { - Logger.Info("Destroying cannon api!"); + _player.OnUpdate -= OnUpdate; - _cannonComponent.OnGunMotorUpdatePosition -= OnGunMotorUpdatePosition; + Logger.Info("Destroying cannon!"); } } } diff --git a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs index e08ac754a..1dba7989e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/VPT/Mech/CannonComponent.cs @@ -3,15 +3,12 @@ using VisualPinball.Engine.Game.Engines; using Logger = NLog.Logger; using NLog; -using System; namespace VisualPinball.Unity { [AddComponentMenu("Visual Pinball/Game Item/Cannon")] public class CannonComponent : MonoBehaviour, ISwitchDeviceComponent, ICoilDeviceComponent { - public delegate float OnGunMotorUpdatePositionHandler(float delta); - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public const string GunMotorCoilItem = "gun_motor_coil"; @@ -41,10 +38,6 @@ public class CannonComponent : MonoBehaviour, ISwitchDeviceComponent, ICoilDevic IEnumerable IWireableComponent.AvailableWireDestinations => AvailableCoils; IEnumerable IDeviceComponent.AvailableDeviceItems => AvailableCoils; - public event OnGunMotorUpdatePositionHandler OnGunMotorUpdatePosition; - - public bool IsEnabled = false; - private void Awake() { var player = GetComponentInParent(); @@ -57,14 +50,10 @@ private void Awake() player.RegisterMech(this); } - private void Update() + public void UpdateRotation(float y) { - if (!IsEnabled) return; - - float position = OnGunMotorUpdatePosition(Time.deltaTime); - var rotation = transform.rotation; - rotation.y = -(position * 0.65f); + rotation.y = -(y * 0.65f); transform.rotation = rotation; } From 66077bbd87bd04040812673443753ae6a8fc3f8f Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 00:48:09 +0200 Subject: [PATCH 47/58] doc: Add documentation for light groups. --- .../mechanisms/light-group-inspector.png | Bin 0 -> 43678 bytes .../manual/mechanisms/light-groups.md | 37 ++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-group-inspector.png create mode 100644 VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-groups.md diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-group-inspector.png b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-group-inspector.png new file mode 100644 index 0000000000000000000000000000000000000000..20a61c2ba1053f4479ad9eebe63b631349df5b34 GIT binary patch literal 43678 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 + +A light group is a component you can add to any GameObject. It's recommended to make it parent of the light objects it contains, but you can also keep it outside of the lights hierarchy, since it explicitly references the lights it contains. + +## Setup + +To create a new light group, select the GameObject you want to add your light group to, and in the inspector click on *Add Component* and choose *Visual Pinball -> Game Item -> Light Group*. + +Then use the list control to add and remove lights. There are a few button that make this easier. + +### Add Children + +In case you have parented the light groups component to the light GameObjects it should include, this button adds all child lights to the list. Existing lights will remain. + +### Replace With Children + +Similar to *Add Children*, only that the list is cleared before adding new lights. + +### Clear + +Simply clears the list. + +### Select Light Sources + +When working with lights, the GameObject with the actual light source is nested within the main object. This can make adjusting light settings for multiple lights tedious, since you have to drill into each parent in order to select the source. + +This button selects all the source GameObjects for the lights in the light group. \ No newline at end of file From e1a5dfdf3d11488cb8dd871d43f95d7e79db2169 Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 01:07:21 +0200 Subject: [PATCH 48/58] doc: Update lamp manager documentation. --- .../editor/coil-manager-lamp.png | Bin 21580 -> 57657 bytes .../editor/lamp-manager-coil.png | Bin 22323 -> 64814 bytes .../editor/lamp-manager-gameplay.gif | Bin 171915 -> 273992 bytes .../creators-guide/editor/lamp-manager.md | 24 ++++++++++-------- .../creators-guide/editor/lamp-manager.png | Bin 86787 -> 104464 bytes .../Documentation~/creators-guide/toc.yml | 2 ++ 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/coil-manager-lamp.png b/VisualPinball.Unity/Documentation~/creators-guide/editor/coil-manager-lamp.png index 6b875cb46c372ea260a9468f86afdb0da239bf3f..f590b6687a982ace9d301eb010c5a9d6bddfc00f 100644 GIT binary patch literal 57657 zcmbSz2Rzp8_kTStJ4DJ1sU&;dR?3X*y&~N9y6w$V86h_!A|nymnNdbrw;8et*&$?R z`=49$`HtWJ_xjbNhmY%XjdPvrocDR3bKOBo3etpllz4{@9U_#uA)#{U&gu}!as%mI(#TD{tUFbXrZR%q$MvWXl!T0W{9*iGGTMGK|$+7 zhlEAlP=>}}=0rdo(n%b9NG8fT@08gAM9ex3-QybFy(@*L2VjY5c1l z%GtsCU~r@{yNR`ljft(3BedoG)fQ!L=Va$-Zueih{`KpB3;?o~m;W`!f1Hbr&95OG zog`gg89xN_A6q-BxuZl6f9{mh&nchd z;$q`HcS+O27HQ||$o$6(CK85DCL#>jU1R0sVCCdfAsWMXWL=B7j{vKH0MdvR`WE0o3K$z9P5H5Ef1pW% zH!K`skKKP9BvljpAKzJ9oI6k+K|^Egp%7s(#%hBJlHtc=i~k^x|JBGp-gh-OflmJi zE%`pWqn)XftD%F*bu*CN|5ppy|Lf%KY+Xzo{+K?>(7_Olk%@z&2!pAEoy|Ez6w2Dd z*buu`b{AXZk0btTcg{K4o%^j+|8*QkLzn+qM6d%UVBri|jrk2tSve3qrmP54Zhlr{ zqyR6{ke{E6m*;g|O_u?0CffN%RO zIy7_WP=Be6#C0{dfiJrjD0S($#n8m7c21bVC8>l{9T&$!RTnd62TQU(vKiAGzvPIN z;$b+S>@H<~P3+v!xOTte?T2pMz=40n3W-;QPad~^8M~y%7IUkfw=^qL@#9JUg}{}` zVc!{xyu$LH0bS3ilGJ^6jY}mClkXqJvS?04?kCJO?yrvU-}?0K-ied6!fs#x^_!@1 z(R{pre|+#H@D6IHlWwEG&1ZeNnZ0UjHY<-r42Ry2_{Tr79p&(hy=rF}T5wA;@DZc; zCk^)ec_sg7L|+){yBXulc^aKTdFqe18?q&f#_4b|qTBs#TI|32gxQRe^kRyHuX?hz||-FxG;U?aLi|OJpxu z&i(8(4L`4PYc|Z!*vw!tlz$lI>WVSY5Q!BjU!a;+GkniztSMorJJ5rEFsne_QMXMj zR`DBRE-?obV5 z3Pvhy2Xm(l=Q@H{mX^)!Q_x$-ckl1~?8n~wf+9lywUf5Gdh6#1_TtlXHHW?&Lx=kJ@zp-TIQ{!CUP!ZERRODXdRg8KteK+CA&z&3FQbJs) z)!rGSs3MNF&W}loR4ZFvZmRLVM>%?i9w!|sqlYJaY*`gA5#NRArx5SYiH|-eHd|^! z*j4S8tkfd#Fi6TfX4h%){%m8MhuSF##4Jzl>FW>MRc@wjKGwj+VBbheqEnIDDwjdV zF;K>;KEl54aUFX6t`er)j`bN^cbdob&ZIlU^ZUHb?^St3LH7E3ZU-Y~eSY!AjT>X)l4;CjXxwC!+z&mMNcM?Ot3s#NDj$2Rbao?Bv#37aQJi;HXabn_Arg%X85 zn78deb@nW;>w=zY#B{4?b7$vVg6l9Rx#7FJ$7asP(j=Ua+_}t>r?;@!78oq2ie1Ss z(cS;cf4rZGx-E7^%E?JiRkgYO>qybKi069$7rpA%R#sNl-M8-+VD?*EfhD#%L<9t5 zrzF$ZiAc~fth!V4^Yd1Bn{v7XsyVCWy^m$k%lE30-@AKvY;5dBt_tG9kL~9gB;MSp zK8cvQ+;N#YaRZ5mxvN8@(PgMgawXz1ZyyVF72iU_c`h!?Zwn&gHPTX2m^jzPd{!EE z_B;@AiZpudB!Q-S_r~@Kt-T>aD!!suuVP|i+BVW}$l_I3S6>OLa+s723S%!g8Hc21 zpx)lz#?)cVOmldJARV2?MEoc>Zhq zka)=`VQ&BN-umM4uV3#+_mu3t8;y?U8zfy?TN!+lSCQxYBJ*`mZ*N=X;=-5I-p^Gn4kJ z*G2?Mx?&PKC@8-$)!p6w;XsCJde`W;#S!Uq?-d?bgN0`DfA{YC&D_3`5%#4eN!iz+ zWIxWV96cG@EE}~mQ0nq!ZZ0ONO5ozf-V(BpLqptL1wE-|zX9v*&MQD%Sr{dH-~(l~~9&fkU@z2xK<5D*tuZd8XSk%E%@t#~ZNJm^-^O#drz zPHX2I%S1+a)dDYeMX|m!tmfS4&hz0ldmrCx;5#%$rcZZbMr*rH`x5oN9NkxOVS38S z$r5QO;my)CRJp62r-MVVy8DZqoJSfw92`$w9rHcbX5Y9jj$PT?+T0Y-vn;xfI35}r zI>p%A+shKcOs)D`GmDiFiKEr|XaD-^ufl?Yn>U-YGOfVQl8n7wHA_c%ZLiM@I8Hqd z-rSnY8+q*MkgwDYIbgpd$JiJD5x{`WuUlO(r+B5=;7fJ7aXMO=5^_hNsTce)DarB zV^o)^+2|A>p{|(M8V!1>nxkH$gnjpR%0oA8JO@2JwzszeLAk%eYzus9>dPFb1t%_- z;9^KfNZ{B`zfXAMy}kbYW{iiYCoGLXQ;ts1$=uBi!NKu0=hbj#Zthjkevl`cPBbwl z=Hgt+5q#yrZ-E`T21hcI8V_3JUMvzJ2?MMbmb;JP5J5xw){gV7k0GI@;0R z{`Ur**Vn@fPghn90L z5{98)sEylek_+WHsNd23d);wySj1_>^w}sIBjrNeUev2suJ-mzpFe*tw(4zXAD`0D z(4fqfulKI)FDl~k^fML?cxGhR_wt=u%g2v;64#30XmM9_Cgy>$2%%sfuJELgr(vcb zBRezO@o=TI6hT&!nK`>U(`o+ok~NS4Mn=yvthEv=|L)N>Fz}u2Vm^=F_$&yvin!8u z-$#!|F?x7Au&dnK^ghC^)XUqub%M_ItShzaES%%_eca*IoIl;I_$BH#!BMw`k7dtI z$OB)WJQ?=DVmL>kLibIg4s;GVdb%aH5W20gsg#nE`uOo9&(etRzIVK=oE+#& z`Gvhi5l^4BECU(@>e{KjiN;7jzoXs^%F4>K>NR+vgeA4jfnF38HdaB+tIrsw_YbvL(-3eRsm5sM>Lbi~A{tyK%J_l=Fp7=se) zeo(g68G|=2ts^5N9Q#&1+3&QOObrc_zwcatii1RLW>>d`yZa{jBVE@8%VDsNDJyT^ ziHlSOo;V&T)w+>!hLUzjN1cY2)^KwY)_gD6(!zq1&Ia@@bljZG&@YQcuYy5q@l?MO zV~GZ0VRrW6^wQ^!lr$q*s;f?)l{`J)B%{7ePCmE3k}=wsZ+!LY)c}FErY1rAF~19Y zg=TH-Ennme)J)5Q<4#`PI24w;dK0YJ?1o!hu6{+PBAqy6rP1U4P%8f6a(C4rz)O<9 z4VHMRAbN7JR>n*ERzh{Y4MG#4pr9b)_QGrxgHPK%U@wh1T${fy)`N#B5LAg?kdl^W z*Dbli!SS-7V7W2!BF@K3?>84J&CwSX6U)7~U0hsB!on2Q)VkW+!_R*h9NhlWU-nMKWVm+Y4_jHAzX`z})T(Rr&fNk*P5;6dy=t@Va_?b+tZ#o6gqC|BEhB z)EC|IIfdRNUhF8cF$!g^%S0{ev$MCm4U4BVgjq)A9)pzq4`DLtv4mM zLxQPQUYpC<<-(pWPd2+H@>VbHY_2HR;FSC9dg$xxU%U2qULJepeP5HAtiZs)tNWU{ zdhT1RGiVy24<9}l85t2+wJ9Sc5bLX}5*^P{j0*~SPLq+TYxeRj^mPxscJ=k7pv|qU zyuO>q)x^o=QI!75S8=d%-kFez>G@pGWLjD-(aA85E++ZLcMhj`sd}_=77&8W5kV}M zFOQ9n8yg$nl$Di8@Y?uF|G_l?6(1FKUhzaCmv_H!mlZGQUtHKjcMk}`6K<>r&6w*%iLpzQqOni^wb#`3a* z8havzJ8@Sv=fHzYdv3(CH*b>A-6E{Kv|!a9X3-ONb1#A{5nWQk*X3ernr1k!{L6h9 z9U(&}e7j{Bhl{bbwFMvu=%ppsSNJX>AVe{z`toSs(9rJ2(s;nYWKWJR3EHyTy8U9@ zcp#n6XVB53?_;^AVb`DSS@#!6(unf$X;jx#SMvll2wrV8QL=)-wt(vV)<<7qN8i4s+e{}SBqTqZo0?jixGH%cyQ714RXIf8R#(-c z>9hQewH>`@J}}99ojiH615HIqxw`55_0yfR7)o>v>?PRKFDOrk&imECE%SR+6u=2uC4pdz1A(nO{ zl@$QNLZ5m~Hj!)Jnj;uJlhl?VWM-LMBuqlVu3u{=KHAsYtEo}Sm^SqWT=7_`xN79X zMobtTrmildCNeT|at0iD@x|Tzd`=P<-n(`Z5`F~)+N{(mq{MgWHBQm(2fKV67|3kf zuL(Tais*Uz3xCy`W|K=L6iL$ZV+!%ia4}U|-FeZhx;;akW>OOmkJuBdrqJtz5MD)B zl$WmxHT(Pd-9Ktvs#TnyuYAgYr+vCD$tr&K83N+laLr!cppS6yeQ(uL#NborbgIcn zBJ^L`CYZ}nPSWf*akYUvtTGitl$4R`=;*A@5S%$TcnqhpOwNKWJ`n7#E^t_vT#_0(_a zDk()JBt%A+T%hN)2YYw;@SPXFyQH5!eY)MONe!;%KCR`TgK?Sk6F!>{N%A*uMtWwt zlzzE3TAG?Fu@i5OH#a}eS|tvuR2PNH&MxVBL!}@m7iCSA+c*FDb9=hu>Stwl_IFdO z9SuyV`GMlC)s96gKVx5C-wgK}=dn^66>du#on_HvaZ)_Y&$!L{UUmLT<=o|J&RM6m zS>FEsxdO+%ZxM-!BxlZ~cAPNq-CgVJD}~ta6dp#TVt3=UK4N`&Syn+o*#M`vuA6W% z%jU`WOi*wzDX!G`yK6ks6;uWhx52QdD9Y}<&itkyDIq6Q1IVCYxW|jAyL#zknWN-F zm{WoNgb z&K5k~Ax+V{HL;hanMbK_1o)BEV17nx+3wQPZ!l^kdSFd7Nzf_AMkk%Wp?CVs><#vn zu3wKZb)KEetD>b#GA~5!)Kl4|rklCYAX4r7g0mP;ZawI~01+Iw*<{lr2n~c>zI>jU z5dfqJ{!T(=X=OzfL)Oa4$|@gu7YDOgxt)8}UbQ-3YC`>fSQv#g@zhH8Y4l+SHlM(5 zd!+w3`1uKgmFoQ6M_&g{CUO$E&K7d)+6RaW+B%zQ)0Gq= z!J6tCkS&$#m(1LLje_SqW*-%?Q49+8QYw6Hc^MA}2L~S?gs!L?Sqa7j%*}Fe6OGUl z2#7z6d}JREpQCb-$T+wzcIeR!#Ds0dPr=w6<a$5O=bzfI8=RPIX5@GK-zwyU?rBya9#b%3% zCEiUPT^|c`S6Rjs}cOPi=cso2IcDa88Pn!3Jq3^AO(I_4a|$E0W) zb=`!Q+1iEm4|jxc!EX5YG&3@2NJ>c^J9^YyVRYfd zi9kR9Kumr8^R!(3CkcgRPf=Ftt+{DKw@$o<;D8_rk>xiIU@t?amCYskT%5ImK~e^e zLnlPo@#m>otOmhgF-h28&21=1^BV^M4nD4~tfaa-OOu9yTKAC;n6@uj7MY(4T)=rf z+U0AFOiEJxg@_s^u8sDc9dTwI-6*b_d6EnvQ3q#!6Ul3b=Tf|^flyEcpihT*nx=H=7 zfvhiK-yrUK(pWBqI1cW;pgDSnCFE4My5S{ip_iok+@$Cnc>|Tti;Mi~UjfHv`i}<$ z9Pi&{Z@V(vN|2s`%61XCLy1pBM1+45Qy3lER6O+!n)-<%WEv}}8g|%hcM-?|hNJV)|OB~Qf{bruAzcK1d zAEzG>5zSTG-xe`d7Zu{$Ukm~Rww8@kYHob#hP}N#1b0eG?M;tZ<|(ifr8VT{Wwrr9 zN=8()Sf4LFY%st#hULz5#kK91@^?`X8yh}mS;9qqTex*oHuE&v zBr+e!+mVAFfCWPfFFG67*< zy)4Bg?>}xYT1Oudp^S?g)ZZ^q$MoFUnb7lF@sr3P=`bQfx|umTVYe6QDdTS|cWGF2 zY;?0M`D{NH3EIeOX_Z2ZHhK08C8bzJf{^R`_IJ5r?(PE5M7%bL&qjyO&RW_(zCFtV z06^NWr$=KN7qhHIuh|^KF6|k~%F@kZL+EeJ+zbY6^+|_-1fqm*x2Z{XhMK_cI+&Gu zOuluD>-rb%=0z@`=6>*K3jWpk##KV6{D6p?j*ii!tl|>I0?w)zrAO_*RE4Wo=YIxV zrVE;sz)DRgLhbt)NrG!-t?d5ak3-dZ2D)9t&FmVu=dflnMB^6qP~9E<44PaahkHWv}`K5=rr$kmB=(KhEr zcGLU!K_OuVWn3*?>rT<(v9ZjL4D|JFrG}!JijEvP;=xbRA(hB^_wL<9VfVX*b3HkZ ziKqv6n{}L#l|@Bre7DuMt@y~$CWgzOKfl-`g~%%30A%7l8S$>7-B)tQJIf#Vsq^lF ze;ql({EMixKlZxbz0F7vW8c+1vT^4yIVqRFNl{gK^v$;=b*{N6g468!AG*4@xCGN2 zRXBAByw~+OnZBG_|e;O@G`ay!|c+tUh2XQbnlZ7{UuXt`R8Qh1 zL(^#C=AFgG@TD$}k25A7T^O#=)z%IoQ&CX?=7T-Y znt-VCa!xNTR^V{z=&pKQqPZb1Uh~>{t|!l6u(DFMr0pF5 zPo2um!&6KC3xwiu)*x{(w6wH@p+dY^DtF<<&HM3|$BRq0vkZ1E-Q2XQ?LL-rA`or> zaY3E8Ut<3QVJ6S%F-c6W3rOFF%AUja)V=8qNrQ$Q9UI$k`-y4znu-ybMF60G~m z)?$Gs)4cH^(+vqm>U$3#l6ElB!4@x1G%`w~@And+HkVCWn0P8MiBPt4Aof?oso9)9MqLc zSBQ_&E7_au$Qc@D)s5>S?tWza=$(oJs}`|lA}xKB`a&Nw^}RcH4wpTXV&!F`PSNPl zdz5QzZT+PyLp6+6q`Im=tM5RUuLIlkp`5(k?o-b>l28})Z# zsX-#}x1scVY{=y|Zm>J6NkWokX<4#HyFe%6K;XM{mi|<3ZZUP1pYhkJCw6?iydpk3 zT0vjmouHeTo>r`$a=TI6+-pH#cD$n@-UspfEW(?dyWcBT+1@we;2b!zUz_l$7-Jyj)z~N3)uM!hf5e`z+W# zG}PJKD~dqyWPZDtd-e63lQGecQgXjE9^ndq`0%bL<=L|t>q^3-aV9)_tE)~zc~@hv z7*tZ99e!ze#9;wYUcpSW%2?|YeyYSe@d&WR5O7CDP0Y`W6sybr!gDyWYzR33uQp-b zS)DEmmTW9p9D>^}T3T*mV$Y~I9uUjNyPjrkYHS?RQz|u*eDUVZc1zY=qrsBk{MVHg zZoNQs4}-0xW{wVTXz)1kXy4%AMII*;BO?{tg#btry@_*qH9s`cVgKnz|+*{lak2onWdzw~QDOUsXZAY{}CG^sD1KR-Xzo7|ua^1UU9@A}1>l5+2fW>4Bw^y9}` z_O?RCPf^y1K+^|P^?(h60LDKcKuSVlVrnW;z)`CD6_Du_vJ=FkXHHh5Y2*XAmcRid z4p&xq4!X_{RM>dl(sr*)lRqXPFxQhUqbMg^PobGh&`Af@ThCs2-rU+cD*aP!(5Yj` zjx{zmLU>w#%6_!^7;aupPQvM9zq6Enaui?4(HQmd;_Yv)O_rD(-K^c+BdZ;!S#|WZ z)IN4@ziM5=rXrpNaYNpwq2WbZ+UfodE6vUYAP8bpX;cx3;jFqP_iy46Dkci|g9|8P zL5uqVY?&x2*}dR5o?p3_oO@&lEzW#PQ?UreN@aXR_-rFoFL%^RGaZ z3#r}p1uOpX#Oi^RN<(QiCm!d%nHxyt1W=(^u2-)VY@+qyy|JeIZ98dr8 zuCAi@x#GU6p)6UDA#JUV7jj(~DcRI1BZc{?6$v;F-wz5JDl2qHnWx%g*lMTc89K>8 z9rNw&;p6~IzJzympC%_;pGc%J zW25sLM%kOq-{u#cx*(x=fn4r)@)w8RbRz<_6TF74#DI(o7_B@+9RG;dDdsA%1|Ez; zvJEg5ocZ}yAGoQV&+(?p9E+6uLnVlNG5TOVjA$+W{eDL>Vrev@r09{K35)}H&NcVv zYw&17`i~c|0DhVAkHd|Pi8e`ohv^4-{v8|^KV!&$0JYYJjb>v1YPw6BtQXzY)xxqz z@aB5Cbhb?OadEwL^`CVQv8>fgcaPzle)T%@oZCR2`^^UTr{hbs`4@1h2<#IyuKx%e zkR>>nV79;8?%cTp$-1RZx~RWQt_NL+$8BpEYfGi7^{kCMZ_QEbtaI$gn!@`Ts6E}> z8YDUf2R)_U2P(5MKOLni<*wZ5-2G4epT@<&oMXC?+-?_k-fvvK9OdM4+E-`f+%RL$ zdBc13xt*7POvSH-VN`2f2#480@!Jj`qF# z@D|J?TUcj%`)x-CY;=eB=+PsE;6;F^;DKYD;cS^g1Xo#km6LR^#P`)}j^Ip83I77cX2;2+4em{?=7Z+x^nK zY3g^SkHBVH@5B{qY4RhOxq6#+eD zW@d76b6=!yJH7rQK(a8W9PP2%$NxSx;I~}@Fmw%ZnozT$x%mlG^-_$1Pk)vXq*ei~ zRPFCBKBrw@7`hp2jORZNiqRapvA4Ylc(Av>zaL5uhK9T$TZy}0L$?P|Kn~Eeiw{tH zqI*kWh_%K2y~Xu%Bu9mxG0$TeD=L@+8w+)zUHn#rE{n3qTfBa|d*i>UrT&wBm8E{y; zgH^j!48WDBetGP*W;yiQS!KUB&p`3U4UPvuD6!i^))JD9J?~eRm-n`Ms~D;Qb}>^6 z5jT5w%`jot=JLvEU^O0NFO})Xk055zwIY$W#x`IUaNq>K+&zw zj9qV`s-Y{c8D;{x)ZLMtDSiW=%}K}>uU1k3%0Ny&tJ+)3i?G(zj4{o(5fiHh7mdm+ zF7D=tn3^(;ukhY3@zLaI#^=SI?anvGAepk=U5h{)C3(~m{0D-WoL`jLZ!|%=*S;Aw z{`CFsie@`@?l0X1@7th2``ZhoK?dzzxTJOaqFNZZq+9pbjQ6A4)~&4|05SALTV( zPbg99v6gwkYjw97eWVuT%G%fdA$(ia)zM2YJk` zJq(ABips;$$+x@P-=6cUo=&Hdg8Ybc{d{4jbOO4XbGzQ+pB4iuy0BUy;%#GNQ&;7? zGfvmt6yg!RxBG3RS*XPG+d^Fn0Q^=O8k(x@p+%1U7>gVooD#muIS54d)KhMyrKg9a zZ9W;$p{+I9e;E1J0gY01l$ClwxJvHLD{ivm`&g5~}?c0zm$gK(; z8VV*dSw~Pvi0LX@L{wC&eqQJ-Df3Z#h`v#`^vKkM--_pWEHP2~&8t0Lz)4T)>2WaL`=)WEkvX-M{YAK;;YsN=Dl zaJ+r{6T9yw{$G$%d8Qws!$ahNRt2lQY^R|S&25{cE;8#xhVJKANco2i9Au-0GNESt z!tU;F(gLUlu{X?c57RC6{Klr>y;MgLhs!-RjkSj+I=QFs=7cUXRNKqQ1bxPdV-}p+ z!P)sz*v3=$u8M()TF6CCv~7Q!ZvRCOJL#!Y*b~a^si+tx=mXlJ&;7{cQPu9eU0qe6 z4$tOlr=p4Xb3wfx`;!C&pA!z;O^QE9q*DqbU zq81nv9W7ha{twMOBy}P&fVslY<75}sx7_!j zmWr^LRSi9?oOY$%*1|%WjJWJYa;cKGHnVf7Mdt-36cQ;>OC*m}M)J%ZwYd~k*v%4k zOG0;0@5o#+In}HZsQ_%})jeQiP_sZszt5^^BtdtS)G5{_?eCZsvza)|r0wR6)lTAr7Or-9-6 zq`Ix)NTs)FS`%D^p~S8*lARh%=r_8I4cJhLC*jXgloYWH=ChI~U@PP+Ul?d-xCRaO z_Xm9)*F55GT7V&6PsY(6zL^wG|Z(G`Fk*vXCqEiDsyQ0u@&8WrKGD zMR(r8W)eD^*9SF0m4*Fm#kXNceHuYMM7?pPyd+c*xVpX?)72nr-+ zXK!IUey=3E}buYZaVLup8K7{*Mg|g$>;2TI+ssNJd76>w5Pk*#f;e*v2Vd zAxYapzP$;2Oj@bKWN>{53sBt;MIz8~*M=o>A$CF~vX3=D`I<;Ff`MZ9)4h{&3DrNHP3AWEMc>@=y2bBU%kH$fiXRcFRGuI9@CUZFF+Hrdq zjhKuR?t>*ZaZD3{Upj6yH8p)L$Ch|NRRNvvPJa31q2-koRuVLg+jjQ6@-1zI=?H?G z^7t>#CmCg(g7VtguqO$#{TxmccohzivsZuU>_D+q8fjEe#WOl>D&J-QaYfNxr*u4J zV!4WKuc?;UeT&0yT;?5~!Wy7r@^!{tIEe%#*!(Tgm(QQW2@|5i+eG)N=^?{VRHgJ@ zBabXXGEWiGk+2jf-6hHs55&h{9ccPxEL92yWp8f}s5#a7j{&om=H?s^s!WEh8X$VM zm&nWjbZtKODa#@|K{C+#ELv!uLK;mgVp&NfnEArBZuK@KrKV4kYOG13_ivZJbQ+gCbpGz6+*tNhhn6?4{0 z9DpdI9jE`OOoc(X_2Rw$H->j14v&thCI4X`nyuCX7Kxy&jBy8S!Fsk&u?F>ZzLqZf z4bUrsq2}RI`y-=}fqFX))e~No06q5R_{c0tyRuwIyeZ0{3?^gKyuj`2_F|Qyf&!oF zG+$RTWJ7A^P?rA2PqMPAszx}jQWn-*Srg%B#IR-(413EqOfHwnABi zOV@m1vUGwz)_KnK{R3|6Myd9<4Yg#uIXS7h+|lg8jehiK=37SZn>2MS{(5s4MF2qR zqUTnQcA?aM{Vo<0VDt2+q{*rXJ;(`=rlt&{2q=}y6YwXVT=!n<)=Zl?PK5{HNgWJ) z)a#U#nwDy$wxb8Yj}>QIaT*=)3FSoT8c>SynpVUE`S_{%yV=22sPCu5YlXAAe7f4N zdTFLJox}kWVY`!1>}2@}_2tE&nRu8WVCVJF&V0k)At)Y3mmGyT0Y3vF<-hA zZc*kTKLSuvw?gfr-S}1CJw5iLx>O_Ne&fIjYvXxOG?27ruvc#UHJYxF@WB`V`3Br_ z0A@pAbYkSP{n7iv9xGGw-pGhH{c^WtUw7*MaOVU-s2khcBm4RlS9%l046rwIp$EMavf#n@%PBlu|oyTQ4Z5A6V;we_}mLi`!tH(?By5bo9#{BylZl zZKIjl(k7cUG$A(#zea-4Bn`woPIH#N9)bOWJy4xLlOOo6t^%B2{8Q9K?ON2&Z7l41|T!=Kvo z&^OsxSTL)+2XsYohgK%_H7-;)@dV426c;n!`E00=D4bE`UV+*Hw7jJA#(um$)&75! z1ol45W8X>uep4wykzef>+UJ{Iw@;9#K2 zVmWRFTkh!0pn`Rx(@@lR?wETStrvI}O6RxqWB1)wqC&>>g&}V0z7!{PhKlM*`}E%h zr=nu1Y}}JCNLK{YxoU(|XMPKN_=I6+Ezh?*tKM|>W2Rt{2ExUfMxhL<_?+j5-hAV) z+6*mCzGKI8O^o;*5<`$Yhn+ z|0-Tt@BjFpk%{w%w_9s-CKsTl%JQnIf&#i$jeRbJZe(6oPyBN5OSvg|+;=_oNe-i0 z?wx1r*e_rH5I<02^Q7T09yU(K3VLaK=9;}kPo;>*>J9G>K>dB~q4(kxuWlaYtlAh0 z!DXpk7L$)dU14KZBEOU&XlyPDrGs#?UN*UAsymzCLw$KG=yYtfuVi-MrC|*Sx_fMI zvN@)(u#nJTvys|n+@N9q~`oZA)zk4#w$0J3 zX?jS(c=!W;72*jf@_J*MOwB@_C88Mx(0u8Bk zXFTG5CGC=Ms2QHH!JugxQYUHfo9@n0)+arj9-uG1anEoBaqAav1XKw(VJ`_fC?rcW zyHTd5guK8njP?&^teVr`c$TbO8Zaak!T<8P*jjKkCy+?Lac5~fiu&|vzI)SeFD1B- zx|vcOP)#Xk^&%moL3{RWf4Mui9W@m}EL+aqA5>Yx6;kwc>yyAuLqPfjiN{l%E-}gq z3jH@uDFR!F?xn58b1(hf;sf>saTznSrSvtzF%ctqQob`|g8%4PL|Ay@c^9OMS{np7 znwXAB$e0-}rEmXi&1K={>G{O&7x82o0h#G5T3O`yrM*F03?9Y**8&{_w?5FcyRhE)Ej=3y`Bd;%p<4KC`z?hD{RvDah=i`=^ zmauvO*9GeT)&MF+d{&RZ#R2Lp9C{viT>39E*hQed{fGmvjXsvsO$f)tIYd_Y<&73IkgcCWpOI2?d`2 z-bUo0&Bn$CZyGKx?&!bCweJXQ4nl+EUpC@ki?Fl$A_ZSRMeto;u!FcT{xOm7T7#A7 z8@QSIOXT16*qEH&ZwN#vg1tmkogem{psxn0RNKOXUt4%U(~oMc(H%W{)Gshlaby+O zke`bxQ4iMp>s>B^KA-|jO*PcitovSGr+bkGrZ+Y9Xa^}NX?aD3_Be72tntUgxw^&+8qfmthsivnxeiqH0Wdi^1C}^q zE+!Zt=Fua=DGdOTCwU~LrB7U_j|yw#p~*6JS;5kUcX@bt`eLCj(Me8D4$7({KU_rW zJSk@zj4U09Y)%Aa$j_l7`FfOjsU!c~(Xck_7veR!_u%vqynKdBuXFe5BYjZQ)PL%Siub0Xdy3pyASU=S&Kt;d) z_#g94rs6!X4B=;QOP&%-^MhNa$0nINA-?Ll8f&=1!)N!tALmWP%wQyF6SDrydCCKh zJoc~#4?R-$vGwQ~s1`nE5AjFY=f^GO?s1z_p>Lty1~OQX76rua3iqD?>aDG<@jlXl z6+1f@OW0alLya^rLQf6loST3xYe2$P2E!(Gb#=HL2KleUhYtgey+6|3{U|mzBVNT* zQVoNde(-<*c_bFFW^Q(NS1kb%Q7+Xq)EB)tS{vc3jOVNpXE(D_W!6S3!L80M>+_X7 zN_qL7ow}M@woY+yXl!X^<(eY$K5J){yg&A!qC>d6-OB!K7OY}{VHxDjrT-uF57PI=QNf2 z3E86tHT{gaS+%vumabZrzl@EHnwp!}VlFW=D@!CnB^2dCTS|5u53jxC^WvhS&sC*% zBUdZ#G6vORFym6@W5&6UqoeEB<@7#II2R|@mR#%|xCmLL!IviwHzY&F3TdPWuA$;s zxNR-!^Q&~x2#I!PUVeV7F`%p%sv-JcQ&bfbySqzKJfWQMat?AjTthkLVhvFo$ErDr zLkgch{hR-9?9Ljl=vR7eLTE@l+|v^s8+#V27bq#?5);wBlB3<$`>b<>C#ezP2??Rh z(N$Hxa7x6*?_Cj7%WHbaEaMKT8%UKtcA{T`ZDb;j>1lhXqpQm~e);m{Y91~&HlkQg z_LJRRU7zd#8OzDF1e3FL2^OfRK&jDvd*r=5sP}2ClI%$D5StBK8`Gw*uVs z7@MA)Y#ewCn2wqAz$~C=rFaPSSGu$YlWs6T`SaUXP#Sfw0q!mhzOsvvrg9N;b^Qiu zos?(KzFr%(c(`#t+sCoGBt&QVUvvNp#h$&Zogh5NZI@`;SAG*Nf&f`*3st(#h$(I^ zZIxzmxD&&WcH1Zo4L2zV1<_kHHf7XPI+U@D=g&)|=|Uo*tL+^THR84IM!J31DbMg*j&1z7>(EZKy`pi8E8Hp8cf~{Bx3~P!jmX?-C zX~FPJOXhf}&5XnCXwyt`d7N0%G$}-Y@}=ezZbuqgo}|w_!Cv)|tW<7GAX8CQwZ~Is zEdD_6$XcO^7kc6v(iPY-HqxT)^p-Ip6vebmo+ zl2#|ydhy>it!g_OM`y9B7+Sm=^za5;6T48bv(q^=l(VP>0{mMwSRD5WyJdIEL4nHe zl?)eIM3#T4r@EFlB-|P>70Mi$oyYlLaeDgVvw(qO15ZyOF-X>>X+KQ4uEM96ZH5MoXMU1q9?Ki^gweyeazwg4k zgI&0zXatq+NL}hFKnq`FuJGSzIj0cVD$L8bdhy}?;UgQspw;n4XGkmdi?mIJ=&ZfK z-g^#@wLGxM86;@9z(i~VcC`F3a-g--+I$#vBC+6Nt*xyO%~~C9A7~8IP($vmH_zm5f9}%V@6zf{ zdhB5-ff#;emvl9W5)yh8yet1YaT7DzmSFcI4Mk7V``gPU553gB z`BV&;_1OGMOQ%4&1Y|&Ey6o`I&W?4sXR0Zdak=~o>j{)}b#Imhww#IVJ?2Sj zm83_NDBQ!3R6u??C8v3_1$>?PIGrcd^oI>-e zMBObn9R`*15&!5=CcT`e;mGs(k$sa0@-=w=1F`9BpNG2A%YSj^hTMIs2ZfqIP(p3Y zIz9&A6CtTppbyp7DVXC4{jNxCezoQ50o;(ggNg@xMdfky`0?fA;b-|2xvht>JlROb ztE40YaC4?7?aSip>s}TYO0T4!N7V!n24ooCP5)+XUiOi3)6T|*_mOT_Nqr61BrVsF zygtPjnQU*Yp{p}K9-QKH~LgCM!&GDyi zn@%JHwy4?Z>ggG?hD#kxj(px*Q!8P!59fQ8@jR!({Ys-6=kAIG6)WZzD?TevvMn9b zgX6wi%?Uv9Uaj!faXWEeqbi8vLp%;NzTfOX<7LRvj0_Br-VVWe`4<$rXl)}ew05@e zFG7`f{AD(_9$)*`INrzFaOa14nD*hrhmaXDDLtQ_mL|p6CEElO-fFmUI31iQYy7>~ zh`?)ldhr*0oScf171iyHGv&xy)2qNFt8Pj=kAnHCQc^4nlyi;jCR!ll1)^JXE(ew1fJ5r_M&!i)Lqjm5Jv09T_HZg@+sYF_d$ zpo!MU>IA6naOmgj+x#P+4i8$0Gjj=YBkpmnt)9T*J+q<~b|a1y z5f*xE(nz7JqXT!}yCO_jE-G8kVfw3ltNd;&JlB7aB6D_y={#E@`%Ab9D$i$q3eC;M zH83zx8*+(@QT00Zev@1a&&+uyCK;cja?Gs;f{@r6qeGw$Ilp+n4?c^vO%zm{RZc%< zUMAZEtJ<&ZM%WskU3@nUM^$)nL-RBv6(07Od6GVPL(=&z8fU&XDofIt0l!U z^A9}p$!YXV8kMOn7&Vab)-C%3OJMbce+*##3)Q#1A;G~>kE$&T3JNAd6^^xJa}06m z2}Op7pF=Z~acmdp(UeHgVypGGNTJ^IGCMo}q~ir%UUmIfn%hkrjuu@Hu8^o)%dr%` zt+YVTT{Gc4nOM7g0LFTIUqQJv#A&j8kfMd8bI8@&2cAX;R@Hy#zD;#L%sIu+I8d)^ zC<lNcr*>cmm@`Hee#4Knx03pw2;I8?Kyzfc!MJ$P2AL#ZlN7_|Jf?LCzn{7EM9V6`t+_QVj*mQVX^(y%X>eXelM-AbtwmGbpNEfF?>=IV)WX`UD|-5 zD+kkxy)1`^(Z}}784{L$ahGxhy2;o>ceK4M{N9JD+cbP+3-z>(H1>0H#BlN>65vCA z$V#ACdbI1vE`gBlfpm?If1kV6==|gwRtVgCGKzbm`-%(Y?(c5K6y)O22R!w?#(t-= z`azP@D)(?U^Y`~Cf4rC9F*Fp_z7pfR5!kZ1qAlr1jDJ1sj!%tR%-!Jtb%_H3$^8&E ztCY{4<9KoX{-&sz67K~+E!-`_RoZ|GJP)d#lLzbKtRsU9h1jjGCllt$X$+BkF0_nhZE z^P0bA6!yOFPpo)f*J=s#yZ8-qbcGjWUSA3jEcLFokyZ`tg)2N`a^>P$;f-+u$@;`;KuIB_{L@b*3(o;T=Xiiw_ zyDk%qb2_q7%QYuoV{T$lI6?E5wKZEYb? zw;C6yU8n#Kmc40riPl&1nasc1_yO!N!&hv2^#X7_pWWOdp{|b__9P;L;z7&Y3 zWYmZ+pXpzL+KgFN44T}kJt&mNSZz%6aaV6rw&ALPwow2~L&dzg!?w2UxGh1--u8J5 zDb2}Mi^yDHc~Z;6#@1MzeJ!WE<*%m{7dH}Yy+!N-Sr_Dl&?eOIzLbLV$}WkwViiee z{`Jj)lY#5Z7fgn>JWqt*JnUG%{leETek9D(^Xx^{hQ+1;HZi`546ni?xv8?Jb71u4 z{=1TzQK8{tSDE?S)k9N-RyKx)h6d~-z?Vw5-etStpD%@TlapRTAS^t5^T!Wir}dGE ziMXRU(8Gv0uJnOj!Qs$Da>_brAL!M+V5P^!4@1(;X3=(FHWDIUmX{a&8l93SBOf>H z_3PJFcsSH|Hh=wsF6=2ZX9&Pu0QqpF5N*$E z?R3@Ek%ZeHuOuX-mzhROL!;Z^w*Onm>v!E8l(8Jx#OGaZpm%b)CW;(SSu?W(3-Q{{ zW1$T-#0SLCY&VJSo6Bg?BG|RdVL#;Np?IKqc-!zjT^i2qj)e%4!pksiCg(nyQQNMX>adP(8$5;P3!?26p|qN}JnRc-(pd zUOx(|I1It-#vGCk_Rlo*^v+IB@5Q{&p_2&Izy$b`6crWyZEKPVfw2MfzziaQN7eX4 zu%sI^k&b_0;ss@}YC^gvAk3$triSDTT7ZE)P0!bcp?oba{t~=F{AwIjUCCa}pA8qA zbVqgVYoRUx3k4;(U(GerXH|?}(q#EPaIwe#ilPbuH z-N3*ASWtPINGdAcD&?VdEP&3i$t98>o11fW&g?66D87%gOsqTlnBHq=gU*0r87z+a z54&rk@HfCYprtFAkhRus{#9EFX08ydAR?SFoK-kG!4C@3k3J!AJvm6mLFv?L6PIi2 ztU|COigcHJLytYII0a(DpJ34f_0UHI4? zpyKS)#7{H?HQT$pLqP!nZ}UKAo!tu5fFV|BSl9qfCzb*$ve>2+YHDiA?d8BmdmUhg z1P-p1rl1N`=7ixJkR<^s#<@yQOFKF?*3wuDKNqlQ3_oMvMV18$x`joZFrqM^SUA=i zy#Jg-X?%MV3Pt@WoyDql2Y_E3s{k09#`tA&TaF+MG+zbq9;E*8vLk@a>l(i0K?{%= z3kwFO#F48$d#^&E9TF?$A^w?D1fXcRLuX zfS__GdFAERn~;A&wgn=4Sh&yT8d>L|Sc$jN^LW|mgI#`&KIuqs4xCpI0=>1ML)3Z{K3qytc5gDEs*FQrQ$3qs0eqfNs+)kps2qGwkA2yL=b^u%Mux z{{Di3g0F%&0k7i%ingC`5YJaO8?d1}({+sVNaHZA<5a8^SoU3AC@rv*{RdUp5afamZFU8FTU#6hU=oKN zJ{c7p0u%+*UD7rd*}x^Bv6pKL+Ew63IGgZ5IWzub8LfxK&ls%}{uE>z0La1dKA)B1 zbqsAd5TgRc$8fbI0iB3#rrO>Z$`;Un5)lzu#S}eSdI!ifA3uNZiO3<+*9uoC0PK9tUiiV6XD@UJ;zTz0zeoFJ`bJ4>6P)vmi{P$Z#4l2cYmx%v4XV6;Og zdgq|4s|${CivUjae}hLA ze6QbfPTByV;~i3x2W;F!(88qPOU}y5Y7~fL#K6S-Bv9}4gRr&;cD|8Yy5h%-3{%Jz z>FIBFOk~O@eir`iS#dhw&qj)=zu_DlNhQbja=eLsp`$%48`3isjM^xRzd zFQR$aafdSY_9b*;{(&DP1uCEw<9QA+hCS*;D;NX#5M&*YhBy?!0lGEc3YI?gj^DB5 ze!v+ccfe9lx) z%y$tHFLkK#p5PP4@R)66vhmN0I2jy7-7YcsbfxbaNCB7yC2yDrik+L8ni?{_vbf6S z_^tUR99b%X6kK$taoyB7a#sP>$C$2xr9MA_-=kh0mmD1vlg9OU7jogK5`r&$67$41 zD_<1FY^<%@tP7x7%dd(nP7QK^>q66T2!3B#N!xyO3cQbGfwwdT)gt@KdK^!h4aIwv zECp#HFf~B9qRKO#$TL1f?OavW$SRnuEAlikvEJ+ATyAc1pE~I5q?gNlf${qCB8q>( zz<|OoC;X)!olpr=dy_6hdmWQlQaxWYRa(;j(F{sS+Xx^hcg4i!Mrt4L-|<}kIHHdO z)k7qTdNc;dwE@L@QBTs8ArZ@+bj5211{c~0Xek08jYI1PtfpWcI8=iy*#eKJP> zs`=pH#hFt?80}O^6h3uPTx_w4Tss0RF0K(9m*zfkEV3!Q*1H*1v8FR!UtsfYC6OOu z5VX!e;*O5oR33oJ?O0`P1a5<#x=W7Ws^E7ftoWZ0jW@eZG`REA9dP9LSAXjGCpH0t z7Ap>RL@;$Q;IQk8Ao>i7*bZygX^;=JgIqQg1>%*MRnP2E=z*?Pr9wv<7taQ&dkKQUm7;G(Jp#O}f!Rx`x*VLlD56)OR@zE?N^)dG#L_He*e=<>^I z27m4(82|^mf@m|PC9!J?phTVW2g0?~*axM>!3K8%M8jV73Y#$S2GKQ$(5W~KA#=q; zcOS#l{9GRH0O=d<&5_eV*V?h#Kzb|$tu}B}c*~5VdHGq1;lLm~L~vyb5dg_yHi;ae zBsUo>BoTl;)BT!RCLt!Dp~EOWmc%9rMRQcvJh4sLrucytAr&%O2 z4i*&UV%OLphu^aPZi2A&GtN&qb0hb)p{p{Hj&!iq@aZ%5_g|q;L~A)5%Qvm8^h%;f zFzX0|sbI4l*w{%fgWyMPiYb#JL6YVigtWZ_sGl1calr; zihYznN=km#uJl9Q94s?k{YQyaJf zk;5keQkGfXYnesf39B(pWlagTVNF0Thf>ZK7Mt>B!oTwGTf5o_v1KYW+o30 zT|!Q(UmxG?-JB%7tlhl?IlXoU08SY!SyIZRPK`iMmaBSFafFVne-~c-vC#g!s;#{; z3ZEZ~FrOw{S{_%@a{*tD@swFu!tCi&;g7g1^(teTwl=$!mGTJ|vyh-OAc}_b&6HJ* z`xL}ZHp(C@=-S&~Xb&!)6?kk#G{EZg7Q7w_1q|D_BX(ERP6`YQ2y?!cHE2 zm)hTgU1?co=QiYBZO;jR)WG%zSfix?1^iGA+k>jCu4~pRTL6qxlH~xlEHBN>5~=5|=h%$>$;|q|y1<-J$p(c`8MO7U$!wI{o)Hu08iGEOLZIGs$to zYHI0lT>F(Aze4Ed>KlFAMhzBBC86B9i9vh4Dmx-i&EWDA<`&LtKi;)GX=RkFp;t}u zyLuDr8w)8%r!FiK1z0C7B`I?|Us>JdaylF+uB6Ei@H|-J=Jqn6$A3R0VQIo8e%g_S zu6*C%egH>Mstlgiq>I+>aXo_(P_sjAu^$Wdn+gY!CU1MCCy}(WCUUCG(Q*5$csNlS zt0U+o%W12=%TK*{v+o^!{rb6~8Q5f=;8;vfmMF~VOnL}2?r&>9G4>Dsy!?|nbWW$6 zCLcxXR^bCLF>^SxeZjMk`V@k-1j#ndVSRpnevQco?U9iSSPS}EpL{y?@#LS0BospA zSvss<)HJPxs{WNRZ}^{MhUcGSrhH8Elmn`+ju5f-)K!7J{S*|v*j|6mJ<)#?P!cwd zC&k9TS%+h;F(+sPJhUO(r>{m^;8Kw38*l_J zIoaVXckY5_;-lUaBN6BsM_f|XHdAewWtXqpke@GCHg_FY zAA$e?4pK*$sTfx@4o1S`PfTx=^P@Ybd`Tz%0fp*yJJ&kG_M!Y}J~j84Ih8jiinv3< z(Xht3TejQQ-qpVNnP9dE5Ke?Yud2FwkEQ+Xb>Ehf`1bJD*47=BJkq}35XNh$sgam5 zLN>}qMovCx7z-8sWV@vJiWlaG0os4sn?`x3WBzC|mC7SWG+2m>56w4<%O6)~i#QUa zw+l#oP7D+`W!QZ=JggiV=0BY(aPu?p@;6HE^3E@?NjFhwM@|8Ri2DjhrBaiF_D{F4 zGB9~E0reQ=j^7nja(_cRV4rC8>4V4diSiV(gmk+0`Rq|P(U}kRxJzj=Nr@fIiJ@3f zdz5=L z{K?b!+EauRWX8&D0}dG9-pUjoC}_nY6ElB4i(FTzZ^MRY`t*&)Q8sSee~yfV$b87w+jLTwAMTAi;Pnu%|FXj1o-+w zMsBc~D4xaD=);b|dKd2Pix*4@q*c(pkREbk;^xo?{NMl?qO)c_UtL%@ zz@ZU`8{EWrrr6>O@A-or0`IoYT(R-@0pwl>KIBbzszTe~;2@Uo`xNAqd!R;)EV&JK%X*Q`evbgb% ze1Dk-Tt~zaB8-#^DzfhbTA&tYhjeW_4qo34$2y`$=cs>sbg`8o0A&eb1ohG4Bu<{* zJS>V*T=k+^(iKFP@BN=*;^H13vpv~lsgB(Xw950wKkU=0AwDu}I(=GsJayOqag@|{ z4U3QiNGTKC)4t7_#SnI#AUQHp8T=1t zXA4=v+o5wZ1BMsxC=k7b-Owa(>qJ48xN& zMUe9h)M?kD@~`#m(raRVBV6#8TkmvDTy%v5JY2c{m?=QwMgteKP!63aSBPMruc(|g z7-;q1#5(Xp%{2o zxpt=m!oli=7{LLW8HmI2&Q6V{=HhA-*+0$2jHAR^*y5WV&*QVc2N9$u?AbqdU*YKa zWeAxDANdzZWLa3`eunSEllO15BIxMo7|By2P%QPwa&6DaGvnt_(SO`BdQ#xz?EK?v z3sduhNPWxbNG4`Y-o#4Ood>aQBAM~0vMX=={VU_7Hvc%c+@Dmk@J|wQlBw*j_^9@c zZLY@g;YK%PxeHh=e2)|qzzz=#fWLrCVVvXTeu>39lFj4o%LxlD_odrL7M!(+kTQK) znINqKTq;?s=(kX1Je?jIN|k)8_LEesi%;W~pL5R?@<1M|l-@m}NA_9{#gr<4eR^wr z_!X{9m0e9Edg6~DcLr|(tn*8v)NTIPjX*aOE$DBS&Jil{8i4!SgmC07-PK_PH5-0i z?1I>J_y>D217B(rL4`(yZZZ~4y{*h zHxJz*dDKp2W7t>>r1>xG@6a<+%)A6$@1)}gI4k2VI%IE{ktXQ-u;f4;*WW;h=~wbz zR#0#-yhvj-%eXw~$b8#?RV_Gzo1m;f7{+R9s;Mb!HQluur^kEe4vCfJGcAj=WBqB( za`Pd$wLf=jsH-Q0Gdd(rofRHF;@#W51Q^WHPaY`}e8tk$PZ&>hx|n)POSzmrL@X&fp&3yN+?j=NZ=#hZ8mmz4a#W zq^v|`Vq~-jZz_oc1OoydCTWa@t}3#&;x7apwnredrdkaAoFW7h2+E*}mY5N!tEtJ5 zwRP%{1YwY_B(nXwy*_GH>wa9`0v`V0{lv(abG+O!U~FJ;&r5~h@i9p|2O$j|9n(v$ z7gkAv3|)yk;GUqQF5eS01Uqk?8fm&+rl)*H5b_NC)+3%eeM6QZ^a2SeHNDiEoHvtk z85S7}^PEYU*Lt6oT)d!}eTCJQiM#%OrK!Vv3|69Bl5%mFP%0qVgSEc@)RaK5N7!)S zx|V7%N`l??kvjyhp6{)$=~D9Xjp06>Ss!JUp{Tur6KrT7=u-!t2~Mud%)q=KT2X!WVr>)I2y_ZU>x%@2}s0i>dehH0DC#RpEx3aYb z?jT6N)>ddYT^h>)d-E=ia;O%!qCgl?dWzKKkrhq^ff6F2$N-nJ7FmmqLOKh(%1V2q z_VM!kpuKJ{ny0stuONfRwwP{Kk<(>as;zQE(y4|ffd) zEj^Tko6?M;|?iF$wxhD8KB!%`+4QQ`c#@_orD;kw3%i({krpGF|uT%{BWe#dVcvBZzB zwxIO{d+}Md0ZYI)68_HDIBwjC{0DU}a}cR1A%PQE)qzR!`eJYWeb%fgc7#r%NGDn+ z1xyRTa~-{Po66M0Wa8r0^1arcmTK~ZqaQUkS{SzXIk+cp7wy#L@A?`)M_(o1num@Y zWZ9ACmll!SvS14wmTa_$@LuU5aBl~v)<0BsJ5RY5u+;nyL2nt1y|KC31i>Z-nu8^5 zO4h1CBih7XOiWBhog-*y=jZ0i%#2&&-*a`=vvV`o={?TG!o?6~NWGATPrS8{$G zcxOt>%A(&ef9}cgWR~oq2VvfmHadU?hwKO?D1*u%pWo|%!zs!sCt>ux*$%{149V}I zJN`BdHyH%}($H_QxPR-?-yPc(i50~>am`X(ORGFsNVQybW(<6RkIpXT1CZR3B)d)9 zXqNRbqdUj;4b7_s1BzB2$%4hj2VLmOLHg*sw8()Obh>x5NYIK(hYz4ov3@U+`BRIq zsRS~fv6}ujp0U0MOocn_6!3`3Ay@)aNyimI);Qn(ZOQ9+DW-8x9({laQqFF2n1~Nk zj%pk~?BzxjrlU;RvvH-|T|ha1o*O)W_O+ImmiD?M(?~O1I2**xr78;^$Mt$VbIu9XhTJ`)_OvmcSxF_^!c_W@>10pN#3)f?vOEJX3bG zmgx~HT863sQ&VxV(nnYKUpZ%!jxgEjTp-Sk5s8>y*v!g!<>w-=$(E9Q_B&)`XJ0qH zvLu^*rl+QYkZ~$;An5Il4%OMt;0Zvr9)L=F6PmW`ev42wSh1a&8FICIzQ=&&(cGl6 zU@!ufpNKA|fF0%!gCO4-J8`^3OteJip?T$L#}T+mE$e_03~6{(&*0MWbJE+ld4JH3 z>VyAH6$j#K{DyDl3IGz-S+VT;9pAxGh?Yx+Cg|f0{K~vMS$2=a+H55_X!O1JR&mxZ zXOa~%Q&tB}Ilf}V_)-Pub3p7>?q+S3&e+)9W{Cbjb8ukw*huw1a)Ci8w7k@1sPYT1 zX1^E3(Q*h%-f8!gB$MH(3G{a-CXKIc@FAD!HCm5m1 z5~>J;l{Hj1X^?jP4_#Gm5kWOX$Zap1VX9{nL23#*cD0s>snu16!a|luYd?RgF>eBi z&Sx_CvSk~JeajCFuJ{|t@c48R4!*K+;(|d%(=byG#75B664w_(y_)^N6Bvq)jgk)^ zD8OOOn2HkI!LI7-i|MklvE8{T`fV;Jp^rto9Hn6l#7QF(M_>vAYK!8Y{BS>T4h=mG z^4{Nhw;(;HbdEPJ4ZVemCFYfPuTaaurXwzg_$gSiK=~fK)MeYKU%|5{S1x2A=(^L| za0ZNJqtHE2evoB3FLgbnGHs60fWyYz{Ie}dRwsw&ZKi%~)5&T^2#tB-1;Mp>ipOvC z@{jwIV)6|KGjeo5A!9Vq5+9$c;Ub4cq)Ww{!eEq#O=gpF(tro?&YR!ZaeM?bK~|#j zXMF7& zLT;u7!W-IS@c(s(c~cN7fDb-MCOB&VOQ^#B1s0mHFCe*B$t`JU`08;6!>s0SJZbWJ zV*HzW8A_SZ^%}&@7=^G@ZGVwwUX#XYMqSI1^}}VD)`Pl>Ct>;m%nsrvnS!~xBFnpAJIO|a&(9A`~ z<2tx&hE*&j1fm-m~ejon6muEdz`mM|qvd zO)w@U=;%GR=n5#{a?7-?fRcaiyL=FEv;8Nm3SaQen}-{=n?f$x^uq4%<4s#2ygMN6 z4B1=!@k2+qG^5Dde7dr>xtT(tK@NwIu+q3Q4D6YbfSm*XU;wG0wOUxCPySf5)I{3Y znEDxF6Cc_11y8A%3yTEZ+1A$Am7?O@_l)no%s_N;$sq(Ay@=h z2lGh{7YmEWn(|G7*sZ<2kf0zeG_;lB`$&KlI?rRMokrgr)@4UnKgqeb>ps$3K8K;N zYnExZN@-lVi#+SRko@lSzx-~t77WB8QR$iL-zE%Q%s%RX_<$^q6p3P@fR`$#CU{u0 zci1~R?m~|F`*+rwn0xcj4*AZ4hga`ONE*i#cT<&iF~exu9_aE4EuV))TsD!2LAzoy z*z$C66r4-#Be2>WJl|YpplpM#i1xoSfmrOYPk`@vi<^m<-x!lAEc9Q_EeR$9F{>Y} ztz)d4O7{b3Gx0B&Z}^W-{1%-%V&xma@fNfIOrhtK7nC=xRVXq!{R6GKSk{$H1jvm` z+9dptKW71rETH1z=a|dLoBtQ2{6+I({6?4Xh%>0=H7_{X0IR?11$)YDAloNO;H$&; z*YNoVT~`8M+hXI3Cqh|x=^qOHL!$(WVdupkys!JRn=tGGxiunHImY@=IGyw_SU&#h z7$|l!^uLeQ;VG;o z_)VRVwDlTf1oHCoPi(HW*sHJP9%mpI9spz?hZH|!uvk~aTgtUUyVn(`rud5Gz40Ml%EVeMy^FXsklH7E;Ty?(6`p>_2cKN9O- zp5jb{&nqi-)U60q|M}W?u|G$^)1Mwky}|&%Kje{ESF&GtN*-8?EKrdJEdO0eewk6+ zzKcFS%|KDZ4VwkF2=LT_lU1)*1QUb&${TIthxx^-7td(P01Tjc&Yp6cUmC{kYcj7f zA4-euI9gNmUbno04Z8?=&K&60Q24&h`FW3J#96=x_dW}MMiM0gCY!;q#`)%(3gE{8 zzrzgPS3a+vjYvN17yb_D-Ki$}8GC3*cM8qN`HSMP zKs=;%Tp}Zosr&$C$e99;H-rERWlS9Mpo8Um-A_sYx@3LX4S>nPls!N}z=2(^9j05! zDkw~rW?)mJhzn_PU!2Uu5(|6PhgPbpl0>D^VY_5_*NpPlw zSx9Iq>IDLUn5lhg`|$gxXhXwH)y0v~yy*kvNCfM-^RVny^Z)*_)=epBp;c&|=$%lg zgySD*S;%;}@i511o;>*q88a|7$4B2&09G!7&Vt~gBv_{S8DnN|LC_3!9FVNDLdD*a z`}F_=14BS9C0w5{z^$f+6NYJR5IE+hBOW1?dztn1 zF%frU7(h;3IHTQQL|7yML*8a8ZFH=xn9so${t+#VgBmC{8tA%@oVJc1Mu1d#3@gkN zGYUuvurV{A94>}~1EQ_h?roJJKwE(fZJ7IU2$cfE40|@t+h8l)2-Ux^Fs!&0voxS@ z0S(5)zyM5k89+=3RUV*gm6`30;#r$D$u$pUQY z7NM{U)qVhcz;D1m0(zpMR|<7&lu?25I)mgfA{1O46l)yl_igVusSFWy=4iUtNDthx zXPiF-Q+nddbDqDSV6j0j1s0aS8a5HpTz#Ed`63LEgxMAO3C2*lf(juxD+F5V0<(Yj zt_SW4AB;8yl_mHwy%u*sYI2_r0uWD*=gXM%?C9hK22C&$jzdKkyc(bt0Iw{_+i77i_6Fa(QXgb)1HGwGy55w5-^zxK}KeiWfy{vU_o?tc7}(B z2A(5(yHFWLlC+{80Vwd1$u`<|c6Q)x|Ae>>m4%gc`MHr9dMD)PP{G2lJAHjil!L$q zvL>j5pFX;ofF?H!>^S)RzUe~%&+EFN3Y}zpS5Un|UIzs=*2{~W55^4)m65a1AG}tt z_WpAY^_zWtR}iq-zW_n442o#42G|=4E%&@1X>yHW*MF8NpwK?mEAMcC)Teb}V24Qw zgEVC3Yw1%EIFzzEH>f#=z|1e!jO8>^+iCSTA%gDecnAa_tDm4%MuIg1au0|m5+c{e znwu|i`GjDCBDtz+bE*RUB^2dUxcH3eVgMiqMDeY|!-t(0&+HQ{68eyk?|bm#alQGn z*WuvH)D_VCiGpDKzhHalxCPwPRa48r3J(l~HHM}@2~uW;0S2>=b|HM@Q&UW4U%(p- zfbvIwAR00HR8>&{3J+gDzvYz`nQ!nG7Z(=bWQC!Zrn*;dMV;fX_dC1?mD>{GW?{Nh3yeahi{gT`Jb3yI)k8_iYVb5hBIjSSiBurlK^_#`iUJ3u`n*X|Nu_xf z$b7?Ud_|KPVLPikG3k_@X{KYM8da9X!!ZjL9@-ZaEZD>Z#Q7lKfI*Idm!Gu2wC87L z>0{5XfI1ExB#sMW>u@7V3z%<6U@6o(w`Qqwo9MA~B*cT)ie+!Oy{20c{ z8`2&0J5n(4hG1g60Fyi>R@Tw%*2AiT0(qF07E2~I{@SM7B1=S4QnHJzucs#gN@0pA zqE8w`;2 z4;z`_yt%Boj9^a`wDaNF3{)|QU|9$cA%z?i`U0X9ZPoO$Av zih1X{+FCn8JPifa4H_ycDsW~olZUZubVoLLF9iYu4-W|&k;7U03rkCtwdky25aI4F z-VaMKzA=+*Mc$0`Fw#&M03c^OyDb1PkOlWUcffK3k4c5>=DrwLnDrBf^HbL&XK>Af zf4T31$B)HI8d69_1w)vIRDEIh&N%lMzV=r(b9UxuBZAR1x4`b_g|l;~O?&<(R0B1N z^x84eFfnw5P>_81xa!M*H zjxblLo07}NT6TrAN<0tAh5iQ=y#qrFARqRZ1l-JLK+AEipa6n~FkGZM4R+L#JN4&2 zkZkj8dn2uh@$Xatrewabc)n1X=JX#>KXDr-dnkQ`XeNq0a?!jH8AMXRMFAN3%_B<{<+2w z1tucJ%uRgeH^M-II=Uh(EE^L7Txir`r_<0^SIDid*7PROB|W3*Bc=&EZ7v55+I^QN zPu^QEq;-cIQb9*X;QG4`jz87cI=(<^3qp@KGBNcXWGjG^H8wSotAB#JD#r{szT#c2 z_50nzAr_;NK(gd1K5?L4f!T*<_#H6S8>XM6?4KI85*N;^ajijO{N#xza_;x_=+6@q z0oZ|Ma1O$71}G8C9o z*?(oGGkwYxHg)}5cwh3psK;6pg>gRWqJjBHU$*KvZnj@7WqD0?(D%ZC3IdZl#}M!5%hPs887gNgY6KP>#v4(G7ZL76FVOO zci+B28g3#jje4voeeL})yu8m!up5&S6N3XY+WsuPQyf93r^Sxg{tYrHP$tENQj>*{ zMPkvd{|9#u8oT&-Eg0An77`YEM=%osS4rbRRMbfKNSHmVy}EyLk4GOwm+u#^A?M)1 zof7RCJ^EovV~ua`-AfEIYByQ=Q<#w4dd^evOjTUVjYS$NHkNEJw~yhTPq2mgV8m7D zP^mr4S09t3y;56OXP=vu^)SVINkvlH5TXPJJ|-p^v7W0-o&SN{3)p?Tw6G{%d|HL+ zAvNp%#SXY5DfBTD-0(QnQqmEcgm^FNRX9%P*?!=O8^DBx^I9-%D6RikZ4SO}q6P?l z0u^hTat2Oa-rrLzGR3C~T8V$PAQp{(k)wLF*PWYQzlD>KNP0?WVBn|nvC~KsBSA=m zAqs;L%C8Ks^?rj3#=ng0A1Rv-)ugbFK!>$>9||0=t($O%1hO*xV94^bJB6lgZ;!s} zA^ZjKG=bB{Txx<+i8#S|up$rtG`hxvRTis*3c-OcbAM-I6xq5Fq)UW6cK z4!kw0t3exlDMP{$m%N{Yhu13J@S`XgsNy@0+%qtsXnbXHX`>e~a#=sQFuQ!~Q50cO zK0ZR;kjg5s(1KvGt8)Bb1lny#0K#23OgX^Jh82k3$3@rd|g9L9(TZ~3Z`AX zyAQDjlW81ao)K7K89(sNxgsvIBEVG!vZcUqvz!-1Y%fdMV1R*$ zkdWJqlUX^HAwQVrsY9_E=E0`NK4_;BHA_uUiTg!$3bR^1KVM8c@&d1BklV>nWV)_; znKrlgt97z7Gr!w{qNhC7B@IpwwN-$lO9wB5K6ryO13`;`1m&mgCW1sHS3Pu@81gU+ z8wp?O#O@D{*k%2En}x&(({Ha!RJF9?fvb}7m!^K!Zy=j3Wk)Q)!K$e37RN}As|cS{u}Dg z1*0;HZX2mrRGtgCH?a^Re=1X0#TiKSCB*lUWw8 z!!=z1rMRzrsVmP4>`qsQsJHbBd|YE$>?TT0gN1ZI$`PL>Ho?V+$W2nC#g0%eAESYMqA(cT$-50L zI)f|!fX~b5OH#g75kOSNR69q*nB`7cu$MJE43m@orAC$nm2lJNPMVN2@L?M-2 z#JJGQ=vfxw`~%1>OXeFA7p5~ z2>qnN(lI-$CvOQiWQCoEQ0oQW72tQ3xjj-Cq|`xAZ??V>9b~A}^HJw=1wmwmOz@CW zzC6#3P$BjKKl`S=z-G6{c_}+11~HbY!8S+*$kgk92z{n77L%us>>~`lX*FH4^5y5I zR%~n%dA=YU9zY7s8Q>qS=M|ZpYpJMQO}yo(5K;$k`yNFIU;J;l_#D#~utBK<$*Msq zC<>93tl! zOh$_cp3>9TXLnW7BX3PdL!TZYHL>zr1i`N-)y}Is`O36yU%seteV7bZ#3m1jLGLU+ znd5!=pp<7>lGv=lt)aljBG*KsAmd8$>!-nf*9)_D49mm!kMe*xG_Kxyzju%v{7US9K+WG!FsgUP4I zA7RV+tE^i87n)D^6X6H~HDHH9mZSZ9gExb;_a#bjKJO{g4Q*9oWP z?<+gE>HX^`CN$+ui0=elPt#~C1Rgq&T^b~o5-BNAU|2VG_6=C|k5EOOsddT|#kuSs zwDhn6Tjwa0kT9L@9K6>|$g)!xydh21x@y%Ziit$T)=*)rZd}ZXPXD_1FFm@flBG0Bw5HGcT{kB;FzmCfatgwx%5}k{ep`JT?2~wP0A* z(;MY>_SOGF6&d}{O_=!)d`ry{6#Rn4>U|q4_1oC@Yl{=}wptx+ZAi-c_cHjG7JrSN z#1f^xHZQ=8)(FrFl#6$aMe|F*RTIt%2(_Rcn)8}kzqHlW>82By4R(C)eDVU+gkC-=thS$Gk8|EY#$q0ZBy^0PA z^v98o*&l#O^n4sL6;l(yLPeb{ulZ11tSQK6!}Lf-W-OZzH8Aie+08!mPVmh5p?@np zC~Tm2`Y?TupJ*b7-8eh)dMfc`!5JHd*w8ikqlvFzg?`AUbiYmf4^oj4@h&nlsv&mY zXtKH42k3i0QFYXp@9B;>)d;soo5?WFN3n5c#?01R}7pDf~+q zFKc+^f~`I0e^B?>56Ssn%MdO~rvH?ogZpxCTfU&OBhGINNE9pFPw%W&r}-hSij+}M zNG|?}w5azsy^1>H=9C0(3?-u=2CVne94)LF2h#JsbC2pjv~JFdJX9B2O15hkp*&|4 z$yhc66ATtW&vSOsk6i0Qw0_!zx-?47G*Rhk$A&;Iy30 z7Usapmp-`q@=JSXi3^E;;F!S`dpSaK@=euwO{C$#Z9Z!s5&H3H#`yQ(aBH^IAgKEY z?-fa~YxgLSrVudB(|xYy!kVJM%$x09mvkU!!y05~>O@6^+r~4YqnM2W(^V#`%=eI@y9pvmYu0CZi zFVQ(ds*4*SepAz7Y#C;jKmO5l=saC11pV8$ZzpDlObhHbzJJ%yt%qLUqj#cgmV-PG za28?ea{d{cHG%yn6NcT(M}l}AKDbnR$ru{^y*}5`fm_p`tgwnTba8YnqZ51dDeCmi zfe#AUM`+yVm>Z%=qaYlDy1^dN=y!cpGmHv%If`d9BflashlqMAWxfDuXly9gFQm>B z0uU8UN`PKkim2m&JdxDIyTFQj#T|kf2QkSN`XS9pRuul42-18%E(~MK$M)fma1q@@0B7-VZu&!p!`&_?-MFP`ANDjqor z8$0{Bzze$om@$t;M8V;YR6U(5OPT$ks#pO!xsph`8I5a3swYrhBtxBauSzJmlTYQG&hheCP&IZhZ@(U?m0Jt)im&69|Lfgt3)jf4>9 zrCdXb60j)2Q7CiA5lU{zxldP_(2#v*u!(_IJ!b(-asMCq_0&-M!)Sfpw^v%oU?|^P zk(+3pFrv|{-o!xYqkX82H1d)SumjEKGfA)Q1t}<8uBf`X)dJ(&7t_DAzB?%PUFq*R z8*{xLs$D%Vy?Jv>SU6Z%nK#La`7%fs@u^n7MjB~~&+@EI3x+;Mv>2IilH*hJ5@Rlz~CM&0^sWb;O*K+0(Svm%;|SzCEsrmCu{+h%kW6!-K{ zm1S~Ir*bFDHWSHoczjm(XCZ>{hMJ$&-nlnDQUhleu+bV~*b=G!vX158j^zdj z?xABDM`VC6aU1*hvxEjTOh>k^UtcVLQ}o=TEUkL8;HdR4OAmuwWMy(+d}T(W^iU;~ zSA%^QN^bHO9klru9sGN^ZvO#E2?=Lg z5p~H0+T}kSGlu~a@S_ST>QW%*AH3Kb-9SnmoRs19-1qRPFZC`G!g(7PXHKVqXE~=l z3=*M!c0{Q<(foq`^`9zb!$?Px^Z!v8_^)sXDqmq`aAgLChN`_We)KN>JLIQ=toG}^ z^xHSB6W8HzgEs)G#WU!Ckp5z=gaON1!zg7Iwa^`1S^|O=T3PQ{5W#Y&O17B`46|oI z%6B~Bo~c*($^_yiWZ048^uvWm4z<(YtxAp<5VQZuW#1pmnA{yoK11Rvi4y&i~>L%=BC^?CX;n zdKbWzUB9`x-#Xwx`VO*{2^_xAnev%fo zy#nKUhgW6DLj0BB;9x06?uu%HYz@uCo{;fdzuZRibZwf8mH1Q>l0k>XsPN*&f$t=k z(#Gh=f)VK6zo@()WX|94smxpUMZKeiG=lfh;24h)SX7s(m06~$2c=z`5wV$(mSLaT z028wf^xQUzkZCREKPCxg|B!oPY1!G2UU+p*6y>vYyaBX@a;vK8j1>cGKsxCmTtOqZ zG%JF8X^I30JL^El1JZI_HPAYqy&8dJH(h-Bo5gfa6J1ip@q0w>z`O zPWoIp30ohhqcb;)5;~5Vg-$Td6L+DZsG`*JIk~_jfa)tri23TqM!grG#vY13Uwx|= zFD3O})N{&ivbugID@Fwd|ADN?*w1*9eeDtJZ=F;?)-vpm%$4NkG6-asxg53u{#hqYTq5vy2qJN*y z`TDxk2R$)?6g757b@~icB1+AC{Lp;5Jl^GfE@0_7V7MNc7$c+ffwvbBtZvj?K+_u$ ztdeoLgcj8|f_02FYp9s6i2nsi-?o1l1sy%HSOnUsGA3s-nyz1En!FQo62x2I9zxY5 zLB%blDKcPQ5$Dl&un%7mIn9+l-kO(i`XI1_%cx%dWIxS7%OaSt@O-`vN^)BYlW+fL zBJ%%Qdkdf{_qYAmCPkzq7Ahqz9U`J2-7O$WH^M>`K}wXA1=8K!DT;!`q8n)tfkhZ} zDGldd=>Elf&ikJ^XO6RH&z?OfvYzJ~_kCa2=PEdREsnRg$$JBOn~^=BF;p@$V`643 z>S2WD?PF816Y+O-bx{}6q;EN|8cJL_70!T27IrYs#iQVQSP)!X&4a_f1T9kSCrF)- z>-gCZ@d4GPSv|Dp7 zfhHONfu6{fh^bwGia(M6N=w<>GhH0VI_p3?HK(!9?B#%pA@P@BB@b@r;^2sQm)Bhm z9?^<_WY)N>8192PvTuZcMb>Z^<;$sfuo(o_ln`WWA`BV#0G8NXTShsWi{^>Dvdkfd z4S{l$2skHpxNWi)ZBktOsW7?MwbFnSF=KE>`Os7vQPN(Q7#qtfu?n(IZiz&2 ze<_2m#wv<&4>H55o~aN9OifK)IkPqgZB^2(3hJ|}6De?4@3XigYL+{!kXM_wT&3~^l#ivH zxoK)Xr7b5Xr*+FEkZOhv0Eg`SElS0h8nBPc=wC_E$7HF|v)dJ``L)xwJSxo14V}EO zxmO#TM@42Z?YHmzpQ3wqc6N=0ZD=zPS3Qxy+?U5E&?mjFAVTPKPuI#7m={k|x*`oR ziDh(uT}_Hueh)0C6Q~rRLEJNM!cNf7Q4%UA$f^o!t9oovP$~RQ3>l;QX-zn)0}`mk0U8c%Z;CmaGWj-T2k( zlv(!BhPcRuWB%e%N^tQ=ChTD14Rylw@3nZ?_~H4sXKee|jaL1OMUW%a@4EJ;gF4Aq2wklQNGWOMVjy74xmM3iI)45E_i09CdT~ zIzFz70qfMT#ba0j02wHkv;vnCM^XWp?+q1aY@urp^OBE@-YO6~7WN!!GmdCt)$h>k z*Mmo$%6rqI8?kxMSR~)a+4SLzc_VZxd>3!13QN<+EE}InNy4PZa_W{zu56B?v0X=< z-q@5d8*A%TOOveci*^R-Vi0B<9UX0QriDNLkFee~s7eH8(x5=9_qx#j@oO7S1OD#$ zE@ubWrXhYecB}LSkqkraw85u+@3c1EyF2zsr0OD*LXEK)D$p{3YnYNaJ zGBXe!;?aO-Kki(|!31Tjzr>-+1S7H|d+L zmDLVt#{E9JI)K7oEBQP={zO@3fu~_*{zC7^@n0JGDIdh34+kHSZ+7FoI*=;pDij3> zQ`dMLi2S33J{GI6BC7ado(aMVAk=0bMpQni0)JU$A>?ZPBOj;22n!2W=2S{*&U6>O z%FWFexCrfD96xC@3sG?R%$I}GePP(XZdgY8&1KPn@Wk?Nl5CvvaOg{b$r8&tU}2GU zv<3&#I=v^XFZOnUi!u#x^DMv@gpxJ(JlX+tN{M+q>X1Q({h5=fP48NB3ksey;pgDs z;N^V`3_<7{L}D*NLnK&zKZtDLoq8w?>LNB44wAvjg}PJ(!>G{Jt0fLCMSlhD)UrKN zOs}01A}fY^dft?C-GXAbJ-7m38ob$T92^KLs*6Hppjs(lik^dNu2QC}tLxu?C2$BO zqIuLyq=bFV)>D~e@8sn7Pq&(OG=RT_SZR&BhzA|&}-mJ#(Jvup=Php6=;4I`2_T?(bpfa z-IyAP)}Xb*vm`N(TTGJ*oYh*!hRYUR+ij&cesL^!ef+;^+^bt01|k|tbFo56?+`hP z;7O0YM|+>NSUlK5;xa+*4xN$zquhOvKJGu{?shN#%H21_;vRq?nE2AqI~>D*1i`>Y zCI@91R%xt8&@x?!ZfIb*abxt{ASEyen^b(@J&1wnK38i2PFI~?+u&e{zJSwT2=x_Yjc6J_0oR?{8OWz2gSZ5J#9y8 zw~t}%cUFu>@RI7mL1TGu^a)j>o z43`*#B&kgJsXq#Oit10*9!GDEEaiXf7hLP{}r z#SkUVE|vYzF`^omCx{iJQ@%Mu80XVWO7NG4&+&_^)>eK21BUMleuy6yBcsQ8hQu2n z6O9~fd486PZda@M&nJLW;*3G}z;g;jQ@}hk;Yo_0`0a-7DC`gK9b*CaV!=Nafp?_e zmk*B)ZXaG~zYoy|$ZfBhv$qJVbdP^P-eY+)7!^!6Y>H#oRNCP?Ulv6C(E4{yLDUo* zy426F1qdh*^|^H|)@&+kW+?rn&L9#Toc{xkkE&7%e5RiVZ}Gi_JA$>psfTH?p#@$x zLAlh&(DD$gYgmiIi(OW6zLJu`nqx5h2|5$)TOQZ%gJEFd$yJBt<>dZJ9{8aa#d^bq z$M5>A2q&l>uQuo*Mj;Dwn&HfZ&9A<`KEJi#NWmqxm}mSE=yGkXqt{vHF5 zow?y`GSd^Is!@att`uUfMcVM^cQ{=QoOH=vo{RQ8@;pq|tbwQmqXw^u)9$UtGClOr zu-aO-Y4N&{pz+T)1o=ISFKE`%UyH=n-bqi-kPd=$ zFcW;&Jbr0mOvQyT@#WB?i`1a6rH{Gy0NW4zZ;Ah^5gMnbi2y{!b41>!!4YGw0YR?E zD=k(KUApKC+=XL{Q|m()^RWdkkF`MTA24{&;HlErzaD`rqF9eWW8_U@Yz#sCzYGGV zW4JAkU3LYoh?5`?mwkWoIYe0TLkN)m$L} z$k$f}2=&^9uldO>Ku;wGhBzwN?@%-P2g#X6cbNc*$#M;9g;h}Ia3RO^8_zCd# zFd0d{foE9ZFys8JU&I+9P1te>ytc1JMgKv=fw7g|i@3AeIS@H8ery zGpOE$D~Vy}V*{7T|DO>1K`f7E0HWBpwnW4ZHv7?NiH73EFYi~N@ff#_eKSD1A)F4^ zCydS=A3$k8PyvfG}||HPzJ6=%{pZ%XsJH zD%*;mudY+=>;Tc08_U{iLHT($@G~$Q8J9nvYloi;4s>t=PQqOmY-=!A2DOZa@bLQP zCIm|y{J=@N?FkDJcs=WzKQ;ENpruU3m;b~%6-<86sf2IDH^cm0U7h&K6?-{1e*1to zEmzPdVEu1S$R_8*#^F8fJ#(b$k!}(fcXan=w_g0C!C`kdx7V)~Bn66!M&B7r z<$%5$HYN!01orD*D{joK*1m|&3b1g5oHQ+ffJ6`@#zbB%0RTeV2r5=fq(Zf1FmxSy zKj!NckdtS6gLNq2!~y7hp9;tFpm{j5Vd`+8iGfd0c65~;K9@3Hi7t58p%I$} zFgzuc?SI$?oc?7SxIqqq65zH)=!JDNnhvr}cpkaWT7X;NHzU0dZx7U#w61F3BOSuZ zWw1vKL_~0mIoRrt2h%Fy5dF@`w$SgE=IOSr2+>kAEd3Af8qh7uy5Nzq2HEcBKBV_Pw;Az_wYX zJ2PVn(}^{1)%VQ`6h25cqD2(q&PX8&FD+v%>u6S z$bH!EWm;i|4)=D8l0TjSV<^>kHFEBBJZ+}pKwx9-I{9HSz}bv-O>|O#Yl7&)g`Q45 z8tRXIV_aZf;T3rLG$g=%1JMeNy5)&af%VJSu91`!^|MYWlc9ZfG2DLLtYv!ISRb1@ zncz5f7qTtJ>!G63RacLF!vRqcil%@c<=OC-+xGE=lO9SBvS5Im{(@D*588E=LWA0e z`sxr8%I<|Fq=L-M-^dzJkoBX`@N{^{)8K8Q<^@|F1vPaZktg`qB?%_LbR>d!q$#K@ z`s7D1_^zJ;a*T{qaKAnX8I zRk22gELq-=F#1^)?xYxlmcn7;gIJ$}Wf zfVC(mhkGBkD}rv1!=3L5_eSLYC-GgwXU5CxloGu@dl!OxUPf;?#eaLqbMO%t&9~`nRuzu!^vjeyJ4miWSBZ z5MAnuya?@9d<#=B|C(=rlHyYK@Hm8+KF}6}rrKxO1`aYX07FRV8%i3Qj{W&f?r|*?@rlFF+tF9Ov2(_Bg?#6&ahe{?uRVrR z`L%1dh#$N`G5B6nRNT3A4uKVqmxR$?M*s_+UAJi?FrSQ!EN3M+Hm$xLY++5W3RvS@ zLdlc}$X^mbQ${HZ2~CR8v9agSy`$`hYIS~T$!E#NnrROj&b++5h6f#uzp$GZis!V@ z(;Hv{#nR&?qpa|1fY7~?u?W1l^xtrhLkiW24y?>N>@Hk`qdL>=)Y>Y=TRXwtBq1Sz zU471)JbW_r+zVj;2qAUFLMYS0$j3}Y&vT0%1m<%y%Ct~2e6g>Ux|;O}atp>rAn;)f z)cd1)(9)rP!T3@dxV;2VvO#gv%z$dXwsw1GmbBuK$;+R^E|=R%^1g%!m>t8OoI7_8 z<~=aN0yXcM#8u!_xNcQIPRd_(xyqMAsNO+c4!IdG9dH`-EiAHkVqk*xYX%Chyau(* zu$SiuMcB0qdKu~Ove}(MojDemn^31U4iwO6t$fZ_mOmh;V`cpb({m7*Ki_0wW1ELt z%Qk9RE&Pf*{fX11F=e~^4PsN!P4QRSe~^p;EM*?^3kE{?gO?BcdJbCKr0U|?)) zp)}gDr`g8u8@_}ynDgu@XKbTtrmbT3i#SQQfsAYWuzOW@0AhOtycD(9`${EmMui#A zk~@+`y~&M%4wwIl871uso8=0aSNtc14Lh$mejC}#Dl1{ai3cF0u(L{8H5KMv)Up0B zVNTkhh_|>2G>nqVPT+YAxJ78Ab7F-GLPH_6NYc%%!v!R9hUs;7Shfs{z9F>PjOSqT zM(uG{(2tU-UkaOh1Y*pvi6VfEQk%=mzlCj*M%e_}1d|z>B=p9d4rT=0L!ulDTilI= zUF&IIk2`g(B%#oC!|v*2&zR(CknjG0-5-UV$AcnIARuKF9@Y;AhVR^QzoHx7N_tH6 zz7XrhdKXq%0%k4=z~wMUs}sqOf%ej8QG>AmC$_sEZc95wnWY{G!Gn*5;HncVYBn_n zkl_UkZ4&Otb9M4KQAXXY`Xc;c%|AmuJ$ks z0hqYbe@L?|6LJP8D758)QT30|WCz=pHxV$ z_4@QMAl2?Qyzbp0*LfB?Mkt0ofd-FAPmt)rTXkNAb@HjKHnij z*5ar?25%^-!8QABifNoPXRaQC%_^fBj`Tri>d%20VCy!1LZ2U%(+o~4;5A29NO4!G zH9$82g2y89*s>6Ry$(iHAeTy?D#

@-ps@7gBM&(Wzx91hW_hT}=Y>Zs?pvuutE3 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 literal 21580 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 diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager-coil.png b/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager-coil.png index c3b798344e28a9fa1128f1e5ef5a4f6dfd65d771..0b784b0ecf33b7f228e5f694ed16a252220e64d4 100644 GIT binary patch literal 64814 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 z >Jvfw=_sJaL_-6<^cCY&aH zMX527?d0l;F`A>Bn;zpDSo$hT{d6y8(w;rjU9E&AqF9%~FXGOt&8B(GJl=4cUa9$N z?eCKx{k1P&LOJSbW0OtK%*IC4ohAjmxM*?MGmGDngXUIF>r*rMWiEvnM>v}3wKL=8m#lU%W_5EyI9V-U{5*ha@ zc<{`3Bhs2f@Px63jDpvS3<+`M`TwHT`~5H}yw=j(Oii~Z;)Uy#AC!7`Ld}DUZg}ed z+}xKx{Y}N$ZDeqicO^zY*8#a`+v&m?*KNXloI~%im$;d^-?(Aj#xCpfmoN0Tf^Jo? z($k3sXB?aqvo#bW%+%DkX!1)AZLj52yxj6{KE%JsDK)-OXHs)&o2M3>+nDS`oTpTr zmOXs)nUl+_Rf$A0}VlzM;w!GPge#1pVx$T~D9U>ZScZ zg@@D52{(t~hv>*1c${c&q+4%Dl- zE!taKkBaZwxf3!VhI{uzLy!C;`JnwP`B3QW1H>5B+SuqDlbamf*vaV4wWA95=>^2S zY0Z$jysYI!bDR*KH%|Y0WMQF10JGTwy)M3asonJS2S&?vJ;O{65Sf8FbSjx8RdLCmgBP_tXEuNm^8Rf*0Sj<#$}o^4GbQL%=ml=)GEomV+gl~getS8 zJ%FtpM6P8_|_)W7g3y_cJc{mvoAJs9mrB`HDP!OdFhR$#`L>}Ic|nH=U;{A=ix?UY`Bzrlqe;VVdDLp=m7rix1zv2_1HV2;17m;zI&o4lf%tM4SrW$Qlk0I2bCOPJ?Br)sGFmM&W%X zASG#)l~BQ6SP~LRa#%t63-j{<2XAk0f_w!?Gm?g+Or2`oD2>Gr`-Ogilt{GTYK>tCl2$X_mEM&QLDuJr zF!8RRBgL1LvZ5j*vzkLeehrzsk;u|`2Y`m=nlTFbO0&#w zFSP>KnZ}uW79EyAGj2kpdtV-- z?Rr~ZxXC9JV@kpgJrW}>gGV47W%u)oqBS|8n{OO>9N(TnH(xonS4oC3oL}}v(_ze9 z>F-_s<#b<}tfjp&LKA-G0!7BIS3)TD0vzlPN#!#!3zfM#S!)J2ZKt8WVzh%Oq#eIa zOe1y^no*Z?k+vH?>Nw~Q6>Q{>`FT-#$b2wCamK{qHaZc!6X-)DUJGyNuK!QnhLKG3 z!~W9*X6%eLZC-`GH)C(#x&z!S(tHHtlPcG%52~u}PV@G0*Wod3YvV;jo0hh{==!yH z@^YQ*Y$^7QvT-PN($dq-GJPp8nu&{u+&X$cv2l|vE*Yew*FhOt&tI5*{9ssk_?;8` zyjKcUwo61hP@=MW+taiE$NuMyAkQC^l{I+9Y5@}foa99)s<-sV(Ub7gvOM_ObdZOa zw^v!lYvFUR>dw{!%BtslaS><_y&=Eo#j*Q)mcV3lxglxx&5I9iWJL)LK?ag=U38Zm zq%zjU2f5&toy#L}1lez8YfL{~*4I4Q&MGTE-OU%0oeeJyWsdY z`x79C|;Hii`|dK%sU|>fW^N z@L8Ij4e0Ne=%i?;iWnM_c5(hCbn{tE3r}6v?}Eg{Iw%frvDRx?Z{2yad;HHmx`Viq z@;X`^4GiM+>~r1dxp}y^WhaEF^0O&-7>Vwchwn_buz^aMMn44kftvZ$XMl#LJ%D__ zX`o1xYLPai^wvmGNL6Vz^XPo6xe=6aBR0ud3d)zl%~j}Kq^W`;v5P)!Lv zbg9Ocn988lN!SD{L*y@h@ZcqT`*Vg&uoz}Rx`x%ZMZXi}4+Jc%tWH*a$WC$a_&rx}DnA)>#hGxouybHrceeWu`2E%?@hP5s$xA#q6p(W$pEa4&L`q z`i3XQ#E9fMAV6Ki_x)7XR3DL*9#}7WpN`$_TZyew)&8KH`0y-!$AWY9_5;zc=o~7W zt1k@um;B}y4d=E%!~^$jU&j^E;d0K!*?FK#+b>5&CL~l1;;!hl(4aWnBqVmtcnZ*X zJ6r?~;H+|PwsEY$)CZ}&Mrh$RGaq$3T>U>TuT55H;aigNM&<7SZp2eWVfw6zCkXbY~%;iV#GaR7~>X(-ik9a?=wT&%F ziiMsRG-$z!WvDKG8SKW3gPslLAKHvh#zZz#xzOm2&Vy{Qnm?(eWV)6=83-Z2#u%Z? zjZmJGL%~jjx|96_qMrU2&3{kQcOuQ7NrG$N*peBj(>ObE4%Hu}*6)0U9_RM$n`yh& zoLyWr_O&uZN1Qv?Wy7jBPR)^dHRMx)oJ!>1ML3x<|LPWF#o+mRQQ*JSKC*=KXJ^

8svQYg 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 VBZIb`zrmiKf8Y1F^4-Cw{{x)ThRFZ` diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager-gameplay.gif b/VisualPinball.Unity/Documentation~/creators-guide/editor/lamp-manager-gameplay.gif index be280938e1bb49d7dfb60d01d31f60ecddc843cd..51c8de3c4c941228564bd60a3b8f596c13082fa3 100644 GIT binary patch literal 273992 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�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%0DvfsELV< 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�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

Xmjj%3s9sy1^=7ZMI?d-z2&O$U9N%RDD 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 O*fy_tm#A>S`o9608pXW; literal 171915 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℘+XBrA-I!FdaTcjKxZve#TAYD4dgU@32?c5Ve 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 _o}jcw}53+q=KA_dxegz}OC9<)*dA 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 literal 86787 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 z

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ℜ9TTQ+ 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 u-RIdZ(yvG)%)HL!T$p(*sbya diff --git a/VisualPinball.Unity/Documentation~/creators-guide/toc.yml b/VisualPinball.Unity/Documentation~/creators-guide/toc.yml index f63844590..f62cb5b9c 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/toc.yml +++ b/VisualPinball.Unity/Documentation~/creators-guide/toc.yml @@ -47,3 +47,5 @@ href: manual/mechanisms/flippers.md - name: Slingshots href: manual/mechanisms/slingshots.md + - name: Light Groups + href: manual/mechanisms/light-groups.md From cf046aa5a1b4fd8405ac660b97250c2036a2a08d Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 01:14:01 +0200 Subject: [PATCH 49/58] doc: Update screenshot for wire manager. --- .../creators-guide/editor/wire-manager.png | Bin 35217 -> 53758 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.png b/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.png index e4bdb438cada75dec8b4e6e5f679c37f02f5376d..e93d26c113ec3375536d2922fb708b8c0a30a8cd 100644 GIT binary patch literal 53758 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 literal 35217 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 From c0aaac23406c73889a12075b8ddd3c00a7d80bb6 Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 11:37:19 +0200 Subject: [PATCH 50/58] doc: Replace relative links with GUIDs. --- CHANGELOG.md | 4 ++-- .../creators-guide/editor/switch-manager.md | 4 ++-- .../Documentation~/creators-guide/editor/wire-manager.md | 8 ++++---- .../Documentation~/creators-guide/manual/displays.md | 5 +++-- .../creators-guide/manual/mechanisms/light-groups.md | 4 ++-- .../creators-guide/manual/mechanisms/troughs.md | 6 +++--- .../Documentation~/creators-guide/setup/installing-vpe.md | 2 +- .../Documentation~/creators-guide/setup/running-vpe.md | 1 + 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ac4b72b9..2f50f6ae1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ Built with Unity 2020.3. ### Added -- Support for dynamic wires, also known as *Fast Flip* ([#329](https://github.com/freezy/VisualPinball.Engine/pull/329), [Documentation](https://docs.visualpinball.org/creators-guide/editor/wire-manager.html#dynamic)). -- Component for light groups, allowing easy grouping of GI lamps. ([#330](https://github.com/freezy/VisualPinball.Engine/pull/330)). +- Support for dynamic wires, also known as *Fast Flip* ([#330](https://github.com/freezy/VisualPinball.Engine/pull/330), [Documentation](https://docs.visualpinball.org/creators-guide/editor/wire-manager.html#dynamic)). +- Component for light groups, allowing easy grouping of GI lamps. ([#330](https://github.com/freezy/VisualPinball.Engine/pull/330) ([Documentation](https://docs.visualpinball.org/creators-guide/manual/mechanisms/light-groups.html))). - Slingshot component ([#329](https://github.com/freezy/VisualPinball.Engine/pull/329), [Documentation](https://docs.visualpinball.org/creators-guide/manual/mechanisms/slingshots.html)). - Create insert meshes ([#320](https://github.com/freezy/VisualPinball.Engine/pull/320)). - Full support for custom playfield meshes. diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md index b80f0c220..3a31ddc94 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/switch-manager.md @@ -5,7 +5,7 @@ description: VPE's switch manager lets you hook up the switches of the playfield --- # Switch Manager -During gameplay, the [gamelogic engine](~/creators-guide/manual/gamelogic-engine.md) needs to know what is happening on the playfield. For that, real pinball tables have switches on the playfield that signal when a ball rolls over or settles in a certain position. These switches are also built into targets, bumpers, kickers, and other mechanisms (see *[Supported Game Mechanisms](#supported-game-mechanisms)* below). +During gameplay, the [gamelogic engine](xref:gamelogic_engine) needs to know what is happening on the playfield. For that, real pinball tables have switches on the playfield that signal when a ball rolls over or settles in a certain position. These switches are also built into targets, bumpers, kickers, and other mechanisms (see *[Supported Game Mechanisms](#supported-game-mechanisms)* below). Wiring these switches up to the gamelogic engine with code can be a tedious process, so VPE provides a graphical interface where you can do it easily. If you've named them appropriately it can even guess which switch maps to which game item. @@ -55,7 +55,7 @@ The **Source** column defines where the element in the following column originat - *Playfield* lets you choose a game item from the playfield - *Input System* lets you choose an input action from a pre-defined list, e.g. cabinet switches - *Constant* sets the switch once at the beginning of the game to the given value. -- *Device* lets you choose a switch device containing the switch. Switch devices are mechanisms that include multiple switches, for example [troughs](../manual/mechanisms/troughs.md). +- *Device* lets you choose a switch device containing the switch. Switch devices are mechanisms that include multiple switches, for example [troughs](xref:troughs). ### Element diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md index 34f8b1272..2f258b3fb 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/wire-manager.md @@ -5,7 +5,7 @@ description: VPE's wire manager lets you directly hook up any switch to any coil --- # Wire Manager -Using the [Switch Manager](xref:switch_manager), you can wire playfield and cabinet switches to the [Gamelogic Engine](../manual/gamelogic-engine.md). Similarly, the [Coil Manager](xref:coil_manager) and [Lamp Manager](xref:lamp_manager) let you connect playfield elements to the outputs of the Gamelogic Engine. +Using the [Switch Manager](xref:switch_manager), you can wire playfield and cabinet switches to the [Gamelogic Engine](xref:gamelogic_engine). Similarly, the [Coil Manager](xref:coil_manager) and [Lamp Manager](xref:lamp_manager) let you connect playfield elements to the outputs of the Gamelogic Engine. The **Wire Manager** allows you to *bypass* the gamelogic engine and connect switches directly to coils and lamps. Using the *dynamic* wires, this can be used to eliminate the flipper lag often introduced by emulated ROMs. But it also can be useful for debugging, or for game logic that might not be covered by the gamelogic engine. @@ -28,7 +28,7 @@ The **Source** column defines the type of source you are connecting to. There ar - *Playfield* lets you select any game item that qualifies as a source from the playfield. - *Input System* lets you select an input action from a pre-defined list, e.g. cabinet switches. - *Constant* sets the destination to a constant value. -- *Device* lets you select a source device. Such devices are mechanisms that include multiple sources, for example [troughs](../manual/mechanisms/troughs.md). +- *Device* lets you select a source device. Such devices are mechanisms that include multiple sources, for example [troughs](xref:troughs). ### Source Element @@ -47,7 +47,7 @@ Finally, if **Constant** is selected, you select the value that will be permanen Under **Destination** you can select the type of the element that will *receive* the switch changes. There are two types to choose from: - *Playfield* lets you select any game item that qualifies as a destination from the playfield -- *Device* lets you choose a destination device. Such devices are mechanisms that include multiple coils or lamps, for example [troughs](../manual/mechanisms/troughs.md). +- *Device* lets you choose a destination device. Such devices are mechanisms that include multiple coils or lamps, for example [troughs](xref:troughs). ### Destination Element @@ -71,7 +71,7 @@ However, by design, there are two caveats: > [!note] -> [MPF](../../plugins/mpf/index.md) has a similar feature called [Hardware Rules](https://docs.missionpinball.org/en/dev/hardware/hw_rules.html#the-solution-hardware-rules). This is the preferred way, because the gamelogic engine explicitly notifies VPE about which wires to add and remove during gameplay. +> [MPF](xref:mpf_index) has a similar feature called [Hardware Rules](https://docs.missionpinball.org/en/dev/hardware/hw_rules.html#the-solution-hardware-rules). This is the preferred way, because the gamelogic engine explicitly notifies VPE about which wires to add and remove during gameplay. > > However, other gamelogic engines like PinMAME don't have this feature, that's why VPE comes with the *dynamic wire* feature that guesses when wire is active and when not. diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/displays.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/displays.md index e706ef0b2..8f603e3ce 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/manual/displays.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/displays.md @@ -1,4 +1,5 @@ --- +gui: displays description: How VPE handles dot matrix and segment displays. --- # Displays @@ -8,7 +9,7 @@ Every pinball machine has one or more displays where the score and other importa ![DMD](dmd-game_over.jpg) *A dot matrix display used in the late 90s - Photo © 2009 by [ElHeineken](https://commons.wikimedia.org/wiki/File:Pinball_Dot_Matrix_Display_-_Demolition_Man.JPG)* -VPE supports both segment displays and dot matrix displays (usually referred to as DMDs). During game play displays are driven by the [Gamelogic Engine](gamelogic-engine.md). VPE supports multiple displays per game. +VPE supports both segment displays and dot matrix displays (usually referred to as DMDs). During game play displays are driven by the [Gamelogic Engine](xref:gamelogic_engine). VPE supports multiple displays per game. > [!note] > While the earliest electro-mechanical pinball machines used motorized score reels, and today's are using high resolution LCDs neither are yet supported in VPE. @@ -17,7 +18,7 @@ VPE supports both segment displays and dot matrix displays (usually referred to Displays are lazily bound, meaning that when the game starts the gamelogic engine announces its displays and VPE connects them to objects in your scene that actually render them. Matching is done with an ID and depends on how the gamelogic engine being used manages displays. -For example, in [MPF](../../plugins/mpf/index.md) you name your displays yourself in the machine configuration, while PinMAME uses IDs like `dmd0` and `display0` to identify its DMDs and segment displays. +For example, in [MPF](xref:mpf_index) you name your displays yourself in the machine configuration, while PinMAME uses IDs like `dmd0` and `display0` to identify its DMDs and segment displays. ### Editor diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-groups.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-groups.md index bcb55a67e..c8d57803d 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-groups.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/light-groups.md @@ -8,12 +8,12 @@ description: VPE can group and address multiple lights at once. Sometimes, a game addresses multiple physical lights as one logical lamp, i.e. all lights are always toggled or faded at the same time. Typical use cases are [GI strips](https://docs.missionpinball.org/en/latest/mechs/lights/gis.html). Instead of creating a link in the [Lamp Manager](xref:lamp_manager) for each light separately, VPE ships with a component called *Lamp Group*. - - A light group is a component you can add to any GameObject. It's recommended to make it parent of the light objects it contains, but you can also keep it outside of the lights hierarchy, since it explicitly references the lights it contains. ## Setup + + To create a new light group, select the GameObject you want to add your light group to, and in the inspector click on *Add Component* and choose *Visual Pinball -> Game Item -> Light Group*. Then use the list control to add and remove lights. There are a few button that make this easier. diff --git a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md index 08005f843..c2b285dba 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/manual/mechanisms/troughs.md @@ -8,7 +8,7 @@ description: How VPE works with troughs (ball drains). If you are unfamiliar with ball troughs, have a quick look at [MPF's documentation](https://mpf-docs.readthedocs.io/en/latest/mechs/troughs/), which does an excellent job explaining them. -VPE comes with a trough mechanism that simulates the behavior of a real-world ball trough. This is especially important when emulating existing games, since the [gamelogic engine](../gamelogic-engine.md) expects the trough's switches to be in a plausible state, or else it may have errors. +VPE comes with a trough mechanism that simulates the behavior of a real-world ball trough. This is especially important when emulating existing games, since the [gamelogic engine](xref:gamelogic_engine) expects the trough's switches to be in a plausible state, or else it may have errors. ## Creating a Trough @@ -103,13 +103,13 @@ A single ball trough may work [with](https://docs.missionpinball.org/en/latest/m The number of simulated switches in the trough depends on the type of trough and the *Switch Count* property in the inspector panel. For recreations, you can quickly determine the number of trough switches by looking at the switch matrix in the operation manual, it usually matches the number of balls installed in the game. -To configure the switches, open the [switch manager](../../editor/switch-manager.md) and add the trough switches if they're not already there. For *Destination* select "Device", under *Element*, select the trough you've created and which switch to connect. For a modern five-ball trough, it will look something like this: +To configure the switches, open the [switch manager](xref:switch_manager) and add the trough switches if they're not already there. For *Destination* select "Device", under *Element*, select the trough you've created and which switch to connect. For a modern five-ball trough, it will look something like this: ![Switch Manager](trough-switches.png) ## Coil Setup -VPE's trough supports up to two coils, an entry coil which drains the ball from the outhole into the trough, and an eject coil which pushes a new ball into the plunger lane. To configure the coils, open the [coil manager](../../editor/coil-manager.md), find or add the coils, and link them to the trough like you did with the switches: +VPE's trough supports up to two coils, an entry coil which drains the ball from the outhole into the trough, and an eject coil which pushes a new ball into the plunger lane. To configure the coils, open the [coil manager](xref:coil_manager), find or add the coils, and link them to the trough like you did with the switches: ![Coil Manager](trough-coils.png) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/setup/installing-vpe.md b/VisualPinball.Unity/Documentation~/creators-guide/setup/installing-vpe.md index c8be45810..8d235b6bc 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/setup/installing-vpe.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/setup/installing-vpe.md @@ -76,4 +76,4 @@ Click *Yes*. When complete, you should now have a *Visual Pinball* menu in the e ![Package Manager after installation](unity-packages-after-installation.png) -Now that VPE is installed let's [import a table](running-vpe.md)! +Now that VPE is installed let's [import a table](xref:setup_running_vpe)! diff --git a/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md b/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md index 47a267ed2..48f929ce8 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/setup/running-vpe.md @@ -1,4 +1,5 @@ --- +guid: setup_running_vpe description: How to run VPE --- # Running VPE From 27686f971e78b11e2dbbfe22999caa77550965db Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 12:47:08 +0200 Subject: [PATCH 51/58] patcher: Group lights when there's more than one source per output. --- .../Matcher/TablePatcher.cs | 17 +++++++++++++++- .../Patcher/Tables/Terminator2.cs | 20 +++++++++++++------ .../Mappings/MappingConfig.cs | 11 +++++++--- .../Rendering/ILightConverter.cs | 2 ++ .../Standard/StandardLightConverter.cs | 5 +++++ 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index ddbe70072..e7f5543e4 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -247,7 +247,7 @@ protected static void LightPos(GameObject go, float x, float y, float z) /// X-position of the new light source, relative to the lamp /// Y-position of the new light source, relative to the lamp /// Z-position of the new light source, relative to the lamp - protected static void Duplicate(GameObject go, float x, float y, float z) + protected static void DuplicateLight(GameObject go, float x, float y, float z) { var light = go.GetComponentInChildren(); if (light != null) { @@ -256,6 +256,21 @@ protected static void Duplicate(GameObject go, float x, float y, float z) } } + ///

+ /// Creates a light group with the given light names + /// + /// GameObject to add the light group to. + /// Names of the light GameObjects. They must be sister objects of the first parameter. + protected static void LinkLights(GameObject go, params string[] lightNames) + { + var parentTransform = go.transform.parent; + var lightComponents = lightNames + .Select(n => parentTransform.Find(n).GetComponent()) + .Where(c => c != null); + var lg = go.AddComponent(); + lg.Lights = lightComponents.ToArray(); + } + #endregion #region Mapping Helpers diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 5c08977db..edb7c9c3b 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -352,16 +352,24 @@ public void SlingFlashers(GameObject go, float param) } [NameMatch("F120")] - [NameMatch("F125")] public void F120Pos(GameObject go) => LightPos(go, -160.8f, 17.6f, -6f); [NameMatch("F121")] public void F121Pos(GameObject go) => LightPos(go, 0f, -12.5f, 15.7f); [NameMatch("F122")] public void F122Pos(GameObject go) => LightPos(go, -4f, 97f, 25f); [NameMatch("F123")] public void F123Pos(GameObject go) { LightPos(go, -6.9f, -21.9f, 94.1f); - //todo RenderPipeline.Current.LightConverter.Range(l, 0.3f); + RenderPipeline.Current.LightConverter.SetRange(go.GetComponentInChildren(), 0.3f); + } + [NameMatch("F125")] public void F125Pos(GameObject go) + { + LightPos(go, 42.5f, -75.8f, 12.8f); + RenderPipeline.Current.LightConverter.SetRange(go.GetComponentInChildren(), 0.17f); + } + + [NameMatch("F126")] public void F126(GameObject go, LightComponent lightComponent) + { + LinkLights(go, lightComponent.name, "F126a"); } - //[NameMatch("F125")] public void F125Pos(GameObject go) => LightPos(go, 182.6f, -58.3f, 12.8f); #endregion @@ -670,9 +678,9 @@ public void AutoFire(GameObject go) Intensity(go, 4000f); LightPos(go, -52f, 3.3f, -50f); - Duplicate(go, -18f, 0f, -50f); - Duplicate(go, 16f, 0f, -50f); - Duplicate(go, 52f, 3.3f, -50f); + DuplicateLight(go, -18f, 0f, -50f); + DuplicateLight(go, 16f, 0f, -50f); + DuplicateLight(go, 52f, 3.3f, -50f); } [NameMatch("L31")] diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index 65d56c56d..7a6df3753 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -213,7 +213,7 @@ public void RemoveAllSwitches() public void PopulateCoils(GamelogicEngineCoil[] engineCoils, TableComponent tableComponent) { var coilDevices = tableComponent.GetComponentsInChildren(); - var lamps = tableComponent.GetComponentsInChildren(); + var lamps = tableComponent.GetComponentsInChildren().OrderBy(LampTypePriority).ToArray(); foreach (var engineCoil in GetCoils(engineCoils)) { var coilMapping = Coils.FirstOrDefault(mappingsCoilData => mappingsCoilData.Id == engineCoil.Id); @@ -420,9 +420,8 @@ public void RemoveAllWires() /// Table component public void PopulateLamps(GamelogicEngineLamp[] engineLamps, TableComponent tableComponent) { - var lamps = tableComponent.GetComponentsInChildren(); + var lamps = tableComponent.GetComponentsInChildren().OrderBy(LampTypePriority).ToArray(); foreach (var engineLamp in GetLamps(engineLamps)) { - var lampMapping = Lamps.FirstOrDefault(mappingsLampData => mappingsLampData.Id == engineLamp.Id && !mappingsLampData.IsCoil); if (lampMapping != null) { continue; @@ -446,6 +445,12 @@ public void PopulateLamps(GamelogicEngineLamp[] engineLamps, TableComponent tabl } } + private int LampTypePriority(ILampDeviceComponent comp) => comp switch { + LightGroupComponent _ => 0, + LightComponent _ => 1, + _ => 10 + }; + /// /// Returns a sorted list of lamp names from the gamelogic engine, /// appended with the additional names in the lamp mapping. In short, diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs index 92bc60b15..e0c458a89 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs @@ -42,6 +42,8 @@ public interface ILightConverter void SetShadow(Light light, bool enabled, bool isDynamic, float nearPlane = 0.01f); + void SetRange(Light light, float range); + /// /// Sets the intensity of a given light. /// diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs index e8134186c..6f12ad2e3 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs @@ -50,6 +50,11 @@ public void SetShadow(Light light, bool enabled, bool isDynamic, float nearPlane light.shadowNearPlane = nearPlane; } + public void SetRange(Light light, float range) + { + light.range = range; + } + public void SetIntensity(Light light, float intensityLumen) { light.intensity = intensityLumen; From b4c97463d158c28d5eedad68100a4f8437e2a8e5 Mon Sep 17 00:00:00 2001 From: dekay Date: Sun, 17 Oct 2021 12:50:30 -0600 Subject: [PATCH 52/58] Fix a couple typos in camera-settings.md --- .../creators-guide/editor/advanced/camera-settings.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VisualPinball.Unity/Documentation~/creators-guide/editor/advanced/camera-settings.md b/VisualPinball.Unity/Documentation~/creators-guide/editor/advanced/camera-settings.md index 9d2dd7a5f..52bc9bf35 100644 --- a/VisualPinball.Unity/Documentation~/creators-guide/editor/advanced/camera-settings.md +++ b/VisualPinball.Unity/Documentation~/creators-guide/editor/advanced/camera-settings.md @@ -22,11 +22,11 @@ To use the camera controller, select the `Camera` scene object, which is at the - **Distance**: Moves the camera closer to or further away from the pivot point. This is used in conjunction with the FOV to frame the table in view. - **FOV**: Sets the field of view of the camera. High values result in a wide field of view and more depth perspective. Low values narrow and flatten the view. > [!note] - > Adjusting the distance and FOV together will control how much apparent depth there is to tge table. A wide field of view and low distance will give the table a lit of perspective and depth, but will be more challenging to fit in the view without clipping the front, or having a lot of space to the sides in the back. Conversely, moving the camera further away and lowering the FOV will remove much of the perspective allowing the table to fit more evenly in the frame. + > Adjusting the distance and FOV together will control how much apparent depth there is to the table. A wide field of view and low distance will give the table a bit of perspective and depth, but will be more challenging to fit in the view without clipping the front, or having a lot of space to the sides in the back. Conversely, moving the camera further away and lowering the FOV will remove much of the perspective allowing the table to fit more evenly in the frame. - **Orbit**: Controls the camera angle in an orbit around the table. 0 and 360 are standing in front of the table, 90 is on the left, 270 to the right. ## Presets Camera presets are stored camera settings that allow you to rapidly switch between different camera views. This can be useful when developing a table to view specific areas or just to take pretty screenshots. -The preset slider changes between the stored camera views. There are three views included by default. Any preset can be overwritten by changing the parameters and clicking the *Save* button. If *Save* is not pressed, the values will be lost when you cycle to a new preset. New presets can be made by adjusting the values and clicking *Clone*. This preset will be added to the presets at the end. You can delete any preset by setting the slider to that preset and clicking the *Delete* button. \ No newline at end of file +The preset slider changes between the stored camera views. There are three views included by default. Any preset can be overwritten by changing the parameters and clicking the *Save* button. If *Save* is not pressed, the values will be lost when you cycle to a new preset. New presets can be made by adjusting the values and clicking *Clone*. This preset will be added to the presets at the end. You can delete any preset by setting the slider to that preset and clicking the *Delete* button. From c1633d359a42c49b8730c19b7fb147df1a377c91 Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 21:22:29 +0200 Subject: [PATCH 53/58] t2: Position remaining flashers. --- VisualPinball.Engine/VPT/Light/Light.cs | 8 +- .../Matcher/TablePatcher.cs | 64 +++++++++++++- .../Patcher/Tables/Terminator2.cs | 87 +++++++++++-------- .../Rendering/ILightConverter.cs | 2 +- 4 files changed, 119 insertions(+), 42 deletions(-) diff --git a/VisualPinball.Engine/VPT/Light/Light.cs b/VisualPinball.Engine/VPT/Light/Light.cs index fcf4a024c..cf16973e7 100644 --- a/VisualPinball.Engine/VPT/Light/Light.cs +++ b/VisualPinball.Engine/VPT/Light/Light.cs @@ -41,11 +41,9 @@ public Light(BinaryReader reader, string itemName) : this(new LightData(reader, { } - public static Light GetDefault(Table.Table table) + public static Light GetDefault(string name, float x, float y) { - var x = table.Width / 2f; - var y = table.Height / 2f; - var lightData = new LightData(table.GetNewName("Light"), table.Width / 2f, table.Height / 2f) { + var lightData = new LightData(name, x, y) { DragPoints = new[] { new DragPointData(x, y - 50f) {IsSmooth = true }, new DragPointData(x - 50f * MathF.Cos(MathF.PI / 4), y - 50f * MathF.Sin(MathF.PI / 4)) {IsSmooth = true }, @@ -59,6 +57,8 @@ public static Light GetDefault(Table.Table table) }; return new Light(lightData); } + + public static Light GetDefault(Table.Table table) => GetDefault(table.GetNewName("Light"), table.Width / 2f, table.Height / 2f); #region IRenderable diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs index e7f5543e4..57686b531 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Matcher/TablePatcher.cs @@ -19,8 +19,10 @@ using System.Linq; using UnityEngine; using VisualPinball.Engine.VPT; +using VisualPinball.Engine.VPT.Light; using VisualPinball.Engine.VPT.Trough; using VisualPinball.Unity.Editor; +using Light = UnityEngine.Light; using Object = UnityEngine.Object; namespace VisualPinball.Unity.Patcher @@ -172,6 +174,18 @@ protected static void LightColor(GameObject go, Color color) } } + /// + /// Sets the temperature of the light. + /// + /// Game object of the light + /// Temperature in Kelvin + protected static void LightTemperature(GameObject go, float temp) + { + foreach (var l in go.GetComponentsInChildren()) { + RenderPipeline.Current.LightConverter.SetTemperature(l, temp); + } + } + /// /// Sets the angle of a spot light. /// @@ -214,7 +228,7 @@ protected static void PyramidAngle(GameObject go, float angle, float ar) /// /// Game object of the light source /// Intensity of the light in lumen - protected static void Intensity(GameObject go, float intensityLumen) + protected static void LightIntensity(GameObject go, float intensityLumen) { var lights = go.GetComponentsInChildren(); foreach (var light in lights) { @@ -222,6 +236,34 @@ protected static void Intensity(GameObject go, float intensityLumen) } } + /// + /// Sets the range of the light. + /// + /// Game object of the light + /// Range in meters + protected static void LightRange(GameObject go, float range) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SetRange(light, range); + } + } + + /// + /// Sets the shadow of the light. + /// + /// Game object of the light + /// Whether to enable or disable shadows. + /// If true, update on each frame. + /// Distance from when on shadows are cast. + protected static void LightShadow(GameObject go, bool enabled, bool isDynamic, float nearPlane = 0.01f) + { + var lights = go.GetComponentsInChildren(); + foreach (var light in lights) { + RenderPipeline.Current.LightConverter.SetShadow(light, enabled, isDynamic, nearPlane); + } + } + /// /// Sets the light position. /// @@ -240,6 +282,26 @@ protected static void LightPos(GameObject go, float x, float y, float z) } } + protected static LightComponent CreateLight(string name, float x, float y, GameObject parentGo) + { + var light = VisualPinball.Engine.VPT.Light.Light.GetDefault(name, x, y); + light.Data.ShowBulbMesh = false; + + var prefab = RenderPipeline.Current.PrefabProvider.CreateLight(); + var lightGo = UnityEditor.PrefabUtility.InstantiatePrefab(prefab, parentGo.transform) as GameObject; + if (!lightGo) { + return null; + } + lightGo.name = name; + var lightTransform = lightGo.transform; + var lightComponent = lightGo.GetComponent(); + lightComponent.SetData(light.Data); + lightComponent.UpdateTransforms(); + lightTransform.Find("Bulb").gameObject.SetActive(false); + lightTransform.Find("Socket").gameObject.SetActive(false); + return lightComponent; + } + /// /// Duplicates a light source. /// diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index edb7c9c3b..60f9346e6 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -22,6 +22,7 @@ using System.Linq; using UnityEditor; using UnityEngine; +using UnityEngine.Experimental.GlobalIllumination; using VisualPinball.Engine.Math; using VisualPinball.Engine.VPT; using Color = UnityEngine.Color; @@ -42,10 +43,13 @@ public override void PostPatch(GameObject tableGo) // playfield material RenderPipeline.Current.MaterialConverter.SetSmoothness(playfieldGo.GetComponent().sharedMaterial, 0.96f); + // lights + CreateFlasher28(playfieldGo); + SetupTrough(tableGo, playfieldGo); SetupPinMame(tableGo, playfieldGo); - SetupMapping(tableGo); + // slingshots SetupLeftSlingshot(playfieldGo.transform.Find("Walls/LeftSlingshot").gameObject); SetupRightSlingshot(playfieldGo.transform.Find("Walls/RightSlingshot").gameObject); @@ -342,6 +346,10 @@ public void FixShip(GameObject go) [NameMatch("F122", FloatParam = 20000f)] [NameMatch("F123", FloatParam = 20000f)] [NameMatch("F125", FloatParam = 10000f)] + [NameMatch("F126", FloatParam = 10000f)] + [NameMatch("F126a", FloatParam = 10000f)] + [NameMatch("F127", FloatParam = 10000f)] + [NameMatch("F127a", FloatParam = 10000f)] public void SlingFlashers(GameObject go, float param) { foreach (var l in go.GetComponentsInChildren()) { @@ -358,18 +366,38 @@ public void SlingFlashers(GameObject go, float param) [NameMatch("F123")] public void F123Pos(GameObject go) { LightPos(go, -6.9f, -21.9f, 94.1f); - RenderPipeline.Current.LightConverter.SetRange(go.GetComponentInChildren(), 0.3f); + LightRange(go, 0.3f); } [NameMatch("F125")] public void F125Pos(GameObject go) { LightPos(go, 42.5f, -75.8f, 12.8f); - RenderPipeline.Current.LightConverter.SetRange(go.GetComponentInChildren(), 0.17f); + LightRange(go, 0.17f); } - [NameMatch("F126")] public void F126(GameObject go, LightComponent lightComponent) { + LightPos(go, 51.6f, 34.5f, 5f); LinkLights(go, lightComponent.name, "F126a"); } + [NameMatch("F126a")] public void F126aPos(GameObject go) => LightPos(go, -28.1f, 61.1f, 37f); + + [NameMatch("F127")] public void F127(GameObject go, LightComponent lightComponent) + { + LightPos(go, -33.2f, 2.9f, 5f); + LinkLights(go, lightComponent.name, "F127a"); + } + [NameMatch("F127a")] public void F127aPos(GameObject go) => LightPos(go, -31.5f, 89.5f, 37f); + + private static void CreateFlasher28(GameObject playfieldGo) + { + var parent = GetOrCreateGameObject(playfieldGo, "Lights"); + var lightComponent = CreateLight("F128", 302.4f, 361.4f, parent); + var go = lightComponent.gameObject; + SpotAngle(go, 104f, 53.4f); + LightPos(go, 0, 0, -79f); + LightIntensity(go, 10000f); + LightTemperature(go, 3400f); + LightRange(go, 0.11f); + } #endregion @@ -440,12 +468,7 @@ public void GiIntensity(GameObject go) [NameMatch("GI_34", FloatParam = 0.02f)] [NameMatch("GI_37", FloatParam = 0.01f)] [NameMatch("GI_38", FloatParam = 0.01f)] - public void GiDynamicShadow(GameObject go, float param) - { - foreach (var l in go.GetComponentsInChildren()) { - RenderPipeline.Current.LightConverter.SetShadow(l, true, true, param); - } - } + public void GiDynamicShadow(GameObject go, float param) => LightShadow(go, true, true, param); [NameMatch("GI_7", FloatParam = 0.01f)] // leaks [NameMatch("GI_8", FloatParam = 0.01f)] // leaks @@ -461,19 +484,11 @@ public void GiDynamicShadow(GameObject go, float param) [NameMatch("GI_31", FloatParam = 0.01f)] // leaks [NameMatch("GI_32", FloatParam = 0.01f)] // leaks [NameMatch("GI_35", FloatParam = 0.01f)] // leaks (not too badly) - public void GiStaticShadow(GameObject go, float param) - { - foreach (var l in go.GetComponentsInChildren()) { - RenderPipeline.Current.LightConverter.SetShadow(l, true, false, param); - } - } + public void GiStaticShadow(GameObject go, float param) => LightShadow(go, true, false, param); [NameMatch("GI_27")] [NameMatch("GI_28")] - public void GiDisable(GameObject go) - { - go.SetActive(false); - } + public void GiDisable(GameObject go) => go.SetActive(false); #endregion @@ -494,7 +509,7 @@ public void GiDisable(GameObject go) public void Rectangles(GameObject go) { SpotAngle(go, 122f, 48f); - Intensity(go, 4500f); + LightIntensity(go, 4500f); } [NameMatch("L16")] @@ -505,7 +520,7 @@ public void Rectangles(GameObject go) public void MidSizedCircles(GameObject go) { SpotAngle(go, 64f, 67f); - Intensity(go, 1200f); + LightIntensity(go, 1200f); } [NameMatch("L76")] @@ -514,7 +529,7 @@ public void MidSizedCircles(GameObject go) public void SmallSizedCircles(GameObject go) { SpotAngle(go, 45f, 13f); - Intensity(go, 700f); + LightIntensity(go, 700f); } [NameMatch("L61")] @@ -574,7 +589,7 @@ public void SmallSizedTriangles(GameObject go) [NameMatch("L38")] public void SmallSizedTrianglesRed(GameObject go) { - Intensity(go, 1000f); + LightIntensity(go, 1000f); } [NameMatch("L31")] @@ -584,7 +599,7 @@ public void SmallSizedTrianglesRed(GameObject go) [NameMatch("L35")] public void SmallSizedTrianglesWhite(GameObject go) { - Intensity(go, 700f); + LightIntensity(go, 700f); LightColor(go, Color.white); } @@ -597,7 +612,7 @@ public void SmallSizedTrianglesWhite(GameObject go) [NameMatch("L66")] public void MidSizedTrianglesGreen(GameObject go) { - Intensity(go, 3400f); + LightIntensity(go, 3400f); } [NameMatch("L13")] @@ -607,20 +622,20 @@ public void MidSizedTrianglesGreen(GameObject go) [NameMatch("L82")] public void MidSizedTrianglesRed(GameObject go) { - Intensity(go, 1850f); + LightIntensity(go, 1850f); } [NameMatch("L85")] public void MidSizedTrianglesWhite(GameObject go) { - Intensity(go, 1850f); + LightIntensity(go, 1850f); LightColor(go, Color.white); } [NameMatch("L28")] public void MidSizedTrianglesBlue(GameObject go) { - Intensity(go, 12000f); + LightIntensity(go, 12000f); LightColor(go, new Color(0f, 0.4f, 1)); } @@ -629,7 +644,7 @@ public void MidSizedTrianglesBlue(GameObject go) [NameMatch("L67")] public void MidSizedTrianglesYellow(GameObject go) { - Intensity(go, 1850f); + LightIntensity(go, 1850f); LightColor(go, Color.yellow); } @@ -649,7 +664,7 @@ public void T2Mouth(GameObject go) { LightPos(go, 0f, 0f, -50f); SpotAngle(go, 73f, 10f); - Intensity(go, 340f); + LightIntensity(go, 340f); } [NameMatch("L21")] @@ -675,7 +690,7 @@ public void T2Mouth(GameObject go) public void AutoFire(GameObject go) { SpotAngle(go, 70f, 15f); - Intensity(go, 4000f); + LightIntensity(go, 4000f); LightPos(go, -52f, 3.3f, -50f); DuplicateLight(go, -18f, 0f, -50f); @@ -716,7 +731,7 @@ public void T2Eyes(GameObject go) { LightPos(go, -2.2f, 0.8f, -50f); SpotAngle(go, 27f, 60f); - Intensity(go, 1000f); + LightIntensity(go, 1000f); } [NameMatch("L53")] @@ -763,7 +778,7 @@ public void T2Eyes(GameObject go) public void TopTriangles(GameObject go) { LightPos(go, 0f, 6f, -50f); - Intensity(go, 6700f); + LightIntensity(go, 6700f); SpotAngle(go, 80f, 40f); } @@ -780,14 +795,14 @@ public void Boxes(GameObject go) [NameMatch("Light4")] public void BlueBox(GameObject go) { - Intensity(go, 12000f); + LightIntensity(go, 12000f); LightColor(go, new Color(0f, 0.4f, 1)); } [NameMatch("Light5")] public void YellowBox(GameObject go) { - Intensity(go, 670f); + LightIntensity(go, 670f); LightColor(go, Color.yellow); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs index e0c458a89..25703205f 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/ILightConverter.cs @@ -54,7 +54,7 @@ public interface ILightConverter void SetTemperature(Light light, float temperature); /// - /// Sets the spotlight parameters of a light (doesn't set it to spotlight) + /// Converts the light to a spotlight. /// /// Which light to update /// Outer angle From fb581eb0206e40fe11c759df99b8a96e5855bffe Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 21:28:54 +0200 Subject: [PATCH 54/58] editor: Add "selected" toggle to lamp manager. --- .../VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs | 3 ++- .../VisualPinball.Unity.Editor/Managers/ManagerWindow.cs | 2 +- .../Patcher/Tables/Terminator2.cs | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs index b7afaff15..6faf8304c 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/Lamp/LampManager.cs @@ -134,6 +134,7 @@ private void Toggle(Action action) ToggleAction.Inserts => TableComponent.MappingConfig.Lamps.Where(lm => !lm.IsCoil && lm.Source == LampSource.Lamp), ToggleAction.GI => TableComponent.MappingConfig.Lamps.Where(lm => lm.Source == LampSource.GI), ToggleAction.Flasher => TableComponent.MappingConfig.Lamps.Where(lm => lm.IsCoil), + ToggleAction.Selected => _listView.GetSelectedData().Select(lld => lld.LampMapping), _ => throw new ArgumentOutOfRangeException() }; @@ -244,6 +245,6 @@ private void RecordUndo(string undoName) internal enum ToggleAction { - All, Inserts, GI, Flasher + All, Inserts, GI, Flasher, Selected } } diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/ManagerWindow.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/ManagerWindow.cs index 3d75b3602..b57b77958 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/ManagerWindow.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Managers/ManagerWindow.cs @@ -67,7 +67,7 @@ protected float RowHeight { protected T _selectedItem; private List _data = new List(); - private ManagerListView _listView; + protected ManagerListView _listView; private TreeViewState _treeViewState; private bool _renaming; private string _renameBuffer = string.Empty; diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 60f9346e6..a80c8458e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -22,8 +22,8 @@ using System.Linq; using UnityEditor; using UnityEngine; -using UnityEngine.Experimental.GlobalIllumination; using VisualPinball.Engine.Math; +using VisualPinball.Engine.PinMAME; using VisualPinball.Engine.VPT; using Color = UnityEngine.Color; @@ -72,7 +72,7 @@ private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo) // GLE Object.DestroyImmediate(tableGo.GetComponent()); - var pinmameGle = tableGo.AddComponent(); + var pinmameGle = tableGo.AddComponent(); pinmameGle.Game = new Engine.PinMAME.Games.Terminator2(); pinmameGle.romId = "t2_l82"; tableComponent.RepopulateHardware(pinmameGle); @@ -350,7 +350,7 @@ public void FixShip(GameObject go) [NameMatch("F126a", FloatParam = 10000f)] [NameMatch("F127", FloatParam = 10000f)] [NameMatch("F127a", FloatParam = 10000f)] - public void SlingFlashers(GameObject go, float param) + public void FlasherIntensities(GameObject go, float param) { foreach (var l in go.GetComponentsInChildren()) { RenderPipeline.Current.LightConverter.SetIntensity(l, param); From 7a56b02f67d0c2fbc749e0f4d53ea7d9668c6c1f Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 23:03:36 +0200 Subject: [PATCH 55/58] editor: Make light pairing easier. --- .../Import/VpxSceneConverter.cs | 10 ++-- .../Matcher/Item/NameMatchAttribute.cs | 9 ++-- .../Matcher/TablePatcher.cs | 52 ++++++++++++++++++- .../Patcher/Patcher.cs | 17 +++++- .../Patcher/Tables/Terminator2.cs | 25 ++++++++- .../Import/PatcherManager.cs | 2 +- .../Mappings/MappingConfig.cs | 8 +-- 7 files changed, 107 insertions(+), 16 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs index 319d92c2e..b66afcc26 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Editor/Import/VpxSceneConverter.cs @@ -92,7 +92,7 @@ public VpxSceneConverter(FileTableContainer sourceContainer, string fileName = " _sourceContainer = sourceContainer; _sourceTable = sourceContainer.Table; _patcher = PatcherManager.GetPatcher(); - _patcher?.Set(sourceContainer, fileName); + _patcher?.Set(sourceContainer, fileName, this, this); _options = options ?? new ConvertOptions(); } @@ -266,11 +266,15 @@ private Dictionary UpdateGameItems(Dictionary /// This method is executed once after all element-specific patches had /// been applied.

@@ -282,13 +288,21 @@ protected static void LightPos(GameObject go, float x, float y, float z) } } + ///

+ /// Creates a point light. + /// + /// Name of the new light + /// X-position on the playfield + /// Y-position on the playfield + /// Game object to parent to (usually "Lights") + /// protected static LightComponent CreateLight(string name, float x, float y, GameObject parentGo) { - var light = VisualPinball.Engine.VPT.Light.Light.GetDefault(name, x, y); + var light = Engine.VPT.Light.Light.GetDefault(name, x, y); light.Data.ShowBulbMesh = false; var prefab = RenderPipeline.Current.PrefabProvider.CreateLight(); - var lightGo = UnityEditor.PrefabUtility.InstantiatePrefab(prefab, parentGo.transform) as GameObject; + var lightGo = PrefabUtility.InstantiatePrefab(prefab, parentGo.transform) as GameObject; if (!lightGo) { return null; } @@ -302,6 +316,40 @@ protected static LightComponent CreateLight(string name, float x, float y, GameO return lightComponent; } + /// + /// Converts a normal light to an insert light, by deleting and re-creating the insert prefab. + /// + /// Light component to convert + /// New converted game object + protected GameObject ConvertToInsertLight(LightComponent lo) + { + var name = lo.name; + var parent = lo.transform.parent.gameObject; + Object.DestroyImmediate(lo.gameObject); + return CreateInsertLight(TableContainer.Get(name).Data, parent); + } + + /// + /// Creates an insert light based on existing light data. + /// + /// + /// + private GameObject CreateInsertLight(LightData data, GameObject parentGo) + { + var prefab = RenderPipeline.Current.PrefabProvider.CreateInsertLight(); + var go = PrefabUtility.InstantiatePrefab(prefab, parentGo.transform) as GameObject; + go!.name = data.Name; + data.OffImage = TableContainer.Table.Data.Image; + var lc = go.GetComponent(); + lc.SetData(data); + lc.SetReferencedData(data, TableContainer.Table, MaterialProvider, TextureProvider, null); + + EditorUtility.SetDirty(go); + PrefabUtility.RecordPrefabInstancePropertyModifications(lc); + + return go; + } + /// /// Duplicates a light source. /// diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs index f49376144..521bd560e 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Patcher.cs @@ -32,11 +32,17 @@ public sealed class Patcher : IPatcher private readonly List _patchers = new List(); private FileTableContainer _tableContainer; + private IMaterialProvider _materialProvider; + private ITextureProvider _textureProvider; + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public void Set(FileTableContainer tableContainer, string fileName) + public void Set(FileTableContainer tableContainer, string fileName, IMaterialProvider materialProvider, ITextureProvider textureProvider) { _tableContainer = tableContainer; + _materialProvider = materialProvider; + _textureProvider = textureProvider; + var types = typeof(Patcher).Assembly.GetTypes(); foreach (var type in types) { var classMatchers = type @@ -58,6 +64,11 @@ public void ApplyPatches(GameObject gameObject, GameObject tableGameObject) foreach (var patcher in _patchers) { var methods = patcher.GetType().GetMembers().Where(member => member.MemberType == MemberTypes.Method); + if (patcher is TablePatcher tp) { + tp.TableContainer = _tableContainer; + tp.MaterialProvider = _materialProvider; + tp.TextureProvider = _textureProvider; + } foreach (var method in methods) { var methodMatchers = Attribute @@ -68,6 +79,10 @@ public void ApplyPatches(GameObject gameObject, GameObject tableGameObject) var methodInfo = method as MethodInfo; if (methodInfo != null) { foreach (var methodMatcher in methodMatchers) { + // if the game object has been destroyed by a patcher, exit. + if (!gameObject) { + return; + } if (methodMatcher.Matches(_tableContainer, gameObject)) { var validArgs = true; var patcherParamInfos = methodInfo.GetParameters(); diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index a80c8458e..f7d1f0f69 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -20,19 +20,22 @@ // ReSharper disable UnusedType.Global using System.Linq; +using NLog.Fluent; using UnityEditor; using UnityEngine; using VisualPinball.Engine.Math; using VisualPinball.Engine.PinMAME; using VisualPinball.Engine.VPT; +using VisualPinball.Engine.VPT.Light; +using VisualPinball.Engine.VPT.Table; using Color = UnityEngine.Color; +using Light = UnityEngine.Light; namespace VisualPinball.Unity.Patcher { [MetaMatch(TableName = "Terminator 2 - Judgment Day (Williams 1991)", AuthorName = "g5k")] public class Terminator2 : TablePatcher { - #region Global public override void PostPatch(GameObject tableGo) @@ -43,7 +46,7 @@ public override void PostPatch(GameObject tableGo) // playfield material RenderPipeline.Current.MaterialConverter.SetSmoothness(playfieldGo.GetComponent().sharedMaterial, 0.96f); - // lights + // missing lights CreateFlasher28(playfieldGo); SetupTrough(tableGo, playfieldGo); @@ -492,20 +495,38 @@ public void GiIntensity(GameObject go) #endregion + #region Insert Links + + [NameMatch("L22a")] public void Link22(GameObject go) => LinkLights(go, "L22a", "L22b"); + [NameMatch("L51a")] public void Link51(GameObject go) => LinkLights(go, "L51a", "L51b"); + + #endregion + #region Insert Shapes + [NameMatch("L481")] + [NameMatch("L581")] + public void MakeInsert481(LightComponent lo) + { + var go = ConvertToInsertLight(lo); + // those don't actually need a light source, because the first light shines through the insert mesh. + go.transform.Find("Source").gameObject.SetActive(false); + } + [NameMatch("L43")] [NameMatch("L44")] [NameMatch("L45")] [NameMatch("L46")] [NameMatch("L47")] [NameMatch("L48")] + [NameMatch("L481")] [NameMatch("L53")] [NameMatch("L54")] [NameMatch("L55")] [NameMatch("L56")] [NameMatch("L57")] [NameMatch("L58")] + [NameMatch("L581")] public void Rectangles(GameObject go) { SpotAngle(go, 122f, 48f); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs b/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs index e5bc641da..6a3428f56 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Import/PatcherManager.cs @@ -7,7 +7,7 @@ namespace VisualPinball.Unity { public interface IPatcher { - void Set(FileTableContainer tableContainer, string filename); + void Set(FileTableContainer tableContainer, string filename, IMaterialProvider materialProvider, ITextureProvider textureProvider); void ApplyPatches(GameObject gameObject, GameObject tableGameObject); void PostPatch(GameObject tableGameObject); } diff --git a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs index 7a6df3753..37374f866 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Mappings/MappingConfig.cs @@ -490,10 +490,10 @@ private static ILampDeviceComponent GuessLampDevice(ILampDeviceComponent[] lamps // second, match by "lXX" or name var matchKey = int.TryParse(engineLamp.Id, out var numericLampId) - ? $"l{numericLampId}" - : engineLamp.Id; - - return lamps.FirstOrDefault(l => string.Equals(l.name, matchKey, StringComparison.OrdinalIgnoreCase)); + ? $"^l{numericLampId}a?$" + : $"^{engineLamp.Id}$"; + var nameRegex = new Regex(matchKey, RegexOptions.IgnoreCase); + return lamps.FirstOrDefault(l => nameRegex.Match(l.name).Success); } private static GamelogicEngineLamp GuessLampDeviceItem(IGamelogicEngineDeviceItem engineLamp, ILampDeviceComponent device) From cd276c4463e86bd99f27067685eec82bd50984c4 Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 23:13:13 +0200 Subject: [PATCH 56/58] t2: Add DMD. --- .../Patcher/Tables/Terminator2.cs | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index f7d1f0f69..b46477c66 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -20,16 +20,12 @@ // ReSharper disable UnusedType.Global using System.Linq; -using NLog.Fluent; using UnityEditor; using UnityEngine; using VisualPinball.Engine.Math; using VisualPinball.Engine.PinMAME; using VisualPinball.Engine.VPT; -using VisualPinball.Engine.VPT.Light; -using VisualPinball.Engine.VPT.Table; using Color = UnityEngine.Color; -using Light = UnityEngine.Light; namespace VisualPinball.Unity.Patcher { @@ -51,6 +47,7 @@ public override void PostPatch(GameObject tableGo) SetupTrough(tableGo, playfieldGo); SetupPinMame(tableGo, playfieldGo); + SetupDmd(tableGo); SetupMapping(tableGo); // slingshots @@ -112,6 +109,25 @@ private static void SetupMapping(GameObject tableGo) } } + private static void SetupDmd(GameObject tableGo) + { + const float scale = 0.43f; + var cabinetGo = tableGo.transform.Find("Cabinet").gameObject; + var go = new GameObject { + name = "Dot Matrix Display", + transform = { + localEulerAngles = new Vector3(5.963f, 0, 0), + localPosition = new Vector3(0f, 0.513f, 1.0329f), + localScale = new Vector3(scale, scale, scale) + } + }; + go.transform.SetParent(cabinetGo.transform, false); + + var dmd = go.AddComponent(); + dmd.UpdateDimensions(128, 32); + dmd.Emission = 100f; + } + #endregion #region Geometry @@ -500,10 +516,6 @@ public void GiIntensity(GameObject go) [NameMatch("L22a")] public void Link22(GameObject go) => LinkLights(go, "L22a", "L22b"); [NameMatch("L51a")] public void Link51(GameObject go) => LinkLights(go, "L51a", "L51b"); - #endregion - - #region Insert Shapes - [NameMatch("L481")] [NameMatch("L581")] public void MakeInsert481(LightComponent lo) From 4a450bb843decbc43b683ba42d2d128fc9b1f5cc Mon Sep 17 00:00:00 2001 From: freezy Date: Sun, 17 Oct 2021 23:45:19 +0200 Subject: [PATCH 57/58] t2: Fix flashers. --- .../Patcher/Tables/Terminator2.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index b46477c66..9699512af 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -369,9 +369,11 @@ public void FixShip(GameObject go) [NameMatch("F126a", FloatParam = 10000f)] [NameMatch("F127", FloatParam = 10000f)] [NameMatch("F127a", FloatParam = 10000f)] - public void FlasherIntensities(GameObject go, float param) + public void FlasherIntensities(GameObject go, LightComponent lc, float param) { foreach (var l in go.GetComponentsInChildren()) { + lc.FadeSpeedUp = 0f; + lc.FadeSpeedDown = 0f; RenderPipeline.Current.LightConverter.SetIntensity(l, param); RenderPipeline.Current.LightConverter.SetTemperature(l, 3000); RenderPipeline.Current.LightConverter.SetShadow(l, true, true, 0.001f); @@ -466,7 +468,7 @@ private static void CreateFlasher28(GameObject playfieldGo) public void GiIntensity(GameObject go) { foreach (var l in go.GetComponentsInChildren()) { - RenderPipeline.Current.LightConverter.SetIntensity(l, 1000f); + RenderPipeline.Current.LightConverter.SetIntensity(l, 200f); RenderPipeline.Current.LightConverter.SetTemperature(l, 2700); } } @@ -475,6 +477,9 @@ public void GiIntensity(GameObject go) [NameMatch("GI_4", FloatParam = 0.01f)] [NameMatch("GI_5", FloatParam = 0.02f)] [NameMatch("GI_6", FloatParam = 0.01f)] + + public void GiDynamicShadow(GameObject go, float param) => LightShadow(go, true, true, param); + [NameMatch("GI_10", FloatParam = 0.01f)] [NameMatch("GI_11", FloatParam = 0.01f)] [NameMatch("GI_12", FloatParam = 0.01f)] @@ -487,8 +492,6 @@ public void GiIntensity(GameObject go) [NameMatch("GI_34", FloatParam = 0.02f)] [NameMatch("GI_37", FloatParam = 0.01f)] [NameMatch("GI_38", FloatParam = 0.01f)] - public void GiDynamicShadow(GameObject go, float param) => LightShadow(go, true, true, param); - [NameMatch("GI_7", FloatParam = 0.01f)] // leaks [NameMatch("GI_8", FloatParam = 0.01f)] // leaks [NameMatch("GI_9", FloatParam = 0.01f)] // leaks From fbb0bb00a55524ce2d8885c42eefab1a9da56dcf Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 18 Oct 2021 00:09:44 +0200 Subject: [PATCH 58/58] fix: Standard light type. --- .../VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs | 3 +-- .../Rendering/Standard/StandardLightConverter.cs | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs index 9699512af..f4efcefae 100644 --- a/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs +++ b/VisualPinball.Unity/VisualPinball.Unity.Patcher/Patcher/Tables/Terminator2.cs @@ -23,7 +23,6 @@ using UnityEditor; using UnityEngine; using VisualPinball.Engine.Math; -using VisualPinball.Engine.PinMAME; using VisualPinball.Engine.VPT; using Color = UnityEngine.Color; @@ -72,7 +71,7 @@ private static void SetupPinMame(GameObject tableGo, GameObject playfieldGo) // GLE Object.DestroyImmediate(tableGo.GetComponent()); - var pinmameGle = tableGo.AddComponent(); + var pinmameGle = tableGo.AddComponent(); pinmameGle.Game = new Engine.PinMAME.Games.Terminator2(); pinmameGle.romId = "t2_l82"; tableComponent.RepopulateHardware(pinmameGle); diff --git a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs index 6f12ad2e3..81e24b947 100644 --- a/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs +++ b/VisualPinball.Unity/VisualPinball.Unity/Rendering/Standard/StandardLightConverter.cs @@ -66,6 +66,7 @@ public void SetTemperature(Light light, float temperature) public void SpotLight(Light light, float outer, float innerPercent) { + light.type = LightType.Spot; light.spotAngle = outer; light.innerSpotAngle = outer * innerPercent * 0.01f; }