diff --git a/Assets/uDesktopDuplication/Materials/uDD_Cursor.mat b/Assets/uDesktopDuplication/Materials/uDD_Cursor.mat new file mode 100644 index 0000000..76143cc Binary files /dev/null and b/Assets/uDesktopDuplication/Materials/uDD_Cursor.mat differ diff --git a/Assets/uDesktopDuplication/Materials/uDD_Cursor.mat.meta b/Assets/uDesktopDuplication/Materials/uDD_Cursor.mat.meta new file mode 100644 index 0000000..1833d2c --- /dev/null +++ b/Assets/uDesktopDuplication/Materials/uDD_Cursor.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 033e0db89e0ca1d46a399c953629f67d +timeCreated: 1477555367 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Materials/uDesktopDuplication.mat b/Assets/uDesktopDuplication/Materials/uDD_Screen.mat similarity index 82% rename from Assets/uDesktopDuplication/Materials/uDesktopDuplication.mat rename to Assets/uDesktopDuplication/Materials/uDD_Screen.mat index 1570aa2..77806c9 100644 Binary files a/Assets/uDesktopDuplication/Materials/uDesktopDuplication.mat and b/Assets/uDesktopDuplication/Materials/uDD_Screen.mat differ diff --git a/Assets/uDesktopDuplication/Materials/uDesktopDuplication.mat.meta b/Assets/uDesktopDuplication/Materials/uDD_Screen.mat.meta similarity index 100% rename from Assets/uDesktopDuplication/Materials/uDesktopDuplication.mat.meta rename to Assets/uDesktopDuplication/Materials/uDD_Screen.mat.meta diff --git a/Assets/uDesktopDuplication/Resources.meta b/Assets/uDesktopDuplication/Resources.meta new file mode 100644 index 0000000..4644b85 --- /dev/null +++ b/Assets/uDesktopDuplication/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6e15bc51aada81042a909c808e25c176 +folderAsset: yes +timeCreated: 1477555207 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Resources/uDesktopDuplication.meta b/Assets/uDesktopDuplication/Resources/uDesktopDuplication.meta new file mode 100644 index 0000000..f18d145 --- /dev/null +++ b/Assets/uDesktopDuplication/Resources/uDesktopDuplication.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 48b92326b146fa848beec6f35365b1f4 +folderAsset: yes +timeCreated: 1477555207 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images.meta b/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images.meta new file mode 100644 index 0000000..fc24967 --- /dev/null +++ b/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a615a0cde495b914d95b9d2d53182305 +folderAsset: yes +timeCreated: 1477555207 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images/cursor.png b/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images/cursor.png new file mode 100644 index 0000000..4ea6f7c Binary files /dev/null and b/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images/cursor.png differ diff --git a/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images/cursor.png.meta b/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images/cursor.png.meta new file mode 100644 index 0000000..ebdd868 --- /dev/null +++ b/Assets/uDesktopDuplication/Resources/uDesktopDuplication/Images/cursor.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 89616e59e1cccb346bd4e959257990ca +timeCreated: 1477555207 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Scenes/Example.unity b/Assets/uDesktopDuplication/Scenes/Example.unity index 5b01201..9c78b12 100644 Binary files a/Assets/uDesktopDuplication/Scenes/Example.unity and b/Assets/uDesktopDuplication/Scenes/Example.unity differ diff --git a/Assets/uDesktopDuplication/Scripts/MouseDrawer.cs b/Assets/uDesktopDuplication/Scripts/MouseDrawer.cs new file mode 100644 index 0000000..259d559 --- /dev/null +++ b/Assets/uDesktopDuplication/Scripts/MouseDrawer.cs @@ -0,0 +1,44 @@ +using UnityEngine; + +namespace uDesktopDuplication +{ + +[RequireComponent(typeof(uDesktopDuplication))] +public class MouseDrawer : MonoBehaviour +{ + [SerializeField] + Transform cursor; + [SerializeField] + Vector2 modelScale = Vector2.one; + [SerializeField] + Vector2 offset = new Vector2(0.5f, 0.5f); + + uDesktopDuplication udd_; + + void OnEnable() + { + udd_ = GetComponent(); + udd_.onMouseMove += OnMouseMove; + } + + void OnDisable() + { + udd_.onMouseMove -= OnMouseMove; + } + + void OnMouseMove(Vector2 pos) + { + var x = pos.x * modelScale.x * 0.5f; + var y = pos.y * modelScale.y * 0.5f; + var iy = udd_.invertY ? +1 : -1; + var localPos = transform.right * x + iy * transform.up * y; + + var worldPos = transform.TransformPoint(localPos); + worldPos += cursor.right * offset.x * cursor.localScale.x; + worldPos += -cursor.up * offset.y * cursor.localScale.y; + + cursor.position = worldPos; + } +} + +} \ No newline at end of file diff --git a/Assets/uDesktopDuplication/Scripts/MouseDrawer.cs.meta b/Assets/uDesktopDuplication/Scripts/MouseDrawer.cs.meta new file mode 100644 index 0000000..081062b --- /dev/null +++ b/Assets/uDesktopDuplication/Scripts/MouseDrawer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d2d9e4ca459ecb44da8815bafe9655c5 +timeCreated: 1477559806 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 89616e59e1cccb346bd4e959257990ca, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs b/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs index 9479d8d..e3e8f3d 100644 --- a/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs +++ b/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs @@ -3,6 +3,9 @@ using System; using System.Collections; using System.Runtime.InteropServices; +namespace uDesktopDuplication +{ + public class uDesktopDuplication : MonoBehaviour { [DllImport("uDesktopDuplication")] @@ -22,34 +25,64 @@ public class uDesktopDuplication : MonoBehaviour [DllImport("uDesktopDuplication")] private static extern IntPtr GetRenderEventFunc(); - public bool isPointerVisible = false; - public int pointerX = 0; - public int pointerY = 0; + private Material material_; + public bool invertX = false; + public bool invertY = false; - Coroutine renderCoroutine_ = null; + public delegate void MouseMoveEventHandler(Vector2 pos); + public MouseMoveEventHandler onMouseMove { get; set; } + + private Coroutine renderCoroutine_ = null; void OnEnable() { var tex = new Texture2D(GetWidth(), GetHeight(), TextureFormat.BGRA32, false); - GetComponent().sharedMaterial.mainTexture = tex; + material_ = GetComponent().material; + material_.mainTexture = tex; SetTexturePtr(tex.GetNativeTexturePtr()); renderCoroutine_ = StartCoroutine(OnRender()); } void OnDisable() - { - if (renderCoroutine_ != null) { - StopCoroutine(renderCoroutine_); - renderCoroutine_ = null; - } + { + if (renderCoroutine_ != null) { + StopCoroutine(renderCoroutine_); + renderCoroutine_ = null; + } } void Update() { - isPointerVisible = IsPointerVisible(); - pointerX = GetPointerX(); - pointerY = GetPointerY(); + UpdateMouseEvent(); + UpdateMaterial(); + } + + void UpdateMouseEvent() + { + var isVisible = IsPointerVisible(); + if (isVisible && onMouseMove != null) { + var x = GetPointerX(); + var y = GetPointerY(); + var w = GetWidth(); + var h = GetHeight(); + onMouseMove(new Vector2(2f * x / w - 1f, 1f - 2f * y / h)); + } + } + + void UpdateMaterial() + { + if (invertX) { + material_.EnableKeyword("INVERT_X"); + } else { + material_.DisableKeyword("INVERT_X"); + } + + if (invertY) { + material_.EnableKeyword("INVERT_Y"); + } else { + material_.DisableKeyword("INVERT_Y"); + } } IEnumerator OnRender() @@ -59,4 +92,6 @@ public class uDesktopDuplication : MonoBehaviour GL.IssuePluginEvent(GetRenderEventFunc(), 0); } } +} + } \ No newline at end of file diff --git a/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta b/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta index 4b7ab66..70283ee 100644 --- a/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta +++ b/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta @@ -1,12 +1,12 @@ fileFormatVersion: 2 guid: bb54a34570e4747429b1c5b66c69d356 -timeCreated: 1452445649 +timeCreated: 1477559813 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 - icon: {instanceID: 0} + icon: {fileID: 2800000, guid: 89616e59e1cccb346bd4e959257990ca, type: 3} userData: assetBundleName: assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Shaders.meta b/Assets/uDesktopDuplication/Shaders.meta new file mode 100644 index 0000000..ffa7474 --- /dev/null +++ b/Assets/uDesktopDuplication/Shaders.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9844af21eb203794b852f0bcaa5f2be2 +folderAsset: yes +timeCreated: 1477556975 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader new file mode 100644 index 0000000..c54965d --- /dev/null +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader @@ -0,0 +1,66 @@ +Shader "uDesktopDuplication/Unlit" +{ + +Properties +{ + _MainTex ("Texture", 2D) = "white" {} +} + +SubShader +{ + +Tags { "RenderType"="Opaque" } + +CGINCLUDE + +#include "UnityCG.cginc" + +struct appdata +{ + float4 vertex : POSITION; + float2 uv : TEXCOORD0; +}; + +struct v2f +{ + float4 vertex : SV_POSITION; + float2 uv : TEXCOORD0; +}; + +sampler2D _MainTex; +float4 _MainTex_ST; + +v2f vert (appdata v) +{ + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; +} + +fixed4 frag (v2f i) : SV_Target +{ +#ifdef INVERT_X + i.uv.x *= -1.0; +#endif +#ifdef INVERT_Y + i.uv.y *= -1.0; +#endif + return tex2D(_MainTex, i.uv); +} + +ENDCG + +Pass +{ + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile ___ INVERT_X + #pragma multi_compile ___ INVERT_Y + ENDCG +} + +} + +} diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader.meta b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader.meta new file mode 100644 index 0000000..f907452 --- /dev/null +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2ca7b38c676bddd439a77a646a279a54 +timeCreated: 1477556963 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 166829a..9a3c0c7 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -34,7 +34,7 @@ extern "C" { // Search the main monitor from all outputs. IDXGIOutput* output; - for (int j = 0; (adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND); j++) + for (int j = 0; (adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND); ++j) { DXGI_OUTPUT_DESC outputDesc; output->GetDesc(&outputDesc);