@@ -24,29 +24,56 @@ ResourceLoader::~ResourceLoader() {
24
24
25
25
void ResourceLoader::RegisterGlobalResourceFactories () {
26
26
// 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 );
33
36
}
34
37
35
38
bool ResourceLoader::RegisterResourceFactory (std::shared_ptr<ResourceFactory> factory, uint32_t format, std::string typeName, uint32_t type, uint32_t version) {
36
39
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;
38
46
}
39
- mResourceTypes [typeName] = type;
40
47
41
48
ResourceFactoryKey key = {resourceFormat: format, resourceType: type, resourceVersion: version};
42
49
if (mFactories .contains (key)) {
50
+ SPDLOG_ERROR (" Failed to register resource factory: factory with key {}{}{} already exists" , format, type, version);
43
51
return false ;
44
52
}
45
53
mFactories [key] = factory;
46
54
47
55
return true ;
48
56
}
49
57
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
+
50
77
std::shared_ptr<IResource> ResourceLoader::LoadResource (std::shared_ptr<File> fileToLoad) {
51
78
std::shared_ptr<IResource> result = nullptr ;
52
79
@@ -64,7 +91,9 @@ std::shared_ptr<IResource> ResourceLoader::LoadResource(std::shared_ptr<File> fi
64
91
// make a method that takes in a string instead of an int for the type too
65
92
// make those protected
66
93
67
- auto factory = mFactories [fileToLoad->InitData ->Type ];
94
+
95
+
96
+ auto factory = GetFactory (fileToLoad->InitData ->IsXml ) mFactories [fileToLoad->InitData ->Type ];
68
97
if (factory == nullptr ) {
69
98
SPDLOG_ERROR (" Failed to load resource: Factory does not exist ({} - {})" , fileToLoad->InitData ->Type ,
70
99
fileToLoad->InitData ->Path );
0 commit comments