2using System.Collections.Generic;
13 public class UIPrimitiveBase : MaskableGraphic, ILayoutElement, ICanvasRaycastFilter
16 List<Vector2> outputList =
new List<Vector2>();
18 [SerializeField]
private Sprite m_Sprite;
19 public Sprite
sprite {
get {
return m_Sprite; }
set {
if (SetPropertyUtility.SetClass(ref m_Sprite, value))
GeneratedUVs(); SetAllDirty(); } }
22 private Sprite m_OverrideSprite;
25 protected Sprite
activeSprite {
get {
return m_OverrideSprite !=
null ? m_OverrideSprite :
sprite; } }
28 internal float m_EventAlphaThreshold = 1;
29 public float eventAlphaThreshold {
get {
return m_EventAlphaThreshold; }
set { m_EventAlphaThreshold = value; } }
40 private bool m_useNativeSize;
41 public bool UseNativeSize {
get {
return m_useNativeSize; }
set { m_useNativeSize = value; SetAllDirty(); } }
45 useLegacyMeshGeneration =
false;
75 return s_WhiteTexture;
93 return v.sqrMagnitude > 0f;
103 float spritePixelsPerUnit = 100;
107 float referencePixelsPerUnit = 100;
109 referencePixelsPerUnit = canvas.referencePixelsPerUnit;
111 return spritePixelsPerUnit / referencePixelsPerUnit;
119 if (m_Material !=
null)
125 return defaultMaterial;
130 base.material = value;
135 protected UIVertex[]
SetVbo(Vector2[] vertices, Vector2[] uvs)
137 UIVertex[] vbo =
new UIVertex[4];
138 for (
int i = 0; i < vertices.Length; i++)
140 var vert = UIVertex.simpleVert;
142 vert.position = vertices[i];
161 float totalDistance = 0, increments = 0;
162 for (
int i = 0; i < input.Count - 1; i++)
164 totalDistance += Vector2.Distance(input[i], input[i + 1]);
168 var incrementCount = 0;
169 for (
int i = 0; i < input.Count - 1; i++)
173 var p2 = input[i + 1];
174 var segmentDistance = Vector2.Distance(p1, p2) / increments;
175 var incrementTime = 1f / segmentDistance;
176 for (
int j = 0; j < segmentDistance; j++)
178 outputList.Add(Vector2.Lerp(p1, (Vector2)p2, j * incrementTime));
185 for (
int i = 0; i < input.Count - 1; i++)
189 var p2 = input[i + 1];
194 outputList.Add(Vector2.Lerp(p1, (Vector2)p2, increments * j));
208 #region ILayoutElement Interface
213 public virtual float minWidth {
get {
return 0; } }
245 #region ICanvasRaycastFilter Interface
249 if (m_EventAlphaThreshold >= 1)
257 RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPoint, eventCamera, out local);
259 Rect rect = GetPixelAdjustedRect();
262 local.x += rectTransform.pivot.x * rect.width;
263 local.y += rectTransform.pivot.y * rect.height;
265 local = MapCoordinate(local, rect);
270 Rect spriteRect =
sprite.textureRect;
271 Vector2 normalized =
new Vector2(local.x / spriteRect.width, local.y / spriteRect.height);
274 float x = Mathf.Lerp(spriteRect.x, spriteRect.xMax, normalized.x) /
sprite.texture.width;
275 float y = Mathf.Lerp(spriteRect.y, spriteRect.yMax, normalized.y) /
sprite.texture.height;
279 return sprite.texture.GetPixelBilinear(x, y).a >= m_EventAlphaThreshold;
281 catch (UnityException e)
283 Debug.LogError(
"Using clickAlphaThreshold lower than 1 on Image whose sprite texture cannot be read. " + e.Message +
" Also make sure to disable sprite packing for this sprite.",
this);
295 private Vector2 MapCoordinate(Vector2 local, Rect rect)
297 Rect spriteRect =
sprite.rect;
299 return new Vector2(local.x * rect.width, local.y * rect.height);
333 Vector4 GetAdjustedBorders(Vector4 border, Rect rect)
335 for (
int axis = 0; axis <= 1; axis++)
339 float combinedBorders = border[axis] + border[axis + 2];
340 if (rect.size[axis] < combinedBorders && combinedBorders != 0)
342 float borderScaleRatio = rect.size[axis] / combinedBorders;
343 border[axis] *= borderScaleRatio;
344 border[axis + 2] *= borderScaleRatio;
virtual float flexibleWidth
virtual bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
override Material material
Vector2[] IncreaseResolution(Vector2[] input)
virtual float flexibleHeight
ResolutionMode ImproveResolution
virtual void GeneratedUVs()
static Material s_ETC1DefaultUI
static Material defaultETC1GraphicMaterial
Default material used to draw everything if no explicit material was specified.
List< Vector2 > IncreaseResolution(List< Vector2 > input)
virtual void CalculateLayoutInputVertical()
override Texture mainTexture
Image's texture comes from the UnityEngine.Image.
virtual float preferredHeight
virtual float preferredWidth
virtual void CalculateLayoutInputHorizontal()
UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs)
virtual void ResolutionToNativeSize(float distance)
virtual int layoutPriority
bool hasBorder
Whether the Image has a border to work with.
float eventAlphaThreshold
Credit Erdener Gonenc - @PixelEnvision.