public void ArrangeClones(bool checkForDirtiness)
        {
            if (checkForDirtiness && clones.Count != IdealCloneCount)
            {
                ComputeClones();
                return;
            }

            gameObject.hideFlags = hideClonerInHierarchy ? HideFlags.HideInHierarchy : HideFlags.None;

            int clonerIndex = transform.GetSiblingIndex();

            foreach (var clone in clones)
            {
                if (checkForDirtiness)
                {
                    if (clone == null || clone.source != GetSource(clone.index))
                    {
                        ComputeClones();
                        return;
                    }
                }

                var m = transform.localToWorldMatrix * matrices[clone.index];
                clone.gameObject.hideFlags = hideClonesInHierarchy ? HideFlags.HideInHierarchy : HideFlags.None;
                clone.transform.SetParent(transform.parent, false);
                clone.transform.SetSiblingIndex(clonerIndex + 1 + clone.index);
                clone.transform.position = GeomUtils.ExtractPosition(m);
                clone.transform.rotation = m.rotation;
            }
        }
        void OnDrawGizmos()
        {
            if (!enabled)
            {
                return;
            }

            PainfulCallOfOnDrawGizmosOnClonesComponents();

            bool showPoints = gizmoShowPoints || (clones.Count == 0 && matrices.Length > 0);

            if (!showPoints && !gizmoShowAxis && !gizmoShowIndexes)
            {
                return;
            }

            Gizmos.matrix  = transform.localToWorldMatrix;
            Handles.matrix = transform.localToWorldMatrix;

            var cameraPosition = SceneView.currentDrawingSceneView.camera.transform.position;
            var ms             = gizmoSortByDistance
                ? GetSortedByDistanceMatrices(cameraPosition).Select(b => (b.matrix, b.index))
                : matrices.Select((m, i) => (m, i));

            GUIStyle style = new GUIStyle();

            foreach (var(m, index) in ms)
            {
                var p = GeomUtils.ExtractPosition(m);

                if (showPoints || gizmoShowIndexes)
                {
                    float x = matrices.Length > 1 ? (float)index / (matrices.Length - 1) : 0f;
                    Gizmos.color = Color.Lerp(gizmoColorA, gizmoColorB, x);
                }

                if (showPoints)
                {
                    Gizmos.DrawSphere(p, 0.1f);
                }

                if (gizmoShowIndexes)
                {
                    style.normal.textColor = Gizmos.color;
                    Handles.Label(p, string.Format("{0}", index), style);
                }

                if (gizmoShowAxis)
                {
                    Gizmos.color = Color.red;
                    Gizmos.DrawLine(p, p + GeomUtils.ExtractRight(m) * 0.5f);
                    Gizmos.color = Color.green;
                    Gizmos.DrawLine(p, p + GeomUtils.ExtractUp(m) * 0.5f);
                    Gizmos.color = Color.blue;
                    Gizmos.DrawLine(p, p + GeomUtils.ExtractForward(m) * 0.5f);
                }
            }
        }