Skip to content
This repository has been archived by the owner on Nov 12, 2023. It is now read-only.

[EU] Editor Modules

Madman10K edited this page Aug 10, 2023 · 3 revisions

Editor modules are a way to extend the editor with custom tools

Module types

There are 4 types of modules

  • Details Panel
  • Tools
  • Independent
  • Top Bar

These modules are rendered using function pointers/lambdas containing calls to dear imgui

  • Details panel - requires a pointer to an actor as an argument
  • Tools - requires a tool flag as an argument
  • Independent - requires an info struct as an argument
  • Top bar - takes nothing as an argument

Rendering

Details panel module creation

EditorModules::addDetailsPanelModule([](Actor*, bool&){ ImGui::Text("Hello, World!"); });

Tools module creation

EditorModules::addToolsModule([](const UVK::CurrentToolType&, bool&){ ImGui::Text("Hello, World!"); });

Top bar module creation

EditorModules::addTopBar([](bool&){ ImGui::Text("Hello, World!"); });

Independent module creation

IndependentModuleData data =
{
    .bEnabled = true,
    .func = [](const char* name, bool& bShow, bool&)
    {
        ImGui::Begin(name, &bShow);
        ImGui::Text("Hello, World!");
        ImGui::End();
    },
    .name = "Testing module"
};
EditorModules::addIndependentModule(data);

Usage

You can now create a module, but you need to put that creation code somewhere. There is a designated function for that very purpose in the game instance called onEventInitEditorModules

Details panel

The details panel's module type takes a pointer to an actor. This pointer can be used to check for components.

Independent module

The independent module function takes a name and an enabled boolean. The name is responsible for the name of the window, the enabled boolean is for enabling/disabling the window. Independent modules are listed under the view tab in the title bar and can be enabled/disabled from there.

Tools module

The tools module, takes an enum for the current tools' module type. Due to the fact that the tools' widget contains 3 views

  • Terrain editor
  • Object
  • Custom

the enum can be used to check if the current active view is one of the three

Useful tools

The engine comes with 2 additional dear imgui libraries

  • ImGuizmo - a gizmo for imgui
  • ImPlot - a library to display statistics using imgui

You can learn those 2 libraries and use them in your widgets to display statistics or to have different types of controls

The last argument

You might be wondering what the last bool& argument does. This argument is tied to the Transactions and Undo/Redo API. When having input widgets in dear imgui such as ImGui::InputText, they have their own Undo/Redo system. Instead of disabling their Undo/Redo system and implementing our own, we decided to use their Undo/Redo system and disable ours when interacting with input widgets. This can be done with this bool. Here is a sample of what is recommended:

if (ImGui::InputText(("##Rename" + a.path().string()).c_str(), &renameText) || ImGui::IsItemFocused())
    bReturn = true;

This is extracted from Filesystem.cpp, line 218-219. As you can see, we check if the input function returns true or if the widget is focused. If the check returns true, then we can enable our bool named bReturn and disable interactions with the engine's Undo/Redo API.

Clone this wiki locally