{ "X3D": {
    "encoding":"UTF-8",
    "@profile":"Immersive",
    "@version":"3.3",
    "@xsd:noNamespaceSchemaLocation":"https://www.web3d.org/specifications/x3d-3.3.xsd",
    "JSON schema":"https://www.web3d.org/specifications/x3d-4.0-JSONSchema.autogenerated.json",
    "head": {
        "meta": [
          {
            "@name":"title",
            "@content":"BackgroundTimeOfDay.x3d"
          },
          {
            "@name":"description",
            "@content":"Interpolate between Background color arrays to show a gradually changing time-of-day effect."
          },
          {
            "@name":"creator",
            "@content":"Don Brutzman and MV4205 class"
          },
          {
            "@name":"created",
            "@content":"22 April 2009"
          },
          {
            "@name":"modified",
            "@content":"20 October 2019"
          },
          {
            "@name":"reference",
            "@content":"https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter11LightingEnvironment/BackgroundSelector.x3d"
          },
          {
            "@name":"subject",
            "@content":"X3D Background example"
          },
          {
            "@name":"identifier",
            "@content":"https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter11LightingEnvironmentalEffects/BackgroundTimeOfDay.x3d"
          },
          {
            "@name":"generator",
            "@content":"X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit"
          },
          {
            "@name":"license",
            "@content":"../license.html"
          },
          {
            "@name":"translated",
            "@content":"17 April 2026"
          },
          {
            "@name":"generator",
            "@content":"X3dToJson.xslt, https://www.web3d.org/x3d/stylesheets/X3dToJson.html"
          },
          {
            "@name":"reference",
            "@content":"X3D JSON encoding: https://www.web3d.org/wiki/index.php/X3D_JSON_Encoding"
          }
        ]
    },
    "Scene": {
        "-children":[
          { "WorldInfo":
            {
              "@title":"BackgroundTimeOfDay.x3d"
            }
          },
          { "Transform":
            {
              "@translation":[0,3,0],
              "-children":[
                { "Shape":
                  {
                    "-geometry":
                      { "Text":
                        {
                          "@string":["Background Time Of Day"],
                          "-fontStyle":
                            { "FontStyle":
                              {
                                "@justify":["MIDDLE","MIDDLE"]
                              }
                            }
                        }
                      },
                    "-appearance":
                      { "Appearance":
                        {
                          "-material":
                            { "Material":
                              {
                              }
                            }
                        }
                      }
                  }
                }
              ]
            }
          },
          { "TimeSensor":
            {
              "@DEF":"TimeOfDayClock",
              "@cycleInterval":6,
              "@loop":true
            }
          },
          { "Script":
            {
              "@DEF":"BackgroundColorInterpolator",
              "field": [
                {
                  "@name":"set_fraction",
                  "@accessType":"inputOnly",
                  "@type":"SFFloat"
                },
                {
                  "@name":"groundColorSunrise",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[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.5]
                },
                {
                  "@name":"groundColorNoon",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[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.2]
                },
                {
                  "@name":"groundColorSunset",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[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.2]
                },
                {
                  "@name":"groundColorNight",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[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.2]
                },
                {
                  "@name":"skyColorSunrise",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[1,1,0.2,1,1,0,0.36,0.63,1,0,0.4,1,0,0.4,1]
                },
                {
                  "@name":"skyColorNoon",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[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.7]
                },
                {
                  "@name":"skyColorSunset",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[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.8]
                },
                {
                  "@name":"skyColorNight",
                  "@accessType":"initializeOnly",
                  "@type":"MFColor",
                  "@value":[1,1,1,0.8,0.8,0.8,0.1,0.1,0.1,0,0,0,0,0,0]
                },
                {
                  "@name":"groundColor_changed",
                  "@accessType":"outputOnly",
                  "@type":"MFColor"
                },
                {
                  "@name":"skyColor_changed",
                  "@accessType":"outputOnly",
                  "@type":"MFColor"
                }
              ],
              "#sourceCode":[
"",
"",
"ecmascript:",
"",
"function initialize()",
"{",
"    Browser.println ('groundColorSunrise length=' + groundColorSunrise.length + ' '  + groundColorSunrise.toString());",
"    Browser.println ('groundColorNoon    length=' +    groundColorNoon.length +    ' '  + groundColorNoon.toString());",
"    Browser.println ('groundColorSunset  length=' +  groundColorSunset.length +  ' '  + groundColorSunset.toString());",
"    Browser.println ('groundColorNight   length=' +   groundColorNight.length +   ' '  + groundColorNight.toString());",
"    Browser.println ('skyColorSunrise    length=' +    skyColorSunrise.length +    ' '  + skyColorSunrise.toString());",
"    Browser.println ('skyColorNoon       length=' +       skyColorNoon.length +       ' '  + skyColorNoon.toString());",
"    Browser.println ('skyColorSunset     length=' +     skyColorSunset.length +     ' '  + skyColorSunset.toString());",
"    Browser.println ('skyColorNight      length=' +      skyColorNight.length +      ' '  + skyColorNight.toString());",
"}",
"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.println ('groundColor_changed=' + groundColor_changed.toString());",
"//    Browser.println ('   skyColor_changed=' +    skyColor_changed.toString());",
"}",
"function interpolate (firstColorArray, secondColorArray, fraction, initialFraction, interval)",
"{",
"    f = (fraction - initialFraction) / interval; // f should range from 0 to 1",
"//  Browser.println ('initialFraction=' + initialFraction + ', fraction=' + fraction + ', f=' + f);",
"",
"    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);",
"}",
"",
""
]
            }
          },
          { "ROUTE":
            {
              "@fromField":"fraction_changed",
              "@fromNode":"TimeOfDayClock",
              "@toField":"set_fraction",
              "@toNode":"BackgroundColorInterpolator"
            }
          },
          { "Background":
            {
              "@DEF":"AnimatedBackground",
              "@groundAngle":[0.03,1.26,1.5,1.57],
              "@groundColor":[0.133333,0.419608,0,0.36,0.1,0,1,0.74,0.4,0,0,0.5,0,0,0.2],
              "@skyAngle":[0.03,0.05,1.5,1.57],
              "@skyColor":[1,1,1,0.8,0.8,0.8,0.1,0.1,0.1,0,0,0,0,0,0]
            }
          },
          { "ROUTE":
            {
              "@fromField":"groundColor_changed",
              "@fromNode":"BackgroundColorInterpolator",
              "@toField":"groundColor",
              "@toNode":"AnimatedBackground"
            }
          },
          { "ROUTE":
            {
              "@fromField":"skyColor_changed",
              "@fromNode":"BackgroundColorInterpolator",
              "@toField":"skyColor",
              "@toNode":"AnimatedBackground"
            }
          }
        ]
    }
  }
}