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; } }
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); }