toon-boom-extension-framework/docs/ToonBoomPlugInManager_PLUG_Services.md

336 lines
15 KiB
Markdown

# ToonBoomPlugInManager.dll - PLUG_Services Class Analysis
This document contains reverse engineering analysis of the `PLUG_Services` class hierarchy from `ToonBoomPlugInManager.dll` used in Toon Boom Harmony Premium and Storyboard Pro.
## Overview
The plugin services system in Toon Boom uses a singleton pattern to provide access to various application services. The main classes are:
- **PLUG_Services** - Static class providing access to service interfaces
- **PLUG_ServicesPrivate** - Extended static functionality with setters
- **PLUG_ServicesPrivateImpl** - (alias name, same as PLUG_ManagerImpl)
- **PLUG_ManagerImpl** - Main singleton implementation containing all service pointers
- **PLUG_Manager** - Base class for the manager
## Architecture
```
PLUG_Services (static class)
│ getters return from
┌──────────────────────────────────────────────┐
│ PLUG_ManagerImpl (singleton) │
│ (inherits: QObject → PLUG_Manager) │
│ │
│ +0x000: vftable (PLUG_ManagerImpl) │
│ +0x010: embedded interface object │
│ +0x188: QCoreApplication* │
│ +0x190: unknown interface │
│ +0x198-0x240: Service interface pointers │
│ +0x248: QString │
│ +0x260: bool flag │
└──────────────────────────────────────────────┘
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
AC_Manager* CM_Services* PLUG_ScriptingInterface*
...
```
## Global Variables
| Address | Name | Type | Description |
|---------|------|------|-------------|
| 0x180016590 | g_PLUG_ManagerImpl_instance | PLUG_ManagerImpl* | Main singleton instance |
| 0x180016570 | g_PLUG_ModuleLibraryInterface | PLUG_ModuleLibraryInterface* | Module library (separate global) |
| 0x180016578 | g_PLUG_SetupModeQueryInterface | PLUG_SetupModeQueryInterface* | Setup mode query interface |
| 0x180016580 | g_PLUG_PlaybackRange | PLUG_PlaybackRange | Static playback range instance |
| 0x180016538 | g_PLUG_InteractiveViewManagerImpl | PLUG_InteractiveViewManagerImpl* | Interactive view manager singleton |
---
## Class: PLUG_Services
### Purpose
Static utility class providing access to all plugin service interfaces. All methods are static.
### Public Static Methods
| Address | Method | Return Type | Offset in Singleton |
|---------|--------|-------------|---------------------|
| 0x180005a50 | getActionManager() | AC_Manager* | +0x1A0 (416) |
| 0x180005a70 | getColorManagerServices() | CM_Services* | +0x218 (536) |
| 0x180005a90 | getCurrentFrameInterface() | SC_CurrentFrameInterface* | +0x1B0 (432) |
| 0x180005ab0 | getDataToolInterface() | SC_CVDataToolInterface* | +0x220 (544) |
| 0x180005ad0 | getDragDropInterface() | PLUG_DragDropInterface* | +0x1F8 (504) |
| 0x180005af0 | getEditionStackInterface() | SC_SceneEditionStackInterface* | +0x1B8 (440) |
| 0x180005b10 | getExpressionScriptingInterface() | AT_ExprScriptEngine* | +0x200 (512)* |
| 0x180005b40 | getHttpAPI() | SC_HttpAPI* | +0x228 (552) |
| 0x180005b60 | getImportEngine() | PLUG_ImportEngine* | +0x1E0 (480) |
| 0x180005b80 | getInteractiveRenderManager() | SC_InteractiveRenderManagerInterface* | +0x198 (408) |
| 0x180005ba0 | getInteractiveViewManager() | PLUG_InteractiveViewManager* | +0x210 (528)** |
| 0x180005bf0 | getKeyStateInterface() | PLUG_KeyStateInterface* | +0x1E8 (488) |
| 0x180005c10 | getLayoutManager() | TULayoutManager* | +0x1F0 (496) |
| 0x180005c30 | getMenuService() | PLUG_MenuService* | +0x1D8 (472) |
| 0x180005c50 | getModuleLibraryInterface() | PLUG_ModuleLibraryInterface* | (separate global) |
| 0x180005c60 | getNetworkViewInterface() | SC_NetworkViewInterface* | +0x240 (576) |
| 0x180005c80 | getOGLRenderPlaybackInterface() | PLUG_OGLRenderPlaybackInterface* | +0x230 (560) |
| 0x180005d00 | getPluginPath(const QString&) | QString | via vtable |
| 0x180005d50 | getPreference() | PLUG_PreferenceUI* | (thunk to PLUG_PreferenceUIImpl::instance) |
| 0x180005d60 | getScriptingInterface() | PLUG_ScriptingInterface* | +0x1C8 (456) |
| 0x180005d80 | getSelection() | SL_Selection* | +0x1A8 (424) |
| 0x180005da0 | getSessionContext() | SC_SessionContext* | +0x1C0 (448) |
| 0x180005dc0 | getToolbarService() | PLUG_ToolbarService* | +0x1D0 (464) |
| 0x180005de0 | getVectorizationInterface() | PLUG_VectorizationInterface* | +0x238 (568) |
| 0x180005e00 | getWidgetFactoryRegistry() | PLUG_WidgetFactoryRegistry* | +0x208 (520) |
\* `getExpressionScriptingInterface()` requires `SC_SessionContext` at +0x1C0 to be non-null
\*\* `getInteractiveViewManager()` lazily creates `PLUG_InteractiveViewManagerImpl` if null
### Implementation Pattern
Most getters follow this pattern:
```cpp
Type* PLUG_Services::getXXX() {
if (g_PLUG_ManagerImpl_instance)
return g_PLUG_ManagerImpl_instance->m_xxx; // at specific offset
return nullptr; // returns 0 if singleton not initialized
}
```
---
## Class: PLUG_ServicesPrivate
### Purpose
Extended static class with additional functionality and setters (typically used internally).
### Public Static Methods
| Address | Method | Return Type | Description |
|---------|--------|-------------|-------------|
| 0x180005cb0 | getPluginBinFilePath(const QString&) | QString | Gets binary file path for plugin |
| 0x180005fa0 | isSetupMode() | bool | Queries setup mode via g_PLUG_SetupModeQueryInterface |
| 0x180007390 | setModuleLibraryInterface(PLUG_ModuleLibraryInterface*) | bool | Sets g_PLUG_ModuleLibraryInterface |
| 0x1800073f0 | setSetupModeQueryInterface(PLUG_SetupModeQueryInterface*) | void | Sets g_PLUG_SetupModeQueryInterface |
| 0x1800072D0 | setColorManagerServices(CM_Services*) | void | Sets +0x218 offset |
| 0x1800072F0 | setDataToolInterface(SC_CVDataToolInterface*) | void | Sets +0x220 offset |
| 0x180007330 | setHttpAPI(SC_HttpAPI*) | void | Sets +0x228 offset |
| 0x1800073B0 | setOGLRenderPlaybackInterface(PLUG_OGLRenderPlaybackInterface*) | void | Sets +0x230 offset |
| 0x180007410 | setVectorizationInterface(PLUG_VectorizationInterface*) | void | Sets +0x238 offset |
| 0x180007420 | setWidgetFactoryRegistry(PLUG_WidgetFactoryRegistry*) | void | Sets +0x208 offset |
---
## Class: PLUG_ManagerImpl
### Purpose
Main singleton implementation that holds all service interface pointers. Inherits from QObject and PLUG_Manager.
### Constructor
**Address**: `0x180004180`
**Signature**:
```cpp
PLUG_ManagerImpl(QObject* parent, UnknownInterface* iface1, UnknownInterface* iface2);
```
### Memory Layout (x64 MSVC)
| Offset | Hex | Size | Type | Member Name | Description |
|--------|-----|------|------|-------------|-------------|
| 0 | 0x000 | 8 | ptr | vftable | PLUG_ManagerImpl vtable |
| 8 | 0x008 | 8 | | (QObject data) | d_ptr from QObject |
| 16 | 0x010 | 8 | ptr | embedded_vftable | Embedded interface vtable |
| 24 | 0x018 | 72 | | (reserved) | Zeroed on construction |
| 96 | 0x060 | 304 | | (reserved block) | memset to 0, size 0x130 |
| 392 | 0x188 | 8 | ptr | m_coreApp | QCoreApplication* instance |
| 400 | 0x190 | 8 | ptr | m_unknownInterface | Constructor param a3 |
| 408 | 0x198 | 8 | ptr | m_interactiveRenderManager | SC_InteractiveRenderManagerInterface* |
| 416 | 0x1A0 | 8 | ptr | m_actionManager | AC_Manager* |
| 424 | 0x1A8 | 8 | ptr | m_selection | SL_Selection* |
| 432 | 0x1B0 | 8 | ptr | m_currentFrameInterface | SC_CurrentFrameInterface* |
| 440 | 0x1B8 | 8 | ptr | m_editionStackInterface | SC_SceneEditionStackInterface* |
| 448 | 0x1C0 | 8 | ptr | m_sessionContext | SC_SessionContext* |
| 456 | 0x1C8 | 8 | ptr | m_scriptingInterface | PLUG_ScriptingInterface* |
| 464 | 0x1D0 | 8 | ptr | m_toolbarService | PLUG_ToolbarService* |
| 472 | 0x1D8 | 8 | ptr | m_menuService | PLUG_MenuService* |
| 480 | 0x1E0 | 8 | ptr | m_importEngine | PLUG_ImportEngine* |
| 488 | 0x1E8 | 8 | ptr | m_keyStateInterface | PLUG_KeyStateInterface* |
| 496 | 0x1F0 | 8 | ptr | m_layoutManager | TULayoutManager* |
| 504 | 0x1F8 | 8 | ptr | m_dragDropInterface | PLUG_DragDropInterface* |
| 512 | 0x200 | 8 | ptr | m_exprScriptEngine | AT_ExprScriptEngine* |
| 520 | 0x208 | 8 | ptr | m_widgetFactoryRegistry | PLUG_WidgetFactoryRegistry* |
| 528 | 0x210 | 8 | ptr | m_interactiveViewManager | PLUG_InteractiveViewManager* |
| 536 | 0x218 | 8 | ptr | m_colorManagerServices | CM_Services* |
| 544 | 0x220 | 8 | ptr | m_dataToolInterface | SC_CVDataToolInterface* |
| 552 | 0x228 | 8 | ptr | m_httpAPI | SC_HttpAPI* |
| 560 | 0x230 | 8 | ptr | m_oglRenderPlaybackInterface | PLUG_OGLRenderPlaybackInterface* |
| 568 | 0x238 | 8 | ptr | m_vectorizationInterface | PLUG_VectorizationInterface* |
| 576 | 0x240 | 8 | ptr | m_networkViewInterface | SC_NetworkViewInterface* |
| 584 | 0x248 | 24 | QString | m_unknownString | QString member |
| 608 | 0x260 | 1 | bool | m_flag | Initialized to true |
**sizeof(PLUG_ManagerImpl) ≈ 0x268 (616 bytes minimum)**
---
## Class: PLUG_Manager
### Purpose
Base class for the manager singleton.
### Constructor
**Address**: `0x180001210`
### Memory Layout
| Offset | Size | Type | Description |
|--------|------|------|-------------|
| 0 | 8 | ptr | vftable (PLUG_Manager) |
---
## Class: PLUG_ScriptingInterface
### Purpose
Interface for scripting functionality. Base class for script execution.
### Constructor
**Address**: `0x180009cd0`
### Memory Layout
| Offset | Size | Type | Description |
|--------|------|------|-------------|
| 0 | 8 | ptr | vftable |
### Nested Struct: Program
Represents a script program to be executed.
**Memory Layout**:
| Offset | Size | Type | Member | Description |
|--------|------|------|--------|-------------|
| 0 | 24 | QString | path | Script path/name |
| 24 | 24 | QString | description | Script description |
| 48 | 24 | QString | content | Script content |
| 72 | 8+ | QDateTime | timestamp | Modification timestamp |
**sizeof(PLUG_ScriptingInterface::Program) ≈ 80+ bytes**
---
## Class: PLUG_InteractiveViewManager / PLUG_InteractiveViewManagerImpl
### Purpose
Manages interactive view delegates for drawing and tool handling.
### Constructor
**Address**: `0x180001ef0`
### Memory Layout
| Offset | Size | Type | Description |
|--------|------|------|-------------|
| 0 | 8 | ptr | vftable |
| 8 | 8 | ptr | m_delegateList (linked list) |
| 16 | 8 | ptr | m_delegate2 |
### Key Methods
| Address | Method | Description |
|---------|--------|-------------|
| 0x180003060 | instance() | Returns singleton from g_PLUG_InteractiveViewManagerImpl |
| 0x180003180 | registerDelegate(PLUG_InteractiveViewDelegate*) | Registers a view delegate |
| 0x180003320 | unregisterDelegate(PLUG_InteractiveViewDelegate*) | Unregisters a view delegate |
| 0x1800030a0 | isDelegateTypeRegistered(PLUG_InteractiveViewDelegate*) | Checks if delegate type exists |
| 0x180003070 | invalidateAllViews(int) | Invalidates all views |
| 0x180003080 | invalidateTimeline() | Invalidates timeline view |
| 0x180002e20 | handleMouseDown(...) | Handles mouse down events |
| 0x180002ee0 | handleMouseMove(...) | Handles mouse move events |
| 0x180002fa0 | handleMouseUp(...) | Handles mouse up events |
| 0x180002d60 | handleGetCursor(...) | Gets cursor for position |
---
## Class: PLUG_PreferenceUI / PLUG_PreferenceUIImpl
### Purpose
Manages preference panels and UI customization.
### Singleton Access
**Address**: `0x180007a20` (PLUG_PreferenceUIImpl::instance)
Uses thread-local storage for singleton initialization with `Init_thread_header`/`Init_thread_footer` pattern.
### Key Methods
| Address | Method | Description |
|---------|--------|-------------|
| 0x180007970 | addCustomizer(const PLUG_PreferenceUICustomizerInterface*) | Adds preference customizer |
| 0x180007aa0 | onCreateColorPreferencePanel(eAppContext, QWidget*) | Creates color pref panel |
| 0x180007b20 | onCreatePreferencePanel(eAppContext, QWidget*) | Creates general pref panel |
---
## Service Interface Types Reference
### Action & Menu System
- **AC_Manager** - Action/command manager
- **PLUG_MenuService** - Menu service interface
- **PLUG_ToolbarService** - Toolbar service interface
### Scene & Session
- **SC_SessionContext** - Current session context
- **SC_CurrentFrameInterface** - Current frame access
- **SC_SceneEditionStackInterface** - Scene edition stack
- **SC_NetworkViewInterface** - Network view interface
- **SC_HttpAPI** - HTTP API for server communication
### Drawing & Rendering
- **SC_InteractiveRenderManagerInterface** - Render management
- **SC_CVDataToolInterface** - Drawing data tool interface
- **CM_Services** - Color manager services
- **PLUG_VectorizationInterface** - Vectorization tools
- **PLUG_OGLRenderPlaybackInterface** - OpenGL render playback
### Selection & Layout
- **SL_Selection** - Selection management
- **TULayoutManager** - Layout system manager
- **PLUG_InteractiveViewManager** - Interactive view management
### Scripting
- **PLUG_ScriptingInterface** - Script execution interface
- **AT_ExprScriptEngine** - Expression script engine
### Import/Export
- **PLUG_ImportEngine** - Import functionality
- **PLUG_ModuleLibraryInterface** - Module library access
### Input & UI
- **PLUG_KeyStateInterface** - Keyboard state tracking
- **PLUG_DragDropInterface** - Drag and drop handling
- **PLUG_WidgetFactoryRegistry** - Widget factory registration
- **PLUG_PreferenceUI** - Preference panels
---
## Environment Variables
- **TOONBOOM_PLUGINPATH** - Overrides plugin search path (checked in `sub_180005380`)
---
## Analysis Methodology
1. **Function List Analysis**: Extracted all functions matching `*PLUG_Services*` pattern
2. **Decompilation**: Analyzed each getter method to determine offsets in singleton
3. **Constructor Analysis**: Traced `PLUG_ManagerImpl` constructor to map memory layout
4. **Cross-Reference Analysis**: Found setters and initialization points via xrefs to globals
5. **Pattern Recognition**: Identified common getter/setter patterns
6. **Global Identification**: Named and documented global singleton variables
## Database File
- **Source**: `RE/ToonBoomPlugInManager.dll.i64`
- **Module Base**: `0x180000000`