Files
beyond/Assets/ThirdParty/PlayMaker/Actions/Rect/RectOverlaps.cs
2024-11-20 15:21:28 +01:00

90 lines
2.0 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Rect)]
[Tooltip("Tests if 2 Rects overlap.")]
public class RectOverlaps : FsmStateAction
{
[RequiredField]
[Tooltip("First Rectangle.")]
public FsmRect rect1;
[RequiredField]
[Tooltip("Second Rectangle.")]
public FsmRect rect2;
[Tooltip("Event to send if the Rects overlap.")]
public FsmEvent trueEvent;
[Tooltip("Event to send if the Rects do not overlap.")]
public FsmEvent falseEvent;
[UIHint(UIHint.Variable)]
[Tooltip("Store the result in a variable.")]
public FsmBool storeResult;
//[ActionSection("")]
[Tooltip("Repeat every frame.")]
public bool everyFrame;
public override void Reset()
{
rect1 = new FsmRect { UseVariable = true };
rect2 = new FsmRect { UseVariable = true };
storeResult = null;
trueEvent = null;
falseEvent = null;
everyFrame = false;
}
public override void OnEnter()
{
DoRectOverlap();
if (!everyFrame)
{
Finish();
}
}
public override void OnUpdate()
{
DoRectOverlap();
}
void DoRectOverlap()
{
if (rect1.IsNone || rect2.IsNone)
{
return;
}
var overlapping = Intersect(rect1.Value, rect2.Value);
storeResult.Value = overlapping;
Fsm.Event(overlapping ? trueEvent : falseEvent);
}
public static bool Intersect(Rect a, Rect b)
{
FlipNegative(ref a);
FlipNegative(ref b);
bool c1 = a.xMin < b.xMax;
bool c2 = a.xMax > b.xMin;
bool c3 = a.yMin < b.yMax;
bool c4 = a.yMax > b.yMin;
return c1 && c2 && c3 && c4;
}
public static void FlipNegative(ref Rect r)
{
if (r.width < 0)
r.x -= (r.width *= -1);
if (r.height < 0)
r.y -= (r.height *= -1);
}
}
}