public ListMeshDraw ListSplit(float Priority)
        {
            if (null == MeshDataTop)
            {
                return(null);
            }

            InformationMeshData DataNext     = MeshDataTop;
            InformationMeshData DataPrevious = null;
            int CountNow = 0;

            while (null != DataNext)
            {
                if (DataNext.Priority > Priority)
                {
                    ListMeshDraw ListNew = new ListMeshDraw();
                    ListNew.MaterialNo      = MaterialNo;
                    ListNew.Count           = Count - CountNow;
                    ListNew.MeshDataTop     = DataNext;
                    ListNew.PriorityMinimum = DataNext.Priority;

                    Count -= ListNew.Count;
                    if (null == DataPrevious)
                    {
                        PriorityMinimum = -10000.0f;
                        PriorityMaximum = -10000.0f;
                        MeshDataTop     = null;
                    }
                    else
                    {
                        DataPrevious.ChainNext  = null;
                        ListNew.PriorityMaximum = PriorityMaximum;
                        PriorityMaximum         = DataPrevious.Priority;
                    }
                    return(ListNew);
                }
                CountNow++;
                DataPrevious = DataNext;
                DataNext     = DataNext.ChainNext;
            }
            return(null);
        }
        public void ListMerge(ListMeshDraw ListNext)
        {
            if (0 == ListNext.Count)
            {
                return;
            }
            if (0 == Count)
            {
                MeshDataTop     = ListNext.MeshDataTop;
                PriorityMinimum = ListNext.PriorityMinimum;
                PriorityMaximum = ListNext.PriorityMaximum;
                Count           = ListNext.Count;
                return;
            }
            InformationMeshData DataLast = MeshDataTop;

            while (null != DataLast.ChainNext)
            {
                DataLast = DataLast.ChainNext;
            }
            DataLast.ChainNext = ListNext.MeshDataTop;
            PriorityMaximum    = ListNext.PriorityMaximum;
            Count += ListNext.Count;
        }
 public void ListMerge(ListMeshDraw ListNext)
 {
     if(0 == ListNext.Count)
     {
         return;
     }
     if(0 == Count)
     {
         MeshDataTop = ListNext.MeshDataTop;
         PriorityMinimum = ListNext.PriorityMinimum;
         PriorityMaximum = ListNext.PriorityMaximum;
         Count = ListNext.Count;
         return;
     }
     InformationMeshData DataLast = MeshDataTop;
     while(null != DataLast.ChainNext)
     {
         DataLast = DataLast.ChainNext;
     }
     DataLast.ChainNext = ListNext.MeshDataTop;
     PriorityMaximum = ListNext.PriorityMaximum;
     Count += ListNext.Count;
 }
    /* ******************************************************** */
    //! Add Mesh to Draw-Manager
    /*!
    @param	TextureNo
        Serial-number of using texture
    @param	Operation
        Color-Blend Operation for the target
    @param	DataMeshInformation
        Mesh Information
    @retval	Return-Value
        (None)

    Don't use this function. <br>
    (This function is for the animation-parts' scripts.)
    */
    public void MeshAdd(int TextureNo, Library_SpriteStudio.KindColorOperation Operation, InformationMeshData DataMeshInformation)
    {
        if(0 > TextureNo)
        {
            return;
        }

        if(null == TableListMesh)
        {
            TableListMesh = new ArrayList();
            TableListMesh.Clear();
        }

        int MaterialNo = TextureNo * ((int)Library_SpriteStudio.KindColorOperation.TERMINATOR - 1) + ((int)Operation - 1);
        int CountList = TableListMesh.Count;
        int ListNo = -1;
        ListMeshDraw ListMesh = null;
        if(0 == TableListMesh.Count)
        {
            goto MeshAdd_NewListAdd;
        }
        else
        {
            ListNo = 0;
            ListMesh = TableListMesh[0] as ListMeshDraw;
            for(int i=1; i<CountList; i++)
            {
                ListMesh = TableListMesh[i] as ListMeshDraw;
                if(DataMeshInformation.Priority < ListMesh.PriorityMinimum)
                {
                    ListNo = i - 1;
                    break;
                }
                ListMesh = null;
            }
            if(null == ListMesh)
            {	/* Highest-Priority */
                ListNo = CountList - 1;
                ListMesh = TableListMesh[ListNo] as ListMeshDraw;
                if(ListMesh.MaterialNo != MaterialNo)
                {
                    if(DataMeshInformation.Priority < ListMesh.PriorityMaximum)
                    {
                        goto MeshAdd_NewListInsertSplit;
                    }
                    else
                    {
                        goto MeshAdd_NewListAdd;
                    }
                }
            }
            else
            {
                ListMesh = TableListMesh[ListNo] as ListMeshDraw;
                if(ListMesh.MaterialNo != MaterialNo)
                {
                    if(DataMeshInformation.Priority < ListMesh.PriorityMaximum)
                    {
                        goto MeshAdd_NewListInsertSplit;
                    }
                    else
                    {
                        ListNo++;
                        if(CountList <= ListNo)
                        {
                            goto MeshAdd_NewListAdd;
                        }
                        else
                        {
                            ListMeshDraw ListMeshNext = TableListMesh[ListNo] as ListMeshDraw;
                            if(ListMeshNext.MaterialNo != MaterialNo)
                            {
                                ListNo--;
                                goto MeshAdd_NewListInsert;
                            }
                            else
                            {
                                ListMesh = ListMeshNext;
                            }
                        }
                    }
                }
            }
            ListMesh.MeshAdd(ref DataMeshInformation);
        }
        return;

        MeshAdd_NewListAdd:
        ListMesh = new ListMeshDraw();
        ListMesh.MaterialNo = MaterialNo;
        TableListMesh.Add(ListMesh);

        ListMesh.MeshAdd(ref DataMeshInformation);
        return;

        MeshAdd_NewListInsert:
        ListMesh = new ListMeshDraw();
        ListMesh.MaterialNo = MaterialNo;
        TableListMesh.Insert(ListNo + 1, ListMesh);

        ListMesh.MeshAdd(ref DataMeshInformation);
        return;

        MeshAdd_NewListInsertSplit:
        {
            ListMeshDraw ListMeshSplit = ListMesh.ListSplit(DataMeshInformation.Priority);
            int ListNoNext = ListNo + 1;
            if(CountList <= ListNoNext)
            {
                TableListMesh.Add(ListMeshSplit);
            }
            else
            {
                TableListMesh.Insert(ListNoNext, ListMeshSplit);
            }
            int CountOld = ListMesh.Count;

            ListMesh = new ListMeshDraw();
            ListMesh.MaterialNo = MaterialNo;
            TableListMesh.Insert(ListNoNext, ListMesh);

            if(0 >= CountOld)
            {
                TableListMesh.RemoveAt(ListNo);
            }
        }

        ListMesh.MeshAdd(ref DataMeshInformation);
        return;
    }
        public ListMeshDraw ListSplit(float Priority)
        {
            if(null == MeshDataTop)
            {
                return(null);
            }

            InformationMeshData DataNext = MeshDataTop;
            InformationMeshData DataPrevious = null;
            int CountNow = 0;
            while(null != DataNext)
            {
                if(DataNext.Priority > Priority)
                {
                    ListMeshDraw ListNew = new ListMeshDraw();
                    ListNew.MaterialNo = MaterialNo;
                    ListNew.Count = Count - CountNow;
                    ListNew.MeshDataTop = DataNext;
                    ListNew.PriorityMinimum = DataNext.Priority;

                    Count -= ListNew.Count;
                    if(null == DataPrevious)
                    {
                        PriorityMinimum = -10000.0f;
                        PriorityMaximum = -10000.0f;
                        MeshDataTop = null;
                    }
                    else
                    {
                        DataPrevious.ChainNext = null;
                        ListNew.PriorityMaximum = PriorityMaximum;
                        PriorityMaximum = DataPrevious.Priority;
                    }
                    return(ListNew);
                }
                CountNow++;
                DataPrevious = DataNext;
                DataNext = DataNext.ChainNext;
            }
            return(null);
        }
    protected void AppendExecLateUpdate()
    {
        /* Execute Simplified-SpriteDrawManager */
        int          Count = 0;
        MeshFilter   InstanceMeshFilter   = GetComponent <MeshFilter>();
        MeshRenderer InstanceMeshRenderer = GetComponent <MeshRenderer>();

        if (null != TableListMesh)
        {
            ListMeshDraw ListMesh = null;
            Count = TableListMesh.Count;

            int        CountMesh           = 0;
            Material[] MaterialTable       = new Material[Count];
            int        ValueRenderQueue    = ValueKindDrawQueue[(int)KindRenderQueueBase];
            int        MaterialRenderQueue = 0;

            if (null == InstanceCameraDraw)
            {                   /* Camera is lost ? */
                CameraGetRendering();
            }
            int ZOffset = 0;
            if (null != InstanceCameraDraw)
            {
                Vector3 PositionViewPort = (null != InstanceCameraDraw) ? InstanceCameraDraw.WorldToViewportPoint(transform.position) : Vector3.zero;
                float   RateLinerZ       = 1.0f - ((PositionViewPort.z - InstanceCameraDraw.nearClipPlane) / (InstanceCameraDraw.farClipPlane - InstanceCameraDraw.nearClipPlane));
                ZOffset = ((0.0f > RateLinerZ) || (1.0f < RateLinerZ)) ? -1 : (int)(RateLinerZ * RateDrawQueueEffectZ);
            }
            if (-1 == ZOffset)
            {                   /* out of sight (Clipping) */
                InstanceMeshRenderer.enabled = false;
            }
            else
            {                   /* in sight */
                InstanceMeshRenderer.enabled = true;
                for (int i = 0; i < Count; i++)
                {
                    ListMesh   = TableListMesh[i] as ListMeshDraw;
                    CountMesh += ListMesh.Count;

                    MaterialTable[i]             = new Material(TableMaterial[ListMesh.MaterialNo]);
                    MaterialRenderQueue          = (-1 == ValueRenderQueue) ? MaterialTable[i].shader.renderQueue : ValueRenderQueue;
                    MaterialRenderQueue         += (OffsetDrawQueue + ZOffset + i);
                    MaterialTable[i].renderQueue = MaterialRenderQueue;
                }

                Material[] TableMaterialOld = InstanceMeshRenderer.sharedMaterials;
                InstanceMeshRenderer.sharedMaterials = MaterialTable;
                for (int i = 0; i < TableMaterialOld.Length; i++)
                {
                    Object.DestroyImmediate(TableMaterialOld[i]);
                }

                int                 IndexVertexNow      = 0;
                int                 IndexTriangleNow    = 0;
                int[]               IndexVertex         = new int[Count];
                int[]               IndexTriangle       = new int[Count + 1];
                CombineInstance[]   CombineMesh         = new CombineInstance[CountMesh];
                InformationMeshData DataMeshInformation = null;
                CountMesh = 0;
                for (int i = 0; i < Count; i++)
                {
                    ListMesh            = TableListMesh[i] as ListMeshDraw;
                    IndexVertex[i]      = IndexVertexNow;
                    IndexTriangle[i]    = IndexTriangleNow;
                    DataMeshInformation = ListMesh.MeshDataTop;
                    Matrix4x4 MatrixCorrect = transform.localToWorldMatrix.inverse;
                    while (null != DataMeshInformation)
                    {
                        CombineMesh[CountMesh].mesh      = DataMeshInformation.DataMesh;
                        CombineMesh[CountMesh].transform = MatrixCorrect * DataMeshInformation.DataTransform.localToWorldMatrix;
                        CountMesh++;
                        IndexVertexNow     += DataMeshInformation.DataMesh.vertexCount;
                        IndexTriangleNow   += DataMeshInformation.DataMesh.triangles.Length / 3;
                        DataMeshInformation = DataMeshInformation.ChainNext;
                    }
                }
                IndexTriangle[Count] = IndexTriangleNow;
                Mesh MeshNew = new Mesh();
                MeshNew.CombineMeshes(CombineMesh);

                int[] TriangleBuffer   = MeshNew.triangles;
                int[] VertexNoTriangle = null;
                MeshNew.triangles    = null;
                MeshNew.subMeshCount = Count;
                for (int i = 0; i < Count; i++)
                {
                    CountMesh        = IndexTriangle[i + 1] - IndexTriangle[i];
                    VertexNoTriangle = new int[CountMesh * 3];
                    for (int j = 0; j < CountMesh; j++)
                    {
                        IndexTriangleNow = (j + IndexTriangle[i]) * 3;
                        IndexVertexNow   = j * 3;

                        VertexNoTriangle[IndexVertexNow]     = TriangleBuffer[IndexTriangleNow];
                        VertexNoTriangle[IndexVertexNow + 1] = TriangleBuffer[IndexTriangleNow + 1];
                        VertexNoTriangle[IndexVertexNow + 2] = TriangleBuffer[IndexTriangleNow + 2];
                    }
                    MeshNew.SetTriangles(VertexNoTriangle, i);
                }

                if (null != InstanceMeshFilter.sharedMesh)
                {
                    InstanceMeshFilter.sharedMesh.Clear();
                    Object.DestroyImmediate(InstanceMeshFilter.sharedMesh);
                }
                InstanceMeshFilter.sharedMesh = MeshNew;
            }
            TableListMesh.Clear();
        }

        /* Excute "UserData CallBack" */
        if ((null != ListCallBackUserData) && (null != functionUserData))
        {
            Count = ListCallBackUserData.Count;
            ParameterCallBackUserData Parameter = null;
            for (int i = 0; i < Count; i++)
            {
                Parameter = ListCallBackUserData[i] as ParameterCallBackUserData;
                functionUserData(transform.parent.gameObject,
                                 Parameter.PartsName,
                                 Parameter.AnimationDataParts,
                                 AnimationNo,
                                 frameNoNow,
                                 Parameter.FrameNo,
                                 Parameter.Data
                                 );
            }

            ListCallBackUserData.Clear();
        }

        /* Excute "Play-End CallBack" */
        if (0 != (Status & BitStatus.REQUEST_PLAYEND))
        {
            Status = BitStatus.CLEAR;
            if (null != functionPlayEnd)
            {
                if (false == (functionPlayEnd(transform.parent.gameObject)))
                {
                    InstanceMeshFilter.sharedMesh.Clear();
                    Object.DestroyImmediate(InstanceMeshFilter.sharedMesh);
                    InstanceMeshFilter.sharedMesh = null;

                    Destroy(transform.parent.gameObject);
                }
            }
        }
    }
    /* ******************************************************** */
    //! Add Mesh to Draw-Manager

    /*!
     * @param	TextureNo
     *      Serial-number of using texture
     * @param	Operation
     *      Color-Blend Operation for the target
     * @param	DataMeshInformation
     *      Mesh Information
     * @retval	Return-Value
     *      (None)
     *
     * Don't use this function. <br>
     * (This function is for the animation-parts' scripts.)
     */
    public void MeshAdd(int TextureNo, Library_SpriteStudio.KindColorOperation Operation, InformationMeshData DataMeshInformation)
    {
        if (0 > TextureNo)
        {
            return;
        }

        if (null == TableListMesh)
        {
            TableListMesh = new ArrayList();
            TableListMesh.Clear();
        }

        int          MaterialNo = TextureNo * ((int)Library_SpriteStudio.KindColorOperation.TERMINATOR - 1) + ((int)Operation - 1);
        int          CountList  = TableListMesh.Count;
        int          ListNo     = -1;
        ListMeshDraw ListMesh   = null;

        if (0 == TableListMesh.Count)
        {
            goto MeshAdd_NewListAdd;
        }
        else
        {
            ListNo   = 0;
            ListMesh = TableListMesh[0] as ListMeshDraw;
            for (int i = 1; i < CountList; i++)
            {
                ListMesh = TableListMesh[i] as ListMeshDraw;
                if (DataMeshInformation.Priority < ListMesh.PriorityMinimum)
                {
                    ListNo = i - 1;
                    break;
                }
                ListMesh = null;
            }
            if (null == ListMesh)
            {                   /* Highest-Priority */
                ListNo   = CountList - 1;
                ListMesh = TableListMesh[ListNo] as ListMeshDraw;
                if (ListMesh.MaterialNo != MaterialNo)
                {
                    if (DataMeshInformation.Priority < ListMesh.PriorityMaximum)
                    {
                        goto MeshAdd_NewListInsertSplit;
                    }
                    else
                    {
                        goto MeshAdd_NewListAdd;
                    }
                }
            }
            else
            {
                ListMesh = TableListMesh[ListNo] as ListMeshDraw;
                if (ListMesh.MaterialNo != MaterialNo)
                {
                    if (DataMeshInformation.Priority < ListMesh.PriorityMaximum)
                    {
                        goto MeshAdd_NewListInsertSplit;
                    }
                    else
                    {
                        ListNo++;
                        if (CountList <= ListNo)
                        {
                            goto MeshAdd_NewListAdd;
                        }
                        else
                        {
                            ListMeshDraw ListMeshNext = TableListMesh[ListNo] as ListMeshDraw;
                            if (ListMeshNext.MaterialNo != MaterialNo)
                            {
                                ListNo--;
                                goto MeshAdd_NewListInsert;
                            }
                            else
                            {
                                ListMesh = ListMeshNext;
                            }
                        }
                    }
                }
            }
            ListMesh.MeshAdd(ref DataMeshInformation);
        }
        return;

MeshAdd_NewListAdd:
        ListMesh            = new ListMeshDraw();
        ListMesh.MaterialNo = MaterialNo;
        TableListMesh.Add(ListMesh);

        ListMesh.MeshAdd(ref DataMeshInformation);
        return;

MeshAdd_NewListInsert:
        ListMesh            = new ListMeshDraw();
        ListMesh.MaterialNo = MaterialNo;
        TableListMesh.Insert(ListNo + 1, ListMesh);

        ListMesh.MeshAdd(ref DataMeshInformation);
        return;

MeshAdd_NewListInsertSplit:
        {
            ListMeshDraw ListMeshSplit = ListMesh.ListSplit(DataMeshInformation.Priority);
            int          ListNoNext    = ListNo + 1;
            if (CountList <= ListNoNext)
            {
                TableListMesh.Add(ListMeshSplit);
            }
            else
            {
                TableListMesh.Insert(ListNoNext, ListMeshSplit);
            }
            int CountOld = ListMesh.Count;

            ListMesh            = new ListMeshDraw();
            ListMesh.MaterialNo = MaterialNo;
            TableListMesh.Insert(ListNoNext, ListMesh);

            if (0 >= CountOld)
            {
                TableListMesh.RemoveAt(ListNo);
            }
        }

        ListMesh.MeshAdd(ref DataMeshInformation);
        return;
    }