Snehuliak červenie, kým aktívne cvičí - rastie premenná glow a
mení sa jeho emisívna farba do červena.
Ak prestane cvičiť, glow začne klesať, rovnako ako emisívna farba.
V premennej running_exercises je počet práve prebiehajúcich cvičení
(aj viac naraz), až keď je táto premenná nulová, snehuliak začne blednúť, ak je
červený.
DEF GLOW_ENGINE Script {
field SFInt32 running_exercises 0
field SFFloat glow 0
eventIn SFBool P_V
eventIn SFFloat glow_up
eventIn SFFloat glow_down
eventOut SFBool diminish
eventOut SFColor glow_changed
url "javascript:
function P_V(value)
{
if (value)
{
// P, timer started
diminish = FALSE;
running_exercises++;
}
else
{
// V, timer stopped
running_exercises--;
if (!running_exercises) diminish = TRUE;
}
}
function glow_up()
{
if (glow < 1)
{
glow += 0.02;
glow_changed = new SFColor(0.3 * glow, 0, 0);
}
}
function glow_down()
{
if (glow > 0)
{
glow -= 0.02;
if (glow < 0) glow = 0;
glow_changed = new SFColor(0.3 * glow, 0, 0);
}
else diminish = FALSE;
}
"
}
ROUTE EXERCISE1_TIMER.isActive TO GLOW_ENGINE.P_V
ROUTE EXERCISE1_TIMER.fraction_changed TO GLOW_ENGINE.glow_up
ROUTE EXERCISE2_TIMER.isActive TO GLOW_ENGINE.P_V
ROUTE EXERCISE2_TIMER.fraction_changed TO GLOW_ENGINE.glow_up
ROUTE EXERCISE3_TIMER.isActive TO GLOW_ENGINE.P_V
ROUTE EXERCISE3_TIMER.fraction_changed TO GLOW_ENGINE.glow_up
ROUTE GLOW_ENGINE.glow_changed TO SNOW_MAT_M.emissiveColor
ROUTE GLOW_ENGINE.diminish TO DIMINISH_TIMER.enabled
ROUTE DIMINISH_TIMER.fraction_changed TO GLOW_ENGINE.glow_down
Striedanie dňa a noci je jednoduchá interpolácia troch trojprvkových vektorov obsahujúcich farby v backgrounde. Zároveň sa mení intenzita zdroja denného svetla.
DEF DAYNIGHT_ENGINE Script {
field SFTime now 0
eventIn SFFloat daylight
eventOut SFTime set_day_time
eventOut MFColor set_background
url "javascript:
function initialize()
{
set_day_time = (new Date()).getTime();
}
function daylight(value)
{
if (value < 0.4)
{
t = value / 0.4;
it = 1 - t;
set_background = new MFColor();
set_background[0] = new SFColor(.12*t+.1*it, .2*t+.15*it, .3*t+.2*it);
set_background[1] = new SFColor(.4*t+.1*it, .1*t+.15*it, .5*t+.2*it);
set_background[2] = new SFColor(.7*t+.12*it, .5*t+.2*it, .2*t+.3*it);
}
else
{
t = (value - 0.4) / 0.6;
it = 1 - t;
set_background = new MFColor();
set_background[0] = new SFColor(.25*t+.12*it, .48*t+.2*it, .7*t+.3*it);
set_background[1] = new SFColor(.5*t+.4*it, .7*t+.1*it, .8*t+.5*it);
set_background[2] = new SFColor(.9*t+.7*it, .98*t+.5*it, 1*t+.2*it);
}
}
"
}
ROUTE DAYNIGHT_ENGINE.set_day_time TO SUN_TIMER.startTime
ROUTE SUN_TIMER.fraction_changed TO SUNLIGHT_SCINT.set_fraction
ROUTE SUNLIGHT_SCINT.value_changed TO SUNLIGHT.intensity
ROUTE SUNLIGHT_SCINT.value_changed TO SUNLIGHT.ambientIntensity
ROUTE SUNLIGHT_SCINT.value_changed TO DAYNIGHT_ENGINE.daylight
ROUTE DAYNIGHT_ENGINE.set_background TO BACKGROUND.skyColor