Skip to content

4.8 Extension & Plugin SystemΒ #125

Description

@LyeZinho

πŸ”§ Extension & Plugin System

Milestone: M4 β€” Advanced Tools & Polish
Namespace: Caffeine::Editor
Arquivos: src/editor/PluginSystem.hpp, src/editor/PluginSystem.cpp
Status: πŸ“… Planeado
RF: RF6.8


VisΓ£o Geral

O Extension & Plugin System Γ© a arquitetura que permite a extensibilidade do Caffeine Studio, transformando-o numa plataforma modular. AtravΓ©s deste sistema, programadores podem criar novos painΓ©is, ferramentas, comandos de menu e atΓ© suportes para novos tipos de assets sem modificar o cΓ³digo-fonte principal do editor. Os plugins sΓ£o carregados dinamicamente a partir de bibliotecas partilhadas (.dll no Windows, .so no Linux).

Uma caracterΓ­stica fundamental deste sistema Γ© o suporte para Hot-Reload. Durante o desenvolvimento de um plugin, o editor consegue detetar alteraΓ§Γ΅es na biblioteca, descarregar a versΓ£o antiga e carregar a nova versΓ£o sem necessidade de reiniciar o IDE. Isto proporciona um fluxo de trabalho extremamente Γ‘gil. O sistema tambΓ©m inclui uma API robusta para registar "Component Drawers" personalizados, permitindo que plugins de terceiros definam como os seus componentes aparecem no Inspector.


ImplementaΓ§Γ£o

O sistema de plugins baseia-se num contrato de interface (IPlugin) e num gestor que lida com o carregamento dinΓ’mico de sΓ­mbolos.

Estrutura da API de Plugins

namespace Caffeine::Editor {

class IPlugin {
public:
    virtual ~IPlugin() = default;
    virtual void OnLoad() = 0;
    virtual void OnUnload() = 0;
    virtual void OnUpdate(float dt) = 0;
    
    // Metadados
    virtual const char* GetName() const = 0;
    virtual const char* GetVersion() const = 0;
};

struct PluginHandle {
    void* libraryHandle;
    IPlugin* instance;
    std::string path;
    std::string name;
};

class PluginManager {
public:
    static void Initialize();
    static void Shutdown();

    static bool LoadPlugin(const std::string& path);
    static bool UnloadPlugin(const std::string& name);
    static void RefreshPlugins(); // Hot-reload check

    // API para Plugins usarem
    static void RegisterPanel(const std::string& title, std::function<void()> renderFunc);
    static void RegisterMenuAction(const std::string& path, std::function<void()> action);

private:
    static std::unordered_map<std::string, PluginHandle> m_loadedPlugins;
};

} // namespace Caffeine::Editor

Exemplo de um Plugin Simples (C++)

// MyCustomTool.cpp (Compilado como DLL)
#include <Caffeine/Editor/PluginAPI.hpp>

class MyCustomTool : public Caffeine::Editor::IPlugin {
public:
    void OnLoad() override {
        Caffeine::Editor::PluginManager::RegisterPanel("My Tool", [this]() {
            ImGui::Text("OlΓ‘ do Plugin!");
            if (ImGui::Button("Clique aqui")) {
                // AΓ§Γ£o
            }
        });
    }

    void OnUnload() override {
        // Limpeza
    }
    
    // ...
};

// Exportar funΓ§Γ£o de criaΓ§Γ£o para o PluginManager encontrar
extern "C" CAFFEINE_API IPlugin* CreatePlugin() {
    return new MyCustomTool();
}

Diagrama da Interface de GestΓ£o (ASCII)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ πŸ”Œ Plugin Manager                                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Available Plugins:                                          β”‚
β”‚                                                             β”‚
β”‚ [X] Caffeine Script Editor v1.2    [Status: Active] [πŸ”„]    β”‚
β”‚     - Description: Embedded Lua editor with highlight.      β”‚
β”‚                                                             β”‚
β”‚ [X] Discord Rich Presence v1.0     [Status: Active] [πŸ”„]    β”‚
β”‚     - Description: Shows current project on Discord.        β”‚
β”‚                                                             β”‚
β”‚ [ ] Experimental Terrain Gen v0.1  [Status: Loaded] [β–Ά]     β”‚
β”‚     - Description: Procedural 2D terrain tools.             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ [ Install New Plugin ]   [ Refresh Directory ]              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

DecisΓ΅es de Design

DecisΓ£o Justificativa
Dynamic Linking (DLL/SO) Permite que o editor seja distribuΓ­do como um binΓ‘rio pequeno, com funcionalidades adicionais carregadas sob demanda.
Interface C-Style para Exports Garante compatibilidade entre diferentes compiladores ou versΓ΅es de ABI ao usar extern "C".
Hot-Reload via File Watcher Automatiza o processo de desenvolvimento de plugins, eliminando tempos de espera de reinicializaΓ§Γ£o.
Sandboxing (Limitado) Embora os plugins tenham acesso Γ  API do editor, o sistema tenta isolar falhas fatais para evitar que um plugin crash o IDE inteiro.

CritΓ©rio de AceitaΓ§Γ£o

  • Carregamento e descarregamento de ficheiros .dll / .so em runtime.
  • Plugins conseguem registar novos painΓ©is ImGui que aparecem no menu "Window".
  • Plugins conseguem adicionar entradas ao menu principal (File, Edit, etc.).
  • Hot-reload funcional: alterar e recompilar o plugin reflete-se no editor sem fechar.
  • Interface visual para listar, ativar e desativar plugins instalados.
  • API para registar funΓ§Γ΅es de desenho de componentes (Custom Component Inspectors).

DependΓͺncias

  • Upstream: docs/editor/core.md (infraestrutura base do editor)
  • Downstream: ExtensΓ΅es da comunidade e ferramentas especΓ­ficas de projeto.

πŸ”— TΓ³picos Relacionados

TΓ³pico DescriΓ§Γ£o
Editor UI Como o editor organiza e renderiza painΓ©is.
Reflection System Usado para permitir que plugins inspecionem componentes base.
File System MonitorizaΓ§Γ£o da pasta plugins/ para detetar novos ficheiros.

ReferΓͺncias

  • PadrΓ΅es de arquitetura de plugins (Unity Editor scripting, VS Code extensions).
  • Bibliotecas de carregamento dinΓ’mico (libdl no Linux, WinAPI LoadLibrary).
  • TΓ©cnicas de hot-reloading de C++ (Runtime Compiled C++).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions