2023年10月21日

Nim言語: ImGui: ImPlotライブラリのメモ (2023/10)

Nim言語: ImGui: ImPlotライブラリのメモ (2023/10)

Nim言語: ImGui: ImPlotライブラリのメモ (2023/10)

Nim言語用 ImPlot バインディング ライブラリ


Nim言語からDear ImGui内でImPlotライブラリを使える様に
インポートライブラリnim_implotを作りました

ImPlotDear ImGui用のライブラリで元々C++言語で書かれていて
CImPlotプロジェクトを介して各種言語にインポートされています

Nim言語にはImPlotを誰もインポートしてなかったので
今回自分でインポートライブラを作ってみた記録

使い方


Nim言語 デモプログラム


ImPlotのデモプログラムを全てNim言語で書き直しました
デモは全部で50種類以上あります

詳細はここを参照

一部を載せておきます

LogScale.nim
alt

ItemSharing.nim
alt

DragRects.nim
alt

凡例を日本語にすることも可能ですが
日本語フォント設定が必要なので別プロジェクトで試しました

alt

posted by Copyright (C) audin All Rights Reserved. at 12:57| Comment(0) | Nim言語 | このブログの読者になる | 更新情報をチェックする

2023年08月27日

Nim言語: 続 ImGui 2023/08

Nim言語: 続 ImGui 2023/08

Nim言語: 続 ImGui 2023/08

ImGui: Nim言語バインディングライブラリの経緯


  1. Nim言語用のImGuiバインディング Nimgl (ImGui v1.84.2) (2021/08/25) の中から
    ImGuiライブラリだけを抜き出して独立させたのが
    https://github.com/nimgl/imgui (ImGui v1.85) (2021/10/20)
    というライブラリ
  2. これをベースにしたgithubフォークの中で最も新しいImGuiに対応したのが
    https://github.com/daniel-j/nimgl-imgui (ImGui v1.88) (2022/08/22)
  3. さらにこれをベースに現在最新のImGui v1.89.8 (2023/08)に自分で対応してみたのが
    https://github.com/dinau/nimgl-imgui

ImGui v1.89.8 (2023/08) 対応時のメモ

ImDrawIdxの32bit化対応

  1. 将来 ImPlot (注1)も使うため ImDrawIdx の32bit化に対応 (注2)
    こういう状態に陥ったらImDrawIdx の32bit化で解決します

  2. ImDrawIdx の32bit化はNim言語のバックエンドコンパイラがC++言語の場合のみとした
    例えば以下の様にGUIアプリをコンパイルした時のみ。
    (この場合ImGui/CImGuiはスタティックリンクされます)

    nim cpp -d:release myGuiapp.nim

    ImDrawIdx の32bit化に伴いOpenGLバックエンドドライバはImGui付属の最新版(2023/08時点の)を使用している
    元々のNim言語で書かれたOpenGLバックエンドドライバだとImDrawIdx の32bit化方法が理解できないので 断念しています

  3. Nim言語のバックエンドコンパイラが C言語 の場合
    ImDrawIdx の32bit化はされません。 16bitのままです
    例えば以下の様にGUIアプリをコンパイルした時、
    (この場合 ImGui / CImGui はダイナミックリンクされます(別途cimgui.dllが必要))

    nim c -d:release myGuiapp.nim
  4. まとめ

    バックエンドコンパイラ ImDrawIdx 32bit化 ImGui / CImGuiリンク方法
    C++言語 (cpp) スタティック
    C言語 (c) - ダイナミック cimgui.dll必要

デモ


今回修正したImGuiライブラリのテストプログラム実行方法

git clone  https://github.com/dinau/nimgl_test
cd nimgl_tset
nimble build
nimble party

で下画像のデモが起動する

このページから ImDrawList coding party - deadline Nov 30, 2020! #3606
2つのデモをNim言語用に変換したもの

alt

ImDrawIdx 32bit化の確認方法


上記画像の右側のウインドウで

  1. Tools - About Dear ImGui を選択
  2. About Dear ImGui ウインドウ内の Config/Build Information をチェック
  3. 出現した行の2行目当りで sizeof(ImDrawIdx) :4 となっていればOK


  • (注1) 拙作 Imguin では ImDrawIdxの32bit化もImPlotも対応済み

  • (注2) ImDrawIdxの32bit化の話
    Extremely Important Note

    • Dear ImGui uses 16-bit indexing by default, so high-density ImPlot widgets like ImPlot::PlotHeatmap() may produce too many vertices into ImDrawList, which causes an assertion failure and will result in data truncation and/or visual glitches. Therefore, it is HIGHLY recommended that you EITHER:
    • Option 1: Enable 32-bit indices by uncommenting #define ImDrawIdx unsigned int in your ImGui imconfig.h file.
    • Option 2: Handle the ImGuiBackendFlags_RendererHasVtxOffset flag in your renderer if you must use 16-bit indices. Many of the default ImGui rendering backends already support ImGuiBackendFlags_RendererHasVtxOffset. Refer to this issue for more information.
posted by Copyright (C) audin All Rights Reserved. at 19:37| Comment(0) | Nim言語 | このブログの読者になる | 更新情報をチェックする

2023年06月10日

Nim言語:ImGuiで試しにGUIを作ってみた 2023/06

Nim言語:ImGuiで試しにGUIを作ってみた 2023/06

Nim言語:ImGuiで試しにGUIを作ってみた 2023/06

はじまり


前回のブログで、
Nim言語: ImGui と日本語入力のメモ 2023/03
日本語入力問題が解決したので試しに何かのGUIを作ってみたのがこれ
クリックで動画再生

Windows10用だけどLinux(Debian Bullseye)上でコンパイルすれば全く同じものが起動して
びっくりした(注1)(注2)

コード等のメモ


  • 以前作ったImguinプロジェクトのサンプルコード
    ImGui(GLFW,OpenGL)+日本語入力サンプルにコードを追加していっただけ

  • Fontx2フォント描画はImPlotの散布図で描画 (-:

  • ImPlotを使ったのでEXEファイルのサイズが6.5MBと巨大になってしまった
    (gcc使用のフルスタティックリンク) )
    MSVCのコンパイラなら4MBくらいだったか

  • ImPlot非使用なら1.3MB(gcc)/1MB(MSVC)くらい


(注1) Linux上でコンパイルできる様な配慮は必要
(注2) Linux上では日本語入力はうまく動かない orz

posted by Copyright (C) audin All Rights Reserved. at 18:52| Comment(0) | Nim言語 | このブログの読者になる | 更新情報をチェックする

2023年03月25日

Nim言語: ImGui と日本語入力のメモ 2023/03,2023/07

Nim言語: ImGui と日本語入力のメモ 2023/03,2023/07

Nim言語: ImGui と日本語入力のメモ 2023/03,2023/07


前回 Nim言語: GUIライブラリNimgl/ImGuiを発見した時のメモ 2023/02Nimglだと
ImGui / CImGui古くて日本語入力がまともにできなかったが(注1)
(2023/07 修正) Nimglでも日本語入力・表示が可能でした

ImGuiを最新版にすることによって日本語入力が普通に可能となることがわかった
ただしNimglは使わずにImGui/CImGuiをFutharkを使ってNim言語から呼び出す(imguin)ことにした

ImGuiを日本語入力可能でコンパイルする方法


  • 前提条件
    1. 最新版 ImGui v1.89.4
    2. Windows10
    3. 日本語表示を含むソースコードがBOMなしUTF-8で保存されていること
    4. 日本語フォントがプログラム上で追加されていること
      (日本語フォントが表示できないと日本語入力がまともにできないので)
    5. コンパイラはどれでも可 MSVC(MS Visual Studio C/C++),MinGW GCC,Clang
  • 肝(キモ) 条件 (-:
    • C++のコンパイルオプションに以下を追加するだけでした (-limm32も必要)

      -DIMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS

      ImGuiのソースコード内をIMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONSで検索すればわかるけど
      GCC,Clangを使う時はこれが必須となる。 ただしSDL2バックエンドはこの対応外となっていて日本語入力がうまくいかない状態になっている orz
      またDriect3DバックエンドでMSVCを使う場合はデフォルトで有効になっているので
      上記オプションは不要
      覚えるのもアレなので一律上記オプション指定で解決とする

Nimgl: 日本語入力についての補足 (2023/07)


現時点のNimgl-1.3.2(ImGui は少し古いv1.84.2)でも日本語入力・表示が可能でした
こちらの方の Dear ImGuiで日本語入力時のIMEの位置をいい感じにする
を見たのでまたNimglの方を見直したらオプションの与え方を間違えていました
以下は書き方の概略を例として記述

  • 間違い

    $ nim --backend:cpp -d:IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS ...

    これだと

    IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS

    という定義が Nim言語ファイル(*.nim)内だけしか有効にならない
    C/C++言語ファイル群には影響を及ぼさない
    というのが原因でした orz

  • 正解
    この書き方はC/C++言語内のみで定義が有効となる

    $ nim --backend:cpp --passC:"-DIMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS" ...

このミスは何度かやらかしました orz
この問題を修正したNimgl日本語テストプログラムはこれ
nimgl_test
(既に取得済みの場合、最新版を再取得して下さい)

以下のimguinを作る時はFuthark対応の試行錯誤の過程で 正しく設定できていた様です

成果物


Nim言語から呼び出すexamplesプロジェクトを作った

imguin

ポイント
  1. ImGui/CImGuiの最新版に対応 現在 v1.89.6 (2023/07)

  2. ImGuiの最新版に自分で簡単にアップデートできる。(Futharkが必要) 後述

  3. アイコンフォント Icon font (Font Awesomei v6)に対応

    glfw_opengl3
    alt
    FAQ: How-can-i-load-multiple-fonts
    https://github.com/juliettef/IconFontCppHeaders

  4. 日本語入力・表示OK
    glfw_opengl3_nimgl_imguin_jp
    alt

  5. デモにImPlotも追加した glfw_opengl3_implot
    alt

    ald

Futharkについて


C言語のヘッダファイルをNim言語に変換する強力なツール Futhark
この手のツールにはNimterop(未使用詳細不明)とかc2nimとかがある

  • Futhark
  • Nimterop
    • C/C++可能
    • バックエンドは tree-sitter を使用
  • c2nim
    C/C++可能

Futharkを選んだのは偶然でC++対応のNimteropのほうが良かったかもしれないが
現時点で詳細は不明
そのうち試そう

Futharkを使って最新のImGui/CImGuiにアップデートする


Futharkのインストールやその他詳細は上記 imguinページを参考にして下さい

  • imguinでImGui/CImGuiを最新版にアップデートする場合

    pwd
    imguin
    cd src/updater
    make

    特定バージョンに切り替える場合、上記makeの部分を

     make CIMGUI=1.89.5dock
     or
     make VER=1.89.5dock

    等とする。指定可能バージョンはCImGuiのgitタグ or ブランチ名

  • (注1) 2023/04 Nimglの作者がNimglで使用しているImguiのアップデートに向けて
    動きだした様です
  • (注2) Futharkが出力する定数名、構造体名、関数名等のシグネチャは
    1. 可能な限り小文字
    2. アンダースコアはカット
      等々の規則が適用されて非常に見にくいので
      1. enum系定数名先頭部分を大文字に変換

      2. アンダースコアを適度に追加
        という変換 をテキトーにかませてあります。 orz
        例えばFutharkはこう出力してくるので、

        Imguiwindowflagshorizontalscrollbar = 2048,

        これを 以下の様に変換してます

        ImGui_WindowFlags_HorizontalScrollBar = 2048,

        アンダースコア入れるのはNim言語的には非推奨なんだけど、
        視認性優先でこうしています

        ちなみにNim言語的にはこうかな

        ImGuiWindowFlagsHorizontalScrollBar = 2048,

        orz

posted by Copyright (C) audin All Rights Reserved. at 19:19| Comment(0) | Nim言語 | このブログの読者になる | 更新情報をチェックする

2023年02月25日

Nim言語: GUIライブラリNimgl/ImGuiを発見した時のメモ 2023/02,2023/07

Nim言語: GUIライブラリNimgl/ImGuiを発見した時のメモ 2023/02,2023/07

Nim言語: GUIライブラリNimgl/ImGuiを発見した時のメモ 2023/02,2023/07

Nim言語用のGUIライブラリ(バインディング)はいろいろあるが、
NimglというGUIライブラリを見つけたのでメモする

Nimglライブラリ


NimglDear ImGui(以下ImGuiと表記)というC++で書かれたマルチプラットフォーム(Windows,Linux,Mac,etc)GUIライブラリを
CImGuiライブラリ経由でNim言語から利用するラッパーライブラリとなっている

  • CImGuiライブラリ
    CImGuiライブラリはImGuiライブラリをC++以外の言語から使えるようにするための
    C言語インターフェースライブラリとなっている
    このライブラリのおかげで多数の言語からImGuiが使えるのだった
    有名どころの言語なら使えるかも。。。 Bindings

ImGuiライブラリ

動作デモ

以下はImGuiライブラリでどういうGUI要素(Widget)が表示され/使えるかのデモ画面です
ライブ・デモはこれ(v1.88) スゴ
ImPlot: Imguiのアドインライブラリ ライブ・デモ これもスゴ

参考: (egui ライブ・デモ ImGuiにインスパイアされたRust版GUI)

以下はImGuiのスタンドアロンアプリ(*.exeとか)を作るときの話、

alt

  • 上の画像のGUIがそのまま試せる公式が配布しているデモEXEファイルは以下。Windows用です
    (Windows, 1.88 WIP, built 2022/05/04, master)
    https://www.dearimgui.org/binaries/imgui-demo-binaries-20220504.zip
    起動時は簡素なメニューしかないけど、実際は上画像の様にかなり
    詳細なデモアプリになっていて
    全部クリックして試すと膨大な時間が掛かりそう
    (現状、全部は試してないです)
    デモの実行ファイルサイズは800KBくらい(MSVC)(100KBくらいのVCRUNTIME140.dllに依存)

  • 日本語表示・入力 対応外部DLL不要版: こちらでコンパイルした最新版デモEXE
    imguin-v1.89.4-jp-ime-ok-2023-03-25.7z

以下はギャラリー
Gallery: Post your screenshots PART16

参考リンク

ベースとなるImGuiについてのメモ

  1. 元(今でも?)はゲームエンジン等々のプロパティや属性を設定してデバッグ、調整するための
    (簡易な?)GUIライブラリだった?模様(詳細不明)。 UE4で使用されている様だ(詳細不明)

  2. GUIライブラリとしては超軽量(Gtk,Qt 比)
    Windows10上のスタティックリンクだと以下になる(注2)

    コンパイラ 最小EXEサイズ: Windows10上
    MS Visual Studio C++ 800K程度 + 100KB程度(VCRUNTIME140.dll)
    GCC 1.3Mバイトから1.7Mバイト程度 (外部依存DLL無し)(-d:lto指定なし)

    GUI部品ライブラリ(or Widget集? or フレームワーク?)としては軽量であることを考慮すれば悪くないかも

  3. GtkやQtに比べればEXE(dll)のサイズは極小である。(注1)

  4. ただし、Gtk,Qt,Visual Studio + { C#,VB,WPF }, Delphi/C++Builder/Lazarus等々と比べると
    GUI部品機能としては少し物足りない部分があるかも、 例えば

    1. ツールバー、ツールボタン、スピンボタン等々に相当する物がない風
    2. カラー・イメージ・アイコン等々がメニューを含め全体的に使用できない風
    3. レイアウト機能が貧弱または限定的、固定的風 (個人の感想です 😃
  5. ボタンや部品を画面に貼り付けてGUIを作る様なことはできない
    全てコードベタ書きで作ります
    これらでできる様です

  6. ファイルオープンダイアログ系が標準ではできない
    別途 プラグインで対応可能

    • ImGuiFileDialog :マルチプラットフォーム対応
      使ってみたけど かなりカスタマイズ性が高いです
      このライブラリだけでEXEファイルが1Mバイト程度増加します(gccの場合) orz
      alt
    • ImGui-Addons
      こういうファイルオープンダイアログもある様だ。軽量かも(未確認)
      https://www.youtube.com/watch?v=cPyfgYFdiy0
      alt

軽くしたいならOS固有のAPIを使えばOKではある (Win32APIとか)

ImGuiの日本語対応 (2023/03 修正と追記)(2023/07 さらに修正)

日本語入力についてのメモ

  1. Nimgl(ImGui v1.84.2)については 単語変換候補の表示位置がズレる問題と
    入力中の文字列が見えない点が大きい(そこを我慢すれば入力自体は可能)
    Nimglにこだわるなら最新版の変更をNimglに自前でバックポートするのも手かも

    どうもこちらの間違いだった様で日本語入力・表示とも正常にできることを確認しました(2023/07)
  2. 最新版のImGUi v1.89.3 では日本語入力はSDL2系を除いて問題なく可能となった
    v1.84.2の時点で既に日本語入力可能でした(SDL2系を除く)
    詳細は 次のブログに記述 Nim言語: ImGui と日本語入力のメモ 2023/03
描画のバックエンド

実際に描画する時のUIと描画ドライバ(バックエンド)を多数から選択できる

各種言語バインディングについてのメモ


過去の体験からするとC/C++以外だとGUIやグラフィカル・ライブラリの言語バインディング
うまく動作する例があまりない印象だった。
ある言語の特定バージョン縛りだったり、
裏でgccやMSVCが必要だったりで挫折したり等々

最近のPythonなんかは例外的にうまくいっている気はする
と思ったら
2023/02時点で Python3.11でImGuiを使うのは無理で Python3.10ならOKだって
orz orz

Nim言語でNimglをコンパイル


Nimgl: Nim言語: 珍しく すんなりコンパイル実行できた (^^;

目標

上述のデモアプリ相当のものをNim言語でコンパイル・実行する

必要条件
  1. Windows上
  2. Nim言語 Nim-1.6.10 (2023/02 時点)でHello World程度がコンパイル実行できていること
    (Nim言語のHello Worldは echo "hello world" の 18文字で動作する)
  3. Gitがインストールされコマンドラインで動作すること
  4. Linuxツールズを少々 rm,makeコマンドとかetc
コンパイルと実行

適当な作業フォルダで

$ git clone https://github.com/dinau/nimgl_test
$ cd nimgl_test
$ nimble build  # これは依存関係ファイルを導入するために必要

実行は、

$ nimble jpfont
  • GUIのバックに表示されるDOS窓を消す方法
    config.nims
    内の

    switch "app","gui"
    

    を有効(行頭の#をカット)にして再コンパイル

Linux系 Debian 11 Bullseye でコンパイルするための準備

Debianは以下の事前インストールで上記Nimglデモがコンパイル実行できました。
恐らくUbuntuでも同じかも(未確認)

$ sudo apt install xorg-dev libopengl-dev ibgl1-mesa-glx libgl1-mesa-dev

コンパイルエラーやリンクエラーが出た場合はその内容から予測して
適宜ライブラリを追加してみて下さい (^^;

Nimgl 日本語表示 デモexe

コンパイル済みデモEXEファイル nimgl-test-jp-font-imgui-v1.84.2-ime-ok-2023-07.exe.7z (ソース)

  • 左のウインドウにテーマセレクタとフォントセレクタを追加した(2023/07)

    alt

  1. Nimglに付属のImGuiはv1.84.2とちょっと古い(約1年前)もののひとまずOKとする
    ImGuiは現在の最新版v1.89.8 (2023/08)に差し替えました

  2. ファイルオープンダイアログはNim用の簡易なものを採用した nim-osdialog
    ソース行

  3. 日本語フォントは4種類登録したのでWindows10なら表示可能
    ソース行

    ("meiryob.ttc","メイリオ B",14.0)
    ,("YuGothM.ttc","遊ゴシック M",11.0)
    ,("meiryo.ttc","メイリオ",14.0)
    ,("msgothic.ttc","MS ゴシック",11.0)
    #,("myricam.ttc","MyricaM",11.0)])
    

    フォント名の「游ゴシック」を「遊ゴシック」に変更しているが
    io.fonts.getGlyphRangesJapanese()
    部分の範囲変更で対応可能と思われる

DLLを使ってフルコンパイル時間を短縮する

(追記 2023/04) コンパイル時間短縮の件は「ccache」(のマスカレード機能)導入で
お気楽極楽全面解決したのでどうでもよくなってしまったのが現状(追記終わり)

以下 MinGW/gccを使う場合(注3)の話

スタティックリンクだとGLFW3とImGuiのコンパイルに時間がかかるので
この2つとg++のstdc++もダイナミックリンクにします

  • 利点
    各種ライブラリをDLLにすればフルコンパイル時間が大幅に短縮される

  • 欠点
    Winodwsの場合、ImGuiをDLL化して使うのは非推奨となっている。
    DLL呼び出しのオーバーヘッドで実行速度が落ちるらしい
    でもスクリプト言語系のバインディングは全部DLL型なので気にしなくてOKかも

  • 採用
    開発中はDLLリンクで使い、リリース時にスタティックリンクに変更すればいいという方針

  • 分離されるDLL

    1. cimgui.dll : 別途コンパイルが必要(MinGWのgccで)

      cd C:\Users\%USERNAME%\.nimble\pkgs\nimgl-1.3.2\nimgl\private\cimgui
      make
      

      カレントフォルダにcimgui.dllができるのでこれを使う
      $ strip cimgui.dll でデバッグ情報を削ればサイズは小さくなる

    2. glfw3.dll
      https://www.glfw.org/downloadここから glfw-3.3系列を取得
      mingw用のglfw3.dllを使う
      後述の自前でコンパイルでもOK

    3. libstdc++-6.dll
      gccに実行パスが通っている限り気にしなくて良い

    4. cimgui.dllglfw3.dllは nimgl_test.exeと同じフォルダに置く

  • リンクをダイナミック・リンクに変更する
    config.nims内で

    const STATIC_LINK = false
    

    とした後

    pwd
    nimgl_test
    
    make clean
    make
    

    で完了

GUIアプリの ひな形プロジェクト


その他の参考リンク


CImGuiは Dear Bindingsに移行しようとしている


C言語インターフェース(各種言語バインディング用)はCImGuiをやめてDear Bindingsに移行しようとしているみたいだけど
状況は未調査

glfw3.dllを自前でコンパイルするメモ


上ではglfw本家からダウンロードしたがNimgl付属のソースからglfw3.dllを生成する方法のメモ

$ git clone https://github.com/nimgl/nimgl

nimgl/private/glfw/CMakeLists.txtの 25行目の

option(BUILD_SHARED_LIBS "Build shared libraries" OFF)

option(BUILD_SHARED_LIBS "Build shared libraries" ON)

に変更後、

$ cd nimgl/private/glfw
$ mkdir build
$ cd build
$ cmake .. -G"MSYS Makefiles"
$ make glfw

で ./src/glfw3.dll が生成されている
$ strip ./src/glfw3.dllでデバッグ情報を削除可能

デモアプリEXEも同時に作りたいときは、

make

だけで ./examples./testsの中にEXEファイルが生成される


(注)

(注1) EXEの小ささを言えばC#が恐らく最小。(.NETライブラリがWindows標準装備なので)
でも単独バイナリEXEにまとめると10MBくらいだった orz
(注2) VCRUNTIME140.dllが外部DLLかどうか不明なものの
100KBくらいなのでコードサイズ的な影響は小さい
スタティックリンクにする場合は以下を参照
imguiのサンプルを動かす
(注3) MSVC(MS Visual Studio C++)ではコンパイル不能(--cc:vcc 時)

変更履歴


posted by Copyright (C) audin All Rights Reserved. at 17:09| Comment(0) | Nim言語 | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。