π§ 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
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++).
π§ Extension & Plugin System
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 (
.dllno Windows,.sono 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
Exemplo de um Plugin Simples (C++)
Diagrama da Interface de GestΓ£o (ASCII)
DecisΓ΅es de Design
extern "C".CritΓ©rio de AceitaΓ§Γ£o
.dll/.soem runtime.DependΓͺncias
docs/editor/core.md(infraestrutura base do editor)π TΓ³picos Relacionados
plugins/para detetar novos ficheiros.ReferΓͺncias