Volume Cloud
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 hidden
surface
volumecloud(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;
}
}