public ArrayMesh generate(ArrayMesh oldMesh, Skin skin, UMAReciepe reciepe, List <string> boneNames)
        {
            //reset changes value
            changes = 0;

            //clean up slots
            oldMesh = cleanOldSlots(oldMesh, reciepe);

            //clean up overlay
            oldMesh = cleanOldOverlays(oldMesh, reciepe);

            //create new slots
            oldMesh = createNewSlots(oldMesh, reciepe);

            //create new overlay
            oldMesh = createOverlays(oldMesh, reciepe);

            //assign binds
            if (changes > 0)
            {
                var binds = getBinds(reciepe);
                binds = binds.DistinctBy(dt => dt.getSelector()).ToList();
                skin.ClearBinds();

                int i = 0;
                foreach (var bind in binds)
                {
                    if (!boneNames.Contains(bind.boneName))
                    {
                        continue;
                    }

                    skin.AddBind(0, bind.transform);
                    skin.SetBindName(i, bind.boneName);
                    i++;
                }
            }

            //set main color
            return(oldMesh);
        }