Parcourir la source

Fixed a crash when accessing a material with no shader
Fixed ScriptCode resource so it properly uses import options instead of modifying the resource directly
Modified project save so it skips saving non-native resources (since they can't be changed)
Fixed scene axes GUI so it properly cleans up its camera on assembly reload

BearishSun il y a 10 ans
Parent
commit
79ac256b48

+ 1 - 1
MBansheeEditor/Inspectors/ScriptCodeInspector.cs

@@ -50,8 +50,8 @@ namespace BansheeEditor
             reimportButton.OnClick += TriggerReimport;
             reimportButton.OnClick += TriggerReimport;
 
 
             GUILayout reimportButtonLayout = Layout.AddLayoutX();
             GUILayout reimportButtonLayout = Layout.AddLayoutX();
-            reimportButtonLayout.AddFlexibleSpace();
             reimportButtonLayout.AddElement(reimportButton);
             reimportButtonLayout.AddElement(reimportButton);
+            reimportButtonLayout.AddFlexibleSpace();
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>

+ 8 - 0
MBansheeEditor/Scene/SceneAxesGUI.cs

@@ -114,5 +114,13 @@ namespace BansheeEditor
             bounds.y = y;
             bounds.y = y;
             renderTextureGUI.Bounds = bounds;
             renderTextureGUI.Bounds = bounds;
         }
         }
+
+        /// <summary>
+        /// Call this when done with the object so internal resources can be cleaned up.
+        /// </summary>
+        public void Destroy()
+        {
+            camera.SceneObject.Destroy();
+        }
     }
     }
 }
 }

+ 3 - 0
MBansheeEditor/Scene/SceneWindow.cs

@@ -274,6 +274,9 @@ namespace BansheeEditor
                 camera.SceneObject.Destroy();
                 camera.SceneObject.Destroy();
                 camera = null;
                 camera = null;
             }
             }
+
+            sceneAxesGUI.Destroy();
+            sceneAxesGUI = null;
         }
         }
         
         
         /// <summary>
         /// <summary>

+ 162 - 153
SBansheeEngine/Source/BsScriptShader.cpp

@@ -1,154 +1,163 @@
-#include "BsScriptShader.h"
-#include "BsScriptResourceManager.h"
-#include "BsScriptMeta.h"
-#include "BsMonoField.h"
-#include "BsMonoClass.h"
-#include "BsMonoArray.h"
-#include "BsMonoManager.h"
-
-namespace BansheeEngine
-{
-	/**
-	 * @brief	Shader parameter types that can be handled using managed code.
-	 */
-	enum class ShaderParameterType // Note: This must match C# ShaderParameterType enum
-	{
-		Float, Vector2, Vector3, Vector4, Color,
-		Matrix3, Matrix4, Texture2D,
-		Texture3D, TextureCube, Sampler
-	};
-
-	ScriptShader::ScriptShader(MonoObject* instance, const HShader& shader)
-		:TScriptResource(instance, shader)
-	{
-
-	}
-
-	void ScriptShader::initRuntimeData()
-	{
-		metaData.scriptClass->addInternalCall("Internal_GetShaderParameters", &ScriptShader::internal_GetShaderParameters);
-	}
-
-	void ScriptShader::internal_GetShaderParameters(ScriptShader* nativeInstance, MonoArray** outNames, 
-		MonoArray** outTypes, MonoArray** outVisibility)
-	{
-		HShader shader = nativeInstance->getHandle();
-		if (!shader.isLoaded())
-			return;
-
-		const Map<String, SHADER_DATA_PARAM_DESC>& dataParams = shader->getDataParams();
-		const Map<String, SHADER_OBJECT_PARAM_DESC>& textureParams = shader->getTextureParams();
-		const Map<String, SHADER_OBJECT_PARAM_DESC>& samplerParams = shader->getSamplerParams();
-
-		struct ParamInfo
-		{
-			String name;
-			ShaderParameterType type;
-			bool internal;
-		};
-
-		Vector<ParamInfo> paramInfos;
-
-		// TODO - Ignoring int, bool, struct and non-square matrices
-		// TODO - Ignoring buffers and load/store textures
-		for (auto& param : dataParams)
-		{
-			ShaderParameterType type;
-			bool isValidType = false;
-			bool isInternal = !param.second.rendererSemantic.empty();
-			switch (param.second.type) 
-			{
-			case GPDT_FLOAT1:
-				type = ShaderParameterType::Float;
-				isValidType = true;
-				break;
-			case GPDT_FLOAT2:
-				type = ShaderParameterType::Vector2;
-				isValidType = true;
-				break;
-			case GPDT_FLOAT3:
-				type = ShaderParameterType::Vector3;
-				isValidType = true;
-				break;
-			case GPDT_FLOAT4:
-				type = ShaderParameterType::Vector4;
-				isValidType = true;
-				break;
-			case GPDT_MATRIX_3X3:
-				type = ShaderParameterType::Matrix3;
-				isValidType = true;
-				break;
-			case GPDT_MATRIX_4X4:
-				type = ShaderParameterType::Matrix4;
-				isValidType = true;
-				break;
-			case GPDT_COLOR:
-				type = ShaderParameterType::Color;
-				isValidType = true;
-				break;
-			}
-
-			if (isValidType)
-				paramInfos.push_back({ param.first, type, isInternal });
-		}
-
-		for (auto& param : textureParams)
-		{
-			ShaderParameterType type;
-			bool isValidType = false;
-			bool isInternal = !param.second.rendererSemantic.empty();
-			switch (param.second.type)
-			{
-			case GPOT_TEXTURE2D:
-			case GPOT_TEXTURE2DMS:
-				type = ShaderParameterType::Texture2D;
-				isValidType = true;
-				break;
-			case GPOT_TEXTURE3D:
-				type = ShaderParameterType::Texture3D;
-				isValidType = true;
-				break;
-			case GPOT_TEXTURECUBE:
-				type = ShaderParameterType::TextureCube;
-				isValidType = true;
-				break;
-			}
-
-			if (isValidType)
-				paramInfos.push_back({ param.first, type, isInternal });
-		}
-
-		for (auto& param : samplerParams)
-		{
-			ShaderParameterType type = ShaderParameterType::Sampler;
-			bool isInternal = !param.second.rendererSemantic.empty();
-			paramInfos.push_back({ param.first, type, isInternal });
-		}
-
-
-		UINT32 totalNumParams = (UINT32)paramInfos.size();
-
-		ScriptArray names = ScriptArray::create<String>(totalNumParams);
-		ScriptArray types = ScriptArray::create<UINT32>(totalNumParams);
-		ScriptArray visibility = ScriptArray::create<bool>(totalNumParams);
-
-		UINT32 idx = 0;
-		for (auto& param : paramInfos)
-		{
-			names.set(idx, param.name);
-			types.set(idx, param.type);
-			visibility.set(idx, param.internal);
-
-			idx++;
-		}
-
-		*outNames = names.getInternal();
-		*outTypes = types.getInternal();
-		*outVisibility = visibility.getInternal();
-	}
-
-	MonoObject* ScriptShader::createInstance()
-	{
-		return metaData.scriptClass->createInstance();
-	}
+#include "BsScriptShader.h"
+#include "BsScriptResourceManager.h"
+#include "BsScriptMeta.h"
+#include "BsMonoField.h"
+#include "BsMonoClass.h"
+#include "BsMonoArray.h"
+#include "BsMonoManager.h"
+
+namespace BansheeEngine
+{
+	/**
+	 * @brief	Shader parameter types that can be handled using managed code.
+	 */
+	enum class ShaderParameterType // Note: This must match C# ShaderParameterType enum
+	{
+		Float, Vector2, Vector3, Vector4, Color,
+		Matrix3, Matrix4, Texture2D,
+		Texture3D, TextureCube, Sampler
+	};
+
+	ScriptShader::ScriptShader(MonoObject* instance, const HShader& shader)
+		:TScriptResource(instance, shader)
+	{
+
+	}
+
+	void ScriptShader::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_GetShaderParameters", &ScriptShader::internal_GetShaderParameters);
+	}
+
+	void ScriptShader::internal_GetShaderParameters(ScriptShader* nativeInstance, MonoArray** outNames, 
+		MonoArray** outTypes, MonoArray** outVisibility)
+	{
+		HShader shader = nativeInstance->getHandle();
+		if (!shader.isLoaded())
+		{
+			ScriptArray names = ScriptArray::create<String>(0);
+			ScriptArray types = ScriptArray::create<UINT32>(0);
+			ScriptArray visibility = ScriptArray::create<bool>(0);
+
+			*outNames = names.getInternal();
+			*outTypes = types.getInternal();
+			*outVisibility = visibility.getInternal();
+			return;
+		}
+
+		const Map<String, SHADER_DATA_PARAM_DESC>& dataParams = shader->getDataParams();
+		const Map<String, SHADER_OBJECT_PARAM_DESC>& textureParams = shader->getTextureParams();
+		const Map<String, SHADER_OBJECT_PARAM_DESC>& samplerParams = shader->getSamplerParams();
+
+		struct ParamInfo
+		{
+			String name;
+			ShaderParameterType type;
+			bool internal;
+		};
+
+		Vector<ParamInfo> paramInfos;
+
+		// TODO - Ignoring int, bool, struct and non-square matrices
+		// TODO - Ignoring buffers and load/store textures
+		for (auto& param : dataParams)
+		{
+			ShaderParameterType type;
+			bool isValidType = false;
+			bool isInternal = !param.second.rendererSemantic.empty();
+			switch (param.second.type) 
+			{
+			case GPDT_FLOAT1:
+				type = ShaderParameterType::Float;
+				isValidType = true;
+				break;
+			case GPDT_FLOAT2:
+				type = ShaderParameterType::Vector2;
+				isValidType = true;
+				break;
+			case GPDT_FLOAT3:
+				type = ShaderParameterType::Vector3;
+				isValidType = true;
+				break;
+			case GPDT_FLOAT4:
+				type = ShaderParameterType::Vector4;
+				isValidType = true;
+				break;
+			case GPDT_MATRIX_3X3:
+				type = ShaderParameterType::Matrix3;
+				isValidType = true;
+				break;
+			case GPDT_MATRIX_4X4:
+				type = ShaderParameterType::Matrix4;
+				isValidType = true;
+				break;
+			case GPDT_COLOR:
+				type = ShaderParameterType::Color;
+				isValidType = true;
+				break;
+			}
+
+			if (isValidType)
+				paramInfos.push_back({ param.first, type, isInternal });
+		}
+
+		for (auto& param : textureParams)
+		{
+			ShaderParameterType type;
+			bool isValidType = false;
+			bool isInternal = !param.second.rendererSemantic.empty();
+			switch (param.second.type)
+			{
+			case GPOT_TEXTURE2D:
+			case GPOT_TEXTURE2DMS:
+				type = ShaderParameterType::Texture2D;
+				isValidType = true;
+				break;
+			case GPOT_TEXTURE3D:
+				type = ShaderParameterType::Texture3D;
+				isValidType = true;
+				break;
+			case GPOT_TEXTURECUBE:
+				type = ShaderParameterType::TextureCube;
+				isValidType = true;
+				break;
+			}
+
+			if (isValidType)
+				paramInfos.push_back({ param.first, type, isInternal });
+		}
+
+		for (auto& param : samplerParams)
+		{
+			ShaderParameterType type = ShaderParameterType::Sampler;
+			bool isInternal = !param.second.rendererSemantic.empty();
+			paramInfos.push_back({ param.first, type, isInternal });
+		}
+
+
+		UINT32 totalNumParams = (UINT32)paramInfos.size();
+
+		ScriptArray names = ScriptArray::create<String>(totalNumParams);
+		ScriptArray types = ScriptArray::create<UINT32>(totalNumParams);
+		ScriptArray visibility = ScriptArray::create<bool>(totalNumParams);
+
+		UINT32 idx = 0;
+		for (auto& param : paramInfos)
+		{
+			names.set(idx, param.name);
+			types.set(idx, param.type);
+			visibility.set(idx, param.internal);
+
+			idx++;
+		}
+
+		*outNames = names.getInternal();
+		*outTypes = types.getInternal();
+		*outVisibility = visibility.getInternal();
+	}
+
+	MonoObject* ScriptShader::createInstance()
+	{
+		return metaData.scriptClass->createInstance();
+	}
 }
 }