diff --git a/obse/obse/EventManager.cpp b/obse/obse/EventManager.cpp index c6e0c57..398a97e 100644 --- a/obse/obse/EventManager.cpp +++ b/obse/obse/EventManager.cpp @@ -1352,6 +1352,8 @@ UInt32 EventIDForMessage(UInt32 msgID) return kEventID_ExitToMainMenu; case OBSEMessagingInterface::kMessage_PostLoadGame: return kEventID_PostLoadGame; + case OBSEMessagingInterface::kMessage_GameInitialized: + _MESSAGE("kMessage_GameInitialized Unhandled"); //FIXME default: return kEventID_INVALID; } diff --git a/obse/obse/PluginAPI.h b/obse/obse/PluginAPI.h index 2da9590..7670269 100644 --- a/obse/obse/PluginAPI.h +++ b/obse/obse/PluginAPI.h @@ -46,6 +46,7 @@ enum kInterface_Tasks, kInterface_Input, kInterface_EventManager, + kInterface_Tasks2, kInterface_Max }; @@ -181,7 +182,7 @@ struct OBSEMessagingInterface void * data; }; - typedef void (* EventCallback)(Message* msg); + using EventCallback = void (*)(Message*); enum { kVersion = 1 @@ -593,11 +594,23 @@ struct OBSESerializationInterface */ #if OBLIVION struct OBSETasksInterface { - Task* (*EnqueueTask)(TaskFunc f); + Task* (*EnqueueTask)(TaskFunc f); + void (*RemoveTask)(Task* f); + bool (*IsTaskPresent)(Task* f); +}; + +struct OBSETasks2Interface { + enum { + kVersion = 1, + }; + + + UInt32 version; + Task* (*EnqueueTask)(TaskFunc f); void (*RemoveTask)(Task* f); bool (*IsTaskPresent)(Task* f); void (*ReEnqueueTask)(Task* f); - Task* (*EnqueueTaskRemovable)(TaskFuncT f); + Task* (*EnqueueTaskRemovable)(TaskFunc f); void (*RemoveTaskRemovable)(Task* f); bool (*IsTaskPresentRemovable)(Task* f); void (*ReEnqueueTaskRemovable)(Task* f); diff --git a/obse/obse/PluginManager.cpp b/obse/obse/PluginManager.cpp index 817ec17..7f3d4d6 100644 --- a/obse/obse/PluginManager.cpp +++ b/obse/obse/PluginManager.cpp @@ -80,6 +80,13 @@ static OBSETasksInterface g_TasksInterface = { PluginAPI::EnqueueTask, PluginAPI::Remove, PluginAPI::IsTaskEnqueued, +}; + +static OBSETasks2Interface g_Tasks2Interface = { + OBSETasks2Interface::kVersion, + PluginAPI::EnqueueTask, + PluginAPI::Remove, + PluginAPI::IsTaskEnqueued, PluginAPI::ReEnqueueTask, PluginAPI::EnqueueTask, PluginAPI::Remove, @@ -88,6 +95,7 @@ static OBSETasksInterface g_TasksInterface = { PluginAPI::HasTasks }; + static OBSEInputInterface g_InputInterface = { PluginAPI::DisableKey, PluginAPI::EnableKey, @@ -407,6 +415,9 @@ void * PluginManager::QueryInterface(UInt32 id) case kInterface_Tasks: result = &g_TasksInterface; break; + case kInterface_Tasks2: + result = &g_Tasks2Interface; + break; case kInterface_Input: result = &g_InputInterface; break; diff --git a/obse/obse/Tasks.cpp b/obse/obse/Tasks.cpp index b709360..0480ab5 100644 --- a/obse/obse/Tasks.cpp +++ b/obse/obse/Tasks.cpp @@ -30,14 +30,14 @@ void Task::Run() noexcept { ///TODO put CS in place. template void TaskManager::Enqueue(Task* task) { - auto queue = TaskManager::getQueue(task); + auto& queue = TaskManager::getQueue(task); queue.push_back(task); } template -Task* TaskManager::Enqueue(TaskFuncT task) { +Task* TaskManager::Enqueue(TaskFunc task) { Task* func = new Task(task); - auto queue = TaskManager::getQueue(func); + auto& queue = TaskManager::getQueue(func); queue.push_back(func); return func; } @@ -94,11 +94,11 @@ void TaskManager::Run() { namespace PluginAPI { void ReEnqueueTask(Task* task) { return TaskManager::Enqueue(task); } - Task* EnqueueTask(TaskFuncT task) { return TaskManager::Enqueue(task); } + Task* EnqueueTask(TaskFunc task) { return TaskManager::Enqueue(task); } bool IsTaskEnqueued(Task* task) { return TaskManager::IsTaskEnqueued(task); } void Remove(Task* toRemove) { return TaskManager::Remove(toRemove); } void ReEnqueueTask(Task* task) { return TaskManager::Enqueue(task); } - Task* EnqueueTask(TaskFuncT task) { return TaskManager::Enqueue(task); } + Task* EnqueueTask(TaskFunc task) { return TaskManager::Enqueue(task); } bool IsTaskEnqueued(Task* task) { return TaskManager::IsTaskEnqueued(task); } void Remove(Task* toRemove) { return TaskManager::Remove(toRemove); } diff --git a/obse/obse/Tasks.h b/obse/obse/Tasks.h index 4d711fc..781a006 100644 --- a/obse/obse/Tasks.h +++ b/obse/obse/Tasks.h @@ -8,24 +8,23 @@ template concept IsIntOrVoid = std::is_same::value || std::is_same::value; -template using TaskFuncT = T (*)(); +template using TaskFunc = T (*)(); -using TaskFunc = TaskFuncT; template class Task { - TaskFuncT task; + TaskFunc task; public: - Task(TaskFuncT task) noexcept: task(task) {} + Task(TaskFunc task) noexcept: task(task) {} T Run() noexcept; }; class TaskManager { public: - static bool HasTasks() noexcept { return !s_taskQueue.empty(); } + static bool HasTasks() noexcept { return !s_taskQueue.empty() || !taskRemovableQueue.empty(); } template static void Enqueue(Task* task); - template static Task* Enqueue(TaskFuncT task); + template static Task* Enqueue(TaskFunc task); template static bool IsTaskEnqueued(Task* task); template static void Remove(Task* task); static void Run(); @@ -42,11 +41,11 @@ class TaskManager { namespace PluginAPI{ void ReEnqueueTask(Task* task); - Task* EnqueueTask(TaskFuncT task); + Task* EnqueueTask(TaskFunc task); bool IsTaskEnqueued(Task* task); void Remove(Task* task); void ReEnqueueTask(Task* task); - Task* EnqueueTask(TaskFuncT task); + Task* EnqueueTask(TaskFunc task); bool IsTaskEnqueued(Task* task); void Remove(Task* task); diff --git a/obse/obse/obse.vcxproj b/obse/obse/obse.vcxproj index 1517cb4..08d718d 100644 --- a/obse/obse/obse.vcxproj +++ b/obse/obse/obse.vcxproj @@ -85,9 +85,10 @@ StdAfx.h;obse_common/obse_prefix.h;%(ForcedIncludeFiles) true false - stdcpplatest + stdcpp20 stdc17 true + true %(IgnoreSpecificDefaultLibraries) @@ -127,6 +128,7 @@ true true Sync + true true diff --git a/obse/obse_editor/obse_editor.vcxproj b/obse/obse_editor/obse_editor.vcxproj index 190ec07..4268d37 100644 --- a/obse/obse_editor/obse_editor.vcxproj +++ b/obse/obse_editor/obse_editor.vcxproj @@ -80,8 +80,9 @@ StdAfx.h;obse_common/obse_prefix.h;%(ForcedIncludeFiles) true true - stdcpplatest + stdcpp20 stdc17 + true true @@ -110,9 +111,10 @@ true Speed false - stdcpplatest + stdcpp20 stdc17 Sync + true true