增加None命中测试等级

This commit is contained in:
ww-rm
2025-10-02 11:19:22 +08:00
parent 4c72608398
commit e9b0ce3db2

View File

@@ -12,7 +12,7 @@ namespace Spine.Interfaces
/// <summary> /// <summary>
/// 命中测试等级枚举值 /// 命中测试等级枚举值
/// </summary> /// </summary>
public enum HitTestLevel { Bounds, Meshes, Pixels } public enum HitTestLevel { None, Bounds, Meshes, Pixels }
public static class SpineExtension public static class SpineExtension
{ {
@@ -21,7 +21,7 @@ namespace Spine.Interfaces
/// <summary> /// <summary>
/// 命中检测精确度等级 /// 命中检测精确度等级
/// </summary> /// </summary>
public static HitTestLevel HitTestLevel { get; set; } = HitTestLevel.Bounds; public static HitTestLevel HitTestLevel { get; set; }
/// <summary> /// <summary>
/// 命中测试时输出命中的插槽名称 /// 命中测试时输出命中的插槽名称
@@ -128,12 +128,12 @@ namespace Spine.Interfaces
if (self.A <= 0 || !self.Bone.Active || self.Disabled) if (self.A <= 0 || !self.Bone.Active || self.Disabled)
return false; return false;
if (HitTestLevel == HitTestLevel.Bounds) if (HitTestLevel == HitTestLevel.None || HitTestLevel == HitTestLevel.Bounds)
{ {
self.GetBounds(out var bx, out var by, out var bw, out var bh); self.GetBounds(out var bx, out var by, out var bw, out var bh);
return x >= bx && x <= (bx + bw) && y >= by && y <= (by + bh); return x >= bx && x <= (bx + bw) && y >= by && y <= (by + bh);
} }
else else if (HitTestLevel == HitTestLevel.Meshes || HitTestLevel == HitTestLevel.Pixels)
{ {
float[] vertices = new float[8]; float[] vertices = new float[8];
int[] triangles; int[] triangles;
@@ -217,6 +217,10 @@ namespace Spine.Interfaces
} }
return false; return false;
} }
else
{
throw new NotImplementedException(HitTestLevel.ToString());
}
} }
/// <summary> /// <summary>
@@ -224,24 +228,29 @@ namespace Spine.Interfaces
/// </summary> /// </summary>
public static bool HitTest(this ISkeleton self, float x, float y) public static bool HitTest(this ISkeleton self, float x, float y)
{ {
if (HitTestLevel == HitTestLevel.None)
{
self.GetBounds(out var bx, out var by, out var bw, out var bh);
return x >= bx && x <= (bx + bw) && y >= by && y <= (by + bh);
}
var cache = new Dictionary<SFML.Graphics.Texture, SFML.Graphics.Image>(); var cache = new Dictionary<SFML.Graphics.Texture, SFML.Graphics.Image>();
bool hit = false; bool hit = false;
List<string> slotNames = []; string hitSlotName = "";
foreach (var st in self.IterDrawOrder().Reverse()) foreach (var st in self.IterDrawOrder().Reverse())
{ {
if (st.HitTest(x, y, cache)) if (st.HitTest(x, y, cache))
{ {
hit = true; hit = true;
if (!LogHitSlots) hitSlotName = st.Name;
break; break;
slotNames.Add(st.Name);
} }
} }
foreach (var img in cache.Values) img.Dispose(); foreach (var img in cache.Values) img.Dispose();
if (LogHitSlots && slotNames.Count > 0) if (hit && LogHitSlots)
{ {
_logger.Debug("Hit ({0}): [{1}]", self.Name, string.Join(", ", slotNames)); _logger.Debug("Hit ({0}): [{1}]", self.Name, hitSlotName);
} }
return hit; return hit;
} }