Compatible with Newtek LightWave 9.6 and above.
// LScript Channel Filter - www.StephenCulley.co.uk
//
// web address: http://www.stephenculley.co.uk
// email address: email@stephenculley.co.uk
/*
LScript Channel Filter - Velocity Noise
Channel_VelocityNoise.ls
*/
@version 2.2
@warnings
@script channel
@name *Velocity Noise
// Title
sTitle = "*Velocity Noise";
// Version
sVersion = "v1.0";
// Item
Item = nil;
ItemName = "nil";
iSeed = 1; // Seed
iType = 1; // Type noise values.. -1.0..1.0 0.0..1.0 -1.0..0.0
nScale0 = 0.0; // Scale
nScale1 = 1.0; // Scale
nSpeed0 = 100.0; // Speed
nSpeed1 = 10.0; // Speed
vOffset; // Offset
// Controls
ctrl_c0,ctrl_c1,ctrl_c2,ctrl_c3,ctrl_c4,ctrl_c5,ctrl_c6;
create: channel
{
setdesc(sTitle);
vOffset = ;
}
destroy
{
// take care of final clean-up activities here
}
process: ca, frame, time
{
nValue = ca.get(time);
if(ItemName != "nil") {Item = Mesh(ItemName); ItemName = "nil";}
if(Item)
{
// Velocity
nVelocity = distance3D(Item.getWorldPosition(time - (1 / Scene().fps)),Item.getWorldPosition(time + (1 / Scene().fps)));
// Scale
nScale = linear1D(nScale0,nScale1,nVelocity);
// Speed
nSpeed = linear1D(nSpeed0,nSpeed1,nVelocity);
// Add Noise
nValue += (cosinenoise3D(<0.0,0.0,time * nSpeed> + vOffset) * nScale);
// ca
ca.set(nValue);
}
}
// CLIP
clip: min,max,n
{
if(n < min) n = min;
if(n > max) n = max;
return(n);
}
// INTERPOLATION
linear1D: n1,n2,i // i = interpolation point (0-1)
{
return(n1 * (1 - i) + n2 * i);
}
cosine1D: n1,n2,i // i = interpolation point (0-1)
{
i2 = (1 - cos(i * 3.1415926535)) * 0.5;
return(n1 * (1 - i2) + n2 * i2);
}
// NOISE
_noiseseed = 1;
_noiseresolution = 256;
_noise = nil;
_noiseoffset = nil;
_noiseperm = nil;
noiseinit
{
randomseed(_noiseseed); // Random Seed
if(iType == 3) // -1.0..0.0
{
for(iN = 1; iN <= _noiseresolution; iN++)
{
_noise[iN] = random() - 1.0;
_noiseperm[iN] = wrap(1,_noiseresolution,floor(random() * _noiseresolution));
}
}
else if(iType == 2) // 0.0..1.0
{
for(iN = 1; iN <= _noiseresolution; iN++)
{
_noise[iN] = random();
_noiseperm[iN] = wrap(1,_noiseresolution,floor(random() * _noiseresolution));
}
}
else // -1.0..1.0
{
for(iN = 1; iN <= _noiseresolution; iN++)
{
_noise[iN] = (random() * 2) - 1.0;
_noiseperm[iN] = wrap(1,_noiseresolution,floor(random() * _noiseresolution));
}
}
for(iO = 1; iO <= 64; iO++)
{
_noiseoffset[iO] = ;
}
}
noiseseed: seed
{
_noiseseed = seed;
noiseinit(); // Init
}
noiseresolution: resolution
{
_noiseresolution = resolution;
noiseinit(); // Init
}
noiseperm1D: n // i
{
if(_noiseperm == nil){noiseinit();} // Init
return(_noiseperm[wrap(1,_noiseresolution,floor(n))]);
}
noiseperm2D: v // n
{
return(noiseperm1D(v.y + noiseperm1D(v.x)));
}
noiseperm3D: v // n
{
return(noiseperm1D(v.z + noiseperm2D(v)));
}
noise1D: n // n
{
if(_noise == nil){noiseinit();} // Init
return(_noise[noiseperm1D(n)]);
}
noise2D: v // n
{
if(_noise == nil){noiseinit();} // Init
return(_noise[noiseperm2D(v)]);
}
noise3D: v // n
{
if(_noise == nil){noiseinit();} // Init
return(_noise[noiseperm3D(v)]);
}
cosinenoise3D: v // n
{
v = wrap(1,_noiseresolution,v);
vFrac = frac(v);
vInt = v - vFrac;
nA1 = noise3D();
nA2 = noise3D();
nA3 = noise3D();
nA4 = noise3D();
nA = cosine1D(cosine1D(nA1,nA2,vFrac.x),cosine1D(nA3,nA4,vFrac.x),vFrac.z);
nB1 = noise3D();
nB2 = noise3D();
nB3 = noise3D();
nB4 = noise3D();
nB = cosine1D(cosine1D(nB1,nB2,vFrac.x),cosine1D(nB3,nB4,vFrac.x),vFrac.z);
return(cosine1D(nA,nB,vFrac.y));
}
// RANDOM
_randomseed = 0; // n Seed
randomseed: seed
{
_randomseed = seed;
}
random
{
n = (_randomseed * 214013 + 2531011) % 2^^24;
_randomseed = n;
n /= 2^^24; // 0..1
return(n);
}
// WRAP
wrap: min,max,n
{
n = n - floor((n - min) / (max - min)) * (max - min);
if(n < 0) n = n + max - min; // error check
return(n);
}
// VECTOR 3D
distance3D: v1, v2 // n
{
// Vector
return(sqrt(((v2.x - v1.x) * (v2.x - v1.x)) +
((v2.y - v1.y) * (v2.y - v1.y)) +
((v2.z - v1.z) * (v2.z - v1.z))));
}
load: what,io
{
if(what == SCENEMODE) // processing an ASCII scene file
{
ItemName = io.read().asStr();
iSeed = io.read().asInt();
iType = io.read().asInt();
nScale0 = io.read().asNum();
nScale1 = io.read().asNum();
nSpeed0 = io.read().asNum();
nSpeed1 = io.read().asNum();
noiseseed(iSeed); // Noise Seed
}
}
save: what,io
{
if(what == SCENEMODE)
{
if(Item != nil)
{
io.writeln(string(Item.name));
}
else
{
io.writeln("nil");
}
io.writeln(iSeed);
io.writeln(iType);
io.writeln(nScale0);
io.writeln(nScale1);
io.writeln(nSpeed0);
io.writeln(nSpeed1);
}
}
options
{
if(reqisopen())
{
reqend();
return;
}
reqbegin(sTitle + " " + sVersion);
ctrl_c0 = ctlallitems("Item",Item);
ctrl_c1 = ctlinteger("Seed",iSeed);
ctrl_c2 = ctlchoice("Type",iType,@"+/-","+","-"@);
ctrl_c3 = ctlpercent("Scale @ 0m/s",nScale0);
ctrl_c4 = ctlpercent("Scale @ 1m/s",nScale1);
ctrl_c5 = ctlpercent("Speed @ 0m/s",nSpeed0 * 0.01);
ctrl_c6 = ctlpercent("Speed @ 1m/s",nSpeed1 * 0.01);
// Developer
ctlsep();
ctrl_dev0 = ctltext("","developer: Stephen Culley","http://www.stephenculley.co.uk");
// Refresh
ctlrefresh(ctrl_c0,"refresh_c0"); // Item
ctlrefresh(ctrl_c1,"refresh_c1"); // Seed
ctlrefresh(ctrl_c2,"refresh_c2"); // Type
ctlrefresh(ctrl_c3,"refresh_c3"); // Scale 0
ctlrefresh(ctrl_c4,"refresh_c4"); // Scale 1
ctlrefresh(ctrl_c5,"refresh_c5"); // Speed 0
ctlrefresh(ctrl_c6,"refresh_c6"); // Speed 1
reqopen();
}
refresh_c0:value // Item
{
Item = value;
}
refresh_c1:value // Seed
{
iSeed = clip(1,9999999999,value);
setvalue(ctrl_c1,iSeed);
noiseseed(iSeed); // Noise Seed
}
refresh_c2:value // Type
{
iType = value;
noiseseed(iSeed); // Noise Seed
}
refresh_c3:value // Scale 0
{
nScale0 = value;
}
refresh_c4:value // Scale 1
{
nScale1 = value;
}
refresh_c5:value // Speed 0
{
nSpeed0 = value * 100.0;
}
refresh_c6:value // Speed 1
{
nSpeed1 = value * 100.0;
}
https://drive.google.com/open?id=1cR_q2GVUAJHumic1-A3eXV16acQnVTWs
No comments:
Post a Comment