トップページ > 記事閲覧
Android 環境で ImGui を使用したい
名前:TAKU 日時: 2022/09/14 00:42

Android 環境で ImGui を使用できるよう対応中なのですが、解決できない問題に引っかかていますので手助けをお願いしたいです。 プロジェクトに ImGui のコードを組み込んでコンパイルが可能な状態にまでなっているのですが、ImGui の初期化が正しく行えず問題が起きています。 以下 ImGui のアンドロイド環境における初期化関数 > IMGUI_IMPL_API bool ImGui_ImplAndroid_Init(ANativeWindow* window); こちらの関数に ANativeWindow を引き渡さなければならないのですが、現状 ANativeWindow の正しい取得方法がわかりません。 一応 >ANativeWindow* ANativeWindow_fromSurface(JNIEnv* env, jobject surface); という関数があり、こちらの戻り値が ANativeWindow なのですが、引数の [surface] に設定するデータをどのように取得するのかがわかりません。 [env] は DxLib::GetNativeActivity() から取得する情報が使えそうです。 ただ、この取得方法が DxLib 環境で使用して問題ないのかも不明です。 別のスレッドで「ANativeWindow_getWidth、ANativeWindow_getHeight」の二つを DxLib内部で使用しているようですので、 DxLibの内部では ANativeWindow を正常に利用出来ていて外部に公開していないのかもとも思いました。(こちらを外部に公開していただければ、ImGui の初期化が成功するかも?) ANativeWindow の取得方法について何か情報がありませんでしょうか? どうかよろしくお願いいたします。
メンテ

Page: 1 |

Re: Android 環境で ImGui を使用したい ( No.1 )
名前:管理人 日時:2022/09/15 00:53

> 別のスレッドで「ANativeWindow_getWidth、ANativeWindow_getHeight」の二つを DxLib内部で使用しているようですので、 > DxLibの内部では ANativeWindow を正常に利用出来ていて外部に公開していないのかもとも思いました。(こちらを外部に公開していただければ、ImGui の初期化が成功するかも?) はい、お察しの通りDXライブラリ内部では普通に ANativeWindow を使用しています DXライブラリ内部で使用している ANativeWindow を取得するための関数を追加してみましたので、 よろしければこちらの暫定最新バージョンをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版 以下の関数を追加しました // アプリの ANativeWindow を取得する const ANativeWindow *GetNativeWindow( void ) ; よろしければお試しください m(_ _)m
メンテ
Re: Android 環境で ImGui を使用したい ( No.2 )
名前:TAKU 日時:2022/09/15 22:14

管理人さん ご対応ありがとうございます。 頂いた DxLib で無事 ImGui の初期化に成功し表示まで漕ぎつけました。 ただ、上下が反転された状態で描画されたり、別のアプリに切り替えて元の開発中アプリの戻ると imGui が非表示になったりなど問題がありますが、 ImGui 固有の問題だと思いますので別途対応していきたいと思います。 ご対応ありがとうございました。
メンテ
Re: Android 環境で ImGui を使用したい ( No.3 )
名前:TAKU 日時:2022/09/16 23:35

管理人さん お疲れ様です。 Android上の ImGui を操作するために、 ImGui 側へ入力データを渡さなければならないのですが、その関数が > IMGUI_IMPL_API int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event); となっており AInputEvent を要求しています。 こちらについて現状取得方法が見つからず、どうしようもない状態です。 こちらは DxLib を拡張していただければ、ImGui へ入力を渡すことが出来るようになるのでしょうか? また、表示している ImGui が上下反転する問題について調べているのですが、こちらについて進捗無しな状態になっています。。。 何か情報があればいただけないでしょうか? 大変お手数をお掛けしますが、以上の通りとなります。よろしくお願いいたします。
メンテ
Re: Android 環境で ImGui を使用したい ( No.4 )
名前:管理人 日時:2022/09/17 05:24

AInputEvent は入力関係のイベントを検出したときにDXライブラリ内部で取得しているもので、 取得して使用したらすぐ廃棄、という類のものなので、ANativeWindow のような取得関数の形ではなく DXライブラリ内部で AInputEvent を処理するタイミングで呼ばれるコールバック関数を登録する形にしました コールバック関数を登録するための関数を追加したバージョンをこちらにアップしましたので、 よろしければダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版 以下の関数を追加しました // アプリの入力イベントをフックするコールバック関数を登録する // CallbackFunction : 入力イベント発生時に呼ばれるコールバック関数、NULL を渡すと設定解除 // InputEvent : 発生した入力イベントの AInputEvent // Data : コールバック関数に渡すアドレス、不要な場合は NULL int SetAndroidInputEventFookFunction( int32_t ( *CallbackFunction )( AInputEvent *InputEvent, void *Data ), void *Data ) ; 恐らくこのようなコールバック関数を用意して int32_t InputCallbackFunction( AInputEvent *InputEvent, void *Data ) { return ImGui_ImplAndroid_HandleInputEvent( InputEvent ); } DxLib_Init の後にでも SetAndroidInputEventFookFunction( InputCallbackFunction, NULL ); ↑ このように関数を登録していただければ大丈夫だと思います ( 登録された InputCallbackFunction はDXライブラリが内部で AInputEvent を取得して扱うタイミングで呼ばれます ) > また、表示している ImGui が上下反転する問題について調べているのですが、こちらについて進捗無しな状態になっています。。。 > 何か情報があればいただけないでしょうか? Android の OpenGL ES 2.0 の座標系が Direct3D とは上下が逆でDXライブラリ内部でも描画時にY座標を反転しています ImGui にも上下反転するようなフラグや設定などが無いでしょうか?
メンテ
Re: Android 環境で ImGui を使用したい ( No.5 )
名前:TAKU 日時:2022/09/17 23:07

管理人さん ライブラリの拡張ありがとうございます。 ImGui へ入力を渡すことが出来ました。問題なく動作しています。 ご対応ありがとうございました。 >Android の OpenGL ES 2.0 の座標系が Direct3D とは上下が逆でDXライブラリ内部でも描画時にY座標を反転しています >ImGui にも上下反転するようなフラグや設定などが無いでしょうか? github.com/ocornut/imgui/issues/1047 どうやら、射影行列をの Y を反転させることで解決できるらしいですが imGui の外部から射影行列の変更をする方法がなくて積んでます。。。 (実は自分が見つけることが出来ていないだけかもしれませんが・・・) github.com/ocornut/imgui/issues/3143 また OpenGL4.5 が使えるのであれば、このような手法もあるみたいですが。。。 上下反転の問題を解決にするには少し時間がかかるかもしれません。。。 ライブラリの拡張に関しまして大変ありがとうございました。
メンテ
Re: Android 環境で ImGui を使用したい ( No.6 )
名前:TAKU 日時:2022/09/18 15:30

管理人さん お疲れ様です。 ImGui の表示が上下逆になる問題ですが、ImGui 側のコードを改造する方法で解決しました。 内部で計算している射影行列の Y を反転し、シザーの処理も上下が反転した座標を見るようにしています。 一応この対応で想定通りの挙動を行うようになりました。 コードを改造するという不本意ながらの対応でしたが、それ以外の解決方法が不可能そうでしたのでとりあえずこの形で完了ということにしておきます。。。 手助け本当に助かりました。ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存