diff --git a/Assets/uDesktopDuplication/Scenes.meta b/Assets/uDesktopDuplication/Examples.meta similarity index 100% rename from Assets/uDesktopDuplication/Scenes.meta rename to Assets/uDesktopDuplication/Examples.meta diff --git a/Assets/uDesktopDuplication/Examples/Prefabs.meta b/Assets/uDesktopDuplication/Examples/Prefabs.meta new file mode 100644 index 0000000..73b3f05 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Prefabs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 678e1de5e6de7914baed516a78940503 +folderAsset: yes +timeCreated: 1477643728 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor.prefab b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor.prefab new file mode 100644 index 0000000..d362059 Binary files /dev/null and b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor.prefab differ diff --git a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor.prefab.meta b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor.prefab.meta new file mode 100644 index 0000000..940e365 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de6f36e446e5e8a48bf61fe198985bb4 +timeCreated: 1477643732 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scenes.meta b/Assets/uDesktopDuplication/Examples/Scenes.meta new file mode 100644 index 0000000..f0bb05b --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scenes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0a3456d4b2f59e84f969e31deca4016d +folderAsset: yes +timeCreated: 1477643596 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Scenes/Example.unity b/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity similarity index 61% rename from Assets/uDesktopDuplication/Scenes/Example.unity rename to Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity index 368eaa2..69ff890 100644 Binary files a/Assets/uDesktopDuplication/Scenes/Example.unity and b/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity differ diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity.meta b/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity.meta new file mode 100644 index 0000000..b095ace --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 445860b05342be845967392bfd70224e +timeCreated: 1477643648 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Primary Monitor.unity b/Assets/uDesktopDuplication/Examples/Scenes/Primary Monitor.unity new file mode 100644 index 0000000..061c591 Binary files /dev/null and b/Assets/uDesktopDuplication/Examples/Scenes/Primary Monitor.unity differ diff --git a/Assets/uDesktopDuplication/Scenes/Example.unity.meta b/Assets/uDesktopDuplication/Examples/Scenes/Primary Monitor.unity.meta similarity index 100% rename from Assets/uDesktopDuplication/Scenes/Example.unity.meta rename to Assets/uDesktopDuplication/Examples/Scenes/Primary Monitor.unity.meta diff --git a/Assets/uDesktopDuplication/Examples/Scripts.meta b/Assets/uDesktopDuplication/Examples/Scripts.meta new file mode 100644 index 0000000..ea48898 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 71921882396f0f345aa8a66e2fcb0b6c +folderAsset: yes +timeCreated: 1477643608 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs new file mode 100644 index 0000000..b116264 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs @@ -0,0 +1,20 @@ +using UnityEngine; + +public class MultipleMonitorCreator : MonoBehaviour +{ + [SerializeField] GameObject monitorPrefab; + [SerializeField] Vector3 margin = new Vector3(20f, 0f, 0f); + + void Start() + { + var monitors = uDesktopDuplication.Manager.monitors; + var n = monitors.Count; + for (int i = 0 ; i < n; ++i) { + var go = Instantiate(monitorPrefab); + go.transform.position = transform.position + margin * (i - n / 2f + 0.5f); + var texture = go.GetComponent(); + texture.monitorId = i; + } + } +} + diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs.meta b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs.meta new file mode 100644 index 0000000..36917ef --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorCreator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fb22986017201f74aa864dcbf0cab751 +timeCreated: 1477643778 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll index aa96a8a..bf5b12a 100644 Binary files a/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll differ diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Cursor.cs b/Assets/uDesktopDuplication/Scripts/Cursor.cs similarity index 79% rename from Assets/uDesktopDuplication/Scripts/uDD_Cursor.cs rename to Assets/uDesktopDuplication/Scripts/Cursor.cs index 92ee8d7..e820b87 100644 --- a/Assets/uDesktopDuplication/Scripts/uDD_Cursor.cs +++ b/Assets/uDesktopDuplication/Scripts/Cursor.cs @@ -3,8 +3,9 @@ namespace uDesktopDuplication { -[RequireComponent(typeof(uDD_Texture))] -public class uDD_Cursor : MonoBehaviour +[AddComponentMenu("uDesktopDuplication/Cursor"), + RequireComponent(typeof(Texture))] +public class Cursor : MonoBehaviour { [SerializeField] Transform cursor; @@ -13,11 +14,11 @@ public class uDD_Cursor : MonoBehaviour [SerializeField] Vector2 offset = new Vector2(0.5f, 0.5f); - private uDD_Texture texture_; + private Texture texture_; void OnEnable() { - texture_ = GetComponent(); + texture_ = GetComponent(); } void Update() diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Cursor.cs.meta b/Assets/uDesktopDuplication/Scripts/Cursor.cs.meta similarity index 100% rename from Assets/uDesktopDuplication/Scripts/uDD_Cursor.cs.meta rename to Assets/uDesktopDuplication/Scripts/Cursor.cs.meta diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Lib.cs b/Assets/uDesktopDuplication/Scripts/Lib.cs similarity index 88% rename from Assets/uDesktopDuplication/Scripts/uDD_Lib.cs rename to Assets/uDesktopDuplication/Scripts/Lib.cs index f3b7d71..2016a75 100644 --- a/Assets/uDesktopDuplication/Scripts/uDD_Lib.cs +++ b/Assets/uDesktopDuplication/Scripts/Lib.cs @@ -5,11 +5,13 @@ using System.Runtime.InteropServices; namespace uDesktopDuplication { -public static class uDD_Lib +public static class Lib { [DllImport("uDesktopDuplication")] public static extern int GetMonitorCount(); [DllImport("uDesktopDuplication")] + public static extern void SetTimeout(int timeout); + [DllImport("uDesktopDuplication")] public static extern IntPtr GetRenderEventFunc(); [DllImport("uDesktopDuplication")] public static extern void GetName(int id, StringBuilder buf, int len); diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Lib.cs.meta b/Assets/uDesktopDuplication/Scripts/Lib.cs.meta similarity index 100% rename from Assets/uDesktopDuplication/Scripts/uDD_Lib.cs.meta rename to Assets/uDesktopDuplication/Scripts/Lib.cs.meta diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Manager.cs b/Assets/uDesktopDuplication/Scripts/Manager.cs similarity index 58% rename from Assets/uDesktopDuplication/Scripts/uDD_Manager.cs rename to Assets/uDesktopDuplication/Scripts/Manager.cs index 396a235..0220dde 100644 --- a/Assets/uDesktopDuplication/Scripts/uDD_Manager.cs +++ b/Assets/uDesktopDuplication/Scripts/Manager.cs @@ -5,26 +5,31 @@ using System.Collections.Generic; namespace uDesktopDuplication { -public class uDD_Manager : MonoBehaviour +public class Manager : MonoBehaviour { - private static uDD_Manager instance_; - public static uDD_Manager instance + private static Manager instance_; + public static Manager instance { get { if (instance_) return instance_; var go = new GameObject("uDesktopDuplicationManager"); - return go.AddComponent(); + return go.AddComponent(); } } - private List monitors_ = new List(); - static public List monitors + private List monitors_ = new List(); + static public List monitors { get { return instance.monitors_; } } - static public uDD_Monitor primary + static public int monitorCount + { + get { return instance.monitors_.Count; } + } + + static public Monitor primary { get { @@ -32,6 +37,9 @@ public class uDD_Manager : MonoBehaviour } } + [SerializeField, Tooltip("Set Desktop Duplication API timeout (milliseconds).")] + int timeout = 0; + private Coroutine renderCoroutine_ = null; void Awake() @@ -39,9 +47,11 @@ public class uDD_Manager : MonoBehaviour if (instance_ != null) return; instance_ = this; - for (int i = 0; i < uDD_Monitor.count; ++i) { - monitors.Add(new uDD_Monitor(i)); + for (int i = 0; i < Lib.GetMonitorCount(); ++i) { + monitors.Add(new Monitor(i)); } + + Lib.SetTimeout(timeout); } void OnEnable() @@ -61,7 +71,8 @@ public class uDD_Manager : MonoBehaviour { for (;;) { yield return new WaitForEndOfFrame(); - foreach (var monitor in monitors) { + for (int i = 0; i < monitors.Count; ++i) { + var monitor = monitors[i]; if (monitor.shouldBeUpdated) { monitor.Render(); } diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Manager.cs.meta b/Assets/uDesktopDuplication/Scripts/Manager.cs.meta similarity index 100% rename from Assets/uDesktopDuplication/Scripts/uDD_Manager.cs.meta rename to Assets/uDesktopDuplication/Scripts/Manager.cs.meta diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Monitor.cs b/Assets/uDesktopDuplication/Scripts/Monitor.cs similarity index 54% rename from Assets/uDesktopDuplication/Scripts/uDD_Monitor.cs rename to Assets/uDesktopDuplication/Scripts/Monitor.cs index 800b6f7..db5ac75 100644 --- a/Assets/uDesktopDuplication/Scripts/uDD_Monitor.cs +++ b/Assets/uDesktopDuplication/Scripts/Monitor.cs @@ -3,18 +3,13 @@ namespace uDesktopDuplication { -public class uDD_Monitor +public class Monitor { - public uDD_Monitor(int id) + public Monitor(int id) { this.id = id; } - public static int count - { - get { return uDD_Lib.GetMonitorCount(); } - } - public int id { get; @@ -23,37 +18,37 @@ public class uDD_Monitor public string name { - get { return uDD_Lib.GetName(id); } + get { return Lib.GetName(id); } } public bool isPrimary { - get { return uDD_Lib.IsPrimary(id); } + get { return Lib.IsPrimary(id); } } public int width { - get { return uDD_Lib.GetWidth(id); } + get { return Lib.GetWidth(id); } } public int height { - get { return uDD_Lib.GetHeight(id); } + get { return Lib.GetHeight(id); } } public bool isPointerVisible { - get { return uDD_Lib.IsPointerVisible(id); } + get { return Lib.IsPointerVisible(id); } } public int pointerX { - get { return uDD_Lib.GetPointerX(id); } + get { return Lib.GetPointerX(id); } } public int pointerY { - get { return uDD_Lib.GetPointerY(id); } + get { return Lib.GetPointerY(id); } } public bool shouldBeUpdated @@ -69,7 +64,7 @@ public class uDD_Monitor { if (texture_ == null) { texture_ = new Texture2D(width, height, TextureFormat.BGRA32, false); - uDD_Lib.SetTexturePtr(id, texture_.GetNativeTexturePtr()); + Lib.SetTexturePtr(id, texture_.GetNativeTexturePtr()); } return texture_; } @@ -77,7 +72,7 @@ public class uDD_Monitor public void Render() { - GL.IssuePluginEvent(uDD_Lib.GetRenderEventFunc(), id); + GL.IssuePluginEvent(Lib.GetRenderEventFunc(), id); } } diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Monitor.cs.meta b/Assets/uDesktopDuplication/Scripts/Monitor.cs.meta similarity index 100% rename from Assets/uDesktopDuplication/Scripts/uDD_Monitor.cs.meta rename to Assets/uDesktopDuplication/Scripts/Monitor.cs.meta diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Texture.cs b/Assets/uDesktopDuplication/Scripts/Texture.cs similarity index 51% rename from Assets/uDesktopDuplication/Scripts/uDD_Texture.cs rename to Assets/uDesktopDuplication/Scripts/Texture.cs index 647e584..2f5ba05 100644 --- a/Assets/uDesktopDuplication/Scripts/uDD_Texture.cs +++ b/Assets/uDesktopDuplication/Scripts/Texture.cs @@ -3,9 +3,26 @@ namespace uDesktopDuplication { -public class uDD_Texture : MonoBehaviour +[AddComponentMenu("uDesktopDuplication/Texture")] +public class Texture : MonoBehaviour { - public uDD_Monitor monitor { get; set; } + private Monitor monitor_; + public Monitor monitor + { + get { return monitor_; } + set + { + monitor_ = value; + material_ = GetComponent().material; + material_.mainTexture = monitor_.texture; + } + } + + public int monitorId + { + get { return monitor.id; } + set { monitor = Manager.monitors[Mathf.Clamp(value, 0, Manager.monitorCount - 1)]; } + } public bool invertX = false; public bool invertY = false; @@ -15,10 +32,8 @@ public class uDD_Texture : MonoBehaviour void OnEnable() { if (monitor == null) { - monitor = uDD_Manager.primary; + monitor = Manager.primary; } - material_ = GetComponent().material; - material_.mainTexture = monitor.texture; } void Update() diff --git a/Assets/uDesktopDuplication/Scripts/uDD_Texture.cs.meta b/Assets/uDesktopDuplication/Scripts/Texture.cs.meta similarity index 100% rename from Assets/uDesktopDuplication/Scripts/uDD_Texture.cs.meta rename to Assets/uDesktopDuplication/Scripts/Texture.cs.meta diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 22bf2ba..7186f83 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -26,6 +26,7 @@ namespace }; IUnityInterfaces* g_unity = nullptr; + int g_timeout = 10; std::vector g_monitors; } @@ -113,8 +114,7 @@ extern "C" IDXGIResource* resource = nullptr; DXGI_OUTDUPL_FRAME_INFO frameInfo; - const UINT timeout = 100; // ms - hr = monitor.output->AcquireNextFrame(timeout, &frameInfo, &resource); + hr = monitor.output->AcquireNextFrame(g_timeout, &frameInfo, &resource); switch (hr) { case S_OK: @@ -123,7 +123,7 @@ extern "C" } case DXGI_ERROR_ACCESS_LOST: { - FinalizeDuplication(); + resource->Release(); InitializeDuplication(); return; } @@ -142,16 +142,17 @@ extern "C" if (hr != S_OK) { resource->Release(); + monitor.output->ReleaseFrame(); return; } - resource->Release(); - ID3D11DeviceContext* context; auto device = g_unity->Get()->GetDevice(); device->GetImmediateContext(&context); context->CopyResource(monitor.texture, texture); + resource->Release(); + texture->Release(); monitor.output->ReleaseFrame(); } @@ -165,6 +166,11 @@ extern "C" return g_monitors.size(); } + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API SetTimeout(int timeout) + { + g_timeout = timeout; + } + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API GetName(int id, char* buf, int len) { if (!DoesMonitorExist(id)) return;