mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
117 lines
6.6 KiB
C#
117 lines
6.6 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Microsoft.Iris.Render.Graphics.Dx9GaussianBlurElement
|
|
// Assembly: UIX.RenderApi, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
|
// MVID: D47658B8-A8EA-43D6-8837-ECE823BFFFC1
|
|
// Assembly location: C:\Program Files\Zune\UIX.RenderApi.dll
|
|
|
|
using Microsoft.Iris.Library;
|
|
using Microsoft.Iris.Render.Common;
|
|
using System;
|
|
|
|
namespace Microsoft.Iris.Render.Graphics
|
|
{
|
|
internal class Dx9GaussianBlurElement
|
|
{
|
|
private static void GenerateWeights1D(int nKernelRadius, double flDeviation, double[] arKernel)
|
|
{
|
|
Debug2.Validate(flDeviation > 0.0, typeof(ArgumentOutOfRangeException), "Standard deviation must be > 0.0");
|
|
Debug2.Validate(nKernelRadius >= 1, typeof(ArgumentOutOfRangeException), "Kernel radius must be >= 1");
|
|
int num1 = 1 + 2 * nKernelRadius;
|
|
double num2 = 0.0;
|
|
Debug2.Validate(arKernel != null && num1 == arKernel.GetLength(0), typeof(ArgumentException), nameof(arKernel));
|
|
double num3 = 2.0 * (flDeviation * flDeviation);
|
|
double num4 = Math.Sqrt(2.0 * Math.PI) * flDeviation;
|
|
for (int index = 0; index < num1; ++index)
|
|
{
|
|
double num5 = index - nKernelRadius;
|
|
double num6 = Math.Exp(-(num5 * num5) / num3);
|
|
arKernel[index] = num6 / num4;
|
|
num2 += arKernel[index];
|
|
}
|
|
for (int index = 0; index < num1; ++index)
|
|
arKernel[index] /= num2;
|
|
}
|
|
|
|
private static void GenerateWeights2D(
|
|
int nKernelRadius,
|
|
double flDeviation,
|
|
double[,] arKernel)
|
|
{
|
|
Debug2.Validate(flDeviation > 0.0, typeof(ArgumentOutOfRangeException), "Standard deviation must be > 0.0");
|
|
Debug2.Validate(nKernelRadius >= 1, typeof(ArgumentOutOfRangeException), "Kernel radius must be >= 1");
|
|
double num1 = 0.0;
|
|
int num2 = 1 + 2 * nKernelRadius;
|
|
Debug2.Validate(arKernel != null && num2 == arKernel.GetLength(0) && num2 == arKernel.GetLength(1), typeof(ArgumentException), nameof(arKernel));
|
|
double num3 = flDeviation * flDeviation;
|
|
double num4 = 2.0 * num3;
|
|
double num5 = 2.0 * Math.PI * num3;
|
|
for (int index1 = 0; index1 < num2; ++index1)
|
|
{
|
|
for (int index2 = 0; index2 < num2; ++index2)
|
|
{
|
|
double num6 = index2 - nKernelRadius;
|
|
double num7 = index1 - nKernelRadius;
|
|
double num8 = Math.Exp(-(num6 * num6 + num7 * num7) / num4);
|
|
arKernel[index2, index1] = num8 / num5;
|
|
num1 += arKernel[index2, index1];
|
|
}
|
|
}
|
|
for (int index1 = 0; index1 < num2; ++index1)
|
|
{
|
|
for (int index2 = 0; index2 < num2; ++index2)
|
|
arKernel[index2, index1] /= num1;
|
|
}
|
|
}
|
|
|
|
internal static void Generate(GaussianBlurElement efoBlur, ref Dx9EffectBuilder effectBuilder)
|
|
{
|
|
Dx9TextureInfo textureInfo = effectBuilder.GetTextureInfo(effectBuilder.ImageCount - 1);
|
|
effectBuilder.AddRequirement(textureInfo, Dx9TextureRequirements.TexelSize, null);
|
|
switch (efoBlur.Mode)
|
|
{
|
|
case GaussianBlurMode.Normal:
|
|
int length1 = 1 + efoBlur.KernelRadius * 2;
|
|
double[,] arKernel1 = new double[length1, length1];
|
|
GenerateWeights2D(efoBlur.KernelRadius, efoBlur.Bluriness, arKernel1);
|
|
effectBuilder.EmitPixelFragment(" {\r\n // Gaussian filter\r\n float4 vBlur = 0;\r\n");
|
|
for (int index1 = 0; index1 < length1; ++index1)
|
|
{
|
|
for (int index2 = 0; index2 < length1; ++index2)
|
|
{
|
|
int num1 = index2 - efoBlur.KernelRadius;
|
|
int num2 = index1 - efoBlur.KernelRadius;
|
|
if (num1 == 0 && num2 == 0)
|
|
effectBuilder.EmitPixelFragment(InvariantString.Format(" vBlur += {0} * {1};\r\n", effectBuilder.PixelShaderOutput, arKernel1[index2, index1]));
|
|
else
|
|
effectBuilder.EmitPixelFragment(InvariantString.Format(" vBlur += tex2D({0}, {1} + float2({2}.x * {3}, {2}.y * {4})) * {5};\r\n", textureInfo.Sampler, textureInfo.TexCoordInput, textureInfo.TexelSize, num1, num2, arKernel1[index2, index1]));
|
|
}
|
|
}
|
|
effectBuilder.EmitPixelFragment(InvariantString.Format(" {0} = vBlur;\r\n }}\r\n\r\n", effectBuilder.PixelShaderOutput));
|
|
break;
|
|
case GaussianBlurMode.Horizontal:
|
|
case GaussianBlurMode.Vertical:
|
|
bool flag = efoBlur.Mode == GaussianBlurMode.Horizontal;
|
|
int length2 = 1 + efoBlur.KernelRadius * 2;
|
|
double[] arKernel2 = new double[length2];
|
|
GenerateWeights1D(efoBlur.KernelRadius, efoBlur.Bluriness, arKernel2);
|
|
effectBuilder.EmitPixelFragment(" {\r\n // Gaussian filter\r\n float4 vBlur = 0;\r\n");
|
|
for (int index = 0; index < length2; ++index)
|
|
{
|
|
int num = index - efoBlur.KernelRadius;
|
|
if (num == 0)
|
|
effectBuilder.EmitPixelFragment(InvariantString.Format(" vBlur += {0} * {1};\r\n", effectBuilder.PixelShaderOutput, arKernel2[index]));
|
|
else if (flag)
|
|
effectBuilder.EmitPixelFragment(InvariantString.Format(" vBlur += tex2D({0}, {1} + float2({2}.x * {3}, 0)) * {4};\r\n", textureInfo.Sampler, textureInfo.TexCoordInput, textureInfo.TexelSize, num, arKernel2[index]));
|
|
else
|
|
effectBuilder.EmitPixelFragment(InvariantString.Format(" vBlur += tex2D({0}, {1} + float2(0, {2}.y * {3})) * {4};\r\n", textureInfo.Sampler, textureInfo.TexCoordInput, textureInfo.TexelSize, num, arKernel2[index]));
|
|
}
|
|
effectBuilder.EmitPixelFragment(InvariantString.Format(" {0} = vBlur;\r\n }}\r\n\r\n", effectBuilder.PixelShaderOutput));
|
|
break;
|
|
default:
|
|
Debug2.Validate(false, typeof(InvalidOperationException), "Unknown blur mode");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|