private void recalcOldDiff(int c) { gradValues grad = new gradValues(); grad.a = A[c]; grad.b = B[c]; grad.c = C[c]; grad.d = D[c]; setGradDiff(c, grad); oldDiff[c] = grad.diff; }
private void setGradDiff(int c, gradValues grad) { grad.diff = 0f; for (int s = 0; s < sampleCount; s++) { float point = ( (float)s + ( jitter ? Random.value : .5f ) ) / (float)sampleCount; float sVal = gradients.GetPixelBilinear(point, gradientPosition)[c]; float gVal = 0f; switch (gradientFunction) { case gFuncs.trigonometric: gVal = getTrigGradValue( point, grad.a, grad.b, grad.c, grad.d ); break; case gFuncs.asymetricPolynomial: gVal = getAsymetricPolyGradValue( point, grad.a, grad.b, grad.c, grad.d ); break; case gFuncs.symetricPolynomial: gVal = getSymetricPolyGradValue( point, grad.a, grad.b, grad.c, grad.d ); break; case gFuncs.exponential: gVal = getExponentialGradValue( point, grad.a, grad.b, grad.c, grad.d ); break; } if(clamp) gVal = Mathf.Clamp01(gVal); grad.diff += Mathf.Abs(sVal - gVal); } grad.diff /= (float)sampleCount; }
private void stepChannel(int c) { List<gradValues> grads = new List<gradValues>(); for (int v = 0; v < variationCount; v++) { gradValues grad = new gradValues(); grad.a = A[c] + Random.Range( -oldDiff[c]/1.5f, oldDiff[c]/1.5f ); grad.b = B[c] + Random.Range( -oldDiff[c]/1.5f, oldDiff[c]/1.5f ); grad.c = C[c] + Random.Range( -oldDiff[c]/5.0f, oldDiff[c]/5.0f ); grad.d = D[c] + Random.Range( -oldDiff[c]/1.5f, oldDiff[c]/1.5f ); setGradDiff(c, grad); grads.Add(grad); } grads.Sort((a,b)=>a.diff.CompareTo(b.diff)); if (grads[0].diff < oldDiff[c]) { oldDiff[c] = grads[0].diff; A[c] = grads[0].a; B[c] = grads[0].b; C[c] = grads[0].c; D[c] = grads[0].d; } }