スクリーンの描画処理をスクリーンマネージャにまとめた
@@ -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 | -} |
@@ -38,10 +38,9 @@ | ||
38 | 38 | MMDBakedMotion motion; |
39 | 39 | //MMDアクセサリデータ |
40 | 40 | MMDAccessory stage, negi; |
41 | - //レンダリングターゲット(screen用) | |
42 | - FlipRenderTarget2D renderTarget; | |
43 | - SpriteBatch spriteBatch; | |
44 | - | |
41 | + //スクリーンマネージャ | |
42 | + ScreenManager screenManager; | |
43 | + | |
45 | 44 | public Game1() |
46 | 45 | { |
47 | 46 | //デバイスがMMDXの必要条件を満たしているかチェック |
@@ -83,13 +82,10 @@ | ||
83 | 82 | //モーションを0番トラックにセットする |
84 | 83 | model.Player.SetMotion(0, motion, true); |
85 | 84 | |
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; | |
93 | 89 | } |
94 | 90 | |
95 | 91 | /// <summary> |
@@ -141,13 +137,13 @@ | ||
141 | 137 | { |
142 | 138 | //Draw処理ではスクリーン処理を行う(この処理は自前で行う必要がある) |
143 | 139 | //基本的な流れは |
144 | - //1.レンダリングターゲットを別に用意する | |
145 | - //2.それに全てを書き込む | |
146 | - //3.レンダリングターゲットをスクリーンにセットする | |
147 | - //4.レンダリングターゲットをスプライトバッチを元に画面に書き出す | |
140 | + //1.スクリーンマネージャのbeginを呼び出す | |
141 | + //2.base.Drawや他の描画を呼び出して書き込む | |
142 | + //3.スクリーンマネージャのendを呼び出す | |
143 | + //4.スクリーンマネージャをフリップする | |
148 | 144 | |
149 | - //レンダリングターゲットセット(スクリーン用テクスチャキャプチャ用) | |
150 | - GraphicsDevice.SetRenderTarget(0, renderTarget.RenderTareget); | |
145 | + //スクリーン用キャプチャ開始 | |
146 | + screenManager.Begin(GraphicsDevice); | |
151 | 147 | //画面をWhite色で消去する |
152 | 148 | GraphicsDevice.Clear(Color.White); |
153 | 149 |
@@ -156,19 +152,9 @@ | ||
156 | 152 | |
157 | 153 | //XNA内部のDraw処理を行う |
158 | 154 | 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(); | |
172 | 158 | //spriteBatchでシーンが荒れているので元に戻すコード(SaveStateMode.SaveStateを使わないのはひにけにXNA(http://blogs.msdn.com/ito/archive/2007/03/13/spritebatch-part2.aspx)を参照) |
173 | 159 | //MMDXでは各モデル、アクセサリ描画前に自動で設定するコードを書いているので、自動で戻ります。 |
174 | 160 | #if false |
@@ -178,9 +164,6 @@ | ||
178 | 164 | GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap; |
179 | 165 | GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap; |
180 | 166 | #endif |
181 | - | |
182 | - //フリップ | |
183 | - renderTarget.Flip(); | |
184 | 167 | } |
185 | 168 | } |
186 | 169 | } |
@@ -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 | -} |
@@ -15,7 +15,6 @@ | ||
15 | 15 | using MikuMikuDance.XNA.Model; |
16 | 16 | using MikuMikuDance.XNA.Motion; |
17 | 17 | using MikuMikuDance.XNA.ShadowMap; |
18 | -using MikuMikuDanceXNADemo4; | |
19 | 18 | |
20 | 19 | namespace MikuMikuDanceXNADemo6 |
21 | 20 | { |
@@ -36,9 +35,8 @@ | ||
36 | 35 | MMDBakedMotion motion; |
37 | 36 | //MMDアクセサリデータ |
38 | 37 | MMDAccessory stage, negi; |
39 | - //レンダリングターゲット(screen用) | |
40 | - FlipRenderTarget2D renderTarget; | |
41 | - SpriteBatch spriteBatch; | |
38 | + //スクリーンマネージャ | |
39 | + ScreenManager screen; | |
42 | 40 | //シャドウマップマネージャ |
43 | 41 | PerspectiveShadowMap shadow; |
44 | 42 | //LispShadowMap shadow; |
@@ -84,13 +82,10 @@ | ||
84 | 82 | //モーションを0番トラックにセットする |
85 | 83 | model.Player.SetMotion(0, motion, true); |
86 | 84 | |
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; | |
94 | 89 | //シャドウマップマネージャの作成 |
95 | 90 | //シャドウマップマネージャはシャドウマップの管理を行う |
96 | 91 | shadow = new PerspectiveShadowMap(graphics.GraphicsDevice); |
@@ -161,14 +156,14 @@ | ||
161 | 156 | shadow.BeginShadowMap(graphics.GraphicsDevice); |
162 | 157 | GraphicsDevice.Clear(Color.White); |
163 | 158 | //3Dオブジェクトのシャドウマップ描画 |
164 | - model.DrawShadowMap(gameTime.TotalGameTime.Ticks); | |
165 | - stage.DrawShadowMap(gameTime.TotalGameTime.Ticks); | |
166 | - //モデルが保持アクセサリはシャドウマップを描画する必要はない | |
159 | + mmd.DrawShadowMap(gameTime); | |
167 | 160 | |
168 | 161 | //その他のモデルに付いてシャドウマップを書く場合はここに記述 |
169 | 162 | |
170 | - //シャドウマップの終了&スクリーンキャプチャ用のレンダリングターゲットセット | |
171 | - shadow.EndShadowMap(renderTarget.RenderTareget, graphics.GraphicsDevice); | |
163 | + //シャドウマップの終了 | |
164 | + shadow.EndShadowMap(graphics.GraphicsDevice); | |
165 | + //スクリーンマネージャの開始 | |
166 | + screen.Begin(graphics.GraphicsDevice); | |
172 | 167 | //画面をWhite色で消去する |
173 | 168 | GraphicsDevice.Clear(Color.White); |
174 | 169 |
@@ -177,19 +172,8 @@ | ||
177 | 172 | |
178 | 173 | //XNA内部のDraw処理を行う |
179 | 174 | 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(); | |
193 | 177 | //spriteBatchでシーンが荒れているので元に戻すコード(SaveStateMode.SaveStateを使わないのはひにけにXNA(http://blogs.msdn.com/ito/archive/2007/03/13/spritebatch-part2.aspx)を参照) |
194 | 178 | //MMDXでは各モデル、アクセサリ描画前に自動で設定するコードを書いているので、自動で戻ります。 |
195 | 179 | #if false |
@@ -199,9 +183,6 @@ | ||
199 | 183 | GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap; |
200 | 184 | GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap; |
201 | 185 | #endif |
202 | - | |
203 | - //フリップ | |
204 | - renderTarget.Flip(); | |
205 | 186 | } |
206 | 187 | } |
207 | 188 | } |
@@ -401,7 +401,7 @@ | ||
401 | 401 | continue;//境界線は2メッシュ目。描画しないときは飛ばす |
402 | 402 | foreach (Effect effect in mesh.Effects)//メモ:エフェクト17回ループで処理時間食ってる |
403 | 403 | { |
404 | - //エフェクトルーチン。 | |
404 | + //エフェクト設定 | |
405 | 405 | //ボーン設定 |
406 | 406 | if (rotationTexture != null) |
407 | 407 | { |
@@ -491,27 +491,10 @@ | ||
491 | 491 | { |
492 | 492 | Matrix baseMat = BoneManager.GetWorldQuatTransform(BoneManager.IndexOf(acc.Value.BoneName)).CreateMatrix(); |
493 | 493 | 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 | - }*/ | |
499 | 494 | } |
500 | 495 | } |
501 | 496 | } |
502 | 497 | } |
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 | - } | |
515 | 498 | #endregion |
516 | 499 | } |
517 | 500 | } |
@@ -39,9 +39,7 @@ | ||
39 | 39 | #else |
40 | 40 | internal readonly int NumThread; |
41 | 41 | #endif |
42 | - //スクリーン表示用にフックされたエフェクト | |
43 | - internal List<Effect> ScreenHook = new List<Effect>(); | |
44 | - | |
42 | + | |
45 | 43 | //properties... |
46 | 44 | /// <summary> |
47 | 45 | /// MikuMikuDance for XNAで用いるコンテンツマネージャ |
@@ -64,6 +62,10 @@ | ||
64 | 62 | /// </summary> |
65 | 63 | public IShadowMapManager ShadowMapManager { get; set; } |
66 | 64 | /// <summary> |
65 | + /// スクリーンマネージャ | |
66 | + /// </summary> | |
67 | + public IScreenManager ScreenManager { get; set; } | |
68 | + /// <summary> | |
67 | 69 | /// 物理演算を使用フラグ |
68 | 70 | /// </summary> |
69 | 71 | /// <remarks>物理演算完成までデフォルトはfalse</remarks> |
@@ -270,64 +272,29 @@ | ||
270 | 272 | return result;*/ |
271 | 273 | } |
272 | 274 | /// <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> | |
311 | 275 | /// MMD関連オブジェクトの描画 |
312 | 276 | /// </summary> |
313 | 277 | /// <param name="gameTime"></param> |
314 | 278 | public override void Draw(GameTime gameTime) |
315 | 279 | { |
316 | - | |
317 | 280 | //モデル用のグラフィックスデバイスのセットアップ |
318 | 281 | MMDModel.GraphicsSetup(Game.GraphicsDevice, false); |
319 | 282 | if (DrawModelEvent != null) |
320 | 283 | DrawModelEvent(Game.GraphicsDevice, gameTime.TotalGameTime.Ticks, false); |
321 | - | |
284 | + if (DrawAccessoryEvent != null) | |
285 | + DrawAccessoryEvent(Game.GraphicsDevice, gameTime.TotalGameTime.Ticks, false); | |
322 | 286 | } |
323 | 287 | /// <summary> |
324 | 288 | /// MMD関連オブジェクトのシャドウマップ描画 |
325 | 289 | /// </summary> |
326 | - public void DrawShadowMap() | |
290 | + public void DrawShadowMap(GameTime gameTime) | |
327 | 291 | { |
328 | 292 | //モデルのグラフィックスデバイスのセットアップ |
329 | 293 | 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); | |
331 | 298 | } |
332 | 299 | } |
333 | 300 | } |
@@ -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 | +} |
@@ -12,10 +12,12 @@ | ||
12 | 12 | /// <summary> |
13 | 13 | /// MikuMikuDanceのアクセサリデータ |
14 | 14 | /// </summary> |
15 | - public class MMDAccessory : DrawableGameComponent | |
15 | + public class MMDAccessory : GameComponent | |
16 | 16 | { |
17 | 17 | internal MMDModel parent = null; |
18 | 18 | MikuMikuDanceXNA mmd = null; |
19 | + bool m_bVisible = true; | |
20 | + DrawDelegate drawDelegate; | |
19 | 21 | /// <summary> |
20 | 22 | /// アクセサリに用いるモデルデータ |
21 | 23 | /// </summary> |
@@ -42,7 +44,26 @@ | ||
42 | 44 | /// 親クラスのベーストランスフォーム |
43 | 45 | /// </summary> |
44 | 46 | 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 | + } | |
46 | 67 | |
47 | 68 | /// <summary> |
48 | 69 | /// コンストラクタ |
@@ -61,6 +82,8 @@ | ||
61 | 82 | UseTimeRular = true; |
62 | 83 | CallDrawSetup = true; |
63 | 84 | game.Components.Add(this); |
85 | + drawDelegate = new DrawDelegate(Draw); | |
86 | + mmd.DrawAccessoryEvent += drawDelegate; | |
64 | 87 | //アクセサリの初期設定 |
65 | 88 | foreach (ModelMesh mesh in ModelData.Meshes) |
66 | 89 | { |
@@ -69,10 +92,9 @@ | ||
69 | 92 | //スクリーン付きのアクセサリかどうか調べる |
70 | 93 | foreach (var i in effect.Parameters) |
71 | 94 | { |
72 | - if (i.Name == "Screen") | |
95 | + if (i.Name == "ScreenMode") | |
73 | 96 | {//スクリーン付きなのでフックする |
74 | - effect.Parameters["ScreenMode"].SetValue(0);//最初はScreenはoffにしておく | |
75 | - mmd.ScreenHook.Add(effect); | |
97 | + i.SetValue(0);//最初はScreenはoffにしておく | |
76 | 98 | break; |
77 | 99 | } |
78 | 100 | } |
@@ -80,6 +102,7 @@ | ||
80 | 102 | } |
81 | 103 | } |
82 | 104 | } |
105 | +#if false | |
83 | 106 | /// <summary> |
84 | 107 | /// デストラクタ処理 |
85 | 108 | /// </summary> |
@@ -100,6 +123,8 @@ | ||
100 | 123 | } |
101 | 124 | } |
102 | 125 | } |
126 | +#endif | |
127 | +#if false | |
103 | 128 | /// <summary> |
104 | 129 | /// アクセサリの描画(DrawableGameComponent用 |
105 | 130 | /// </summary> |
@@ -119,6 +144,7 @@ | ||
119 | 144 | //if (parent == null) |
120 | 145 | Draw(totalTick, true); |
121 | 146 | } |
147 | +#endif | |
122 | 148 | /// <summary> |
123 | 149 | /// オブジェクトの描画設定 |
124 | 150 | /// </summary> |
@@ -156,9 +182,10 @@ | ||
156 | 182 | /// <summary> |
157 | 183 | /// 内部描画ルーチン |
158 | 184 | /// </summary> |
185 | + /// <param name="graphics">グラフィックスデバイス</param> | |
159 | 186 | /// <param name="totalTick">GameTime.TotalGameTime.Ticksの値を入れる</param> |
160 | 187 | /// <param name="IsShadow">シャドウマップ描画時かどうか</param> |
161 | - internal void Draw(long totalTick, bool IsShadow) | |
188 | + internal void Draw(GraphicsDevice graphics, long totalTick, bool IsShadow) | |
162 | 189 | { |
163 | 190 | if (mmd.TimeRular != null && UseTimeRular) |
164 | 191 | { |
@@ -195,6 +222,16 @@ | ||
195 | 222 | } |
196 | 223 | effect.Parameters["DirLight0DiffuseColor"].SetValue(LightColor); |
197 | 224 | 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 | + } | |
198 | 235 | } |
199 | 236 | } |
200 | 237 | } |
@@ -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 | +} |