ソースを参照

Added a better way of merging shader techniques, and support for merging based on tags
Updated builtin editor resources so icon assets aren't recreated on any data folder modification

BearishSun 9 年 前
コミット
5c09c75232
100 ファイル変更124 行追加28 行削除
  1. BIN
      Data/Editor/GUISkin.asset
  2. BIN
      Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd16.asset
  3. BIN
      Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd32.asset
  4. BIN
      Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd48.asset
  5. BIN
      Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd16.asset
  6. BIN
      Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd32.asset
  7. BIN
      Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd48.asset
  8. BIN
      Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd16.asset
  9. BIN
      Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd32.asset
  10. BIN
      Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd48.asset
  11. BIN
      Data/Editor/Icons/Sprites/sprite_FolderIcon.psd16.asset
  12. BIN
      Data/Editor/Icons/Sprites/sprite_FolderIcon.psd32.asset
  13. BIN
      Data/Editor/Icons/Sprites/sprite_FolderIcon.psd48.asset
  14. BIN
      Data/Editor/Icons/Sprites/sprite_FontIcon.psd16.asset
  15. BIN
      Data/Editor/Icons/Sprites/sprite_FontIcon.psd32.asset
  16. BIN
      Data/Editor/Icons/Sprites/sprite_FontIcon.psd48.asset
  17. BIN
      Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd16.asset
  18. BIN
      Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd32.asset
  19. BIN
      Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd48.asset
  20. BIN
      Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd16.asset
  21. BIN
      Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd32.asset
  22. BIN
      Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd48.asset
  23. BIN
      Data/Editor/Icons/Sprites/sprite_MeshIcon.psd16.asset
  24. BIN
      Data/Editor/Icons/Sprites/sprite_MeshIcon.psd32.asset
  25. BIN
      Data/Editor/Icons/Sprites/sprite_MeshIcon.psd48.asset
  26. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd16.asset
  27. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd32.asset
  28. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd48.asset
  29. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd16.asset
  30. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd32.asset
  31. BIN
      Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd48.asset
  32. BIN
      Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd16.asset
  33. BIN
      Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd32.asset
  34. BIN
      Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd48.asset
  35. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd16.asset
  36. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd32.asset
  37. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd48.asset
  38. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd16.asset
  39. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd32.asset
  40. BIN
      Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd48.asset
  41. BIN
      Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd16.asset
  42. BIN
      Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd32.asset
  43. BIN
      Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd48.asset
  44. BIN
      Data/Editor/Icons/Sprites/sprite_TextIcon.psd16.asset
  45. BIN
      Data/Editor/Icons/Sprites/sprite_TextIcon.psd32.asset
  46. BIN
      Data/Editor/Icons/Sprites/sprite_TextIcon.psd48.asset
  47. BIN
      Data/Editor/Icons/Sprites/sprite_TextureIcon.psd16.asset
  48. BIN
      Data/Editor/Icons/Sprites/sprite_TextureIcon.psd32.asset
  49. BIN
      Data/Editor/Icons/Sprites/sprite_TextureIcon.psd48.asset
  50. BIN
      Data/Editor/ResourceManifest.asset
  51. BIN
      Data/Editor/Shaders/ClearHandleAlpha.bsl.asset
  52. BIN
      Data/Editor/Shaders/DockDropOverlay.bsl.asset
  53. BIN
      Data/Editor/Shaders/GizmoPicking.bsl.asset
  54. BIN
      Data/Editor/Shaders/GizmoPickingAlpha.bsl.asset
  55. BIN
      Data/Editor/Shaders/IconGizmo.bsl.asset
  56. BIN
      Data/Editor/Shaders/LineGizmo.bsl.asset
  57. BIN
      Data/Editor/Shaders/LineHandle.bsl.asset
  58. BIN
      Data/Editor/Shaders/PickingAlphaCullCCW.bsl.asset
  59. BIN
      Data/Editor/Shaders/PickingAlphaCullCW.bsl.asset
  60. BIN
      Data/Editor/Shaders/PickingAlphaCullNone.bsl.asset
  61. BIN
      Data/Editor/Shaders/PickingCullCCW.bsl.asset
  62. BIN
      Data/Editor/Shaders/PickingCullCW.bsl.asset
  63. BIN
      Data/Editor/Shaders/PickingCullNone.bsl.asset
  64. BIN
      Data/Editor/Shaders/SceneGrid.bsl.asset
  65. BIN
      Data/Editor/Shaders/Selection.bsl.asset
  66. BIN
      Data/Editor/Shaders/SolidGizmo.bsl.asset
  67. BIN
      Data/Editor/Shaders/SolidHandle.bsl.asset
  68. BIN
      Data/Editor/Shaders/TextGizmo.bsl.asset
  69. BIN
      Data/Editor/Shaders/WireGizmo.bsl.asset
  70. BIN
      Data/Editor/Timestamp.asset
  71. BIN
      Data/Editor/arial.ttf.asset
  72. BIN
      Data/Editor/arialAA.ttf.asset
  73. BIN
      Data/Engine/GUISkin.asset
  74. BIN
      Data/Engine/ResourceManifest.asset
  75. BIN
      Data/Engine/Shaders/Blit.bsl.asset
  76. BIN
      Data/Engine/Shaders/Default.bsl.asset
  77. BIN
      Data/Engine/Shaders/DeferredDirectionalLightPass.bsl.asset
  78. BIN
      Data/Engine/Shaders/DeferredPointLightPassIn.bsl.asset
  79. BIN
      Data/Engine/Shaders/DeferredPointLightPassOut.bsl.asset
  80. BIN
      Data/Engine/Shaders/Diffuse.bsl.asset
  81. BIN
      Data/Engine/Shaders/PPCreateTonemapLUT.bsl.asset
  82. BIN
      Data/Engine/Shaders/PPDownsample.bsl.asset
  83. BIN
      Data/Engine/Shaders/PPEyeAdaptHistogram.bsl.asset
  84. BIN
      Data/Engine/Shaders/PPEyeAdaptHistogramReduce.bsl.asset
  85. BIN
      Data/Engine/Shaders/PPEyeAdaptation.bsl.asset
  86. BIN
      Data/Engine/Shaders/PPTonemapping.bsl.asset
  87. BIN
      Data/Engine/Shaders/PPTonemapping_1.bsl.asset
  88. BIN
      Data/Engine/Shaders/PPTonemapping_2.bsl.asset
  89. BIN
      Data/Engine/Shaders/PPTonemapping_3.bsl.asset
  90. BIN
      Data/Engine/Shaders/Resolve.bsl.asset
  91. BIN
      Data/Engine/Shaders/SpriteImageAlpha.bsl.asset
  92. BIN
      Data/Engine/Shaders/SpriteImageNoAlpha.bsl.asset
  93. BIN
      Data/Engine/Shaders/SpriteLine.bsl.asset
  94. BIN
      Data/Engine/Shaders/SpriteText.bsl.asset
  95. BIN
      Data/Engine/Shaders/TestFX.bsl.asset
  96. BIN
      Data/Engine/Timestamp.asset
  97. BIN
      Data/Engine/arial.ttf.asset
  98. 23 12
      Source/BansheeEditor/Source/BsBuiltinEditorResources.cpp
  99. 13 2
      Source/BansheeSL/Include/BsSLFXCompiler.h
  100. 88 14
      Source/BansheeSL/Source/BsSLFXCompiler.cpp

BIN
Data/Editor/GUISkin.asset


BIN
Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_AnimationClipIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_AudioClipIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_CSharpIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_FolderIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_FolderIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_FolderIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_FontIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_FontIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_FontIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_GUISkinIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_MaterialIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_MeshIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_MeshIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_MeshIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMaterialIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_PhysicsMeshIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_PrefabIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_ShaderIncludeIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_SpriteIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextIcon.psd48.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextureIcon.psd16.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextureIcon.psd32.asset


BIN
Data/Editor/Icons/Sprites/sprite_TextureIcon.psd48.asset


BIN
Data/Editor/ResourceManifest.asset


BIN
Data/Editor/Shaders/ClearHandleAlpha.bsl.asset


BIN
Data/Editor/Shaders/DockDropOverlay.bsl.asset


BIN
Data/Editor/Shaders/GizmoPicking.bsl.asset


BIN
Data/Editor/Shaders/GizmoPickingAlpha.bsl.asset


BIN
Data/Editor/Shaders/IconGizmo.bsl.asset


BIN
Data/Editor/Shaders/LineGizmo.bsl.asset


BIN
Data/Editor/Shaders/LineHandle.bsl.asset


BIN
Data/Editor/Shaders/PickingAlphaCullCCW.bsl.asset


BIN
Data/Editor/Shaders/PickingAlphaCullCW.bsl.asset


BIN
Data/Editor/Shaders/PickingAlphaCullNone.bsl.asset


BIN
Data/Editor/Shaders/PickingCullCCW.bsl.asset


BIN
Data/Editor/Shaders/PickingCullCW.bsl.asset


BIN
Data/Editor/Shaders/PickingCullNone.bsl.asset


BIN
Data/Editor/Shaders/SceneGrid.bsl.asset


BIN
Data/Editor/Shaders/Selection.bsl.asset


BIN
Data/Editor/Shaders/SolidGizmo.bsl.asset


BIN
Data/Editor/Shaders/SolidHandle.bsl.asset


BIN
Data/Editor/Shaders/TextGizmo.bsl.asset


BIN
Data/Editor/Shaders/WireGizmo.bsl.asset


BIN
Data/Editor/Timestamp.asset


BIN
Data/Editor/arial.ttf.asset


BIN
Data/Editor/arialAA.ttf.asset


BIN
Data/Engine/GUISkin.asset


BIN
Data/Engine/ResourceManifest.asset


BIN
Data/Engine/Shaders/Blit.bsl.asset


BIN
Data/Engine/Shaders/Default.bsl.asset


BIN
Data/Engine/Shaders/DeferredDirectionalLightPass.bsl.asset


BIN
Data/Engine/Shaders/DeferredPointLightPassIn.bsl.asset


BIN
Data/Engine/Shaders/DeferredPointLightPassOut.bsl.asset


BIN
Data/Engine/Shaders/Diffuse.bsl.asset


BIN
Data/Engine/Shaders/PPCreateTonemapLUT.bsl.asset


BIN
Data/Engine/Shaders/PPDownsample.bsl.asset


BIN
Data/Engine/Shaders/PPEyeAdaptHistogram.bsl.asset


BIN
Data/Engine/Shaders/PPEyeAdaptHistogramReduce.bsl.asset


BIN
Data/Engine/Shaders/PPEyeAdaptation.bsl.asset


BIN
Data/Engine/Shaders/PPTonemapping.bsl.asset


BIN
Data/Engine/Shaders/PPTonemapping_1.bsl.asset


BIN
Data/Engine/Shaders/PPTonemapping_2.bsl.asset


BIN
Data/Engine/Shaders/PPTonemapping_3.bsl.asset


BIN
Data/Engine/Shaders/Resolve.bsl.asset


BIN
Data/Engine/Shaders/SpriteImageAlpha.bsl.asset


BIN
Data/Engine/Shaders/SpriteImageNoAlpha.bsl.asset


BIN
Data/Engine/Shaders/SpriteLine.bsl.asset


BIN
Data/Engine/Shaders/SpriteText.bsl.asset


BIN
Data/Engine/Shaders/TestFX.bsl.asset


BIN
Data/Engine/Timestamp.asset


BIN
Data/Engine/arial.ttf.asset


+ 23 - 12
Source/BansheeEditor/Source/BsBuiltinEditorResources.cpp

@@ -461,6 +461,25 @@ namespace BansheeEngine
 
 		gCoreAccessor().submitToCoreThread(true);
 
+		auto saveTexture = [&](auto& pixelData, auto& path)
+		{
+			if (FileSystem::exists(path))
+			{
+				HResource resource = gResources().load(path);
+
+				SPtr<Texture> texture = Texture::_createPtr(pixelData);
+				gResources().update(resource, texture);
+				Resources::instance().save(resource, path, true);
+				manifest->registerResource(resource.getUUID(), path);
+			}
+			else
+			{
+				HTexture texture = Texture::create(pixelData);
+				Resources::instance().save(texture, path, true);
+				manifest->registerResource(texture.getUUID(), path);
+			}
+		};
+
 		idx = 0;
 		for (auto& iconName : iconsToProcess)
 		{
@@ -475,22 +494,14 @@ namespace BansheeEngine
 			SPtr<PixelData> scaled16 = PixelData::create(16, 16, 1, src->getFormat());
 			PixelUtil::scale(*scaled32, *scaled16);
 
-			HTexture tex48 = Texture::create(scaled48);
-			HTexture tex32 = Texture::create(scaled32);
-			HTexture tex16 = Texture::create(scaled16);
-
 			Path outputPath48 = inputFolder + (iconName + L"48.asset");
-			Resources::instance().save(tex48, outputPath48, true);
-			manifest->registerResource(tex48.getUUID(), outputPath48);
-
 			Path outputPath32 = inputFolder + (iconName + L"32.asset");
-			Resources::instance().save(tex32, outputPath32, true);
-			manifest->registerResource(tex32.getUUID(), outputPath32);
-
 			Path outputPath16 = inputFolder + (iconName + L"16.asset");
-			Resources::instance().save(tex16, outputPath16, true);
-			manifest->registerResource(tex16.getUUID(), outputPath16);
 
+			saveTexture(scaled48, outputPath48);
+			saveTexture(scaled32, outputPath32);
+			saveTexture(scaled16, outputPath16);
+					
 			idx++;
 		}
 	}

+ 13 - 2
Source/BansheeSL/Include/BsSLFXCompiler.h

@@ -67,6 +67,7 @@ namespace BansheeEngine
 			StringID renderAPI = RenderAPIAny;
 			Vector<StringID> tags;
 			String language;
+			bool include = false;
 
 			PassData commonPassData;
 			Vector<PassData> passes;
@@ -87,8 +88,18 @@ namespace BansheeEngine
 		static void getTechniqueIdentifier(ASTFXNode* technique, StringID& renderer, String& language, 
 			Vector<StringID>& tags);
 
-		/** Checks if two techniques can be matched based on the options specified in their child nodes. */
-		static bool doTechniquesMatch(ASTFXNode* into, ASTFXNode* from);
+		/** 
+		 * Checks if two techniques can be matched based on the options specified in their child nodes. Used for deciding
+		 * if two techniques should be merged.
+		 * 
+		 * @param[in]	into			Parent technique the merge should be performed into.
+		 * @param[in]	from			Child technique the merge should be performed from.
+		 * @param[out]	isMoreSpecific	Returns true if the @p from technique is more specific than @p into technique.
+		 *								(e.g. @p into technique accepts any language, while @p from only accepts HLSL).
+		 *								Only relevant if techniques match.
+		 * @return						True if the techniques match.
+		 */
+		static bool doTechniquesMatch(ASTFXNode* into, ASTFXNode* from, bool& isMoreSpecific);
 
 		/**	Converts FX renderer name into an in-engine renderer identifier. */
 		static StringID parseRenderer(const String& name);

+ 88 - 14
Source/BansheeSL/Source/BsSLFXCompiler.cpp

@@ -226,8 +226,10 @@ namespace BansheeEngine
 		}
 	}
 
-	bool BSLFXCompiler::doTechniquesMatch(ASTFXNode* into, ASTFXNode* from)
+	bool BSLFXCompiler::doTechniquesMatch(ASTFXNode* into, ASTFXNode* from, bool& isMoreSpecific)
 	{
+		isMoreSpecific = false;
+
 		StringID intoRenderer = RendererAny;
 		String intoLanguage = "Any";
 		Vector<StringID> intoTags;
@@ -239,31 +241,74 @@ namespace BansheeEngine
 		getTechniqueIdentifier(into, intoRenderer, intoLanguage, intoTags);
 		getTechniqueIdentifier(from, fromRenderer, fromLanguage, fromTags);
 
-		bool matches = (intoRenderer == fromRenderer || fromRenderer == RendererAny) && (intoLanguage == fromLanguage || fromLanguage == "Any");
-		if(matches)
+		bool matches = true;
+		if (intoRenderer != fromRenderer)
+		{
+			if (intoRenderer == RendererAny)
+				isMoreSpecific = true;
+			else if(fromRenderer != RendererAny)
+				matches = false;
+		}
+
+		if(intoLanguage != fromLanguage)
+		{
+			if(intoLanguage == "Any")
+				isMoreSpecific = true;
+			else if (intoLanguage != "Any")
+				matches = false;
+		}
+
+		static StringID AnyTag("Any");
+		if (matches)
 		{
+			bool tagsMatch = true;
 			for (auto& intoTag : intoTags)
 			{
 				auto iterFind = std::find(fromTags.begin(), fromTags.end(), intoTag);
-				if(iterFind == fromTags.end())
+				if (iterFind == fromTags.end())
 				{
-					matches = false;
+					tagsMatch = false;
 					break;
 				}
 			}
+
+			if (!tagsMatch)
+			{
+				bool fromMatchAnyTags = false;
+				auto iterFind = std::find(fromTags.begin(), fromTags.end(), AnyTag);
+				if (iterFind != fromTags.end())
+					fromMatchAnyTags = true;
+
+				if (!fromMatchAnyTags)
+					matches = false;
+			}
 		}
 
 		if (matches)
 		{
+			bool tagsMatch = true;
 			for (auto& fromTag : fromTags)
 			{
 				auto iterFind = std::find(intoTags.begin(), intoTags.end(), fromTag);
 				if (iterFind == intoTags.end())
 				{
-					matches = false;
+					tagsMatch = false;
 					break;
 				}
 			}
+
+			if(!tagsMatch)
+			{
+				bool intoMatchAnyTags = false;
+				auto iterFind = std::find(intoTags.begin(), intoTags.end(), AnyTag);
+				if (iterFind != intoTags.end())
+					intoMatchAnyTags = true;
+
+				if (intoMatchAnyTags)
+					isMoreSpecific = true;
+				else
+					matches = false;
+			}
 		}
 
 		return matches;
@@ -1300,20 +1345,47 @@ namespace BansheeEngine
 				break;
 			case OT_Technique:
 			{
-				auto iterFind = std::find_if(techniqueData.begin(), techniqueData.end(), 
-					[&] (auto x)
+				TechniqueData* data = nullptr;
+
+				// Look for matching techniques, prefer those that aren't includes (i.e. look for more specific ones first)
+				bool isInclude = true;
+				bool isMoreSpecific = false;
+				for(auto& entry : techniqueData)
 				{
-					return doTechniquesMatch(x.first, option->value.nodePtr);
-				});
+					if (!isInclude && entry.second.include)
+						continue;
 
-				TechniqueData* data = nullptr;
-				if (iterFind != techniqueData.end())
-					data = &iterFind->second;
-				else
+					bool moreSpecific;
+					if(doTechniquesMatch(entry.first, option->value.nodePtr, moreSpecific))
+					{
+						isInclude = entry.second.include;
+						data = &entry.second;
+						isMoreSpecific = moreSpecific;
+					}
+				}
+
+				// Technique to merge with not found, create new technique
+				if(data == nullptr)
 				{
 					techniqueData.push_back(std::make_pair(option->value.nodePtr, TechniqueData()));
 					data = &techniqueData.back().second;
 				}
+				else
+				{
+					// Found technique that's identical or more general to this one, so just append the data to the existing
+					// technique
+					if(!isMoreSpecific)
+					{
+						// Do nothing
+					}
+					else // Found technique that's more specific, clone the technique data and append to the clone
+					{
+						data->include = true;
+
+						techniqueData.push_back(std::make_pair(option->value.nodePtr, *data));
+						data = &techniqueData.back().second;
+					}
+				}
 
 				parseTechnique(option->value.nodePtr, codeBlocks, *data);
 				break;
@@ -1333,6 +1405,8 @@ namespace BansheeEngine
 		for(auto& entry : techniqueData)
 		{
 			const TechniqueData& techniqueData = entry.second;
+			if (techniqueData.include)
+				continue;
 
 			Map<UINT32, SPtr<Pass>, std::greater<UINT32>> passes;
 			for (auto& passData : entry.second.passes)