Răsfoiți Sursa

Fixed shader import so it properly initializes shader variations
Fixed post-process updates so the renderer properly registers changed settings
Fixed post-process setting's inspector so the values can be properly modified
Fixed a crash when using a non-HDR render target due to uninitialized eye adaptation texture

BearishSun 9 ani în urmă
părinte
comite
a497317478

+ 4 - 0
Source/BansheeEngine/Include/BsRendererMaterialManager.h

@@ -23,6 +23,7 @@ namespace BansheeEngine
 		{
 			RendererMaterialMetaData* metaData;
 			Path shaderPath;
+			Path resourcePath;
 		};
 
 	public:
@@ -35,6 +36,9 @@ namespace BansheeEngine
 		/** Returns all available variations (specified by pre-processor defines) of a shader at the provided path. */
 		static Vector<ShaderDefines> _getVariations(const Path& shaderPath);
 
+		/** Generates a new unique shader path for a specific shader variation. */
+		static Path _getVariationPath(const Path& shaderPath, UINT32 variationIdx);
+
 	private:
 		template<class T>
 		friend class RendererMaterial;

+ 3 - 13
Source/BansheeEngine/Source/BsBuiltinResources.cpp

@@ -1178,20 +1178,10 @@ namespace BansheeEngine
 
 								shaderImportOptions->getDefines() = variation.getAll();
 
-								Path uniquePath;
-								if(variationIdx == 0)
-								{
-									uniquePath = relativeAssetPath;
-								}
-								else
-								{
-									uniquePath = relativePath;
-									uniquePath.setFilename(relativePath.getWFilename(false) + L"_" + toWString(variationIdx) +
-										relativePath.getWExtension() + L".asset");
-								}
-
+								Path uniquePath = RendererMaterialManager::_getVariationPath(relativePath, variationIdx);
+								uniquePath.setFilename(uniquePath.getWFilename() + L".asset");
+								
 								resourcesToSave.push_back(std::make_pair(uniquePath, shaderImportOptions));
-
 								variationIdx++;
 							}
 						}

+ 11 - 4
Source/BansheeEngine/Source/BsCamera.cpp

@@ -727,7 +727,7 @@ namespace BansheeEngine
 		mRecalcFrustumPlanes = true;
 		mRecalcView = true;
 
-		if (dirtyFlag == CameraDirtyFlag::Transform || dirtyFlag == CameraDirtyFlag::PostProcess)
+		if (dirtyFlag == CameraDirtyFlag::Transform)
 		{
 			RendererManager::instance().getActive()->notifyCameraUpdated(this, (UINT32)dirtyFlag);
 		}
@@ -749,10 +749,17 @@ namespace BansheeEngine
 			dataPtr = rttiReadElem(mMSAA, dataPtr);
 			dataPtr = rttiReadElem(mPPSettings, dataPtr);
 
-			RendererManager::instance().getActive()->notifyCameraRemoved(this);
+			if(dirtyFlag == CameraDirtyFlag::PostProcess)
+			{
+				RendererManager::instance().getActive()->notifyCameraUpdated(this, (UINT32)dirtyFlag);
+			}
+			else
+			{
+				RendererManager::instance().getActive()->notifyCameraRemoved(this);
 
-			if (mIsActive)
-				RendererManager::instance().getActive()->notifyCameraAdded(this);
+				if (mIsActive)
+					RendererManager::instance().getActive()->notifyCameraAdded(this);
+			}
 		}
 	}
 

+ 26 - 2
Source/BansheeEngine/Source/BsRendererMaterialManager.cpp

@@ -15,7 +15,7 @@ namespace BansheeEngine
 		Vector<SPtr<ShaderCore>> shaders;
 		for (auto& material : materials)
 		{
-			HShader shader = br.getShader(material.shaderPath);
+			HShader shader = br.getShader(material.resourcePath);
 			if (shader.isLoaded())
 				shaders.push_back(shader->getCore());
 			else
@@ -35,7 +35,15 @@ namespace BansheeEngine
 		Lock lock(getMutex());
 
 		Vector<RendererMaterialData>& materials = getMaterials();
-		materials.push_back({metaData, shaderPath});
+		UINT32 variationIdx = 0;
+		for (auto& entry : materials)
+		{
+			if (entry.shaderPath == shaderPath)
+				variationIdx++;
+		}
+
+		Path resourcePath = _getVariationPath(shaderPath, variationIdx);
+		materials.push_back({metaData, shaderPath, resourcePath });
 	}
 
 	Vector<ShaderDefines> RendererMaterialManager::_getVariations(const Path& shaderPath)
@@ -52,6 +60,22 @@ namespace BansheeEngine
 		return output;
 	}
 
+	Path RendererMaterialManager::_getVariationPath(const Path& shaderPath, UINT32 variationIdx)
+	{
+		if (variationIdx == 0)
+		{
+			return shaderPath;
+		}
+		else
+		{
+			Path uniquePath = shaderPath;
+			uniquePath.setFilename(shaderPath.getWFilename(false) + L"_" + toWString(variationIdx) +
+				shaderPath.getWExtension());
+
+			return uniquePath;
+		}
+	}
+
 	void RendererMaterialManager::initOnCore(const Vector<SPtr<ShaderCore>>& shaders)
 	{
 		Lock lock(getMutex());

+ 1 - 0
Source/MBansheeEditor/Inspectors/CameraInspector.cs

@@ -275,6 +275,7 @@ namespace BansheeEditor
                 }
 
                 ToggleTypeSpecificFields(camera.ProjectionType);
+                postProcessLayout.Active = Persistent.GetBool("postProcess_Expanded");
             }
         }
 

+ 27 - 25
Source/MBansheeEditor/Inspectors/PostProcessSettingsInspector.cs

@@ -61,14 +61,14 @@ namespace BansheeEditor
         {
             this.settings = settings;
 
-            histogramLog2MinField.OnChanged += x => { settings.HistogramLog2Min = x; MarkAsModified(); ConfirmModify(); };
-            histogramLog2MaxField.OnChanged += x => { settings.HistogramLog2Max = x; MarkAsModified(); ConfirmModify(); };
-            histogramPctLowField.OnChanged += x => { settings.HistogramPctLow = x; MarkAsModified(); ConfirmModify(); };
-            histogramPctHighField.OnChanged += x => { settings.HistogramPctHigh = x; MarkAsModified(); ConfirmModify(); };
-            minEyeAdaptationField.OnChanged += x => { settings.MinEyeAdaptation = x; MarkAsModified(); ConfirmModify(); };
-            maxEyeAdaptationField.OnChanged += x => { settings.MaxEyeAdaptation = x; MarkAsModified(); ConfirmModify(); };
-            eyeAdaptationSpeedUpField.OnChanged += x => { settings.EyeAdaptationSpeedUp = x; MarkAsModified(); ConfirmModify(); };
-            eyeAdaptationSpeedDownField.OnChanged += x => { settings.EyeAdaptationSpeedDown = x; MarkAsModified(); ConfirmModify(); };
+            histogramLog2MinField.OnChanged += x => { this.settings.HistogramLog2Min = x; MarkAsModified(); ConfirmModify(); };
+            histogramLog2MaxField.OnChanged += x => { this.settings.HistogramLog2Max = x; MarkAsModified(); ConfirmModify(); };
+            histogramPctLowField.OnChanged += x => { this.settings.HistogramPctLow = x; MarkAsModified(); ConfirmModify(); };
+            histogramPctHighField.OnChanged += x => { this.settings.HistogramPctHigh = x; MarkAsModified(); ConfirmModify(); };
+            minEyeAdaptationField.OnChanged += x => { this.settings.MinEyeAdaptation = x; MarkAsModified(); ConfirmModify(); };
+            maxEyeAdaptationField.OnChanged += x => { this.settings.MaxEyeAdaptation = x; MarkAsModified(); ConfirmModify(); };
+            eyeAdaptationSpeedUpField.OnChanged += x => { this.settings.EyeAdaptationSpeedUp = x; MarkAsModified(); ConfirmModify(); };
+            eyeAdaptationSpeedDownField.OnChanged += x => { this.settings.EyeAdaptationSpeedDown = x; MarkAsModified(); ConfirmModify(); };
 
             layout.AddElement(histogramLog2MinField);
             layout.AddElement(histogramLog2MaxField);
@@ -149,31 +149,31 @@ namespace BansheeEditor
         {
             this.settings = settings;
 
-            shoulderStrengthField.OnChanged += x => { settings.FilmicCurveShoulderStrength = x; MarkAsModified(); };
+            shoulderStrengthField.OnChanged += x => { this.settings.FilmicCurveShoulderStrength = x; MarkAsModified(); };
             shoulderStrengthField.OnFocusLost += ConfirmModify;
             shoulderStrengthField.OnConfirmed += ConfirmModify;
 
-            linearStrengthField.OnChanged += x => { settings.FilmicCurveLinearStrength = x; MarkAsModified(); };
+            linearStrengthField.OnChanged += x => { this.settings.FilmicCurveLinearStrength = x; MarkAsModified(); };
             linearStrengthField.OnFocusLost += ConfirmModify;
             linearStrengthField.OnConfirmed += ConfirmModify;
 
-            linearAngleField.OnChanged += x => { settings.FilmicCurveLinearAngle = x; MarkAsModified(); };
+            linearAngleField.OnChanged += x => { this.settings.FilmicCurveLinearAngle = x; MarkAsModified(); };
             linearAngleField.OnFocusLost += ConfirmModify;
             linearAngleField.OnConfirmed += ConfirmModify;
 
-            toeStrengthField.OnChanged += x => { settings.FilmicCurveToeStrength = x; MarkAsModified(); };
+            toeStrengthField.OnChanged += x => { this.settings.FilmicCurveToeStrength = x; MarkAsModified(); };
             toeStrengthField.OnFocusLost += ConfirmModify;
             toeStrengthField.OnConfirmed += ConfirmModify;
 
-            toeNumeratorField.OnChanged += x => { settings.FilmicCurveToeNumerator = x; MarkAsModified(); };
+            toeNumeratorField.OnChanged += x => { this.settings.FilmicCurveToeNumerator = x; MarkAsModified(); };
             toeNumeratorField.OnFocusLost += ConfirmModify;
             toeNumeratorField.OnConfirmed += ConfirmModify;
 
-            toeDenominatorField.OnChanged += x => { settings.FilmicCurveToeDenominator = x; MarkAsModified(); };
+            toeDenominatorField.OnChanged += x => { this.settings.FilmicCurveToeDenominator = x; MarkAsModified(); };
             toeDenominatorField.OnFocusLost += ConfirmModify;
             toeDenominatorField.OnConfirmed += ConfirmModify;
 
-            whitePointField.OnChanged += x => { settings.FilmicCurveLinearWhitePoint = x; MarkAsModified(); };
+            whitePointField.OnChanged += x => { this.settings.FilmicCurveLinearWhitePoint = x; MarkAsModified(); };
             whitePointField.OnFocusLost += ConfirmModify;
             whitePointField.OnConfirmed += ConfirmModify;
 
@@ -246,19 +246,19 @@ namespace BansheeEditor
         {
             this.settings = settings;
 
-            saturationField.OnChanged += x => { settings.Saturation = x; MarkAsModified(); };
+            saturationField.OnChanged += x => { this.settings.Saturation = x; MarkAsModified(); };
             saturationField.OnFocusLost += ConfirmModify;
             saturationField.OnConfirmed += ConfirmModify;
 
-            contrastField.OnChanged += x => { settings.Contrast = x; MarkAsModified(); };
+            contrastField.OnChanged += x => { this.settings.Contrast = x; MarkAsModified(); };
             contrastField.OnFocusLost += ConfirmModify;
             contrastField.OnConfirmed += ConfirmModify;
 
-            gainField.OnChanged += x => { settings.Gain = x; MarkAsModified(); };
+            gainField.OnChanged += x => { this.settings.Gain = x; MarkAsModified(); };
             gainField.OnFocusLost += ConfirmModify;
             gainField.OnConfirmed += ConfirmModify;
 
-            offsetField.OnChanged += x => { settings.Offset = x; MarkAsModified(); };
+            offsetField.OnChanged += x => { this.settings.Offset = x; MarkAsModified(); };
             offsetField.OnFocusLost += ConfirmModify;
             offsetField.OnConfirmed += ConfirmModify;
 
@@ -324,8 +324,8 @@ namespace BansheeEditor
         {
             this.settings = settings;
 
-            temperatureField.OnChanged += x => { settings.Temperature = x; MarkAsModified(); ConfirmModify(); };
-            tintField.OnChanged += x => { settings.Tint = x; MarkAsModified(); ConfirmModify(); };
+            temperatureField.OnChanged += x => { this.settings.Temperature = x; MarkAsModified(); ConfirmModify(); };
+            tintField.OnChanged += x => { this.settings.Tint = x; MarkAsModified(); ConfirmModify(); };
 
             layout.AddElement(temperatureField);
             layout.AddElement(tintField);
@@ -415,7 +415,7 @@ namespace BansheeEditor
             this.properties = properties;
 
             // Auto exposure
-            enableAutoExposureField.OnChanged += x => { settings.EnableAutoExposure = x; MarkAsModified(); ConfirmModify(); };
+            enableAutoExposureField.OnChanged += x => { this.settings.EnableAutoExposure = x; MarkAsModified(); ConfirmModify(); };
             layout.AddElement(enableAutoExposureField);
 
             autoExposureFoldout.OnToggled += x =>
@@ -436,7 +436,7 @@ namespace BansheeEditor
             }
 
             // Tonemapping
-            enableToneMappingField.OnChanged += x => { settings.EnableTonemapping = x; MarkAsModified(); ConfirmModify(); };
+            enableToneMappingField.OnChanged += x => { this.settings.EnableTonemapping = x; MarkAsModified(); ConfirmModify(); };
             layout.AddElement(enableToneMappingField);
 
             //// Tonemapping settings
@@ -494,12 +494,14 @@ namespace BansheeEditor
             }
 
             // Gamma
-            gammaField.OnChanged += x => { settings.Gamma = x; MarkAsModified(); ConfirmModify(); };
+            gammaField.OnChanged += x => { this.settings.Gamma = x; MarkAsModified(); ConfirmModify(); };
             layout.AddElement(gammaField);
 
             // Exposure scale
-            exposureScaleField.OnChanged += x => { settings.ExposureScale = x; MarkAsModified(); ConfirmModify(); };
+            exposureScaleField.OnChanged += x => { this.settings.ExposureScale = x; MarkAsModified(); ConfirmModify(); };
             layout.AddElement(exposureScaleField);
+
+            ToggleFoldoutFields();
         }
 
         /// <summary>

+ 4 - 1
Source/RenderBeast/Source/BsPostProcessing.cpp

@@ -371,7 +371,10 @@ namespace BansheeEngine
 
 		mColorLUT.set(colorLUT);
 
-		SPtr<TextureCore> eyeAdaptationTexture = ppInfo.eyeAdaptationTex[ppInfo.lastEyeAdaptationTex]->texture;
+		SPtr<TextureCore> eyeAdaptationTexture;
+		if(ppInfo.eyeAdaptationTex[ppInfo.lastEyeAdaptationTex] != nullptr)
+			eyeAdaptationTexture = ppInfo.eyeAdaptationTex[ppInfo.lastEyeAdaptationTex]->texture;
+
 		mEyeAdaptationTex.set(eyeAdaptationTexture);
 
 		// Render

+ 1 - 0
Source/RenderBeast/Source/BsRenderBeast.cpp

@@ -380,6 +380,7 @@ namespace BansheeEngine
 		if(dirtyFlag == CameraDirtyFlag::PostProcess)
 		{
 			CameraData& camData = mCameraData[camera];
+			camData.postProcessInfo.settings = camera->getPostProcessSettings();
 			camData.postProcessInfo.settingDirty = true;
 		}
 	}

+ 1 - 1
Source/RenderBeast/Source/BsRenderTargets.cpp

@@ -13,7 +13,7 @@ namespace BansheeEngine
 		:mViewport(viewport), mNumSamples(numSamples), mHDR(hdr)
 	{
 		// Note: Consider customizable HDR format via options? e.g. smaller PF_FLOAT_R11G11B10 or larger 32-bit format
-		mSceneColorFormat = hdr ? PF_FLOAT16_RGBA : PF_B8G8R8X8;
+		mSceneColorFormat = hdr ? PF_FLOAT16_RGBA : PF_B8G8R8A8;
 		mDiffuseFormat = PF_B8G8R8X8; // Note: Also consider customizable format (e.g. 16-bit float?)
 		mNormalFormat = PF_UNORM_R10G10B10A2; // Note: Also consider customizable format (e.g. 16-bit float?)
 	}