From b661acb71fc2a2633e9de5cc172301ca3c9ed21b Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 16 Oct 2026 00:35:59 +0200 Subject: [PATCH 1/4] unity: Ship the Linux natives in Linux players. The ignore rule for versioned .so files also swallowed their .meta files, so the Linux natives had no import settings and weren't included in player builds. libusb, libserialport, libserum and libzedmd are now enabled for Linux, the versioned duplicates and libcargs are left out, and the build deploys libserialport.so.0 and libsockpp.so.1, which libzedmd loads by soname. --- .gitignore | 2 + .../Plugins/linux-x64/libcargs.so.meta | 43 +++++++++++++++++++ .../linux-x64/libserialport.so.0.1.1.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libserialport.so.0.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libserialport.so.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libserum.so.2.5.2.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libserum.so.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libsockpp.so.1.0.0.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libsockpp.so.1.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libusb-1.0.so.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libzedmd.so.0.11.0.meta | 43 +++++++++++++++++++ .../Plugins/linux-x64/libzedmd.so.meta | 43 +++++++++++++++++++ .../VisualPinball.Engine.DMD.csproj | 11 +++++ 13 files changed, 486 insertions(+) create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libcargs.so.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.1.1.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.0.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserialport.so.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.2.5.2.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libserum.so.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.0.0.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libsockpp.so.1.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libusb-1.0.so.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.0.11.0.meta create mode 100644 VisualPinball.Engine.DMD.Unity/Plugins/linux-x64/libzedmd.so.meta 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/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/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.*" /> + + + From 3c20683eb45c47b6ae954081eff8acecef4cd9cd Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 16 Oct 2026 00:54:22 +0200 Subject: [PATCH 2/4] unity: Import settings for the macOS natives, per CPU, without the versioned duplicates. --- .../Plugins/osx-arm64/libSDL2.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-arm64/libcargs.dylib.meta | 43 ++++++++++++++++++- .../osx-arm64/libserialport.0.dylib.meta | 43 ++++++++++++++++++- .../osx-arm64/libserialport.dylib.meta | 43 ++++++++++++++++++- .../osx-arm64/libserum.2.5.2.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-arm64/libserum.dylib.meta | 43 ++++++++++++++++++- .../osx-arm64/libsockpp.1.0.0.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-arm64/libsockpp.1.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-arm64/libsockpp.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-arm64/libusb-1.0.dylib.meta | 43 ++++++++++++++++++- .../osx-arm64/libzedmd.0.11.0.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-arm64/libzedmd.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libcargs.dylib.meta | 43 ++++++++++++++++++- .../osx-x64/libserialport.0.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libserialport.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libserum.2.5.2.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libserum.dylib.meta | 43 ++++++++++++++++++- .../osx-x64/libsockpp.1.0.0.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libsockpp.1.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libsockpp.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libusb-1.0.dylib.meta | 43 ++++++++++++++++++- .../osx-x64/libzedmd.0.11.0.dylib.meta | 43 ++++++++++++++++++- .../Plugins/osx-x64/libzedmd.dylib.meta | 43 ++++++++++++++++++- 23 files changed, 966 insertions(+), 23 deletions(-) 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: From c3f1ecfdf3546ce7864f9dacdc21e67ac0e652ed Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 16 Oct 2026 02:54:23 +0200 Subject: [PATCH 3/4] dmd: Offer one frame format per uncolorized source, so frames reach the displays without colorization. --- Tests/Player/ManagedDmdInputTests.cs | 23 +++++++++-- .../Runtime/DmdBridgePlayer.cs | 24 ++++++++--- .../Runtime/DmdPipeline.cs | 14 +++++-- .../Runtime/InSceneDmdDestination.cs | 5 +++ .../Runtime/ManagedDmdInput.cs | 10 ++--- .../Runtime/VpeGleSource.cs | 41 ++++++++++++------- 6 files changed, 83 insertions(+), 34 deletions(-) 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/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; } From 03bbbeab9e564b966c7c9ecbd4bbb644f40f36f2 Mon Sep 17 00:00:00 2001 From: freezy Date: Fri, 16 Oct 2026 11:03:27 +0200 Subject: [PATCH 4/4] test: Uncolorized frames through a real render graph reach every-format and RGB-only destinations. --- ...sualPinball.Engine.DMD.Player.Tests.csproj | 4 + Tests/Player/VpeGleSourceTests.cs | 112 ++++++++++++++++++ Tests/Player/VpeTypes.cs | 36 ++++++ 3 files changed, 152 insertions(+) create mode 100644 Tests/Player/VpeGleSourceTests.cs create mode 100644 Tests/Player/VpeTypes.cs 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; + } + } +}