private static void AddCurNearIndexToList(int calIndex, MRBPixelModel model)
 {
     if (!model.IsDirty)
     {
         mNearIndexList.Add(calIndex);
     }
 }
    public static void RefreshTextures()
    {
        int width  = MeshRenderBrusher.T4MMaskBlendTex.width - 1;
        int height = MeshRenderBrusher.T4MMaskBlendTex.height - 1;

        mBounderCal.Refresh(1, 1, MeshRenderBrusher.T4MMaskBlendTex.width - 1,
                            MeshRenderBrusher.T4MMaskBlendTex.height - 1, MeshRenderBrusher.T4MMaskBlendTex.width - 1);

        //读取,是对的
        MRBPixelModel.TransferFromColor(
            MeshRenderBrusher.T4MMaskIndexTex.GetPixels(mBounderCal.CalStartX,
                                                        mBounderCal.CalStartY, mBounderCal.CalWidth, mBounderCal.CalHeight, 0),
            MeshRenderBrusher.T4MMaskBlendTex.GetPixels(mBounderCal.CalStartX,
                                                        mBounderCal.CalStartY, mBounderCal.CalWidth, mBounderCal.CalHeight, 0), mPixelList);
        int offStartX = mBounderCal.OffStartX;
        int offStartY = mBounderCal.OffStartY;
        int offEndX   = mBounderCal.OffEndX;
        int offEndY   = mBounderCal.OffEndY;

        //循环,好像也没啥问题
        for (int i = 0 - offStartY; i < height - offEndY; i++)
        {
            for (int j = 0 - offStartX; j < width - offEndX; j++)
            {
                int index = ((i + offStartY) * (width - offEndX + offStartX)) + (j + offStartX);
                mPixelList[index].RefreshCalculateData();
                mPixelList[index].SortIndexAndWeightModelList();
                mPixelList[index].RefreshSelfPixelIndex();
                if (i < 0 || j < 0 || i >= height || j >= width)
                {
                    continue;
                }
                //这个没弄成private set。。。没啥问题吧?
                mPixelList[index].IsDirty = true;
            }
        }
        //这个,有问题,这里是刷新,不需要Recommend
        //不用Recommend会变得更好嘛?因为数据会变得更简洁?但是可能出现更明显的锯齿??
        //试一下没有Recommend吧
        MRBPixelModel.ResortListAccordingToIndex(mPixelList, mBounderCal);


        //整理赋值,是对的
        mBounderCal.Refresh(0, 0, MeshRenderBrusher.T4MMaskBlendTex.width,
                            MeshRenderBrusher.T4MMaskBlendTex.height, MeshRenderBrusher.T4MMaskBlendTex.width - 1);

        MeshRenderBrusher.T4MMaskBlendTex.SetPixels(0, 0, MeshRenderBrusher.T4MMaskBlendTex.width,
                                                    MeshRenderBrusher.T4MMaskBlendTex.height, MRBPixelModel.TransferToColorArray(mPixelList, mBounderCal, true),
                                                    0);
        MeshRenderBrusher.T4MMaskBlendTex.Apply();

        MeshRenderBrusher.T4MMaskIndexTex.SetPixels(0, 0, MeshRenderBrusher.T4MMaskBlendTex.width,
                                                    MeshRenderBrusher.T4MMaskBlendTex.height,
                                                    MRBPixelModel.TransferToColorArray(mPixelList, mBounderCal, false), 0);
        MeshRenderBrusher.T4MMaskIndexTex.Apply();
    }
    void Painter()
    {
        if (State != 1)
        {
            State = 1;
        }

        Event e = Event.current;

        if (e.type == EventType.KeyDown && e.keyCode == KeyCode.T)
        {
            if (MeshRenderBrusher.T4MActived != "Activated")
            {
                MeshRenderBrusher.T4MActived = "Activated";
            }
            else
            {
                MeshRenderBrusher.T4MActived = "Deactivated";
            }
        }

        /*if (MeshRenderBrusher.T4MPreview && MeshRenderBrusher.T4MActived == "Activated" && MeshRenderBrusher.T4MPreview.enabled == false || MeshRenderBrusher.T4MPreview.enabled == false){
         *  if(
         *      MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Follow_Normal_Circle &&
         *      MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Follow_Normal_WireCircle &&
         *      MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Hide_preview
         *  ){
         *      MeshRenderBrusher.T4MPreview.enabled = true;
         *  }
         * }else if (MeshRenderBrusher.T4MPreview && MeshRenderBrusher.T4MActived == "Deactivated" && MeshRenderBrusher.T4MPreview.enabled == true || MeshRenderBrusher.T4MPreview.enabled == true){
         *  if (MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Classic){
         *      MeshRenderBrusher.T4MPreview.enabled = false;
         *  }
         * }*/
        //暂时这个大小有问题,先设定成false
        MeshRenderBrusher.T4MPreview.enabled = false;

        if (MeshRenderBrusher.T4MActived == "Activated")
        {
            HandleUtility.AddDefaultControl(0);
            RaycastHit raycastHit = new RaycastHit();
            Ray        terrain    = HandleUtility.GUIPointToWorldRay(e.mousePosition);

            if (e.type == EventType.KeyDown && e.keyCode == KeyCode.KeypadPlus)
            {
                MeshRenderBrusher.brushSize += 1;
            }
            else if (e.type == EventType.KeyDown && e.keyCode == KeyCode.KeypadMinus)
            {
                MeshRenderBrusher.brushSize -= 1;
            }

            if (Physics.Raycast(terrain, out raycastHit, Mathf.Infinity, layerMask))
            {
                if (null == MeshRenderBrusher.T4MPreview || null == MeshRenderBrusher.CurrentSelect)
                {
                    return;
                }


                if (false)//MeshRenderBrusher.CurrentSelect.gameObject.GetComponent<T4MObjSC>().ConvertType != "UT")
                {
                    MeshRenderBrusher.T4MPreview.transform.localEulerAngles =
                        new Vector3(90, 180 + MeshRenderBrusher.CurrentSelect.localEulerAngles.y, 0);
                }
                else
                {
                    MeshRenderBrusher.T4MPreview.transform.localEulerAngles =
                        new Vector3(90, -90 + MeshRenderBrusher.CurrentSelect.localEulerAngles.y, 0);
                }
                MeshRenderBrusher.T4MPreview.transform.position = raycastHit.point;

                if (MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Classic && MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Hide_preview &&
                    MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Follow_Normal_WireCircle)
                {
                    Handles.color = new Color(1f, 1f, 0f, 0.05f);
                    Handles.DrawSolidDisc(raycastHit.point, raycastHit.normal,
                                          MeshRenderBrusher.T4MPreview.orthographicSize * 0.9f);
                }
                else if (MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Classic &&
                         MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Hide_preview &&
                         MeshRenderBrusher.PaintPrev != MeshRenderBrusher.PaintHandle.Follow_Normal_Circle)
                {
                    Handles.color = new Color(1f, 1f, 0f, 1f);
                    Handles.DrawWireDisc(raycastHit.point, raycastHit.normal,
                                         MeshRenderBrusher.T4MPreview.orthographicSize * 0.9f);
                }
                //这里需要个预览圈圈,是不是mask处理的?
                //先用一个黄圈代替
                else if (MeshRenderBrusher.PaintPrev == MeshRenderBrusher.PaintHandle.Classic ||
                         MeshRenderBrusher.PaintPrev == MeshRenderBrusher.PaintHandle.Hide_preview)
                {
                    Handles.color = new Color(1f, 1f, 0f, 0.05f);
                    Handles.DrawSolidDisc(raycastHit.point, raycastHit.normal,
                                          MeshRenderBrusher.T4MPreview.orthographicSize * 0.9f);
                }

                if ((e.type == EventType.MouseDrag && e.alt == false && e.shift == false && e.button == 0) ||
                    (e.shift == false && e.alt == false && e.button == 0 && ToggleF == false))
                {
                    Vector2 pixelUV = new Vector2(raycastHit.point.x - raycastHit.transform.position.x,
                                                  raycastHit.point.z - raycastHit.transform.position.z)
                                      * MeshRenderBrusher.T4MMaskTexUVCoord   //; //0.14f;
                                      * (MeshRenderBrusher.T4MMaskBlendTex.width / raycastHit.transform.GetComponent <BoxCollider>().size.x);
                    int PuX    = Mathf.FloorToInt(pixelUV.x);                 // * MeshRenderBrusher.T4MMaskTex.width);
                    int PuY    = Mathf.FloorToInt(pixelUV.y);                 // * MeshRenderBrusher.T4MMaskTex.height);
                    int x      = Mathf.Clamp(PuX - MeshRenderBrusher.T4MBrushSizeInPourcent / 2, 0, MeshRenderBrusher.T4MMaskBlendTex.width - 1);
                    int y      = Mathf.Clamp(PuY - MeshRenderBrusher.T4MBrushSizeInPourcent / 2, 0, MeshRenderBrusher.T4MMaskBlendTex.height - 1);
                    int width  = Mathf.Clamp((PuX + MeshRenderBrusher.T4MBrushSizeInPourcent / 2), 0, MeshRenderBrusher.T4MMaskBlendTex.width - 1) - x + 1;
                    int height = Mathf.Clamp((PuY + MeshRenderBrusher.T4MBrushSizeInPourcent / 2), 0, MeshRenderBrusher.T4MMaskBlendTex.height - 1) - y + 1;

                    //Debug.LogError($"{x}, {y}, {width}, {height}");


                    //决定先尝试,处理完后整体刷新,看看效率
                    mBounderCal.Refresh(x, y, width, height, MeshRenderBrusher.T4MMaskBlendTex.width - 1);

                    //blend和index的rgb值。。。分别是前3强的SourceTex
                    MRBPixelModel.TransferFromColor(
                        MeshRenderBrusher.T4MMaskIndexTex.GetPixels(mBounderCal.CalStartX,
                                                                    mBounderCal.CalStartY, mBounderCal.CalWidth, mBounderCal.CalHeight, 0),
                        MeshRenderBrusher.T4MMaskBlendTex.GetPixels(mBounderCal.CalStartX,
                                                                    mBounderCal.CalStartY, mBounderCal.CalWidth, mBounderCal.CalHeight, 0), mPixelList);

                    if (MeshRenderBrusher.PaintPrev == MeshRenderBrusher.PaintHandle.Hide_preview)
                    {
                        Debug.LogError("---------------Before Cal------------------------");
                        for (int i = 0; i < mBounderCal.CalWidth * mBounderCal.CalHeight; i++)
                        {
                            Debug.LogError($"{i} : {mPixelList[i]}");
                        }
                    }


                    int offStartX = mBounderCal.OffStartX;
                    int offStartY = mBounderCal.OffStartY;
                    int offEndX   = mBounderCal.OffEndX;
                    int offEndY   = mBounderCal.OffEndY;

                    for (int i = 0 - offStartY; i < height - offEndY; i++)
                    {
                        for (int j = 0 - offStartX; j < width - offEndX; j++)
                        {
                            int index = ((i + offStartY) * (width - offEndX + offStartX)) + (j + offStartX);


                            mPixelList[index].RefreshCalculateData();

                            if (i < 0 || j < 0 || i >= height || j >= width)
                            {
                                continue;
                            }

                            float Stronger = MeshRenderBrusher.T4MBrushAlpha[
                                Mathf.Clamp(
                                    (y + i) - (PuY - MeshRenderBrusher.T4MBrushSizeInPourcent / 2),
                                    0, MeshRenderBrusher.T4MBrushSizeInPourcent - 1)
                                * MeshRenderBrusher.T4MBrushSizeInPourcent
                                +
                                Mathf.Clamp(
                                    (x + j) - (PuX - MeshRenderBrusher.T4MBrushSizeInPourcent / 2),
                                    0, MeshRenderBrusher.T4MBrushSizeInPourcent - 1)]
                                             * MeshRenderBrusher.T4MStronger;

                            //省点运算
                            if (Stronger == 0)
                            {
                                continue;
                            }

                            //todo:这里有问题
                            //index里面r:0.35,g:0.33,b:0.32,那新点的颜色强度只能超过0.32,才能染上颜色
                            //之后再考虑算法优化吧
                            //暂时用Stronger来处理了。感觉还能用
                            mPixelList[index].CalculateIndex(MeshRenderBrusher.T4MselTexture, Stronger);
                            mPixelList[index].RefreshSelfPixelIndex();
                        }
                    }

                    //优化核心算法,根据Index重新排序
                    MRBPixelModel.ResortListAccordingToIndex(mPixelList, mBounderCal);

                    if (MeshRenderBrusher.PaintPrev == MeshRenderBrusher.PaintHandle.Hide_preview)
                    {
                        Debug.LogError("------------------After Cal-----------------------");
                        for (int i = 0; i < mBounderCal.CalWidth * mBounderCal.CalHeight; i++)
                        {
                            Debug.LogError($"{i} : {mPixelList[i]}");
                        }
                        ToggleF = true;
                        return;
                    }

                    MeshRenderBrusher.T4MMaskBlendTex.SetPixels(x, y, width, height, MRBPixelModel.TransferToColorArray(mPixelList, mBounderCal, true), 0);


                    MeshRenderBrusher.T4MMaskBlendTex.Apply();
                    if (MeshRenderBrusher.T4MMaskIndexTex)
                    {
                        MeshRenderBrusher.T4MMaskIndexTex.SetPixels(x, y, width, height, MRBPixelModel.TransferToColorArray(mPixelList, mBounderCal, false), 0);

                        MeshRenderBrusher.T4MMaskIndexTex.Apply();
                        UndoObj    = new Texture2D[2];
                        UndoObj[0] = MeshRenderBrusher.T4MMaskBlendTex;
                        UndoObj[1] = MeshRenderBrusher.T4MMaskIndexTex;
                    }
                    else
                    {
                        UndoObj    = new Texture2D[1];
                        UndoObj[0] = MeshRenderBrusher.T4MMaskBlendTex;
                    }

                    Undo.RegisterUndo(UndoObj, "T4MMask");

                    ToggleF = true;
                }
                else if (e.type == EventType.MouseUp && e.alt == false && e.button == 0 && ToggleF == true)
                {
                    MeshRenderBrusher.SaveTexture();
                    ToggleF = false;
                }
            }
        }
    }
 public static void TransferFromColor(Color colorIndex, Color colorBlend, MRBPixelModel target)
 {
     target.RefreshSelfPixelModel(colorIndex, colorBlend);
     target.IsDirty = false;
 }