MQEngine
载入中...
搜索中...
未找到
DataManager.h
浏览该文件的文档.
1//
2// Created by Administrator on 2025/8/20.
3//
4
5#ifndef DATAMANAGER_H
6#define DATAMANAGER_H
7
8#include "../EnginePCH.h"
9#include "../Thirdparty/thirdparty.h"
10#include "DataError.h"
11#include "Scene.h"
12#include "SceneTrunk.h"
13#include <unordered_map>
14#include <memory>
15#include <functional>
16
17#include "./DataLoader.h"
18#include "./FileDataLoader.h"
19#include "./Camera.h"
20
21namespace MQEngine
22{
24 {
25 std::string uuid;
26 std::string modelRelativePath;
27
28 template<class Archive>
29 void serialize(Archive & ar, const unsigned int version) {
30 ar & uuid;
32 }
33 };
34
36 {
37 std::string uuid;
38
39 template<class Archive>
40 void serialize(Archive & ar, const unsigned int version)
41 {
42 ar & uuid;
43 }
44 };
45
47 {
48 std::string initialSceneUuid;
49
50 template<class Archive>
51 void serialize(Archive & ar, const unsigned int version)
52 {
54 }
55 };
56
58 {
59 public:
61 {
62 m_dataLoader = std::make_unique<FileDataLoader>();
63 }
64 std::vector<std::string> getModelList()
65 {
67 return m_modelPathList;
68 }
69 void loadRes();
70 void loadScenePathList();
71 void newScene(const std::string& sceneName);
72 void updateModelPathList();
73 std::vector<entt::registry*> currentRegistries() const;
74 void appendRegistry(entt::registry* registry);
75 void removeRegistry(entt::registry* registry);
76 void openScene(const std::string& uuid);
77 void closeScene(const std::string& uuid);
78 void loadProjectSetting();
79 void saveProjectSetting(const ProjectSetting& setting);
80 ProjectSetting getProjectSetting() const;
81 void setInitialSceneUuid(const std::string& uuid);
82 std::string getInitialSceneUuid() const;
83
84
85 void loadScene(const std::string& uuid)
86 {
87 try {
88 if (m_loadScenes.find(uuid) != m_loadScenes.end()) {
89 return;
90 }
92
93 auto sceneIt = m_uuidToScenePath.find(uuid);
94 if (sceneIt == m_uuidToScenePath.end()) {
95 throw DataError("场景UUID不存在: " + uuid);
96 }
97
98 std::string scenePath = sceneIt->second;
99 std::string sceneDataPath = scenePath + "/scene.dat";
100
101 if (!m_dataLoader->directoryExists(scenePath)) {
102 throw DataError("场景目录不存在: " + scenePath);
103 }
104
105 auto scene = std::make_shared<Scene>(this,uuid);
106
107 if (m_dataLoader->fileExists(sceneDataPath)) {
108 scene->load();
109 } else {
110 scene->init();
111 scene->save();
112 scene->load();
113 }
114
115 m_loadScenes[uuid] = scene;
116
117 } catch (const DataError& e) {
118 throw;
119 } catch (const std::exception& e) {
120 throw DataError("加载场景失败: " + std::string(e.what()));
121 }
122 }
123 bool saveScene(const std::string& uuid);
124 std::string getCurrentSceneUuid() const;
125 std::string getSceneNameByUuid(const std::string& uuid) const;
126 DataLoader* getDataLoader() const;
127 void setEditorMode(bool isEditorMode)
128 {
129 m_isEditorMode = isEditorMode;
130 }
131 std::string getModelPathByUuid(const std::string& uuid) const;
132 std::string getModelRelativePathByUuid(const std::string& uuid) const;
133 Scene* getCurrentScene() const;
134 private:
136 std::string m_currentScene;
137 std::unordered_map<std::string, std::shared_ptr<Scene>> m_loadScenes;
138 std::vector<entt::registry*> m_currentRegistries;
139 std::vector<std::string> m_scenePathList;
140 std::unordered_map<std::string,std::string> m_uuidToModel;
141 std::unordered_map<std::string,std::string> m_uuidToScenePath;
142 std::unordered_map<std::string,std::string> m_uuidToSceneName;
143 std::vector<std::string> m_modelPathList;
144 std::unique_ptr<DataLoader> m_dataLoader;
147 m_uuidToModel.clear();
148
149 m_dataLoader->ensureDirectory("./res/models");
150
151 try {
152 std::vector<std::string> modelDirs = m_dataLoader->getSubDirectories("./res/models");
153
154 for (const std::string& modelDir : modelDirs) {
155 std::string uuidFilePath = modelDir + "/model.uuid";
156
157 if (m_dataLoader->fileExists(uuidFilePath)) {
158 try {
159 auto inputStream = m_dataLoader->openBinaryInputStream(uuidFilePath);
160
161 if (inputStream && inputStream->is_open()) {
162 boost::archive::binary_iarchive archive(*inputStream);
163
164 ModelUuidFile modelUuidFile;
165 archive >> modelUuidFile;
166
167 m_uuidToModel[modelUuidFile.uuid] = modelDir;
168 }
169 }
170 catch (const DataError& e) {
171 throw;
172 }
173 catch (const std::exception& e) {
174
175 }
176 }
177 }
178 }
179 catch (const DataError& e) {
180 throw;
181 }
182 catch (const std::exception& e) {
183
184 }
185 }
187 {
188 m_uuidToScenePath.clear();
189 m_uuidToSceneName.clear();
190 m_dataLoader->ensureDirectory("./res/scenes");
191
192 try {
193 std::vector<std::string> sceneDirs = m_dataLoader->getSubDirectories("./res/scenes");
194 for (const std::string& sceneDir : sceneDirs) {
195 std::string uuidFilePath = sceneDir + "/scene.uuid";
196
197 if (m_dataLoader->fileExists(uuidFilePath)) {
198 try {
199 auto inputStream = m_dataLoader->openBinaryInputStream(uuidFilePath);
200
201 if (inputStream && inputStream->is_open()) {
202 boost::archive::binary_iarchive archive(*inputStream);
203
204 SceneUuidFile sceneUuidFile;
205 archive >> sceneUuidFile;
206
207 m_uuidToScenePath[sceneUuidFile.uuid] = sceneDir;
208 m_uuidToSceneName[sceneUuidFile.uuid] = std::filesystem::path(sceneDir).filename().string();
209 }
210 }
211 catch (const DataError& e) {
212 throw;
213 }
214 catch (const std::exception& e) {
215
216 }
217 }
218 }
219 }
220 catch (const DataError& e) {
221 throw;
222 }
223 catch (const std::exception& e) {
224
225 }
226 }
227 };
228
229}// namespace MQEngine
230
231#endif //DATAMANAGER_H
#define ENGINE_API
定义 EnginePCH.h:14
定义 DataError.h:14
定义 DataLoader.h:10
void loadScene(const std::string &uuid)
定义 DataManager.h:85
std::vector< entt::registry * > m_currentRegistries
定义 DataManager.h:138
ProjectSetting m_projectSetting
定义 DataManager.h:145
DataManager()
定义 DataManager.h:60
std::unordered_map< std::string, std::string > m_uuidToScenePath
定义 DataManager.h:141
std::unordered_map< std::string, std::string > m_uuidToSceneName
定义 DataManager.h:142
std::vector< std::string > getModelList()
定义 DataManager.h:64
std::vector< std::string > m_scenePathList
定义 DataManager.h:139
bool m_isEditorMode
定义 DataManager.h:135
void updateModelPathList()
定义 DataManager.cpp:27
void loadModelUuidMapping()
定义 DataManager.h:146
std::vector< std::string > m_modelPathList
定义 DataManager.h:143
void setEditorMode(bool isEditorMode)
定义 DataManager.h:127
std::unique_ptr< DataLoader > m_dataLoader
定义 DataManager.h:144
std::string m_currentScene
定义 DataManager.h:136
void loadScenePathList()
定义 DataManager.cpp:15
void loadSceneUuidMapping()
定义 DataManager.h:186
std::unordered_map< std::string, std::shared_ptr< Scene > > m_loadScenes
定义 DataManager.h:137
std::unordered_map< std::string, std::string > m_uuidToModel
定义 DataManager.h:140
定义 Scene.h:22
定义 application.h:5
定义 DataManager.h:24
void serialize(Archive &ar, const unsigned int version)
定义 DataManager.h:29
std::string modelRelativePath
定义 DataManager.h:26
std::string uuid
定义 DataManager.h:25
定义 DataManager.h:47
void serialize(Archive &ar, const unsigned int version)
定义 DataManager.h:51
std::string initialSceneUuid
定义 DataManager.h:48
定义 DataManager.h:36
std::string uuid
定义 DataManager.h:37
void serialize(Archive &ar, const unsigned int version)
定义 DataManager.h:40