2 using System.Collections.Generic;
4 using System.Runtime.InteropServices;
6 using System.Diagnostics;
7 using SharpDX.Direct3D9;
11 using Point = System.Drawing.Point;
12 using Rectangle = System.Drawing.Rectangle;
16 internal class CAct演奏BGA : CActivity
18 [StructLayout(LayoutKind.Sequential)]
19 private struct STLAYER
21 public CDTX.CBMP rBMP;
22 public CDTX.CBMPTEX rBMPTEX;
25 public Point pt画像側開始位置;
26 public Point pt画像側終了位置;
27 public Point pt表示側開始位置;
28 public Point pt表示側終了位置;
30 public long n移動開始時刻ms;
33 private CTexture txBGA;
34 private STLAYER[] stLayer = new STLAYER[8];
35 private readonly Size size基準 = new Size( 278, 355 );
42 public void ChangeScope(CChip chip)
44 this.stLayer[chip.nBGALayerSwapIndex].rBMP = chip.rBMP;
45 this.stLayer[chip.nBGALayerSwapIndex].rBMPTEX = chip.rBMPTEX;
48 public void Start(CChip chip, CDTX.CBMP bmp, CDTX.CBMPTEX bmptex, int n開始サイズW, int n開始サイズH, int n終了サイズW, int n終了サイズH, int n画像側開始位置X, int n画像側開始位置Y, int n画像側終了位置X, int n画像側終了位置Y, int n表示側開始位置X, int n表示側開始位置Y, int n表示側終了位置X, int n表示側終了位置Y, int n総移動時間ms, int n移動開始時刻ms = -1)
50 int i = chip.nBGALayerIndex;
51 this.stLayer[i].rBMP = bmp;
52 this.stLayer[i].rBMPTEX = bmptex;
53 this.stLayer[i].sz開始サイズ.Width = n開始サイズW;
54 this.stLayer[i].sz開始サイズ.Height = n開始サイズH;
55 this.stLayer[i].sz終了サイズ.Width = n終了サイズW;
56 this.stLayer[i].sz終了サイズ.Height = n終了サイズH;
57 this.stLayer[i].pt画像側開始位置.X = n画像側開始位置X;
58 this.stLayer[i].pt画像側開始位置.Y = n画像側開始位置Y;
59 this.stLayer[i].pt画像側終了位置.X = n画像側終了位置X;
60 this.stLayer[i].pt画像側終了位置.Y = n画像側終了位置Y;
61 this.stLayer[i].pt表示側開始位置.X = n表示側開始位置X;
62 this.stLayer[i].pt表示側開始位置.Y = n表示側開始位置Y;
63 this.stLayer[i].pt表示側終了位置.X = n表示側終了位置X;
64 this.stLayer[i].pt表示側終了位置.Y = n表示側終了位置Y;
65 this.stLayer[i].n総移動時間ms = n総移動時間ms;
66 this.stLayer[i].n移動開始時刻ms = (n移動開始時刻ms != -1) ? n移動開始時刻ms : CDTXMania.Instance.Timer.n現在時刻;
69 public void SkipStart(int n移動開始時刻ms)
71 for (int i = 0; i < CDTXMania.Instance.DTX.listChip.Count; i++)
73 CChip chip = CDTXMania.Instance.DTX.listChip[i];
74 if (chip.n発声時刻ms > n移動開始時刻ms)
81 if ((chip.rBMP != null) && (chip.rBMP.tx画像 != null))
83 this.Start(chip, chip.rBMP, null, chip.rBMP.n幅, chip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, chip.n発声時刻ms);
88 if ((chip.rBMPTEX != null) && (chip.rBMPTEX.tx画像 != null))
90 this.Start(chip, null, chip.rBMPTEX, chip.rBMPTEX.tx画像.sz画像サイズ.Width, chip.rBMPTEX.tx画像.sz画像サイズ.Height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, chip.n発声時刻ms);
95 if (chip.rBGA != null)
97 this.Start(chip, chip.rBMP, chip.rBMPTEX, chip.rBGA.pt画像側右下座標.X - chip.rBGA.pt画像側左上座標.X, chip.rBGA.pt画像側右下座標.Y - chip.rBGA.pt画像側左上座標.Y, 0, 0, chip.rBGA.pt画像側左上座標.X, chip.rBGA.pt画像側左上座標.Y, 0, 0, chip.rBGA.pt表示座標.X, chip.rBGA.pt表示座標.Y, 0, 0, 0, chip.n発声時刻ms);
101 case EBGAType.BGAPAN:
102 if (chip.rBGAPan != null)
104 this.Start(chip, chip.rBMP, chip.rBMPTEX, chip.rBGAPan.sz開始サイズ.Width, chip.rBGAPan.sz開始サイズ.Height, chip.rBGAPan.sz終了サイズ.Width, chip.rBGAPan.sz終了サイズ.Height, chip.rBGAPan.pt画像側開始位置.X, chip.rBGAPan.pt画像側開始位置.Y, chip.rBGAPan.pt画像側終了位置.X, chip.rBGAPan.pt画像側終了位置.Y, chip.rBGAPan.pt表示側開始位置.X, chip.rBGAPan.pt表示側開始位置.Y, chip.rBGAPan.pt表示側終了位置.X, chip.rBGAPan.pt表示側終了位置.Y, chip.n総移動時間, chip.n発声時刻ms);
113 for (int i = 0; i < 8; i++)
115 this.stLayer[i].n移動開始時刻ms = -1;
119 public override void On活性化()
121 for (int i = 0; i < 8; i++)
123 STLAYER stlayer2 = new STLAYER();
124 STLAYER stlayer = stlayer2;
126 stlayer.rBMPTEX = null;
127 stlayer.n移動開始時刻ms = -1;
128 this.stLayer[i] = stlayer;
133 public override void OnUnmanagedリソースの作成()
137 using( Surface surface = CDTXMania.Instance.Device.GetBackBuffer( 0, 0 ) )
141 var format = Format.A8R8G8B8;
142 switch( surface.Description.Format ) // バックバッファ用フォーマットで X を持つのはこれだけ。
144 case Format.X4R4G4B4: format = Format.A4R4G4B4; break;
145 case Format.X8B8G8R8: format = Format.A8R8G8B8; break;
146 case Format.X8R8G8B8: format = Format.A8R8G8B8; break;
149 this.txBGA = new CTexture( CDTXMania.Instance.Device,
157 txBGA.vc拡大縮小倍率 = new Vector3(
158 (float) CDTXMania.Instance.Coordinates.Movie.W / size基準.Width,
159 (float) CDTXMania.Instance.Coordinates.Movie.H / size基準.Height,
164 Trace.TraceError( "CAct演奏BGA: Error: ( " + e.Message + " )" );
167 base.OnUnmanagedリソースの作成();
171 public override void OnUnmanagedリソースの解放()
175 if( this.txBGA != null )
177 this.txBGA.Dispose();
180 base.OnUnmanagedリソースの解放();
184 public override int On進行描画()
186 if (b活性化してる && CDTXMania.Instance.ConfigIni.bBGA && !CDTXMania.Instance.ConfigIni.bStoicMode)
188 // (1) txBGA をレンダーターゲットにして、BGA を描画する。
190 using( Surface sfBackBuffer = CDTXMania.Instance.Device.GetRenderTarget( 0 ) )
192 using( Surface sfBGA = txBGA.texture.GetSurfaceLevel( 0 ) )
194 CDTXMania.Instance.Device.SetRenderTarget( 0, sfBGA );
195 CDTXMania.Instance.Device.Clear( ClearFlags.Target, new ColorBGRA( (int) 0 ), 0f, 0 );
197 for( int i = 0; i < 8; i++ )
199 #region [ レイヤー i の描画 ]
200 if( ( ( ( this.stLayer[ i ].n移動開始時刻ms != -1 ) && ( ( this.stLayer[ i ].rBMP != null ) || ( this.stLayer[ i ].rBMPTEX != null ) ) ) ) &&
201 ( ( ( this.stLayer[ i ].rBMP == null ) || ( this.stLayer[ i ].rBMP.bUse && ( this.stLayer[ i ].rBMP.tx画像 != null ) ) ) &&
202 ( ( ( this.stLayer[ i ].rBMPTEX == null ) || ( this.stLayer[ i ].rBMPTEX.bUse && ( this.stLayer[ i ].rBMPTEX.tx画像 != null ) ) ) ) ) )
204 Size sizeStart = this.stLayer[ i ].sz開始サイズ;
205 Size sizeEnd = this.stLayer[ i ].sz終了サイズ;
206 Point ptImgStart = this.stLayer[ i ].pt画像側開始位置;
207 Point ptImgEnd = this.stLayer[ i ].pt画像側終了位置;
208 Point ptDispStart = this.stLayer[ i ].pt表示側開始位置;
209 Point ptDispEnd = this.stLayer[ i ].pt表示側終了位置;
210 long timeTotal = this.stLayer[ i ].n総移動時間ms;
211 long timeMoveStart = this.stLayer[ i ].n移動開始時刻ms;
213 if( CDTXMania.Instance.Timer.n現在時刻 < timeMoveStart )
215 timeMoveStart = CDTXMania.Instance.Timer.n現在時刻;
218 Size sizeBMP = new Size(
219 ( this.stLayer[ i ].rBMP != null ) ? this.stLayer[ i ].rBMP.n幅 : this.stLayer[ i ].rBMPTEX.tx画像.sz画像サイズ.Width,
220 ( this.stLayer[ i ].rBMP != null ) ? this.stLayer[ i ].rBMP.n高さ : this.stLayer[ i ].rBMPTEX.tx画像.sz画像サイズ.Height );
222 int n再生位置 = (int) ( ( CDTXMania.Instance.Timer.n現在時刻 - timeMoveStart ) * ( ( (double) CDTXMania.Instance.ConfigIni.nPlaySpeed ) / 20.0 ) );
224 if( ( timeTotal != 0 ) && ( timeTotal < n再生位置 ) )
226 this.stLayer[ i ].pt画像側開始位置 = ptImgStart = ptImgEnd;
227 this.stLayer[ i ].pt表示側開始位置 = ptDispStart = ptDispEnd;
228 this.stLayer[ i ].sz開始サイズ = sizeStart = sizeEnd;
229 this.stLayer[ i ].n総移動時間ms = timeTotal = 0;
232 Rectangle rect画像側 = new Rectangle();
233 Rectangle rect表示側 = new Rectangle();
237 rect画像側.X = ptImgStart.X;
238 rect画像側.Y = ptImgStart.Y;
239 rect画像側.Width = sizeStart.Width;
240 rect画像側.Height = sizeStart.Height;
241 rect表示側.X = ptDispStart.X;
242 rect表示側.Y = ptDispStart.Y;
243 rect表示側.Width = sizeStart.Width;
244 rect表示側.Height = sizeStart.Height;
248 double coefSizeWhileMoving = ( (double) n再生位置 ) / ( (double) timeTotal );
249 Size sizeWhileMoving = new Size(
250 sizeStart.Width + ( (int) ( ( sizeEnd.Width - sizeStart.Width ) * coefSizeWhileMoving ) ),
251 sizeStart.Height + ( (int) ( ( sizeEnd.Height - sizeStart.Height ) * coefSizeWhileMoving ) ) );
252 rect画像側.X = ptImgStart.X + ( (int) ( ( ptImgEnd.X - ptImgStart.X ) * coefSizeWhileMoving ) );
253 rect画像側.Y = ptImgStart.Y + ( (int) ( ( ptImgEnd.Y - ptImgStart.Y ) * coefSizeWhileMoving ) );
254 rect画像側.Width = sizeWhileMoving.Width;
255 rect画像側.Height = sizeWhileMoving.Height;
256 rect表示側.X = ptDispStart.X + ( (int) ( ( ptDispEnd.X - ptDispStart.X ) * coefSizeWhileMoving ) );
257 rect表示側.Y = ptDispStart.Y + ( (int) ( ( ptDispEnd.Y - ptDispStart.Y ) * coefSizeWhileMoving ) );
258 rect表示側.Width = sizeWhileMoving.Width;
259 rect表示側.Height = sizeWhileMoving.Height;
263 ( rect画像側.Right > 0 ) &&
264 ( rect画像側.Bottom > 0 ) &&
265 ( rect画像側.Left < sizeBMP.Width ) &&
266 ( rect画像側.Top < sizeBMP.Height ) &&
267 ( rect表示側.Right > 0 ) &&
268 ( rect表示側.Bottom > 0 ) &&
269 ( rect表示側.Left < size基準.Width ) &&
270 ( rect表示側.Top < size基準.Height )
273 #region " 画像側の表示指定が画像の境界をまたいでいる場合補正 "
277 rect表示側.Width -= -rect画像側.X;
278 rect表示側.X += -rect画像側.X;
279 rect画像側.Width -= -rect画像側.X;
284 rect表示側.Height -= -rect画像側.Y;
285 rect表示側.Y += -rect画像側.Y;
286 rect画像側.Height -= -rect画像側.Y;
289 if( rect画像側.Right > sizeBMP.Width )
291 rect表示側.Width -= rect画像側.Right - sizeBMP.Width;
292 rect画像側.Width -= rect画像側.Right - sizeBMP.Width;
294 if( rect画像側.Bottom > sizeBMP.Height )
296 rect表示側.Height -= rect画像側.Bottom - sizeBMP.Height;
297 rect画像側.Height -= rect画像側.Bottom - sizeBMP.Height;
302 #region " 表示側の表示指定が表示域の境界をまたいでいる場合補正 "
306 rect画像側.Width -= -rect表示側.X;
307 rect画像側.X += -rect表示側.X;
308 rect表示側.Width -= rect表示側.X;
313 rect画像側.Height -= -rect表示側.Y;
314 rect画像側.Y += -rect表示側.Y;
315 rect表示側.Height -= -rect表示側.Y;
318 if( rect表示側.Right > size基準.Width )
320 rect画像側.Width -= rect表示側.Right - size基準.Width;
321 rect表示側.Width -= rect表示側.Right - size基準.Width;
323 if( rect表示側.Bottom > size基準.Height )
325 rect画像側.Height -= rect表示側.Bottom - size基準.Height;
326 rect表示側.Height -= rect表示側.Bottom - size基準.Height;
332 ( rect画像側.Width > 0 ) &&
333 ( rect画像側.Height > 0 ) &&
334 ( rect表示側.Width > 0 ) &&
335 ( rect表示側.Height > 0 ) &&
337 ( rect画像側.Right >= 0 ) &&
338 ( rect画像側.Bottom >= 0 ) &&
339 ( rect画像側.Left <= sizeBMP.Width ) &&
340 ( rect画像側.Top <= sizeBMP.Height ) &&
341 ( rect表示側.Right >= 0 ) &&
342 ( rect表示側.Bottom >= 0 ) &&
343 ( rect表示側.Left <= size基準.Width ) &&
344 ( rect表示側.Top <= size基準.Height )
348 if( this.stLayer[ i ].rBMP != null )
350 tex = this.stLayer[ i ].rBMP.tx画像;
352 else if( this.stLayer[ i ].rBMPTEX != null )
354 tex = this.stLayer[ i ].rBMPTEX.tx画像;
358 //if( CDTXMania.Instance.DTX != null && !CDTXMania.Instance.DTX.bUse556x710BGAAVI )
360 // tex.vc拡大縮小倍率.X = 2.0f;
361 // tex.vc拡大縮小倍率.Y = 2.0f;
362 // tex.vc拡大縮小倍率.Z = 1.0f;
365 tex.t2D描画( CDTXMania.Instance.Device, rect表示側.X, rect表示側.Y, rect画像側 );
373 // レンダーターゲットをバックバッファに戻す。
374 CDTXMania.Instance.Device.SetRenderTarget( 0, sfBackBuffer );
378 // (2) バックバッファに txBGA を描画する。
380 int x = CDTXMania.Instance.ConfigIni.cdMovieX[ CDTXMania.Instance.ConfigIni.eActiveInst ];
381 int y = CDTXMania.Instance.ConfigIni.cdMovieY[ CDTXMania.Instance.ConfigIni.eActiveInst ];
383 txBGA.t2D描画( CDTXMania.Instance.Device, x, y );