{ "X3D": {
    "encoding":"UTF-8",
    "@profile":"Immersive",
    "@version":"3.0",
    "@xsd:noNamespaceSchemaLocation":"https://www.web3d.org/specifications/x3d-3.0.xsd",
    "JSON schema":"https://www.web3d.org/specifications/x3d-4.0-JSONSchema.autogenerated.json",
    "head": {
        "meta": [
          {
            "@name":"title",
            "@content":"EventUtilityExamples.x3d"
          },
          {
            "@name":"description",
            "@content":"Event utility node examples for boolean filtering and other event utility nodes."
          },
          {
            "@name":"creator",
            "@content":"Don Brutzman"
          },
          {
            "@name":"created",
            "@content":"3 November 2002"
          },
          {
            "@name":"modified",
            "@content":"20 January 2020"
          },
          {
            "@name":"subject",
            "@content":"BooleanFilter BooleanToggle BooleanTrigger IntegerTrigger TimeTrigger"
          },
          {
            "@name":"identifier",
            "@content":"https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.x3d"
          },
          {
            "@name":"generator",
            "@content":"X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit"
          },
          {
            "@name":"license",
            "@content":"../license.html"
          },
          {
            "@name":"translated",
            "@content":"20 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":[
          {
            "#comment":"========================================"
          },
          {
            "#comment":"ExternProtoDeclare definitions are used here only for language development - do not copy into other scenes!"
          },
          {
            "#comment":"ExternProtoDeclare node support is provided either by X3D-compliant browser or X3dToVrml97.xslt ExternProtoDeclare definitions."
          },
          {
            "#comment":"========================================"
          },
          { "WorldInfo":
            {
              "@title":"EventUtilityExamples.x3d"
            }
          },
          { "ExternProtoDeclare":
            {
              "@name":"BooleanFilter",
              "@appinfo":"BooleanFilter selectively passes true false or negated events.",
              "@url":["EventUtilityPrototypes.x3d#BooleanFilter","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanFilter","EventUtilityPrototypes.wrl#BooleanFilter","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanFilter"],
              "field": [
                {
                  "@name":"set_boolean",
                  "@accessType":"inputOnly",
                  "@appinfo":"set_boolean is the input value to be filtered.",
                  "@type":"SFBool"
                },
                {
                  "@name":"inputTrue",
                  "@accessType":"outputOnly",
                  "@appinfo":"inputTrue only passes a true value when set_boolean input is true.",
                  "@type":"SFBool"
                },
                {
                  "@name":"inputFalse",
                  "@accessType":"outputOnly",
                  "@appinfo":"inputFalse only passes a false value when set_boolean is false.",
                  "@type":"SFBool"
                },
                {
                  "@name":"inputNegate",
                  "@accessType":"outputOnly",
                  "@appinfo":"inputNegate provides opposite value by negating set_boolean input.",
                  "@type":"SFBool"
                }
              ]
            }
          },
          {
            "#comment":"========================================"
          },
          { "ExternProtoDeclare":
            {
              "@name":"BooleanToggle",
              "@appinfo":"BooleanToggle maintains state and negates output when a true input is provided.",
              "@url":["EventUtilityPrototypes.x3d#BooleanToggle","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanToggle","EventUtilityPrototypes.wrl#BooleanToggle","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanToggle"],
              "field": [
                {
                  "@name":"set_boolean",
                  "@accessType":"inputOnly",
                  "@appinfo":"If set_boolean input is true toggle state.",
                  "@type":"SFBool"
                },
                {
                  "@name":"set_toggle",
                  "@accessType":"inputOnly",
                  "@appinfo":"Reset persistent state value.",
                  "@type":"SFBool"
                },
                {
                  "@name":"toggle",
                  "@accessType":"initializeOnly",
                  "@appinfo":"Persistent state value that gets toggled or reset.",
                  "@type":"SFBool"
                },
                {
                  "@name":"toggle_changed",
                  "@accessType":"outputOnly",
                  "@appinfo":"Output toggled persistent state value.",
                  "@type":"SFBool"
                }
              ],
              "-children":[
                {
                  "#comment":"warning: toggle depends on exposedField functionality in Script node, not compatible with VRML 97. implemented as inputOnly/initializeOnly/outputOnly triplet."
                }
              ]
            }
          },
          {
            "#comment":"========================================"
          },
          { "ExternProtoDeclare":
            {
              "@name":"BooleanTrigger",
              "@appinfo":"BooleanTrigger converts time events to boolean true events.",
              "@url":["EventUtilityPrototypes.x3d#BooleanTrigger","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#BooleanTrigger","EventUtilityPrototypes.wrl#BooleanTrigger","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#BooleanTrigger"],
              "field": [
                {
                  "@name":"set_triggerTime",
                  "@accessType":"inputOnly",
                  "@appinfo":"set_triggerTime provides input time event typical event sent is TouchSensor touchTime.",
                  "@type":"SFTime"
                },
                {
                  "@name":"triggerTrue",
                  "@accessType":"outputOnly",
                  "@appinfo":"triggerTrue outputs a true value whenever a triggerTime event is received.",
                  "@type":"SFBool"
                }
              ]
            }
          },
          {
            "#comment":"========================================"
          },
          { "ExternProtoDeclare":
            {
              "@name":"IntegerTrigger",
              "@appinfo":"IntegerTrigger converts boolean true or time input events to integer value (suitable for Switch node).",
              "@url":["EventUtilityPrototypes.x3d#IntegerTrigger","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#IntegerTrigger","EventUtilityPrototypes.wrl#IntegerTrigger","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#IntegerTrigger"],
              "field": [
                {
                  "@name":"set_boolean",
                  "@accessType":"inputOnly",
                  "@appinfo":"If set_boolean input is true trigger output of integer value.",
                  "@type":"SFBool"
                },
                {
                  "@name":"set_integerKey",
                  "@accessType":"inputOnly",
                  "@appinfo":"Resets value used for output when triggered later.",
                  "@type":"SFInt32"
                },
                {
                  "@name":"integerKey",
                  "@accessType":"inputOutput",
                  "@appinfo":"integerKey is value for output when triggered.",
                  "@type":"SFInt32"
                },
                {
                  "@name":"integerKey_changed",
                  "@accessType":"outputOnly",
                  "@appinfo":"Reports change in integerKey value.",
                  "@type":"SFInt32"
                },
                {
                  "@name":"triggerValue",
                  "@accessType":"outputOnly",
                  "@appinfo":"triggerValue provides integer event output matching integerKey when true set_boolean received.",
                  "@type":"SFInt32"
                }
              ]
            }
          },
          {
            "#comment":"========================================"
          },
          { "ExternProtoDeclare":
            {
              "@name":"TimeTrigger",
              "@appinfo":"TimeTrigger converts boolean true events to time events.",
              "@url":["EventUtilityPrototypes.x3d#TimeTrigger","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d#TimeTrigger","EventUtilityPrototypes.wrl#TimeTrigger","https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.wrl#TimeTrigger"],
              "field": [
                {
                  "@name":"set_boolean",
                  "@accessType":"inputOnly",
                  "@appinfo":"If set_boolean input is true trigger output time value.",
                  "@type":"SFBool"
                },
                {
                  "@name":"triggerTime",
                  "@accessType":"outputOnly",
                  "@appinfo":"triggerTime is output time event sent when set_boolean input is true.",
                  "@type":"SFTime"
                }
              ]
            }
          },
          {
            "#comment":"========================================"
          },
          { "Group":
            {
              "-children":[
                { "Transform":
                  {
                    "@translation":[0,3,0],
                    "-children":[
                      { "Anchor":
                        {
                          "@description":"Click for BooleanFilter example",
                          "@parameter":["target=_blank"],
                          "@url":["../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d","https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d","../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl","https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl"],
                          "-children":[
                            { "Shape":
                              {
                                "-appearance":
                                  { "Appearance":
                                    {
                                      "-material":
                                        { "Material":
                                          {
                                            "@diffuseColor":[0.6,0.6,0.2]
                                          }
                                        }
                                    }
                                  },
                                "-geometry":
                                  { "Text":
                                    {
                                      "@string":["BooleanFilter example"],
                                      "-fontStyle":
                                        { "FontStyle":
                                          {
                                            "@DEF":"TextFont",
                                            "@justify":["MIDDLE","MIDDLE"],
                                            "@size":0.8,
                                            "@style":"BOLD"
                                          }
                                        }
                                    }
                                  }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                { "Transform":
                  {
                    "@translation":[0,1.5,0],
                    "-children":[
                      { "Anchor":
                        {
                          "@description":"Click for BooleanToggle example",
                          "@parameter":["target=_blank"],
                          "@url":["../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d","https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d","../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl","https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl"],
                          "-children":[
                            { "Shape":
                              {
                                "-appearance":
                                  { "Appearance":
                                    {
                                      "-material":
                                        { "Material":
                                          {
                                            "@diffuseColor":[0.6,0.6,0.2]
                                          }
                                        }
                                    }
                                  },
                                "-geometry":
                                  { "Text":
                                    {
                                      "@string":["BooleanToggle example"],
                                      "-fontStyle":
                                        { "FontStyle":
                                          {
                                            "@USE":"TextFont"
                                          }
                                        }
                                    }
                                  }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                { "Transform":
                  {
                    "-children":[
                      { "Anchor":
                        {
                          "@description":"Click for BooleanTrigger example",
                          "@parameter":["target=_blank"],
                          "@url":["../../Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d","https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.x3d","../../Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl","https://www.web3d.org/x3d/content/examples/Savage/Tools/HeadsUpDisplays/CrossHairExample.wrl"],
                          "-children":[
                            { "Shape":
                              {
                                "-appearance":
                                  { "Appearance":
                                    {
                                      "-material":
                                        { "Material":
                                          {
                                            "@diffuseColor":[0.6,0.6,0.2]
                                          }
                                        }
                                    }
                                  },
                                "-geometry":
                                  { "Text":
                                    {
                                      "@string":["BooleanTrigger example"],
                                      "-fontStyle":
                                        { "FontStyle":
                                          {
                                            "@USE":"TextFont"
                                          }
                                        }
                                    }
                                  }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                { "Transform":
                  {
                    "@translation":[0,-1.5,0],
                    "-children":[
                      { "Anchor":
                        {
                          "@description":"Click for IntegerTrigger example",
                          "@parameter":["target=_blank"],
                          "@url":["../../Savage/Tools/Animation/MaterialChoiceExample.x3d","https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoiceExample.x3d","../../Savage/Tools/Animation/MaterialChoiceExample.wrl","https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoiceExample.wrl"],
                          "-children":[
                            { "Shape":
                              {
                                "-appearance":
                                  { "Appearance":
                                    {
                                      "-material":
                                        { "Material":
                                          {
                                            "@diffuseColor":[0.6,0.6,0.2]
                                          }
                                        }
                                    }
                                  },
                                "-geometry":
                                  { "Text":
                                    {
                                      "@string":["IntegerTrigger example"],
                                      "-fontStyle":
                                        { "FontStyle":
                                          {
                                            "@USE":"TextFont"
                                          }
                                        }
                                    }
                                  }
                              }
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                { "Transform":
                  {
                    "@DEF":"TimeTriggerTransform",
                    "@translation":[0,-3,0],
                    "-children":[
                      { "TouchSensor":
                        {
                          "@DEF":"TimeTriggerTouchSensor",
                          "@description":"Click forTimeTrigger example"
                        }
                      },
                      { "Shape":
                        {
                          "-appearance":
                            { "Appearance":
                              {
                                "-material":
                                  { "Material":
                                    {
                                      "@diffuseColor":[0.6,0.6,0.2]
                                    }
                                  }
                              }
                            },
                          "-geometry":
                            { "Text":
                              {
                                "@string":["TimeTrigger example"],
                                "-fontStyle":
                                  { "FontStyle":
                                    {
                                      "@USE":"TextFont"
                                    }
                                  }
                              }
                            }
                        }
                      }
                    ]
                  }
                },
                { "TimeTrigger":
                  {
                    "@DEF":"TimeTriggerNode"
                  }
                },
                { "TimeSensor":
                  {
                    "@DEF":"TimeTriggerTimeSensor",
                    "@cycleInterval":2
                  }
                },
                { "OrientationInterpolator":
                  {
                    "@DEF":"TimeTriggerOrientationInterpolator",
                    "@key":[0,0.5,1],
                    "@keyValue":[0,1,0,0,0,1,0,3.14159,0,1,0,6.2432]
                  }
                },
                { "ROUTE":
                  {
                    "@fromField":"isActive",
                    "@fromNode":"TimeTriggerTouchSensor",
                    "@toField":"set_boolean",
                    "@toNode":"TimeTriggerNode"
                  }
                },
                { "ROUTE":
                  {
                    "@fromField":"triggerTime",
                    "@fromNode":"TimeTriggerNode",
                    "@toField":"startTime",
                    "@toNode":"TimeTriggerTimeSensor"
                  }
                },
                { "ROUTE":
                  {
                    "@fromField":"fraction_changed",
                    "@fromNode":"TimeTriggerTimeSensor",
                    "@toField":"set_fraction",
                    "@toNode":"TimeTriggerOrientationInterpolator"
                  }
                },
                { "ROUTE":
                  {
                    "@fromField":"value_changed",
                    "@fromNode":"TimeTriggerOrientationInterpolator",
                    "@toField":"set_rotation",
                    "@toNode":"TimeTriggerTransform"
                  }
                }
              ]
            }
          }
        ]
    }
  }
}