待辦事項 #23510

ウインドウのリサイズ許可

啟用日期: 2010-10-26 01:45 最後更新: 2011-04-03 04:35

回報者:
負責人:
狀態:
關閉
元件:
里程碑:
優先權:
5 - 中
嚴重程度:
5 - 中
處理結果:
Later
檔案:
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

細節

ウインドウのリサイズができるようにして欲しい。

できれば、アスペクト比を維持しながらリサイズする機能と、dot by dot相当に戻す(640x480に戻す)機能も欲しい。

Ticket History (3/30 Histories)

2010-10-26 01:45 Updated by: yyagi
  • New Ticket "ウインドウのリサイズ許可" created
2010-10-26 13:15 Updated by: from
評語

チケットの「追記/更新」のテストも兼ねて。

現状の DTXMania で使用されている画像は、すべて 3D 化(テクスチャ化)が完了しています。 なので、残るは

  • 内部座標系の変更:

  現在は、3D で見ても z=0 のとき視野が 640x480 になり (0,0,0) が画面中央にくるよう、カメラと投影行列が固定化されています。

  • 文字の大きさの変更:

  現在は、640x480 での表示を想定してフォントサイズを決定しています。文字列は結局はテクスチャになるわけですから拡大縮小は可能ですが、拡大すると文字が荒くなることは否めません。

…あたりに注意する必要があります。

2010-10-26 22:14 Updated by: yyagi
  • 負責人 Update from (無) to yyagi
評語

情報ありがとうございます。

カメラ周りの話はおっしゃっているようなことを実行している部分を起票時点で既に見つけていたのですが じゃあどう直せばいいの勝手のがさっぱり分からず。HAHAHA! DirectXの3D周りは全く知識がないのでこれから勉強してみます。

フォントが荒くなるのは盲点でした。でも対応が面倒そうなので、まずは単純な拡大表示ができないか考えてみます。

2010-10-26 22:47 Updated by: from
評語

よく考えたら、フォントについては問題外でしたね。

ウィンドウのサイズを大きくしたら、フォントだけじゃなく他の画像まですべて荒くなるんですから。

フォントだけスムースなままというのもかえって不気味ですしね。

2010-10-27 00:42 Updated by: yyagi
評語

その後カメラの合焦距離やら画角やらについて勉強して、カメラのビュー変換についてやっていることを理解。 # 1対2対ルート3とか久しぶりに思い出した。

よしそれじゃあウインドウサイズとbackbufferをでかくしてカメラ距離を近づければソレっぽく拡大表示されるはずだよな・・・ とやってみましたが・・・dot by dot表示のまま。うーん、間違ったかな?

・・・出直してきます。もっと勉強せねば。

2010-10-27 01:19 Updated by: yyagi
評語

カメラを動かすことなく、単純に以下のようにすることで、とりあえずウインドウサイズを800x600にすることができました。
1. ウインドウサイズを800x600に設定する
2. BackBufferを640x480に設定する
3. もう一度ウインドウサイズを800x600に設定する

3.がポイントだったようです。

まだ拡大表示の画質が荒すぎだとか、リサイズ操作にはまだ対応してないとか、VSyncWaitの操作とかで640x480に戻っちゃうとか色々課題はありますが、峠は越えたかなと思います。

2010-10-28 23:29 Updated by: yyagi
評語

10/27のコメントのやり方で、起動時だけは640x480外の解像度にできましたが、 その後ウインドウモード→フルスクリーンモード→ウインドウモード、とやると640x480に戻ってしまうことが判明。

同操作時に10/27のコメントのやり方を加えてもダメで、試行錯誤した結果はウインドウサイズが640x480になるか、 ウインドウサイズは800x600だが表示領域が左上の640x480だけになるかのいずれか。

多分deviceをResetせにゃぁならんのでしょうが、SlimDXではさてどうやるのだか。まだまだ調べることは多そうです。

2010-10-29 01:26 Updated by: from
評語

昔の DirectX SDK の Sample に、自由にウィンドウサイズを変えられるモノがあったような…… うーん、思い出せない……

2010-10-31 02:45 Updated by: yyagi
評語

どうしても BackBuffer のサイズと window のサイズを別々に設定できないなぁと思っていたのですが、 結局 SampleFramework が常にこれらを同じにするように設定していました・・・。

SampleFramework から Direct3D9.PresentParameters にパラメータを設定するところで BackBuffer を 640x480 固定にしたところ、今までの苦労がウソのようにあっさり解決しました(笑)

本当は SampleFramework の GraphicsDeviceManager に BackBuffer のサイズ変更I/Fを新設すべきところでしょうけれど、 そこまでは行っておらず。この辺はワイド化を実際に実行する時にでも改めて。

後はアスペクト比固定の変更と、640x480への戻し機能、Config.iniへの最終ウインドウサイズ保持/復元機能の追加ですかね。

2010-10-31 08:45 Updated by: from
評語

お疲れ様です。

順調に活動ランキングも上がってきたやぎさんに、これで安心して DTXMania をお任せできます。

という夢を見ました。(嘘です。本当は久しぶりにすごい悪夢でした。


で、いまさらなのですが、テクスチャ配置の座標系(Viewのグリッド)が 640x480 のままにして物理解像度だけ変えるのがいいよー とコメントしようとしてて、しかしその具体的な方法を思い出せないでいたのですよ。

SampleFramework がからんでいましたか。

というか、あのややこしい GraphicsDeviceManager の解析、お疲れ様です。

SampleFramework の解説は昔の「SlimDX と C# で学ぶ DirectX」のほうに書いてたんですけど、最新版の SlimDX では、SlimDX 開発者が「今回のサンプルは実用にならない」と断言するほどスリム化されてたので、バックアップをとって記事を消してしまったんですよ。


……と、言い訳ばかり残してひとまず退却ー。

2010-10-31 13:28 Updated by: yyagi
評語

順調にランキングが上がってきましたが、まずい傾向なんですよねぇ・・・鬱持ちが一人で黙々とコミットしている現状は。みんなコミットしようぜ!それとプロマネも相変わらず募集中!

バックアップを取って消されていたという記事、実は見たかったのですよ~~(笑)。ぐぐってそこにたどり着いたのに消えてたのでがっくり来ました。

んで、先のコメントに書きました通り、まだちょっとやるべきことは残っています。しかし、一応ウチの環境以外でちゃんと動くか動作確認して欲しいというのがあるので、現状の最低限の機能を搭載したリサイズ機能を後ほどtrunkにコミットします。

すみませんが画面のリサイズがきくか+フルスクリーン/ウインドウ化した後もなおリサイズができるか+その状態でプレイに支障がないか、ご確認いただけると助かります。

2010-10-31 14:56 Updated by: from
評語

うつが本格的に深まれば、もはや VC# を触ることすらどうでもよくなります、とフロムは自戒を込めてつぶやきます。

コミットお疲れ様です。

早速テストしてみました。


んー。ぐにぐに動きますね(笑

ここはやはり縦横比を維持したままスケーリングしたいところですね。


不具合としては、ウィンドウの縦幅を縮めていくと、ある地点からシーン切り替えのホワイトアウトの下部が切れてしまうようです。

今のところ、他に支障は見つかっていません。

2010-10-31 15:13 Updated by: from
  • 里程碑 Update from (無) to ウィンドウのサイズ変更機能の追加 (deleted)
2010-10-31 17:44 Updated by: yyagi
評語

ご確認いただきありがとうございました。縮小時にホワイトアウト等が切れる問題は、先ほどrev28で対処しました。ここだけウインドウサイズをチェックしていたのですね・・・。

そろそろ 640 とか480 とかの直接指定が入り乱れてきたので(汗; staticなクラスでも新設するか。

2010-11-02 00:52 Updated by: yyagi
  • Details Updated
評語

現状の実装での問題点をまとめます。(フォーラム等でいただいた情報より。)

  • OSがXPの時に限り、以下の現象が発生する。
    • 一度目のリサイズがうまくいかない(640x480に強制的に戻される)。2度目以降のリサイズなら問題ない。
    • フルスクリーンにしてウインドウモードに戻すと、ウインドウサイズが640x480に戻されてしまう。また、1度目のリサイズがうまくいかない現象が再発する。
    • VSyncWaitを変更しても、やはりウインドウサイズが640x480に戻されてしまい、また1度目のリサイズがうまくいかない現象が再発する。
  • 現時点で、以下3つの機能が未実装。
    • 縦横比固定でリサイズする機能。
    • 元の640x480に戻す機能。
    • Config.ini 経由で起動・終了時にウインドウサイズを取得・保存する機能

XP絡みの問題について、現時点では、原因ならびに対策が見えておりません。うーん・・・

2010-11-02 02:50 Updated by: yyagi
評語

何とか、以下2つに対応しました。
・XPでのリバウンド問題対応
 (XPでだけWindow_ScreenChangedイベントが発生していたためと思われ。対応コードを入れてウチの環境では正常動作することを確認。)
・Config.iniへのリサイズ座標の書き出しと読み出しに対応

以下はまだ未実装です。
・縦横比を維持したままリサイズする機能
・640x480に戻す機能(ちゃんと戻したくなったらConfig.iniを編集してください)

2010-11-02 09:05 Updated by: from
  • 里程碑 Update from ウィンドウのサイズ変更機能の追加 (deleted) to 新機能の追加
2010-11-08 01:07 Updated by: yyagi
評語

その後の状況です。(まだコミットしてません)

できたこと:

  • VSyncWaitのON/OFFでウインドウサイズが640x480に戻ってしまう問題があったが、修正済み。
  • ウインドウの最大化が無効化されていたので、使えるようにした。
  • 640x480に戻す機能を、とりあえずikanickさんのご提案通り「ウインドウのダブルクリック」で使えるようにした。

まだできていないこと:

  • 縦横比固定のリサイズ機能と、システムメニュー(タイトルバー左端をクリックして出る、最小化とか閉じるとかのメニュー)に「640x480に戻す」を追加すること。

前者向けの対応として、まずresizeイベントに処理をくっつけてみたのですが、どうもうまくいかない。 ぬるぬる動かず、また縦横どちらかだけサイズを変えるような場合にちゃんと動かない。

調べてみると、どちらも結局、Formが持っているWndProcのoverrideが必要っぽいのですが、DTXManiaの場合 WndProcはGameWindowクラスがFormから継承していて、Gameクラスがそのクラスにアクセスしていて、CDTXManiaクラスがGameクラスを継承している。

CDTXManiaクラスはFormを継承していないので、WndProcにはアクセスできず。そのためなんとかGameWindowからCDTXManiaまでWndProcのクチを引っ張り出さないと行けないのですが、なかなかうまくいかないです。んーーー。

正直この機能に時間を掛けすぎているきらいがあるので、このままうまくいかない状況が続くようであれば、(美しくないですが) GameWindowクラスを直接修正してこの機能を入れ込むようにするかもです・・・。

2010-11-08 07:59 Updated by: from
評語

調べてみると、どちらも結局、Formが持っているWndProcのoverrideが必要っぽいのですが、DTXManiaの場合WndProcはGameWindowクラスがFormから継承していて、Gameクラスがそのクラスにアクセスしていて、CDTXManiaクラスが Gameクラスを継承している。
CDTXManiaクラスはFormを継承していないので、WndProcにはアクセスできず。そのためなんとかGameWindowからCDTXManiaまでWndProcのクチを引っ張り出さないと行けないのですが、なかなかうまくいかないです。んーーー。
正直この機能に時間を掛けすぎているきらいがあるので、このままうまくいかない状況が続くようであれば、(美しくないですが) GameWindowクラスを直接修正してこの機能を入れ込むようにするかもです・・・。


そうなんですよねー。

SlimDX wiki の方にも問題点として書いてましたが、GameWindow の WndProc が override できないのです。

Game クラスが private で GameWindow のインスタンスを名指しで保持している時点でアウトですね。

ちなみに SlimDX Group では、この問題に対し、「GameWindow クラスを継承した子クラスを作ればいいんだぜ」と、とりつく島もありません。

それができないから困ってるんでしょうがー。


で、解決方法として、GameWindow クラスを修正することなく、CDTXMania クラス側で WndProc をフックするような実装を行った記憶があります。

具体的な実装方法は、ソース消失とともに忘れました……(涙


まぁ何かしら解決方法があったはずですが、そもそも当初やってた SampleFramework.dll の外部参照をやめてソースレベルでアプリ本体にマージするようにしたのは、この融通の利かないフレームワークを自分で好きに修正できるようにするためなのです。ですので、美しくなくても直接修正していって良いと思います。

SampleFramework.dll も MIT License なので、ソースを修正しても、冒頭のLicenseコメントさえ残しておけば公開義務はありませんしね。

2010-11-15 00:14 Updated by: yyagi
評語

お言葉に甘えて、GameWindow.cs を直にいじらせていただきました(笑)

縦横比を維持したまま、ぬるぬるリサイズできるようになりました。ありがとうございます。

ただ、まだタイトルバーの高さの分、計算を間違えているようですが・・・(汗;;;。 あと一息です。

2010-11-17 00:33 Updated by: yyagi
評語

rev39で、ウインドウの枠の大きさも考慮して計算するよう修正しました。ご確認ください。

個人的には、リサイズ後マウスを放したときの挙動がちょっと気にくわないものの、まあこんなもんかなと思います。

皆さんに試していただいて問題なければクローズします。長かった・・・。

2010-11-17 07:45 Updated by: ikanick
評語

リサイズ機能かなり順調ですね。お疲れ様です。

・システムメニューからの640x480機能確認しました。

・X軸・Y軸のみのリサイズはかならず4:3になるのを確認しました。ぬるぬる

・(ちょっと点滅するけど)斜めのリサイズを確認しました。といいたいところですが・・・!?

XP sp3だとY軸の計算が間違ってるのか、マウスのY移動量に比べてウィンドウのY伸縮量が少ないです。

(例えば一定の点から下にひっぱるとマウスの方が下にくる、ウィンドウはその分伸びてない)

例によってグラボはNVIDIA GeForceです。

2010-11-17 07:46 Updated by: ikanick
評語

連投ごめんなさい。ダブルクリックでフルスクリーン状態も確認しました。

2010-11-17 23:36 Updated by: yyagi
評語

ikanickさん、ご確認いただきありがとうございました。

・・・っていうか、ウインドウ右下を「上下に」ドラッグするだけでおかしくなりますね・・・。 ウチはWin7+チップセット内蔵グラフ(AMD)ですが、多分そちらで起きている現象と同じかと。

2010-11-20 02:08 Updated by: yyagi
評語

先ほどコミットしたバージョンで、何とか納得いく挙動にできました。

他の人が試して問題ないようであれば、今度こそクローズします。

2010-11-20 10:08 Updated by: from
評語

お疲れ様です。

試してみたのですが、ちゃんと動いてますね。ワイドにも対応していてすばらしい(笑。

このチケットがクローズしたら、そのリビジョンでいったんリリースするとしましょうか。


ただ、少々気になる点を2つほど。

  • 拡大時は画像もぬるぬるついてくるのに、縮小時はついてこないですね。
  • Alt+Enter で全画面とウィンドウを切り替えられる動作についてですが、うちでは XKeymacs で「変換」を「R-Alt」に替えており、これまでは 変換+Enter で切り替えが行えていたのですが、rev 44 ではそれが効きませんでした。うちのキーボードは L-Alt しかなく、片手で Alt+Enter が非常にやりにくい状態になってしまいました。(ミニキーボードなのでやろうと思えば何とか届きますが。)

なんとかならないでしょうか?(汗

2010-11-20 11:03 Updated by: yyagi
評語

fromさん、ご確認いただきありがとうございます。

  • 縮小時に画面がついてこない理由は、今のところ不明です。いつぞやのウインドウ非アクティブ時のsleep時の話と同様で「元々、SlimDXの中でそう設定されている」と思いますが、現状それと覚しき実装箇所を見つけることができていません。リサイズ完了時の処理はあちこちにあるのですが、リサイズ中の処理は全然無いんですよね。
  • Alt+Enterの件ですが、私はそのあたりは全く触ってないです。Rel 084では変換+EnterでOKでしたでしょうか?
2010-11-20 12:27 Updated by: from
評語

すみません。

うちでは XKeymacs で「変換」を「R-Alt」に替えており、

これがウソでした。(汗

正確には、XKeymacs のキーボード配置変更機能は Win7x64 では動作しないようです。

お騒がせしました。

2010-11-20 17:33 Updated by: yyagi
  • 處理結果 Update from to Later
  • 狀態 Update from 開啟 to 關閉
  • Ticket Close date is changed to 2010-11-20 17:33
評語

fromさん

了解しました。

それでは、縮小時に画面がついてこない件は「後で」として、全体としては「完了」にします。

2011-04-03 04:35 Updated by: yyagi
  • 類型 Update from 特色請求 to 新規機能リクエスト
  • 元件 Update from (無) to DTXMania

Attachment File List

No attachments

編輯

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » 登入