fix(datamodel): change service run order such that joints are computed before scripts

This commit is contained in:
maelstrom 2025-09-06 23:49:50 +02:00
parent 28f416bf63
commit 2a62884993
5 changed files with 20 additions and 11 deletions

View file

@ -9,7 +9,7 @@ class NoSuchInstance : public Error {
class NoSuchService : public Error {
public:
inline NoSuchService(std::string className) : Error("NoSuchService", "Cannot insert service of unknown type " + className) {}
inline NoSuchService(std::string className) : Error("NoSuchService", "Unknown service type " + className) {}
};
class ServiceAlreadyExists : public Error {

View file

@ -34,8 +34,13 @@ void DataModel::Init(bool runMode) {
// Init all services
for (auto [_, service] : this->services) {
service->InitService();
if (runMode) service->OnRun();
}
// Deterministic run order
if (!runMode) return;
if (auto service = FindService<Workspace>()) service->OnRun();
if (auto service = FindService<ServerScriptService>()) service->OnRun();
}
void DataModel::SaveToFile(std::optional<std::string> path) {
@ -114,12 +119,13 @@ result<std::shared_ptr<Service>, NoSuchService> DataModel::GetService(std::strin
}
result<nullable std::shared_ptr<Service>, NoSuchService> DataModel::FindService(std::string className) {
if (!INSTANCE_MAP[className] || (INSTANCE_MAP[className]->flags ^ (INSTANCE_NOTCREATABLE | INSTANCE_SERVICE)) != 0) {
return NoSuchService(className);
}
if (services.count(className) != 0)
return std::dynamic_pointer_cast<Service>(services[className]);
if (!INSTANCE_MAP[className] || ~(INSTANCE_MAP[className]->flags & (INSTANCE_NOTCREATABLE | INSTANCE_SERVICE)) == 0) {
return NoSuchService(className);
}
return nullptr;
}

View file

@ -21,13 +21,14 @@ class DEF_INST_SERVICE_(hidden) ScriptContext : public Service {
std::vector<SleepingThread> sleepingThreads;
int lastScriptSourceId = 0;
protected:
void InitService() override;
bool initialized = false;
public:
ScriptContext();
~ScriptContext();
void InitService() override;
lua_State* state;
void PushThreadSleep(lua_State* thread, float delay);
void RunSleepingThreads();

View file

@ -8,13 +8,14 @@
class DEF_INST_SERVICE_(explorer_icon="server-scripts", hidden) ServerScriptService : public Service {
AUTOGEN_PREAMBLE
protected:
void InitService() override;
void OnRun() override;
bool initialized = false;
public:
ServerScriptService();
~ServerScriptService();
void InitService() override;
void OnRun() override;
static inline std::shared_ptr<Instance> Create() { return std::make_shared<ServerScriptService>(); };
};

View file

@ -33,13 +33,14 @@ class DEF_INST_SERVICE_(explorer_icon="workspace") Workspace : public Service {
std::shared_ptr<PhysWorld> physicsWorld;
friend PhysWorld;
protected:
void InitService() override;
void OnRun() override;
bool initialized = false;
public:
Workspace();
~Workspace();
void InitService() override;
void OnRun() override;
std::recursive_mutex queueLock;