Parcourir la source

Fixing builtin resource import to properly account for shader includes in all cases

BearishSun il y a 8 ans
Parent
commit
4095986c76
1 fichiers modifiés avec 66 ajouts et 59 suppressions
  1. 66 59
      Source/BansheeEngine/Source/BsBuiltinResourcesHelper.cpp

+ 66 - 59
Source/BansheeEngine/Source/BsBuiltinResourcesHelper.cpp

@@ -101,6 +101,7 @@ namespace bs
 
 			// Use the provided UUID if just one resource, otherwise we ignore the UUID. The current assumption is that
 			// such resources don't require persistent UUIDs. If that changes then this method needs to be updated.
+			Vector<HResource> savedResources(resourcesToSave.size());
 			if (resourcesToSave.size() == 1)
 			{
 				Path outputPath = outputFolder + resourcesToSave[0].first;
@@ -112,10 +113,11 @@ namespace bs
 					manifest->registerResource(resource.getUUID(), outputPath);
 				}
 
-				return resource;
+				savedResources[0] = resource;
 			}
 			else
 			{
+				UINT32 idx = 0;
 				for (auto& entry : resourcesToSave)
 				{
 					Path outputPath = outputFolder + entry.first;;
@@ -126,10 +128,13 @@ namespace bs
 						Resources::instance().save(resource, outputPath, true);
 						manifest->registerResource(resource.getUUID(), outputPath);
 					}
+
+					savedResources[idx] = resource;
+					idx++;
 				}
 			}
 
-			return HResource();
+			return savedResources;
 		};
 
 		auto generateSprite = [&](const HTexture& texture, const String& fileName, const String& UUID)
@@ -181,80 +186,82 @@ namespace bs
 				isIcon = entry.find("TextureUUID16") != entry.end();
 			}
 
-			HResource outputRes = importResource(name.c_str(), uuid.c_str());
-			if (outputRes == nullptr)
+			Vector<HResource> outputResources = importResource(name.c_str(), uuid.c_str());
+			bool foundDependencies = false;
+			for (auto& outputRes : outputResources)
 			{
-				idx++;
-				continue;
-			}
+				if (outputRes == nullptr)
+					continue;
 
-			if (rtti_is_of_type<Shader>(outputRes.get()))
-			{
-				HShader shader = static_resource_cast<Shader>(outputRes);
-				if (!verifyAndReportShader(shader))
-					return;
-
-				if(dependencies != nullptr)
+				if (rtti_is_of_type<Shader>(outputRes.get()))
 				{
-					SPtr<ShaderMetaData> shaderMetaData = std::static_pointer_cast<ShaderMetaData>(shader->getMetaData());
+					HShader shader = static_resource_cast<Shader>(outputRes);
+					if (!verifyAndReportShader(shader))
+						return;
 
-					nlohmann::json dependencyEntries;
-					if(shaderMetaData != nullptr && shaderMetaData->includes.size() > 0)
+					if (!foundDependencies && dependencies != nullptr)
 					{
-						for(auto& include : shaderMetaData->includes)
+						SPtr<ShaderMetaData> shaderMetaData = std::static_pointer_cast<ShaderMetaData>(shader->getMetaData());
+
+						nlohmann::json dependencyEntries;
+						if (shaderMetaData != nullptr && shaderMetaData->includes.size() > 0)
 						{
-							Path includePath = include.c_str();
-							if (include.substr(0, 8) == "$ENGINE$" || include.substr(0, 8) == "$EDITOR$")
+							for (auto& include : shaderMetaData->includes)
 							{
-								if (include.size() > 8)
-									includePath = include.substr(9, include.size() - 9);
+								Path includePath = include.c_str();
+								if (include.substr(0, 8) == "$ENGINE$" || include.substr(0, 8) == "$EDITOR$")
+								{
+									if (include.size() > 8)
+										includePath = include.substr(9, include.size() - 9);
+								}
+
+								nlohmann::json newDependencyEntry =
+								{
+									{ "Path", includePath.toString().c_str() }
+								};
+
+								dependencyEntries.push_back(newDependencyEntry);
 							}
-
-							nlohmann::json newDependencyEntry =
-							{ 
-								{ "Path", includePath.toString().c_str() }
-							};
-
-							dependencyEntries.push_back(newDependencyEntry);
 						}
-					}
 
-					(*dependencies)[name] = dependencyEntries;
+						(*dependencies)[name] = dependencyEntries;
+						foundDependencies = true;
+					}
 				}
-			}
-
-			if (mode == AssetType::Sprite)
-			{
-				std::string spriteUUID = entry["SpriteUUID"];
-
-				HTexture tex = static_resource_cast<Texture>(outputRes);
-				generateSprite(tex, name.c_str(), spriteUUID.c_str());
-			}
 
-			if(isIcon)
-			{
-				IconData iconData;
-				iconData.source = static_resource_cast<Texture>(outputRes);
-				iconData.name = name.c_str();
-
-				if (mode == AssetType::Normal)
+				if (mode == AssetType::Sprite)
 				{
-					iconData.TextureUUIDs[0] = entry["UUID48"];
-					iconData.TextureUUIDs[1] = entry["UUID32"];
-					iconData.TextureUUIDs[2] = entry["UUID16"];
+					std::string spriteUUID = entry["SpriteUUID"];
+
+					HTexture tex = static_resource_cast<Texture>(outputRes);
+					generateSprite(tex, name.c_str(), spriteUUID.c_str());
 				}
-				else if (mode == AssetType::Sprite)
+
+				if (isIcon)
 				{
-					iconData.TextureUUIDs[0] = entry["TextureUUID48"];
-					iconData.TextureUUIDs[1] = entry["TextureUUID32"];
-					iconData.TextureUUIDs[2] = entry["TextureUUID16"];
+					IconData iconData;
+					iconData.source = static_resource_cast<Texture>(outputRes);
+					iconData.name = name.c_str();
 
-					iconData.SpriteUUIDs[0] = entry["SpriteUUID48"];
-					iconData.SpriteUUIDs[1] = entry["SpriteUUID32"];
-					iconData.SpriteUUIDs[2] = entry["SpriteUUID16"];
-				}
+					if (mode == AssetType::Normal)
+					{
+						iconData.TextureUUIDs[0] = entry["UUID48"];
+						iconData.TextureUUIDs[1] = entry["UUID32"];
+						iconData.TextureUUIDs[2] = entry["UUID16"];
+					}
+					else if (mode == AssetType::Sprite)
+					{
+						iconData.TextureUUIDs[0] = entry["TextureUUID48"];
+						iconData.TextureUUIDs[1] = entry["TextureUUID32"];
+						iconData.TextureUUIDs[2] = entry["TextureUUID16"];
 
-				iconsToGenerate.push_back(iconData);
+						iconData.SpriteUUIDs[0] = entry["SpriteUUID48"];
+						iconData.SpriteUUIDs[1] = entry["SpriteUUID32"];
+						iconData.SpriteUUIDs[2] = entry["SpriteUUID16"];
+					}
+
+					iconsToGenerate.push_back(iconData);
+				}
 			}
 
 			idx++;