From 33a55d95bda5e2d05d948757583f29268e42d5b2 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sun, 6 Nov 2016 23:28:33 +0900 Subject: [PATCH] add clipping function and the example. --- .../Examples/Scenes/Zoom.unity | Bin 0 -> 16224 bytes .../Examples/Scenes/Zoom.unity.meta | 8 ++++ .../Examples/Scripts/Loupe.cs | 37 ++++++++++++++++++ .../Examples/Scripts/Loupe.cs.meta | 12 ++++++ .../Plugins/uDesktopDuplication.dll | Bin 35328 -> 35328 bytes Assets/uDesktopDuplication/Scripts/Cursor.cs | 5 +-- Assets/uDesktopDuplication/Scripts/Lib.cs | 2 + Assets/uDesktopDuplication/Scripts/Manager.cs | 5 +++ Assets/uDesktopDuplication/Scripts/Monitor.cs | 2 +- Assets/uDesktopDuplication/Scripts/Texture.cs | 26 ++++++++++++ .../Shaders/uDD_Common.cginc | 29 +++++++++----- .../Shaders/uDD_Params.cginc | 11 ++++++ .../Shaders/uDD_Standard.shader | 6 +-- .../Shaders/uDD_Unlit.shader | 7 ++-- .../Shaders/uDD_Unlit_BlackMask.shader | 6 +-- .../Shaders/uDD_Unlit_Transparent.shader | 6 +-- .../uDesktopDuplication/Cursor.cpp | 3 +- .../uDesktopDuplication/Monitor.cpp | 20 +++++----- .../uDesktopDuplication/main.cpp | 6 +++ 19 files changed, 155 insertions(+), 36 deletions(-) create mode 100644 Assets/uDesktopDuplication/Examples/Scenes/Zoom.unity create mode 100644 Assets/uDesktopDuplication/Examples/Scenes/Zoom.unity.meta create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs.meta diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Zoom.unity b/Assets/uDesktopDuplication/Examples/Scenes/Zoom.unity new file mode 100644 index 0000000000000000000000000000000000000000..22b39dba3ee014a8ab07b9485a44aa5d8ece8f9d GIT binary patch literal 16224 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 G&;JF9`w->; literal 0 HcmV?d00001 diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Zoom.unity.meta b/Assets/uDesktopDuplication/Examples/Scenes/Zoom.unity.meta new file mode 100644 index 0000000..47c4a16 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scenes/Zoom.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3d41026babadc241b9d0852b0831584 +timeCreated: 1478436298 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs b/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs new file mode 100644 index 0000000..b876a28 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +public class Loupe : MonoBehaviour +{ + private uDesktopDuplication.Texture uddTexture_; + public float zoom = 3f; + public float aspect = 1f; + + void Start() + { + uddTexture_ = GetComponent(); + uddTexture_.useClip = true; + } + + void Update() + { + // To get other monitor textures, set dirty flag. + foreach (var monitor in uDesktopDuplication.Manager.monitors) { + monitor.CreateTexture(); + monitor.shouldBeUpdated = true; + } + + if (!uddTexture_.monitor.isCursorVisible) { + uddTexture_.monitorId = uDesktopDuplication.Manager.cursorMonitorId; + } + + var x = (float)uddTexture_.monitor.cursorX / uddTexture_.monitor.width; + var y = (float)uddTexture_.monitor.cursorY / uddTexture_.monitor.height; + var w = 1f / zoom; + var h = w / aspect * uddTexture_.monitor.aspect; + x = Mathf.Clamp(x - w / 2, 0f, 1f - w); + y = Mathf.Clamp(y - h / 2, 0f, 1f - h); + uddTexture_.clipPos = new Vector2(x, y); + uddTexture_.clipScale = new Vector2(w, h); + } +} + diff --git a/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs.meta b/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs.meta new file mode 100644 index 0000000..3519a13 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: efd9499cdb931b945947a2cd47909676 +timeCreated: 1478438457 +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 a0c48967a42ef8812acdf20ef295b0922115cecb..6639cdede0994e95d6dfa4bd0cfe2d307d04fca2 100644 GIT binary patch delta 8791 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 delta 8780 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 KonJa5hyD*DS)=~| diff --git a/Assets/uDesktopDuplication/Scripts/Cursor.cs b/Assets/uDesktopDuplication/Scripts/Cursor.cs index b362203..cad4640 100644 --- a/Assets/uDesktopDuplication/Scripts/Cursor.cs +++ b/Assets/uDesktopDuplication/Scripts/Cursor.cs @@ -60,9 +60,8 @@ public class Cursor : MonoBehaviour void UpdateMaterial() { - bool isVisible = monitor.isCursorVisible; - var x = isVisible ? (float)monitor.cursorX / monitor.width : -9999f; - var y = isVisible ? (float)monitor.cursorY / monitor.height : -9999f; + var x = monitor.isCursorVisible ? (float)monitor.cursorX / monitor.width : -9999f; + var y = monitor.isCursorVisible ? (float)monitor.cursorY / monitor.height : -9999f; var w = (float)monitor.cursorShapeWidth / monitor.width; var h = (float)monitor.cursorShapeHeight / monitor.height; uddTexture_.material.SetVector("_CursorPositionScale", new Vector4(x, y, w, h)); diff --git a/Assets/uDesktopDuplication/Scripts/Lib.cs b/Assets/uDesktopDuplication/Scripts/Lib.cs index 30b4d8b..69eed92 100644 --- a/Assets/uDesktopDuplication/Scripts/Lib.cs +++ b/Assets/uDesktopDuplication/Scripts/Lib.cs @@ -56,6 +56,8 @@ public static class Lib [DllImport("uDesktopDuplication")] public static extern int GetMonitorCount(); [DllImport("uDesktopDuplication")] + public static extern int GetCursorMonitorId(); + [DllImport("uDesktopDuplication")] public static extern int GetTotalWidth(); [DllImport("uDesktopDuplication")] public static extern int GetTotalHeight(); diff --git a/Assets/uDesktopDuplication/Scripts/Manager.cs b/Assets/uDesktopDuplication/Scripts/Manager.cs index 099cffb..08ba353 100644 --- a/Assets/uDesktopDuplication/Scripts/Manager.cs +++ b/Assets/uDesktopDuplication/Scripts/Manager.cs @@ -38,6 +38,11 @@ public class Manager : MonoBehaviour get { return Lib.GetMonitorCount(); } } + static public int cursorMonitorId + { + get { return Lib.GetCursorMonitorId(); } + } + static public Monitor primary { get diff --git a/Assets/uDesktopDuplication/Scripts/Monitor.cs b/Assets/uDesktopDuplication/Scripts/Monitor.cs index 8152ca1..75e0995 100644 --- a/Assets/uDesktopDuplication/Scripts/Monitor.cs +++ b/Assets/uDesktopDuplication/Scripts/Monitor.cs @@ -196,7 +196,7 @@ public class Monitor Lib.GetCursorTexture(id, ptr); } - void CreateTexture() + public void CreateTexture() { if (!available) return; diff --git a/Assets/uDesktopDuplication/Scripts/Texture.cs b/Assets/uDesktopDuplication/Scripts/Texture.cs index 168b4bd..19ba926 100644 --- a/Assets/uDesktopDuplication/Scripts/Texture.cs +++ b/Assets/uDesktopDuplication/Scripts/Texture.cs @@ -24,9 +24,15 @@ public class Texture : MonoBehaviour set { monitor = Manager.monitors[Mathf.Clamp(value, 0, Manager.monitorCount - 1)]; } } + [Header("Invert UVs")] public bool invertX = false; public bool invertY = false; + [Header("Clip")] + public bool useClip = false; + public Vector2 clipPos = Vector2.zero; + public Vector2 clipScale = new Vector2(0.2f, 0.2f); + public Material material { get; @@ -55,6 +61,13 @@ public class Texture : MonoBehaviour } void UpdateMaterial() + { + Invert(); + Rotate(); + Clip(); + } + + void Invert() { if (invertX) { material.EnableKeyword("INVERT_X"); @@ -67,7 +80,10 @@ public class Texture : MonoBehaviour } else { material.DisableKeyword("INVERT_Y"); } + } + void Rotate() + { switch (monitor.rotation) { case MonitorRotation.Identity: @@ -94,6 +110,16 @@ public class Texture : MonoBehaviour break; } } + + void Clip() + { + if (useClip) { + material.EnableKeyword("USE_CLIP"); + material.SetVector("_ClipPositionScale", new Vector4(clipPos.x, clipPos.y, clipScale.x, clipScale.y)); + } else { + material.DisableKeyword("USE_CLIP"); + } + } } } \ No newline at end of file diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc b/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc index 71b8b17..86bde2a 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc +++ b/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc @@ -2,6 +2,7 @@ #define UDD_COMMON_CGINC #include "UnityCG.cginc" +#include "./uDD_Params.cginc" struct appdata { @@ -48,6 +49,13 @@ float2 uddRotateUV(float2 uv) return uv; } +float2 uddClipUV(float2 uv) +{ + uv.x = _ClipX + uv.x * _ClipWidth; + uv.y = _ClipY + uv.y * _ClipHeight; + return uv; +} + inline void uddConvertToLinearIfNeeded(inout fixed3 rgb) { if (!IsGammaSpace()) { @@ -55,27 +63,30 @@ inline void uddConvertToLinearIfNeeded(inout fixed3 rgb) } } -inline fixed4 uddGetScreenTexture(sampler2D tex, float2 uv) +inline fixed4 uddGetScreenTexture(float2 uv) { - fixed4 c = tex2D(tex, uv); + fixed4 c = tex2D(_MainTex, uv); return c; } -inline fixed4 uddGetCursorTexture(sampler2D tex, float2 uv, fixed4 cursorPosScale) +inline fixed4 uddGetCursorTexture(float2 uv) { - uv.x = (uv.x - cursorPosScale.x) / cursorPosScale.z; - uv.y = (uv.y - cursorPosScale.y) / cursorPosScale.w; - fixed4 c = tex2D(tex, uv); + uv.x = (uv.x - _CursorX) / _CursorWidth; + uv.y = (uv.y - _CursorY) / _CursorHeight; + fixed4 c = tex2D(_CursorTex, uv); fixed a = c.a * step(0, uv.x) * step(0, uv.y) * step(uv.x, 1) * step(uv.y, 1); c *= step(0.01, a); return c; } -inline fixed4 uddGetScreenTextureWithCursor(sampler2D screenTex, sampler2D cursorTex, float2 uv, fixed4 cursorPosScale) +inline fixed4 uddGetScreenTextureWithCursor(float2 uv) { uv = uddInvertUV(uv); - fixed4 screen = uddGetScreenTexture(screenTex, uddRotateUV(uv)); - fixed4 cursor = uddGetCursorTexture(cursorTex, uv, cursorPosScale); +#ifdef USE_CLIP + uv = uddClipUV(uv); +#endif + fixed4 screen = uddGetScreenTexture(uddRotateUV(uv)); + fixed4 cursor = uddGetCursorTexture(uv); fixed4 color = lerp(screen, cursor, cursor.a); uddConvertToLinearIfNeeded(color.rgb); return color; diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Params.cginc b/Assets/uDesktopDuplication/Shaders/uDD_Params.cginc index 8da5e26..c119195 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Params.cginc +++ b/Assets/uDesktopDuplication/Shaders/uDD_Params.cginc @@ -4,7 +4,18 @@ sampler2D _MainTex; fixed4 _Color; sampler2D _CursorTex; + half4 _CursorPositionScale; +#define _CursorX _CursorPositionScale.x +#define _CursorY _CursorPositionScale.y +#define _CursorWidth _CursorPositionScale.z +#define _CursorHeight _CursorPositionScale.w + +half4 _ClipPositionScale; +#define _ClipX _ClipPositionScale.x +#define _ClipY _ClipPositionScale.y +#define _ClipWidth _ClipPositionScale.z +#define _ClipHeight _ClipPositionScale.w #ifndef SURFACE_SHADER float4 _MainTex_ST; diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader b/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader index 7621874..0b34bb5 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader @@ -22,19 +22,19 @@ SubShader #pragma surface surf Standard fullforwardshadows #pragma multi_compile ___ INVERT_X #pragma multi_compile ___ INVERT_Y - #pragma multi_compile ___ VERTICAL #pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270 + #pragma multi_compile ___ USE_BEND + #pragma multi_compile ___ USE_CLIP #define SURFACE_SHADER #include "./uDD_Common.cginc" - #include "./uDD_Params.cginc" half _Glossiness; half _Metallic; void surf(Input IN, inout SurfaceOutputStandard o) { - fixed4 c = uddGetScreenTextureWithCursor(_MainTex, _CursorTex, IN.uv_MainTex, _CursorPositionScale) * _Color; + fixed4 c = uddGetScreenTextureWithCursor(IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader index 88910b1..3b10a5b 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader @@ -20,7 +20,6 @@ Cull [_Cull] CGINCLUDE #include "./uDD_Common.cginc" -#include "./uDD_Params.cginc" fixed _Radius; @@ -39,7 +38,7 @@ v2f vert(appdata v) fixed4 frag(v2f i) : SV_Target { - return uddGetScreenTextureWithCursor(_MainTex, _CursorTex, i.uv, _CursorPositionScale); + return uddGetScreenTextureWithCursor(i.uv); } ENDCG @@ -51,9 +50,9 @@ Pass #pragma fragment frag #pragma multi_compile ___ INVERT_X #pragma multi_compile ___ INVERT_Y - #pragma multi_compile ___ VERTICAL - #pragma shader_feature ___ USE_BEND #pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270 + #pragma multi_compile ___ USE_BEND + #pragma multi_compile ___ USE_CLIP ENDCG } diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader index 21de4a4..cba3268 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader @@ -21,7 +21,6 @@ Blend SrcAlpha OneMinusSrcAlpha CGINCLUDE #include "./uDD_Common.cginc" -#include "./uDD_Params.cginc" fixed _Mask; @@ -35,7 +34,7 @@ v2f vert(appdata v) fixed4 frag(v2f i) : SV_Target { - fixed4 tex = uddGetScreenTextureWithCursor(_MainTex, _CursorTex, i.uv, _CursorPositionScale); + fixed4 tex = uddGetScreenTextureWithCursor(i.uv); fixed alpha = pow((tex.r + tex.g + tex.b) / 3.0, _Mask); return fixed4(tex.rgb * _Color.rgb, alpha * _Color.a); } @@ -49,8 +48,9 @@ Pass #pragma fragment frag #pragma multi_compile ___ INVERT_X #pragma multi_compile ___ INVERT_Y - #pragma multi_compile ___ VERTICAL #pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270 + #pragma multi_compile ___ USE_BEND + #pragma multi_compile ___ USE_CLIP ENDCG } diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader index 8f795fc..cacea32 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader @@ -20,7 +20,6 @@ Blend SrcAlpha OneMinusSrcAlpha CGINCLUDE #include "./uDD_Common.cginc" -#include "./uDD_Params.cginc" v2f vert(appdata v) { @@ -32,7 +31,7 @@ v2f vert(appdata v) fixed4 frag(v2f i) : SV_Target { - return fixed4(uddGetScreenTextureWithCursor(_MainTex, _CursorTex, i.uv, _CursorPositionScale).rgb, 1.0) * _Color; + return fixed4(uddGetScreenTextureWithCursor(i.uv).rgb, 1.0) * _Color; } ENDCG @@ -44,8 +43,9 @@ Pass #pragma fragment frag #pragma multi_compile ___ INVERT_X #pragma multi_compile ___ INVERT_Y - #pragma multi_compile ___ VERTICAL #pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270 + #pragma multi_compile ___ USE_BEND + #pragma multi_compile ___ USE_CLIP ENDCG } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index d2f0035..9d882d5 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -38,7 +38,8 @@ void Cursor::UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) isVisible_ = frameInfo.PointerPosition.Visible != 0; timestamp_ = frameInfo.LastMouseUpdateTime; - if (frameInfo.PointerPosition.Visible != 0) { + if (isVisible_) + { GetMonitorManager()->SetCursorMonitorId(monitor_->GetId()); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index ef8daac..8806f27 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -72,8 +72,6 @@ HRESULT Monitor::Render(UINT timeout) return S_OK; } - if (unityTexture_ == nullptr) return 0; - IDXGIResource* resource = nullptr; DXGI_OUTDUPL_FRAME_INFO frameInfo; @@ -97,18 +95,22 @@ HRESULT Monitor::Render(UINT timeout) return hr; } - ID3D11Texture2D* texture; - resource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&texture)); + if (unityTexture_) + { + ID3D11Texture2D* texture; + resource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&texture)); - ID3D11DeviceContext* context; - GetDevice()->GetImmediateContext(&context); - context->CopyResource(unityTexture_, texture); - context->Release(); + ID3D11DeviceContext* context; + GetDevice()->GetImmediateContext(&context); + context->CopyResource(unityTexture_, texture); + context->Release(); + + resource->Release(); + } cursor_->UpdateBuffer(frameInfo); cursor_->UpdateTexture(); - resource->Release(); deskDupl_->ReleaseFrame(); return S_OK; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 4c03f6c..38699c7 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -118,6 +118,12 @@ extern "C" return g_manager->GetMonitorCount(); } + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorMonitorId() + { + if (!g_manager) return -1; + return g_manager->GetCursorMonitorId(); + } + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetTotalWidth() { if (!g_manager) return 0;