private void ColorPass(float[] eniromentLight, float[] color, float[] normal, float[] p3D, float[] tex, bool specular, int from) { ArrayMath.Sub(_lightPosArray, p3D, _l, 0, from, from, 3); ArrayMath.Normalize(_l, from, 3); var dotNl = ArrayMath.Dot(normal, _l, from, from, 3); ArrayMath.Mul(color, Math.Max(0f, dotNl), _Id, from, from, 3); ArrayMath.Mul(normal, dotNl * 2, _r, from, from, 3); ArrayMath.Sub(_r, _l, _r, from, from, from, 3); ArrayMath.Normalize(_r, from, 3); ArrayMath.Normalize(p3D, from, 3); var rDotP3D = -ArrayMath.Dot(_r, p3D, from, from, 3); var Is = 0f; if (specular) { var max = Math.Max(0, rDotP3D); Is = DeviceFunction.Pow(max, 50); } ArrayMath.Mul(eniromentLight, color, color, 0, from, from, 3); ArrayMath.Mul(tex, _Id, tex, from, from, from, 3); ArrayMath.Add(color, tex, color, from, from, from, 3); ArrayMath.Add(color, Is, color, from, 3); ArrayMath.Mul(color, 255, color, from, from, 3); }
public virtual void TestAdd() { double[] d1prime = ArrayMath.Add(d1, 3); for (int i = 0; i < ArrayMath.NumRows(d1prime); i++) { NUnit.Framework.Assert.AreEqual(d1[i] + 3, 1e-5, d1prime[i]); } }
/// <summary> /// /// </summary> public static void Add(this IDiscreteField <Vec3d> f0, IDiscreteField <Vec3d> f1, IDiscreteField <Vec3d> result, bool parallel = false) { if (parallel) { ArrayMath.AddParallel(f0.Values, f1.Values, f0.Count, result.Values); } else { ArrayMath.Add(f0.Values, f1.Values, f0.Count, result.Values); } }
/// <summary> /// /// </summary> /// <param name="vectors"></param> /// <param name="result"></param> public static void Sum(this IEnumerable <double[]> vectors, double[] result) { if (vectors is double[][] arr) { ArrayMath.Sum(arr, result); return; } Array.Clear(result, 0, vectors.First().Length); foreach (double[] v in vectors) { ArrayMath.Add(result, v, result); } }
/// <summary> /// /// </summary> /// <param name="vectors"></param> /// <param name="result"></param> public static void Mean(this IEnumerable <double[]> vectors, double[] result) { if (vectors is double[][] arr) { ArrayMath.Mean(arr, result); return; } Array.Clear(result, 0, vectors.First().Length); int count = 0; foreach (double[] v in vectors) { ArrayMath.Add(result, v, result); count++; } ArrayMath.Scale(result, 1.0 / count, result); }
public double ValueAt(double[] x) { return(ArrayMath.InnerProduct(x, ArrayMath.Add(x, 1))); }
// this function does on a large vector x^2+1 public double[] DerivativeAt(double[] x) { return(ArrayMath.Add(ArrayMath.Multiply(x, 2), 1)); }