/// <summary> /// 複製セットする /// </summary> /// <param name="r"></param> public void Set(MCDrawSprite r) { Set((MCDrawSpriteBase)r); for (int i = 0; i < 4; ++i) { m_aColor[i] = r.m_aColor[i]; } m_cat = r.m_cat; m_spSprite = r.m_spSprite; m_divNo = r.m_divNo; }
/// <summary> /// IMCSpriteTypeより派生:スプライトの登録(さらに指定スプライトを切り取り&4頂点の色設定ができる) /// </summary> /// <param name="spDrawing"></param> /// <returns>通常、エラーが発生しなかった場合は 0 を返すようにプログラムする。</returns> internal int RegistrationDrawingCommand(MCDrawSprite drawSprite) { //----------------------------------------------------- // プライオリティー //----------------------------------------------------- // if (drawSprite.DrawCommandPriority.D2No == MCDrawCommandPriority.D2NO_MAX) { drawSprite.D2No = m_autoPpriorityNo++; } drawSprite.D2RenderType = m_spriteRenderIdx; drawSprite.Build(); m_drawSprites.Add(drawSprite); return(App.BatchDrawingMgr.RegisterDrawingCommand(drawSprite)); }
/// <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); }