Example #1
0
        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));
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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;
        }
Example #4
0
 public OrientedRect2D(OrientedRect2D source)
 {
     this.position = source.position;
     this.extents  = source.extents;
     this.rotation = source.rotation;
 }