public long n移動開始時刻ms;\r
}\r
\r
- private Surface sfBackBuffer;\r
+ private CTexture txBGA;\r
private STLAYER[] stLayer = new STLAYER[8];\r
+ private readonly Size size基準 = new Size( 278, 355 );\r
\r
public CAct演奏BGA()\r
{\r
this.stLayer[i].pt画像側開始位置.Y = n画像側開始位置Y;\r
this.stLayer[i].pt画像側終了位置.X = n画像側終了位置X;\r
this.stLayer[i].pt画像側終了位置.Y = n画像側終了位置Y;\r
- this.stLayer[i].pt表示側開始位置.X = n表示側開始位置X * 2;\r
- this.stLayer[i].pt表示側開始位置.Y = n表示側開始位置Y * 2;\r
- this.stLayer[i].pt表示側終了位置.X = n表示側終了位置X * 2;\r
- this.stLayer[i].pt表示側終了位置.Y = n表示側終了位置Y * 2;\r
+ this.stLayer[i].pt表示側開始位置.X = n表示側開始位置X;\r
+ this.stLayer[i].pt表示側開始位置.Y = n表示側開始位置Y;\r
+ this.stLayer[i].pt表示側終了位置.X = n表示側終了位置X;\r
+ this.stLayer[i].pt表示側終了位置.Y = n表示側終了位置Y;\r
this.stLayer[i].n総移動時間ms = n総移動時間ms;\r
this.stLayer[i].n移動開始時刻ms = (n移動開始時刻ms != -1) ? n移動開始時刻ms : CDTXMania.Instance.Timer.n現在時刻;\r
}\r
\r
public override void OnManagedリソースの作成()\r
{\r
- if (!base.b活性化してない)\r
+ if (base.b活性化してる)\r
{\r
using (Surface surface = CDTXMania.Instance.Device.GetBackBuffer(0, 0))\r
{\r
try\r
{\r
- this.sfBackBuffer = Surface.CreateOffscreenPlain(CDTXMania.Instance.Device, surface.Description.Width, surface.Description.Height, surface.Description.Format, Pool.SystemMemory);\r
+ this.txBGA = new CTexture( CDTXMania.Instance.Device,\r
+ size基準.Width,\r
+ size基準.Height,\r
+ surface.Description.Format,\r
+ Pool.Default,\r
+ Usage.RenderTarget );\r
+\r
+ txBGA.vc拡大縮小倍率 = new Vector3(\r
+ (float) CDTXMania.Instance.Coordinates.Movie.W / size基準.Width,\r
+ (float) CDTXMania.Instance.Coordinates.Movie.H / size基準.Height,\r
+ 1f );\r
}\r
catch (Exception e)\r
{\r
\r
public override void OnManagedリソースの解放()\r
{\r
- if (!base.b活性化してない)\r
+ if (base.b活性化してる)\r
{\r
- if (this.sfBackBuffer != null)\r
+ if (this.txBGA != null)\r
{\r
- this.sfBackBuffer.Dispose();\r
- this.sfBackBuffer = null;\r
+ this.txBGA.Dispose();\r
+ this.txBGA = null;\r
}\r
base.OnManagedリソースの解放();\r
}\r
{\r
if (b活性化してる && CDTXMania.Instance.ConfigIni.bBGA && !CDTXMania.Instance.ConfigIni.bStoicMode)\r
{\r
- int x = CDTXMania.Instance.ConfigIni.cdMovieX[CDTXMania.Instance.ConfigIni.eActiveInst];\r
- int y = CDTXMania.Instance.ConfigIni.cdMovieY[CDTXMania.Instance.ConfigIni.eActiveInst];\r
- using (Bitmap bmp = new Bitmap(CDTXMania.Instance.Coordinates.Movie.W, CDTXMania.Instance.Coordinates.Movie.H))\r
+ // (1) txBGA をレンダーターゲットにして、BGA を描画する。\r
+\r
+ using( Surface sfBackBuffer = CDTXMania.Instance.Device.GetRenderTarget( 0 ) )\r
{\r
- for (int i = 0; i < 8; i++)\r
+ using( Surface sfBGA = txBGA.texture.GetSurfaceLevel( 0 ) )\r
{\r
- if (((this.stLayer[i].n移動開始時刻ms != -1) && ((this.stLayer[i].rBMP != null) || (this.stLayer[i].rBMPTEX != null))) && (((this.stLayer[i].rBMP == null) || (this.stLayer[i].rBMP.bUse && (this.stLayer[i].rBMP.tx画像 != null))) && ((this.stLayer[i].rBMPTEX == null) || (this.stLayer[i].rBMPTEX.bUse && (this.stLayer[i].rBMPTEX.tx画像 != null)))))\r
+ CDTXMania.Instance.Device.SetRenderTarget( 0, sfBGA );\r
+ CDTXMania.Instance.Device.Clear( ClearFlags.Target, new ColorBGRA( (int) 0 ), 0f, 0 );\r
+\r
+ for( int i = 0; i < 8; i++ )\r
{\r
- Size sizeStart = this.stLayer[i].sz開始サイズ;\r
- Size sizeEnd = this.stLayer[i].sz終了サイズ;\r
- Point ptImgStart = this.stLayer[i].pt画像側開始位置;\r
- Point ptImgEnd = this.stLayer[i].pt画像側終了位置;\r
- Point ptDispStart = this.stLayer[i].pt表示側開始位置;\r
- Point ptDispEnd = this.stLayer[i].pt表示側終了位置;\r
- long timeTotal = this.stLayer[i].n総移動時間ms;\r
- long timeMoveStart = this.stLayer[i].n移動開始時刻ms;\r
-\r
- if (CDTXMania.Instance.Timer.n現在時刻 < timeMoveStart)\r
+ #region [ レイヤー i の描画 ]\r
+ if( ( ( ( this.stLayer[ i ].n移動開始時刻ms != -1 ) && ( ( this.stLayer[ i ].rBMP != null ) || ( this.stLayer[ i ].rBMPTEX != null ) ) ) ) &&\r
+ ( ( ( this.stLayer[ i ].rBMP == null ) || ( this.stLayer[ i ].rBMP.bUse && ( this.stLayer[ i ].rBMP.tx画像 != null ) ) ) &&\r
+ ( ( ( this.stLayer[ i ].rBMPTEX == null ) || ( this.stLayer[ i ].rBMPTEX.bUse && ( this.stLayer[ i ].rBMPTEX.tx画像 != null ) ) ) ) ) )\r
{\r
- timeMoveStart = CDTXMania.Instance.Timer.n現在時刻;\r
- }\r
- // Size size3 = new Size( 0x116, 0x163 );\r
- Size size表示域 = new Size(278 * 2, 355 * 2);\r
- // chnrm0 : #34192\r
- // 表示域を2倍に変更した。\r
- // x,yについては次のように変更した。\r
- // 338,57 => 1014+139,128 (Dr.) 139は278の半分で、GR領域の中央によせるためにすこし右側にずらした。\r
- // 181,50 => 682, 112 (Gt.)\r
- Size sizeBMP = new Size(\r
- (this.stLayer[i].rBMP != null) ? this.stLayer[i].rBMP.n幅 : this.stLayer[i].rBMPTEX.tx画像.sz画像サイズ.Width,\r
- (this.stLayer[i].rBMP != null) ? this.stLayer[i].rBMP.n高さ : this.stLayer[i].rBMPTEX.tx画像.sz画像サイズ.Height);\r
-\r
- int n再生位置 = (int)((CDTXMania.Instance.Timer.n現在時刻 - timeMoveStart) * (((double)CDTXMania.Instance.ConfigIni.nPlaySpeed) / 20.0));\r
-\r
- if ((timeTotal != 0) && (timeTotal < n再生位置))\r
- {\r
- this.stLayer[i].pt画像側開始位置 = ptImgStart = ptImgEnd;\r
- this.stLayer[i].pt表示側開始位置 = ptDispStart = ptDispEnd;\r
- this.stLayer[i].sz開始サイズ = sizeStart = sizeEnd;\r
- this.stLayer[i].n総移動時間ms = timeTotal = 0;\r
- }\r
+ Size sizeStart = this.stLayer[ i ].sz開始サイズ;\r
+ Size sizeEnd = this.stLayer[ i ].sz終了サイズ;\r
+ Point ptImgStart = this.stLayer[ i ].pt画像側開始位置;\r
+ Point ptImgEnd = this.stLayer[ i ].pt画像側終了位置;\r
+ Point ptDispStart = this.stLayer[ i ].pt表示側開始位置;\r
+ Point ptDispEnd = this.stLayer[ i ].pt表示側終了位置;\r
+ long timeTotal = this.stLayer[ i ].n総移動時間ms;\r
+ long timeMoveStart = this.stLayer[ i ].n移動開始時刻ms;\r
\r
- Rectangle rect画像側 = new Rectangle();\r
- Rectangle rect表示側 = new Rectangle();\r
-\r
- if (timeTotal == 0)\r
- {\r
- rect画像側.X = ptImgStart.X;\r
- rect画像側.Y = ptImgStart.Y;\r
- rect画像側.Width = sizeStart.Width;\r
- rect画像側.Height = sizeStart.Height;\r
- rect表示側.X = ptDispStart.X;\r
- rect表示側.Y = ptDispStart.Y;\r
- rect表示側.Width = sizeStart.Width;\r
- rect表示側.Height = sizeStart.Height;\r
- }\r
- else\r
- {\r
- double coefSizeWhileMoving = ((double)n再生位置) / ((double)timeTotal);\r
- Size sizeWhileMoving = new Size(sizeStart.Width + ((int)((sizeEnd.Width - sizeStart.Width) * coefSizeWhileMoving)), sizeStart.Height + ((int)((sizeEnd.Height - sizeStart.Height) * coefSizeWhileMoving)));\r
- rect画像側.X = ptImgStart.X + ((int)((ptImgEnd.X - ptImgStart.X) * coefSizeWhileMoving));\r
- rect画像側.Y = ptImgStart.Y + ((int)((ptImgEnd.Y - ptImgStart.Y) * coefSizeWhileMoving));\r
- rect画像側.Width = sizeWhileMoving.Width;\r
- rect画像側.Height = sizeWhileMoving.Height;\r
- rect表示側.X = ptDispStart.X + ((int)((ptDispEnd.X - ptDispStart.X) * coefSizeWhileMoving));\r
- rect表示側.Y = ptDispStart.Y + ((int)((ptDispEnd.Y - ptDispStart.Y) * coefSizeWhileMoving));\r
- rect表示側.Width = sizeWhileMoving.Width * 2;\r
- rect表示側.Height = sizeWhileMoving.Height * 2;\r
- }\r
- if (\r
- (rect画像側.Right > 0) &&\r
- (rect画像側.Bottom > 0) &&\r
- (rect画像側.Left < sizeBMP.Width) &&\r
- (rect画像側.Top < sizeBMP.Height) &&\r
- (rect表示側.Right > 0) &&\r
- (rect表示側.Bottom > 0) &&\r
- (rect表示側.Left < size表示域.Width) &&\r
- (rect表示側.Top < size表示域.Height)\r
- )\r
- {\r
- // 画像側の表示指定が画像の境界をまたいでいる場合補正\r
- if (rect画像側.X < 0)\r
+ if( CDTXMania.Instance.Timer.n現在時刻 < timeMoveStart )\r
{\r
- rect表示側.Width -= -rect画像側.X;\r
- rect表示側.X += -rect画像側.X;\r
- rect画像側.Width -= -rect画像側.X;\r
- rect画像側.X = 0;\r
- }\r
- if (rect画像側.Y < 0)\r
- {\r
- rect表示側.Height -= -rect画像側.Y;\r
- rect表示側.Y += -rect画像側.Y;\r
- rect画像側.Height -= -rect画像側.Y;\r
- rect画像側.Y = 0;\r
- }\r
- if (rect画像側.Right > sizeBMP.Width)\r
- {\r
- rect表示側.Width -= rect画像側.Right - sizeBMP.Width;\r
- rect画像側.Width -= rect画像側.Right - sizeBMP.Width;\r
- }\r
- if (rect画像側.Bottom > sizeBMP.Height)\r
- {\r
- rect表示側.Height -= rect画像側.Bottom - sizeBMP.Height;\r
- rect画像側.Height -= rect画像側.Bottom - sizeBMP.Height;\r
+ timeMoveStart = CDTXMania.Instance.Timer.n現在時刻;\r
}\r
\r
- // 表示側の表示指定が表示域の境界をまたいでいる場合補正\r
- if (rect表示側.X < 0)\r
- {\r
- rect画像側.Width -= -rect表示側.X;\r
- rect画像側.X += -rect表示側.X;\r
- rect表示側.Width -= rect表示側.X;\r
- rect表示側.X = 0;\r
- }\r
- if (rect表示側.Y < 0)\r
+ Size sizeBMP = new Size(\r
+ ( this.stLayer[ i ].rBMP != null ) ? this.stLayer[ i ].rBMP.n幅 : this.stLayer[ i ].rBMPTEX.tx画像.sz画像サイズ.Width,\r
+ ( this.stLayer[ i ].rBMP != null ) ? this.stLayer[ i ].rBMP.n高さ : this.stLayer[ i ].rBMPTEX.tx画像.sz画像サイズ.Height );\r
+\r
+ int n再生位置 = (int) ( ( CDTXMania.Instance.Timer.n現在時刻 - timeMoveStart ) * ( ( (double) CDTXMania.Instance.ConfigIni.nPlaySpeed ) / 20.0 ) );\r
+\r
+ if( ( timeTotal != 0 ) && ( timeTotal < n再生位置 ) )\r
{\r
- rect画像側.Height -= -rect表示側.Y;\r
- rect画像側.Y += -rect表示側.Y;\r
- rect表示側.Height -= -rect表示側.Y;\r
- rect表示側.Y = 0;\r
+ this.stLayer[ i ].pt画像側開始位置 = ptImgStart = ptImgEnd;\r
+ this.stLayer[ i ].pt表示側開始位置 = ptDispStart = ptDispEnd;\r
+ this.stLayer[ i ].sz開始サイズ = sizeStart = sizeEnd;\r
+ this.stLayer[ i ].n総移動時間ms = timeTotal = 0;\r
}\r
- if (rect表示側.Right > size表示域.Width)\r
+\r
+ Rectangle rect画像側 = new Rectangle();\r
+ Rectangle rect表示側 = new Rectangle();\r
+\r
+ if( timeTotal == 0 )\r
{\r
- rect画像側.Width -= (rect表示側.Right - size表示域.Width) / 2;\r
- rect表示側.Width -= rect表示側.Right - size表示域.Width;\r
+ rect画像側.X = ptImgStart.X;\r
+ rect画像側.Y = ptImgStart.Y;\r
+ rect画像側.Width = sizeStart.Width;\r
+ rect画像側.Height = sizeStart.Height;\r
+ rect表示側.X = ptDispStart.X;\r
+ rect表示側.Y = ptDispStart.Y;\r
+ rect表示側.Width = sizeStart.Width;\r
+ rect表示側.Height = sizeStart.Height;\r
}\r
- if (rect表示側.Bottom > size表示域.Height)\r
+ else\r
{\r
- rect画像側.Height -= (rect表示側.Bottom - size表示域.Height) / 2;\r
- rect表示側.Height -= rect表示側.Bottom - size表示域.Height;\r
+ double coefSizeWhileMoving = ( (double) n再生位置 ) / ( (double) timeTotal );\r
+ Size sizeWhileMoving = new Size( \r
+ sizeStart.Width + ( (int) ( ( sizeEnd.Width - sizeStart.Width ) * coefSizeWhileMoving ) ),\r
+ sizeStart.Height + ( (int) ( ( sizeEnd.Height - sizeStart.Height ) * coefSizeWhileMoving ) ) );\r
+ rect画像側.X = ptImgStart.X + ( (int) ( ( ptImgEnd.X - ptImgStart.X ) * coefSizeWhileMoving ) );\r
+ rect画像側.Y = ptImgStart.Y + ( (int) ( ( ptImgEnd.Y - ptImgStart.Y ) * coefSizeWhileMoving ) );\r
+ rect画像側.Width = sizeWhileMoving.Width;\r
+ rect画像側.Height = sizeWhileMoving.Height;\r
+ rect表示側.X = ptDispStart.X + ( (int) ( ( ptDispEnd.X - ptDispStart.X ) * coefSizeWhileMoving ) );\r
+ rect表示側.Y = ptDispStart.Y + ( (int) ( ( ptDispEnd.Y - ptDispStart.Y ) * coefSizeWhileMoving ) );\r
+ rect表示側.Width = sizeWhileMoving.Width;\r
+ rect表示側.Height = sizeWhileMoving.Height;\r
}\r
\r
- if (\r
- (rect画像側.Width > 0) &&\r
- (rect画像側.Height > 0) &&\r
- (rect表示側.Width > 0) &&\r
- (rect表示側.Height > 0) &&\r
-\r
- (rect画像側.Right >= 0) &&\r
- (rect画像側.Bottom >= 0) &&\r
- (rect画像側.Left <= sizeBMP.Width) &&\r
- (rect画像側.Top <= sizeBMP.Height) &&\r
- (rect表示側.Right >= 0) &&\r
- (rect表示側.Bottom >= 0) &&\r
- (rect表示側.Left <= size表示域.Width) &&\r
- (rect表示側.Top <= size表示域.Height)\r
+ if(\r
+ ( rect画像側.Right > 0 ) &&\r
+ ( rect画像側.Bottom > 0 ) &&\r
+ ( rect画像側.Left < sizeBMP.Width ) &&\r
+ ( rect画像側.Top < sizeBMP.Height ) &&\r
+ ( rect表示側.Right > 0 ) &&\r
+ ( rect表示側.Bottom > 0 ) &&\r
+ ( rect表示側.Left < size基準.Width ) &&\r
+ ( rect表示側.Top < size基準.Height )\r
)\r
{\r
- CTexture tex = null;\r
- if (this.stLayer[i].rBMP != null)\r
+ #region " 画像側の表示指定が画像の境界をまたいでいる場合補正 "\r
+ //----------------\r
+ if( rect画像側.X < 0 )\r
{\r
- tex = this.stLayer[i].rBMP.tx画像;\r
+ rect表示側.Width -= -rect画像側.X;\r
+ rect表示側.X += -rect画像側.X;\r
+ rect画像側.Width -= -rect画像側.X;\r
+ rect画像側.X = 0;\r
}\r
- else if (this.stLayer[i].rBMPTEX != null)\r
+ if( rect画像側.Y < 0 )\r
{\r
- tex = this.stLayer[i].rBMPTEX.tx画像;\r
+ rect表示側.Height -= -rect画像側.Y;\r
+ rect表示側.Y += -rect画像側.Y;\r
+ rect画像側.Height -= -rect画像側.Y;\r
+ rect画像側.Y = 0;\r
}\r
- if (tex != null)\r
+ if( rect画像側.Right > sizeBMP.Width )\r
{\r
- if (CDTXMania.Instance.DTX != null && !CDTXMania.Instance.DTX.bUse556x710BGAAVI)\r
+ rect表示側.Width -= rect画像側.Right - sizeBMP.Width;\r
+ rect画像側.Width -= rect画像側.Right - sizeBMP.Width;\r
+ }\r
+ if( rect画像側.Bottom > sizeBMP.Height )\r
+ {\r
+ rect表示側.Height -= rect画像側.Bottom - sizeBMP.Height;\r
+ rect画像側.Height -= rect画像側.Bottom - sizeBMP.Height;\r
+ }\r
+ //----------------\r
+ #endregion\r
+\r
+ #region " 表示側の表示指定が表示域の境界をまたいでいる場合補正 "\r
+ //----------------\r
+ if( rect表示側.X < 0 )\r
+ {\r
+ rect画像側.Width -= -rect表示側.X;\r
+ rect画像側.X += -rect表示側.X;\r
+ rect表示側.Width -= rect表示側.X;\r
+ rect表示側.X = 0;\r
+ }\r
+ if( rect表示側.Y < 0 )\r
+ {\r
+ rect画像側.Height -= -rect表示側.Y;\r
+ rect画像側.Y += -rect表示側.Y;\r
+ rect表示側.Height -= -rect表示側.Y;\r
+ rect表示側.Y = 0;\r
+ }\r
+ if( rect表示側.Right > size基準.Width )\r
+ {\r
+ rect画像側.Width -= rect表示側.Right - size基準.Width;\r
+ rect表示側.Width -= rect表示側.Right - size基準.Width;\r
+ }\r
+ if( rect表示側.Bottom > size基準.Height )\r
+ {\r
+ rect画像側.Height -= rect表示側.Bottom - size基準.Height;\r
+ rect表示側.Height -= rect表示側.Bottom - size基準.Height;\r
+ }\r
+ //----------------\r
+ #endregion\r
+\r
+ if(\r
+ ( rect画像側.Width > 0 ) &&\r
+ ( rect画像側.Height > 0 ) &&\r
+ ( rect表示側.Width > 0 ) &&\r
+ ( rect表示側.Height > 0 ) &&\r
+\r
+ ( rect画像側.Right >= 0 ) &&\r
+ ( rect画像側.Bottom >= 0 ) &&\r
+ ( rect画像側.Left <= sizeBMP.Width ) &&\r
+ ( rect画像側.Top <= sizeBMP.Height ) &&\r
+ ( rect表示側.Right >= 0 ) &&\r
+ ( rect表示側.Bottom >= 0 ) &&\r
+ ( rect表示側.Left <= size基準.Width ) &&\r
+ ( rect表示側.Top <= size基準.Height )\r
+ )\r
+ {\r
+ CTexture tex = null;\r
+ if( this.stLayer[ i ].rBMP != null )\r
{\r
- tex.vc拡大縮小倍率.X = 2.0f;\r
- tex.vc拡大縮小倍率.Y = 2.0f;\r
- tex.vc拡大縮小倍率.Z = 1.0f;\r
+ tex = this.stLayer[ i ].rBMP.tx画像;\r
}\r
+ else if( this.stLayer[ i ].rBMPTEX != null )\r
+ {\r
+ tex = this.stLayer[ i ].rBMPTEX.tx画像;\r
+ }\r
+ if( tex != null )\r
+ {\r
+ //if( CDTXMania.Instance.DTX != null && !CDTXMania.Instance.DTX.bUse556x710BGAAVI )\r
+ //{\r
+ // tex.vc拡大縮小倍率.X = 2.0f;\r
+ // tex.vc拡大縮小倍率.Y = 2.0f;\r
+ // tex.vc拡大縮小倍率.Z = 1.0f;\r
+ //}\r
\r
- tex.t2D描画(\r
- CDTXMania.Instance.Device,\r
- (x + rect表示側.X),\r
- (y + rect表示側.Y),\r
- rect画像側);\r
+ tex.t2D描画( CDTXMania.Instance.Device, rect表示側.X, rect表示側.Y, rect画像側 );\r
+ }\r
}\r
}\r
}\r
+ #endregion\r
}\r
+\r
+ // レンダーターゲットをバックバッファに戻す。\r
+ CDTXMania.Instance.Device.SetRenderTarget( 0, sfBackBuffer );\r
}\r
}\r
+\r
+ // (2) バックバッファに txBGA を描画する。\r
+\r
+ int x = CDTXMania.Instance.ConfigIni.cdMovieX[ CDTXMania.Instance.ConfigIni.eActiveInst ];\r
+ int y = CDTXMania.Instance.ConfigIni.cdMovieY[ CDTXMania.Instance.ConfigIni.eActiveInst ];\r
+\r
+ txBGA.t2D描画( CDTXMania.Instance.Device, x, y );\r
}\r
return 0;\r
}\r