LScript (Layout) to animate models expanding in to existence. It is best used upon non subdivided and unwelded polygons.
Compatible with Newtek LightWave 9.6 and above.
// LScript Displacement Map - www.StephenCulley.co.uk
//
// web address: http://www.stephenculley.co.uk
// email address: email@stephenculley.co.uk
/*
LScript Displacement Map - Expand
Displace_Expand.ls
*/
@version 2.2
@warnings
@script displace
@name *Expand
// Title
sTitle = "*Expand";
// Version
sVersion = "v1.0";
// Item
Item;
// Variable
iCount = 0;
iPoint = 0;
iPointCount = 0;
vPosition = <0.0,0.0,0.0>;
// Requester
bRequesterUpdate = false; // Update
iRequesterFrame = -1; // Frame
// Envelope
envAmount; // Amount
// Control
ctrl_c0;
create: obj
{
setdesc(sTitle);
// Item
Item = obj;
// Envelope
envAmount = Envelope("Amount (" + sTitle + ")",CHAN_NUMBER,sTitle); // Amount
envAmount.persist(false);
envAmount.createKey(0,0.0);
// Info
info("*Expand - Use with unwelded polygons without subdivions.");
}
destroy
{
}
newtime: id, frame, time
{
if(reqisopen() && iRequesterFrame != frame)
{
bRequesterUpdate = true; // Update
setvalue(ctrl_c0,envAmount.value(Scene().currenttime)); // Amount
iRequesterFrame = frame; // Frame
bRequesterUpdate = false; // Update
}
// Subpatch Level
SubPatchLevel(0,0);
// Variable
nAmount = clip(0.0,1.0,envAmount.value(time));
iPointCount = Item.pointCount();
nPoint = nAmount * iPointCount;
nFrac = frac(nPoint);
iPoint = nPoint - nFrac;
vPosition = linear1D(Item.position(Item.points[max(1,iPoint)]),Item.position(Item.points[min(iPointCount,iPoint + 1)]),nFrac);
iCount = 0; // Count
}
flags
{
// WORLD LOCAL
return(LOCAL);
}
process: da
{
iCount++; // Count
if(iCount <= iPoint)
{
}
else
{
// da
da.source[1] = vPosition.x;
da.source[2] = vPosition.y;
da.source[3] = vPosition.z;
}
}
// 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);
}
load: what,io
{
if(what == SCENEMODE) // processing an ASCII scene file
{
if(io.read().asStr() == sTitle + " " + sVersion)
{
// Envelope
envAmount.load(); // Amount
}
}
}
save: what,io
{
if(what == SCENEMODE)
{
// Header
io.writeln(sTitle + " " + sVersion);
// Envelope
envAmount.save(); // Amount
}
}
options
{
if(reqisopen())
{
reqend();
return;
}
reqbegin(sTitle + " " + sVersion);
ctrl_c0 = ctlpercent("Amount",envAmount.value(Scene().currenttime)); // Amount
ctrl_c1e = ctlbutton("E",20,"button_c1e"); // Button
// Developer
ctlsep();
ctrl_dev0 = ctltext("","developer: Stephen Culley","http://www.stephenculley.co.uk");
// Refresh
ctlrefresh(ctrl_c0,"refresh_c0"); // Amount
reqopen();
}
button_c1e // Amount
{
envAmount.edit();
}
refresh_c0:value // Amount
{
if(bRequesterUpdate) return; // Requester Update
setvalue(ctrl_c0,clip(0.0,1.0,value));
iKey = envAmount.keyExists(Scene().currenttime);
if(iKey == nil)
{envAmount.createKey(Scene().currenttime,clip(0.0,1.0,value));}
else
{envAmount.setKeyValue(iKey,clip(0.0,1.0,value));}
}
https://drive.google.com/open?id=1cR_q2GVUAJHumic1-A3eXV16acQnVTWs
