Source Code

Depth Desaturation

Desaturates images based on there depth channel.

[source code] [compiled]
//-----------------------------------------
// LScript Image Filter - www.StephenCulley.co.uk - Depth Desaturation
//

@version 2.5
@warnings
@script image

Saturation,Minimum,Maximum,Multiply,Distance;

create
{
    Saturation = 0;
    Minimum = -75;
    Maximum = 75;
    Multiply = 2;
    Distance = 25;
    setdesc("www.StephenCulley.co.uk - Depth Desaturation : " + Saturation + " " + Minimum + " " + Maximum + " " + Multiply + " " + Distance);
}

process: ifo
{

    moninit(ifo.height) unless runningUnder() == SCREAMERNET;

    for(i = 1;i <= ifo.height;++i)
    {
        for(j = 1;j <= ifo.width;++j)
        {

            Avg = 256 * (ifo.red[j,i] + ifo.green[j,i] + ifo.blue[j,i]) / 3;

            R = 256 * ifo.red[j,i];
            G = 256 * ifo.green[j,i];
            B = 256 * ifo.blue[j,i];

            if(ifo.depth[j,i] > Distance)
            {
                D = ifo.depth[j,i] - Distance;
            }
            else
            {
                D = 0;
            }
               
            S = (Saturation - D) * Multiply;
            
            if(S < Minimum)
            {
                S = Minimum;
            }
            else
            {
              if(S > Maximum)
              {
              S = Maximum;
              }    
            }

            ifo.red[j,i] = (1 / 256) * (R + S / 100 * (R - Avg));
            ifo.green[j,i] = (1 / 256) * (G + S / 100 * (G - Avg));
            ifo.blue[j,i] = (1 / 256) * (B + S / 100 * (B - Avg));

  
         }

            if(runningUnder() != SCREAMERNET)
            {
                return if monstep();
            }        
    }

    monend() unless runningUnder() == SCREAMERNET;
}

load: what,io
{
    if(what == SCENEMODE)
    {
        Saturation = number(io.read());
        Minimum = number(io.read());
        Maximim = number(io.read());   
        Multiply = number(io.read());       
        Distance = number(io.read());
        setdesc("www.StephenCulley.co.uk - Depth Desaturation : " + Saturation + " " + Minimum + " " + Maximum + " " + Multiply + " " + Distance);
    }
}

save: what,io
{
    if(what == SCENEMODE)
    {
        io.writeln(Saturation);
        io.writeln(Minimum);
        io.writeln(Maximum);
        io.writeln(Multiply);
        io.writeln(Distance);
    }
}

options
{
    reqbegin("Depth Desaturation");
    c1 = ctlnumber("Amount",Saturation);
    c2 = ctlnumber("Minimum",Minimum);
    c3 = ctlnumber("Maximum",Maximum);
    c4 = ctlnumber("Multiply",Multiply);
    c5 = ctlnumber("Distance",Distance);
    return if !reqpost();
    Saturation = getvalue(c1);
    Minimum = getvalue(c2);
    Maximum = getvalue(c3);
    Multiply = getvalue(c4);
    Distance = getvalue(c5);
    setdesc("www.StephenCulley.co.uk - Depth Desaturation : " + Saturation + " " + Minimum + " " + Maximum + " " + Multiply + " " + Distance);
    reqend();
}