fix(datamodel): change service run order such that joints are computed before scripts
This commit is contained in:
parent
28f416bf63
commit
2a62884993
5 changed files with 20 additions and 11 deletions
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>(); };
|
||||
};
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue