From d2ab30e7a69bfe7efda63ae75812207377917bd3 Mon Sep 17 00:00:00 2001
From: miepzerino <o.skotnik@gmail.com>
Date: Sun, 30 Mar 2025 18:50:27 +0000
Subject: [PATCH] Merge branch 'Flexalon-UI-Layouts' into develop
---
Assets/Flexalon/Runtime/Interaction/FlexalonDragTarget.cs | 87 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 87 insertions(+), 0 deletions(-)
diff --git a/Assets/Flexalon/Runtime/Interaction/FlexalonDragTarget.cs b/Assets/Flexalon/Runtime/Interaction/FlexalonDragTarget.cs
new file mode 100644
index 0000000..6dbb48d
--- /dev/null
+++ b/Assets/Flexalon/Runtime/Interaction/FlexalonDragTarget.cs
@@ -0,0 +1,87 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Flexalon
+{
+ /// <summary> A drag target allows a layout to accept dragged FlexalonInteractable objects. </summary>
+ [AddComponentMenu("Flexalon/Flexalon Drag Target"), HelpURL("https://www.flexalon.com/docs/dragging"), DisallowMultipleComponent]
+ public class FlexalonDragTarget : MonoBehaviour
+ {
+ [SerializeField]
+ private bool _canRemoveObjects = true;
+ /// <summary> Whether objects can be removed from the layout by dragging them from this target. </summary>
+ public bool CanRemoveObjects {
+ get => _canRemoveObjects;
+ set => _canRemoveObjects = value;
+ }
+
+ [SerializeField]
+ private bool _canAddObjects = true;
+ /// <summary> Whether objects can be added to the layout by dragging them to this target. </summary>
+ public bool CanAddObjects {
+ get => _canAddObjects;
+ set => _canAddObjects = value;
+ }
+
+ [SerializeField]
+ private int _minObjects;
+ /// <summary> The minimum number of objects that must remain in this layout. </summary>
+ public int MinObjects {
+ get => _minObjects;
+ set => _minObjects = value;
+ }
+
+ [SerializeField]
+ private int _maxObjects;
+ /// <summary> The maximum number of objects that can be added to the layout. </summary>
+ public int MaxObjects {
+ get => _maxObjects;
+ set => _maxObjects = value;
+ }
+
+ [SerializeField]
+ private Vector3 _margin;
+ /// <summary> Extra margin around the layout size to use for hit testing. </summary>
+ public Vector3 Margin {
+ get => _margin;
+ set => _margin = value;
+ }
+
+ private FlexalonNode _node;
+
+ private static HashSet<FlexalonDragTarget> _dragTargets = new HashSet<FlexalonDragTarget>();
+ public static IReadOnlyCollection<FlexalonDragTarget> DragTargets => _dragTargets;
+
+ void OnEnable()
+ {
+ _node = Flexalon.GetOrCreateNode(gameObject);
+ _dragTargets.Add(this);
+ }
+
+ void OnDisable()
+ {
+ _node = null;
+ _dragTargets.Remove(this);
+ }
+
+ internal bool OverlapsSphere(Vector3 position, float radius)
+ {
+ var center = _node.Result.AdapterBounds.center;
+ var extents = (_node.Result.AdapterBounds.size + _margin * 2) / 2;
+ var min = center - extents;
+ var max = center + extents;
+
+ // Transform the sphere center into the OBB's local coordinate system
+ Vector3 localSphereCenter = transform.InverseTransformPoint(position);
+
+ // Calculate the closest point on the OBB to the sphere center
+ Vector3 closestPointOnOBB = Vector3.Min(Vector3.Max(localSphereCenter, min), max);
+
+ // Calculate the distance between the closest point and the sphere center
+ float distanceSquared = (closestPointOnOBB - localSphereCenter).sqrMagnitude;
+
+ // Check if the distance is less than or equal to the sphere's radius squared
+ return distanceSquared <= radius * radius;
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.10.0