LScript (Layout) applies a Game Boy style look.
Compatible with Newtek LightWave 9.6 and above.
// LScript Image Filter - www.StephenCulley.co.uk
//
// web address: http://www.stephenculley.co.uk
// email address: email@stephenculley.co.uk
/*
LScript Image Filter - Game Boy
Image_GameBoy.ls
*/
@version 2.5
@warnings
@script image
@name *Game Boy
// Title
sTitle = "*Game Boy";
// Version
sVersion = "v1.0";
nCorrection = 7.5;
iPixelSize = 4;
nGridAmount = 0.5;
iGridWidth = 1;
aColor;
// Control
ctrl_c0;
create
{
setdesc(sTitle);
aColor[1] = <(1 / 255) * 23,(1 / 255) * 74,(1 / 255) * 3>;
aColor[2] = <(1 / 255) * 39,(1 / 255) * 82,(1 / 255) * 3>;
aColor[3] = <(1 / 255) * 88,(1 / 255) * 114,(1 / 255) * 3>;
aColor[4] = <(1 / 255) * 111,(1 / 255) * 127,(1 / 255) * 3>;
aColor[5] = <(1 / 255) * 131,(1 / 255) * 137,(1 / 255) * 3>;
aColor[6] = <(1 / 255) * 150,(1 / 255) * 160,(1 / 255) * 3>;
}
process: ifo
{
// Error
if(iPixelSize < 2){return;}
if(ifo.width < 1 || ifo.height < 1){return;}
iGridX = ceil(ifo.width / iPixelSize);
iGridY = ceil(ifo.height / iPixelSize);
iGridXOffset = abs((ifo.width - (iGridX * iPixelSize)) * 0.5);
iGridYOffset = abs((ifo.height - (iGridY * iPixelSize)) * 0.5);
iProgress = iGridX * iGridY;
if(runningUnder() != SCREAMERNET) moninit(iProgress);
for(y = 0;y <= iGridY - 1; ++y)
{
for(x = 0;x <= iGridX - 1; ++x)
{
v1 = ;
v2 = ;
// Draw
gameboyIFO(ifo,v1,v2);
if(runningUnder() != SCREAMERNET) if(monstep()) return;
}
}
}
gameboyIFO: ifo,v1,v2 // vector,red,green,blue
{
// Order
if(v1.x > v2.x){n = v2.x;v2.x = v1.x; v1.x = n;}
if(v1.y > v2.y){n = v2.y;v2.y = v1.y; v1.y = n;}
if(v1.x < 1 || v2.x > ifo.width ||
v1.y < 1 || v2.y > ifo.height)
{
// Offscreen
if(v2.x < 1){return;}
if(v1.x > ifo.width){return;}
if(v2.y < 1){return;}
if(v1.y > ifo.width){return;}
// Clip
if(v1.x < 1){v1.x = 1;}
if(v1.x > ifo.width){v1.x = ifo.width;}
if(v1.y < 1){v1.y = 1;}
if(v1.y > ifo.height){v1.y = ifo.height;}
if(v2.x < 1){v2.x = 1;}
if(v2.x > ifo.width){v2.x = ifo.width;}
if(v2.y < 1){v2.y = 1;}
if(v2.y > ifo.height){v2.y = ifo.height;}
}
r = 0.0;
g = 0.0;
b = 0.0;
c = 0;
// Average
for(y = v1.y; y <= v2.y; ++y)
{
for(x = v1.x; x <= v2.x; ++x)
{
r += ifo.red[x,y];
g += ifo.green[x,y];
b += ifo.blue[x,y];
++c;
}
}
if(c > 1)
{
r *= 1 / c;
g *= 1 / c;
b *= 1 / c;
}
a = (r + g + b) * (1 / 3);
a = round(a * nCorrection,0);
a = max(min(a,5),1);
r = aColor[a].x;
g = aColor[a].y;
b = aColor[a].z;
l1 = nGridAmount;
l2 = 1.0 - nGridAmount;
if(iGridWidth <= 0)
{
// Draw
for(y = v1.y; y <= v2.y; ++y)
{
for(x = v1.x; x <= v2.x; ++x)
{
ifo.red[x,y] = r;
ifo.green[x,y] = g;
ifo.blue[x,y] = b;
ifo.alpha[x,y] = 1.0;
}
}
}
else if(iGridWidth == 1)
{
// Draw
for(y = v1.y; y <= v2.y; ++y)
{
for(x = v1.x; x <= v2.x; ++x)
{
if(x == v1.x || y == v1.y)
{
ifo.red[x,y] = (aColor[6].x * l1) + (r * l2);
ifo.green[x,y] = (aColor[6].y * l1) + (g * l2);
ifo.blue[x,y] = (aColor[6].z * l1) + (b * l2);
ifo.alpha[x,y] = 1.0;
}
else
{
ifo.red[x,y] = r;
ifo.green[x,y] = g;
ifo.blue[x,y] = b;
ifo.alpha[x,y] = 1.0;
}
}
}
}
else if(iGridWidth > 1)
{
// Draw
for(y = v1.y; y <= v2.y; ++y)
{
for(x = v1.x; x <= v2.x; ++x)
{
if(x <= (v1.x + (iGridWidth - 1)) || x >= (v2.x - iGridWidth) || y <= (v1.y + (iGridWidth - 1)) || y >= (v2.y - iGridWidth))
{
ifo.red[x,y] = (aColor[6].x * l1) + (r * l2);
ifo.green[x,y] = (aColor[6].y * l1) + (g * l2);
ifo.blue[x,y] = (aColor[6].z * l1) + (b * l2);
ifo.alpha[x,y] = 1.0;
}
else
{
ifo.red[x,y] = r;
ifo.green[x,y] = g;
ifo.blue[x,y] = b;
ifo.alpha[x,y] = 1.0;
}
}
}
}
}
load: what,io
{
if(what == SCENEMODE) // processing an ASCII scene file
{
if(io.read().asStr() == sTitle + " " + sVersion)
{
nCorrection = io.read().asNum();
iPixelSize = io.read().asInt();
nGridAmount = io.read().asNum();
iGridWidth = io.read().asInt();
}
}
}
save: what,io
{
if(what == SCENEMODE)
{
// Header
io.writeln(sTitle + " " + sVersion);
io.writeln(nCorrection);
io.writeln(iPixelSize);
io.writeln(nGridAmount);
io.writeln(iGridWidth);
}
}
options
{
reqbegin(sTitle + " " + sVersion);
// Control
ctrl_c0 = ctlnumber("Correction",nCorrection); // Correction
ctrl_c1 = ctlinteger("Pixel Size",iPixelSize); // Pixel Size
ctrl_c2 = ctlpercent("Grid Amount",nGridAmount); // Grid Amount
ctrl_c3 = ctlinteger("Grid Width",iGridWidth); // Grid Width
// Developer
ctlsep();
ctrl_dev0 = ctltext("","developer: Stephen Culley","http://www.stephenculley.co.uk");
return if !reqpost();
nCorrection = getvalue(ctrl_c0); // Correction
iPixelSize = getvalue(ctrl_c1); // Pixel Size
nGridAmount = getvalue(ctrl_c2); // Grid Amount
iGridWidth = getvalue(ctrl_c3); // Grid Width
}
All scripts available at my Google Drive at
https://drive.google.com/open?id=1cR_q2GVUAJHumic1-A3eXV16acQnVTWs