SpriteRendererExtensions.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace O3DWB
  5. {
  6. public static class SpriteRendererExtensions
  7. {
  8. #region Extension Methods
  9. public static Vector3 GetModelSpaceSize(this SpriteRenderer spriteRenderer)
  10. {
  11. return spriteRenderer.GetModelSpaceBox().Size;
  12. }
  13. public static Box GetModelSpaceBox(this SpriteRenderer spriteRenderer)
  14. {
  15. Sprite sprite = spriteRenderer.sprite;
  16. if (sprite == null) return Box.GetInvalid();
  17. List<Vector2> spriteVerts = new List<Vector2>(sprite.vertices);
  18. return Vector2Extensions.GetBoxFromPointCloud(spriteVerts);
  19. }
  20. // Works only when the Read/Write enabled flag is set inside the sprite texture properties.
  21. // Otherwise, it will always return false.
  22. public static bool IsPixelFullyTransparent(this SpriteRenderer spriteRenderer, Vector3 worldPos)
  23. {
  24. Sprite sprite = spriteRenderer.sprite;
  25. if(sprite == null) return true;
  26. Texture2D spriteTexture = sprite.texture;
  27. if(spriteTexture == null) return true;
  28. Transform spriteTransform = spriteRenderer.transform;
  29. Vector3 modelSpacePos = spriteTransform.InverseTransformPoint(worldPos);
  30. Vector3 projectedPos = new Plane(Vector3.forward, 0.0f).ProjectPoint(modelSpacePos);
  31. Box modelSpaceBox = spriteRenderer.GetModelSpaceBox();
  32. modelSpaceBox.Size = new Vector3(modelSpaceBox.Size.x, modelSpaceBox.Size.y, 1.0f);
  33. if (!modelSpaceBox.ContainsPoint(projectedPos)) return true;
  34. List<Vector3> boxFaceCornerPoints = modelSpaceBox.GetBoxFaceCornerPoints(BoxFace.Front);
  35. Vector3 bottomLeft = boxFaceCornerPoints[(int)BoxFaceCornerPoint.BottomLeft];
  36. Vector3 fromTopLeftToPos = projectedPos - bottomLeft;
  37. Vector2 pixelCoords = new Vector2(fromTopLeftToPos.x * sprite.pixelsPerUnit, fromTopLeftToPos.y * sprite.pixelsPerUnit);
  38. pixelCoords += sprite.textureRectOffset;
  39. try
  40. {
  41. float alpha = spriteTexture.GetPixel((int)(pixelCoords.x + 0.5f), (int)(pixelCoords.y + 0.5f)).a;
  42. return alpha <= 1e-3f;
  43. }
  44. catch(UnityException e)
  45. {
  46. // Ternary operator needed to avoid 'variable not used' warning
  47. return e != null ? false : false;
  48. }
  49. }
  50. #endregion
  51. }
  52. }
  53. #endif