From Volume Cloud Shop
#include "math.h"#pragma opname v_volumecloud#pragma oplabel "Volume Cloud"#pragma opicon SHOP_surface#pragma label diff "Diffuse"#pragma label clouddensity "Cloud Density"#pragma label shadowdensity "Shadow Density"#pragma label phase "Scattering Phase"#pragma label receiveshadows "Receive Shadows"#pragma hint diff color#pragma hint Cd hidden#pragma hint receiveshadows toggle#pragma range clouddensity 0 10#pragma range shadowdensity 0 10#pragma range phase -1 1// Generated by Mantra#pragma hint density hiddensurfacevolumecloud(float density = 1; vector diff=1; vector Cd = 1; float clouddensity = 1; float shadowdensity = 1; float phase = 0; int receiveshadows = 1){ vector clr; float den = density; if (phase == 0) F = diff * Cd * isotropic(); else F = diff * Cd * henyeygreenstein(phase); if (density > 0) { clr = 0; // Allow for different densities for shadowed and non-shadowed // surfaces. if (isshadowray()) den *= shadowdensity; else den *= clouddensity; // Clamp the density den = max(den, 0); // Accumulate light from all directions. illuminance(P, {0, 1, 0}, PI, "density", 1.0) { if (receiveshadows) shadow(Cl); if (phase != 0) clr += Cl * eval_bsdf(F, normalize(-I), normalize(L)); else clr += Cl * 0.5; } Of = (1 - exp(-den*dPdz)); Cf = Of * Cd * diff; Cf *= clr; } else { Of = 0; Cf = 0; }}