/// <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]; } }