Skip to content

Commit 053012c

Browse files
committed
ok so this is just a bunch of stuff
1 parent 92c7d90 commit 053012c

File tree

7 files changed

+173
-138
lines changed

7 files changed

+173
-138
lines changed

src/CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ set(Source_Files__Resource
325325
${CMAKE_CURRENT_SOURCE_DIR}/resource/ResourceLoader.cpp
326326
${CMAKE_CURRENT_SOURCE_DIR}/resource/ResourceLoader.h
327327
${CMAKE_CURRENT_SOURCE_DIR}/resource/ResourceFactory.h
328-
${CMAKE_CURRENT_SOURCE_DIR}/resource/ResourceFactory.cpp
329328
)
330329
source_group("resource" FILES ${Source_Files__Resource})
331330

src/resource/File.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
namespace LUS {
1212
class Archive;
1313

14+
#define RESOURCE_FORMAT_BINARY 0
15+
#define RESOURCE_FORMAT_XML 1
16+
1417
struct ResourceInitData {
1518
std::string Path;
1619
Endianness ByteOrder;
1720
uint32_t Type;
1821
int32_t ResourceVersion;
1922
uint64_t Id;
2023
bool IsCustom;
21-
bool IsXml;
24+
uint32_t Format;
2225
};
2326

2427
struct File {

src/resource/ResourceLoader.cpp

+38-9
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,56 @@ ResourceLoader::~ResourceLoader() {
2424

2525
void ResourceLoader::RegisterGlobalResourceFactories() {
2626
// include strings so we register types for mResourceTypes
27-
RegisterResourceFactory(static_cast<uint32_t>(ResourceType::Texture), std::make_shared<TextureFactory>());
28-
RegisterResourceFactory(static_cast<uint32_t>(ResourceType::Vertex), std::make_shared<VertexFactory>());
29-
RegisterResourceFactory(static_cast<uint32_t>(ResourceType::DisplayList), std::make_shared<DisplayListFactory>());
30-
RegisterResourceFactory(static_cast<uint32_t>(ResourceType::Matrix), std::make_shared<MatrixFactory>());
31-
RegisterResourceFactory(static_cast<uint32_t>(ResourceType::Array), std::make_shared<ArrayFactory>());
32-
RegisterResourceFactory(static_cast<uint32_t>(ResourceType::Blob), std::make_shared<BlobFactory>());
27+
RegisterResourceFactory(std::make_shared<ResourceFactoryBinaryTextureV0>(), RESOURCE_FORMAT_BINARY, "Texture", static_cast<uint32_t>(ResourceType::Texture), 0);
28+
RegisterResourceFactory(std::make_shared<ResourceFactoryBinaryTextureV1>(), RESOURCE_FORMAT_BINARY, "Texture", static_cast<uint32_t>(ResourceType::Texture), 1);
29+
RegisterResourceFactory(std::make_shared<ResourceFactoryBinaryVertexV0>(), RESOURCE_FORMAT_BINARY, "Vertex", static_cast<uint32_t>(ResourceType::Vertex), 0);
30+
RegisterResourceFactory(std::make_shared<ResourceFactoryXMLVertexV0>(), RESOURCE_FORMAT_XML, "Vertex", static_cast<uint32_t>(ResourceType::Vertex), 0);
31+
RegisterResourceFactory(std::make_shared<ResourceFactoryBinaryDisplayListV0>(), RESOURCE_FORMAT_BINARY, "DisplayList", static_cast<uint32_t>(ResourceType::DisplayList), 0);
32+
RegisterResourceFactory(std::make_shared<ResourceFactoryXMLDisplayListV0>(), RESOURCE_FORMAT_XML, "DisplayList", static_cast<uint32_t>(ResourceType::DisplayList), 0);
33+
RegisterResourceFactory(std::make_shared<ResourceFactoryBinaryMatrixV0>(), RESOURCE_FORMAT_BINARY, "Matrix", static_cast<uint32_t>(ResourceType::Matrix), 0);
34+
RegisterResourceFactory(std::make_shared<ResourceFactoryBinaryArrayV0>(), RESOURCE_FORMAT_BINARY, "Array", static_cast<uint32_t>(ResourceType::Array), 0);
35+
RegisterResourceFactory(std::make_shared<ResourceFactoryBinaryBlobV0>(), RESOURCE_FORMAT_BINARY, "Blob", static_cast<uint32_t>(ResourceType::Blob), 0);
3336
}
3437

3538
bool ResourceLoader::RegisterResourceFactory(std::shared_ptr<ResourceFactory> factory, uint32_t format, std::string typeName, uint32_t type, uint32_t version) {
3639
if (mResourceTypes.contains(typeName)) {
37-
return false;
40+
if(mResourceTypes[typeName] != type) {
41+
SPDLOG_ERROR("Failed to register resource factory: conflicting types for name {}", typeName);
42+
return false;
43+
}
44+
} else {
45+
mResourceTypes[typeName] = type;
3846
}
39-
mResourceTypes[typeName] = type;
4047

4148
ResourceFactoryKey key = {resourceFormat: format, resourceType: type, resourceVersion: version};
4249
if (mFactories.contains(key)) {
50+
SPDLOG_ERROR("Failed to register resource factory: factory with key {}{}{} already exists", format, type, version);
4351
return false;
4452
}
4553
mFactories[key] = factory;
4654

4755
return true;
4856
}
4957

58+
std::shared_ptr<ResourceFactory> ResourceLoader::GetFactory(uint32_t format, uint32_t type, uint32_t version) {
59+
ResourceFactoryKey key = {resourceFormat: format, resourceType: type, resourceVersion: version};
60+
if (!mFactories.contains(key)) {
61+
SPDLOG_ERROR("Could not find resource factory with key {}{}{}", format, type, version);
62+
return nullptr;
63+
}
64+
65+
return mFactories[key];
66+
}
67+
68+
std::shared_ptr<ResourceFactory> ResourceLoader::GetFactory(uint32_t format, std::string typeName, uint32_t version) {
69+
if (!mResourceTypes.contains(typeName)) {
70+
SPDLOG_ERROR("Could not find resource type for name {}", typeName);
71+
return nullptr;
72+
}
73+
74+
return GetFactory(format, mResourceTypes[typeName], version);
75+
}
76+
5077
std::shared_ptr<IResource> ResourceLoader::LoadResource(std::shared_ptr<File> fileToLoad) {
5178
std::shared_ptr<IResource> result = nullptr;
5279

@@ -64,7 +91,9 @@ std::shared_ptr<IResource> ResourceLoader::LoadResource(std::shared_ptr<File> fi
6491
// make a method that takes in a string instead of an int for the type too
6592
// make those protected
6693

67-
auto factory = mFactories[fileToLoad->InitData->Type];
94+
95+
96+
auto factory = GetFactory(fileToLoad->InitData->IsXml) mFactories[fileToLoad->InitData->Type];
6897
if (factory == nullptr) {
6998
SPDLOG_ERROR("Failed to load resource: Factory does not exist ({} - {})", fileToLoad->InitData->Type,
7099
fileToLoad->InitData->Path);

src/resource/ResourceLoader.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ class ResourceLoader {
2323
std::shared_ptr<IResource> LoadResource(std::shared_ptr<File> fileToLoad);
2424
bool RegisterResourceFactory(std::shared_ptr<ResourceFactory> factory, uint32_t format, std::string typeName, uint32_t type, uint32_t version);
2525

26+
uint32_t GetResourceType(const std::string& type);
27+
2628
protected:
2729
void RegisterGlobalResourceFactories();
30+
std::shared_ptr<ResourceFactory> GetFactory(uint32_t format, uint32_t type, uint32_t version);
31+
std::shared_ptr<ResourceFactory> GetFactory(uint32_t format, std::string typeName, uint32_t version);
2832

2933
private:
30-
uint32_t GetResourceType(const std::string& type);
3134
std::unordered_map<std::string, uint32_t> mResourceTypes;
3235
std::unordered_map<ResourceFactoryKey, std::shared_ptr<ResourceFactory>> mFactories;
3336
};

src/resource/archive/Archive.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ std::shared_ptr<ResourceInitData> Archive::ReadResourceInitDataXml(const std::st
233233
resourceInitData->IsXml = true;
234234

235235
auto root = document->FirstChildElement();
236-
resourceInitData->Type = mFactoriesTypes[root->Name()];
236+
resourceInitData->Type = Context::GetInstance()->GetResourceManager()->GetResourceLoader()->GetResourceType(root->Name());
237237
resourceInitData->ResourceVersion = root->IntAttribute("Version");
238238

239239
return resourceInitData;

0 commit comments

Comments
 (0)