tk2dSlicedSprite.SetGeometry C# (CSharp) Method

SetGeometry() protected method

protected SetGeometry ( Vector3 vertices, Vector2 uvs ) : void
vertices Vector3
uvs Vector2
return void
    protected void SetGeometry(Vector3[] vertices, Vector2[] uvs)
    {
        var sprite = Collection.spriteDefinitions[spriteId];
        if (sprite.positions.Length == 4)
        {
            float colliderExtentZ = (sprite.colliderType == tk2dSpriteDefinition.ColliderType.Box)?(sprite.colliderVertices[1].z * _scale.z):0.1f;

            if (legacyMode)
            {
                // in legacy mode, scale is used to determine the total size of the sliced sprite
                float sx = _scale.x;
                float sy = _scale.y;

                Vector3[] srcVert = sprite.positions;
                Vector3 dx = srcVert[1] - srcVert[0];
                Vector3 dy = srcVert[2] - srcVert[0];

                Vector2[] srcUv = sprite.uvs;
                Vector2 duvx = sprite.uvs[1] - sprite.uvs[0];
                Vector2 duvy = sprite.uvs[2] - sprite.uvs[0];

                Vector3 origin = new Vector3(srcVert[0].x * sx, srcVert[0].y * sy, srcVert[0].z * _scale.z);

                Vector3[] originPoints = new Vector3[4] {
                    origin,
                    origin + dy * borderBottom,
                    origin + dy * (sy - borderTop),
                    origin + dy * sy
                };
                Vector2[] originUvs = new Vector2[4] {
                    srcUv[0],
                    srcUv[0] + duvy * borderBottom,
                    srcUv[0] + duvy * (1 - borderTop),
                    srcUv[0] + duvy,
                };

                for (int i = 0; i < 4; ++i)
                {
                    meshVertices[i * 4 + 0] = originPoints[i];
                    meshVertices[i * 4 + 1] = originPoints[i] + dx * borderLeft;
                    meshVertices[i * 4 + 2] = originPoints[i] + dx * (sx - borderRight);
                    meshVertices[i * 4 + 3] = originPoints[i] + dx * sx;
                    meshUvs[i * 4 + 0] = originUvs[i];
                    meshUvs[i * 4 + 1] = originUvs[i] + duvx * borderLeft;
                    meshUvs[i * 4 + 2] = originUvs[i] + duvx * (1 - borderRight);
                    meshUvs[i * 4 + 3] = originUvs[i] + duvx;
                }
            }
            else
            {
                float sx = sprite.texelSize.x;
                float sy = sprite.texelSize.y;

                Vector3[] srcVert = sprite.positions;
                float dx = (srcVert[1].x - srcVert[0].x);
                float dy = (srcVert[2].y - srcVert[0].y);

                float borderTopPixels = borderTop * dy;
                float borderBottomPixels = borderBottom * dy;
                float borderRightPixels = borderRight * dx;
                float borderLeftPixels = borderLeft * dx;

                float dimXPixels = dimensions.x * sx;
                float dimYPixels = dimensions.y * sy;

                float anchorOffsetX = 0.0f;
                float anchorOffsetY = 0.0f;
                switch (anchor)
                {
                case Anchor.LowerLeft: case Anchor.MiddleLeft: case Anchor.UpperLeft:
                    break;
                case Anchor.LowerCenter: case Anchor.MiddleCenter: case Anchor.UpperCenter:
                    anchorOffsetX = -(int)(dimensions.x / 2.0f); break;
                case Anchor.LowerRight: case Anchor.MiddleRight: case Anchor.UpperRight:
                    anchorOffsetX = -(int)(dimensions.x); break;
                }
                switch (anchor)
                {
                case Anchor.LowerLeft: case Anchor.LowerCenter: case Anchor.LowerRight:
                    break;
                case Anchor.MiddleLeft: case Anchor.MiddleCenter: case Anchor.MiddleRight:
                    anchorOffsetY = -(int)(dimensions.y / 2.0f); break;
                case Anchor.UpperLeft: case Anchor.UpperCenter: case Anchor.UpperRight:
                    anchorOffsetY = -(int)dimensions.y; break;
                }

                // scale back to sprite coordinates
                // do it after the cast above, as we're trying to align to pixel
                anchorOffsetX *= sx;
                anchorOffsetY *= sy;

                boundsCenter = new Vector3(dimXPixels / 2.0f + anchorOffsetX, dimYPixels / 2.0f + anchorOffsetY, 0);
                boundsExtents = new Vector3(dimXPixels / 2.0f, dimYPixels / 2.0f, colliderExtentZ);

                Vector2[] srcUv = sprite.uvs;
                Vector2 duvx = sprite.uvs[1] - sprite.uvs[0];
                Vector2 duvy = sprite.uvs[2] - sprite.uvs[0];

                Vector3 origin = new Vector3(srcVert[0].x, srcVert[0].y, srcVert[0].z);
                origin = new Vector3(anchorOffsetX, anchorOffsetY, 0);

                Vector3[] originPoints = new Vector3[4] {
                    origin,
                    origin + new Vector3(0, borderBottomPixels, 0),
                    origin + new Vector3(0, dimYPixels - borderTopPixels, 0),
                    origin + new Vector3(0, dimYPixels, 0),
                };
                Vector2[] originUvs = new Vector2[4] {
                    srcUv[0],
                    srcUv[0] + duvy * borderBottom,
                    srcUv[0] + duvy * (1 - borderTop),
                    srcUv[0] + duvy,
                };

                for (int i = 0; i < 4; ++i)
                {
                    meshVertices[i * 4 + 0] = originPoints[i];
                    meshVertices[i * 4 + 1] = originPoints[i] + new Vector3(borderLeftPixels, 0, 0);
                    meshVertices[i * 4 + 2] = originPoints[i] + new Vector3(dimXPixels - borderRightPixels, 0, 0);
                    meshVertices[i * 4 + 3] = originPoints[i] + new Vector3(dimXPixels, 0, 0);

                    for (int j = 0; j < 4; ++j)
                    {
                        Vector3 v = meshVertices[i * 4 + j];
                        v.x = v.x * _scale.x;
                        v.y = v.y * _scale.y;
                        v.z = v.z * _scale.z;
                        meshVertices[i * 4 + j] = v;
                    }

                    meshUvs[i * 4 + 0] = originUvs[i];
                    meshUvs[i * 4 + 1] = originUvs[i] + duvx * borderLeft;
                    meshUvs[i * 4 + 2] = originUvs[i] + duvx * (1 - borderRight);
                    meshUvs[i * 4 + 3] = originUvs[i] + duvx;
                }
            }
        }
        else
        {
            for (int i = 0; i < vertices.Length; ++i)
                vertices[i] = Vector3.zero;
        }
    }