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;
    }
}