PixelHitTest.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using FairyGUI.Utils;
  2. using UnityEngine;
  3. namespace FairyGUI
  4. {
  5. /// <summary>
  6. ///
  7. /// </summary>
  8. public class PixelHitTestData
  9. {
  10. public int pixelWidth;
  11. public float scale;
  12. public byte[] pixels;
  13. public int pixelsLength;
  14. public int pixelsOffset;
  15. public void Load(ByteBuffer ba)
  16. {
  17. ba.ReadInt();
  18. pixelWidth = ba.ReadInt();
  19. scale = 1.0f / ba.ReadByte();
  20. pixels = ba.buffer;
  21. pixelsLength = ba.ReadInt();
  22. pixelsOffset = ba.position;
  23. ba.Skip(pixelsLength);
  24. }
  25. }
  26. /// <summary>
  27. ///
  28. /// </summary>
  29. public class PixelHitTest : IHitTest
  30. {
  31. public int offsetX;
  32. public int offsetY;
  33. public float sourceWidth;
  34. public float sourceHeight;
  35. PixelHitTestData _data;
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. /// <param name="data"></param>
  40. /// <param name="offsetX"></param>
  41. /// <param name="offsetY"></param>
  42. public PixelHitTest(PixelHitTestData data, int offsetX, int offsetY, float sourceWidth, float sourceHeight)
  43. {
  44. _data = data;
  45. this.offsetX = offsetX;
  46. this.offsetY = offsetY;
  47. this.sourceWidth = sourceWidth;
  48. this.sourceHeight = sourceHeight;
  49. }
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. /// <param name="contentRect"></param>
  54. /// <param name="localPoint"></param>
  55. /// <returns></returns>
  56. public bool HitTest(Rect contentRect, Vector2 localPoint)
  57. {
  58. if (!contentRect.Contains(localPoint))
  59. return false;
  60. int x = Mathf.FloorToInt((localPoint.x * sourceWidth / contentRect.width - offsetX) * _data.scale);
  61. int y = Mathf.FloorToInt((localPoint.y * sourceHeight / contentRect.height - offsetY) * _data.scale);
  62. if (x < 0 || y < 0 || x >= _data.pixelWidth)
  63. return false;
  64. int pos = y * _data.pixelWidth + x;
  65. int pos2 = pos / 8;
  66. int pos3 = pos % 8;
  67. if (pos2 >= 0 && pos2 < _data.pixelsLength)
  68. return ((_data.pixels[_data.pixelsOffset + pos2] >> pos3) & 0x1) > 0;
  69. else
  70. return false;
  71. }
  72. }
  73. }