diff --git a/.gitignore b/.gitignore index 2a56dbb..ac2d304 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ VisualPinball.Engine.DMD.Unity/Plugins/**/*.pdb VisualPinball.Engine.DMD.Unity/Plugins/**/*.so VisualPinball.Engine.DMD.Unity/Plugins/**/*.so.* VisualPinball.Engine.DMD.Unity/Plugins/**/*.dylib +# ...but not their import settings: "*.so.*" also matches "libserum.so.meta" +!VisualPinball.Engine.DMD.Unity/Plugins/**/*.meta diff --git a/Tests/Player/ManagedDmdInputTests.cs b/Tests/Player/ManagedDmdInputTests.cs index 57b7727..73369f5 100644 --- a/Tests/Player/ManagedDmdInputTests.cs +++ b/Tests/Player/ManagedDmdInputTests.cs @@ -31,10 +31,10 @@ public void SetUp() _sourceIsCurrent = true; _failCreation = false; _errors = new List(); - _input = new ManagedDmdInput(_owner, (id, width, height) => { + _input = new ManagedDmdInput(_owner, (id, width, height, encoding) => { _owner.VerifyOwner(); if (_failCreation) throw new InvalidOperationException("Graph initialization failed."); - var pipeline = new Pipeline(id, width, height); + var pipeline = new Pipeline(id, width, height, encoding); _created.Add(pipeline); return pipeline; }, instance => _sourceIsCurrent, _errors.Add); @@ -73,6 +73,20 @@ public void SingleChangedFrameSurvivesWithoutAnyFurtherSourceEvents(bool sourceC Assert.That(_created[1].Frames[0].Instance, Is.EqualTo(changed.Instance)); } + [Test] + public void SwitchingBetweenGrayAndRgbRebuildsThePipeline() + { + _input.Feed(Frame(new byte[] { 1, 2 }), "dmd0"); + _input.Feed(new PluginDisplayFrame(new byte[] { 9, 8 }, 2, 1, 2, DisplayEncoding.Luminance8, 2, 2000, 1), "dmd0"); + Assert.That(_created.Count, Is.EqualTo(1), "gray stays gray, whatever the bit depth"); + var rgb = new PluginDisplayFrame(new byte[] { 1, 2, 3, 4, 5, 6 }, 2, 1, 6, DisplayEncoding.Rgb24, 3, 3000, 1); + _input.Feed(rgb, "dmd0"); + _created[0].FinishStop(); + PumpUntil(() => _created.Count == 2); + Assert.That(_created[1].Encoding, Is.EqualTo(DisplayEncoding.Rgb24)); + Assert.That(_created[1].Frames[0].Pixels.ToArray(), Is.EqualTo(new byte[] { 1, 2, 3, 4, 5, 6 })); + } + [Test] public void RebuildUsesLatestFrameAndItsShapeEncodingAndMetadata() { @@ -200,6 +214,7 @@ private sealed class Pipeline : IManagedDmdPipeline { internal readonly string Id; internal readonly int Width, Height; + internal readonly DisplayEncoding Encoding; internal readonly List Frames = new List(); private readonly TaskCompletionSource _stopped = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); internal bool Disposed; @@ -207,8 +222,8 @@ private sealed class Pipeline : IManagedDmdPipeline internal bool FailNextStop; internal int StopRequests; internal ReadOnlyMemory LastBorrowedPixels; - internal Pipeline(string id, int width, int height) { Id = id; Width = width; Height = height; } - public bool Matches(string id, int width, int height) => Id == id && Width == width && Height == height; + internal Pipeline(string id, int width, int height, DisplayEncoding encoding) { Id = id; Width = width; Height = height; Encoding = encoding; } + public bool Matches(string id, int width, int height, DisplayEncoding encoding) => Id == id && Width == width && Height == height && (Encoding == DisplayEncoding.Rgb24) == (encoding == DisplayEncoding.Rgb24); public void Push(in PluginDisplayFrame frame) { if (Disposed) throw new ObjectDisposedException(nameof(Pipeline)); diff --git a/Tests/Player/VisualPinball.Engine.DMD.Player.Tests.csproj b/Tests/Player/VisualPinball.Engine.DMD.Player.Tests.csproj index ff8b561..8a1e54a 100644 --- a/Tests/Player/VisualPinball.Engine.DMD.Player.Tests.csproj +++ b/Tests/Player/VisualPinball.Engine.DMD.Player.Tests.csproj @@ -4,11 +4,15 @@ true false ../../../VisualPinball.Engine + C:\Development\dmd-extensions + + + diff --git a/Tests/Player/VpeGleSourceTests.cs b/Tests/Player/VpeGleSourceTests.cs new file mode 100644 index 0000000..aee32e2 --- /dev/null +++ b/Tests/Player/VpeGleSourceTests.cs @@ -0,0 +1,112 @@ +// Visual Pinball Engine +// Copyright (C) 2026 freezy and VPE Team +// +// SPDX-License-Identifier: MIT +// Licensed under MIT. See https://opensource.org/license/mit. + +using System; +using System.Collections.Generic; +using LibDmd; +using LibDmd.Frame; +using LibDmd.Output; +using NUnit.Framework; +using VisualPinball.Engine.DMD.Unity; +using VisualPinball.Unity; + +namespace VisualPinball.Engine.DMD.Tests +{ + /// + /// Frames from an uncolorized source go through a real render graph, into a destination taking + /// every format (like the in-scene DMD) and one taking RGB only (like the presentation output). + /// + public sealed class VpeGleSourceTests + { + private const int Width = 4, Height = 2; + + [TestCase(DisplayFrameFormat.Dmd2, 3)] + [TestCase(DisplayFrameFormat.Dmd4, 15)] + [TestCase(DisplayFrameFormat.Dmd8, 255)] + public void GrayFramesReachBothDestinations(DisplayFrameFormat format, int max) + { + var source = VpeGleSource.Create(new DisplayConfig("dmd0", Width, Height), colorize: false, rgb: false); + var everyFormat = new EveryFormatDestination("every format"); + var rgbOnly = new RgbOnlyDestination("rgb only"); + using (Render(source, everyFormat, rgbOnly)) { + var frame = new byte[Width * Height]; + frame[0] = (byte)max; + source.Push(format, frame, frame.Length); + } + + Assert.That(everyFormat.Frames, Has.Count.EqualTo(1), "in-scene"); + Assert.That(everyFormat.Frames[0].Format, Is.EqualTo("Gray8")); + Assert.That(everyFormat.Frames[0].Data[0], Is.EqualTo(255)); + Assert.That(rgbOnly.Frames, Has.Count.EqualTo(1), "presentation"); + Assert.That(rgbOnly.Frames[0].Format, Is.EqualTo("Rgb24")); + } + + [Test] + public void RgbFramesReachBothDestinations() + { + var source = VpeGleSource.Create(new DisplayConfig("dmd0", Width, Height), colorize: false, rgb: true); + var everyFormat = new EveryFormatDestination("every format"); + var rgbOnly = new RgbOnlyDestination("rgb only"); + using (Render(source, everyFormat, rgbOnly)) { + var frame = new byte[Width * Height * 3]; + frame[0] = 200; + source.Push(DisplayFrameFormat.Dmd24, frame, frame.Length); + } + + Assert.That(everyFormat.Frames, Has.Count.EqualTo(1)); + Assert.That(everyFormat.Frames[0].Format, Is.EqualTo("Rgb24")); + Assert.That(everyFormat.Frames[0].Data[0], Is.EqualTo(200)); + Assert.That(rgbOnly.Frames, Has.Count.EqualTo(1)); + Assert.That(rgbOnly.Frames[0].Format, Is.EqualTo("Rgb24")); + } + + private static IDisposable Render(VpeGleSource source, params IDestination[] destinations) + { + var graph = new RenderGraph(new UndisposedReferences(), runOnMainThread: true) { + Name = "test", + Source = source, + Destinations = new List(destinations), + }; + return graph.Init().StartRendering(null, error => Assert.Fail(error.ToString())); + } + + private class RgbOnlyDestination : IRgb24Destination + { + internal readonly List<(string Format, byte[] Data)> Frames = new List<(string, byte[])>(); + + internal RgbOnlyDestination(string name) => Name = name; + + public string Name { get; } + public bool IsAvailable => true; + public bool NeedsDuplicateFrames => false; + public bool NeedsIdentificationFrames => false; + + public void RenderRgb24(DmdFrame frame) => Record("Rgb24", frame); + public void SetColor(DmdColor color) { } + public void SetPalette(DmdColor[] colors) { } + public void ClearColor() { } + public void ClearPalette() { } + public void ClearDisplay() { } + public void Dispose() { } + + protected void Record(string format, DmdFrame frame) => Frames.Add((format, (byte[])frame.Data.Clone())); + } + + // the formats of the in-scene DMD + private sealed class EveryFormatDestination : RgbOnlyDestination, IGray2Destination, IGray4Destination, IGray8Destination, IRgb565Destination, IFixedSizeDestination + { + internal EveryFormatDestination(string name) : base(name) { } + + public Dimensions FixedSize => new Dimensions(Width, Height); + public bool DmdAllowHdScaling => false; + + public void RenderGray2(DmdFrame frame) => Record("Gray2", frame); + public void RenderGray4(DmdFrame frame) => Record("Gray4", frame); + public void RenderGray8(DmdFrame frame) => Record("Gray8", frame); + public void RenderRgb565(DmdFrame frame) => Record("Rgb565", frame); + } + } +} diff --git a/Tests/Player/VpeTypes.cs b/Tests/Player/VpeTypes.cs new file mode 100644 index 0000000..b23cba5 --- /dev/null +++ b/Tests/Player/VpeTypes.cs @@ -0,0 +1,36 @@ +// Visual Pinball Engine +// Copyright (C) 2026 freezy and VPE Team +// +// SPDX-License-Identifier: MIT +// Licensed under MIT. See https://opensource.org/license/mit. + +// The two VisualPinball.Unity types VpeGleSource uses, so it compiles here without Unity. Same +// members and values as in VisualPinball.Unity's IGamelogicEngine.cs. +namespace VisualPinball.Unity +{ + public enum DisplayFrameFormat + { + Dmd2, + Dmd4, + Dmd8, + Dmd24, + Segment, + AlphaNumeric, + Numeric, + Video24 + } + + public class DisplayConfig + { + public readonly string Id; + public readonly int Width; + public readonly int Height; + + public DisplayConfig(string id, int width, int height) + { + Id = id; + Width = width; + Height = height; + } + } +} diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libcargs.so.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libcargs.so.meta new file mode 100644 index 0000000..302881d --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libcargs.so.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: ef23646cdc39d204b9e11d111dae817d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.1.1.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.1.1.meta new file mode 100644 index 0000000..8b42894 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.1.1.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: 2e277ba6f138d31499e7f7f9ec046d38 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.meta new file mode 100644 index 0000000..73f7264 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: 5f6a619a11874bcd8c152769259a5821 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 0 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.meta new file mode 100644 index 0000000..84f71b2 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: 37cc92de730b02a429321dee8e9d0420 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 0 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.2.5.2.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.2.5.2.meta new file mode 100644 index 0000000..246e58c --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.2.5.2.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: 51c2a282fa83ff44589b202fb75fc826 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.meta new file mode 100644 index 0000000..b06e014 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: a93c724d7dfa5274482b66d9f24e5a60 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 0 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.0.0.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.0.0.meta new file mode 100644 index 0000000..ae6a2e3 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.0.0.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: c752b4895c6478642be8803b01a005c4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.meta new file mode 100644 index 0000000..c531dc9 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: 09416a2038e94a8a9d515a512c27331c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 0 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libusb-1.0.so.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libusb-1.0.so.meta new file mode 100644 index 0000000..738623b --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libusb-1.0.so.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: 9309653f90a9e0f73d776726852a34ea +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 0 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.0.11.0.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.0.11.0.meta new file mode 100644 index 0000000..e9b41a5 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.0.11.0.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: 5bd17707c6f364149ba161ce36bb2190 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.meta b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.meta new file mode 100644 index 0000000..0d4d694 --- /dev/null +++ b/VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.meta @@ -0,0 +1,43 @@ +fileFormatVersion: 2 +guid: ecb2a0b7a7bee494eaf8b3b29c4ddc57 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 0 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Linux + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libSDL2.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libSDL2.dylib.meta index 7107f62..3eaa6b7 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libSDL2.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libSDL2.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 4d7fbceb16686e34d97cc9cdece1451d \ No newline at end of file +guid: 4d7fbceb16686e34d97cc9cdece1451d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libcargs.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libcargs.dylib.meta index 0f652c6..d15d335 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libcargs.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libcargs.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 60c202033ed641d4bb2b5283ac989687 \ No newline at end of file +guid: 60c202033ed641d4bb2b5283ac989687 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.0.dylib.meta index efd373a..4439ec9 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 12d417a14f1b9dc4e8ee6828c3cdbdf7 \ No newline at end of file +guid: 12d417a14f1b9dc4e8ee6828c3cdbdf7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.dylib.meta index d2d0ea2..4381226 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserialport.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: c37b0d9f8ddb9ff45a96939fb1e9b69f \ No newline at end of file +guid: c37b0d9f8ddb9ff45a96939fb1e9b69f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.2.5.2.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.2.5.2.dylib.meta index ac03cc6..f4f7ed0 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.2.5.2.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.2.5.2.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: aee7931b3b2c83240aacba77e085592d \ No newline at end of file +guid: aee7931b3b2c83240aacba77e085592d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.dylib.meta index f7d1412..d998331 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libserum.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 017bdf665d725e249ac7d9a43feaced1 \ No newline at end of file +guid: 017bdf665d725e249ac7d9a43feaced1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.0.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.0.0.dylib.meta index b246acc..061a66e 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.0.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.0.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 5c0f72263f8bed24588a2ef098cf79a5 \ No newline at end of file +guid: 5c0f72263f8bed24588a2ef098cf79a5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.dylib.meta index 5afc2bd..74537ef 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.1.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 3a6159c53023aaa47957077649d6305f \ No newline at end of file +guid: 3a6159c53023aaa47957077649d6305f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.dylib.meta index 7c1b810..9fd2503 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libsockpp.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: f4658d1452f73e84aaad50330ff52376 \ No newline at end of file +guid: f4658d1452f73e84aaad50330ff52376 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libusb-1.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libusb-1.0.dylib.meta index 8d27774..6030de2 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libusb-1.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libusb-1.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 7e778543c7150af64c3803f7e342cc7c \ No newline at end of file +guid: 7e778543c7150af64c3803f7e342cc7c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.0.11.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.0.11.0.dylib.meta index 7174994..945558a 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.0.11.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.0.11.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 3729f459396fab94fadb1ad3bac96950 \ No newline at end of file +guid: 3729f459396fab94fadb1ad3bac96950 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.dylib.meta index 7d7b6f0..ce45f55 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-arm64/libzedmd.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: b6e15f856bcdb944db6c59c8698261a1 \ No newline at end of file +guid: b6e15f856bcdb944db6c59c8698261a1 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: ARM64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: ARM64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libcargs.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libcargs.dylib.meta index 7a0e9bb..e74de48 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libcargs.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libcargs.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: f5df0427db414ec4da791bdf17f70abe \ No newline at end of file +guid: f5df0427db414ec4da791bdf17f70abe +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.0.dylib.meta index b326a8f..b015649 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: ac20a156a42cf2f49b362c7ef7f3aefc \ No newline at end of file +guid: ac20a156a42cf2f49b362c7ef7f3aefc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.dylib.meta index cdeee4d..aa44cca 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserialport.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 9743ea6e43bc51145badd0361f47e088 \ No newline at end of file +guid: 9743ea6e43bc51145badd0361f47e088 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.2.5.2.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.2.5.2.dylib.meta index 9b8757d..817d840 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.2.5.2.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.2.5.2.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 1d6c9598da73d684bb02cd419a5e9e51 \ No newline at end of file +guid: 1d6c9598da73d684bb02cd419a5e9e51 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.dylib.meta index 2188b07..0a3af6b 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libserum.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 2abf7ab8bcb604741a6aa8b036354000 \ No newline at end of file +guid: 2abf7ab8bcb604741a6aa8b036354000 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.0.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.0.0.dylib.meta index 149707e..12ebe0c 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.0.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.0.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 15be0c67f92678e4b90d37e2c7e00bdd \ No newline at end of file +guid: 15be0c67f92678e4b90d37e2c7e00bdd +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.dylib.meta index 490bead..3723f91 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.1.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 6fc49e6cae25c3a489a8f478c07ab159 \ No newline at end of file +guid: 6fc49e6cae25c3a489a8f478c07ab159 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.dylib.meta index 6ac7842..f0fde0a 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libsockpp.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 1118036b186ac284aa7596ad4207fcf7 \ No newline at end of file +guid: 1118036b186ac284aa7596ad4207fcf7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libusb-1.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libusb-1.0.dylib.meta index cf8c591..15ea27c 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libusb-1.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libusb-1.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 1753cd089ecd95195808d5283e27bccc \ No newline at end of file +guid: 1753cd089ecd95195808d5283e27bccc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.0.11.0.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.0.11.0.dylib.meta index 0b2256d..6e89f69 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.0.11.0.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.0.11.0.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 12c1fe4341a2fc54ab7cce53a23ab4d3 \ No newline at end of file +guid: 12c1fe4341a2fc54ab7cce53a23ab4d3 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.dylib.meta b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.dylib.meta index a4acf01..47d5d27 100644 --- a/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.dylib.meta +++ b/VisualPinball.Engine.DMD.Unity/Plugins/osx-x64/libzedmd.dylib.meta @@ -1,2 +1,43 @@ fileFormatVersion: 2 -guid: 28c640209821e7f46a3f81a66f691112 \ No newline at end of file +guid: 28c640209821e7f46a3f81a66f691112 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 0 + Exclude Android: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: OSX + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: x86_64 + userData: + assetBundleName: + assetBundleVariant: diff --git a/VisualPinball.Engine.DMD.Unity/Runtime/DmdBridgePlayer.cs b/VisualPinball.Engine.DMD.Unity/Runtime/DmdBridgePlayer.cs index 4b02a24..b88b660 100644 --- a/VisualPinball.Engine.DMD.Unity/Runtime/DmdBridgePlayer.cs +++ b/VisualPinball.Engine.DMD.Unity/Runtime/DmdBridgePlayer.cs @@ -103,6 +103,8 @@ public class DmdBridgePlayer : MonoBehaviour, IDiagnosticsSource private Player _player; private IGamelogicEngine _gamelogicEngine; private bool _managed; + // whether the frames are RGB rather than gray, which decides the pipeline's source + private bool _sourceRgb; private bool _shutdown; private GameObject _managedScene; private Func _presentationDestination; @@ -166,8 +168,8 @@ public void ConfigureManaged(DmdBridgeSettings settings, GameObject scene, Func< { if (_pipeline != null) throw new InvalidOperationException("Configure the DMD bridge before starting its pipeline."); _managed = true; _settings = settings.Clone(); _managedScene = scene; _presentationDestination = presentationDestination; _ownerScheduler = ownerScheduler; - _managedInput = new ManagedDmdInput(ownerScheduler, (displayId, width, height) => { - EnsurePipeline(new DisplayConfig(displayId, width, height), force: true); + _managedInput = new ManagedDmdInput(ownerScheduler, (displayId, width, height, encoding) => { + EnsurePipeline(new DisplayConfig(displayId, width, height), force: true, rgb: encoding == DisplayEncoding.Rgb24); return _pipeline; }, sourceIsCurrent, error => Logger.Warn(error, "[DMD] Could not replace the display graph; the next frame will retry.")); } @@ -291,7 +293,7 @@ private void HandleDisplayUpdateFrame(object sender, DisplayFrameData frame) if (_currentDisplay == null) { if (TryInferDisplayConfig(frame, out var inferredDisplay)) { Logger.Info("[DMD] Inferred display {DisplayId} as {Width}x{Height} from the frame stream.", inferredDisplay.Id, inferredDisplay.Width, inferredDisplay.Height); - EnsurePipeline(inferredDisplay); + EnsurePipeline(inferredDisplay, rgb: frame.Format == DisplayFrameFormat.Dmd24); } else if (!_missingDisplayWarningLogged) { Logger.Warn("[DMD] Got a frame for {DisplayId} before its dimensions were requested, and could not infer them from {Length} byte(s).", frame.Id, frame.Data?.Length ?? 0); _missingDisplayWarningLogged = true; @@ -303,6 +305,14 @@ private void HandleDisplayUpdateFrame(object sender, DisplayFrameData frame) } } + // the source carries either gray or RGB frames, see VpeGleSource.Create() + if (!_pipeline.Accepts(frame.Format)) { + EnsurePipeline(_currentDisplay, force: true, rgb: frame.Format == DisplayFrameFormat.Dmd24); + if (_pipeline == null) { + return; + } + } + _pipeline.Push(frame); } @@ -362,10 +372,12 @@ private static bool TryInferDimensions(int pixelCount, out int width, out int he } } - private void EnsurePipeline(DisplayConfig display, bool force = false) + private void EnsurePipeline(DisplayConfig display, bool force = false, bool? rgb = null) { _currentDisplay = display; - if (!force && _pipeline != null && _pipeline.Matches(display)) { + // without a frame to go by, keep the format the last pipeline was built for + _sourceRgb = rgb ?? _sourceRgb; + if (!force && _pipeline != null && _pipeline.Matches(display) && _pipeline.Accepts(_sourceRgb ? DisplayFrameFormat.Dmd24 : DisplayFrameFormat.Dmd8)) { return; } @@ -383,7 +395,7 @@ private void EnsurePipeline(DisplayConfig display, bool force = false) var converter = CreateConverter(); _resolvedConverter = converter?.Name ?? "none"; RequestSourceFrameFormat(converter != null ? DisplayFrameFormat.Dmd4 : DisplayFrameFormat.Dmd8); - _pipeline = new DmdPipeline(display, destinations, converter, _settings.FlipHorizontally); + _pipeline = new DmdPipeline(display, destinations, converter, _settings.FlipHorizontally, _sourceRgb); Logger.Info("[DMD] Pipeline for {DisplayId} ({Width}x{Height}) created with {Count} destination(s): {Destinations:l}, colorization: {Colorization:l}.", display.Id, display.Width, display.Height, destinations.Count, _destinationNames, _colorization); PublishDiagnostics(); diff --git a/VisualPinball.Engine.DMD.Unity/Runtime/DmdPipeline.cs b/VisualPinball.Engine.DMD.Unity/Runtime/DmdPipeline.cs index dda83a6..a79d610 100644 --- a/VisualPinball.Engine.DMD.Unity/Runtime/DmdPipeline.cs +++ b/VisualPinball.Engine.DMD.Unity/Runtime/DmdPipeline.cs @@ -36,6 +36,7 @@ internal sealed class DmdPipeline : IManagedDmdPipeline { private readonly DisplayConfig _display; private readonly VpeGleSource _source; + private readonly bool _rgb; private readonly List _destinations; private readonly RenderGraph _renderGraph; private readonly IDisposable _renderer; @@ -64,11 +65,12 @@ internal sealed class DmdPipeline : IManagedDmdPipeline private readonly LogThrottle _frameFailureThrottle = new LogThrottle(3, TimeSpan.FromSeconds(30)); private readonly LogThrottle _renderGraphErrorThrottle = new LogThrottle(3, TimeSpan.FromSeconds(30)); - public DmdPipeline(DisplayConfig display, List destinations, AbstractConverter converter, bool flipHorizontally) + public DmdPipeline(DisplayConfig display, List destinations, AbstractConverter converter, bool flipHorizontally, bool rgb) { _display = display; _destinations = destinations; - _source = VpeGleSource.Create(display, converter != null); + _rgb = rgb; + _source = VpeGleSource.Create(display, converter != null, rgb); _renderGraph = new RenderGraph(new UndisposedReferences(), runOnMainThread: true) { Name = $"VPE DMD ({display.Id})", Source = _source, @@ -104,12 +106,16 @@ public bool Matches(DisplayConfig display) && _display.FlipX == display.FlipX; } - public bool Matches(string displayId, int width, int height) + public bool Matches(string displayId, int width, int height, DisplayEncoding encoding) { return string.Equals(_display.Id, displayId, StringComparison.OrdinalIgnoreCase) - && _display.Width == width && _display.Height == height; + && _display.Width == width && _display.Height == height + && (encoding == DisplayEncoding.Rgb24) == _rgb; } + /// Whether the source was built for frames of this format, gray or RGB. + public bool Accepts(DisplayFrameFormat format) => (format == DisplayFrameFormat.Dmd24) == _rgb; + /// Called on the Unity main thread. Copies the frame and signals the worker. public void Push(DisplayFrameData frame) { diff --git a/VisualPinball.Engine.DMD.Unity/Runtime/InSceneDmdDestination.cs b/VisualPinball.Engine.DMD.Unity/Runtime/InSceneDmdDestination.cs index 88f7b44..14e7e75 100644 --- a/VisualPinball.Engine.DMD.Unity/Runtime/InSceneDmdDestination.cs +++ b/VisualPinball.Engine.DMD.Unity/Runtime/InSceneDmdDestination.cs @@ -24,6 +24,7 @@ internal sealed class InSceneDmdDestination : IGray2Destination, IGray4Destinati private readonly Dimensions _size; private readonly bool _previousReceiveGamelogicFrames; private bool _disposed; + private bool _receivedFrame; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -127,6 +128,10 @@ private void Render(DisplayFrameFormat format, DmdFrame frame) if (_disposed || _display == null || frame?.Data == null) { return; } + if (!_receivedFrame) { + _receivedFrame = true; + Logger.Info("[DMD] First frame for the in-scene display {DisplayId} ({Format}).", _display.Id, format); + } _framePump.Enqueue(format, frame.Data); } diff --git a/VisualPinball.Engine.DMD.Unity/Runtime/ManagedDmdInput.cs b/VisualPinball.Engine.DMD.Unity/Runtime/ManagedDmdInput.cs index b17be70..44fca51 100644 --- a/VisualPinball.Engine.DMD.Unity/Runtime/ManagedDmdInput.cs +++ b/VisualPinball.Engine.DMD.Unity/Runtime/ManagedDmdInput.cs @@ -12,7 +12,7 @@ namespace VisualPinball.Engine.DMD.Unity { internal interface IManagedDmdPipeline : IDisposable { - bool Matches(string displayId, int width, int height); + bool Matches(string displayId, int width, int height, DisplayEncoding encoding); void Push(in PluginDisplayFrame frame); Task StopWorkerAsync(); } @@ -21,7 +21,7 @@ internal interface IManagedDmdPipeline : IDisposable internal sealed class ManagedDmdInput { private readonly OwnerScheduler _owner; - private readonly Func _create; + private readonly Func _create; private readonly Func _sourceIsCurrent; private readonly Action _reportError; private long _instance; @@ -34,7 +34,7 @@ internal sealed class ManagedDmdInput private string _pendingDisplayId; internal IManagedDmdPipeline Pipeline { get; private set; } - internal ManagedDmdInput(OwnerScheduler owner, Func create, Func sourceIsCurrent = null, Action reportError = null) + internal ManagedDmdInput(OwnerScheduler owner, Func create, Func sourceIsCurrent = null, Action reportError = null) { _owner = owner ?? throw new ArgumentNullException(nameof(owner)); _create = create ?? throw new ArgumentNullException(nameof(create)); @@ -51,7 +51,7 @@ internal void Feed(in PluginDisplayFrame frame, string displayId) return; } _replacement = null; - if (Pipeline != null && (_replacementRequired || _instance != frame.Instance || !Pipeline.Matches(displayId, frame.Width, frame.Height))) { + if (Pipeline != null && (_replacementRequired || _instance != frame.Instance || !Pipeline.Matches(displayId, frame.Width, frame.Height, frame.Encoding))) { Retain(frame, displayId); _replacement = ReplaceAsync(Pipeline); return; @@ -71,7 +71,7 @@ private void Retain(in PluginDisplayFrame frame, string displayId) private void StartOrPush(in PluginDisplayFrame frame, string displayId) { - Pipeline ??= _create(displayId, frame.Width, frame.Height); + Pipeline ??= _create(displayId, frame.Width, frame.Height, frame.Encoding); _instance = frame.Instance; Pipeline?.Push(frame); } diff --git a/VisualPinball.Engine.DMD.Unity/Runtime/VpeGleSource.cs b/VisualPinball.Engine.DMD.Unity/Runtime/VpeGleSource.cs index df4dd46..ec8ce08 100644 --- a/VisualPinball.Engine.DMD.Unity/Runtime/VpeGleSource.cs +++ b/VisualPinball.Engine.DMD.Unity/Runtime/VpeGleSource.cs @@ -24,13 +24,20 @@ protected VpeGleSource(string displayId, int width, int height) Dimensions = new Dimensions(width, height); } - public static VpeGleSource Create(DisplayConfig display, bool colorize) + /// + /// The render graph connects each destination to one format of the source, the first one + /// both support, so an uncolorized source offers only the format its frames come in: gray + /// (any bit depth, as 8-bit) or RGB. The pipeline is rebuilt when frames switch between them. + /// + public static VpeGleSource Create(DisplayConfig display, bool colorize, bool rgb) { if (colorize) { return new ColorizableVpeGleSource(display.Id, display.Width, display.Height); } - return new PassthroughVpeGleSource(display.Id, display.Width, display.Height); + return rgb + ? new Rgb24VpeGleSource(display.Id, display.Width, display.Height) + : new GrayVpeGleSource(display.Id, display.Width, display.Height); } /// @@ -60,14 +67,11 @@ protected DmdFrame CreateGray8Frame(byte[] data, int length, int maxValue) return new DmdFrame(Dimensions, copy, 8); } - private sealed class PassthroughVpeGleSource : VpeGleSource, IGray2Source, IGray4Source, IGray8Source, IRgb24Source + private sealed class GrayVpeGleSource : VpeGleSource, IGray8Source { - private readonly Subject _gray2Frames = new Subject(); - private readonly Subject _gray4Frames = new Subject(); private readonly Subject _gray8Frames = new Subject(); - private readonly Subject _rgb24Frames = new Subject(); - public PassthroughVpeGleSource(string displayId, int width, int height) : base(displayId, width, height) + public GrayVpeGleSource(string displayId, int width, int height) : base(displayId, width, height) { } @@ -75,27 +79,34 @@ public override void Push(DisplayFrameFormat format, byte[] data, int length) { switch (format) { case DisplayFrameFormat.Dmd2: - _gray2Frames.OnNext(CreateFrame(data, length, 2)); _gray8Frames.OnNext(CreateGray8Frame(data, length, 3)); break; case DisplayFrameFormat.Dmd4: - _gray4Frames.OnNext(CreateFrame(data, length, 4)); _gray8Frames.OnNext(CreateGray8Frame(data, length, 15)); break; case DisplayFrameFormat.Dmd8: _gray8Frames.OnNext(CreateFrame(data, length, 8)); break; - case DisplayFrameFormat.Dmd24: - _rgb24Frames.OnNext(CreateFrame(data, length, 24)); - break; } } - public IObservable GetGray2Frames(bool dedupe, bool skipIdentificationFrames) => _gray2Frames; + public IObservable GetGray8Frames(bool dedupe) => _gray8Frames; + } - public IObservable GetGray4Frames(bool dedupe, bool skipIdentificationFrames) => _gray4Frames; + private sealed class Rgb24VpeGleSource : VpeGleSource, IRgb24Source + { + private readonly Subject _rgb24Frames = new Subject(); - public IObservable GetGray8Frames(bool dedupe) => _gray8Frames; + public Rgb24VpeGleSource(string displayId, int width, int height) : base(displayId, width, height) + { + } + + public override void Push(DisplayFrameFormat format, byte[] data, int length) + { + if (format == DisplayFrameFormat.Dmd24) { + _rgb24Frames.OnNext(CreateFrame(data, length, 24)); + } + } public IObservable GetRgb24Frames() => _rgb24Frames; } diff --git a/VisualPinball.Engine.DMD/VisualPinball.Engine.DMD.csproj b/VisualPinball.Engine.DMD/VisualPinball.Engine.DMD.csproj index 7d21277..f09502a 100644 --- a/VisualPinball.Engine.DMD/VisualPinball.Engine.DMD.csproj +++ b/VisualPinball.Engine.DMD/VisualPinball.Engine.DMD.csproj @@ -97,6 +97,17 @@ + + + <_LinuxSockpp Include="$(LibDmdNativeRoot)\linux-x64\native\libsockpp.so.1.*" /> + + +