From 533a4c9f28e43d33dc7f7e15cc06dbfe38573108 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sun, 20 Nov 2016 02:49:58 +0900 Subject: [PATCH] add gaze point analyzer. --- .../Examples/Scenes/Meta Data.unity | Bin 19208 -> 19456 bytes .../Examples/Scripts/GazePointAnalyzer.cs | 184 ++++++++++++++++++ ...izer.cs.meta => GazePointAnalyzer.cs.meta} | 0 .../Examples/Scripts/MetadataVisualizer.cs | 88 --------- 4 files changed, 184 insertions(+), 88 deletions(-) create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/GazePointAnalyzer.cs rename Assets/uDesktopDuplication/Examples/Scripts/{MetadataVisualizer.cs.meta => GazePointAnalyzer.cs.meta} (100%) delete mode 100644 Assets/uDesktopDuplication/Examples/Scripts/MetadataVisualizer.cs diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Meta Data.unity b/Assets/uDesktopDuplication/Examples/Scenes/Meta Data.unity index 347db47c5e6782eee79b3a38f18f8632ce1823f7..986584fa8377aacbf44f44bb6c21d15f957301e5 100644 GIT binary patch delta 633 zcmeB}#@H}}QGkKLS(<^thXDxqfoy|~0!Eywi;CEGzwHTVium*SrNOq0ch~;?xy$z^ zO*3F`N`0L9c27m1>eUb!ED6L691IMMKnN0dgNjQ{K5HOe53~hE zHVG;#gC<@86_-U4U%<@JP!HrY0xJvAV|m?1a6EHx-Kxx_6qrzEuq$So~Sg|bsJi%KeyiZ^@nR2oe_Xg8ZNV{)v$xa9#R1_l?P6aW4H z|Gxq#r3huugt24OAVq(Jz@v(GtjF1Y$`bX7B{D85tHZGc@=>#ib@!^XMC<6eX7X z=9i@gr6!lSq!yPjAPWTNmlh?bf`wc%i%Kd%iZ<);RvJxSVLyX0V6vlwIOB@Rkq*+b zAD9>zKnDN)|Nnmx1CRp*3(rOHfoO-x6CI=(7ffCYBn>8?1gg$pVPGf#$^a=K{{J7O z>d#y*JrI3kGNYq3W5i@xAjvS<(otHrfQ^A+B~S+B8AhmTscDO|K&llc7XsAX_T9-ALJCNfTPVcG2D+{eVoIC-O|GKeSOwvUym!G7`u GZvy~sb!XH7 diff --git a/Assets/uDesktopDuplication/Examples/Scripts/GazePointAnalyzer.cs b/Assets/uDesktopDuplication/Examples/Scripts/GazePointAnalyzer.cs new file mode 100644 index 0000000..129b7e1 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/GazePointAnalyzer.cs @@ -0,0 +1,184 @@ +using UnityEngine; +using MeshForwardDirection = uDesktopDuplication.Texture.MeshForwardDirection; + +[RequireComponent(typeof(uDesktopDuplication.Texture))] +public class GazePointAnalyzer : MonoBehaviour +{ + uDesktopDuplication.Texture uddTexture_; + + [Tooltip("This needs a small calculation cost.")] + public bool calcAveragePos = true; + + private Vector2 averageCoord_ = Vector2.zero; + private Vector2 averageCoordVelocity_ = Vector2.zero; + public Vector3 averagePos + { + get { return GetWorldPositionFromCoord((int)averageCoord_.x, (int)averageCoord_.y); } + } + + private Vector2 preCursorCoord_ = Vector2.zero; + + [Header("Filters")] + [Range(0f, 1f)] public float moveRectFilter = 0.05f; + [Range(0f, 1f)] public float mouseFilter = 0.05f; + [Range(0f, 1f)] public float dirtyRectFilter = 0.01f; + [Range(0f, 1f)] public float noEventFilter = 0.01f; + [Range(0f, 1f)] public float velocityFilter = 0.1f; + + [Header("Debug")] + [SerializeField] bool drawAveragePos; + [SerializeField] bool drawMoveRects; + [SerializeField] bool drawDirtyRects; + + void Start() + { + uddTexture_ = GetComponent(); + averageCoord_ = new Vector2(uddTexture_.monitor.width / 2, uddTexture_.monitor.height / 2); + } + + public Vector3 GetWorldPositionFromCoord(int u, int v) + { + var monitor = uddTexture_.monitor; + + // Mesh & Scale information + var mesh = GetComponent().sharedMesh; + var width = transform.localScale.x * (mesh.bounds.extents.x * 2f); + var height = transform.localScale.y * (mesh.bounds.extents.y * 2f); + + // Local position (scale included). + var x = (float)(u - monitor.width / 2) / monitor.width; + var y = -(float)(v - monitor.height / 2) / monitor.height; + var localPos = new Vector3(width * x, height * y, 0f); + + // Bending + if (uddTexture_.bend) { + var radius = uddTexture_.radius; + var angle = localPos.x / radius; + if (uddTexture_.meshForwardDirection == MeshForwardDirection.Y) { + localPos.y -= radius * (1f - Mathf.Cos(angle)); + } else { + localPos.z -= radius * (1f - Mathf.Cos(angle)); + } + localPos.x = radius * Mathf.Sin(angle); + } + + // To world position + return transform.position + (transform.rotation * localPos); + } + + void CalcAveragePos() + { + if (!calcAveragePos) return; + + var coord = Vector2.zero; + var monitor = uddTexture_.monitor; + var cursorCoord = new Vector2(monitor.cursorX, monitor.cursorY); + var filter = 0f; + + // move rect + if (monitor.moveRectCount > 0) { + foreach (var rects in monitor.moveRects) { + var rect = rects.destination; + var center = new Vector2( + (rect.right + rect.left) / 2, + (rect.bottom + rect.top) / 2); + coord += center; + } + coord /= monitor.moveRectCount; + filter = moveRectFilter; + Debug.Log("Move Rect"); + } + // mouse + else if ( + monitor.isCursorVisible && + cursorCoord != preCursorCoord_ && + (cursorCoord - preCursorCoord_).magnitude > 5 && + monitor.cursorX >= 0 && + monitor.cursorY >= 0) + { + coord = cursorCoord; + filter = mouseFilter; + } + // dirty rect + else if (monitor.dirtyRectCount > 0) { + var totalWeights = 0f; + foreach (var rect in monitor.dirtyRects) { + var center = new Vector2( + (rect.right + rect.left) / 2, + (rect.bottom + rect.top) / 2); + var weight = 1f / Mathf.Sqrt((rect.right - rect.left) * (rect.bottom - rect.top)); + coord += center * weight; + totalWeights += weight; + } + var n = monitor.dirtyRectCount; + coord /= totalWeights; + filter = dirtyRectFilter; + } + // no event + else { + coord = new Vector2(monitor.width / 2, monitor.height / 2); + filter = noEventFilter; + } + + preCursorCoord_ = cursorCoord; + + var cf = (filter / ((1f / 60) / Time.deltaTime)); + var vf = (velocityFilter / ((1f / 60) / Time.deltaTime)); + var targetCoord = averageCoord_ + (coord - averageCoord_) * cf; + var targetVelocity = targetCoord - averageCoord_; + + if (float.IsNaN(targetCoord.x) || float.IsNaN(targetCoord.y)) return; + if (float.IsNaN(targetVelocity.x) || float.IsNaN(targetVelocity.y)) return; + + averageCoordVelocity_ += (targetVelocity - averageCoordVelocity_) * vf; + averageCoord_ += averageCoordVelocity_; + averageCoord_.x = Mathf.Clamp(averageCoord_.x, 0, monitor.width); + averageCoord_.y = Mathf.Clamp(averageCoord_.y, 0, monitor.height); + } + + void Update() + { + CalcAveragePos(); + DebugDraw(); + } + + void DebugDraw() + { + if (drawAveragePos) DrawAveragePos(); + if (drawDirtyRects) DrawDirtyRects(); + if (drawMoveRects) DrawMoveRects(); + } + + void DrawRect(uDesktopDuplication.RECT rect, Color color) + { + var p0 = GetWorldPositionFromCoord(rect.left, rect.top); + var p1 = GetWorldPositionFromCoord(rect.right, rect.top); + var p2 = GetWorldPositionFromCoord(rect.right, rect.bottom); + var p3 = GetWorldPositionFromCoord(rect.left, rect.bottom); + + Debug.DrawLine(p0, p1, color); + Debug.DrawLine(p1, p2, color); + Debug.DrawLine(p2, p3, color); + Debug.DrawLine(p3, p0, color); + } + + void DrawAveragePos() + { + Debug.DrawLine(transform.position, averagePos, Color.yellow); + } + + void DrawMoveRects() + { + foreach (var rect in uddTexture_.monitor.moveRects) { + DrawRect(rect.source, Color.blue); + DrawRect(rect.destination, Color.green); + } + } + + void DrawDirtyRects() + { + foreach (var rect in uddTexture_.monitor.dirtyRects) { + DrawRect(rect, Color.red); + } + } +} diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MetadataVisualizer.cs.meta b/Assets/uDesktopDuplication/Examples/Scripts/GazePointAnalyzer.cs.meta similarity index 100% rename from Assets/uDesktopDuplication/Examples/Scripts/MetadataVisualizer.cs.meta rename to Assets/uDesktopDuplication/Examples/Scripts/GazePointAnalyzer.cs.meta diff --git a/Assets/uDesktopDuplication/Examples/Scripts/MetadataVisualizer.cs b/Assets/uDesktopDuplication/Examples/Scripts/MetadataVisualizer.cs deleted file mode 100644 index 5d4954f..0000000 --- a/Assets/uDesktopDuplication/Examples/Scripts/MetadataVisualizer.cs +++ /dev/null @@ -1,88 +0,0 @@ -using UnityEngine; -using MeshForwardDirection = uDesktopDuplication.Texture.MeshForwardDirection; - -public class MetadataVisualizer : MonoBehaviour -{ - uDesktopDuplication.Texture uddTexture_; - - [SerializeField] bool drawMoveRectDest; - [SerializeField] bool drawMoveRectSource; - [SerializeField] bool drawDirtyRect; - - void Start() - { - uddTexture_ = GetComponent(); - } - - public Vector3 GetWorldPositionFromCoord(int u, int v) - { - var monitor = uddTexture_.monitor; - - // mesh & scale information - var mesh = GetComponent().sharedMesh; - var width = transform.localScale.x * (mesh.bounds.extents.x * 2f); - var height = transform.localScale.y * (mesh.bounds.extents.y * 2f); - - // local position (scale included). - var x = (float)(u - monitor.width / 2) / monitor.width; - var y = -(float)(v - monitor.height / 2) / monitor.height; - var localPos = new Vector3(width * x, height * y, 0f); - - // bend - if (uddTexture_.bend) { - var radius = uddTexture_.radius; - var angle = localPos.x / radius; - if (uddTexture_.meshForwardDirection == MeshForwardDirection.Y) { - localPos.y -= radius * (1f - Mathf.Cos(angle)); - } else { - localPos.z -= radius * (1f - Mathf.Cos(angle)); - } - localPos.x = radius * Mathf.Sin(angle); - } - - // to world position - return transform.position + (transform.rotation * localPos); - } - - void Update() - { - UpdateMoveRects(); - UpdateDirtyRects(); - } - - void DrawRect(uDesktopDuplication.RECT rect, Color color) - { - var p0 = GetWorldPositionFromCoord(rect.left, rect.top); - var p1 = GetWorldPositionFromCoord(rect.right, rect.top); - var p2 = GetWorldPositionFromCoord(rect.right, rect.bottom); - var p3 = GetWorldPositionFromCoord(rect.left, rect.bottom); - - Debug.DrawLine(p0, p1, color); - Debug.DrawLine(p1, p2, color); - Debug.DrawLine(p2, p3, color); - Debug.DrawLine(p3, p0, color); - } - - void UpdateMoveRects() - { - if (drawMoveRectSource) { - foreach (var rect in uddTexture_.monitor.moveRects) { - DrawRect(rect.source, Color.blue); - } - } - if (drawMoveRectDest) { - foreach (var rect in uddTexture_.monitor.moveRects) { - DrawRect(rect.destination, Color.green); - } - } - } - - void UpdateDirtyRects() - { - if (drawDirtyRect) { - foreach (var rect in uddTexture_.monitor.dirtyRects) { - DrawRect(rect, Color.red); - } - } - } -}