/// <summary>
        /// スプライト頂点データを更新する
        /// </summary>
        /// <param name="drawSprite">描画データ</param>
        /// <returns></returns>
        internal unsafe int VertexUpdate(MCDrawSprite drawSprite)
        {
            int   hr = 0;
            int   dwTmp;
            var   pSprite = drawSprite.Sprite;
            var   divNo = drawSprite.DivNo;
            float startX, startY, fEndX, fEndY;
            float startU, startV, 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)
            {
                fEndX = pSprite.Width + startX;
                fEndY = -(pSprite.Height - startY);

                startU = pSprite.spl.StartU;
                startV = pSprite.spl.StartV;
                endU   = pSprite.spl.EndU;
                endV   = pSprite.spl.EndV;
            }
            else
            {
                fEndX = (pSprite.div.DivW_U * pSprite.Width) + startX;
                fEndY = -((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;
                }
            }

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

            unsafe
            {
                MC_VERTEX_PCTx *pV = (MC_VERTEX_PCTx *)MappedResource.DataPointer;
                if (drawSprite.SpriteCat.IsUse())
                {
                    if ((drawSprite.SpriteCat.GetFlgY() & MCSpriteCat.NEGATIVE) != 0)
                    {
                        // Y -
                        startY = startY - drawSprite.SpriteCat.GetPosition().Y;
                        startV = startV + System.Math.Abs(drawSprite.SpriteCat.GetPosition().Y) * pSprite.TextureInvH;
                    }
                    else if ((drawSprite.SpriteCat.GetFlgY() & MCSpriteCat.POSITIVE) != 0)
                    {
                        // Y +
                        fEndY = startY - drawSprite.SpriteCat.GetPosition().Y;
                        endV  = startV + System.Math.Abs(drawSprite.SpriteCat.GetPosition().Y) * pSprite.TextureInvH;
                    }
                    if ((drawSprite.SpriteCat.GetFlgX() & MCSpriteCat.NEGATIVE) != 0)
                    {
                        // X -
                        fEndX = startX + drawSprite.SpriteCat.GetPosition().X;
                        endU  = startU + drawSprite.SpriteCat.GetPosition().X *pSprite.TextureInvW;
                    }
                    else if ((drawSprite.SpriteCat.GetFlgX() & MCSpriteCat.POSITIVE) != 0)
                    {
                        // X +
                        startX = startX + drawSprite.SpriteCat.GetPosition().X;
                        startU = startU + drawSprite.SpriteCat.GetPosition().X *pSprite.TextureInvW;
                    }
                }
                Sprite_V3_UV_Color(drawSprite.Flip, startX, startY, fEndX, fEndY, startU, startV, endU, endV, drawSprite.Colors, pV);
            }

            App.ImmediateContext.UnmapSubresource(m_vertexBuffer, 0);

            if (hr != 0)
            {
                Debug.Assert(false); return(hr);
            }

            return(hr);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="spriteDraw"></param>
        /// <param name="pos"></param>
        /// <returns></returns>
        unsafe public int VertexUpdate(MCDrawAlphanumericSprite spriteDraw, out MCVector3 pos)
        {
            int hr = 0;

            pos = new MCVector3();
            int  divNo, tmpNo;
            byte uC;
            MCAlphanumericSprite spSprite = spriteDraw.Sprite;


            float startU, startV, endU, endV;
            float factorU, factorV;
            float startX, startY, fEndX, fEndY;

            float fW         = (spSprite.div.DivW_U * spSprite.Width);
            float fH         = (spSprite.div.DivH_V * spSprite.Height);
            float fCW        = fW * spSprite.charWidth;
            float fLH        = fH * spSprite.lineHeight;
            float deltaHalfW = (float)System.Math.Floor((fCW - fW) * 0.5f);
            float deltaHalfH = (float)System.Math.Floor((fLH - fH) * 0.5f);

            startX = deltaHalfW; // -0.5f;
            startY = deltaHalfH; // +0.5f;

            m_drawTriangleNum  = spriteDraw.Text.Length <= m_maxLength ? spriteDraw.Text.Length : m_maxLength;
            m_drawTriangleNum *= 2;

            // 配置による位置決め
            if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.USE_ALIGN) != 0)
            {
                List <float> vLineWidth = new List <float>();
                float        charWidth = 0, lineH = fH + deltaHalfH * 2.0f;
                float        rectX, rectY, rectWidht, rectHeight;

                rectX      = spriteDraw.Position.X;
                rectY      = spriteDraw.Position.Y;
                rectWidht  = spriteDraw.Box.X;
                rectHeight = spriteDraw.Box.X;

                pos.X = spriteDraw.Position.X + spriteDraw.Anchor.X;
                pos.Y = spriteDraw.Position.Y + spriteDraw.Anchor.Y;

                // 事前に文字の幅高さを計算
                for (int i = 0; i < m_maxLength && i < spriteDraw.Text.Length; ++i)
                {
                    uC = (byte)char.GetNumericValue(spriteDraw.Text[0]);

                    if (uC == 0x0A)
                    {
                        // 改行
                        vLineWidth.Add(charWidth);
                        charWidth = 0;
                        lineH    += fH + deltaHalfH * 2.0f;
                    }
                    else
                    {
                        charWidth += fW + deltaHalfW * 2.0f;
                    }
                }
                vLineWidth.Add(charWidth);

                // 縦軸
                if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.MIDDLE) != 0)
                {   // 縦:中央揃え
                    startY += spriteDraw.Angle.Y - (rectHeight - lineH) * 0.5f;
                }
                else if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.BOTTOM) != 0)
                {   // 下揃え
                    startY += spriteDraw.Angle.Y - (rectHeight - lineH);
                }
                else //if( spriteDraw.AlignFlags & MC_ANC.TOP )
                {   //上揃え
                    startY += spriteDraw.Angle.Y;
                }
                DataStream MappedResource;
                var        box = App.ImmediateContext.MapSubresource(
                    m_vertexBuffer,
                    MapMode.WriteDiscard,
                    SharpDX.Direct3D11.MapFlags.None,
                    out MappedResource);


                MC_VERTEX_PCTx *pV = (MC_VERTEX_PCTx *)MappedResource.DataPointer;

                for (int i = 0; i < m_allVertex; ++i)
                {
                    pV[i].Init();
                }

                bool bLnInit  = false;
                int  nNewLine = 0;
                for (int i = 0; i < m_maxLength && i < spriteDraw.Text.Length; ++i)
                {
                    var pTmp = &pV[i * 4];
                    uC = (byte)char.GetNumericValue(spriteDraw.Text[i]);

                    if (uC <= 0x1F || uC >= 0x7F)
                    {
                        divNo = 0;
                    }
                    else
                    {
                        divNo = m_aAncTable[(int)spSprite.useFlgsANC - 1][uC - 0x20];
                    }

                    if (!bLnInit)
                    {
                        if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.CENTER) != 0)
                        {   // 横:中央揃え
                            startX += (rectWidht - vLineWidth[nNewLine]) * 0.5f - spriteDraw.Angle.X;
                        }
                        else if ((spriteDraw.AlignFlags & (int)MC_ANC_ALIGN.RIGHT) != 0)
                        {   // 右寄り
                            startX += rectWidht - vLineWidth[nNewLine] - spriteDraw.Angle.X;
                        }
                        else //if( spriteDraw.AlignFlags & MC_ANC.LEFT )
                        {   //左寄り
                            startX -= spriteDraw.Angle.X;
                        }
                        bLnInit = true;
                    }
                    if (spSprite.div.Col == 0)
                    {
                        factorV = (1.0f / spSprite.div.Row);

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

                        startU = factorU * divNo;
                        startV = 0.0f;
                        endU   = startU + factorU;
                        endV   = 1.0f;
                    }
                    else
                    {
                        tmpNo  = divNo % spSprite.div.Col;
                        startU = spSprite.div.DivW_U * tmpNo;
                        tmpNo  = divNo / spSprite.div.Col;
                        startV = spSprite.div.DivH_V * tmpNo;
                        endU   = startU + spSprite.div.DivW_U;
                        endV   = startV + spSprite.div.DivH_V;
                    }
                    // texturer uv
                    pTmp[0].u = startU; pTmp[0].v = startV;
                    pTmp[1].u = startU; pTmp[1].v = endV;
                    pTmp[2].u = endU; pTmp[2].v = startV;
                    pTmp[3].u = endU; pTmp[3].v = endV;
                    //
                    pTmp[0].c = spriteDraw.Color;
                    pTmp[1].c = spriteDraw.Color;
                    pTmp[2].c = spriteDraw.Color;
                    pTmp[3].c = spriteDraw.Color;
                    //
                    fEndX = startX + fW;
                    fEndY = startY - fH;

                    // 位置
                    pTmp[0].p.X = startX; pTmp[0].p.Y = startY; pTmp[0].p.Z = 0.0f;
                    pTmp[1].p.X = startX; pTmp[1].p.Y = fEndY; pTmp[1].p.Z = 0.0f;
                    pTmp[2].p.X = fEndX; pTmp[2].p.Y = startY; pTmp[2].p.Z = 0.0f;
                    pTmp[3].p.X = fEndX; pTmp[3].p.Y = fEndY; pTmp[3].p.Z = 0.0f;
                    if (uC == 0x0A)
                    {
                        startX  = deltaHalfW;// - 0.5f;
                        startY -= fH + deltaHalfH * 2.0f;
                        bLnInit = false;
                        ++nNewLine;
                    }
                    else
                    {
                        startX += fW + deltaHalfW * 2.0f;
                    }
                }
                App.ImmediateContext.UnmapSubresource(m_vertexBuffer, 0);
            }
            else
            {
                //-----------------------------------------------------
                // 通常
                //-----------------------------------------------------
                pos.X = spriteDraw.Position.X + spriteDraw.Anchor.X;
                pos.Y = spriteDraw.Position.Y + spriteDraw.Anchor.Y;

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


                MC_VERTEX_PCTx *pV = (MC_VERTEX_PCTx *)MappedResource.DataPointer;

                for (int i = 0; i < m_allVertex; ++i)
                {
                    pV[i].Init();
                }

                for (int i = 0; i < m_maxLength && i < spriteDraw.Text.Length; ++i)
                {
                    var pTmp = &pV[i * 4];
                    uC = (byte)spriteDraw.Text[i];

                    if (uC <= 0x1F || uC >= 0x7F)
                    {
                        divNo = 0;
                    }
                    else
                    {
                        divNo = m_aAncTable[(int)spSprite.useFlgsANC - 1][uC - 0x20];
                    }
                    //if( divNo == 0xFFFF )continue;
                    // UV
                    if (spSprite.div.Col == 0)
                    {
                        factorV = (1.0f / spSprite.div.Row);

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

                        startU = factorU * divNo;
                        startV = 0.0f;
                        endU   = startU + factorU;
                        endV   = 1.0f;
                    }
                    else
                    {
                        tmpNo  = divNo % spSprite.div.Col;
                        startU = spSprite.div.DivW_U * tmpNo;
                        tmpNo  = divNo / spSprite.div.Col;
                        startV = spSprite.div.DivH_V * tmpNo;
                        endU   = startU + spSprite.div.DivW_U;
                        endV   = startV + spSprite.div.DivH_V;
                    }
                    // texturer uv
                    pTmp[0].u = startU; pTmp[0].v = startV;
                    pTmp[1].u = startU; pTmp[1].v = endV;
                    pTmp[2].u = endU;   pTmp[2].v = startV;
                    pTmp[3].u = endU;   pTmp[3].v = endV;
                    //
                    pTmp[0].c = spriteDraw.Color;
                    pTmp[1].c = spriteDraw.Color;
                    pTmp[2].c = spriteDraw.Color;
                    pTmp[3].c = spriteDraw.Color;
                    //
                    fEndX = startX + fW;
                    fEndY = startY - fH;

                    // 位置
                    pTmp[0].p.X = startX; pTmp[0].p.Y = startY; pTmp[0].p.Z = 0.0f;
                    pTmp[1].p.X = startX; pTmp[1].p.Y = fEndY;  pTmp[1].p.Z = 0.0f;
                    pTmp[2].p.X = fEndX;  pTmp[2].p.Y = startY; pTmp[2].p.Z = 0.0f;
                    pTmp[3].p.X = fEndX;  pTmp[3].p.Y = fEndY;  pTmp[3].p.Z = 0.0f;
                    if (uC == 0x0A)
                    {
                        // 改行
                        startX  = deltaHalfW;// - 0.5f;
                        startY -= fH + deltaHalfH * 2.0f;
                    }
                    else
                    {
                        startX += fW + deltaHalfW * 2.0f;
                    }
                }
                App.ImmediateContext.UnmapSubresource(m_vertexBuffer, 0);
            }

            return(hr);
        }
        /// <summary>
        /// 任意の頂点型 pV に、頂点、UV、色のデータ化rあ作り渡す
        /// </summary>
        /// <param name="flip">フリップフラグ</param>
        /// <param name="sX">開始 X</param>
        /// <param name="sY">開始 Y</param>
        /// <param name="eX">終了 X</param>
        /// <param name="eY">終了 Y</param>
        /// <param name="sU">開始 U</param>
        /// <param name="sV">開始 V</param>
        /// <param name="eU">終了 U</param>
        /// <param name="eV">終了 V</param>
        /// <param name="aColor">4頂点分の色ポインタ(配列)</param>
        /// <param name="pV">任意の頂点型で、上記パラメータにより作られる</param>
        unsafe private void Sprite_V3_UV_Color(
            SPRITE_FLIP flip,
            float sX, float sY, float eX, float eY,
            float sU, float sV, float eU, float eV,
            Color4[] aColor, MC_VERTEX_PCTx *pV)
        {
            if (aColor == null)
            {
                throw new Exception(nameof(aColor));
            }
            UV[]     aUV   = new UV[4];
            Color4[] aTmpC = new Color4[4];

            // 位置
            pV[0].p.X = sX; pV[0].p.Y = sY; pV[0].p.Z = 0.0f;
            pV[1].p.X = sX; pV[1].p.Y = eY; pV[1].p.Z = 0.0f;
            pV[2].p.X = eX; pV[2].p.Y = sY; pV[2].p.Z = 0.0f;
            pV[3].p.X = eX; pV[3].p.Y = eY; pV[3].p.Z = 0.0f;
            // UV . ディフェーズ色
            // 回転
            if ((flip & SPRITE_FLIP.R90) != 0)
            {
                aUV[0].u = sU; aUV[0].v = eV;
                aUV[1].u = eU; aUV[1].v = eV;
                aUV[2].u = sU; aUV[2].v = sV;
                aUV[3].u = eU; aUV[3].v = sV;
                aTmpC[0] = aColor[1]; aTmpC[1] = aColor[3];
                aTmpC[2] = aColor[0]; aTmpC[3] = aColor[2];
            }
            else if ((flip & SPRITE_FLIP.R180) != 0)
            {
                aUV[0].u = eU; aUV[0].v = eV;
                aUV[1].u = eU; aUV[1].v = sV;
                aUV[2].u = sU; aUV[2].v = eV;
                aUV[3].u = sU; aUV[3].v = sV;
                aTmpC[0] = aColor[3]; aTmpC[1] = aColor[2];
                aTmpC[2] = aColor[1]; aTmpC[3] = aColor[0];
            }
            else if ((flip & SPRITE_FLIP.R270) != 0)
            {
                aUV[0].u = eU; aUV[0].v = sV;
                aUV[1].u = sU; aUV[1].v = sV;
                aUV[2].u = eU; aUV[2].v = eV;
                aUV[3].u = sU; aUV[3].v = eV;
                aTmpC[0] = aColor[2]; aTmpC[1] = aColor[0];
                aTmpC[2] = aColor[3]; aTmpC[3] = aColor[1];
            }
            else
            {
                aUV[0].u = sU; aUV[0].v = sV;
                aUV[1].u = sU; aUV[1].v = eV;
                aUV[2].u = eU; aUV[2].v = sV;
                aUV[3].u = eU; aUV[3].v = eV;

                for (int i = 0; i < 4; ++i)
                {
                    aTmpC[i] = aColor[i];
                }
            }
            SPRITE_FLIP tempFlip = flip & SPRITE_FLIP.V_H;

            if (tempFlip == SPRITE_FLIP.HORIZONTAL)
            {
                //--------------
                // 左右反転
                //--------------
                pV[0].u = aUV[2].u; pV[0].v = aUV[2].v;
                pV[1].u = aUV[3].u; pV[1].v = aUV[3].v;
                pV[2].u = aUV[0].u; pV[2].v = aUV[0].v;
                pV[3].u = aUV[1].u; pV[3].v = aUV[1].v;
                // ディフェーズ色
                pV[2].c = aTmpC[0];
                pV[3].c = aTmpC[1];
                pV[0].c = aTmpC[2];
                pV[1].c = aTmpC[3];
            }
            else if (tempFlip == SPRITE_FLIP.VERTICAL)
            {
                //--------------
                // 上下反転
                //--------------
                pV[0].u = aUV[1].u; pV[0].v = aUV[1].v;
                pV[1].u = aUV[0].u; pV[1].v = aUV[0].v;
                pV[2].u = aUV[3].u; pV[2].v = aUV[3].v;
                pV[3].u = aUV[2].u; pV[3].v = aUV[2].v;
                // ディフェーズ色
                pV[1].c = aTmpC[0];
                pV[0].c = aTmpC[1];
                pV[3].c = aTmpC[2];
                pV[2].c = aTmpC[3];
            }
            else if (tempFlip == SPRITE_FLIP.V_H)
            {
                //--------------
                // 上下左右反転
                //--------------
                pV[0].u = aUV[3].u; pV[0].v = aUV[3].v;
                pV[1].u = aUV[2].u; pV[1].v = aUV[2].v;
                pV[2].u = aUV[1].u; pV[2].v = aUV[1].v;
                pV[3].u = aUV[0].u; pV[3].v = aUV[0].v;
                // ディフェーズ色
                pV[3].c = aTmpC[0];
                pV[2].c = aTmpC[1];
                pV[1].c = aTmpC[2];
                pV[0].c = aTmpC[3];
            }
            else
            {
                //--------------
                // 通常
                //--------------
                pV[0].u = aUV[0].u; pV[0].v = aUV[0].v;
                pV[1].u = aUV[1].u; pV[1].v = aUV[1].v;
                pV[2].u = aUV[2].u; pV[2].v = aUV[2].v;
                pV[3].u = aUV[3].u; pV[3].v = aUV[3].v;
                // ディフェーズ色
                pV[0].c = aTmpC[0];
                pV[1].c = aTmpC[1];
                pV[2].c = aTmpC[2];
                pV[3].c = aTmpC[3];
            }
        }