+ return (
+ v00 * (1 - tx) * (1 - ty) +
+ v10 * tx * (1 - ty) +
+ v01 * (1 - tx) * ty +
+ v11 * tx * ty
+ );
+#endif
+ float u = linearInterpolation(v00, v10, tx);
+ float v = linearInterpolation(v01, v11, tx);
+ return linearInterpolation(u, v, ty);
+}
+
+
+inline float biLinearInterpolationNoEase(
+ float v00, float v10,
+ float v01, float v11,
+ float x, float y)
+{
+ float u = linearInterpolation(v00, v10, x);
+ float v = linearInterpolation(v01, v11, x);
+ return linearInterpolation(u, v, y);
+}
+
+
+float triLinearInterpolation(
+ float v000, float v100, float v010, float v110,
+ float v001, float v101, float v011, float v111,
+ float x, float y, float z)
+{
+ float tx = easeCurve(x);
+ float ty = easeCurve(y);
+ float tz = easeCurve(z);
+#if 0
+ return (
+ v000 * (1 - tx) * (1 - ty) * (1 - tz) +
+ v100 * tx * (1 - ty) * (1 - tz) +
+ v010 * (1 - tx) * ty * (1 - tz) +
+ v110 * tx * ty * (1 - tz) +
+ v001 * (1 - tx) * (1 - ty) * tz +
+ v101 * tx * (1 - ty) * tz +
+ v011 * (1 - tx) * ty * tz +
+ v111 * tx * ty * tz
+ );
+#endif
+ float u = biLinearInterpolationNoEase(v000, v100, v010, v110, tx, ty);
+ float v = biLinearInterpolationNoEase(v001, v101, v011, v111, tx, ty);
+ return linearInterpolation(u, v, tz);
+}
+
+float triLinearInterpolationNoEase(
+ float v000, float v100, float v010, float v110,
+ float v001, float v101, float v011, float v111,
+ float x, float y, float z)
+{
+ float u = biLinearInterpolationNoEase(v000, v100, v010, v110, x, y);
+ float v = biLinearInterpolationNoEase(v001, v101, v011, v111, x, y);
+ return linearInterpolation(u, v, z);
+}
+
+
+#if 0
+float noise2d_gradient(float x, float y, int seed)