protected override sealed VFXExpression[] BuildExpression(VFXExpression[] inputExpression) { VFXExpression lineDelta = (inputExpression[1] - inputExpression[0]); VFXExpression lineLength = new VFXExpressionMax(VFXOperatorUtility.Dot(lineDelta, lineDelta), VFXValue.Constant(Mathf.Epsilon)); VFXExpression t = VFXOperatorUtility.Dot(inputExpression[2] - inputExpression[0], lineDelta); t = VFXOperatorUtility.Clamp(t / lineLength, VFXValue.Constant(0.0f), VFXValue.Constant(1.0f)); VFXExpression pointOnLine = (inputExpression[0] + VFXOperatorUtility.CastFloat(t, lineDelta.valueType) * lineDelta); VFXExpression lineDistance = VFXOperatorUtility.Distance(inputExpression[2], pointOnLine); return(new VFXExpression[] { pointOnLine, lineDistance }); }
protected override sealed VFXExpression[] BuildExpression(VFXExpression[] inputExpression) { // https://thebookofshaders.com/edit.php#05/cubicpulse.frag // x0 = clamp(x, c - w, c + w) // 1.0 - (abs(x0 - c) / w)^2 * (3.0 - 2.0 * abs(x0 - c) / w) //first, clamp the input var clamp_x = VFXOperatorUtility.Clamp(inputExpression[0], inputExpression[1] - inputExpression[2], inputExpression[1] + inputExpression[2]); var a = new VFXExpressionAbs(clamp_x - inputExpression[1]) / inputExpression[2]; var b = new VFXValue <float>(3.0f) - new VFXExpressionMul(new VFXValue <float>(2.0f), a); var res = new VFXValue <float>(1.0f) - a * a * b; return(new[] { res }); }
protected override VFXExpression[] BuildExpression(VFXExpression[] inputExpression) { VFXExpression input; if (Clamp) { input = VFXOperatorUtility.Clamp(inputExpression[0], inputExpression[1], inputExpression[2]); } else { input = inputExpression[0]; } return(new[] { VFXOperatorUtility.Fit(input, inputExpression[1], inputExpression[2], inputExpression[3], inputExpression[4]) }); }
public void ProcessOperatorClamp() { var a = -1.5f; var b = 0.2f; var c = 0.3f; var result = Mathf.Clamp(a, b, c); var value_a = new VFXValue <float>(a); var value_b = new VFXValue <float>(b); var value_c = new VFXValue <float>(c); var expression = VFXOperatorUtility.Clamp(value_a, value_b, value_c); var context = new VFXExpression.Context(VFXExpressionContextOption.CPUEvaluation); var resultExpression = context.Compile(expression); Assert.AreEqual(result, resultExpression.Get <float>()); }
protected override VFXExpression[] BuildExpression(VFXExpression[] inputExpression) { VFXExpression clamped = VFXOperatorUtility.Clamp(inputExpression[0], inputExpression[1], inputExpression[2]); return(new[] { VFXOperatorUtility.Fit(clamped, inputExpression[1], inputExpression[2], inputExpression[3], inputExpression[4]) }); }
protected override sealed VFXExpression[] BuildExpression(VFXExpression[] inputExpression) { return(new[] { VFXOperatorUtility.Clamp(inputExpression[0], inputExpression[1], inputExpression[2], false) }); }