<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
<X3D profile='Immersive' version='3.3 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation =' https://www.web3d.org/specifications/x3d-3.3.xsd '>
<head>
<meta name='titlecontent='BackgroundTimeOfDay.x3d'/>
<meta name='descriptioncontent='Interpolate between Background color arrays to show a gradually changing time-of-day effect.'/>
<meta name='creatorcontent='Don Brutzman and MV4205 class'/>
<meta name='createdcontent='22 April 2009'/>
<meta name='modifiedcontent='20 October 2019'/>
<meta name='referencecontent=' https://X3dGraphics.com/examples/X3dForWebAuthors/Chapter11LightingEnvironment/BackgroundSelector.x3d '/>
<meta name='subjectcontent='X3D Background example'/>
<meta name='identifiercontent=' https://X3dGraphics.com/examples/X3dForWebAuthors/Chapter11LightingEnvironmentalEffects/BackgroundTimeOfDay.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<WorldInfo title='BackgroundTimeOfDay.x3d'/>
<Transform translation='0 3 0'>
<Shape>
<Text string='"Background Time Of Day"'>
<FontStyle justify='"MIDDLE" "MIDDLE"'/>
</Text>
<Appearance>
<Material/>
</Appearance>
</Shape>
</Transform>
<!-- ROUTE information for TimeOfDayClock node:  [from fraction_changed to BackgroundColorInterpolator.set_fraction ] -->
<TimeSensor DEF='TimeOfDayClockcycleInterval='6loop='true'/>
<!-- ROUTE information for BackgroundColorInterpolator node:  [from TimeOfDayClock.fraction_changed to set_fraction ] [from groundColor_changed to AnimatedBackground.groundColor ] [from skyColor_changed to AnimatedBackground.skyColor ] -->
<Script DEF='BackgroundColorInterpolator'>
<field name='set_fractiontype='SFFloataccessType='inputOnly'/>
<field name='groundColorSunrisetype='MFColorvalue='0.133 0.419 0 0.36 0.1 0 1 0.74 0.4 1 0.74 0.4 0 0.2 0.75 0 0.1 0.5accessType='initializeOnly'/>
<field name='groundColorNoontype='MFColorvalue='0.133 0.419 0 0.36 0.1 0 1 0.74 0.4 1 0.74 0.4 0 0 0.5 0 0 0.2accessType='initializeOnly'/>
<field name='groundColorSunsettype='MFColorvalue='0.133 0.419 0 0.36 0.1 0 1 0.74 0.4 1 0.74 0.4 0 0 0.5 0 0 0.2accessType='initializeOnly'/>
<field name='groundColorNighttype='MFColorvalue='0.133 0.419 0 0.36 0.1 0 1 0.74 0.4 1 0.74 0.4 0 0 0.5 0 0 0.2accessType='initializeOnly'/>
<field name='skyColorSunrisetype='MFColorvalue='1 1 0.2 1 1 0 0.36 0.63 1 0 0.4 1 0 0.4 1accessType='initializeOnly'/>
<field name='skyColorNoontype='MFColorvalue='0 0.035 0.34 0 0.015 0.44 0 0.05 0.5 0 0.1 0.6 0.44 0.8 1 1 1 0.7accessType='initializeOnly'/>
<field name='skyColorSunsettype='MFColorvalue='0 0 0.38 0 0 0.68 0.5 0.2 1 0.5 0.2 1 1 0.3 0 1 0.2 0.8accessType='initializeOnly'/>
<field name='skyColorNighttype='MFColorvalue='1 1 1 0.8 0.8 0.8 0.1 0.1 0.1 0 0 0 0 0 0accessType='initializeOnly'/>
<field name='groundColor_changedtype='MFColoraccessType='outputOnly'/>
<field name='skyColor_changedtype='MFColoraccessType='outputOnly'/>
<![CDATA[
      
ecmascript:

function initialize()
{
    Browser.print ('groundColorSunrise length=' + groundColorSunrise.length + ' '  + groundColorSunrise.toString() + '\n');
    Browser.print ('groundColorNoon    length=' +    groundColorNoon.length +    ' '  + groundColorNoon.toString() + '\n');
    Browser.print ('groundColorSunset  length=' +  groundColorSunset.length +  ' '  + groundColorSunset.toString() + '\n');
    Browser.print ('groundColorNight   length=' +   groundColorNight.length +   ' '  + groundColorNight.toString() + '\n');
    Browser.print ('skyColorSunrise    length=' +    skyColorSunrise.length +    ' '  + skyColorSunrise.toString() + '\n');
    Browser.print ('skyColorNoon       length=' +       skyColorNoon.length +       ' '  + skyColorNoon.toString() + '\n');
    Browser.print ('skyColorSunset     length=' +     skyColorSunset.length +     ' '  + skyColorSunset.toString() + '\n');
    Browser.print ('skyColorNight      length=' +      skyColorNight.length +      ' '  + skyColorNight.toString() + '\n');
}
function set_fraction (fraction) // fraction is input value sent by TimeSensor clock
{
    // Sunrise to Noon, fraction 0.0 to 0.25, interval=0.25
    if      (fraction < 0.25)
    {
        groundColor_changed = interpolate (groundColorSunrise, groundColorNoon, fraction, 0.00, 0.25);
           skyColor_changed = interpolate (   skyColorSunrise,    skyColorNoon, fraction, 0.00, 0.25);
    }
    // Noon to Evening, fraction 0.25 to 0.5, interval=0.25
    else if (fraction < 0.5)
    {
        groundColor_changed = interpolate (groundColorNoon, groundColorSunset, fraction, 0.25, 0.25);
           skyColor_changed = interpolate (   skyColorNoon,    skyColorSunset, fraction, 0.25, 0.25);
    }
    // Evening to Night, fraction 0.5 to 0.6, interval=0.1
    else if (fraction < 0.6)
    {
        groundColor_changed = interpolate (groundColorSunset, groundColorNight, fraction, 0.5, 0.1);
           skyColor_changed = interpolate (   skyColorSunset,    skyColorNight, fraction, 0.5, 0.1);
    }
    // Night (unchanging), fraction 0.6 to 0.95, interval=0.35
    else if (fraction < 0.95)
    {
        groundColor_changed = groundColorNight;
           skyColor_changed = skyColorNight;
    }
    // Night to Sunrise, fraction 0.95 to 1.0, interval=0.05
    else // (fraction < 1.0)
    {
        groundColor_changed = interpolate (groundColorNight, groundColorSunrise, fraction, 0.95, 0.05);
           skyColor_changed = interpolate (   skyColorNight,    skyColorSunrise, fraction, 0.95, 0.05);
    }
//    Browser.print ('groundColor_changed=' + groundColor_changed.toString() + '\n');
//    Browser.print ('   skyColor_changed=' +    skyColor_changed.toString() + '\n');
}
function interpolate (firstColorArray, secondColorArray, fraction, initialFraction, interval)
{
    f = (fraction - initialFraction) / interval; // f should range from 0 to 1
//  Browser.print ('initialFraction=' + initialFraction + ', fraction=' + fraction + ', f=' + f + '\n');

    color0 = firstColorArray[0] + (secondColorArray[0] - firstColorArray[0]) * f;
    color1 = firstColorArray[1] + (secondColorArray[1] - firstColorArray[1]) * f;
    color2 = firstColorArray[2] + (secondColorArray[2] - firstColorArray[2]) * f;
    color3 = firstColorArray[3] + (secondColorArray[3] - firstColorArray[3]) * f;
    color4 = firstColorArray[4] + (secondColorArray[4] - firstColorArray[4]) * f;
    return new MFColor (color0, color1, color2, color3, color4);
}

    
]]>
</Script>
<ROUTE fromNode='TimeOfDayClockfromField='fraction_changedtoNode='BackgroundColorInterpolatortoField='set_fraction'/>
<!-- ROUTE information for AnimatedBackground node:  [from BackgroundColorInterpolator.groundColor_changed to groundColor ] [from BackgroundColorInterpolator.skyColor_changed to skyColor ] -->
<Background DEF='AnimatedBackgroundgroundAngle='0.03 1.26 1.5 1.57groundColor='0.133333 0.419608 0 0.36 0.1 0 1 0.74 0.4 0 0 0.5 0 0 0.2skyAngle='0.03 0.05 1.5 1.57skyColor='1 1 1 0.8 0.8 0.8 0.1 0.1 0.1 0 0 0 0 0 0'/>
<ROUTE fromNode='BackgroundColorInterpolatorfromField='groundColor_changedtoNode='AnimatedBackgroundtoField='groundColor'/>
<ROUTE fromNode='BackgroundColorInterpolatorfromField='skyColor_changedtoNode='AnimatedBackgroundtoField='skyColor'/>
</Scene>
</X3D>
<!--

Index for DEF nodes : AnimatedBackground, BackgroundColorInterpolator, TimeOfDayClock
-->

<!-- Color key: <X3dNode DEF='idName' field='value'/> matches <XmlElement DEF='idName' attribute='value'/>
(Light blue background: behavior node) (Grey background: inserted documentation) (Magenta background: X3D Extensibility)
-->

<!-- For additional help information about X3D scenes, please see X3D Tooltips, X3D Resources and X3D Scene Authoring Hints. -->