void BakeMesh(bool needUpdateSpriteArrays)
        {
            if (needUpdateSpriteArrays)
            {
                UpdateSpriteArrays();
            }

            List <ShapeControlPointExperimental> shapePoints   = new List <ShapeControlPointExperimental>();
            List <SpriteShapeMetaData>           shapeMetaData = new List <SpriteShapeMetaData>();

            for (int i = 0; i < m_Spline.GetPointCount(); ++i)
            {
                ShapeControlPointExperimental shapeControlPoint;
                shapeControlPoint.position     = m_Spline.GetPosition(i);
                shapeControlPoint.leftTangent  = m_Spline.GetLeftTangent(i);
                shapeControlPoint.rightTangent = m_Spline.GetRightTangent(i);
                shapeControlPoint.mode         = (int)m_Spline.GetTangentMode(i);
                shapePoints.Add(shapeControlPoint);

                SpriteShapeMetaData metaData;
                metaData.bevelCutoff = m_Spline.GetBevelCutoff(i);
                metaData.bevelSize   = m_Spline.GetBevelSize(i);
                metaData.corner      = m_Spline.GetCorner(i);
                metaData.height      = m_Spline.GetHeight(i);
                metaData.spriteIndex = (uint)m_Spline.GetSpriteIndex(i);
                shapeMetaData.Add(metaData);
            }

            if (spriteShapeRenderer != null && ValidatePoints(shapePoints))
            {
                SpriteShapeUtility.GenerateSpriteShape(spriteShapeRenderer, m_CurrentShapeParameters,
                                                       shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray,
                                                       m_CornerSpriteArray);
            }

            if (m_DynamicOcclusionOverriden)
            {
                spriteShapeRenderer.allowOcclusionWhenDynamic = m_DynamicOcclusionLocal;
                m_DynamicOcclusionOverriden = false;
            }
        }
 public static void GenerateSpriteShape(SpriteShapeRenderer renderer, SpriteShapeParameters shapeParams, ShapeControlPoint[] points, SpriteShapeMetaData[] metaData, AngleRangeInfo[] angleRange, Sprite[] sprites, Sprite[] corners)
 {
     SpriteShapeUtility.GenerateSpriteShape_Injected(renderer, ref shapeParams, points, metaData, angleRange, sprites, corners);
 }
 public static int[] Generate(Mesh mesh, SpriteShapeParameters shapeParams, ShapeControlPoint[] points, SpriteShapeMetaData[] metaData, AngleRangeInfo[] angleRange, Sprite[] sprites, Sprite[] corners)
 {
     return(SpriteShapeUtility.Generate_Injected(mesh, ref shapeParams, points, metaData, angleRange, sprites, corners));
 }
        unsafe JobHandle BakeMesh(bool needUpdateSpriteArrays)
        {
            JobHandle jobHandle = default;

            if (needUpdateSpriteArrays)
            {
                UpdateSprites();
            }

            int pointCount = m_Spline.GetPointCount();
            NativeArray <ShapeControlPoint>   shapePoints   = new NativeArray <ShapeControlPoint>(pointCount, Allocator.Temp);
            NativeArray <SpriteShapeMetaData> shapeMetaData = new NativeArray <SpriteShapeMetaData>(pointCount, Allocator.Temp);

            for (int i = 0; i < pointCount; ++i)
            {
                ShapeControlPoint shapeControlPoint;
                shapeControlPoint.position     = m_Spline.GetPosition(i);
                shapeControlPoint.leftTangent  = m_Spline.GetLeftTangent(i);
                shapeControlPoint.rightTangent = m_Spline.GetRightTangent(i);
                shapeControlPoint.mode         = (int)m_Spline.GetTangentMode(i);
                shapePoints[i] = shapeControlPoint;

                SpriteShapeMetaData metaData;
                metaData.corner      = m_Spline.GetCorner(i);
                metaData.height      = m_Spline.GetHeight(i);
                metaData.spriteIndex = (uint)m_Spline.GetSpriteIndex(i);
                metaData.bevelCutoff = 0;
                metaData.bevelSize   = 0;
                shapeMetaData[i]     = metaData;
            }

            if (spriteShapeRenderer != null && ValidatePoints(shapePoints))
            {
                if (m_LegacyGenerator)
                {
                    SpriteShapeUtility.GenerateSpriteShape(spriteShapeRenderer, m_ActiveShapeParameters,
                                                           shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray,
                                                           m_CornerSpriteArray);
                }
                else
                {
                    bool  hasSprites    = false;
                    float smallestWidth = 99999.0f;
                    foreach (var sprite in m_SpriteArray)
                    {
                        if (sprite != null)
                        {
                            hasSprites = true;
                            float pixelWidth = BezierUtility.GetSpritePixelWidth(sprite);
                            smallestWidth = (smallestWidth > pixelWidth) ? pixelWidth : smallestWidth;
                        }
                    }

                    // Approximate vertex Array Count.
                    float shapeLength = BezierUtility.BezierLength(shapePoints, splineDetail * splineDetail);
                    int   adjustWidth = hasSprites ? ((int)(shapeLength / smallestWidth) * 6) + (pointCount * 6 * splineDetail) : 0;
                    int   adjustShape = pointCount * 4 * splineDetail;
#if !UNITY_EDITOR
                    adjustShape = (spriteShape != null && spriteShape.fillTexture != null) ? adjustShape : 0;
#endif
                    int maxArrayCount = adjustShape + adjustWidth;

                    // Collider Data
                    if (m_ColliderData.IsCreated)
                    {
                        m_ColliderData.Dispose();
                    }
                    m_ColliderData = new NativeArray <float2>(maxArrayCount, Allocator.Persistent);

                    // Tangent Data
                    if (!m_TangentData.IsCreated)
                    {
                        m_TangentData = new NativeArray <Vector4>(1, Allocator.Persistent);
                    }

                    NativeArray <ushort>             indexArray;
                    NativeSlice <Vector3>            posArray;
                    NativeSlice <Vector2>            uv0Array;
                    NativeArray <Bounds>             bounds    = spriteShapeRenderer.GetBounds();
                    NativeArray <SpriteShapeSegment> geomArray = spriteShapeRenderer.GetSegments(shapePoints.Length * 8);
                    NativeSlice <Vector4>            tanArray  = new NativeSlice <Vector4>(m_TangentData);

                    if (m_EnableTangents)
                    {
                        spriteShapeRenderer.GetChannels(maxArrayCount, out indexArray, out posArray, out uv0Array, out tanArray);
                    }
                    else
                    {
                        spriteShapeRenderer.GetChannels(maxArrayCount, out indexArray, out posArray, out uv0Array);
                    }

                    var spriteShapeJob = new SpriteShapeGenerator()
                    {
                        m_Bounds         = bounds,
                        m_PosArray       = posArray,
                        m_Uv0Array       = uv0Array,
                        m_TanArray       = tanArray,
                        m_GeomArray      = geomArray,
                        m_IndexArray     = indexArray,
                        m_ColliderPoints = m_ColliderData
                    };
                    spriteShapeJob.Prepare(this, m_ActiveShapeParameters, maxArrayCount, shapePoints, shapeMetaData, m_AngleRangeInfoArray, m_EdgeSpriteArray, m_CornerSpriteArray);
                    jobHandle = spriteShapeJob.Schedule();
                    spriteShapeRenderer.Prepare(jobHandle, m_ActiveShapeParameters, m_SpriteArray);
                    JobHandle.ScheduleBatchedJobs();
                }
            }

            if (m_DynamicOcclusionOverriden)
            {
                spriteShapeRenderer.allowOcclusionWhenDynamic = m_DynamicOcclusionLocal;
                m_DynamicOcclusionOverriden = false;
            }

            shapePoints.Dispose();
            shapeMetaData.Dispose();
            return(jobHandle);
        }
        JobHandle BakeMesh(bool needUpdateSpriteArrays)
        {
            JobHandle jobHandle = default;

            if (needUpdateSpriteArrays)
            {
                UpdateSprites();
            }

            List <ShapeControlPointExperimental> shapePoints   = new List <ShapeControlPointExperimental>();
            List <SpriteShapeMetaData>           shapeMetaData = new List <SpriteShapeMetaData>();
            int pointCount = m_Spline.GetPointCount();

            for (int i = 0; i < pointCount; ++i)
            {
                ShapeControlPointExperimental shapeControlPoint;
                shapeControlPoint.position     = m_Spline.GetPosition(i);
                shapeControlPoint.leftTangent  = m_Spline.GetLeftTangent(i);
                shapeControlPoint.rightTangent = m_Spline.GetRightTangent(i);
                shapeControlPoint.mode         = (int)m_Spline.GetTangentMode(i);
                shapePoints.Add(shapeControlPoint);

                SpriteShapeMetaData metaData;
                metaData.corner      = m_Spline.GetCorner(i);
                metaData.height      = m_Spline.GetHeight(i);
                metaData.spriteIndex = (uint)m_Spline.GetSpriteIndex(i);
                metaData.bevelCutoff = 0;
                metaData.bevelSize   = 0;
                shapeMetaData.Add(metaData);
            }

            if (spriteShapeRenderer != null && ValidatePoints(shapePoints))
            {
                if (m_LegacyGenerator)
                {
                    SpriteShapeUtility.GenerateSpriteShape(spriteShapeRenderer, m_ActiveShapeParameters,
                                                           shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray,
                                                           m_CornerSpriteArray);
                }
                else
                {
                    // Allow max quads for each segment to 128.
                    int maxArrayCount = (int)(pointCount * 256 * m_ActiveShapeParameters.splineDetail);
                    if (m_ColliderData.IsCreated)
                    {
                        m_ColliderData.Dispose();
                    }
                    m_ColliderData = new NativeArray <float2>(maxArrayCount, Allocator.Persistent);

                    NativeArray <ushort>  indexArray;
                    NativeSlice <Vector3> posArray;
                    NativeSlice <Vector2> uv0Array;
                    spriteShapeRenderer.GetChannels(maxArrayCount, out indexArray, out posArray, out uv0Array);
                    NativeArray <Bounds>             bounds    = spriteShapeRenderer.GetBounds();
                    NativeArray <SpriteShapeSegment> geomArray = spriteShapeRenderer.GetSegments(shapePoints.Count * 8);

                    var spriteShapeJob = new SpriteShapeGenerator()
                    {
                        m_GeomArray      = geomArray,
                        m_IndexArray     = indexArray,
                        m_PosArray       = posArray,
                        m_Uv0Array       = uv0Array,
                        m_ColliderPoints = m_ColliderData,
                        m_Bounds         = bounds
                    };
                    spriteShapeJob.Prepare(this, m_ActiveShapeParameters, maxArrayCount, shapePoints.ToArray(), shapeMetaData.ToArray(), m_AngleRangeInfoArray, m_EdgeSpriteArray, m_CornerSpriteArray);
                    jobHandle = spriteShapeJob.Schedule();
                    spriteShapeRenderer.Prepare(jobHandle, m_ActiveShapeParameters, m_SpriteArray);
                    JobHandle.ScheduleBatchedJobs();
                }
            }

            if (m_DynamicOcclusionOverriden)
            {
                spriteShapeRenderer.allowOcclusionWhenDynamic = m_DynamicOcclusionLocal;
                m_DynamicOcclusionOverriden = false;
            }
            return(jobHandle);
        }