Skip to content

4.8 Extension & Plugin SystemΒ #125

@LyeZinho

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions