Skip to content

Commit d678788

Browse files
author
Christian Koehlke
committed
loading percentage
-ResourceManager now first counts how many models/objects needs to be loaded and then calculates the percentage of how many models are finished loading -> can be used for progress bar in loading screen
1 parent 16842f2 commit d678788

2 files changed

Lines changed: 70 additions & 27 deletions

File tree

Game/ResourceManager.cpp

Lines changed: 69 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,21 @@
44
#include "Renderer.h"
55

66
#include "libs/stb_image.h"
7-
7+
#include <cmath>
8+
#include <sstream>
89

910
std::string ResourceManager::modelFolder = "models";
11+
float ResourceManager::percentageLoading=0;
1012

1113

14+
template <typename T>
15+
std::string to_string_with_precision(const T a_value, const int n = 6)
16+
{
17+
std::ostringstream out;
18+
out.precision(n);
19+
out << std::fixed << a_value;
20+
return out.str();
21+
}
1222

1323
Shader* ResourceManager::loadShader(std::string vertexShaderFilename, std::string fragmentShaderFilename)
1424
{
@@ -22,49 +32,66 @@ std::vector<Model*> ResourceManager::loadAllModels(tinyxml2::XMLDocument* doc)
2232
{
2333
Logger::log("Loading all Models");
2434

35+
std::string newmodefilename;
2536
std::vector<Model*> models;
26-
std::string xmlNodeText;
2737
int id = 0;
38+
std::list<std::string> modelfilenames;
39+
40+
2841

2942
for (tinyxml2::XMLElement* xmlNodeObject = doc->FirstChildElement("map")->FirstChildElement("models")->FirstChildElement("model"); xmlNodeObject != NULL; xmlNodeObject = xmlNodeObject->NextSiblingElement())
3043
{
31-
xmlNodeText = xmlNodeObject->GetText();
32-
33-
Model* newModel = loadModel(modelFolder + "/" + xmlNodeText);
34-
newModel->setModelName(xmlNodeText);
35-
newModel->setModelID(id++);
44+
newmodefilename = xmlNodeObject->GetText();
45+
bool alreadyLoaded = false;
3646

37-
Logger::log("loaded Model " + std::to_string(newModel->getModelID()) + ": " + newModel->getModelName());
38-
models.push_back(newModel);
47+
for (std::string modefilename : modelfilenames)
48+
{
49+
if (modefilename == newmodefilename)
50+
{
51+
alreadyLoaded = true;
52+
break;
53+
}
54+
}
55+
if (!alreadyLoaded)
56+
{
57+
modelfilenames.push_back(newmodefilename);
58+
}
3959
}
4060

4161
for (tinyxml2::XMLElement* xmlNodeObject = doc->FirstChildElement("map")->FirstChildElement("objects")->FirstChildElement("object"); xmlNodeObject != NULL; xmlNodeObject = xmlNodeObject->NextSiblingElement())
4262
{
43-
xmlNodeText = xmlNodeObject->FirstChildElement("modelfile")->GetText();
44-
bool modelAlreadyLoaded = false;
63+
newmodefilename = xmlNodeObject->FirstChildElement("modelfile")->GetText();
64+
bool alreadyLoaded = false;
4565

46-
for (Model* loadedModels : models)
66+
for (std::string modefilename : modelfilenames)
4767
{
48-
if (loadedModels->getModelName() == xmlNodeText) //model is already loaded
68+
if (modefilename == newmodefilename)
4969
{
50-
modelAlreadyLoaded = true;
70+
alreadyLoaded = true;
5171
break;
5272
}
5373
}
54-
if (modelAlreadyLoaded)
74+
if (!alreadyLoaded)
5575
{
56-
continue;
76+
modelfilenames.push_back(newmodefilename);
5777
}
78+
}
5879

59-
Model* newModel = loadModel(modelFolder + "/" + xmlNodeText);
60-
newModel->setModelName(xmlNodeText);
80+
81+
float modelCount = modelfilenames.size();
82+
83+
for (std::string modefilename : modelfilenames)
84+
{
85+
86+
Model* newModel = loadModel(modelFolder + "/" + modefilename);
87+
newModel->setModelName(modefilename);
6188
newModel->setModelID(id++);
6289

63-
Logger::log("loaded Model " + std::to_string(newModel->getModelID()) + ": " + newModel->getModelName());
90+
percentageLoading += 80 / modelCount;
91+
Logger::log("loaded Model " + std::to_string(newModel->getModelID()) + ": " + newModel->getModelName() + " - " + to_string_with_precision(percentageLoading,0)+ "%");
6492
models.push_back(newModel);
6593
}
6694

67-
6895
Logger::log("Loading all Models - finished");
6996
return models;
7097
}
@@ -100,7 +127,6 @@ void ResourceManager::loadMap(std::string mapFileName, std::vector<std::shared_p
100127
std::vector<std::string> params;
101128

102129

103-
104130
doc.LoadFile(mapFileNameC);
105131

106132
std::string title = doc.FirstChildElement("map")->FirstChildElement("name")->GetText();
@@ -122,6 +148,12 @@ void ResourceManager::loadMap(std::string mapFileName, std::vector<std::shared_p
122148

123149

124150
Logger::log("Loading all Objects");
151+
float objectCount = 0;
152+
for (tinyxml2::XMLElement* xmlNodeObject = doc.FirstChildElement("map")->FirstChildElement("objects")->FirstChildElement("object"); xmlNodeObject != NULL; xmlNodeObject = xmlNodeObject->NextSiblingElement())
153+
{
154+
objectCount++;
155+
}
156+
125157
for (tinyxml2::XMLElement* xmlNodeObject = doc.FirstChildElement("map")->FirstChildElement("objects")->FirstChildElement("object"); xmlNodeObject != NULL; xmlNodeObject = xmlNodeObject->NextSiblingElement())
126158
{
127159
xmlNodeText = xmlNodeObject->FirstChildElement("modelfile")->GetText();
@@ -155,14 +187,25 @@ void ResourceManager::loadMap(std::string mapFileName, std::vector<std::shared_p
155187

156188
newObject->setNumber(numObject);
157189

158-
Logger::log("loaded Object:" + newObject->printObject());
190+
percentageLoading += 10 / objectCount;
191+
Logger::log("loaded Object:" + newObject->printObject() + " - " + to_string_with_precision(percentageLoading, 0) + "%");
159192
objects->push_back(newObject);
160193

194+
195+
161196
numObject++;
162197
}
163198
Logger::log("Loading all Objects - finished");
164199

165-
Logger::log("Loading all NPCS");
200+
201+
202+
Logger::log("Loading all NPCs");
203+
float npcCount = 0;
204+
for (tinyxml2::XMLElement* xmlNodeBot = doc.FirstChildElement("map")->FirstChildElement("bots")->FirstChildElement("bot"); xmlNodeBot != NULL; xmlNodeBot = xmlNodeBot->NextSiblingElement())
205+
{
206+
npcCount++;
207+
}
208+
166209
for (tinyxml2::XMLElement* xmlNodeBot = doc.FirstChildElement("map")->FirstChildElement("bots")->FirstChildElement("bot"); xmlNodeBot != NULL; xmlNodeBot = xmlNodeBot->NextSiblingElement())
167210
{
168211
xmlNodeText = xmlNodeBot->FirstChildElement("modelfile")->GetText();
@@ -181,8 +224,6 @@ void ResourceManager::loadMap(std::string mapFileName, std::vector<std::shared_p
181224
split(xmlNodeText, params, ';');
182225
newNPC->setScale(glm::vec3(stof(params[0]), stof(params[1]), stof(params[2])));
183226

184-
//xmlNodeText = xmlNodeBot->FirstChildElement("type")->GetText();
185-
//newNPC->setType(Object::convertStringToType(xmlNodeText));
186227

187228
xmlNodeText = xmlNodeBot->FirstChildElement("name")->GetText();
188229
newNPC->setName(xmlNodeText);
@@ -210,7 +251,8 @@ void ResourceManager::loadMap(std::string mapFileName, std::vector<std::shared_p
210251

211252
newNPC->setNumber(numObject);
212253

213-
Logger::log("loaded NPC:" + newNPC->printObject());
254+
percentageLoading += 10 / npcCount;
255+
Logger::log("loaded NPC:" + newNPC->printObject() + " - " + to_string_with_precision(percentageLoading, 0) + "%");
214256
objects->push_back(newNPC);
215257
npcs->push_back(newNPC);
216258
characters->push_back(newNPC);
@@ -238,7 +280,7 @@ void ResourceManager::loadMap(std::string mapFileName, std::vector<std::shared_p
238280
characters->push_back(newNpc);
239281
numObject++;
240282
}
241-
Logger::log("Loading all NPCS - finished");
283+
Logger::log("Loading all NPCs - finished");
242284

243285
}
244286

Game/ResourceManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ static class ResourceManager
3838
static size_t split(const std::string& txt, std::vector<std::string>& strs, char ch);
3939

4040
static std::string modelFolder;
41+
static float percentageLoading;
4142

4243

4344
};

0 commit comments

Comments
 (0)