-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTweenModule.cpp
More file actions
170 lines (137 loc) · 4.61 KB
/
TweenModule.cpp
File metadata and controls
170 lines (137 loc) · 4.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/**
* @file TweenModule.cpp
* @brief Module entry point for deki-tween DLL
*
* This file exports the standard Deki plugin interface so the editor
* can load deki-tween.dll and register its components (TweenComponent).
*
* For linked DLLs (not dynamically loaded), DekiTween_EnsureRegistered()
* must be called from the main executable to trigger the static initializers.
*/
#include "interop/DekiPlugin.h"
#include "DekiModuleFeatureMeta.h"
#include "TweenComponent.h"
#include "TweenManager.h"
#include "reflection/ComponentRegistry.h"
#include "reflection/ComponentFactory.h"
#ifdef DEKI_EDITOR
#include "imgui.h"
#endif
#ifdef DEKI_EDITOR
// =============================================================================
// Linked DLL initialization
// =============================================================================
// When deki-tween is linked (not dynamically loaded), the editor must call
// this function to ensure the DLL code is actually loaded and the static
// initializers (REGISTER_COMPONENT) have run.
// Auto-generated registration helpers
extern void DekiTween_RegisterComponents();
extern int DekiTween_GetAutoComponentCount();
extern const DekiComponentMeta* DekiTween_GetAutoComponentMeta(int index);
// Track if already registered to avoid duplicates
static bool s_TweenRegistered = false;
extern "C" {
/**
* @brief Ensure deki-tween module is loaded and components are registered
*
* Call this from the editor at startup. Simply calling this function is enough
* to force the linker to include the DLL and trigger static initializers.
*
* @return Number of components registered by this module
*/
DEKI_TWEEN_API int DekiTween_EnsureRegistered(void)
{
if (s_TweenRegistered)
return DekiTween_GetAutoComponentCount();
s_TweenRegistered = true;
// Auto-generated: registers all Tween components with ComponentRegistry + ComponentFactory
DekiTween_RegisterComponents();
return DekiTween_GetAutoComponentCount();
}
} // extern "C"
// =============================================================================
// Plugin metadata (for dynamic loading compatibility)
// =============================================================================
extern "C" {
DEKI_PLUGIN_API const char* DekiPlugin_GetName(void)
{
return "Deki Tween Module";
}
DEKI_PLUGIN_API const char* DekiPlugin_GetVersion(void)
{
#ifdef DEKI_MODULE_VERSION
return DEKI_MODULE_VERSION;
#else
return "0.0.0-dev";
#endif
}
DEKI_PLUGIN_API const char* DekiPlugin_GetReflectionJson(void)
{
// Not used - we use component metadata instead
return "{}";
}
DEKI_PLUGIN_API int DekiPlugin_Init(void)
{
// No special initialization needed
return 0;
}
DEKI_PLUGIN_API void DekiPlugin_Shutdown(void)
{
s_TweenRegistered = false;
}
DEKI_PLUGIN_API int DekiPlugin_GetComponentCount(void)
{
return DekiTween_GetAutoComponentCount();
}
DEKI_PLUGIN_API const DekiComponentMeta* DekiPlugin_GetComponentMeta(int index)
{
return DekiTween_GetAutoComponentMeta(index);
}
DEKI_PLUGIN_API void DekiPlugin_RegisterComponents(void)
{
DekiTween_EnsureRegistered();
}
DEKI_PLUGIN_API void DekiPlugin_OnPlayModeStop(void)
{
deki::TweenManager::Instance().KillAll();
}
#ifdef DEKI_EDITOR
DEKI_PLUGIN_API void DekiPlugin_SetImGuiContext(void* ctx)
{
ImGui::SetCurrentContext(static_cast<ImGuiContext*>(ctx));
}
#endif
// =============================================================================
// Module Feature API
// =============================================================================
static const char* s_TweenGuids[] = { TweenComponent::StaticGuid };
static const DekiModuleFeatureInfo s_Features[] = {
{"tween", "Tween", "Value interpolation with easing functions", true, "DEKI_FEATURE_TWEEN", s_TweenGuids, 1},
};
DEKI_PLUGIN_API int DekiPlugin_GetFeatureCount(void)
{
return sizeof(s_Features) / sizeof(s_Features[0]);
}
DEKI_PLUGIN_API const DekiModuleFeatureInfo* DekiPlugin_GetFeature(int index)
{
if (index < 0 || index >= DekiPlugin_GetFeatureCount())
return nullptr;
return &s_Features[index];
}
// =============================================================================
// Module-specific feature API (for linked DLL access without name conflicts)
// =============================================================================
DEKI_TWEEN_API const char* DekiTween_GetName(void)
{
return "Tween";
}
DEKI_TWEEN_API int DekiTween_GetFeatureCount(void)
{
return DekiPlugin_GetFeatureCount();
}
DEKI_TWEEN_API const DekiModuleFeatureInfo* DekiTween_GetFeature(int index)
{
return DekiPlugin_GetFeature(index);
}
} // extern "C"
#endif // DEKI_EDITOR