diff --git a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab index 6d2132f..d89b17e 100644 Binary files a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab and b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab differ diff --git a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab.meta b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab.meta index 2a70831..4821977 100644 --- a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab.meta +++ b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Plane.prefab.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 42d6b6dbae38a384e882c2c907915139 -timeCreated: 1478889784 +guid: 57d4a6e606848364c9880f2adec16d90 +timeCreated: 1480074774 licenseType: Pro NativeFormatImporter: userData: diff --git a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Unity Plane.prefab b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Unity Plane.prefab new file mode 100644 index 0000000..5721fbf Binary files /dev/null and b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Unity Plane.prefab differ diff --git a/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Unity Plane.prefab.meta b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Unity Plane.prefab.meta new file mode 100644 index 0000000..2a70831 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Prefabs/Monitor Unity Plane.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42d6b6dbae38a384e882c2c907915139 +timeCreated: 1478889784 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Displacement.unity b/Assets/uDesktopDuplication/Examples/Scenes/Displacement.unity new file mode 100644 index 0000000..e216f7e Binary files /dev/null and b/Assets/uDesktopDuplication/Examples/Scenes/Displacement.unity differ diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Displacement.unity.meta b/Assets/uDesktopDuplication/Examples/Scenes/Displacement.unity.meta new file mode 100644 index 0000000..16d62d7 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scenes/Displacement.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4e1efec2c71c5b94e8522880dd9636c8 +timeCreated: 1480074355 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Materials/uDD_Screen_Unlit_Displacement.mat b/Assets/uDesktopDuplication/Materials/uDD_Screen_Unlit_Displacement.mat new file mode 100644 index 0000000..465f79e Binary files /dev/null and b/Assets/uDesktopDuplication/Materials/uDD_Screen_Unlit_Displacement.mat differ diff --git a/Assets/uDesktopDuplication/Materials/uDD_Screen_Unlit_Displacement.mat.meta b/Assets/uDesktopDuplication/Materials/uDD_Screen_Unlit_Displacement.mat.meta new file mode 100644 index 0000000..5fd226b --- /dev/null +++ b/Assets/uDesktopDuplication/Materials/uDD_Screen_Unlit_Displacement.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 596fd740aeeee0d4cb4f962d4072954e +timeCreated: 1480074277 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Models/uDD_Board.fbx.meta b/Assets/uDesktopDuplication/Models/uDD_Board.fbx.meta index 99a24b3..7bb5824 100644 --- a/Assets/uDesktopDuplication/Models/uDD_Board.fbx.meta +++ b/Assets/uDesktopDuplication/Models/uDD_Board.fbx.meta @@ -39,11 +39,11 @@ ModelImporter: globalScale: 0.1 meshCompression: 0 addColliders: 0 - importBlendShapes: 1 + importBlendShapes: 0 swapUVChannels: 0 generateSecondaryUV: 0 useFileUnits: 1 - optimizeMeshForGPU: 1 + optimizeMeshForGPU: 0 keepQuads: 0 weldVertices: 1 secondaryUVAngleDistortion: 8 diff --git a/Assets/uDesktopDuplication/Models/uDD_Plane.fbx b/Assets/uDesktopDuplication/Models/uDD_Plane.fbx new file mode 100644 index 0000000..b0f924c Binary files /dev/null and b/Assets/uDesktopDuplication/Models/uDD_Plane.fbx differ diff --git a/Assets/uDesktopDuplication/Models/uDD_Plane.fbx.meta b/Assets/uDesktopDuplication/Models/uDD_Plane.fbx.meta new file mode 100644 index 0000000..52c6cad --- /dev/null +++ b/Assets/uDesktopDuplication/Models/uDD_Plane.fbx.meta @@ -0,0 +1,87 @@ +fileFormatVersion: 2 +guid: f30f6cfd6aa37554ca886424cada7cbb +timeCreated: 1480072865 +licenseType: Pro +ModelImporter: + serializedVersion: 19 + fileIDToRecycleName: + 100000: //RootNode + 100002: uDD_Plane_MeshPart0 + 100004: uDD_Plane_MeshPart1 + 400000: //RootNode + 400002: uDD_Plane_MeshPart0 + 400004: uDD_Plane_MeshPart1 + 2300000: //RootNode + 2300002: uDD_Plane_MeshPart0 + 2300004: uDD_Plane_MeshPart1 + 3300000: //RootNode + 3300002: uDD_Plane_MeshPart0 + 3300004: uDD_Plane_MeshPart1 + 4300000: uDD_Plane + 4300002: uDD_Plane_MeshPart0 + 4300004: uDD_Plane_MeshPart1 + 9500000: //RootNode + materials: + importMaterials: 0 + materialName: 0 + materialSearch: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 0.1 + meshCompression: 0 + addColliders: 0 + importBlendShapes: 0 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 2 + importAnimation: 0 + copyAvatar: 0 + humanDescription: + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Scripts/Texture.cs b/Assets/uDesktopDuplication/Scripts/Texture.cs index 32858ff..b5ea645 100644 --- a/Assets/uDesktopDuplication/Scripts/Texture.cs +++ b/Assets/uDesktopDuplication/Scripts/Texture.cs @@ -16,6 +16,7 @@ public class Texture : MonoBehaviour if (monitor_ != null) { material = GetComponent().material; // clone material.mainTexture = monitor_.texture; + material.SetTexture("_DispTex", monitor_.texture); material.SetFloat("_Width", transform.localScale.x); } } diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc b/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc index 61a56c8..40ecd2a 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc +++ b/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc @@ -63,17 +63,22 @@ inline void uddConvertToLinearIfNeeded(inout fixed3 rgb) } } -inline fixed4 uddGetScreenTexture(float2 uv) +inline fixed4 uddGetTexture(sampler2D tex, float2 uv) { uv = uddInvertUV(uv); #ifdef USE_CLIP uv = uddClipUV(uv); #endif - fixed4 c = tex2D(_MainTex, uddRotateUV(uv)); + fixed4 c = tex2D(tex, uddRotateUV(uv)); uddConvertToLinearIfNeeded(c.rgb); return c; } +inline fixed4 uddGetScreenTexture(float2 uv) +{ + return uddGetTexture(_MainTex, uv); +} + inline void uddBendVertex(inout float4 v, half radius, half width, half thickness) { #ifdef BEND_ON @@ -97,4 +102,30 @@ inline void uddBendVertex(inout float4 v, half radius, half width, half thicknes #endif } +inline float3 uddRotateY(float3 n, float angle) +{ + float c = cos(angle); + float s = sin(angle); + return float3(c * n.x - s * n.z, n.y, s * n.x + c * n.z); +} + +inline float3 uddRotateX(float3 n, float angle) +{ + float c = cos(angle); + float s = sin(angle); + return float3(n.x, c * n.y + s * n.z, -s * n.y + c * n.z); +} + +inline void uddBendNormal(float4 x, inout float3 n, half radius, half width) +{ +#ifdef BEND_ON + half angle = width * x / radius; + #ifdef _FORWARD_Z + n = uddRotateY(n, -angle); + #elif _FORWARD_Y + n = uddRotateX(n, -angle); + #endif +#endif +} + #endif \ No newline at end of file diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader index 6c3becc..f2f7751 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader @@ -10,6 +10,7 @@ Properties [Toggle(BEND_ON)] _Bend("Use Bend", Int) = 0 [PowerSlider(10.0)] _Radius("Bend Radius", Range(1, 100)) = 30 [PowerSlider(10.0)] _Thickness("Thickness", Range(0.01, 10)) = 1 + _Width("Width", Range(0.0, 10.0)) = 1.0 [KeywordEnum(Off, Front, Back)] _Cull("Culling", Int) = 2 } diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader index 46b1f99..069e16a 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader @@ -11,6 +11,7 @@ Properties [Toggle(BEND_ON)] _Bend("Use Bend", Int) = 0 [PowerSlider(10.0)] _Radius("Bend Radius", Range(1, 100)) = 30 [PowerSlider(10.0)] _Thickness("Thickness", Range(0.01, 10)) = 1 + _Width("Width", Range(0.0, 10.0)) = 1.0 [KeywordEnum(Off, Front, Back)] _Cull("Culling", Int) = 2 } diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Displacement.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Displacement.shader new file mode 100644 index 0000000..d73ab95 --- /dev/null +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Displacement.shader @@ -0,0 +1,179 @@ +Shader "uDesktopDuplication/Unlit_Displacement" +{ + +Properties +{ + _Color ("Color", Color) = (1, 1, 1, 1) + _MainTex ("Texture", 2D) = "white" {} + _CursorTex ("Cursor Texture", 2D) = "white" {} + [KeywordEnum(Y, Z)] _Forward("Mesh Forward Direction", Int) = 0 + [Toggle(BEND_ON)] _Bend("Use Bend", Int) = 0 + [PowerSlider(10.0)] _Radius("Bend Radius", Range(1, 100)) = 30 + _Width ("Width", Range(0.0, 10.0)) = 1.92 + [PowerSlider(10.0)] _Thickness("Thickness", Range(0.01, 10)) = 1 + [KeywordEnum(Off, Front, Back)] _Cull("Culling", Int) = 2 + _DispTex ("Displacement Map", 2D) = "black" {} + _Displacement("Displacement Factor", Range(0, 5.0)) = 1 + _TessMinDist("Tessellation Min Distance", Range(0.1, 100.0)) = 1.0 + _TessMaxDist("Tessellation Max Distance", Range(0.1, 100.0)) = 5.0 + _TessFactor("Tessellation Factor", Range(0.1, 50.0)) = 10.0 +} + +SubShader +{ + +Tags { "RenderType"="Opaque" } + +Cull [_Cull] + +CGINCLUDE + +#include "./uDD_Common.cginc" +#include "Tessellation.cginc" + +half _Radius; +half _Width; +half _Thickness; +Texture2D _DispTex; +SamplerState sampler_DispTex; +half _Displacement; +half _TessMinDist; +half _TessMaxDist; +half _TessFactor; + +struct VsInput +{ + float3 vertex : POSITION; + float3 normal : NORMAL; + float2 texcoord : TEXCOORD0; +}; + +struct HsInput +{ + float4 f4Position : POS; + float3 f3Normal : NORMAL; + float2 f2TexCoord : TEXCOORD; +}; + +struct HsControlPointOutput +{ + float3 f3Position : POS; + float3 f3Normal : NORMAL; + float2 f2TexCoord : TEXCOORD; +}; + +struct HsConstantOutput +{ + float fTessFactor[3] : SV_TessFactor; + float fInsideTessFactor : SV_InsideTessFactor; +}; + +struct DsOutput +{ + float4 f4Position : SV_Position; + float2 f2TexCoord : TEXCOORD0; +}; + +HsInput vert(VsInput i) +{ + HsInput o; + float4 v = float4(i.vertex, 1.0); + uddBendNormal(v.x, i.normal, _Radius, _Width); + uddBendVertex(v, _Radius, _Width, _Thickness); + o.f4Position = v; + o.f3Normal = i.normal; + o.f2TexCoord = i.texcoord; + return o; +} + +[domain("tri")] +[partitioning("integer")] +[outputtopology("triangle_cw")] +[patchconstantfunc("hullConst")] +[outputcontrolpoints(3)] +HsControlPointOutput hull(InputPatch i, uint id : SV_OutputControlPointID) +{ + HsControlPointOutput o = (HsControlPointOutput)0; + o.f3Position = i[id].f4Position.xyz; + o.f3Normal = i[id].f3Normal; + o.f2TexCoord = i[id].f2TexCoord; + return o; +} + +HsConstantOutput hullConst(InputPatch i) +{ + HsConstantOutput o = (HsConstantOutput)0; + + float4 p0 = i[0].f4Position; + float4 p1 = i[1].f4Position; + float4 p2 = i[2].f4Position; + float4 tessFactor = UnityDistanceBasedTess(p0, p1, p2, _TessMinDist, _TessMaxDist, _TessFactor); + + o.fTessFactor[0] = tessFactor.x; + o.fTessFactor[1] = tessFactor.y; + o.fTessFactor[2] = tessFactor.z; + o.fInsideTessFactor = tessFactor.w; + + return o; +} + +[domain("tri")] +DsOutput domain( + HsConstantOutput hsConst, + const OutputPatch i, + float3 bary : SV_DomainLocation) +{ + DsOutput o = (DsOutput)0; + + float3 f3Position = + bary.x * i[0].f3Position + + bary.y * i[1].f3Position + + bary.z * i[2].f3Position; + + float3 f3Normal = normalize( + bary.x * i[0].f3Normal + + bary.y * i[1].f3Normal + + bary.z * i[2].f3Normal); + + o.f2TexCoord = + bary.x * i[0].f2TexCoord + + bary.y * i[1].f2TexCoord + + bary.z * i[2].f2TexCoord; + + float disp = length(_DispTex.SampleLevel(sampler_DispTex, o.f2TexCoord, 0)) * _Displacement; + f3Position.xyz += f3Normal * disp; + + o.f4Position = mul(UNITY_MATRIX_MVP, float4(f3Position.xyz, 1.0)); + + return o; +} + + +fixed4 frag(DsOutput i) : SV_Target +{ + return uddGetScreenTexture(i.f2TexCoord); +} + +ENDCG + +Pass +{ + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma hull hull + #pragma domain domain + #pragma multi_compile ___ INVERT_X + #pragma multi_compile ___ INVERT_Y + #pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270 + #pragma multi_compile ___ USE_CLIP + #pragma multi_compile ___ BEND_ON + #pragma multi_compile _FORWARD_Y _FORWARD_Z + ENDCG +} + +} + +Fallback "Unlit/Texture" + +} \ No newline at end of file diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Displacement.shader.meta b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Displacement.shader.meta new file mode 100644 index 0000000..29932c3 --- /dev/null +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Displacement.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 05df46eb51b13c84eabbdf4c53cc8db7 +timeCreated: 1480072905 +licenseType: Pro +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader index cf2c96a..11a8449 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader @@ -10,6 +10,7 @@ Properties [Toggle(BEND_ON)] _Bend("Use Bend", Int) = 0 [PowerSlider(10.0)] _Radius("Bend Radius", Range(1, 100)) = 30 [PowerSlider(10.0)] _Thickness("Thickness", Range(0.01, 10)) = 1 + _Width("Width", Range(0.0, 10.0)) = 1.0 [KeywordEnum(Off, Front, Back)] _Cull("Culling", Int) = 2 } diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset index cc79ef5..0e714bd 100644 Binary files a/ProjectSettings/QualitySettings.asset and b/ProjectSettings/QualitySettings.asset differ