/// <summary>
        /// スプライトの登録(さらに指定スプライトを切り取り&4頂点の色設定ができる)
        /// </summary>
        /// <param name="draw"></param>
        /// <returns></returns>
        internal int RegistrationDrawingCommand(MCDrawSquareAmountSprite draw)
        {
            //-----------------------------------------------------
            // プライオリティー
            //-----------------------------------------------------
            //
            if (draw.DrawCommandPriority.D2No == MCDrawCommandPriority.D2NO_MAX)
            {
                draw.D2No = m_autoPpriorityNo++;
            }

            draw.D2RenderType = GetSpriteRenderIdx();

            draw.Build();

            m_drawSprites.Add(draw);

            return(App.BatchDrawingMgr.RegisterDrawingCommand(draw));
        }
        /// <summary>
        /// スプライト頂点データを更新する
        /// </summary>
        /// <param name="drawSprite"></param>
        /// <returns></returns>
        public int VertexUpdate(
            MCDrawSquareAmountSprite drawSprite
            )
        {
            int dwTmp;
            var pSprite = drawSprite.Sprite;
            int divNo   = drawSprite.DivNo;

            float startX, startY, midX, midY, endX, endY;
            float startU, startV, midU, midV, endU, endV;
            float factorU, factorV;


            startX = pSprite.Anchor.X; // -0.5f;
            startY = pSprite.Anchor.Y; // +0.5f;

            if (pSprite.flags.SpriteType == (uint)MC_SPRITE_DATA.SIMPLE)
            {
                endX = pSprite.Width + startX;
                endY = -(pSprite.Height - startY);

                startU = pSprite.spl.StartU;
                startV = pSprite.spl.StartV;
                endU   = pSprite.spl.EndU;
                endV   = pSprite.spl.EndV;
            }
            else
            {
                endX = (pSprite.div.DivW_U * pSprite.Width) + startX;
                endY = -((pSprite.div.DivH_V * pSprite.Height) - startY);

                if (pSprite.div.Col == 0)
                {
                    factorV = (1.0f / pSprite.div.Row);

                    startU = 0.0f;
                    startV = factorV * divNo;
                    endU   = 1.0f;
                    endV   = startV + factorV;
                }
                else if (pSprite.div.Row == 0)
                {
                    factorU = (1.0f / pSprite.div.Col);

                    startU = factorU * divNo;
                    startV = 0.0f;
                    endU   = startU + factorU;
                    endV   = 1.0f;
                }
                else
                {
                    dwTmp  = divNo % pSprite.div.Col;
                    startU = pSprite.div.DivW_U * dwTmp;
                    dwTmp  = divNo / pSprite.div.Col;
                    startV = pSprite.div.DivH_V * dwTmp;
                    endU   = startU + pSprite.div.DivW_U;
                    endV   = startV + pSprite.div.DivH_V;
                }
            }
            midX = (startX + endX) * 0.5f;
            midY = (startY + endY) * 0.5f;
            midU = (startU + endU) * 0.5f;
            midV = (startV + endV) * 0.5f;

            //-------------------------
            // 中間色の作成
            //-------------------------
            var aColor = drawSprite.Colors;

            Color4[] aMidColor = new Color4[5];

            aMidColor[0] = Color4.Lerp(aColor[0], aColor[1], 0.5f);
            aMidColor[1] = Color4.Lerp(aColor[1], aColor[2], 0.5f);
            aMidColor[2] = Color4.Lerp(aColor[2], aColor[3], 0.5f);
            aMidColor[3] = Color4.Lerp(aColor[3], aColor[4], 0.5f);
            aMidColor[4] = Color4.Lerp(aMidColor[0], aMidColor[2], 0.5f);


            //------------------------------
            //   頂点情報
            //
            //    7--0--1
            //    |  |  |
            //    6--8--2
            //    |  |  |
            //    5--4--3
            //------------------------------

            MC_VERTEX_PCTx[] aV = new MC_VERTEX_PCTx[]
            {
                new MC_VERTEX_PCTx(new MCVector3(midX, startY, 0), aMidColor[0], midU, startV),     // 0
                new MC_VERTEX_PCTx(new MCVector3(endX, startY, 0), aColor[1], endU, startV),        // 1
                new MC_VERTEX_PCTx(new MCVector3(endX, midY, 0), aMidColor[1], endU, midV),         // 2
                new MC_VERTEX_PCTx(new MCVector3(endX, endY, 0), aColor[2], endU, endV),            // 3
                new MC_VERTEX_PCTx(new MCVector3(midX, endY, 0), aMidColor[2], midU, endV),         // 4
                new MC_VERTEX_PCTx(new MCVector3(startX, endY, 0), aColor[3], startU, endV),        // 5
                new MC_VERTEX_PCTx(new MCVector3(startX, midY, 0), aMidColor[3], startU, midV),     // 6
                new MC_VERTEX_PCTx(new MCVector3(startX, startY, 0), aColor[0], startU, startV),    // 7
                new MC_VERTEX_PCTx(new MCVector3(midX, midY, 0), aMidColor[4], midU, midV),         // 8
                new MC_VERTEX_PCTx(new MCVector3(midX, startY, 0), aMidColor[0], midU, startV),     // 9(0),
            };



            Action <int> SG_UV_C_9_SET = (_idx) => { aV[_idx].u = midU;   aV[_idx].v = startV; aV[_idx].c = aMidColor[0]; };
            Action <int> SG_UV_C_0_SET = (_idx) => { aV[_idx].u = midU;   aV[_idx].v = startV; aV[_idx].c = aMidColor[0]; };
            Action <int> SG_UV_C_1_SET = (_idx) => { aV[_idx].u = endU;   aV[_idx].v = startV; aV[_idx].c = aColor[1]; };
            Action <int> SG_UV_C_2_SET = (_idx) => { aV[_idx].u = endU;   aV[_idx].v = midV;   aV[_idx].c = aMidColor[1]; };
            Action <int> SG_UV_C_3_SET = (_idx) => { aV[_idx].u = endU;   aV[_idx].v = endV;   aV[_idx].c = aColor[2]; };
            Action <int> SG_UV_C_4_SET = (_idx) => { aV[_idx].u = midU;   aV[_idx].v = endV;   aV[_idx].c = aMidColor[2]; };
            Action <int> SG_UV_C_5_SET = (_idx) => { aV[_idx].u = startU; aV[_idx].v = endV;   aV[_idx].c = aColor[3]; };
            Action <int> SG_UV_C_6_SET = (_idx) => { aV[_idx].u = startU; aV[_idx].v = midV;   aV[_idx].c = aMidColor[3]; };
            Action <int> SG_UV_C_7_SET = (_idx) => { aV[_idx].u = startU; aV[_idx].v = midV;   aV[_idx].c = aColor[0]; };
            Action <int> SG_UV_C_8_SET = (_idx) => { aV[_idx].u = midU;   aV[_idx].v = midV;   aV[_idx].c = aMidColor[4]; };



            // 回転
            if ((drawSprite.Flip & SPRITE_FLIP.R90) != 0)
            {
                SG_UV_C_2_SET(9);
                SG_UV_C_2_SET(0);
                SG_UV_C_3_SET(1);
                SG_UV_C_4_SET(2);
                SG_UV_C_5_SET(3);
                SG_UV_C_6_SET(4);
                SG_UV_C_7_SET(5);
                SG_UV_C_0_SET(6);
                SG_UV_C_1_SET(7);
            }
            else if ((drawSprite.Flip & SPRITE_FLIP.R180) != 0)
            {
                SG_UV_C_4_SET(9);
                SG_UV_C_4_SET(0);
                SG_UV_C_5_SET(1);
                SG_UV_C_6_SET(2);
                SG_UV_C_7_SET(3);
                SG_UV_C_0_SET(4);
                SG_UV_C_1_SET(5);
                SG_UV_C_2_SET(6);
                SG_UV_C_3_SET(7);
            }
            else if ((drawSprite.Flip & SPRITE_FLIP.R270) != 0)
            {
                SG_UV_C_6_SET(9);
                SG_UV_C_6_SET(0);
                SG_UV_C_7_SET(1);
                SG_UV_C_0_SET(2);
                SG_UV_C_1_SET(3);
                SG_UV_C_2_SET(4);
                SG_UV_C_3_SET(5);
                SG_UV_C_4_SET(6);
                SG_UV_C_5_SET(7);
            }


            SPRITE_FLIP tempFlip = (SPRITE_FLIP)(drawSprite.Flip & SPRITE_FLIP.V_H);
            Color4      tmpColor;
            float       tmpUV;

            Action <int, int> SG_UV_C_SWAP = (_idx1, _idx2) =>
            {
                tmpUV       = aV[_idx2].u;
                aV[_idx2].u = aV[_idx1].u;
                aV[_idx1].u = tmpUV;

                tmpUV       = aV[_idx2].v;
                aV[_idx2].v = aV[_idx1].v;
                aV[_idx1].v = tmpUV;

                tmpColor    = aV[_idx2].c;
                aV[_idx2].c = aV[_idx1].c;
                aV[_idx1].c = tmpColor;
            };

            if (tempFlip == SPRITE_FLIP.HORIZONTAL)
            {
                //--------------
                // 左右反転
                //--------------
                SG_UV_C_SWAP(7, 1);
                SG_UV_C_SWAP(6, 2);
                SG_UV_C_SWAP(5, 3);
            }
            else if (tempFlip == SPRITE_FLIP.VERTICAL)
            {
                //--------------
                // 上下反転
                //--------------
                SG_UV_C_SWAP(7, 5);
                SG_UV_C_SWAP(0, 4);
                SG_UV_C_4_SET(9);
                SG_UV_C_SWAP(1, 3);
            }
            else if (tempFlip == SPRITE_FLIP.V_H)
            {
                //--------------
                // 上下左右反転
                //--------------
                SG_UV_C_SWAP(7, 3);
                SG_UV_C_SWAP(0, 4);
                SG_UV_C_4_SET(9);
                SG_UV_C_SWAP(1, 5);
                SG_UV_C_SWAP(6, 2);
            }

            // 頂点の変形
            VertexTransformation(drawSprite, aV);

            DataStream MappedResource;
            var        box = App.ImmediateContext.MapSubresource(
                m_vertexBuffer,
                MapMode.WriteDiscard,
                SharpDX.Direct3D11.MapFlags.None,
                out MappedResource);

            unsafe
            {
                var pV = (MC_VERTEX_PCTx *)MappedResource.DataPointer;
                for (int i = 0; i < VERTEX_NUM; ++i)
                {
                    pV[i].Set(aV[i].p, aV[i].c, aV[i].u, aV[i].v);
                }
            }
            App.ImmediateContext.UnmapSubresource(m_vertexBuffer, 0);


            return(0);
        }
        /// <summary>
        /// スプライト頂点データを更新する
        /// </summary>
        /// <param name="draw"></param>
        /// <param name="aV"></param>
        private void VertexTransformation(MCDrawSquareAmountSprite draw, MC_VERTEX_PCTx[] aV)
        {
            // 0=x, 1=y
            byte[] asXorY = new byte[] {
                0, 1, 1, 0, 0, 1, 1, 0
            };
            int   n, i, idx1, idx2;
            float inv, rate = draw.Rate;

            if (rate > 1.0f)
            {
                rate = 1.0f;
                n    = 7;
            }
            else if (rate == 0.0f)
            {
                rate = 0.0f;
                n    = 0;
            }
            else
            {
                n = (int)System.Math.Ceiling(draw.Rate / 0.125f) - 1;
            }


            // インデックスバッファの位置
            i    = n * 3;
            idx1 = ms_aIndex[i + 1];
            idx2 = ms_aIndex[i + 2];

            // 一辺の長さの逆数
            inv = (rate - n * 0.125f) * 8.0f;

            if (draw.StartType == SQUARE_AMOUNT_SPRITE_TYPE.ADD)
            {
                //--------------------------
                // 四角ができていく
                //--------------------------
                if (rate <= 0.0f)
                {
                    // 描画させない
                    m_primitiveData.startIndex      = 0;
                    m_primitiveData.drawTriangleNum = 0;
                    return;
                }
                if (asXorY[n] == 0)
                {
                    // X座標
                    aV[idx2].p.X = aV[idx1].p.X + ((aV[idx2].p.X - aV[idx1].p.X) * inv);
                    aV[idx2].u   = aV[idx1].u + ((aV[idx2].u - aV[idx1].u) * inv);
                }
                else
                {
                    // Y座標
                    aV[idx2].p.Y = aV[idx1].p.Y + ((aV[idx2].p.Y - aV[idx1].p.Y) * inv);
                    aV[idx2].v   = aV[idx1].v + ((aV[idx2].v - aV[idx1].v) * inv);
                }
                aV[idx2].c = aV[idx1].c + ((aV[idx2].c - aV[idx1].c) * inv);

                m_primitiveData.startIndex      = 0;
                m_primitiveData.drawTriangleNum = n + 1;
            }
            else
            {
                //--------------------------
                // 四角が減っていく
                //--------------------------
                if (rate >= 1.0f)
                {
                    // 通常状態
                    m_primitiveData.startIndex      = 0;
                    m_primitiveData.drawTriangleNum = TRIANGLE_NUM;
                    return;
                }
                if (asXorY[n] == 0)
                {
                    // X座標
                    aV[idx1].p.X = aV[idx1].p.X + ((aV[idx2].p.X - aV[idx1].p.X) * inv);
                    aV[idx1].u   = aV[idx1].u + ((aV[idx2].u - aV[idx1].u) * inv);
                }
                else
                {
                    // Y座標
                    aV[idx1].p.Y = aV[idx1].p.Y + ((aV[idx2].p.Y - aV[idx1].p.Y) * inv);
                    aV[idx1].v   = aV[idx1].v + ((aV[idx2].v - aV[idx1].v) * inv);
                }
                aV[idx1].c = aV[idx1].c + ((aV[idx2].c - aV[idx1].c) * inv);

                m_primitiveData.startIndex      = n * 3;
                m_primitiveData.drawTriangleNum = TRIANGLE_NUM - n;
            }
        }