//* -----------------------------------------------------------------------* /// <summary>描画処理を予約します。</summary> /// /// <param name="spriteFont">スプライトフォント テクスチャ</param> /// <param name="text">描画したいテキスト</param> /// <param name="pos">座標</param> /// <param name="color">色</param> /// <param name="fRotate">回転(ラジアン)</param> /// <param name="origin">原点座標</param> /// <param name="scale">拡大率</param> /// <param name="effects">反転効果</param> /// <param name="fLayer">レイヤ番号</param> public void add( SpriteFont spriteFont, string text, Vector2 pos, Color color, float fRotate, Vector2 origin, Vector2 scale, SpriteEffects effects, float fLayer ) { SSpriteDrawInfo info = new SSpriteDrawInfo(); info.initialize(); info.spriteFont = spriteFont; info.text = text; info.position = resolution == null ? pos : resolution.resizeFromVGA(pos); info.color = color; info.fRotation = fRotate; info.origin = origin; if (resolution == null) { info.scale = scale; } else { if (resolution.GetType() == typeResAF || resolution.GetType().IsSubclassOf(typeResAF)) { CResolutionAspectFix res = (CResolutionAspectFix)resolution; info.scale = scale * res.scaleGapFromVGA; } else { info.scale = scale * resolution.scaleGapFromVGA; } } info.effects = effects; info.fLayerDepth = fLayer; setReserve(info); }
//* -----------------------------------------------------------------------* /// <summary>予約された描画処理を実行します。</summary> public void draw() { if (spriteBatch == null) { throw new InvalidOperationException("描画に使用するSpriteBatchがありません。"); } drawCache.Sort(0, reservedCount, null); for (int i = 0; i < reservedCount; i++) { SSpriteDrawInfo info = drawCache[i]; changeMode(info); if (info.spriteFont == null) { Rectangle rectDst = info.destinationRectangle; spriteBatch.Draw(info.texture, rectDst, info.sourceRectangle, info.color, info.fRotation, info.origin, info.effects, info.fLayerDepth); } else { spriteBatch.DrawString(info.spriteFont, info.text, info.position, info.color, info.fRotation, info.origin, info.scale, info.effects, info.fLayerDepth); } } maxReserved = Math.Max(maxReserved, reservedCount); resetMode(); reservedCount = 0; }
//* -----------------------------------------------------------------------* /// <summary>描画予約を設定します。</summary> /// /// <param name="info">描画する情報</param> private void setReserve(SSpriteDrawInfo info) { if (reservedCount >= drawCache.Count) { if (reservedCount < reserveLimit) { drawCache.Add(info); } } else { drawCache[reservedCount] = info; } reservedCount++; }
//* -----------------------------------------------------------------------* /// <summary>描画モードを変更します。</summary> /// /// <param name="info">次に描画する情報</param> private void changeMode(SSpriteDrawInfo info) { if (!spriteBatch.IsDisposed) { if (m_drawMode.isBegin && (m_drawMode.blendMode != info.blendMode)) { spriteBatch.End(); m_drawMode.isBegin = false; } if (!m_drawMode.isBegin) { spriteBatch.Begin(info.blendMode, SpriteSortMode.FrontToBack, SaveStateMode.None); m_drawMode.isBegin = true; m_drawMode.blendMode = info.blendMode; spriteBatch.GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap; spriteBatch.GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap; } } }
//* -----------------------------------------------------------------------* /// <summary>描画処理を予約します。</summary> /// /// <param name="tex">テクスチャ</param> /// <param name="dstRect">描画先矩形</param> /// <param name="srcRect">描画元矩形</param> /// <param name="color">色</param> /// <param name="fRotate">回転(ラジアン)</param> /// <param name="origin">原点座標</param> /// <param name="effects">反転効果</param> /// <param name="fLayer">レイヤ番号</param> /// <param name="blend">合成モード</param> public void add( Texture2D tex, Rectangle dstRect, Rectangle srcRect, Color color, float fRotate, Vector2 origin, SpriteEffects effects, float fLayer, SpriteBlendMode blend ) { SSpriteDrawInfo info = new SSpriteDrawInfo(); info.initialize(); info.texture = tex; info.destinationRectangle = resolution.convertRectangle(dstRect); info.sourceRectangle = srcRect; info.color = color; info.fRotation = fRotate + resolution.rotate; info.origin = origin; info.effects = effects; info.fLayerDepth = fLayer; info.blendMode = blend; _private.drawCache.Add(info); }
//* -----------------------------------------------------------------------* /// <summary>描画処理を予約します。</summary> /// /// <param name="tex">テクスチャ</param> /// <param name="dstRect">描画先矩形</param> /// <param name="srcRect">描画元矩形</param> /// <param name="color">色</param> /// <param name="fRotate">回転(ラジアン)</param> /// <param name="origin">原点座標</param> /// <param name="effects">反転効果</param> /// <param name="fLayer">レイヤ番号</param> /// <param name="blend">合成モード</param> public void add( Texture2D tex, Rectangle dstRect, Rectangle srcRect, Color color, float fRotate, Vector2 origin, SpriteEffects effects, float fLayer, SpriteBlendMode blend ) { SSpriteDrawInfo info = SSpriteDrawInfo.initialized; info.texture = tex; info.destinationRectangle = resolution == null ? dstRect : resolution.resizeFromVGA(dstRect); info.sourceRectangle = srcRect; info.color = color; info.fRotation = fRotate - (resolution != null && resolution.vertical ? 0 : 0); info.origin = origin; info.effects = effects; info.fLayerDepth = fLayer; info.blendMode = blend; setReserve(info); }
//* -----------------------------------------------------------------------* /// <summary>描画処理を予約します。</summary> /// /// <param name="spriteFont">スプライトフォント テクスチャ</param> /// <param name="text">描画したいテキスト</param> /// <param name="pos">座標</param> /// <param name="color">色</param> /// <param name="fRotate">回転(ラジアン)</param> /// <param name="origin">原点座標</param> /// <param name="scale">拡大率</param> /// <param name="effects">反転効果</param> /// <param name="fLayer">レイヤ番号</param> /// <param name="blend">合成モード</param> public void add( SpriteFont spriteFont, string text, Vector2 pos, Color color, float fRotate, Vector2 origin, Vector2 scale, SpriteEffects effects, float fLayer, SpriteBlendMode blend ) { SSpriteDrawInfo info = new SSpriteDrawInfo(); info.initialize(); info.spriteFont = spriteFont; info.text = text; info.position = resolution.convertPosition(pos); info.color = color; info.fRotation = fRotate + resolution.rotate; info.origin = origin; info.blendMode = blend; info.scale = scale * resolution.scale; info.effects = effects; info.fLayerDepth = fLayer; _private.drawCache.Add(info); }
//* -----------------------------------------------------------------------* /// <summary>描画モードを変更します。</summary> /// /// <param name="spriteBatch">スプライト バッチ。</param> /// <param name="info">次に描画する情報</param> private void changeMode(SpriteBatch spriteBatch, SSpriteDrawInfo info) { if (!spriteBatch.IsDisposed) { if (m_drawMode.isBegin && m_drawMode.changeDrawMode(info)) { spriteBatch.End(); m_drawMode.isBegin = false; } if (!m_drawMode.isBegin) { SpriteSortMode sortmode = info.addressMode == TextureAddressMode.Clamp ? SpriteSortMode.Deferred : SpriteSortMode.Immediate; spriteBatch.Begin(info.blendMode, sortmode, SaveStateMode.None); m_drawMode.isBegin = true; m_drawMode.blendMode = info.blendMode; m_drawMode.addressMode = info.addressMode; spriteBatch.GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap; spriteBatch.GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap; } } }
//* -----------------------------------------------------------------------* /// <summary>描画処理を予約します。</summary> /// /// <param name="spriteFont">スプライトフォント テクスチャ</param> /// <param name="text">描画したいテキスト</param> /// <param name="pos">座標</param> /// <param name="color">色</param> /// <param name="rotate">回転(ラジアン)</param> /// <param name="origin">原点座標</param> /// <param name="scale">拡大率</param> /// <param name="effects">反転効果</param> /// <param name="layer">重ね合わせ深度。</param> /// <param name="blend">合成モード</param> /// <exception cref="System.ArgumentNullException"> /// <paramref name="text"/>が<c>null</c>と等しい場合。 /// </exception> public void add( SpriteFont spriteFont, string text, Vector2 pos, Color color, float rotate, Vector2 origin, Vector2 scale, SpriteEffects effects, float layer, SpriteBlendMode blend) { if (text == null) { throw new ArgumentNullException("text"); } SSpriteDrawInfo info = SSpriteDrawInfo.initialized; info.spriteFont = spriteFont; info.text = text; info.position = resolution.convertPosition(pos); info.color = color; info.fRotation = rotate + resolution.rotate; info.origin = origin; info.blendMode = blend; info.scale = scale * resolution.scale; info.effects = effects; info.fLayerDepth = layer; _private.drawCache.Add(info); }
//* -----------------------------------------------------------------------* /// <summary>1フレーム分の描画処理を実行します。</summary> /// /// <param name="entity">この状態を適用されているオブジェクト。</param> /// <param name="privateMembers"> /// オブジェクトと状態クラスのみがアクセス可能なフィールド。 /// </param> /// <param name="gameTime">前フレームが開始してからの経過時間。</param> public override void draw( CSpriteManager entity, CSpriteManager.CPrivateMembers privateMembers, GameTime gameTime) { SpriteBatch spriteBatch = entity.spriteBatch; if (spriteBatch == null) { throw new InvalidOperationException("描画に使用するSpriteBatchがありません。"); } List <SSpriteDrawInfo> drawCache = privateMembers.drawCache; int length = drawCache.Count; privateMembers.drawCache.Sort(); for (int i = length; --i >= 0;) { SSpriteDrawInfo info = drawCache[i]; changeMode(spriteBatch, info); if (info.spriteFont == null) { spriteBatch.Draw(info.texture, info.destinationRectangle, info.sourceRectangle, info.color, info.fRotation, info.origin, info.effects, info.fLayerDepth); } else { spriteBatch.DrawString(info.spriteFont, info.text, info.position, info.color, info.fRotation, info.origin, info.scale, info.effects, info.fLayerDepth); } } privateMembers.maxReserved = Math.Max(privateMembers.maxReserved, length); resetMode(spriteBatch); privateMembers.drawCache.Clear(); }
//* ────________________________________* //* methods ───────────────────────────────-* //* -----------------------------------------------------------------------* /// <summary>描画状態を変更すべきかどうかを判定します。</summary> /// /// <param name="info">描画情報。</param> /// <returns>描画状態を変更すべき場合、<c>true</c>。</returns> public bool changeDrawMode(SSpriteDrawInfo info) { return(!( blendMode == info.blendMode && addressMode == info.addressMode)); }