Przeglądaj źródła

Added visibility field to shader parameters so internal parameters can be hidden in the inspector
Resource/GameObject fields will no longer trigger value changed events if the change was initiated externally
Various visual improvements to Material inspector
Fixed a size issue with composite GUI field elements
Fixed a crash with drop down menus
Managed localized strings no longer implicitly convert to normal strings in order to avoid errors
Reimporting builtin assets will now persist their GUIDs

BearishSun 10 lat temu
rodzic
commit
6c5fee53e3

+ 5 - 0
BansheeCore/Include/BsImporter.h

@@ -96,4 +96,9 @@ namespace BansheeEngine
 
 
 		SpecificImporter* getImporterForFile(const Path& inputFilePath) const;
 		SpecificImporter* getImporterForFile(const Path& inputFilePath) const;
 	};
 	};
+
+	/**
+	 * @brief	Provides global access to the importer.
+	 */
+	BS_CORE_EXPORT Importer& gImporter();
 }
 }

+ 5 - 0
BansheeCore/Source/BsImporter.cpp

@@ -152,4 +152,9 @@ namespace BansheeEngine
 
 
 		return nullptr;
 		return nullptr;
 	}
 	}
+
+	BS_CORE_EXPORT Importer& gImporter()
+	{
+		return Importer::instance();
+	}
 }
 }

+ 1 - 1
BansheeCore/Source/BsResources.cpp

@@ -115,7 +115,7 @@ namespace BansheeEngine
 
 
 		if(!FileSystem::isFile(filePath))
 		if(!FileSystem::isFile(filePath))
 		{
 		{
-			gDebug().logWarning("Specified file: " + filePath.toString() + " doesn't exist.");
+			LOGWRN("Specified file: " + filePath.toString() + " doesn't exist.");
 
 
 			loadComplete(outputResource);
 			loadComplete(outputResource);
 			return outputResource;
 			return outputResource;

+ 5 - 9
BansheeEditor/Source/BsBuiltinEditorResources.cpp

@@ -357,10 +357,6 @@ namespace BansheeEngine
 
 
 	void BuiltinEditorResources::preprocess()
 	void BuiltinEditorResources::preprocess()
 	{
 	{
-		FileSystem::remove(EditorShaderIncludeFolder);
-		FileSystem::remove(EditorShaderFolder);
-		FileSystem::remove(EditorSkinFolder);
-
 		BuiltinResourcesHelper::importAssets(EditorRawShaderIncludeFolder, EditorShaderIncludeFolder, mResourceManifest); // Hidden dependency: Includes must be imported before shaders
 		BuiltinResourcesHelper::importAssets(EditorRawShaderIncludeFolder, EditorShaderIncludeFolder, mResourceManifest); // Hidden dependency: Includes must be imported before shaders
 		BuiltinResourcesHelper::importAssets(EditorRawShaderFolder, EditorShaderFolder, mResourceManifest);
 		BuiltinResourcesHelper::importAssets(EditorRawShaderFolder, EditorShaderFolder, mResourceManifest);
 		BuiltinResourcesHelper::importAssets(EditorRawSkinFolder, EditorSkinFolder, mResourceManifest);
 		BuiltinResourcesHelper::importAssets(EditorRawSkinFolder, EditorSkinFolder, mResourceManifest);
@@ -1358,7 +1354,7 @@ namespace BansheeEngine
 
 
 		GUIElementStyle editorVector2FieldStyle;
 		GUIElementStyle editorVector2FieldStyle;
 		editorVector2FieldStyle.fixedHeight = true;
 		editorVector2FieldStyle.fixedHeight = true;
-		editorVector2FieldStyle.height = 21;
+		editorVector2FieldStyle.height = 35;
 		editorVector2FieldStyle.minWidth = 30;
 		editorVector2FieldStyle.minWidth = 30;
 		editorVector2FieldStyle.subStyles[GUIVector2Field::getLabelStyleType()] = GUITextField::getLabelStyleType();
 		editorVector2FieldStyle.subStyles[GUIVector2Field::getLabelStyleType()] = GUITextField::getLabelStyleType();
 		editorVector2FieldStyle.subStyles[GUIVector2Field::getFloatFieldStyleType()] = GUIFloatField::getGUITypeName();
 		editorVector2FieldStyle.subStyles[GUIVector2Field::getFloatFieldStyleType()] = GUIFloatField::getGUITypeName();
@@ -1367,7 +1363,7 @@ namespace BansheeEngine
 
 
 		GUIElementStyle editorVector3FieldStyle;
 		GUIElementStyle editorVector3FieldStyle;
 		editorVector3FieldStyle.fixedHeight = true;
 		editorVector3FieldStyle.fixedHeight = true;
-		editorVector3FieldStyle.height = 21;
+		editorVector3FieldStyle.height = 35;
 		editorVector3FieldStyle.minWidth = 30;
 		editorVector3FieldStyle.minWidth = 30;
 		editorVector3FieldStyle.subStyles[GUIVector3Field::getLabelStyleType()] = GUITextField::getLabelStyleType();
 		editorVector3FieldStyle.subStyles[GUIVector3Field::getLabelStyleType()] = GUITextField::getLabelStyleType();
 		editorVector3FieldStyle.subStyles[GUIVector3Field::getFloatFieldStyleType()] = GUIFloatField::getGUITypeName();
 		editorVector3FieldStyle.subStyles[GUIVector3Field::getFloatFieldStyleType()] = GUIFloatField::getGUITypeName();
@@ -1376,7 +1372,7 @@ namespace BansheeEngine
 
 
 		GUIElementStyle editorVector4FieldStyle;
 		GUIElementStyle editorVector4FieldStyle;
 		editorVector4FieldStyle.fixedHeight = true;
 		editorVector4FieldStyle.fixedHeight = true;
-		editorVector4FieldStyle.height = 21;
+		editorVector4FieldStyle.height = 35;
 		editorVector4FieldStyle.minWidth = 30;
 		editorVector4FieldStyle.minWidth = 30;
 		editorVector4FieldStyle.subStyles[GUIVector4Field::getLabelStyleType()] = GUITextField::getLabelStyleType();
 		editorVector4FieldStyle.subStyles[GUIVector4Field::getLabelStyleType()] = GUITextField::getLabelStyleType();
 		editorVector4FieldStyle.subStyles[GUIVector4Field::getFloatFieldStyleType()] = GUIFloatField::getGUITypeName();
 		editorVector4FieldStyle.subStyles[GUIVector4Field::getFloatFieldStyleType()] = GUIFloatField::getGUITypeName();
@@ -1385,7 +1381,7 @@ namespace BansheeEngine
 
 
 		GUIElementStyle editorListBoxFieldStyle;
 		GUIElementStyle editorListBoxFieldStyle;
 		editorListBoxFieldStyle.fixedHeight = true;
 		editorListBoxFieldStyle.fixedHeight = true;
-		editorListBoxFieldStyle.height = 21;
+		editorListBoxFieldStyle.height = 35;
 		editorListBoxFieldStyle.minWidth = 30;
 		editorListBoxFieldStyle.minWidth = 30;
 		editorListBoxFieldStyle.subStyles[GUIListBoxField::getLabelStyleType()] = GUIListBoxField::getLabelStyleType();
 		editorListBoxFieldStyle.subStyles[GUIListBoxField::getLabelStyleType()] = GUIListBoxField::getLabelStyleType();
 		editorListBoxFieldStyle.subStyles[GUIListBoxField::getListBoxStyleType()] = GUIListBox::getGUITypeName();
 		editorListBoxFieldStyle.subStyles[GUIListBoxField::getListBoxStyleType()] = GUIListBox::getGUITypeName();
@@ -1394,7 +1390,7 @@ namespace BansheeEngine
 
 
 		GUIElementStyle editorSliderFieldStyle;
 		GUIElementStyle editorSliderFieldStyle;
 		editorSliderFieldStyle.fixedHeight = true;
 		editorSliderFieldStyle.fixedHeight = true;
-		editorSliderFieldStyle.height = 21;
+		editorSliderFieldStyle.height = 35;
 		editorSliderFieldStyle.minWidth = 30;
 		editorSliderFieldStyle.minWidth = 30;
 		editorSliderFieldStyle.subStyles[GUISliderField::getLabelStyleType()] = GUISliderField::getLabelStyleType();
 		editorSliderFieldStyle.subStyles[GUISliderField::getLabelStyleType()] = GUISliderField::getLabelStyleType();
 		editorSliderFieldStyle.subStyles[GUISliderField::getInputStyleType()] = GUIInputBox::getGUITypeName();
 		editorSliderFieldStyle.subStyles[GUISliderField::getInputStyleType()] = GUIInputBox::getGUITypeName();

+ 30 - 9
BansheeEngine/Source/BsBuiltinResources.cpp

@@ -278,12 +278,6 @@ namespace BansheeEngine
 
 
 	void BuiltinResources::preprocess()
 	void BuiltinResources::preprocess()
 	{
 	{
-		FileSystem::remove(EngineCursorFolder);
-		FileSystem::remove(EngineShaderIncludeFolder);
-		FileSystem::remove(EngineShaderFolder);
-		FileSystem::remove(EngineSkinFolder);
-		FileSystem::remove(EngineMeshFolder);
-
 		BuiltinResourcesHelper::importAssets(EngineRawCursorFolder, EngineCursorFolder, mResourceManifest);
 		BuiltinResourcesHelper::importAssets(EngineRawCursorFolder, EngineCursorFolder, mResourceManifest);
 		BuiltinResourcesHelper::importAssets(EngineRawShaderIncludeFolder, EngineShaderIncludeFolder, mResourceManifest); // Hidden dependency: Includes must be imported before shaders
 		BuiltinResourcesHelper::importAssets(EngineRawShaderIncludeFolder, EngineShaderIncludeFolder, mResourceManifest); // Hidden dependency: Includes must be imported before shaders
 		BuiltinResourcesHelper::importAssets(EngineRawShaderFolder, EngineShaderFolder, mResourceManifest);
 		BuiltinResourcesHelper::importAssets(EngineRawShaderFolder, EngineShaderFolder, mResourceManifest);
@@ -950,23 +944,50 @@ namespace BansheeEngine
 		if (!FileSystem::exists(inputFolder))
 		if (!FileSystem::exists(inputFolder))
 			return;
 			return;
 
 
+		UnorderedSet<Path> outputAssets;
 		auto importResource = [&](const Path& filePath)
 		auto importResource = [&](const Path& filePath)
 		{
 		{
 			Path relativePath = filePath.getRelative(inputFolder);
 			Path relativePath = filePath.getRelative(inputFolder);
-			Path outputPath = FileSystem::getWorkingDirectoryPath() + outputFolder + relativePath;
-			outputPath.setFilename(outputPath.getWFilename() + L".asset");
+			relativePath = outputFolder + relativePath;;
+			relativePath.setFilename(relativePath.getWFilename() + L".asset");
+
+			Path outputPath = FileSystem::getWorkingDirectoryPath() + relativePath;
+
+			HResource resource;
+			if (FileSystem::exists(outputPath))
+				resource = gResources().load(outputPath);
+
+			if (resource != nullptr)
+				gImporter().reimport(resource, filePath);
+			else
+				resource = Importer::instance().import(filePath);
 
 
-			HResource resource = Importer::instance().import(filePath);
 			if (resource != nullptr)
 			if (resource != nullptr)
 			{
 			{
 				Resources::instance().save(resource, outputPath, true);
 				Resources::instance().save(resource, outputPath, true);
 				manifest->registerResource(resource.getUUID(), outputPath);
 				manifest->registerResource(resource.getUUID(), outputPath);
+
+				outputAssets.insert(relativePath);
 			}
 			}
 
 
 			return true;
 			return true;
 		};
 		};
 
 
+		Vector<Path> obsoleteAssets;
+		auto gatherObsolete = [&](const Path& filePath)
+		{
+			auto iterFind = outputAssets.find(filePath);
+			if (iterFind == outputAssets.end())
+				obsoleteAssets.push_back(filePath);
+
+			return true;
+		};
+
 		FileSystem::iterate(inputFolder, importResource);
 		FileSystem::iterate(inputFolder, importResource);
+		FileSystem::iterate(outputFolder, gatherObsolete);
+
+		for (auto& obsoleteAssetPath : obsoleteAssets)
+			FileSystem::remove(obsoleteAssetPath);
 	}
 	}
 
 
 	void BuiltinResourcesHelper::importFont(const Path& inputFile, const Path& outputFolder, 
 	void BuiltinResourcesHelper::importFont(const Path& inputFile, const Path& outputFolder, 

+ 4 - 1
BansheeEngine/Source/BsGUIDropDownContent.cpp

@@ -87,7 +87,10 @@ namespace BansheeEngine
 			[&](UINT32 idx, UINT32 visIdx)
 			[&](UINT32 idx, UINT32 visIdx)
 		{ 
 		{ 
 			setSelected(visIdx);
 			setSelected(visIdx);
-			mStates[idx] = !mStates[idx];
+
+			if (mIsToggle)
+				mStates[idx] = !mStates[idx];
+
 			mParent->elementActivated(idx, mVisibleElements[visIdx].button->_getLayoutData().area);
 			mParent->elementActivated(idx, mVisibleElements[visIdx].button->_getLayoutData().area);
 		};
 		};
 
 

+ 2 - 2
BansheeEngine/Source/BsGUIRenderTexture.cpp

@@ -27,12 +27,12 @@ namespace BansheeEngine
 
 
 	GUIRenderTexture* GUIRenderTexture::create(const RenderTexturePtr& texture, const String& styleName)
 	GUIRenderTexture* GUIRenderTexture::create(const RenderTexturePtr& texture, const String& styleName)
 	{
 	{
-		return new (bs_alloc<GUIRenderTexture>()) GUIRenderTexture(getStyleName<GUIRenderTexture>(styleName), texture, GUIDimensions::create());
+		return new (bs_alloc<GUIRenderTexture>()) GUIRenderTexture(styleName, texture, GUIDimensions::create());
 	}
 	}
 
 
 	GUIRenderTexture* GUIRenderTexture::create(const RenderTexturePtr& texture, const GUIOptions& options, const String& styleName)
 	GUIRenderTexture* GUIRenderTexture::create(const RenderTexturePtr& texture, const GUIOptions& options, const String& styleName)
 	{
 	{
-		return new (bs_alloc<GUIRenderTexture>()) GUIRenderTexture(getStyleName<GUIRenderTexture>(styleName), texture, GUIDimensions::create(options));
+		return new (bs_alloc<GUIRenderTexture>()) GUIRenderTexture(styleName, texture, GUIDimensions::create(options));
 	}
 	}
 
 
 	void GUIRenderTexture::setRenderTexture(const RenderTexturePtr& texture)
 	void GUIRenderTexture::setRenderTexture(const RenderTexturePtr& texture)

+ 3 - 3
BansheeSL/Include/BsSLImporter.h

@@ -16,12 +16,12 @@ namespace BansheeEngine
 		virtual ~SLImporter();
 		virtual ~SLImporter();
 
 
 		/** @copydoc SpecificImporter::isExtensionSupported */
 		/** @copydoc SpecificImporter::isExtensionSupported */
-		virtual bool isExtensionSupported(const WString& ext) const;
+		virtual bool isExtensionSupported(const WString& ext) const override;
 
 
 		/** @copydoc SpecificImporter::isMagicNumberSupported */
 		/** @copydoc SpecificImporter::isMagicNumberSupported */
-		virtual bool isMagicNumberSupported(const UINT8* magicNumPtr, UINT32 numBytes) const;
+		virtual bool isMagicNumberSupported(const UINT8* magicNumPtr, UINT32 numBytes) const override;
 
 
 		/** @copydoc SpecificImporter::import */
 		/** @copydoc SpecificImporter::import */
-		virtual ResourcePtr import(const Path& filePath, ConstImportOptionsPtr importOptions);
+		virtual ResourcePtr import(const Path& filePath, ConstImportOptionsPtr importOptions) override;
 	};
 	};
 }
 }

+ 63 - 57
MBansheeEditor/Inspectors/MaterialInspector.cs

@@ -20,6 +20,7 @@ namespace BansheeEditor
                 return;
                 return;
 
 
             shaderField = new GUIResourceField(typeof(Shader), new LocEdString("Shader"));
             shaderField = new GUIResourceField(typeof(Shader), new LocEdString("Shader"));
+            shaderField.Value = material.Shader;
             shaderField.OnChanged += (x) =>
             shaderField.OnChanged += (x) =>
             {
             {
                 material.Shader = x as Shader;
                 material.Shader = x as Shader;
@@ -87,32 +88,43 @@ namespace BansheeEditor
 
 
             foreach (var param in shaderParams)
             foreach (var param in shaderParams)
             {
             {
-                switch (param.type)
+                if (param.Internal)
+                    continue;
+
+                switch (param.Type)
                 {
                 {
                     case ShaderParameterType.Float:
                     case ShaderParameterType.Float:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamFloatGUI(param, mat, layout));
                         guiParams.Add(new MaterialParamFloatGUI(param, mat, layout));
                         break;
                         break;
                     case ShaderParameterType.Vector2:
                     case ShaderParameterType.Vector2:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamVec2GUI(param, mat, layout));
                         guiParams.Add(new MaterialParamVec2GUI(param, mat, layout));
                         break;
                         break;
                     case ShaderParameterType.Vector3:
                     case ShaderParameterType.Vector3:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamVec3GUI(param, mat, layout));
                         guiParams.Add(new MaterialParamVec3GUI(param, mat, layout));
                         break;
                         break;
                     case ShaderParameterType.Vector4:
                     case ShaderParameterType.Vector4:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamVec4GUI(param, mat, layout));
                         guiParams.Add(new MaterialParamVec4GUI(param, mat, layout));
                         break;
                         break;
                     case ShaderParameterType.Matrix3:
                     case ShaderParameterType.Matrix3:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamMat3GUI(param, mat, layout));
                         guiParams.Add(new MaterialParamMat3GUI(param, mat, layout));
                         break;
                         break;
                     case ShaderParameterType.Matrix4:
                     case ShaderParameterType.Matrix4:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamMat4GUI(param, mat, layout));
                         guiParams.Add(new MaterialParamMat4GUI(param, mat, layout));
                         break;
                         break;
                     case ShaderParameterType.Color:
                     case ShaderParameterType.Color:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamColorGUI(param, mat, layout));
                         guiParams.Add(new MaterialParamColorGUI(param, mat, layout));
                         break;
                         break;
                     case ShaderParameterType.Texture2D:
                     case ShaderParameterType.Texture2D:
                     case ShaderParameterType.Texture3D:
                     case ShaderParameterType.Texture3D:
                     case ShaderParameterType.TextureCube:
                     case ShaderParameterType.TextureCube:
+                        layout.AddSpace(5);
                         guiParams.Add(new MaterialParamTextureGUI(param, mat, layout));
                         guiParams.Add(new MaterialParamTextureGUI(param, mat, layout));
                         break;
                         break;
                 }
                 }
@@ -166,11 +178,11 @@ namespace BansheeEditor
         internal MaterialParamFloatGUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamFloatGUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             guiElem = new GUIFloatField(title);
             guiElem = new GUIFloatField(title);
             guiElem.OnChanged += (x) =>
             guiElem.OnChanged += (x) =>
             {
             {
-                material.SetFloat(shaderParam.name, x);
+                material.SetFloat(shaderParam.Name, x);
                 EditorApplication.SetDirty(material);
                 EditorApplication.SetDirty(material);
             };
             };
 
 
@@ -180,7 +192,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
-            guiElem.Value = material.GetFloat(shaderParam.name);
+            guiElem.Value = material.GetFloat(shaderParam.Name);
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
@@ -206,11 +218,11 @@ namespace BansheeEditor
         internal MaterialParamVec2GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamVec2GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             guiElem = new GUIVector2Field(title);
             guiElem = new GUIVector2Field(title);
             guiElem.OnChanged += (x) =>
             guiElem.OnChanged += (x) =>
             {
             {
-                material.SetVector2(shaderParam.name, x);
+                material.SetVector2(shaderParam.Name, x);
                 EditorApplication.SetDirty(material);
                 EditorApplication.SetDirty(material);
             };
             };
 
 
@@ -220,7 +232,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
-            guiElem.Value = material.GetVector2(shaderParam.name);
+            guiElem.Value = material.GetVector2(shaderParam.Name);
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
@@ -246,11 +258,11 @@ namespace BansheeEditor
         internal MaterialParamVec3GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamVec3GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             guiElem = new GUIVector3Field(title);
             guiElem = new GUIVector3Field(title);
             guiElem.OnChanged += (x) =>
             guiElem.OnChanged += (x) =>
             {
             {
-                material.SetVector3(shaderParam.name, x);
+                material.SetVector3(shaderParam.Name, x);
                 EditorApplication.SetDirty(material);
                 EditorApplication.SetDirty(material);
             };
             };
 
 
@@ -260,7 +272,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
-            guiElem.Value = material.GetVector3(shaderParam.name);
+            guiElem.Value = material.GetVector3(shaderParam.Name);
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
@@ -286,11 +298,11 @@ namespace BansheeEditor
         internal MaterialParamVec4GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamVec4GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             guiElem = new GUIVector4Field(title);
             guiElem = new GUIVector4Field(title);
             guiElem.OnChanged += (x) =>
             guiElem.OnChanged += (x) =>
             {
             {
-                material.SetVector4(shaderParam.name, x);
+                material.SetVector4(shaderParam.Name, x);
                 EditorApplication.SetDirty(material);
                 EditorApplication.SetDirty(material);
             };
             };
 
 
@@ -300,7 +312,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
-            guiElem.Value = material.GetVector4(shaderParam.name);
+            guiElem.Value = material.GetVector4(shaderParam.Name);
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
@@ -317,6 +329,7 @@ namespace BansheeEditor
     {
     {
         private const int MAT_SIZE = 3;
         private const int MAT_SIZE = 3;
 
 
+        private GUILayout mainLayout;
         private GUIFloatField[] guiMatFields = new GUIFloatField[MAT_SIZE * MAT_SIZE];
         private GUIFloatField[] guiMatFields = new GUIFloatField[MAT_SIZE * MAT_SIZE];
 
 
         /// <summary>
         /// <summary>
@@ -328,16 +341,18 @@ namespace BansheeEditor
         internal MaterialParamMat3GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamMat3GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             GUILabel guiTitle = new GUILabel(title, GUIOption.FixedWidth(100));
             GUILabel guiTitle = new GUILabel(title, GUIOption.FixedWidth(100));
 
 
-            GUILayout mainLayout = layout.AddLayoutX();
-            mainLayout.AddElement(guiTitle);
+            mainLayout = layout.AddLayoutY();
+            GUILayoutX titleLayout = mainLayout.AddLayoutX();
+            titleLayout.AddElement(guiTitle);
+            titleLayout.AddFlexibleSpace();
 
 
             GUILayoutY contentLayout = mainLayout.AddLayoutY();
             GUILayoutY contentLayout = mainLayout.AddLayoutY();
 
 
             GUILayoutX[] rows = new GUILayoutX[MAT_SIZE];
             GUILayoutX[] rows = new GUILayoutX[MAT_SIZE];
-            for (int i = 0; i < MAT_SIZE; i++)
+            for (int i = 0; i < rows.Length; i++)
                 rows[i] = contentLayout.AddLayoutX();
                 rows[i] = contentLayout.AddLayoutX();
 
 
             for (int row = 0; row < MAT_SIZE; row++)
             for (int row = 0; row < MAT_SIZE; row++)
@@ -345,18 +360,19 @@ namespace BansheeEditor
                 for (int col = 0; col < MAT_SIZE; col++)
                 for (int col = 0; col < MAT_SIZE; col++)
                 {
                 {
                     int index = row * MAT_SIZE + col;
                     int index = row * MAT_SIZE + col;
-                    guiMatFields[index] = new GUIFloatField(row + ", " + col, 30);
+                    guiMatFields[index] = new GUIFloatField(row + "," + col, 20, "", GUIOption.FixedWidth(80));
 
 
                     GUIFloatField field = guiMatFields[index];
                     GUIFloatField field = guiMatFields[index];
                     rows[row].AddElement(field);
                     rows[row].AddElement(field);
+                    rows[row].AddSpace(5);
 
 
                     int hoistedRow = row;
                     int hoistedRow = row;
                     int hoistedCol = col;
                     int hoistedCol = col;
                     field.OnChanged += (x) =>
                     field.OnChanged += (x) =>
                     {
                     {
-                        Matrix3 value = material.GetMatrix3(shaderParam.name);
+                        Matrix3 value = material.GetMatrix3(shaderParam.Name);
                         value[hoistedRow, hoistedCol] = x;
                         value[hoistedRow, hoistedCol] = x;
-                        material.SetMatrix3(shaderParam.name, value);
+                        material.SetMatrix3(shaderParam.Name, value);
                         EditorApplication.SetDirty(material);
                         EditorApplication.SetDirty(material);
                     };
                     };
                 }
                 }
@@ -366,7 +382,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
-            Matrix3 value = material.GetMatrix3(shaderParam.name);
+            Matrix3 value = material.GetMatrix3(shaderParam.Name);
 
 
             for (int row = 0; row < MAT_SIZE; row++)
             for (int row = 0; row < MAT_SIZE; row++)
             {
             {
@@ -381,14 +397,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Destroy()
         internal override void Destroy()
         {
         {
-            for (int row = 0; row < MAT_SIZE; row++)
-            {
-                for (int col = 0; col < MAT_SIZE; col++)
-                {
-                    int index = row*MAT_SIZE + col;
-                    guiMatFields[index].Destroy();
-                }
-            }
+            mainLayout.Destroy();
         }
         }
     }
     }
 
 
@@ -399,6 +408,7 @@ namespace BansheeEditor
     {
     {
         private const int MAT_SIZE = 4;
         private const int MAT_SIZE = 4;
 
 
+        private GUILayout mainLayout;
         private GUIFloatField[] guiMatFields = new GUIFloatField[MAT_SIZE * MAT_SIZE];
         private GUIFloatField[] guiMatFields = new GUIFloatField[MAT_SIZE * MAT_SIZE];
 
 
         /// <summary>
         /// <summary>
@@ -410,16 +420,18 @@ namespace BansheeEditor
         internal MaterialParamMat4GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamMat4GUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             GUILabel guiTitle = new GUILabel(title, GUIOption.FixedWidth(100));
             GUILabel guiTitle = new GUILabel(title, GUIOption.FixedWidth(100));
 
 
-            GUILayout mainLayout = layout.AddLayoutX();
-            mainLayout.AddElement(guiTitle);
+            mainLayout = layout.AddLayoutY();
+            GUILayoutX titleLayout = mainLayout.AddLayoutX();
+            titleLayout.AddElement(guiTitle);
+            titleLayout.AddFlexibleSpace();
 
 
             GUILayoutY contentLayout = mainLayout.AddLayoutY();
             GUILayoutY contentLayout = mainLayout.AddLayoutY();
 
 
             GUILayoutX[] rows = new GUILayoutX[MAT_SIZE];
             GUILayoutX[] rows = new GUILayoutX[MAT_SIZE];
-            for (int i = 0; i < MAT_SIZE; i++)
+            for (int i = 0; i < rows.Length; i++)
                 rows[i] = contentLayout.AddLayoutX();
                 rows[i] = contentLayout.AddLayoutX();
 
 
             for (int row = 0; row < MAT_SIZE; row++)
             for (int row = 0; row < MAT_SIZE; row++)
@@ -427,18 +439,19 @@ namespace BansheeEditor
                 for (int col = 0; col < MAT_SIZE; col++)
                 for (int col = 0; col < MAT_SIZE; col++)
                 {
                 {
                     int index = row * MAT_SIZE + col;
                     int index = row * MAT_SIZE + col;
-                    guiMatFields[index] = new GUIFloatField(row + ", " + col, 30);
+                    guiMatFields[index] = new GUIFloatField(row + "," + col, 20, "", GUIOption.FixedWidth(80));
 
 
                     GUIFloatField field = guiMatFields[index];
                     GUIFloatField field = guiMatFields[index];
                     rows[row].AddElement(field);
                     rows[row].AddElement(field);
+                    rows[row].AddSpace(5);
 
 
                     int hoistedRow = row;
                     int hoistedRow = row;
                     int hoistedCol = col;
                     int hoistedCol = col;
                     field.OnChanged += (x) =>
                     field.OnChanged += (x) =>
                     {
                     {
-                        Matrix4 value = material.GetMatrix4(shaderParam.name);
+                        Matrix4 value = material.GetMatrix4(shaderParam.Name);
                         value[hoistedRow, hoistedCol] = x;
                         value[hoistedRow, hoistedCol] = x;
-                        material.SetMatrix4(shaderParam.name, value);
+                        material.SetMatrix4(shaderParam.Name, value);
                         EditorApplication.SetDirty(material);
                         EditorApplication.SetDirty(material);
                     };
                     };
                 }
                 }
@@ -448,7 +461,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
-            Matrix4 value = material.GetMatrix4(shaderParam.name);
+            Matrix4 value = material.GetMatrix4(shaderParam.Name);
 
 
             for (int row = 0; row < MAT_SIZE; row++)
             for (int row = 0; row < MAT_SIZE; row++)
             {
             {
@@ -463,14 +476,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Destroy()
         internal override void Destroy()
         {
         {
-            for (int row = 0; row < MAT_SIZE; row++)
-            {
-                for (int col = 0; col < MAT_SIZE; col++)
-                {
-                    int index = row * MAT_SIZE + col;
-                    guiMatFields[index].Destroy();
-                }
-            }
+            mainLayout.Destroy();
         }
         }
     }
     }
 
 
@@ -490,11 +496,11 @@ namespace BansheeEditor
         internal MaterialParamColorGUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamColorGUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             guiElem = new GUIColorField(title);
             guiElem = new GUIColorField(title);
             guiElem.OnChanged += (x) =>
             guiElem.OnChanged += (x) =>
             {
             {
-                material.SetColor(shaderParam.name, x);
+                material.SetColor(shaderParam.Name, x);
                 EditorApplication.SetDirty(material);
                 EditorApplication.SetDirty(material);
             };
             };
 
 
@@ -504,7 +510,7 @@ namespace BansheeEditor
         /// <inheritdoc/>
         /// <inheritdoc/>
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
-            guiElem.Value = material.GetColor(shaderParam.name);
+            guiElem.Value = material.GetColor(shaderParam.Name);
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
@@ -530,29 +536,29 @@ namespace BansheeEditor
         internal MaterialParamTextureGUI(ShaderParameter shaderParam, Material material, GUILayout layout)
         internal MaterialParamTextureGUI(ShaderParameter shaderParam, Material material, GUILayout layout)
             : base(shaderParam)
             : base(shaderParam)
         {
         {
-            LocString title = new LocEdString(shaderParam.name);
+            LocString title = new LocEdString(shaderParam.Name);
             guiElem = new GUITextureField(title);
             guiElem = new GUITextureField(title);
 
 
-            switch (shaderParam.type)
+            switch (shaderParam.Type)
             {
             {
                 case ShaderParameterType.Texture2D:
                 case ShaderParameterType.Texture2D:
                     guiElem.OnChanged += (x) =>
                     guiElem.OnChanged += (x) =>
                     {
                     {
-                        material.SetTexture2D(shaderParam.name, x as Texture2D);
+                        material.SetTexture2D(shaderParam.Name, x as Texture2D);
                         EditorApplication.SetDirty(material);
                         EditorApplication.SetDirty(material);
                     };
                     };
                     break;
                     break;
                 case ShaderParameterType.Texture3D:
                 case ShaderParameterType.Texture3D:
                     guiElem.OnChanged += (x) =>
                     guiElem.OnChanged += (x) =>
                     {
                     {
-                        material.SetTexture3D(shaderParam.name, x as Texture3D);
+                        material.SetTexture3D(shaderParam.Name, x as Texture3D);
                         EditorApplication.SetDirty(material);
                         EditorApplication.SetDirty(material);
                     };
                     };
                     break;
                     break;
                 case ShaderParameterType.TextureCube:
                 case ShaderParameterType.TextureCube:
                     guiElem.OnChanged += (x) =>
                     guiElem.OnChanged += (x) =>
                     {
                     {
-                        material.SetTextureCube(shaderParam.name, x as TextureCube);
+                        material.SetTextureCube(shaderParam.Name, x as TextureCube);
                         EditorApplication.SetDirty(material);
                         EditorApplication.SetDirty(material);
                     };
                     };
                     break;
                     break;
@@ -565,16 +571,16 @@ namespace BansheeEditor
         internal override void Refresh(Material material)
         internal override void Refresh(Material material)
         {
         {
             Texture value = null;
             Texture value = null;
-            switch (shaderParam.type)
+            switch (shaderParam.Type)
             {
             {
                 case ShaderParameterType.Texture2D:
                 case ShaderParameterType.Texture2D:
-                    value = material.GetTexture2D(shaderParam.name);
+                    value = material.GetTexture2D(shaderParam.Name);
                     break;
                     break;
                 case ShaderParameterType.Texture3D:
                 case ShaderParameterType.Texture3D:
-                    value = material.GetTexture3D(shaderParam.name);
+                    value = material.GetTexture3D(shaderParam.Name);
                     break;
                     break;
                 case ShaderParameterType.TextureCube:
                 case ShaderParameterType.TextureCube:
-                    value = material.GetTextureCube(shaderParam.name);
+                    value = material.GetTextureCube(shaderParam.Name);
                     break;
                     break;
             }
             }
 
 

+ 1 - 1
MBansheeEditor/Inspectors/SpriteTextureInspector.cs

@@ -9,7 +9,7 @@ namespace BansheeEditor
     [CustomInspector(typeof(SpriteTexture))]
     [CustomInspector(typeof(SpriteTexture))]
     internal class SpriteTextureInspector : Inspector
     internal class SpriteTextureInspector : Inspector
     {
     {
-        private GUITextureField textureField = new GUITextureField(new LocEdString("Texture"));
+        private GUITextureField textureField = new GUITextureField(new LocEdString("Atlas"));
         private GUIVector2Field offsetField = new GUIVector2Field(new LocEdString("Offset"));
         private GUIVector2Field offsetField = new GUIVector2Field(new LocEdString("Offset"));
         private GUIVector2Field scaleField = new GUIVector2Field(new LocEdString("Scale"));
         private GUIVector2Field scaleField = new GUIVector2Field(new LocEdString("Scale"));
 
 

+ 1 - 1
MBansheeEngine/LocString.cs

@@ -51,7 +51,7 @@ namespace BansheeEngine
         /// </summary>
         /// </summary>
         /// <param name="text">Localized string to retrieve the text from.</param>
         /// <param name="text">Localized string to retrieve the text from.</param>
         /// <returns>Translated text for the currently active language.</returns>
         /// <returns>Translated text for the currently active language.</returns>
-        public static implicit operator string(LocString text)
+        public static explicit operator string(LocString text)
         {
         {
             string value;
             string value;
             Internal_GetValue(text.mCachedPtr, out value);
             Internal_GetValue(text.mCachedPtr, out value);

+ 30 - 9
MBansheeEngine/Shader.cs

@@ -18,19 +18,38 @@ namespace BansheeEngine
     /// </summary>
     /// </summary>
     public struct ShaderParameter
     public struct ShaderParameter
     {
     {
+        /// <summary>
+        /// Returns the name of the parameter variable.
+        /// </summary>
+        public string Name { get { return name; } }
+
+        /// <summary>
+        /// Returns the data type of the parameter.
+        /// </summary>
+        public ShaderParameterType Type { get { return type; } }
+
+        /// <summary>
+        /// Determines is parameter managed internally be the renderer, or is it expected to be set by the user.
+        /// </summary>
+        public bool Internal { get { return isInternal; } }
+
+        private string name;
+        private ShaderParameterType type;
+        private bool isInternal;
+
         /// <summary>
         /// <summary>
         /// Creates a new shader parameter.
         /// Creates a new shader parameter.
         /// </summary>
         /// </summary>
-        /// <param name="name">Name of the parameter.</param>
-        /// <param name="type">Type of the parameter.</param>
-        internal ShaderParameter(string name, ShaderParameterType type)
+        /// <param name="name">Name of the parameter variable.</param>
+        /// <param name="type">Data type of the parameter.</param>
+        /// <param name="isInternal">Determines is parameter managed internally be the renderer, or is expected to be set 
+        ///                          by the user.</param>
+        internal ShaderParameter(string name, ShaderParameterType type, bool isInternal)
         {
         {
             this.name = name;
             this.name = name;
             this.type = type;
             this.type = type;
+            this.isInternal = isInternal;
         }
         }
-
-        public string name;
-        public ShaderParameterType type;
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -54,13 +73,14 @@ namespace BansheeEngine
             {
             {
                 string[] names;
                 string[] names;
                 ShaderParameterType[] types;
                 ShaderParameterType[] types;
+                bool[] visibility;
 
 
-                Internal_GetShaderParameters(mCachedPtr, out names, out types);
+                Internal_GetShaderParameters(mCachedPtr, out names, out types, out visibility);
 
 
                 ShaderParameter[] parameters = new ShaderParameter[names.Length];
                 ShaderParameter[] parameters = new ShaderParameter[names.Length];
                 for (int i = 0; i < names.Length; i++)
                 for (int i = 0; i < names.Length; i++)
                 {
                 {
-                    parameters[i] = new ShaderParameter(names[i], types[i]);
+                    parameters[i] = new ShaderParameter(names[i], types[i], visibility[i]);
                 }
                 }
 
 
                 return parameters;
                 return parameters;
@@ -68,6 +88,7 @@ namespace BansheeEngine
         }
         }
 
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_GetShaderParameters(IntPtr nativeInstance, out string[] names, out ShaderParameterType[] types);
+        private static extern void Internal_GetShaderParameters(IntPtr nativeInstance, out string[] names,
+            out ShaderParameterType[] types, out bool[] visibility);
     }
     }
 }
 }

+ 9 - 0
SBansheeEditor/Include/BsGUIGameObjectField.h

@@ -194,6 +194,15 @@ namespace BansheeEngine
 	private:
 	private:
 		virtual ~GUIGameObjectField();
 		virtual ~GUIGameObjectField();
 
 
+		/**
+		 * @brief	Sets the game object referenced by the field.
+		 * 			
+		 * @param	value			Game object to reference.
+		 * @param	triggerEvent	Determines should the ::onValueChanged event be triggered if the new object is different 
+		 * 							from the previous one.
+		 */
+		void setValue(const HGameObject& value, bool triggerEvent);
+
 		/**
 		/**
 		 * @copydoc	GUIElement::styleUpdated
 		 * @copydoc	GUIElement::styleUpdated
 		 */
 		 */

+ 5 - 1
SBansheeEditor/Include/BsGUIResourceField.h

@@ -204,8 +204,12 @@ namespace BansheeEngine
 		/**
 		/**
 		 * @brief	Sets the resource referenced by the field by finding
 		 * @brief	Sets the resource referenced by the field by finding
 		 *			the resource with the provided UUID.
 		 *			the resource with the provided UUID.
+		 *			
+		 * @param	uuid			Unique resource identifier of the resource to show, or empty string if no resource.
+		 * @param	triggerEvent	Determines should the ::onValueChanged event be triggered if the new UUID is different 
+		 * 							from the previous one.
 		 */
 		 */
-		void setUUID(const String& uuid);
+		void setUUID(const String& uuid, bool triggerEvent = true);
 
 
 		/**
 		/**
 		 * @copydoc	GUIElement::styleUpdated
 		 * @copydoc	GUIElement::styleUpdated

+ 10 - 6
SBansheeEditor/Include/BsGUITextureField.h

@@ -159,12 +159,6 @@ namespace BansheeEngine
 		 */
 		 */
 		String getUUID() const { return mUUID; }
 		String getUUID() const { return mUUID; }
 
 
-		/**
-		 * @brief	Sets the texture referenced by the field by finding
-		 *			the texture with the provided UUID.
-		 */
-		void setUUID(const String& uuid);
-
 		/**
 		/**
 		 * @copydoc	GUIElement::setTint
 		 * @copydoc	GUIElement::setTint
 		 */
 		 */
@@ -193,6 +187,16 @@ namespace BansheeEngine
 		 */
 		 */
 		void styleUpdated() override;
 		void styleUpdated() override;
 
 
+		/**
+		 * @brief	Sets the texture referenced by the field by finding
+		 *			the texture with the provided UUID.
+		 *			
+		 * @param	uuid			Unique resource identifier of the texture to show, or empty string if no texture.
+		 * @param	triggerEvent	Determines should the ::onValueChanged event be triggered if the new UUID is different 
+		 * 							from the previous one.
+		 */
+		void setUUID(const String& uuid, bool triggerEvent = true);
+
 		/**
 		/**
 		 * @brief	Triggered when a drag and drop operation finishes over this element.
 		 * @brief	Triggered when a drag and drop operation finishes over this element.
 		 */
 		 */

+ 11 - 5
SBansheeEditor/Source/BsGUIGameObjectField.cpp

@@ -173,7 +173,12 @@ namespace BansheeEngine
 
 
 	void GUIGameObjectField::setValue(const HGameObject& value)
 	void GUIGameObjectField::setValue(const HGameObject& value)
 	{
 	{
-		if(value)
+		setValue(value, false);
+	}
+
+	void GUIGameObjectField::setValue(const HGameObject& value, bool triggerEvent)
+	{
+		if (value)
 		{
 		{
 			if (mInstanceId == value.getInstanceId())
 			if (mInstanceId == value.getInstanceId())
 				return;
 				return;
@@ -190,7 +195,8 @@ namespace BansheeEngine
 			mDropButton->setContent(GUIContent(HString(L"None (" + toWString(mType) + L")")));
 			mDropButton->setContent(GUIContent(HString(L"None (" + toWString(mType) + L")")));
 		}
 		}
 
 
-		onValueChanged(value);
+		if (triggerEvent)
+			onValueChanged(value);
 	}
 	}
 
 
 	void GUIGameObjectField::setTint(const Color& color)
 	void GUIGameObjectField::setTint(const Color& color)
@@ -247,7 +253,7 @@ namespace BansheeEngine
 
 
 		if (mType == sceneObjectClass->getFullName()) // A scene object
 		if (mType == sceneObjectClass->getFullName()) // A scene object
 		{
 		{
-			setValue(draggedSceneObjects->objects[0]);
+			setValue(draggedSceneObjects->objects[0], true);
 		}
 		}
 		else // A component
 		else // A component
 		{
 		{
@@ -269,7 +275,7 @@ namespace BansheeEngine
 						{
 						{
 							if (providedClass->isSubClassOf(acceptedClass))
 							if (providedClass->isSubClassOf(acceptedClass))
 							{
 							{
-								setValue(managedComponent);
+								setValue(managedComponent, true);
 							}
 							}
 						}
 						}
 					}
 					}
@@ -289,7 +295,7 @@ namespace BansheeEngine
 
 
 	void GUIGameObjectField::onClearButtonClicked()
 	void GUIGameObjectField::onClearButtonClicked()
 	{
 	{
-		setValue(HGameObject());
+		setValue(HGameObject(), true);
 	}
 	}
 
 
 	const String& GUIGameObjectField::getGUITypeName()
 	const String& GUIGameObjectField::getGUITypeName()

+ 6 - 7
SBansheeEditor/Source/BsGUIResourceField.cpp

@@ -190,7 +190,7 @@ namespace BansheeEngine
 		{
 		{
 			Path resPath = gProjectLibrary().uuidToPath(value.getUUID());
 			Path resPath = gProjectLibrary().uuidToPath(value.getUUID());
 			if (!resPath.isEmpty())
 			if (!resPath.isEmpty())
-				setUUID(value.getUUID());
+				setUUID(value.getUUID(), false);
 			else // A non-project library resource
 			else // A non-project library resource
 			{
 			{
 				if (mUUID == value.getUUID())
 				if (mUUID == value.getUUID())
@@ -200,15 +200,13 @@ namespace BansheeEngine
 
 
 				WString title = value->getName() + L" (" + toWString(mType) + L")";
 				WString title = value->getName() + L" (" + toWString(mType) + L")";
 				mDropButton->setContent(GUIContent(HEString(title)));
 				mDropButton->setContent(GUIContent(HEString(title)));
-
-				onValueChanged(mUUID);
 			}
 			}
 		}
 		}
 		else
 		else
-			setUUID("");
+			setUUID("", false);
 	}
 	}
 
 
-	void GUIResourceField::setUUID(const String& uuid)
+	void GUIResourceField::setUUID(const String& uuid, bool triggerEvent)
 	{ 
 	{ 
 		if (mUUID == uuid)
 		if (mUUID == uuid)
 			return;
 			return;
@@ -224,7 +222,8 @@ namespace BansheeEngine
 		else
 		else
 			mDropButton->setContent(GUIContent(HEString(L"None (" + toWString(mType) + L")")));
 			mDropButton->setContent(GUIContent(HEString(L"None (" + toWString(mType) + L")")));
 
 
-		onValueChanged(mUUID);
+		if (triggerEvent)
+			onValueChanged(mUUID);
 	}
 	}
 
 
 	void GUIResourceField::setTint(const Color& color)
 	void GUIResourceField::setTint(const Color& color)
@@ -416,7 +415,7 @@ namespace BansheeEngine
 
 
 	void GUIResourceField::onClearButtonClicked()
 	void GUIResourceField::onClearButtonClicked()
 	{
 	{
-		setValue(HResource());
+		setUUID(StringUtil::BLANK);
 	}
 	}
 
 
 	const String& GUIResourceField::getGUITypeName()
 	const String& GUIResourceField::getGUITypeName()

+ 6 - 7
SBansheeEditor/Source/BsGUITextureField.cpp

@@ -54,8 +54,6 @@ namespace BansheeEngine
 
 
 		mDropButton->onDataDropped.connect(std::bind(&GUITextureField::dataDropped, this, _1));
 		mDropButton->onDataDropped.connect(std::bind(&GUITextureField::dataDropped, this, _1));
 		mDropButton->onClick.connect(std::bind(&GUITextureField::onDropButtonClicked, this));
 		mDropButton->onClick.connect(std::bind(&GUITextureField::onDropButtonClicked, this));
-
-		setValue(HTexture());
 	}
 	}
 
 
 	GUITextureField::~GUITextureField()
 	GUITextureField::~GUITextureField()
@@ -175,12 +173,12 @@ namespace BansheeEngine
 	void GUITextureField::setValue(const HTexture& value)
 	void GUITextureField::setValue(const HTexture& value)
 	{
 	{
 		if (value)
 		if (value)
-			setUUID(value.getUUID());
+			setUUID(value.getUUID(), false);
 		else
 		else
-			setUUID("");
+			setUUID("", false);
 	}
 	}
 
 
-	void GUITextureField::setUUID(const String& uuid)
+	void GUITextureField::setUUID(const String& uuid, bool triggerEvent)
 	{
 	{
 		if (mUUID == uuid)
 		if (mUUID == uuid)
 			return;
 			return;
@@ -205,7 +203,8 @@ namespace BansheeEngine
 			mClearButton->setVisible(false);
 			mClearButton->setVisible(false);
 		}
 		}
 
 
-		onValueChanged(mUUID);
+		if (triggerEvent)
+			onValueChanged(mUUID);
 	}
 	}
 
 
 	void GUITextureField::setTint(const Color& color)
 	void GUITextureField::setTint(const Color& color)
@@ -275,7 +274,7 @@ namespace BansheeEngine
 
 
 	void GUITextureField::onClearButtonClicked()
 	void GUITextureField::onClearButtonClicked()
 	{
 	{
-		setValue(HTexture());
+		setUUID(StringUtil::BLANK);
 	}
 	}
 
 
 	const String& GUITextureField::getGUITypeName()
 	const String& GUITextureField::getGUITypeName()

+ 2 - 1
SBansheeEngine/Include/BsScriptShader.h

@@ -22,6 +22,7 @@ namespace BansheeEngine
 		/************************************************************************/
 		/************************************************************************/
 		/* 								CLR HOOKS						   		*/
 		/* 								CLR HOOKS						   		*/
 		/************************************************************************/
 		/************************************************************************/
-		static void internal_GetShaderParameters(ScriptShader* nativeInstance, MonoArray** outNames, MonoArray** outTypes);
+		static void internal_GetShaderParameters(ScriptShader* nativeInstance, MonoArray** outNames, MonoArray** outTypes, 
+			MonoArray** outVisibility);
 	};
 	};
 }
 }

+ 12 - 4
SBansheeEngine/Source/BsScriptShader.cpp

@@ -29,7 +29,8 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_GetShaderParameters", &ScriptShader::internal_GetShaderParameters);
 		metaData.scriptClass->addInternalCall("Internal_GetShaderParameters", &ScriptShader::internal_GetShaderParameters);
 	}
 	}
 
 
-	void ScriptShader::internal_GetShaderParameters(ScriptShader* nativeInstance, MonoArray** outNames, MonoArray** outTypes)
+	void ScriptShader::internal_GetShaderParameters(ScriptShader* nativeInstance, MonoArray** outNames, 
+		MonoArray** outTypes, MonoArray** outVisibility)
 	{
 	{
 		HShader shader = nativeInstance->getHandle();
 		HShader shader = nativeInstance->getHandle();
 		if (!shader.isLoaded())
 		if (!shader.isLoaded())
@@ -43,6 +44,7 @@ namespace BansheeEngine
 		{
 		{
 			String name;
 			String name;
 			ShaderParameterType type;
 			ShaderParameterType type;
+			bool internal;
 		};
 		};
 
 
 		Vector<ParamInfo> paramInfos;
 		Vector<ParamInfo> paramInfos;
@@ -53,6 +55,7 @@ namespace BansheeEngine
 		{
 		{
 			ShaderParameterType type;
 			ShaderParameterType type;
 			bool isValidType = false;
 			bool isValidType = false;
+			bool isInternal = !param.second.rendererSemantic.empty();
 			switch (param.second.type) 
 			switch (param.second.type) 
 			{
 			{
 			case GPDT_FLOAT1:
 			case GPDT_FLOAT1:
@@ -86,13 +89,14 @@ namespace BansheeEngine
 			}
 			}
 
 
 			if (isValidType)
 			if (isValidType)
-				paramInfos.push_back({ param.first, type });
+				paramInfos.push_back({ param.first, type, isInternal });
 		}
 		}
 
 
 		for (auto& param : textureParams)
 		for (auto& param : textureParams)
 		{
 		{
 			ShaderParameterType type;
 			ShaderParameterType type;
 			bool isValidType = false;
 			bool isValidType = false;
+			bool isInternal = !param.second.rendererSemantic.empty();
 			switch (param.second.type)
 			switch (param.second.type)
 			{
 			{
 			case GPOT_TEXTURE2D:
 			case GPOT_TEXTURE2D:
@@ -111,13 +115,14 @@ namespace BansheeEngine
 			}
 			}
 
 
 			if (isValidType)
 			if (isValidType)
-				paramInfos.push_back({ param.first, type });
+				paramInfos.push_back({ param.first, type, isInternal });
 		}
 		}
 
 
 		for (auto& param : samplerParams)
 		for (auto& param : samplerParams)
 		{
 		{
 			ShaderParameterType type = ShaderParameterType::Sampler;
 			ShaderParameterType type = ShaderParameterType::Sampler;
-			paramInfos.push_back({ param.first, type });
+			bool isInternal = !param.second.rendererSemantic.empty();
+			paramInfos.push_back({ param.first, type, isInternal });
 		}
 		}
 
 
 
 
@@ -125,17 +130,20 @@ namespace BansheeEngine
 
 
 		ScriptArray names = ScriptArray::create<String>(totalNumParams);
 		ScriptArray names = ScriptArray::create<String>(totalNumParams);
 		ScriptArray types = ScriptArray::create<UINT32>(totalNumParams);
 		ScriptArray types = ScriptArray::create<UINT32>(totalNumParams);
+		ScriptArray visibility = ScriptArray::create<bool>(totalNumParams);
 
 
 		UINT32 idx = 0;
 		UINT32 idx = 0;
 		for (auto& param : paramInfos)
 		for (auto& param : paramInfos)
 		{
 		{
 			names.set(idx, param.name);
 			names.set(idx, param.name);
 			types.set(idx, param.type);
 			types.set(idx, param.type);
+			visibility.set(idx, param.internal);
 
 
 			idx++;
 			idx++;
 		}
 		}
 
 
 		*outNames = names.getInternal();
 		*outNames = names.getInternal();
 		*outTypes = types.getInternal();
 		*outTypes = types.getInternal();
+		*outVisibility = visibility.getInternal();
 	}
 	}
 }
 }