From 941bb2da918418cb5d09d7ef5896ba445a2fd4c9 Mon Sep 17 00:00:00 2001 From: hecomi Date: Tue, 8 Nov 2016 22:09:55 +0900 Subject: [PATCH] add round layout example. --- .../Examples/Scenes/Multiple Monitors.unity | Bin 14032 -> 15768 bytes .../Examples/Scenes/Zoom.unity | Bin 16224 -> 16232 bytes .../Scripts/MultipleMonitorCreator.cs | 56 +++++++--------- .../Scripts/MultipleMonitorLayouter.cs | 52 +++++++++++++++ .../Scripts/MultipleMonitorLayouter.cs.meta | 12 ++++ .../Scripts/MultipleMonitorRoundLayouter.cs | 60 ++++++++++++++++++ .../MultipleMonitorRoundLayouter.cs.meta | 12 ++++ .../Materials/uDD_Screen_Standard.mat | Bin 5140 -> 5148 bytes .../Materials/uDD_Screen_Unlit.mat | Bin 5192 -> 5188 bytes .../Materials/uDD_Screen_Unlit_BlackMask.mat | Bin 5148 -> 5156 bytes .../uDD_Screen_Unlit_Transparent.mat | Bin 5148 -> 5156 bytes Assets/uDesktopDuplication/Scripts/Texture.cs | 50 +++++++++++++++ .../Shaders/uDD_Unlit.shader | 19 ++++-- 13 files changed, 220 insertions(+), 41 deletions(-) create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs.meta create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs.meta diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity b/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity index ffccd0eccb11f91c5a918da8aac88b15cf29ebd2..a15cbc1af9a4090b9ccb8d0c9444af41b59370ee 100644 GIT binary patch delta 796 zcmcbRJEPi=q^c!JoB z3=0_;8Z3ca79f@ciE~U&VAFCeEl5c$Np&qtEvj@YO3Y1V$W1It&&&hczRgW|f>6)r zT9)@^e(IY9zkJqx(A9UgBb-O*-Ol&52VY48O>qZV>O{Py2*)@8b%PuOayrB@9=IG+ zl$erPTFd|phyQW&PKS2B)ctlz=Z+Rb;^)m3Md1qK2*U>JdBfvmmCaYr0PHvkM(+s{kkh zav2L$)pe*U2Uegepg1UIiooVDFx-I3O#sUI0OdfDRm8vqWHB%Vde2D*(GP%fwLlsa zB`}+VpmGUp3=AuP;yGaa-wW)lV5lSqJDOvdp{4+-2bJrABm>wg7#k!FW3x>z)R$7T z+8A(uJ@ZG$K8vut6eaJ)AQcP@7o^Xgx^%C`Y2p!;$8}pb`%iAwpE+5{Adit{@ys5tCUXN_&oF6s(H;h6lvBxUjg u0~R1#fRSnPLK9&gkjH_6Y|p^3zyYXC0ji9Hkr^b-0h0zvZ4NQ5VFUn3xYSJm delta 407 zcmbPHeIeJ6fkFQ(1B2NG1_lOx1_lEGAkAQ^XQF4AX2|gG|NsAtJU{^;{XcHr>Cn!X zy5BD8+|go4{MK=VUC9CgQRQKyxC1+CYve0vQJc*EsHogXkTTCz=S?2YSy*2k|sm85nATG$R=Q{|^!i zg37G`%B=wMbHErP7YvmPU}In?0E&Yg%mTCrY5QtR monitors_ = new List(); - private float totalWidth_ = 0f; + public class MonitorInfo + { + public GameObject gameObject { get; set; } + public Quaternion originalRotation { get; set; } + public uDesktopDuplication.Texture uddTexture { get; set; } + public Vector3 meshBounds; + } + + private List monitors_ = new List(); + public List monitors { get { return monitors_; } } void Start() { @@ -26,25 +32,16 @@ public class MultipleMonitorCreator : MonoBehaviour } void Create() - { - CreateMonitors(); - LayoutMonitors(); - } - - void CreateMonitors() { // Sort monitors in coordinate order var monitors = uDesktopDuplication.Manager.monitors; monitors.Sort((a, b) => a.left - b.left); // Create monitors - var n = monitors.Count; - totalWidth_ = 0f; - for (int i = 0 ; i < n; ++i) { + for (int i = 0 ; i < uDesktopDuplication.Manager.monitorCount; ++i) { // Create monitor obeject var go = Instantiate(monitorPrefab); go.name = "Monitor " + i; - monitors_.Add(go); // Assign monitor var texture = go.GetComponent(); @@ -52,37 +49,28 @@ public class MultipleMonitorCreator : MonoBehaviour var monitor = texture.monitor; // Set width / height - go.transform.localScale = new Vector3(monitor.widthMeter, go.transform.localScale.y, monitor.heightMeter) * scale; + go.transform.localScale = new Vector3(monitor.widthMeter, go.transform.localScale.y, monitor.heightMeter); // Set parent as this object go.transform.SetParent(transform); // Calc actual size considering mesh size - var scaleX = go.GetComponent().sharedMesh.bounds.extents.x * 2f; - totalWidth_ += monitor.widthMeter * scale * scaleX; - } - } + var bounds = go.GetComponent().sharedMesh.bounds.extents * 2f; - void LayoutMonitors() - { - // Set positions with margin - totalWidth_ += margin * (monitors_.Count - 1); - var x = -totalWidth_ / 2; - foreach (var go in monitors_) { - var monitor = go.GetComponent().monitor; - var halfScaleX = go.GetComponent().sharedMesh.bounds.extents.x; - var width = monitor.widthMeter * scale; - var halfWidth = width * halfScaleX; - x += halfWidth; - go.transform.localPosition = new Vector3(x, 0f, 0f); - x += halfWidth + margin; + // Save + var info = new MonitorInfo(); + info.gameObject = go; + info.originalRotation = go.transform.rotation; + info.uddTexture = texture; + info.meshBounds = bounds; + monitors_.Add(info); } } void Clear() { - foreach (var go in monitors_) { - Destroy(go); + foreach (var info in monitors_) { + Destroy(info.gameObject); } monitors_.Clear(); } diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs new file mode 100644 index 0000000..065a65c --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs @@ -0,0 +1,52 @@ +using UnityEngine; + +[RequireComponent(typeof(MultipleMonitorCreator))] +public class MultipleMonitorLayouter : MonoBehaviour +{ + protected MultipleMonitorCreator creator_; + [SerializeField] bool updateEveryFrame = true; + [SerializeField] protected float margin = 0.1f; + + void Start() + { + creator_ = GetComponent(); + Layout(); + } + + protected virtual void Update() + { + if (updateEveryFrame) { + Layout(); + } + } + + void LateUpdate() + { + margin = Mathf.Max(margin, 0f); + } + + protected virtual void Layout() + { + var monitors = creator_.monitors; + var n = monitors.Count; + + var totalWidth = 0f; + foreach (var info in monitors) { + var width = info.uddTexture.monitor.widthMeter * info.meshBounds.x; + totalWidth += width; + } + totalWidth += margin * (n - 1); + + var x = -totalWidth / 2; + + foreach (var info in creator_.monitors) { + var monitor = info.uddTexture.monitor; + x += (monitor.widthMeter * info.meshBounds.x) / 2; + info.gameObject.transform.localPosition = new Vector3(x, 0f, 0f); + info.gameObject.transform.localRotation = info.originalRotation; + x += (monitor.widthMeter * info.meshBounds.x) / 2 + margin; + } + } + +} + diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs.meta b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs.meta new file mode 100644 index 0000000..dba373a --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorLayouter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0db1dcac2dedc724194c423ee75b3bf4 +timeCreated: 1478608632 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs new file mode 100644 index 0000000..784ee1f --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs @@ -0,0 +1,60 @@ +using UnityEngine; + +public class MultipleMonitorRoundLayouter : MultipleMonitorLayouter +{ + [SerializeField] float radius = 10f; + + void OnDisable() + { + foreach (var info in creator_.monitors) { + info.uddTexture.bend = uDesktopDuplication.Texture.Bend.Off; + } + } + + protected override void Layout() + { + var monitors = creator_.monitors; + var n = monitors.Count; + + var totalWidth = 0f; + foreach (var info in monitors) { + var width = info.uddTexture.monitor.widthMeter * info.meshBounds.x; + totalWidth += width; + } + totalWidth += margin * (n - 1); + + radius = Mathf.Max(radius, (totalWidth + margin) / (2 * Mathf.PI)); + var totalAngle = totalWidth / radius; + + float angle = -totalAngle / 2; + foreach (var info in monitors) { + var uddTex = info.uddTexture; + var width = uddTex.monitor.widthMeter * info.meshBounds.x; + + angle += (width / radius) * 0.5f; + uddTex.transform.localPosition = radius * new Vector3(Mathf.Sin(angle), 0f, Mathf.Cos(angle) - 1f); + uddTex.transform.localRotation = Quaternion.AngleAxis(angle * Mathf.Rad2Deg, Vector3.up) * info.originalRotation; + angle += (width * 0.5f + margin) / radius; + + uddTex.bend = uDesktopDuplication.Texture.Bend.Y; + uddTex.radius = radius; + uddTex.width = uddTex.monitor.widthMeter; + } + } + + protected override void Update() + { + base.Update(); + + var scale = transform.localScale.x; + var center = transform.position - Vector3.forward * radius * scale; + for (int i = 0; i < 100; ++i) { + var a0 = 2 * Mathf.PI * i / 100; + var a1 = 2 * Mathf.PI * (i + 1) / 100; + var p0 = center + radius * scale * new Vector3(Mathf.Cos(a0), 0f, Mathf.Sin(a0)); + var p1 = center + radius * scale * new Vector3(Mathf.Cos(a1), 0f, Mathf.Sin(a1)); + Debug.DrawLine(p0, p1, Color.red); + } + } +} + diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs.meta b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs.meta new file mode 100644 index 0000000..becfd8a --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/MultipleMonitorRoundLayouter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a31b05fdfa301f14e88365e64622b43a +timeCreated: 1478524060 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Materials/uDD_Screen_Standard.mat b/Assets/uDesktopDuplication/Materials/uDD_Screen_Standard.mat index 4a2dc41f447d18efb758033296b9a38f95b7747e..29bdadee22418e44f08d371a42e9e3f44533bf8f 100644 GIT binary patch delta 105 zcmbQDF-L=gfq`QQ1A~anMvfK^AsH4122lnO{{J6HF)%Prp2s1z`5K2C`{V~4a+75Q zR1{=@!k&I%u0bL35eo6np*}wG{%&px@vgp}!NH#Xev=~v{!G3gATzl@@H8XCW*ea! Fi~#eH8;k$| delta 119 zcmbQEF-3!efq`Qe1A~ajMvfK^ArTe^22lnO{{J6HF)%Pqp2s02*cp26{3eaVp1o4R zC4sgkQp}qVas;zamJv{q5CSUl^b2zh3W<+Uh