imgui - 親愛なるImGui:最小限の依存関係を持つC ++用の肥大化のないグラフィカルユーザーインターフェイス

(Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies)

Created at: 2014-07-21 22:29:47
Language: C++
License: MIT

親愛なるイムギ

「誰かに状態を与えると、いつかバグが発生しますが、同期を維持する必要がある2つの別々の場所で状態を表す方法を教えると、一生バグが発生します。」-ryg

ビルドステータス 静的分析ステータス

(このライブラリは自由で寛容なライセンスの下で利用可能ですが、継続的な改善を維持するためには財政的支援が必要です。メンテナンスと安定性に加えて、まだ追加されていない多くの望ましい機能があります。あなたの会社がDear ImGuiを使用している場合は、連絡することを検討してください。

ビジネス:請求されたスポンサー/サポート契約を介して継続的な開発と保守をサポートします:電子メール:
連絡先@ dearimguiドットコム
個人:ここで継続的な開発と保守をサポートします。スポンサーのページもご覧ください。

The Pitch-Usage-How it works-Releases & Changelogs-Demo-Integration
ギャラリー-サポート、FAQ-ヘルプ方法-スポンサー-クレジット-ライセンス
Wiki-Languages & frameworks backends/bindings-Software using Dear ImGui-User quotes

ピッチ

親愛なるImGuiは、C ++用の肥大化のないグラフィカルユーザーインターフェイスライブラリです。最適化された頂点バッファーを出力し、3D パイプライン対応アプリケーションでいつでもレンダリングできます。高速で、移植性があり、レンダラーに依存せず、自己完結型です(外部依存関係はありません)。

Dear ImGuiは、高速な反復を可能にしプログラマーコンテンツ作成ツールと視覚化/デバッグツールを作成できるように設計されています(平均的なエンドユーザー向けのUIとは対照的に)。この目標に向けてシンプルさと生産性を優先し、より高レベルのライブラリに一般的に見られる特定の機能が欠けています。

Dear ImGuiは、ゲームエンジン(ツール用)、リアルタイム3Dアプリケーション、フルスクリーンアプリケーション、組み込みアプリケーション、またはオペレーティングシステムの機能が非標準であるコンソールプラットフォーム上のアプリケーションへの統合に特に適しています。

  • 状態の同期を最小限に抑えます。
  • ユーザー側の状態ストレージを最小限に抑えます。
  • セットアップとメンテナンスを最小限に抑えます。
  • 動的データセットを反映した動的UIを作成するために使いやすい。
  • コード駆動型およびデータ駆動型のツールを作成するために使いやすい。
  • アドホックで短期間のツールや、長期間有効でより精巧なツールを作成するために簡単に使用できます。
  • ハックと改善が簡単です。
  • ポータブルで、依存関係を最小限に抑え、ターゲット(コンソール、電話など)で実行します。
  • 効率的なランタイムとメモリ消費。
  • バトルテスト済みで、ゲーム業界の多くの主要なアクターによって使用されています。

使い

Dear ImGuiのコアは、アプリケーション/エンジンで簡単にコンパイルできるいくつかのプラットフォームに依存しないファイル内に自己完結型です。これらはすべて、リポジトリのルートフォルダ(imgui*.cpp、imgui*.h)にあるファイルです。特定のビルドプロセスは必要ありません。.cpp ファイルを既存のプロジェクトに追加できます。

さまざまなグラフィックス API およびレンダリング プラットフォームのバックエンドバックエンド/フォルダーに提供され、サンプル アプリケーションが examples/フォルダーに用意されています。詳細については、このドキュメントの「統合」セクションを参照してください。独自のバックエンドを作成することもできます。テクスチャ化された三角形をレンダリングできる場所ならどこでも、親愛なるImGuiをレンダリングできます。

Dear ImGuiがアプリケーションでセットアップされた後、プログラムループの_どこからでも_使用できます。

ImGui::Text("Hello, world %d", 123);
if (ImGui::Button("Save"))
    MySaveFunction();
ImGui::InputText("string", buf, IM_ARRAYSIZE(buf));
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);

サンプルコード出力(ダーク、セゴイフォント、フリータイプ) サンプルコード出力(ライト、セゴイフォント、フリータイプ)

// Create a window called "My First Tool", with a menu bar.
ImGui::Begin("My First Tool", &my_tool_active, ImGuiWindowFlags_MenuBar);
if (ImGui::BeginMenuBar())
{
    if (ImGui::BeginMenu("File"))
    {
        if (ImGui::MenuItem("Open..", "Ctrl+O")) { /* Do stuff */ }
        if (ImGui::MenuItem("Save", "Ctrl+S"))   { /* Do stuff */ }
        if (ImGui::MenuItem("Close", "Ctrl+W"))  { my_tool_active = false; }
        ImGui::EndMenu();
    }
    ImGui::EndMenuBar();
}

// Edit a color stored as 4 floats
ImGui::ColorEdit4("Color", my_color);

// Generate samples and plot them
float samples[100];
for (int n = 0; n < 100; n++)
    samples[n] = sinf(n * 0.2f + ImGui::GetTime() * 1.5f);
ImGui::PlotLines("Samples", samples, 100);

// Display contents in a scrolling region
ImGui::TextColored(ImVec4(1,1,0,1), "Important Stuff");
ImGui::BeginChild("Scrolling");
for (int n = 0; n < 50; n++)
    ImGui::Text("%04d: Some text", n);
ImGui::EndChild();
ImGui::End();

my_first_tool_v188

親愛なるImGuiを使用すると、精巧なツールだけでなく、非常に短命のツールも作成できます。短命の極端な側面:最新のコンパイラのEdit&Continue(ホットコードリロード)機能を使用すると、アプリケーションの実行中に変数を微調整するためにいくつかのウィジェットを追加し、1分後にコードを削除することができます!親愛なるImGuiは、値を微調整するためだけのものではありません。これを使用して、テキストコマンドを出力するだけで実行中のアルゴリズムをトレースできます。独自のリフレクションデータとともに使用して、データセットをライブで参照できます。これを使用して、エンジン内のサブシステムの内部を公開したり、ロガー、検査ツール、プロファイラー、デバッガー、ゲーム作成エディター/フレームワーク全体などを作成したりできます。

仕組み

IMGUIパラダイムの背後にあるコア原則を理解したい場合は、WikiのIMGUIパラダイムについてセクションを確認してください。IMGUIは、ユーザーの観点から、余分な状態の重複、状態の同期、および状態の保持を最小限に抑えようとします。従来の保持モード インターフェイスよりもエラーが発生しにくく (コードとバグが少なく)、動的なユーザー インターフェイスの作成に役立ちます。

Dear ImGuiは、アプリケーションで簡単にレンダリングできる頂点バッファとコマンドリストを出力します。描画呼び出しの数と、それらをレンダリングするために必要な状態の変更はかなり少ないです。Dear ImGuiはグラフィックスの状態を直接知らないか触れないため、コード内の任意の場所(実行中のアルゴリズムの途中や独自のレンダリングプロセスの途中など)で関数を呼び出すことができます。Dear ImGui を既存のコードベースと統合する方法については、examples/ フォルダーのサンプル アプリケーションを参照してください。

よくある誤解は、イミディエイトモードのGUIをイミディエイトモードのレンダリングと間違えることですが、これは通常、GUI関数が呼び出されると、非効率的なドローコールと状態変更の束でドライバー/ GPUを叩くことを意味します。これは親愛なるImGuiが行うことではありません。親愛なるImGuiは、頂点バッファーとドローコールバッチの小さなリストを出力します。GPUに直接触れることはありません。描画呼び出しバッチは適切に最適であり、後でアプリで、またはリモートでレンダリングできます。

リリースと変更ログ

装飾された変更ログについては、リリースページを参照してください。 変更ログを読むことは、Dear ImGuiが提供するものを最新の状態に保つための良い方法であり、これまで無視していたいくつかの機能のアイデアが得られるかもしれません。

デモ

関数を呼び出すと、さまざまな機能と例を紹介するデモウィンドウが作成されます。このコードは、いつでも参照できます。デモは次のようになります

ImGui::ShowDemoWindow()
imgui_demo.cpp

ソースから例を作成できるはずです。そうでない場合は、お知らせください。親愛なるImGuiの機能を簡単に確認したい場合は、デモアプリのWindowsバイナリをここからダウンロードできます。

デモアプリケーションはDPIに対応していないため、4K画面で多少のぼやけが予想されます。アプリケーションでDPIを認識するために、フォントを別のスケールでロード/リロードし、スタイルをスケーリングできます(FAQを参照)。

style.ScaleAllSizes()

統合

ほとんどのプラットフォームでは、C ++を使用する場合は、imgui_impl_xxxxバックエンドの組み合わせを変更せずに使用できるはずです(例:+)。エンジンが複数のプラットフォームをサポートしている場合は、ファイルを書き換えるのではなく、より多くのimgui_impl_xxxxファイルを使用することを検討してください:これはあなたにとってより少ない作業であり、Dear ImGuiをすぐに実行できます。必要に応じて、後でカスタムエンジン関数を使用してカスタムバックエンドを書き直すことを決定できます。

imgui_impl_win32.cpp
imgui_impl_dx11.cpp

Dear ImGuiをカスタムエンジンに統合するには、1)マウス/キーボード/ゲームパッド入力の配線、2)GPU /レンダリングエンジンへのテクスチャのアップロード、3)テクスチャをバインドしてテクスチャ化された三角形をレンダリングできるレンダリング関数の提供の問題です。例/フォルダには、まさにそれを行うアプリケーションが入力されています。これらの概念に慣れている経験豊富なプログラマーであれば、Dear ImGuiをカスタムエンジンに統合するのに2時間もかからないはずです。FAQ、コメント、およびサンプルアプリケーションを読むのに時間を費やしてください!

公式に維持されているバックエンド/バインディング(リポジトリ内):

  • レンダラー: DirectX9, DirectX10, DirectX11, DirectX12, Metal, OpenGL/ES/ES2, SDL_Renderer, Vulkan, WebGPU.
  • プラットフォーム:GLFW、SDL2、Win32、Glut、OSX、Android。
  • フレームワーク:アレグロ5、エンスクリプテン。

サードパーティのバックエンド/バインディングのwikiページ:

  • 言語: C, C# と: Beef, ChaiScript, Crystal, D, Go, Haskell, Haxe/hxcpp, Java, JavaScript, Julia, Kotlin, Lobster, Lua, Odin, Pascal, PureBasic, Python, Ruby, Rust, Swift...
  • フレームワーク: AGS/Adventure Game Studio, Amethyst, Blender, bsf, Cinder, Cocos2d-x, Diligent Engine, Flexium, GML/Game Maker Studio2, GLEQ, Godot, GTK3+OpenGL3, Irrlicht Engine, LÖVE+LUA, Magnum, Monogame, NanoRT, nCine, Nim Game Lib, Nintendo 3DS & Switch (自作), Ogre, openFrameworks, OSG/OpenSceneGraph, Orx, Photoshop, px_render, Qt/QtDirect3D, SDL_Renderer, SFML, Sokol, Unity, Unreal Engine 4, vtk, VulkanHpp, VulkanSceneGraph, Win32 GDI, WxWidgets.
  • C バインディング (cimgui) は自動生成されるため、その json/lua 出力を使用して他の言語のバインディングを生成できることに注意してください。

便利な拡張機能/ウィジェットのwikiページ:

  • テキストエディタ、ノードエディタ、タイムラインエディタ、プロット、ソフトウェアレンダラー、リモートネットワークアクセス、メモリエディタ、ギズモなど。

その他のリンクやアイデアについては、Wikiも参照してください。

ギャラリー

Dear ImGuiを使用したプロジェクトのユーザー投稿のスクリーンショットについては、ギャラリースレッドをご覧ください。

サードパーティのウィジェットと拡張機能のリストについては、便利な拡張機能/ウィジェットのWikiページを確認してください。

カスタムエンジンerhe(ドッキングブランチ)
エルヘ
ワンダーボーイ:ドラゴンの罠のカスタムエンジン(2017)
ドラゴンの罠
カスタムエンジン(無題)
エディターホワイト
トレイシープロファイラー(github))
トレイシープロファイラー

サポート、よくある質問(FAQ)

よく寄せられる質問(FAQ)を参照してください。

多くのリンク、参考文献、記事については、Wikiを参照してください。

参照:IMGUIパラダイムに関する記事を参照して、イミディエイトモードGUIパラダイムについて読んだり学んだりしてください。

参照先:今後の変更

はじめ。コンパイル/リンク/実行に問題がある、またはフォントの読み込みに問題がある初めてのユーザーは、GitHubディスカッションを使用してください。その他の質問、バグレポート、リクエスト、フィードバックについては、GitHubの問題に投稿できます。新しい問題のテンプレートを注意深く読み、記入してください。

プライベートサポートは、有料のビジネス顧客(Eメール:連絡先@dearimguiドットコム)が利用できます。

どのバージョンを入手する必要がありますか?

リリースにタグを付けることがありますが(素敵なリリースノート付き)、一般的に安全であり、マスター/最新に同期することをお勧めします。ライブラリはかなり安定しており、リグレッションは報告されるとすぐに修正される傾向があります。上級ユーザーは、マルチビューポートおよびドッキング機能を備えたブランチ。このブランチは、マスターと定期的に同期されます。

docking

親愛なるImGuiを使用しているのは誰ですか?

誰が親愛なるImGuiを使用しているかのアイデアについては、引用スポンサー、およびDear ImGuiWikiページを使用するソフトウェアを参照してください。可能であれば、ゲーム/ソフトウェアを追加してください!また、ギャラリースレッドもご覧ください!

支援する方法

どのように私は助けることができますか?

  • GitHub フォーラム/問題GitHub ディスカッションを参照してください。
  • 開発を手伝ってプルリクエストを送信することができます!PRを提出することで、メンテナがコードをレビューし、そのメンテナンスを永久に引き継ぐためのリクエストも送信されることを理解してください。PRは、エンドユーザーの利益のために、またメンテナがそれを理解して受け入れやすくするために作成する必要があります。
  • その他のアイデアについては、Wiki必要なヘルプを参照してください。
  • あなたの会社に、請求されたスポンサー/サポート連絡先でこのプロジェクトを財政的に支援してもらいます(連絡してください:dearimguiドットコムの連絡先)。

スポンサー

進行中の親愛なるImGuiの開発は、ユーザーとプライベートスポンサーによって財政的にサポートされています。
詳細については、現在および過去の親愛なるImGuiサポーターの詳細なリストを参照してください。
2014年11月から2019年12月まで、進行中の開発は、Patreonのユーザーや個人の寄付を通じて財政的にも支援されてきました。

このプロジェクトを存続させ、繁栄させ続けるのを手伝ってくれた過去と現在のすべてのサポーターに感謝します!

Dear ImGui is using software and services provided free of charge for open source projects:

クレジット

Omar CornutとGitHubへのすべての直接的または間接的な貢献者によって開発されました。このライブラリの初期バージョンは、メディア分子のサポートを受けて開発され、ゲームティアアウェイ(PS Vita)で最初に内部的に使用されました。

定期的な寄稿者(2022):Omar Cornut@ocornut、Rokas Kupstys@rokups(自動化システム、回帰テスト、その他の機能に関する作業の大部分は現在未公開です)。

スポンサー、サポート契約、およびその他のB2Bトランザクションは、Lizardcubeによってホストおよび処理されます。

オマール:「私が最初にIMGUIパラダイムを発見したのはQ-Gamesで、アートマン・ビンストックがコードベースに独自の単純な実装を落とした場所であり、かなりの時間を費やして改善し、考えました。アートマンはケーシーと協力することでこの概念に直接触れたことが判明しました。Media Moleculeに移ったとき、私は最初に扱ったライブラリの欠陥と制限を克服しようとして新しいライブラリを書き直しました。それがこのライブラリになり、それ以来、私はそれを繰り返して改善するのに不当な時間を費やしてきました。」

ProggyClean.ttfTristan Grimmer (MIT ライセンス) によるフォントが埋め込まれています。
Sean Barrettによるstb_textedit.h、stb_truetype.h、stb_rect_pack.hを埋め込んでいます(パブリックドメイン)。

初期バージョンのインスピレーション、フィードバック、テスト:ケイシー・ムラトリ、アートマン・ビンストック、ミッコ・モノネン、エマニュエル・ブリニー、ステファン・カモダ、アントン・ミハイロフ、マット・ウィリス。また、GitHub にフィードバック、質問、パッチを投稿してくださった皆様にも感謝します。

ライセンス

親愛なるImGuiはMITライセンスの下でライセンスされています、詳細についてはライセンス.txtを参照してください。