11#include " Ecsact.h"
22#include " CoreGlobals.h"
3+ #include " EcsactSettings.h"
34#include " HAL/PlatformProcess.h"
5+ #include " Logging/LogVerbosity.h"
46#include " Misc/Paths.h"
7+ #include " EcsactAsyncRunner.h"
58#include " ecsact/runtime.h"
69
710#define LOCTEXT_NAMESPACE " FEcsactModule"
@@ -12,6 +15,13 @@ DEFINE_LOG_CATEGORY(Ecsact);
1215FOR_EACH_ECSACT_API_FN (INIT_ECSACT_API_FN, UNUSED_PARAM);
1316#undef INIT_ECSACT_API_FN
1417
18+ FEcsactModule* FEcsactModule::Self = nullptr ;
19+
20+ auto FEcsactModule::Get () -> FEcsactModule& {
21+ check (Self != nullptr );
22+ return *Self;
23+ }
24+
1525auto FEcsactModule::Abort () -> void {
1626#ifdef WITH_EDITOR
1727 if (GEditor) {
@@ -26,6 +36,7 @@ auto FEcsactModule::LoadEcsactRuntime() -> void {
2636 FPaths::ProjectDir (),
2737 TEXT (" Binaries/Win64/EcsactRuntime.dll" )
2838 );
39+ UE_LOG (Ecsact, Log, TEXT (" Loading ecsact runtime %s" ), *ecsact_runtime_path);
2940
3041 EcsactRuntimeHandle = FPlatformProcess::GetDllHandle (*ecsact_runtime_path);
3142
@@ -43,12 +54,22 @@ auto FEcsactModule::LoadEcsactRuntime() -> void {
4354#define LOAD_ECSACT_FN (fn, UNUSED_PARAM ) \
4455 fn = reinterpret_cast <decltype (fn)>( \
4556 FPlatformProcess::GetDllExport (EcsactRuntimeHandle, TEXT (#fn)) \
46- )
57+ ); \
58+ if (fn != nullptr ) { \
59+ UE_LOG (Ecsact, Log, TEXT (" loaded %s" ), TEXT (#fn)); \
60+ } else { \
61+ UE_LOG (Ecsact, Error, TEXT (" failed to load %s" ), TEXT (#fn)); \
62+ } \
63+ static_assert (true , " require ;" )
4764 FOR_EACH_ECSACT_API_FN (LOAD_ECSACT_FN);
4865#undef LOAD_ECSACT_FN
66+ StartRunner ();
4967}
5068
5169auto FEcsactModule::UnloadEcsactRuntime () -> void {
70+ UE_LOG (Ecsact, Log, TEXT (" Unloading ecsact runtime" ));
71+
72+ StopRunner ();
5273 if (EcsactRuntimeHandle) {
5374 FPlatformProcess::FreeDllHandle (EcsactRuntimeHandle);
5475 EcsactRuntimeHandle = nullptr ;
@@ -60,6 +81,7 @@ auto FEcsactModule::UnloadEcsactRuntime() -> void {
6081}
6182
6283auto FEcsactModule::StartupModule () -> void {
84+ Self = this ;
6385 if (!GIsEditor) {
6486 LoadEcsactRuntime ();
6587 }
@@ -78,6 +100,7 @@ auto FEcsactModule::ShutdownModule() -> void {
78100 FEditorDelegates::PreBeginPIE.RemoveAll (this );
79101 FEditorDelegates::EndPIE.RemoveAll (this );
80102#endif
103+ Self = nullptr ;
81104}
82105
83106auto FEcsactModule::OnPreBeginPIE (bool _) -> void {
@@ -88,6 +111,56 @@ auto FEcsactModule::OnEndPIE(bool _) -> void {
88111 UnloadEcsactRuntime ();
89112}
90113
114+ auto FEcsactModule::StartRunner () -> void {
115+ const auto * settings = GetDefault<UEcsactSettings>();
116+
117+ if (Runner != nullptr ) {
118+ UE_LOG (
119+ Ecsact,
120+ Warning,
121+ TEXT (" StartRunner() was called while runner was already running. "
122+ " Stopping previous one before starting new." )
123+ );
124+ StopRunner ();
125+ }
126+
127+ switch (settings->Runner ) {
128+ case EEcsactRuntimeRunnerType::Automatic:
129+ if (ecsact_async_flush_events == nullptr ) {
130+ Runner = NewObject<UEcsactSyncRunner>();
131+ } else {
132+ Runner = NewObject<UEcsactAsyncRunner>();
133+ }
134+ break ;
135+ case EEcsactRuntimeRunnerType::Asynchronous:
136+ Runner = NewObject<UEcsactAsyncRunner>();
137+ break ;
138+ case EEcsactRuntimeRunnerType::Custom:
139+ if (settings->CustomRunnerClass != nullptr ) {
140+ Runner = NewObject<UEcsactRunner>(nullptr , settings->CustomRunnerClass );
141+ }
142+ break ;
143+ }
144+
145+ if (Runner != nullptr ) {
146+ UE_LOG (
147+ Ecsact,
148+ Verbose,
149+ TEXT (" Using ecsact runner: %s" ),
150+ *Runner->StaticClass ()->GetName ()
151+ );
152+ Runner->AddToRoot ();
153+ }
154+ }
155+
156+ auto FEcsactModule::StopRunner () -> void {
157+ if (Runner != nullptr ) {
158+ Runner->RemoveFromRoot ();
159+ Runner->ConditionalBeginDestroy ();
160+ Runner = nullptr ;
161+ }
162+ }
163+
91164#undef LOCTEXT_NAMESPACE
92165
93166IMPLEMENT_MODULE (FEcsactModule, Ecsact)
0 commit comments