public List <GroupInfo>[] GetGroups()
 {
     if (nochange)
     {
         return(prev.GetGroups());
     }
     if (univgroups == null)
     {
         return(groups);
     }
     return(history.GetGroups(univgroups).Select((GroupInfo[] grps) => grps.ToList()).ToArray());
 }
        public static IndexedViewableAlpha MeshIntersect(SnapshotModel model0, SnapshotModel model1, Vec3f[] match, bool applymods)
        {
            int nverts = model0.nverts;

            Vec3f[]              verts         = null;
            int[]                vertuids      = null;
            bool[]               vsel          = null;
            int[][]              visiblegroups = null;
            Vec4f[][]            colors        = { new Vec4f[nverts], new Vec4f[nverts], new Vec4f[nverts], new Vec4f[nverts] };
            float[]              pointsizes    = (model0.objedit ? pointsizes_edit : pointsizes_view).DeepCopy();
            float[]              linewidths    = (model0.objedit ? linewidths_edit : (model0.objselected ? linewidths_selected : linewidths_unselected)).DeepCopy();
            IndexedViewableAlpha viewable      = null;


            for (int i = 0; i < nverts; i++)
            {
                if (!model0.objvisible)
                {
                    colors[0][i] = colorobjhidden;
                    colors[1][i] = colorobjhidden;
                    colors[2][i] = colorobjhidden;
                    colors[3][i] = colorobjhidden;
                }
                else if (model0.objedit)
                {
                    colors[0][i] = colorvertunselected; //( isvertselected[i] ? colorvertselected : colorvertunselected );
                    colors[1][i] = colorvertunselected; //( isvertselected[i] ? colorvertselected : colorvertunselected );
                    colors[2][i] = colorface;
                    colors[3][i] = colorface;
                }
                else if (model0.objselected)
                {
                    if (model0.objactive)
                    {
                        colors[0][i] = colorobjactive;
                        colors[1][i] = colorobjactive;
                        colors[2][i] = colorface;
                        colors[3][i] = colorface;
                    }
                    else
                    {
                        colors[0][i] = colorobjselected;
                        colors[1][i] = colorobjselected;
                        colors[2][i] = colorface;
                        colors[3][i] = colorface;
                    }
                }
                else
                {
                    colors[0][i] = colorobjunselected;
                    colors[1][i] = colorobjunselected;
                    colors[2][i] = colorface;
                    colors[3][i] = colorface;
                }
            }

            List <GroupInfo>[] groups0          = model0.GetGroups();
            List <GroupInfo>[] groups1          = model1.GetGroups();
            List <int>[]       lstvisiblegroups = new List <int>[] {
                new List <int>(groups0[0].Count),
                new List <int>(groups0[1].Count * 2),
                new List <int>(groups0[2].Count * 3),
                new List <int>(groups0[3].Count * 4)
            };
            int[] uids0 = model0.GetVertUIDs();
            int[] uids1 = model1.GetVertUIDs();

            for (int igroups = 0; igroups < 4; igroups++)
            {
                List <int> lstcurrent = lstvisiblegroups[igroups];

                int i0 = 0;
                int i1 = 0;
                List <GroupInfo> grps0 = groups0[igroups];
                List <GroupInfo> grps1 = groups1[igroups];
                int c0 = grps0.Count;
                int c1 = grps1.Count;

                while (i0 < c0 && i1 < c1)
                {
                    GroupInfo g0 = grps0[i0];
                    GroupInfo g1 = grps1[i1];
                    string    k0 = g0.GetKeyNoVis(uids0);
                    string    k1 = g1.GetKeyNoVis(uids1);

                    int comp = k0.CompareTo(k1);
                    if (comp == 1)
                    {
                        i1++; continue;
                    }
                    if (comp == -1)
                    {
                        i0++; continue;
                    }
                    lstcurrent.AddRange(g0.inds);
                    i0++;
                    i1++;
                }
            }
            visiblegroups = new int[][] { lstvisiblegroups[0].ToArray(), lstvisiblegroups[1].ToArray(), lstvisiblegroups[2].ToArray(), lstvisiblegroups[3].ToArray() };

            verts    = model0.GetVerts().CloneArray();
            vertuids = model0.GetVertUIDs().CloneArray();
            if (model0.objedit)
            {
                vsel = model0.isvertselected.CloneArray();
            }
            else
            {
                vsel = new bool[nverts];
            }



            viewable = new IndexedViewableAlpha(verts, colors, visiblegroups, pointsizes, linewidths, groupsizes.CloneArray(), vertuids, vsel);

            if (match != null)
            {
                viewable = history.MakeVertsConsistent(viewable, match);
            }

            if (applymods)
            {
                foreach (Modifier m in model0.modifiers)
                {
                    if (m is ModifierMirror)
                    {
                        ModifierMirror mirror = (ModifierMirror)m;
                        viewable += viewable.CreateMirrorData_Each(mirror.usex, mirror.usey, mirror.usez, mirror.mergethreshold);
                    }
                }
            }

            return(viewable);
        }