From fe083f13dacb50de92e3e421dd1b267cd272085b Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Wed, 25 Feb 2026 17:53:42 +0300 Subject: [PATCH] Fixed freezing with NPCs --- src/gamedata/CharacterModule.cpp | 10 ++++++++++ src/gamedata/CharacterModule.h | 4 +++- src/gamedata/GameData.cpp | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/gamedata/CharacterModule.cpp b/src/gamedata/CharacterModule.cpp index 2e648c3..8186cef 100644 --- a/src/gamedata/CharacterModule.cpp +++ b/src/gamedata/CharacterModule.cpp @@ -59,6 +59,7 @@ CharacterModule::CharacterModule(flecs::world &ecs) body_parts[age][sex].end()) body_parts[age][sex][slot] = nlohmann::json::array(); body_parts[age][sex][slot].push_back(mesh); + mesh_names.insert(mesh); Ogre::MeshManager::getSingleton().load(mesh, "Characters"); } std::cout << body_parts.dump(4) << std::endl; @@ -768,4 +769,13 @@ void CharacterModule::getSlotMeshes(const Ogre::String &age, for (auto &slots : body_parts[age][sex][slotName]) meshes.push_back(slots.get()); } + +void CharacterModule::preloadMeshes() +{ + for (const auto &mesh : mesh_names) { + Ogre::Entity *ent = + ECS::get().mScnMgr->createEntity(mesh); + ECS::get().mScnMgr->destroyEntity(ent); + } +} } diff --git a/src/gamedata/CharacterModule.h b/src/gamedata/CharacterModule.h index 38b9d26..3016e69 100644 --- a/src/gamedata/CharacterModule.h +++ b/src/gamedata/CharacterModule.h @@ -19,7 +19,7 @@ struct Female {}; struct CharacterBase { Ogre::String type; - float mTimer; + float mTimer; Ogre::Vector3 mBoneMotion; Ogre::Vector3 mBonePrevMotion; Ogre::Vector3 mGoalDirection; // actual intended direction in world-space @@ -64,11 +64,13 @@ struct CharacterModule { std::unordered_map characterOrientations; nlohmann::json body_parts; + std::set mesh_names; void remapMeshToMasterSkeleton(Ogre::MeshPtr clothMesh, Ogre::MeshPtr masterMesh); void getSlotMeshes(const Ogre::String &age, const Ogre::String &sex, const Ogre::String &slotName, std::vector &meshes); + void preloadMeshes(); }; } #endif diff --git a/src/gamedata/GameData.cpp b/src/gamedata/GameData.cpp index b9f86ce..d854ddf 100644 --- a/src/gamedata/GameData.cpp +++ b/src/gamedata/GameData.cpp @@ -200,6 +200,8 @@ void setupExteriorScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode, new_game_run.destruct(); } }); + ecs.get_mut().preloadMeshes(); + ecs.modified(); std::cout << "scene setup done" << std::endl; } void setupInteriorScene(Ogre::SceneManager *scnMgr, Ogre::SceneNode *cameraNode,