optimize PBR effect setters
							parent
							
								
									4a5f0d4461
								
							
						
					
					
						commit
						39fec5062c
					
				|  | @ -0,0 +1,14 @@ | |||
| using System; | ||||
| 
 | ||||
| namespace Smuggler | ||||
| { | ||||
|     [Flags] | ||||
|     internal enum EffectDirtyFlags | ||||
|     { | ||||
|         WorldViewProj = 1, | ||||
|         World = 2, | ||||
|         EyePosition = 4, | ||||
|         ShaderIndex = 8, | ||||
|         All = -1 | ||||
|     } | ||||
| } | ||||
|  | @ -83,6 +83,8 @@ namespace Smuggler | |||
|         bool metallicRoughnessMapEnabled = false; | ||||
|         bool normalMapEnabled = false; | ||||
| 
 | ||||
|         EffectDirtyFlags dirtyFlags= EffectDirtyFlags.All; | ||||
| 
 | ||||
|         // FIXME: lazily set properties for performance | ||||
| 
 | ||||
|         public Matrix World | ||||
|  | @ -91,15 +93,7 @@ namespace Smuggler | |||
|             set  | ||||
|             {  | ||||
|                 world = value; | ||||
|                 worldParam.SetValue(world); | ||||
| 
 | ||||
|                 Matrix.Multiply(ref world, ref view, out Matrix worldView); | ||||
|                 Matrix.Multiply(ref worldView, ref projection, out Matrix worldViewProj); | ||||
|                 worldViewProjectionParam.SetValue(worldViewProj); | ||||
| 
 | ||||
|                 Matrix.Invert(ref world, out Matrix worldInverse); | ||||
|                 Matrix.Transpose(ref worldInverse, out Matrix worldInverseTranspose); | ||||
|                 worldInverseTransposeParam.SetValue(worldInverseTranspose); | ||||
|                 dirtyFlags |= EffectDirtyFlags.World | EffectDirtyFlags.WorldViewProj; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -109,13 +103,7 @@ namespace Smuggler | |||
|             set  | ||||
|             {  | ||||
|                 view = value; | ||||
| 
 | ||||
|                 Matrix.Multiply(ref world, ref view, out Matrix worldView); | ||||
|                 Matrix.Multiply(ref worldView, ref projection, out Matrix worldViewProj); | ||||
|                 worldViewProjectionParam.SetValue(worldViewProj);           | ||||
|                  | ||||
|                 Matrix.Invert(ref view, out Matrix inverseView); | ||||
|                 eyePositionParam.SetValue(inverseView.Translation); | ||||
|                 dirtyFlags |= EffectDirtyFlags.WorldViewProj | EffectDirtyFlags.EyePosition; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -125,10 +113,7 @@ namespace Smuggler | |||
|             set  | ||||
|             {  | ||||
|                 projection = value; | ||||
| 
 | ||||
|                 Matrix.Multiply(ref world, ref view, out Matrix worldView); | ||||
|                 Matrix.Multiply(ref worldView, ref projection, out Matrix worldViewProj); | ||||
|                 worldViewProjectionParam.SetValue(worldViewProj);    | ||||
|                 dirtyFlags |= EffectDirtyFlags.WorldViewProj; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -185,7 +170,7 @@ namespace Smuggler | |||
|             {  | ||||
|                 albedoTextureParam.SetValue(value);  | ||||
|                 albedoTextureEnabled = value != null; | ||||
|                 System.Console.WriteLine(albedoTextureEnabled); | ||||
|                 dirtyFlags |= EffectDirtyFlags.ShaderIndex; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -196,6 +181,7 @@ namespace Smuggler | |||
|             {  | ||||
|                 normalTextureParam.SetValue(value); | ||||
|                 normalMapEnabled = value != null; | ||||
|                 dirtyFlags |= EffectDirtyFlags.ShaderIndex; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -218,6 +204,7 @@ namespace Smuggler | |||
|             {  | ||||
|                 metallicRoughnessTextureParam.SetValue(value); | ||||
|                 metallicRoughnessMapEnabled = value != null; | ||||
|                 dirtyFlags |= EffectDirtyFlags.ShaderIndex; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -287,8 +274,37 @@ namespace Smuggler | |||
|             return new PBREffect(this); | ||||
|         } | ||||
| 
 | ||||
|         // FIXME: do param applications here for performance | ||||
|         protected override void OnApply() | ||||
|         { | ||||
|             if ((dirtyFlags & EffectDirtyFlags.World) != 0) | ||||
|             { | ||||
|                 worldParam.SetValue(world); | ||||
| 
 | ||||
|                 Matrix.Invert(ref world, out Matrix worldInverse); | ||||
|                 Matrix.Transpose(ref worldInverse, out Matrix worldInverseTranspose); | ||||
|                 worldInverseTransposeParam.SetValue(worldInverseTranspose); | ||||
| 
 | ||||
|                 dirtyFlags &= ~EffectDirtyFlags.World; | ||||
|             } | ||||
| 
 | ||||
|             if ((dirtyFlags & EffectDirtyFlags.WorldViewProj) != 0) | ||||
|             { | ||||
|                 Matrix.Multiply(ref world, ref view, out Matrix worldView); | ||||
|                 Matrix.Multiply(ref worldView, ref projection, out Matrix worldViewProj); | ||||
|                 worldViewProjectionParam.SetValue(worldViewProj); | ||||
| 
 | ||||
|                 dirtyFlags &= ~EffectDirtyFlags.WorldViewProj; | ||||
|             } | ||||
| 
 | ||||
|             if ((dirtyFlags & EffectDirtyFlags.EyePosition) != 0) | ||||
|             { | ||||
|                 Matrix.Invert(ref view, out Matrix inverseView); | ||||
|                 eyePositionParam.SetValue(inverseView.Translation); | ||||
| 
 | ||||
|                 dirtyFlags &= ~EffectDirtyFlags.EyePosition; | ||||
|             } | ||||
| 
 | ||||
|             if ((dirtyFlags & EffectDirtyFlags.ShaderIndex) != 0) | ||||
|             { | ||||
|                 int shaderIndex = 0; | ||||
| 
 | ||||
|  | @ -322,6 +338,9 @@ namespace Smuggler | |||
|                 } | ||||
| 
 | ||||
|                 shaderIndexParam.SetValue(shaderIndex); | ||||
| 
 | ||||
|                 dirtyFlags &= ~EffectDirtyFlags.ShaderIndex; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         void CacheEffectParameters(PBREffect cloneSource) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue