Example #1
0
        private void _フレームを描画する(DeviceContext1 dc, Matrix3x2 換行列2D, float 透明度0to1, VideoFrame 描画するフレーム)
        {
            if (null == 描画するフレーム)
            {
                return;
            }

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                dc.Transform      = (換行列2D) * dc.Transform;
                dc.PrimitiveBlend = (this.加算合成) ? PrimitiveBlend.Add : PrimitiveBlend.SourceOver;
                dc.DrawBitmap(描画するフレーム.Bitmap, 透明度0to1, InterpolationMode.NearestNeighbor);
            });
        }
Example #2
0
 public static void CopyToTexture(DeviceContext1 context, Texture2D source, Texture2D destination, int subResource = 0)
 {
     if (source.Description.SampleDescription.Count > 1 || source.Description.SampleDescription.Quality > 0)
     {
         context.ResolveSubresource(source, subResource, destination, 0, destination.Description.Format);
     }
     else
     {
         // Not multisampled, so just copy to the destination
         context.CopySubresourceRegion(source, subResource, null, destination, 0);
         //context.CopyResource(source, destination);
     }
 }
Example #3
0
        private void _サブタイトルを描画する(DeviceContext1 dc)
        {
            var 表示位置dpx = new Vector2(782f, 520f);

            // 拡大率を計算して描画する。
            float 最大幅dpx = グラフィックデバイス.Instance.設計画面サイズ.Width - 表示位置dpx.X;

            this._サブタイトル画像.描画する(
                dc,
                表示位置dpx.X,
                表示位置dpx.Y,
                X方向拡大率: (this._サブタイトル画像.画像サイズdpx.Width <= 最大幅dpx) ? 1f : 最大幅dpx / this._サブタイトル画像.画像サイズdpx.Width);
        }
Example #4
0
        public void 描画する(DeviceContext1 dc, RectangleF 描画先矩形, float 透明度0to1 = 1.0f)
        {
            if (null == this._VideoSource)
            {
                return;
            }

            var 換行列2D =
                Matrix3x2.Scaling(描画先矩形.Width / this._VideoSource.フレームサイズ.Width, 描画先矩形.Height / this._VideoSource.フレームサイズ.Height) * // 拡大縮小
                Matrix3x2.Translation(描画先矩形.Left, 描画先矩形.Top);                                                                       // 平行移動

            this.描画する(dc, 換行列2D, 透明度0to1);
        }
Example #5
0
        public void 描画する(DeviceContext1 dc)
        {
            var 領域 = new RectangleF(78f, 455f, 357f, 55f);


            if (App.曲ツリー.フォーカス曲ノード != this._現在表示しているノード)
            {
                #region " フォーカスノードが変更されたので情報を更新する。"
                //----------------
                this._現在表示しているノード = App.曲ツリー.フォーカス曲ノード;

                this._最小BPM = 120.0;
                this._最大BPM = 120.0;

                if (null != this._現在表示しているノード)
                {
                    using (var songdb = new SongDB())
                    {
                        var song = songdb.Songs.Where((r) => (r.Path == this._現在表示しているノード.曲ファイルの絶対パス.数なしパス)).SingleOrDefault();

                        if (null != song)
                        {
                            this._最小BPM = song.MinBPM ?? 120.0;
                            this._最大BPM = song.MaxBPM ?? 120.0;
                        }
                    }
                }
                //----------------
                #endregion
            }


            this._BPMパネル.描画する(領域.X - 5f, 領域.Y - 4f);


            bool 表示可能ノードである = (this._現在表示しているノード is MusicNode);

            if (表示可能ノードである)
            {
                if (10.0 >= Math.Abs(this._最大BPM - this._最小BPM))
                {
                    // (A) 「最小値」だけ描画。差が10以下なら同一値とみなす。
                    this._パラメータ文字.描画する(dc, 領域.X + 120f, 領域.Y, this._最小BPM.ToString("0").PadLeft(3));
                }
                else
                {
                    // (B) 「最小~最大」を描画。
                    this._パラメータ文字.描画する(dc, 領域.X + 80f, 領域.Y, this._最小BPM.ToString("0") + "~" + this._最大BPM.ToString("0"));
                }
            }
        }
Example #6
0
        public override void 進行描画する(DeviceContext1 dc)
        {
            // 進行描画

            if (this._初めての進行描画)
            {
                this._背景.ぼかしと縮小を適用する(0.0);      // 即時適用
                this._初めての進行描画 = false;
            }

            this._背景.進行描画する(dc);
            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                dc.FillRectangle(new RectangleF(0f, 36f, グラフィックデバイス.Instance.設計画面サイズ.Width, グラフィックデバイス.Instance.設計画面サイズ.Height - 72f), this._黒マスクブラシ);
            });
            this._プレビュー画像を描画する(dc);
            this._曲名パネル.描画する(dc, 660f, 796f);
            this._曲名を描画する(dc);
            this._サブタイトルを描画する(dc);
            this._演奏パラメータ結果.描画する(dc, 1317f, 716f, this._結果);


            // 入力

            App.入力管理.すべての入力デバイスをポーリングする();

            switch (this.現在のフェーズ)
            {
            case フェーズ.表示:
                if (App.入力管理.確定キーが入力された())
                {
                    App.システムサウンド.再生する(システムサウンド種別.取消音);          // 確定だけど取消音
                    App.ステージ管理.アイキャッチを選択しクローズする(nameof(シャッター));
                    this.現在のフェーズ = フェーズ.フェードアウト;
                }
                break;

            case フェーズ.フェードアウト:
                App.ステージ管理.現在のアイキャッチ.進行描画する(dc);

                if (App.ステージ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.アイキャッチ.フェーズ.クローズ完了)
                {
                    this.現在のフェーズ = フェーズ.確定;
                }
                break;

            case フェーズ.確定:
                break;
            }
        }
Example #7
0
 public void 進行描画する(DeviceContext1 dc)
 {
     foreach (表示レーン種別 lane in Enum.GetValues(typeof(表示レーン種別)))
     {
         var laneContext = this._レーンtoレーンContext[lane];
         if (laneContext.アニメカウンタ.動作中である && laneContext.アニメカウンタ.終了値に達していない)
         {
             this._レーンフラッシュ画像.描画する(
                 dc,
                 laneContext.開始位置dpx.X,
                 laneContext.開始位置dpx.Y - laneContext.アニメカウンタ.現在値の割合 * レーンフレーム.領域.Height,
                 透明度0to1: 1f - laneContext.アニメカウンタ.現在値の割合,
                 転送元矩形: laneContext.転送元矩形);
         }
     }
 }
Example #8
0
        public void 描画する(DeviceContext1 dc)
        {
            // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。

            var 画面左上dpx = new Vector3(  // 3D視点で見る画面左上の座標。
                -グラフィックデバイス.Instance.設計画面サイズ.Width / 2f,
                +グラフィックデバイス.Instance.設計画面サイズ.Height / 2f,
                0f);

            var 換行列 =
                Matrix.Scaling(this.クリアパネル.サイズ.Width, this.クリアパネル.サイズ.Height, 1f) *
                Matrix.RotationY(MathUtil.DegreesToRadians(-48f)) *
                Matrix.Translation(画面左上dpx.X + 230f, 画面左上dpx.Y - 530f, 0f);

            this.クリアパネル.描画する(換行列);
        }
Example #9
0
File: D3D.cs Project: rasmus-z/tv
            public void Create(
                IntPtr hwnd,
                Size2 size,
                CompositionType compositionType)
            {
                DebugSelect(DeviceCreationFlags.Debug, DeviceCreationFlags.None,
                            out DeviceCreationFlags creationFlags);
                creationFlags |= DeviceCreationFlags.BgraSupport | DeviceCreationFlags.SingleThreaded;

                Device  = CreateDevice(creationFlags);
                Context = Device.ImmediateContext1;

                Dxgi().Initialize(Device.QueryInterface <DXGI.Device2>(), hwnd, compositionType, size);

                Connect();
            }
        public void 進行描画する(DeviceContext1 dc)
        {
            // パネルを合計8枚表示する。(左隠れ1枚 + 表示6枚 + 右隠れ1枚)

            int 表示元の位置 = this._表示開始位置;

            for (int i = 0; i < 8; i++)
            {
                var 画像 = this._パネルs[表示元の位置].画像;

                画像.描画する(
                    (float)((768f + this._横方向差分割合.Value * 144f) + 144f * i),
                    (3 == i) ? 100f : 54f);    // i==3 が現在の選択パネル

                表示元の位置 = (表示元の位置 + 1) % this._パネルs.Count;
            }
        }
Example #11
0
        public void 進行描画する(DeviceContext1 dc)
        {
            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                using (var 水色ブラシ = new SolidColorBrush(dc, new Color4(0xffdd8e69)))
                    using (var 黄色ブラシ = new SolidColorBrush(dc, new Color4(0xff17fffe)))
                    {
                        var 今回のライン全体の矩形   = new RectangleF(1357f, 108f, 10f, 768f);
                        var 過去最高のライン全体の矩形 = new RectangleF(1371f, 108f, 6f, 768f);
                        const float 単位幅   = 12f;


                        // (1) 今回のカウントマップラインを描画する。

                        for (int i = 0; i < this.カウントマップ.Length; i++)
                        {
                            if (0 == this.カウントマップ[i])
                            {
                                continue;
                            }

                            dc.FillRectangle(
                                new RectangleF(今回のライン全体の矩形.Left, 今回のライン全体の矩形.Bottom - 単位幅 * (i + 1), 今回のライン全体の矩形.Width, 単位幅),
                                (2 <= this.カウントマップ[i]) ? 黄色ブラシ : 水色ブラシ);
                        }


                        // (2) 過去の最高カウントマップラインを描画する。

                        if (null != this._過去最大のカウントマップ)
                        {
                            for (int i = 0; i < this._過去最大のカウントマップ.Length; i++)
                            {
                                if (0 == this._過去最大のカウントマップ[i])
                                {
                                    continue;
                                }

                                dc.FillRectangle(
                                    new RectangleF(過去最高のライン全体の矩形.Left, 過去最高のライン全体の矩形.Bottom - 単位幅 * (i + 1), 過去最高のライン全体の矩形.Width, 単位幅),
                                    (2 <= this._過去最大のカウントマップ[i]) ? 黄色ブラシ : 水色ブラシ);
                            }
                        }
                    }
            });
        }
Example #12
0
        private void _プレビュー画像を描画する(DeviceContext1 dc, Node ノード)
        {
            var 画像 = ノード.ノード画像 ?? Node.既定のノード画像;

            // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。

            var 換行列 =
                Matrix.Scaling(
                    this._プレビュー画像表示サイズdpx.X / 画像.サイズ.Width,
                    this._プレビュー画像表示サイズdpx.Y / 画像.サイズ.Height,
                    0f) *
                Matrix.Translation(
                    グラフィックデバイス.Instance.画面左上dpx.X + this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X / 2f,
                    グラフィックデバイス.Instance.画面左上dpx.Y - this._プレビュー画像表示位置dpx.Y - this._プレビュー画像表示サイズdpx.Y / 2f,
                    0f);

            画像.描画する(換行列);
        }
Example #13
0
        /// <summary>
        ///     アイキャッチのアニメーションを進行し、アイキャッチ画像を描画する。
        /// </summary>
        public void 進行描画する(DeviceContext1 dc)
        {
            switch (this.現在のフェーズ)
            {
            case フェーズ.未定:
                break;

            case フェーズ.クローズ:
            case フェーズ.クローズ完了:
                this.進行描画する(dc, StoryboardStatus.Scheduled);
                break;

            case フェーズ.オープン:
            case フェーズ.オープン完了:
                this.進行描画する(dc, StoryboardStatus.Ready);
                break;
            }
        }
Example #14
0
        private void _次のフレームを読み込んで描画する(DeviceContext1 dc, Matrix3x2 換行列2D, float 透明度0to1 = 1.0f)
        {
            if (null == this._VideoSource)
            {
                return;
            }

            // デコードが間に合ってない場合にはブロックする。
            // ブロックされたくない場合は、事前に Peek() でチェックしておくこと。
            var 次のフレーム = this._VideoSource.Read();

            // 描画。
            this._フレームを描画する(dc, 換行列2D, 透明度0to1, 次のフレーム);

            // 更新。
            this._最後に描画したフレーム?.Dispose();
            this._最後に描画したフレーム = 次のフレーム;
        }
Example #15
0
        /// <summary>
        ///		画像を描画する。
        /// </summary>
        /// <param name="変換行列2D">Transform に適用する行列。</param>
        /// <param name="変換行列3D">射影行列。</param>
        /// <param name="不透明度0to1">不透明度。(0:透明~1:不透明)</param>
        /// <param name="転送元矩形">描画する画像範囲。</param>
        public virtual void 描画する(DeviceContext1 dc, Matrix3x2?換行列2D = null, Matrix?換行列3D = null, float 透明度0to1 = 1.0f, RectangleF?転送元矩形 = null, LayerParameters1?レイヤーパラメータ = null)
        {
            Debug.Assert(this.活性化している);

            if (null == this._Bitmap)
            {
                return;
            }

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                var pretrans = dc.Transform;

                // 変換行列とブレンドモードをD2Dレンダーターゲットに設定する。
                dc.Transform =
                    (換行列2D ?? Matrix3x2.Identity) *
                    pretrans;

                dc.PrimitiveBlend = (this.加算合成) ? PrimitiveBlend.Add : PrimitiveBlend.SourceOver;

                using (var layer = new Layer(dc))
                {
                    // レイヤーパラメータの指定があれば、描画前に Push する。
                    if (null != レイヤーパラメータ)
                    {
                        dc.PushLayer((LayerParameters1)レイヤーパラメータ, layer);
                    }

                    // D2Dレンダーターゲットに this.Bitmap を描画する。
                    dc.DrawBitmap(
                        bitmap: this._Bitmap,
                        destinationRectangle: null,
                        opacity:  透明度0to1,
                        interpolationMode: this.補正モード,
                        sourceRectangle: 転送元矩形,
                        erspectiveTransformRef:  換行列3D);  // null 指定可。

                    // レイヤーパラメータの指定があれば、描画後に Pop する。
                    if (null != レイヤーパラメータ)
                    {
                        dc.PopLayer();
                    }
                }
            });
        }
Example #16
0
        public void 進行描画する(DeviceContext1 dc)
        {
            var         描画位置    = new Vector2(569f, 188f);
            const float リストの改行幅 = 160f;


            // 選択中のパネルの光彩アニメーションの進行。

            float 透明度 = 0f;

            var 割合 = this._光彩アニメカウンタ.現在値の割合;

            if (0.5f > 割合)
            {
                透明度 = 1.0f - (割合 * 2.0f);        // 1→0
            }
            else
            {
                透明度 = (割合 - 0.5f) * 2.0f;        // 0→1
            }


            // ユーザリストを描画する。

            int 表示人数 = Math.Min(5, App.ユーザ管理.ユーザリスト.Count);     // HACK: 現状は最大5人までとする。

            for (int i = 0; i < 表示人数; i++)
            {
                var user     = App.ユーザ管理.ユーザリスト[i];
                var playMode = user.演奏モード;

                if (i == this.選択中のユーザ)
                {
                    this._ユーザパネル光彩付き[playMode].描画する(dc, 描画位置.X, 描画位置.Y + リストの改行幅 * i, 透明度0to1:  透明度);
                }

                this._ユーザパネル[playMode].描画する(dc, 描画位置.X, 描画位置.Y + リストの改行幅 * i);

                this._ユーザ名.表示文字列 = user.ユーザ名;
                this._ユーザ名.描画する(dc, 描画位置.X + 32f, 描画位置.Y + 40f + リストの改行幅 * i);

                this._ユーザ肩書きパネル[playMode].描画する(dc, 描画位置.X, 描画位置.Y + リストの改行幅 * i);
            }
        }
Example #17
0
        public virtual void 進行描画する(DeviceContext1 dc, float left, float top, bool 選択中)
        {
            float 拡大率Y           = (float)this._パネルの高さ割合.Value;
            float パネルとヘッダの上下マージン = サイズ.Height * (1f - 拡大率Y) / 2f;
            float テキストの上下マージン    = 76f * (1f - 拡大率Y) / 2f;
            var   パネル矩形          = new RectangleF(left, top + パネルとヘッダの上下マージン, サイズ.Width, サイズ.Height * 拡大率Y);
            var   ヘッダ矩形          = new RectangleF(left, top + パネルとヘッダの上下マージン, 40f, サイズ.Height * 拡大率Y);
            var   テキスト矩形         = new RectangleF(left + 20f, top + 10f + テキストの上下マージン, 280f, 76f * 拡大率Y);

            if (選択中)
            {
                // 選択されているパネルは、パネル矩形を左右にちょっと大きくする。
                パネル矩形.Left  -= 38f;
                パネル矩形.Width += 38f * 2f;
            }


            // (1) パネルの下地部分の描画。

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                using (var パネル背景色 = new SolidColorBrush(dc, new Color4(Color3.Black, 0.5f)))
                    using (var ヘッダ背景色 = new SolidColorBrush(dc, this.ヘッダ色))
                        using (var テキスト背景色 = new SolidColorBrush(dc, Color4.Black))
                        {
                            dc.FillRectangle(パネル矩形, パネル背景色);
                            dc.FillRectangle(ヘッダ矩形, ヘッダ背景色);
                            dc.FillRectangle(テキスト矩形, テキスト背景色);
                        }
            });


            // (2) パネル名の描画。

            float 拡大率X = Math.Min(1f, (テキスト矩形.Width - 20f) / this._パネル名画像.画像サイズdpx.Width);        // -20 は左右マージンの最低値[dpx]

            this._パネル名画像.描画する(
                dc,
                テキスト矩形.Left + (テキスト矩形.Width - this._パネル名画像.画像サイズdpx.Width * 拡大率X) / 2f,
                テキスト矩形.Top + (テキスト矩形.Height - this._パネル名画像.画像サイズdpx.Height * 拡大率Y) / 2f,
                X方向拡大率: 拡大率X,
                Y方向拡大率: 拡大率Y);
        }
Example #18
0
        public void 進行描画する(DeviceContext1 dc, float left, float top)
        {
            const float パネルの下マージン = 4f;
            float       パネルの高さ    = パネル.サイズ.Height + パネルの下マージン;

            // (1) フレーム1(たて線)を描画。

            this._青い線.描画する(dc, new Vector2(left, 0f), 高さdpx: グラフィックデバイス.Instance.設計画面サイズ.Height);


            // (2) パネルを描画。(選択中のパネルの3つ上から7つ下までの計11枚。)

            var panels = this._現在のパネルフォルダ.子パネルリスト;

            for (int i = 0; i < 11; i++)
            {
                int 描画パネル番号 = ((panels.SelectedIndex - 3 + i) + panels.Count * 3) % panels.Count;           // panels の末尾に達したら先頭に戻る。
                var 描画パネル   = panels[描画パネル番号];

                描画パネル.進行描画する(
                    dc,
                    left + 22f,
                    top + i * パネルの高さ,
                    選択中: (i == 3));
            }


            // (3) フレーム2(選択パネル周囲)を描画。

            float 幅 = パネル.サイズ.Width + 22f * 2f;

            this._青い線.描画する(dc, new Vector2(left, パネルの高さ * 3f), 幅dpx: 幅);
            this._青い線.描画する(dc, new Vector2(left, パネルの高さ * 4f), 幅dpx: 幅);
            this._青い線.描画する(dc, new Vector2(left + 幅, パネルの高さ * 3f), 高さdpx: パネルの高さ);


            // (4) パッド矢印(上&下)を描画。

            this._パッド矢印.描画する(dc, パッド矢印.種類._Tom1, new Vector2(left, パネルの高さ * 3f));
            this._パッド矢印.描画する(dc, パッド矢印.種類._Tom2, new Vector2(left, パネルの高さ * 4f));
        }
        public void 進行描画する(DeviceContext1 dc)
        {
            if (null == this._カウンタ)
            {
                return;
            }

            if (2000 <= this._カウンタ.現在値)
            {
                float 割合 = (this._カウンタ.現在値 - 2000) / 300f;      // 0→1

                // 上
                this._ランナー画像.描画する(
                    1920f - 割合 * (1920f - 1044f),
                    485f - this._ランナー画像.サイズ.Height / 2f);

                // 下
                this._ランナー画像.描画する(
                    1920f - 割合 * (1920f - 1044f),
                    598f - this._ランナー画像.サイズ.Height / 2f);
            }
        }
Example #20
0
        private void _プレビュー画像を描画する(DeviceContext1 dc)
        {
            var 選択曲 = App.曲ツリー.フォーカス曲ノード;

            Debug.Assert(null != 選択曲);

            var preimage = 選択曲.ノード画像 ?? Node.既定のノード画像;

            Debug.Assert(null != preimage);

            // 枠

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                const float 枠の太さdpx = 5f;
                dc.FillRectangle(
                    new RectangleF(
                        this._プレビュー画像表示位置dpx.X - 枠の太さdpx,
                        this._プレビュー画像表示位置dpx.Y - 枠の太さdpx,
                        this._プレビュー画像表示サイズdpx.X + 枠の太さdpx * 2f,
                        this._プレビュー画像表示サイズdpx.Y + 枠の太さdpx * 2f),
                    this._プレビュー枠ブラシ);
            });

            // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。

            var 画面左上dpx = new Vector3(  // 3D視点で見る画面左上の座標。
                -グラフィックデバイス.Instance.設計画面サイズ.Width / 2f,
                +グラフィックデバイス.Instance.設計画面サイズ.Height / 2f,
                0f);

            var 換行列 =
                Matrix.Scaling(this._プレビュー画像表示サイズdpx) *
                Matrix.Translation(
                    画面左上dpx.X + this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X / 2f,
                    画面左上dpx.Y - this._プレビュー画像表示位置dpx.Y - this._プレビュー画像表示サイズdpx.Y / 2f,
                    0f);

            preimage.描画する(換行列);
        }
Example #21
0
        private void _導線を描画する(DeviceContext1 dc)
        {
            var h = (float)this._上に伸びる導線の長さdpx.Value;

            this._青い線.描画する(dc, new Vector2(1044f, 485f - h), 高さdpx: h);

            var w = (float)this._左に伸びる導線の長さdpx.Value;

            this._青い線.描画する(dc, new Vector2(1046f - w, 278f), 幅dpx: w);

            var z = (float)this._プレビュー枠の長さdpx.Value;    // マージン×2 込み

            var = this._プレビュー画像表示位置dpx.Y;
            var = this._プレビュー画像表示位置dpx.Y + this._プレビュー画像表示サイズdpx.Y;
            var 左 = this._プレビュー画像表示位置dpx.X;
            var 右 = this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X;

            this._青い線.描画する(dc, new Vector2(右 + this._青枠のマージンdpx - z, ), 幅dpx: z);      // 上辺
            this._青い線.描画する(dc, new Vector2(右 + this._青枠のマージンdpx - z, ), 幅dpx: z);      // 下辺
            this._青い線.描画する(dc, new Vector2(左, +this._青枠のマージンdpx - z), 高さdpx: z);       // 左辺
            this._青い線.描画する(dc, new Vector2(右, +this._青枠のマージンdpx - z), 高さdpx: z);       // 右辺
        }
Example #22
0
        public void 進行描画する(DeviceContext1 dc, double?スキル値)
        {
            if (null == スキル値)
            {
                return;
            }

            var    skill   = (double)スキル値;
            var    描画領域    = new RectangleF(108f, 780f, 275f, 98f);
            string スキル値文字列 = skill.ToString("0.00").PadLeft(6).Replace(' ', 'o');        // 右詰め、余白は'o'。

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                var pretrans = dc.Transform;

                // 曲別SKILLアイコンを描画する
                dc.Transform =
                    Matrix3x2.Scaling(0.375f, 0.5f) *
                    Matrix3x2.Translation(描画領域.X, 描画領域.Y) *
                    pretrans;

                this._ロゴ画像.描画する(dc, 0f, 0f);

                // 小数部を描画する
                dc.Transform =
                    Matrix3x2.Scaling(0.65f, 0.8f) *
                    Matrix3x2.Translation(描画領域.X + 90f + 105f, 描画領域.Y + (描画領域.Height * 0.2f)) *
                    pretrans;

                this._数字画像.描画する(dc, 0f, 0f, スキル値文字列.Substring(4));

                // 整数部を描画する('.'含む)
                dc.Transform =
                    Matrix3x2.Scaling(0.65f, 1.0f) *
                    Matrix3x2.Translation(描画領域.X + 90f, 描画領域.Y) *
                    pretrans;

                this._数字画像.描画する(dc, 0f, 0f, スキル値文字列.Substring(0, 4));
            });
        }
Example #23
0
        public override void 進行描画する(DeviceContext1 dc)
        {
            if (this._初めての進行描画)
            {
                this._舞台画像.ぼかしと縮小を適用する(0.0);
                App.ステージ管理.現在のアイキャッチ.オープンする();
                this._初めての進行描画 = false;
            }

            this._舞台画像.進行描画する(dc);
            this._注意文.描画する(dc, 0f, 760f);
            this._プレビュー画像.描画する(dc);
            this._難易度.描画する(dc);
            this._曲名を描画する(dc);
            this._サブタイトルを描画する(dc);

            switch (this.現在のフェーズ)
            {
            case フェーズ.フェードイン:
                App.ステージ管理.現在のアイキャッチ.進行描画する(dc);

                if (App.ステージ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.アイキャッチ.フェーズ.オープン完了)
                {
                    this.現在のフェーズ = フェーズ.表示;
                }
                break;

            case フェーズ.表示:
                this._スコアを読み込む();
                App.入力管理.すべての入力デバイスをポーリングする();      // 先行入力があったらここでキャンセル
                this.現在のフェーズ = フェーズ.完了;
                break;

            case フェーズ.完了:
            case フェーズ.キャンセル:
                break;
            }
        }
Example #24
0
        private void _小節線拍線を描画する(DeviceContext1 dc, double 現在の演奏時刻sec)
        {
            // 小節線・拍線 と チップ は描画階層(奥行き)が異なるので、別々のメソッドに分ける。

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                this._描画範囲内のすべてのチップに対して(現在の演奏時刻sec, (chip, index, ヒット判定バーと描画との時間sec, ヒット判定バーと発声との時間sec, ヒット判定バーとの距離dpx) => {
                    if (chip.チップ種別 == チップ種別.小節線)
                    {
                        float 位置dpx = (float)(ヒット判定位置Ydpx + ヒット判定バーとの距離dpx - 1f);       // -1f は小節線の厚みの半分。

                        // 小節線
                        if (App.ユーザ管理.ログオン中のユーザ.演奏中に小節線と拍線を表示する)
                        {
                            float x = 441f;
                            float w = 780f;
                            dc.DrawLine(new Vector2(x, 位置dpx + 0f), new Vector2(x + w, 位置dpx + 0f), this._小節線色);
                            dc.DrawLine(new Vector2(x, 位置dpx + 1f), new Vector2(x + w, 位置dpx + 1f), this._小節線影色);
                        }

                        // 小節番号
                        if (App.ユーザ管理.ログオン中のユーザ.演奏中に小節番号を表示する)
                        {
                            float 右位置dpx = 441f + 780f - 24f;                                                     // -24f は適当なマージン。
                            this._数字フォント中グレー48x64.描画する(dc, 右位置dpx, 位置dpx - 84f, chip.小節番号.ToString(), 右揃え: true); // -84f は適当なマージン。
                        }
                    }
                    else if (chip.チップ種別 == チップ種別.拍線)
                    {
                        // 拍線
                        if (App.ユーザ管理.ログオン中のユーザ.演奏中に小節線と拍線を表示する)
                        {
                            float 位置dpx = (float)(ヒット判定位置Ydpx + ヒット判定バーとの距離dpx - 1f);       // -1f は拍線の厚みの半分。
                            dc.DrawLine(new Vector2(441f, 位置dpx), new Vector2(441f + 780f, 位置dpx), this._拍線色, strokeWidth: 1f);
                        }
                    }
                });
            });
        }
Example #25
0
        public void 描画する(DeviceContext1 dc, 種類 type, Vector2 中央位置dpx, float 拡大率 = 1f)
        {
            var 矩形 = new RectangleF();

            switch (type)
            {
            case 種類._Tom1:  矩形 = this._矢印の矩形リスト["Up"]; break;

            case 種類._Tom2:  矩形 = this._矢印の矩形リスト["Down"]; break;

            case 種類.左_Snare: 矩形 = this._矢印の矩形リスト["Left"]; break;

            case 種類.右_Tom3:  矩形 = this._矢印の矩形リスト["Right"]; break;
            }

            var 左上位置dpx = new Vector2(中央位置dpx.X - 矩形.Width * 拡大率 / 2f, 中央位置dpx.Y - 矩形.Height * 拡大率 / 2f);

            var 換行列 =
                Matrix3x2.Scaling(拡大率) *
                Matrix3x2.Translation(左上位置dpx);

            this._矢印画像.描画する(dc, 換行列, 転送元矩形: 矩形);
        }
        public void 描画する(DeviceContext1 dc)
        {
            var 選択曲 = App.曲ツリー.フォーカス曲ノード;

            Debug.Assert(null != 選択曲);

            var preimage = 選択曲.ノード画像 ?? Node.既定のノード画像;

            Debug.Assert(null != preimage);

            // テクスチャは画面中央が (0,0,0) で、Xは右がプラス方向, Yは上がプラス方向, Zは奥がプラス方向+。

            var 換行列 =
                Matrix.Scaling(
                    this._プレビュー画像表示サイズdpx.X / preimage.サイズ.Width,
                    this._プレビュー画像表示サイズdpx.Y / preimage.サイズ.Height,
                    0f) *
                Matrix.Translation(
                    グラフィックデバイス.Instance.画面左上dpx.X + this._プレビュー画像表示位置dpx.X + this._プレビュー画像表示サイズdpx.X / 2f,
                    グラフィックデバイス.Instance.画面左上dpx.Y - this._プレビュー画像表示位置dpx.Y - this._プレビュー画像表示サイズdpx.Y / 2f,
                    0f);

            preimage.描画する(換行列);
        }
Example #27
0
        public void 描画する(DeviceContext1 dc, float 達成率)
        {
            var 描画領域 = new RectangleF(220f, 650f, 165f, 80f);

            達成率 = Math.Max(Math.Min(達成率, 99.99f), 0f);                                 // 0~99.99にクリッピング

            string 達成率文字列 = (達成率.ToString("0.00") + '%').PadLeft(6).Replace(' ', 'o'); // 右詰め、余白は'o'。例:"99.00%", "o8.12%", "o0.00%"

            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                var pretrans = dc.Transform;

                // 達成率ロゴを描画する
                dc.Transform =
                    Matrix3x2.Scaling(0.4f, 0.5f) *
                    Matrix3x2.Translation(描画領域.X - 30f, 描画領域.Y - 60f) *
                    pretrans;

                this._達成率ロゴ画像.描画する(dc, 0f, 0f);

                // 小数部を描画する('%'含む)
                dc.Transform =
                    Matrix3x2.Scaling(0.5f, 0.8f) *
                    Matrix3x2.Translation(描画領域.X + 65f, 描画領域.Y + (描画領域.Height * 0.2f)) *
                    pretrans;

                this._数字画像.描画する(dc, 0f, 0f, 達成率文字列.Substring(3));

                // 整数部を描画する('.'含む)
                dc.Transform =
                    Matrix3x2.Scaling(0.5f, 1.0f) *
                    Matrix3x2.Translation(描画領域.X, 描画領域.Y) *
                    pretrans;

                this._数字画像.描画する(dc, 0f, 0f, 達成率文字列.Substring(0, 3));
            });
        }
Example #28
0
        private void _その他パネルを描画する(DeviceContext1 dc)
        {
            グラフィックデバイス.Instance.D2DBatchDraw(dc, () => {
                using (var ソートタブ上色 = new SolidColorBrush(dc, new Color4(0xFF121212)))
                    using (var ソートタブ下色 = new SolidColorBrush(dc, new Color4(0xFF1f1f1f)))
                    {
                        // 曲リストソートタブ
                        dc.FillRectangle(new RectangleF(927f, 50f, 993f, 138f), ソートタブ上色);
                        dc.FillRectangle(new RectangleF(927f, 142f, 993f, 46f), ソートタブ下色);
                    }

                // インフォメーションバー
                dc.FillRectangle(new RectangleF(0f, 0f, 1920f, 50f), this._黒);
                dc.DrawLine(new Vector2(0f, 50f), new Vector2(1920f, 50f), this._白, strokeWidth: 1f);

                // ボトムバー
                dc.FillRectangle(new RectangleF(0f, 1080f - 43f, 1920f, 1080f), this._黒);

                // プレビュー領域
                dc.FillRectangle(new RectangleF(0f, 52f, 927f, 476f), this._黒透過);
                dc.DrawRectangle(new RectangleF(0f, 52f, 927f, 476f), this._灰透過, strokeWidth: 1f);
                dc.DrawLine(new Vector2(1f, 442f), new Vector2(925f, 442f), this._灰透過, strokeWidth: 1f);
            });
        }
Example #29
0
 /// <summary>
 ///		ステージの通常速度での進行と描画を行う。
 /// </summary>
 public virtual void 進行描画する(DeviceContext1 dc)
 {
 }
Example #30
0
        public override void 進行描画する(DeviceContext1 dc)
        {
            App.入力管理.すべての入力デバイスをポーリングする();

            switch (this.現在のフェーズ)
            {
            case フェーズ.表示:
                #region " タイトル画面を表示し、入力の判定を行う。"
                //----------------
            {
                // 進行描画

                this._舞台画像.進行描画する(dc);

                this._タイトルロゴ.描画する(
                    dc,
                    (グラフィックデバイス.Instance.設計画面サイズ.Width - this._タイトルロゴ.サイズ.Width) / 2f,
                    (グラフィックデバイス.Instance.設計画面サイズ.Height - this._タイトルロゴ.サイズ.Height) / 2f - 100f);

                this._帯メッセージを描画する(dc);

                // 入力

                if (App.入力管理.確定キーが入力された())
                {
                    Log.Info($"確定キーが入力されました。フェードアウトを開始します。");
                    App.システムサウンド.再生する(設定.システムサウンド種別.タイトルステージ_確定音);
                    App.ステージ管理.アイキャッチを選択しクローズする(nameof(シャッター));
                    this.現在のフェーズ = フェーズ.フェードアウト;
                }
                else if (App.入力管理.キャンセルキーが入力された())
                {
                    Log.Info($"キャンセルキーが入力されました。");
                    this.現在のフェーズ = フェーズ.キャンセル;
                }
            }
                //----------------
                #endregion
                break;

            case フェーズ.フェードアウト:
                #region " アイキャッチを使って、タイトル画面をフェードアウトする。"
                //----------------
            {
                // 画面描画

                this._舞台画像.進行描画する(dc);

                this._タイトルロゴ.描画する(
                    dc,
                    (グラフィックデバイス.Instance.設計画面サイズ.Width - this._タイトルロゴ.サイズ.Width) / 2f,
                    (グラフィックデバイス.Instance.設計画面サイズ.Height - this._タイトルロゴ.サイズ.Height) / 2f - 100f);

                this._帯メッセージを描画する(dc);


                // アイキャッチ描画

                App.ステージ管理.現在のアイキャッチ.進行描画する(dc);

                if (App.ステージ管理.現在のアイキャッチ.現在のフェーズ == アイキャッチ.アイキャッチ.フェーズ.クローズ完了)
                {
                    this.現在のフェーズ = フェーズ.確定;
                    Log.Info($"フェードアウトが完了しました。");
                }
            }
                //----------------
                #endregion
                break;

            case フェーズ.確定:
            case フェーズ.キャンセル:
                break;
            }
        }