• R/O
  • SSH
  • HTTPS

mmdx: Commit


Commit MetaInfo

Revision284 (tree)
Zeit2010-05-17 00:44:56
Autorwilfrem

Log Message

スクリーンの描画処理をスクリーンマネージャにまとめた

Ändern Zusammenfassung

Diff

--- trunk/MikuMikuDanceXNADemo4/FlipRenderTarget2D.cs (revision 283)
+++ trunk/MikuMikuDanceXNADemo4/FlipRenderTarget2D.cs (nonexistent)
@@ -1,63 +0,0 @@
1-using System;
2-using System.Collections.Generic;
3-using System.Linq;
4-using System.Text;
5-using Microsoft.Xna.Framework.Graphics;
6-
7-namespace MikuMikuDanceXNADemo4
8-{
9- /// <summary>
10- /// フリップ可能なレンダリングターゲットクラス
11- /// GPUとバッティングする可能性を排除するため
12- /// </summary>
13- class FlipRenderTarget2D : IDisposable
14- {
15- RenderTarget2D[] targets;
16- int index;
17- public RenderTarget2D RenderTareget { get { return targets[index]; } }
18-
19- /// <summary>
20- /// レンダリングターゲットを生成
21- /// </summary>
22- /// <param name="graphicDevice">グラフィックデバイス</param>
23- /// <param name="width">幅</param>
24- /// <param name="height">高さ</param>
25- /// <param name="numberLevels">ミップマップレベル</param>
26- /// <param name="format">フォーマット</param>
27- /// <param name="NumTarget">フリップ数</param>
28- public void Setup(GraphicsDevice graphicDevice, int width, int height, int numberLevels,
29- SurfaceFormat format, MultiSampleType multiSampleType, int multiSampleQuality, int NumTarget)
30- {
31- targets = new RenderTarget2D[NumTarget];
32- for (int i = 0; i < NumTarget; i++)
33- {
34- targets[i] = new RenderTarget2D(graphicDevice, width, height, numberLevels, format, multiSampleType, multiSampleQuality);
35- }
36- }
37-
38- /// <summary>
39- /// 使用するレンダリングターゲットを切り替え
40- /// </summary>
41- public void Flip()
42- {
43- if (++index >= targets.Length)
44- index = 0;
45- }
46-
47- /// <summary>
48- /// リソースの破棄
49- /// </summary>
50- public void Dispose()
51- {
52- for (int i = 0; i < targets.Length; ++i)
53- {
54- if (targets[i] != null)
55- {
56- targets[i].Dispose();
57- targets[i] = null;
58- }
59- }
60- }
61-
62- }
63-}
--- trunk/MikuMikuDanceXNADemo4/Game1.cs (revision 283)
+++ trunk/MikuMikuDanceXNADemo4/Game1.cs (revision 284)
@@ -38,10 +38,9 @@
3838 MMDBakedMotion motion;
3939 //MMDアクセサリデータ
4040 MMDAccessory stage, negi;
41- //レンダリングターゲット(screen用)
42- FlipRenderTarget2D renderTarget;
43- SpriteBatch spriteBatch;
44-
41+ //スクリーンマネージャ
42+ ScreenManager screenManager;
43+
4544 public Game1()
4645 {
4746 //デバイスがMMDXの必要条件を満たしているかチェック
@@ -83,13 +82,10 @@
8382 //モーションを0番トラックにセットする
8483 model.Player.SetMotion(0, motion, true);
8584
86- //スクリーン用のレンダリングターゲット設定
87- renderTarget = new FlipRenderTarget2D();
88- PresentationParameters pp = graphics.GraphicsDevice.PresentationParameters;
89- renderTarget.Setup(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat,
90- pp.MultiSampleType, pp.MultiSampleQuality, 2);
91- //最終描画用のSpriteBatch作成
92- spriteBatch = new SpriteBatch(GraphicsDevice);
85+ //スクリーンマネージャのセットアップ
86+ screenManager = new ScreenManager(graphics.GraphicsDevice);
87+ //MMDXにスクリーンマネージャを登録
88+ mmd.ScreenManager = screenManager;
9389 }
9490
9591 /// <summary>
@@ -141,13 +137,13 @@
141137 {
142138 //Draw処理ではスクリーン処理を行う(この処理は自前で行う必要がある)
143139 //基本的な流れは
144- //1.レンダリングターゲットを別に用意する
145- //2.それに全てを書き込む
146- //3.レンダリングターゲットをスクリーンにセットする
147- //4.レンダリングターゲットをスプライトバッチを元に画面に書き出す
140+ //1.スクリーンマネージャのbeginを呼び出す
141+ //2.base.Drawや他の描画を呼び出して書き込む
142+ //3.スクリーンマネージャのendを呼び出す
143+ //4.スクリーンマネージャをフリップする
148144
149- //レンダリングターゲットセット(スクリーン用テクスチャキャプチャ用)
150- GraphicsDevice.SetRenderTarget(0, renderTarget.RenderTareget);
145+ //スクリーン用キャプチャ開始
146+ screenManager.Begin(GraphicsDevice);
151147 //画面をWhite色で消去する
152148 GraphicsDevice.Clear(Color.White);
153149
@@ -156,19 +152,9 @@
156152
157153 //XNA内部のDraw処理を行う
158154 base.Draw(gameTime);
159- //レンダリングターゲットを元に戻す
160- GraphicsDevice.SetRenderTarget(0, null);
161- //画面をCornflowerBlue色で消去する
162- GraphicsDevice.Clear(Color.White);
163- //RenderTargetに書き出し済みのシーンをスクリーンとしてセット(適応は次フレーム)
164- //モードは1
165- mmd.SetScreen(renderTarget.RenderTareget.GetTexture(), false);
166- //spriteBatchを利用してRenderTargetを画面に書き出し
167- spriteBatch.Begin(SpriteBlendMode.None,
168- SpriteSortMode.Immediate,
169- SaveStateMode.None);
170- spriteBatch.Draw(renderTarget.RenderTareget.GetTexture(), Vector2.Zero, Color.White);
171- spriteBatch.End();
155+ //スクリーンキャプチャを終了し、キャプチャ済みの画面を画面に描画
156+ screenManager.End(GraphicsDevice);
157+ screenManager.Flip();
172158 //spriteBatchでシーンが荒れているので元に戻すコード(SaveStateMode.SaveStateを使わないのはひにけにXNA(http://blogs.msdn.com/ito/archive/2007/03/13/spritebatch-part2.aspx)を参照)
173159 //MMDXでは各モデル、アクセサリ描画前に自動で設定するコードを書いているので、自動で戻ります。
174160 #if false
@@ -178,9 +164,6 @@
178164 GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap;
179165 GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap;
180166 #endif
181-
182- //フリップ
183- renderTarget.Flip();
184167 }
185168 }
186169 }
--- trunk/MikuMikuDanceXNADemo6/FlipRenderTarget2D.cs (revision 283)
+++ trunk/MikuMikuDanceXNADemo6/FlipRenderTarget2D.cs (nonexistent)
@@ -1,63 +0,0 @@
1-using System;
2-using System.Collections.Generic;
3-using System.Linq;
4-using System.Text;
5-using Microsoft.Xna.Framework.Graphics;
6-
7-namespace MikuMikuDanceXNADemo4
8-{
9- /// <summary>
10- /// フリップ可能なレンダリングターゲットクラス
11- /// GPUとバッティングする可能性を排除するため
12- /// </summary>
13- class FlipRenderTarget2D : IDisposable
14- {
15- RenderTarget2D[] targets;
16- int index;
17- public RenderTarget2D RenderTareget { get { return targets[index]; } }
18-
19- /// <summary>
20- /// レンダリングターゲットを生成
21- /// </summary>
22- /// <param name="graphicDevice">グラフィックデバイス</param>
23- /// <param name="width">幅</param>
24- /// <param name="height">高さ</param>
25- /// <param name="numberLevels">ミップマップレベル</param>
26- /// <param name="format">フォーマット</param>
27- /// <param name="NumTarget">フリップ数</param>
28- public void Setup(GraphicsDevice graphicDevice, int width, int height, int numberLevels,
29- SurfaceFormat format, MultiSampleType multiSampleType, int multiSampleQuality, int NumTarget)
30- {
31- targets = new RenderTarget2D[NumTarget];
32- for (int i = 0; i < NumTarget; i++)
33- {
34- targets[i] = new RenderTarget2D(graphicDevice, width, height, numberLevels, format, multiSampleType, multiSampleQuality);
35- }
36- }
37-
38- /// <summary>
39- /// 使用するレンダリングターゲットを切り替え
40- /// </summary>
41- public void Flip()
42- {
43- if (++index >= targets.Length)
44- index = 0;
45- }
46-
47- /// <summary>
48- /// リソースの破棄
49- /// </summary>
50- public void Dispose()
51- {
52- for (int i = 0; i < targets.Length; ++i)
53- {
54- if (targets[i] != null)
55- {
56- targets[i].Dispose();
57- targets[i] = null;
58- }
59- }
60- }
61-
62- }
63-}
--- trunk/MikuMikuDanceXNADemo6/Game1.cs (revision 283)
+++ trunk/MikuMikuDanceXNADemo6/Game1.cs (revision 284)
@@ -15,7 +15,6 @@
1515 using MikuMikuDance.XNA.Model;
1616 using MikuMikuDance.XNA.Motion;
1717 using MikuMikuDance.XNA.ShadowMap;
18-using MikuMikuDanceXNADemo4;
1918
2019 namespace MikuMikuDanceXNADemo6
2120 {
@@ -36,9 +35,8 @@
3635 MMDBakedMotion motion;
3736 //MMDアクセサリデータ
3837 MMDAccessory stage, negi;
39- //レンダリングターゲット(screen用)
40- FlipRenderTarget2D renderTarget;
41- SpriteBatch spriteBatch;
38+ //スクリーンマネージャ
39+ ScreenManager screen;
4240 //シャドウマップマネージャ
4341 PerspectiveShadowMap shadow;
4442 //LispShadowMap shadow;
@@ -84,13 +82,10 @@
8482 //モーションを0番トラックにセットする
8583 model.Player.SetMotion(0, motion, true);
8684
87- //スクリーン用のレンダリングターゲット設定
88- renderTarget = new FlipRenderTarget2D();
89- PresentationParameters pp = graphics.GraphicsDevice.PresentationParameters;
90- renderTarget.Setup(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat,
91- pp.MultiSampleType, pp.MultiSampleQuality, 2);
92- //最終描画用のSpriteBatch作成
93- spriteBatch = new SpriteBatch(GraphicsDevice);
85+ //スクリーンマネージャの作成
86+ screen = new ScreenManager(GraphicsDevice);
87+ //MMDXにスクリーンマネージャを登録
88+ mmd.ScreenManager = screen;
9489 //シャドウマップマネージャの作成
9590 //シャドウマップマネージャはシャドウマップの管理を行う
9691 shadow = new PerspectiveShadowMap(graphics.GraphicsDevice);
@@ -161,14 +156,14 @@
161156 shadow.BeginShadowMap(graphics.GraphicsDevice);
162157 GraphicsDevice.Clear(Color.White);
163158 //3Dオブジェクトのシャドウマップ描画
164- model.DrawShadowMap(gameTime.TotalGameTime.Ticks);
165- stage.DrawShadowMap(gameTime.TotalGameTime.Ticks);
166- //モデルが保持アクセサリはシャドウマップを描画する必要はない
159+ mmd.DrawShadowMap(gameTime);
167160
168161 //その他のモデルに付いてシャドウマップを書く場合はここに記述
169162
170- //シャドウマップの終了&スクリーンキャプチャ用のレンダリングターゲットセット
171- shadow.EndShadowMap(renderTarget.RenderTareget, graphics.GraphicsDevice);
163+ //シャドウマップの終了
164+ shadow.EndShadowMap(graphics.GraphicsDevice);
165+ //スクリーンマネージャの開始
166+ screen.Begin(graphics.GraphicsDevice);
172167 //画面をWhite色で消去する
173168 GraphicsDevice.Clear(Color.White);
174169
@@ -177,19 +172,8 @@
177172
178173 //XNA内部のDraw処理を行う
179174 base.Draw(gameTime);
180- //レンダリングターゲットを元に戻す
181- GraphicsDevice.SetRenderTarget(0, null);
182- //画面をCornflowerBlue色で消去する
183- GraphicsDevice.Clear(Color.White);
184- //RenderTargetに書き出し済みのシーンをスクリーンとしてセット(適応は次フレーム)
185- //モードは1
186- mmd.SetScreen(renderTarget.RenderTareget.GetTexture(), false);
187- //spriteBatchを利用してRenderTargetを画面に書き出し
188- spriteBatch.Begin(SpriteBlendMode.None,
189- SpriteSortMode.Immediate,
190- SaveStateMode.None);
191- spriteBatch.Draw(renderTarget.RenderTareget.GetTexture(), Vector2.Zero, Color.White);
192- spriteBatch.End();
175+ screen.End(graphics.GraphicsDevice);
176+ screen.Flip();
193177 //spriteBatchでシーンが荒れているので元に戻すコード(SaveStateMode.SaveStateを使わないのはひにけにXNA(http://blogs.msdn.com/ito/archive/2007/03/13/spritebatch-part2.aspx)を参照)
194178 //MMDXでは各モデル、アクセサリ描画前に自動で設定するコードを書いているので、自動で戻ります。
195179 #if false
@@ -199,9 +183,6 @@
199183 GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap;
200184 GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap;
201185 #endif
202-
203- //フリップ
204- renderTarget.Flip();
205186 }
206187 }
207188 }
--- trunk/MikuMikuDanceXNA/Model/MMDModel.cs (revision 283)
+++ trunk/MikuMikuDanceXNA/Model/MMDModel.cs (revision 284)
@@ -401,7 +401,7 @@
401401 continue;//境界線は2メッシュ目。描画しないときは飛ばす
402402 foreach (Effect effect in mesh.Effects)//メモ:エフェクト17回ループで処理時間食ってる
403403 {
404- //エフェクトルーチン。
404+ //エフェクト設定
405405 //ボーン設定
406406 if (rotationTexture != null)
407407 {
@@ -491,27 +491,10 @@
491491 {
492492 Matrix baseMat = BoneManager.GetWorldQuatTransform(BoneManager.IndexOf(acc.Value.BoneName)).CreateMatrix();
493493 acc.Key.BaseTransform = acc.Value.Transform * baseMat * World;
494- /*
495- if (acc.Key.Enabled)
496- {
497- acc.Key.Draw(acc.Value.Transform * baseMat * World, totalTick, IsShadow);
498- }*/
499494 }
500495 }
501496 }
502497 }
503- /// <summary>
504- /// モデルのシャドウマップの描画
505- /// </summary>
506- /// <param name="totalTicks">GameTime.TotalGameTime.Ticksの値を入れる</param>
507- /// <remarks>シャドウマップ描画用。シャドウマップ描画時に呼び出す</remarks>
508- public void DrawShadowMap(long totalTicks)
509- {
510- if (ModelData.ModelData.Meshes.Count > 0)
511- {
512- Draw(Game.GraphicsDevice, totalTicks, true);//モデルの描画
513- }
514- }
515498 #endregion
516499 }
517500 }
--- trunk/MikuMikuDanceXNA/MikuMikuDanceXNA.cs (revision 283)
+++ trunk/MikuMikuDanceXNA/MikuMikuDanceXNA.cs (revision 284)
@@ -39,9 +39,7 @@
3939 #else
4040 internal readonly int NumThread;
4141 #endif
42- //スクリーン表示用にフックされたエフェクト
43- internal List<Effect> ScreenHook = new List<Effect>();
44-
42+
4543 //properties...
4644 /// <summary>
4745 /// MikuMikuDance for XNAで用いるコンテンツマネージャ
@@ -64,6 +62,10 @@
6462 /// </summary>
6563 public IShadowMapManager ShadowMapManager { get; set; }
6664 /// <summary>
65+ /// スクリーンマネージャ
66+ /// </summary>
67+ public IScreenManager ScreenManager { get; set; }
68+ /// <summary>
6769 /// 物理演算を使用フラグ
6870 /// </summary>
6971 /// <remarks>物理演算完成までデフォルトはfalse</remarks>
@@ -270,64 +272,29 @@
270272 return result;*/
271273 }
272274 /// <summary>
273- /// スクリーン画像をセットする
274- /// </summary>
275- /// <param name="screen">テクスチャ。nullにするとスクリーンを使用しないことになる</param>
276- /// <param name="mode2">mode2にするかどうか(4:3の比でカットするかどうか)</param>
277- public void SetScreen(Texture2D screen, bool mode2)
278- {
279- if (ScreenHook.Count == 0)
280- return;
281- if (screen == null)
282- {
283- ScreenHook[0].Parameters["ScreenMode"].SetValue(0);
284- }
285- else
286- {
287- ScreenHook[0].Parameters["ScreenMode"].SetValue(mode2 ? 2 : 1);
288- ScreenHook[0].Parameters["Screen"].SetValue(screen);
289- if (mode2)
290- {
291- Vector2 result = new Vector2(screen.Width, screen.Height);
292- if (result.X * 3.0f > result.Y * 4.0f)
293- {
294- result.X = result.Y * 4.0f / 3.0f / result.X;
295- result.Y = 1.0f;
296- }
297- else
298- {
299- result.Y = result.X * 3.0f / 4.0f / result.Y;
300- result.X = 1.0f;
301- }
302- ScreenHook[0].Parameters["ScreenTexFix"].SetValue(result);
303- }
304- else
305- {
306- ScreenHook[0].Parameters["ScreenTexFix"].SetValue(Vector2.One);
307- }
308- }
309- }
310- /// <summary>
311275 /// MMD関連オブジェクトの描画
312276 /// </summary>
313277 /// <param name="gameTime"></param>
314278 public override void Draw(GameTime gameTime)
315279 {
316-
317280 //モデル用のグラフィックスデバイスのセットアップ
318281 MMDModel.GraphicsSetup(Game.GraphicsDevice, false);
319282 if (DrawModelEvent != null)
320283 DrawModelEvent(Game.GraphicsDevice, gameTime.TotalGameTime.Ticks, false);
321-
284+ if (DrawAccessoryEvent != null)
285+ DrawAccessoryEvent(Game.GraphicsDevice, gameTime.TotalGameTime.Ticks, false);
322286 }
323287 /// <summary>
324288 /// MMD関連オブジェクトのシャドウマップ描画
325289 /// </summary>
326- public void DrawShadowMap()
290+ public void DrawShadowMap(GameTime gameTime)
327291 {
328292 //モデルのグラフィックスデバイスのセットアップ
329293 MMDModel.GraphicsSetup(Game.GraphicsDevice, true);
330-
294+ if (DrawModelEvent != null)
295+ DrawModelEvent(Game.GraphicsDevice, gameTime.TotalGameTime.Ticks, true);
296+ if (DrawAccessoryEvent != null)
297+ DrawAccessoryEvent(Game.GraphicsDevice, gameTime.TotalGameTime.Ticks, true);
331298 }
332299 }
333300 }
--- trunk/MikuMikuDanceXNA/Accessory/IScreenManager.cs (nonexistent)
+++ trunk/MikuMikuDanceXNA/Accessory/IScreenManager.cs (revision 284)
@@ -0,0 +1,32 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using Microsoft.Xna.Framework.Graphics;
6+using Microsoft.Xna.Framework;
7+
8+namespace MikuMikuDance.XNA.Accessory
9+{
10+ /// <summary>
11+ /// スクリーンマネージャインターフェイス
12+ /// </summary>
13+ public interface IScreenManager
14+ {
15+ /// <summary>
16+ /// スクリーンを取得する。
17+ /// </summary>
18+ /// <param name="totalTick">GameTime.TotalGameTime.Tickの値</param>
19+ /// <param name="tex">テクスチャ</param>
20+ /// <returns>1フレームの1回目ならtrue、2回目以降ならfalseを返す</returns>
21+ bool GetScreenTex(long totalTick, out Texture2D tex);
22+ /// <summary>
23+ /// スクリーンモード
24+ /// </summary>
25+ /// <remarks>0:Off 1:通常 2:4:3モード</remarks>
26+ int ScreenMode { get; }
27+ /// <summary>
28+ /// スクリーンのズレ修正量
29+ /// </summary>
30+ Vector2 ScreenFix { get; }
31+ }
32+}
--- trunk/MikuMikuDanceXNA/Accessory/MMDAccessory.cs (revision 283)
+++ trunk/MikuMikuDanceXNA/Accessory/MMDAccessory.cs (revision 284)
@@ -12,10 +12,12 @@
1212 /// <summary>
1313 /// MikuMikuDanceのアクセサリデータ
1414 /// </summary>
15- public class MMDAccessory : DrawableGameComponent
15+ public class MMDAccessory : GameComponent
1616 {
1717 internal MMDModel parent = null;
1818 MikuMikuDanceXNA mmd = null;
19+ bool m_bVisible = true;
20+ DrawDelegate drawDelegate;
1921 /// <summary>
2022 /// アクセサリに用いるモデルデータ
2123 /// </summary>
@@ -42,7 +44,26 @@
4244 /// 親クラスのベーストランスフォーム
4345 /// </summary>
4446 internal Matrix BaseTransform { get; set; }
45-
47+ /// <summary>
48+ /// Draw を呼び出す必要があるかどうかを示します。
49+ /// </summary>
50+ public bool Visible
51+ {
52+ get
53+ {
54+ return m_bVisible;
55+ }
56+ set
57+ {
58+ if (m_bVisible != value)
59+ {
60+ if (value)
61+ mmd.DrawModelEvent += drawDelegate;
62+ else
63+ mmd.DrawModelEvent -= drawDelegate;
64+ }
65+ }
66+ }
4667
4768 /// <summary>
4869 /// コンストラクタ
@@ -61,6 +82,8 @@
6182 UseTimeRular = true;
6283 CallDrawSetup = true;
6384 game.Components.Add(this);
85+ drawDelegate = new DrawDelegate(Draw);
86+ mmd.DrawAccessoryEvent += drawDelegate;
6487 //アクセサリの初期設定
6588 foreach (ModelMesh mesh in ModelData.Meshes)
6689 {
@@ -69,10 +92,9 @@
6992 //スクリーン付きのアクセサリかどうか調べる
7093 foreach (var i in effect.Parameters)
7194 {
72- if (i.Name == "Screen")
95+ if (i.Name == "ScreenMode")
7396 {//スクリーン付きなのでフックする
74- effect.Parameters["ScreenMode"].SetValue(0);//最初はScreenはoffにしておく
75- mmd.ScreenHook.Add(effect);
97+ i.SetValue(0);//最初はScreenはoffにしておく
7698 break;
7799 }
78100 }
@@ -80,6 +102,7 @@
80102 }
81103 }
82104 }
105+#if false
83106 /// <summary>
84107 /// デストラクタ処理
85108 /// </summary>
@@ -100,6 +123,8 @@
100123 }
101124 }
102125 }
126+#endif
127+#if false
103128 /// <summary>
104129 /// アクセサリの描画(DrawableGameComponent用
105130 /// </summary>
@@ -119,6 +144,7 @@
119144 //if (parent == null)
120145 Draw(totalTick, true);
121146 }
147+#endif
122148 /// <summary>
123149 /// オブジェクトの描画設定
124150 /// </summary>
@@ -156,9 +182,10 @@
156182 /// <summary>
157183 /// 内部描画ルーチン
158184 /// </summary>
185+ /// <param name="graphics">グラフィックスデバイス</param>
159186 /// <param name="totalTick">GameTime.TotalGameTime.Ticksの値を入れる</param>
160187 /// <param name="IsShadow">シャドウマップ描画時かどうか</param>
161- internal void Draw(long totalTick, bool IsShadow)
188+ internal void Draw(GraphicsDevice graphics, long totalTick, bool IsShadow)
162189 {
163190 if (mmd.TimeRular != null && UseTimeRular)
164191 {
@@ -195,6 +222,16 @@
195222 }
196223 effect.Parameters["DirLight0DiffuseColor"].SetValue(LightColor);
197224 effect.Parameters["World"].SetValue(trueWorld);
225+ if (mmd.ScreenManager != null)
226+ {
227+ Texture2D screen;
228+ if (mmd.ScreenManager.GetScreenTex(totalTick, out screen))
229+ {
230+ effect.Parameters["ScreenMode"].SetValue(mmd.ScreenManager.ScreenMode);
231+ effect.Parameters["Screen"].SetValue(screen);
232+ effect.Parameters["ScreenTexFix"].SetValue(mmd.ScreenManager.ScreenFix);
233+ }
234+ }
198235 }
199236 }
200237 }
--- trunk/MikuMikuDanceXNA/Accessory/ScreenManager.cs (nonexistent)
+++ trunk/MikuMikuDanceXNA/Accessory/ScreenManager.cs (revision 284)
@@ -0,0 +1,172 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using Microsoft.Xna.Framework.Graphics;
6+using Microsoft.Xna.Framework;
7+
8+namespace MikuMikuDance.XNA.Accessory
9+{
10+ /// <summary>
11+ /// 標準スクリーンマネージャクラス
12+ /// </summary>
13+ public class ScreenManager : IScreenManager, IDisposable
14+ {
15+ SpriteBatch spriteBatch;
16+ RenderTarget2D[] targets;
17+ Texture2D texture = null;
18+ int index;
19+ /// <summary>
20+ /// レンダリングターゲット
21+ /// </summary>
22+ public RenderTarget2D RenderTarget { get { return targets[index]; } }
23+
24+ /// <summary>
25+ /// コンストラクタ
26+ /// </summary>
27+ public ScreenManager()
28+ {
29+
30+ }
31+ /// <summary>
32+ /// コンストラクタ
33+ /// </summary>
34+ public ScreenManager(GraphicsDevice graphics)
35+ {
36+ PresentationParameters pp = graphics.PresentationParameters;
37+ Setup(graphics, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat,
38+ pp.MultiSampleType, pp.MultiSampleQuality, 2);
39+ }
40+
41+
42+ /// <summary>
43+ /// レンダリングターゲットを生成
44+ /// </summary>
45+ /// <param name="graphicDevice">グラフィックデバイス</param>
46+ /// <param name="width">幅</param>
47+ /// <param name="height">高さ</param>
48+ /// <param name="numberLevels">ミップマップレベル</param>
49+ /// <param name="format">フォーマット</param>
50+ /// <param name="NumTarget">フリップ数</param>
51+ /// <param name="multiSampleQuality">マルチサンプリングタイプ</param>
52+ /// <param name="multiSampleType">マルチサンプリングクォリティ</param>
53+ public void Setup(GraphicsDevice graphicDevice, int width, int height, int numberLevels,
54+ SurfaceFormat format, MultiSampleType multiSampleType, int multiSampleQuality, int NumTarget)
55+ {
56+ targets = new RenderTarget2D[NumTarget];
57+ for (int i = 0; i < NumTarget; i++)
58+ {
59+ targets[i] = new RenderTarget2D(graphicDevice, width, height, numberLevels, format, multiSampleType, multiSampleQuality);
60+ }
61+ //最終描画用のSpriteBatch作成
62+ spriteBatch = new SpriteBatch(graphicDevice);
63+ }
64+
65+ /// <summary>
66+ /// 使用するレンダリングターゲットを切り替え
67+ /// </summary>
68+ public void Flip()
69+ {
70+ if (++index >= targets.Length)
71+ index = 0;
72+ }
73+
74+ /// <summary>
75+ /// リソースの破棄
76+ /// </summary>
77+ public void Dispose()
78+ {
79+ for (int i = 0; i < targets.Length; ++i)
80+ {
81+ if (targets[i] != null)
82+ {
83+ targets[i].Dispose();
84+ targets[i] = null;
85+ }
86+ }
87+ }
88+ /// <summary>
89+ /// スクリーン用キャプチャの開始
90+ /// </summary>
91+ /// <param name="graphics"></param>
92+ public void Begin(GraphicsDevice graphics)
93+ {
94+ //レンダリングターゲット変更
95+ graphics.SetRenderTarget(0, RenderTarget);
96+ }
97+ /// <summary>
98+ /// スクリーン用キャプチャの終了
99+ /// </summary>
100+ /// <param name="graphics"></param>
101+ public void End(GraphicsDevice graphics)
102+ {
103+ graphics.SetRenderTarget(0, null);
104+ //画面をCornflowerBlue色で消去する
105+ graphics.Clear(Color.White);
106+ //spriteBatchを利用してRenderTargetを画面に書き出し
107+ spriteBatch.Begin(SpriteBlendMode.None,
108+ SpriteSortMode.Immediate,
109+ SaveStateMode.None);
110+ texture = RenderTarget.GetTexture();
111+ spriteBatch.Draw(texture, Vector2.Zero, Color.White);
112+ spriteBatch.End();
113+ IsDrawed = true;
114+ }
115+
116+ #region IScreenManager メンバ
117+ long beforeTick = 0;
118+ bool IsDrawed = false;
119+ int m_ScreenMode = 1;
120+ /// <summary>
121+ /// スクリーンを取得する。
122+ /// </summary>
123+ /// <param name="totalTick">GameTime.TotalGameTime.Tickの値</param>
124+ /// <param name="tex">テクスチャ</param>
125+ /// <returns>1フレームの1回目ならtrue、2回目以降ならfalseを返す</returns>
126+ public bool GetScreenTex(long totalTick, out Texture2D tex)
127+ {
128+ if (targets == null || RenderTarget == null || ScreenMode == 9 || !IsDrawed)
129+ tex = null;
130+ else
131+ tex = texture;
132+ bool result = (totalTick > beforeTick);
133+ if (result)
134+ beforeTick = totalTick;
135+ return result;
136+ }
137+ /// <summary>
138+ /// スクリーンモード
139+ /// </summary>
140+ public int ScreenMode
141+ {
142+ get
143+ {
144+ return (IsDrawed ? m_ScreenMode : 0);
145+ }
146+ set { m_ScreenMode = value; }
147+ }
148+
149+ /// <summary>
150+ /// スクリーンのズレ修正量
151+ /// </summary>
152+ public Vector2 ScreenFix
153+ {
154+ get {
155+ Vector2 result = new Vector2(RenderTarget.Width, RenderTarget.Height);
156+ if (result.X * 3.0f > result.Y * 4.0f)
157+ {
158+ result.X = result.Y * 4.0f / 3.0f / result.X;
159+ result.Y = 1.0f;
160+ }
161+ else
162+ {
163+ result.Y = result.X * 3.0f / 4.0f / result.Y;
164+ result.X = 1.0f;
165+ }
166+ return result;
167+ }
168+ }
169+
170+ #endregion
171+ }
172+}
Show on old repository browser