Exemple #1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="obj"></param>
 public void Set(MCAlphanumericSprite obj)
 {
     Set((MCBaseSprite)obj);
     charWidth  = obj.charWidth;
     lineHeight = obj.lineHeight;
     useFlgsANC = obj.useFlgsANC;
     div        = obj.div;
 }
Exemple #2
0
        public static MCAlphanumericSprite CreateSprite(
            Application app,
            string spriteName,
            MCBaseTexture tx,
            int divW, int divH,
            MC_ANC useFlgsANC
            )
        {
            MCAlphanumericSprite sp = new MCAlphanumericSprite();

            // 登録済みのスプライトか?
            if (app.SpriteMgr.IsSprite(spriteName))
            {
                return(sp);
            }

            sp.Texture00 = tx;

            // テクスチャーの情報を取得する
            var desc = sp.Texture00.GetDesc();

            sp.Name   = spriteName;
            sp.Width  = desc.Width;
            sp.Height = desc.Height;

            sp.div.DivW_U = (float)divW / desc.Width;
            sp.div.DivH_V = (float)divH / desc.Height;

            // 行と列の数
            sp.div.Col = desc.Width / divW;
            sp.div.Row = desc.Height / divH;


            // 球体を作る
            float fWW = divW * 0.5f;
            float fHH = divH * 0.5f;
            float r   = (float)System.Math.Sqrt(fWW + fHH);
            var   s   = sp.Sphere;

            s.r       = r;
            s.c       = new MCVector3(r * 0.5f, -r * 0.5f, 0.0f);
            sp.Sphere = s;

            // 登録
            if (app.SpriteMgr.RegisterSprite(spriteName, sp))
            {
                return(sp);
            }
            return(sp);
        }
        /// <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);
        }
Exemple #4
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="p"></param>
 protected MCAlphanumericSprite(MCAlphanumericSprite p)
 {
     Set(p);
 }