Fading

Weiche, fließende Farbübergänge zwischen zwei Farben. Beim ersten Skript fliessen die Farben zwischen zwei vorgegebenen hin und her, beim zweiten werden die Farben zufällig erzeugt.

Die Geschwindigkeit kann mit den Variablen STEP und Time eingestellt werden, je höher STEP desto schneller geht es. Umgekehrt ist es bei Time.

Colors 1

// script copyright by Rebekka Revnik

// Dieses Skript bildet Farb?bergänge zwischen zwei Farben

// die beiden Farben
vector StartColor = <0.5, 0, 0.5>;
vector EndColor = <0, 0.5, 0>;

integer STEP = 1;	// Schrittweite (je höher desto schneller gehts)
float Time = 0.03;	// Zeit für neuen Farbwert

float red;
float green;
float blue;
float dest_red;
float dest_green;
float dest_blue;
float step_red;
float step_green;
float step_blue;

integer Status = FALSE;
integer DisplaySides = ALL_SIDES;

list Prims;
integer Count;

InitSteps()
{
	float xr;
	float xg;
	float xb;
	float dx;
	red = StartColor.x *255;
	green = StartColor.y * 255;
	blue = StartColor.z * 255;
	dest_red = EndColor.x * 255;
	dest_green = EndColor.y * 255;
	dest_blue = EndColor.z * 255;
	xr = llFabs(dest_red - red);
	xg = llFabs(dest_green - green);
	xb = llFabs(dest_blue - blue);
	if (xr > xg) dx = xr; else dx = xg;
	if (xb > dx) dx = xb;
	dx = (float)llFloor(dx / STEP);
	step_red = (dest_red - red) / dx;
	step_green = (dest_green - green) / dx;
	step_blue = (dest_blue - blue) / dx;
}

integer Check(float src, float dst, float dx)
{
	float x;
	if (dx < 0)
	{
		x = src;
		src = dst;
		dst = x;
	}
	return (llFloor(src) >= llFloor(dst));
}

SetColor(vector v)
{
	integer i;
	llSetColor(v, DisplaySides);
	for(i = 0; i < Count; i++) llSetLinkColor(llList2Integer(Prims, i), v, DisplaySides);
}

default
{
	state_entry()
	{
		Prims = [];
	}
	on_rez(integer start_param)
	{
		llMessageLinked(LINK_ALL_CHILDREN, 1000, "", NULL_KEY);
	}
	touch_start(integer total_number)
	{
		if(llDetectedKey(0) == llGetOwner())
		{
			if (Status)
			{
                llSetTimerEvent(0.0);
			} else
			{
                InitSteps();
                llSetColor(&l;tred/255,green/255,blue/255>, DisplaySides);
                llSetTimerEvent(Time);
            }
            Status = !Status;
        }
    }
	timer()
	{
		if (Check(red,dest_red,step_red) && Check(green,dest_green,step_green) && Check(blue,dest_blue,step_blue))
		{
			vector v = StartColor;
			StartColor = EndColor;
			EndColor = v;
			InitSteps();
		}
		blue += step_blue;
		green += step_green;
		red += step_red;
		SetColor(<red/255,green/255,blue/255>);
	}
	link_message(integer sender_number, integer number, string message, key id)
	{
		if(number == 1000)
		{
			Prims += [sender_number];
			Count = llGetListLength(Prims);
		}
	}

Colors 2

// script copyright by Rebekka Revnik

// Dieses Skript färbt ein Objekt zufällig mit Farbübergängen

integer STEP = 1;	// Schrittweite
float Time = 0.03;	// Zeit für neuen Farbwert

float red;
float green;
float blue;
float dest_red;
float dest_green;
float dest_blue;
float step_red;
float step_green;
float step_blue;

integer Status = FALSE;
integer DisplaySides = ALL_SIDES;

InitSteps()
{
	float xr;
	float xg;
	float xb;
	float dx;
	red = dest_red;
	green = dest_green;
	blue = dest_blue;
	dest_red = llFrand(256);
	dest_green = llFrand(256);
	dest_blue = llFrand(256);
	xr = llFabs(dest_red - red);
	xg = llFabs(dest_green - green);
	xb = llFabs(dest_blue - blue);
	if (xr > xg) dx = xr; else dx = xg;
	if (xb > dx) dx = xb;
	dx = (float)llFloor(dx / STEP);
	step_red = (dest_red - red) / dx;
	step_green = (dest_green - green) / dx;
	step_blue = (dest_blue - blue) / dx;
}

integer Check(float src, float dst, float dx)
{
	float x;
	if (dx < 0)
	{
		x = src;
		src = dst;
		dst = x;
	}
	return (llFloor(src) <= llFloor(dst));
}

default
{
	on_rez(integer start_param)
	{
		llResetScript();
	}
	state_entry()
	{
		dest_red = llFrand(256);
		dest_green = llFrand(256);
		dest_blue = llFrand(256);
		Status = FALSE;
	}
	touch_start(integer total_number)
	{
		if (Status)
		{
			Status = FALSE;
			llSetTimerEvent(0.0);
			llResetScript();
		} else
		{
			Status = TRUE;
			InitSteps();
			llSetColor(<red/255,green/255,blue/255>, DisplaySides);
			llSetTimerEvent(Time);
		}
	}
	timer()
	{
		if (Check(red,dest_red,step_red) && Check(green,dest_green,step_green) && Check(blue,dest_blue,step_blue)) InitSteps();
		blue += step_blue;
		green += step_green;
		red += step_red;
		llSetColor(<red/255,green/255,blue/255>, DisplaySides);
	}
}