private void UpdateVertices() { m_orientedRect2D = new OrientedRect2D(rectTransform); var rect = rectTransform.rect; rect.xMin += padding.left; rect.yMax -= padding.top; rect.xMax -= padding.right; rect.yMin += padding.bottom; m_offsetedOrientedRect2D = new OrientedRect2D((Vector2)rectTransform.position + Vector2.Scale(rect.center, rectTransform.lossyScale) , Vector2.Scale(rect.size, rectTransform.lossyScale) , rectTransform.rotation ); if (m_vertices == null) { m_vertices = new List <UIVertex>(30); } else { m_vertices.Clear(); } var rectVertices = GetVertices(m_orientedRect2D).ToArray(); var rectOffsetedVertices = GetVertices(m_offsetedOrientedRect2D).ToArray(); if (!VertexUtility.IsDegeneracy(rectOffsetedVertices[0], rectOffsetedVertices[1], rectOffsetedVertices[2])) { m_vertices.Add(CreateUIVertex(rectOffsetedVertices[0], 1.0f)); m_vertices.Add(CreateUIVertex(rectOffsetedVertices[1], 1.0f)); m_vertices.Add(CreateUIVertex(rectOffsetedVertices[2], 1.0f)); } if (!VertexUtility.IsDegeneracy(rectOffsetedVertices[0], rectOffsetedVertices[2], rectOffsetedVertices[3])) { m_vertices.Add(CreateUIVertex(rectOffsetedVertices[0], 1.0f)); m_vertices.Add(CreateUIVertex(rectOffsetedVertices[2], 1.0f)); m_vertices.Add(CreateUIVertex(rectOffsetedVertices[3], 1.0f)); } for (int i = 0, iMax = 4; i < iMax; ++i) { var iNext = i + 1; if (iMax <= iNext) { iNext = 0; } if (!VertexUtility.IsDegeneracy(rectVertices[i], rectVertices[iNext], rectOffsetedVertices[i])) { m_vertices.Add(CreateUIVertex(rectVertices[i], 0.0f)); m_vertices.Add(CreateUIVertex(rectVertices[iNext], 0.0f)); m_vertices.Add(CreateUIVertex(rectOffsetedVertices[i], 1.0f)); } if (!VertexUtility.IsDegeneracy(rectVertices[iNext], rectOffsetedVertices[iNext], rectOffsetedVertices[i])) { m_vertices.Add(CreateUIVertex(rectVertices[iNext], 0.0f)); m_vertices.Add(CreateUIVertex(rectOffsetedVertices[iNext], 1.0f)); m_vertices.Add(CreateUIVertex(rectOffsetedVertices[i], 1.0f)); } } }
public bool Overlaps(OrientedRect2D other) { var distanceAxis = position - other.position; var thisUnitAxis = new AxisPack3(rotation); var thisExtentsAxis = new AxisPack3(extents, rotation); var otherUnitAxis = new AxisPack3(other.rotation); var otherExtentsAxis = new AxisPack3(other.extents, other.rotation); //this for (int i = 0, iMax = 2; i < iMax; ++i) { var splitAxis = thisUnitAxis[i]; var distance = GetVectorLengthOfProjection(distanceAxis, splitAxis); distance -= this.extents[i]; distance -= GetVectorLengthOfProjection(otherExtentsAxis, splitAxis); if (0.0f < distance) { //NoHit return(false); } } //other for (int i = 0, iMax = 2; i < iMax; ++i) { var splitAxis = otherUnitAxis[i]; var distance = GetVectorLengthOfProjection(distanceAxis, splitAxis); distance -= GetVectorLengthOfProjection(thisExtentsAxis, splitAxis); distance -= other.extents[i]; if (0.0f < distance) { //NoHit return(false); } } //3rd split axis for (int i = 0, iMax = 2; i < iMax; ++i) { for (int k = 0, kMax = 2; k < kMax; ++k) { var splitAxis = Vector3.Cross(thisUnitAxis[i], otherUnitAxis[k]); var distance = GetVectorLengthOfProjection(distanceAxis, splitAxis); distance -= GetVectorLengthOfProjection(thisExtentsAxis, splitAxis); distance -= GetVectorLengthOfProjection(otherExtentsAxis, splitAxis); if (0.0f < distance) { //NoHit return(false); } } } //Hit return(true); }
private static IEnumerable <Vector2> GetVertices(OrientedRect2D orientedRect) { var rotatedExtents = (Vector2)(orientedRect.rotation * orientedRect.extents); for (int i = 0, iMax = 4; i < iMax; ++i) { var sign = new Vector2(((((i ^ (i >> 1)) & 0x1) == 0)? 1.0f: -1.0f), (((i >> 1) == 0)? 1.0f: -1.0f)); //xy:[++, -+, --, +-] yield return(orientedRect.position + Vector2.Scale(rotatedExtents, sign)); } yield break; }
public OrientedRect2D(OrientedRect2D source) { this.position = source.position; this.extents = source.extents; this.rotation = source.rotation; }