T Evaluate(const DifferentialGeometry &dg) const { Vector dpdx, dpdy; Point P = mapping->Map(dg, &dpdx, &dpdy); float windStrength = FBm(.1f * P, .1f * dpdx, .1f * dpdy, .5f, 3); float waveHeight = FBm(P, dpdx, dpdy, .5f, 6); return fabsf(windStrength) * waveHeight; }
Spectrum Evaluate(const DifferentialGeometry &dg) const { Vector dpdx, dpdy; Point P = mapping->Map(dg, &dpdx, &dpdy); P *= scale; float marble = P.y + variation * FBm(P, scale * dpdx, scale * dpdy, omega, octaves); float t = .5f + .5f * sinf(marble); // Evaluate marble spline at _t_ static float c[][3] = { { .58f, .58f, .6f }, { .58f, .58f, .6f }, { .58f, .58f, .6f }, { .5f, .5f, .5f }, { .6f, .59f, .58f }, { .58f, .58f, .6f }, { .58f, .58f, .6f }, {.2f, .2f, .33f }, { .58f, .58f, .6f }, }; #define NC sizeof(c) / sizeof(c[0]) #define NSEG (NC-3) int first = Floor2Int(t * NSEG); t = (t * NSEG - first); Spectrum c0(c[first]), c1(c[first+1]), c2(c[first+2]), c3(c[first+3]); // Bezier spline evaluated with de Castilejau's algorithm Spectrum s0 = (1.f - t) * c0 + t * c1; Spectrum s1 = (1.f - t) * c1 + t * c2; Spectrum s2 = (1.f - t) * c2 + t * c3; s0 = (1.f - t) * s0 + t * s1; s1 = (1.f - t) * s1 + t * s2; // Extra scale of 1.5 to increase variation among colors return 1.5f * ((1.f - t) * s0 + t * s1); }
T Evaluate(const DifferentialGeometry &dg) const { Vector dpdx, dpdy; Point P = mapping->Map(dg, &dpdx, &dpdy); return FBm(P, dpdx, dpdy, omega, octaves); }