<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D profile='Immersive'  version='3.0 xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation =' https://www.web3d.org/specifications/x3d-3.0.xsd ' >
<head>
<meta name='titlecontent=' EventUtilityPrototypes.x3d '/>
<meta name='descriptioncontent='Event utility node prototypes for boolean filtering and other event utility nodes.'/>
<meta name='creatorcontent='Nick Polys, Tony Parisi, Don Brutzman, Justin Couch'/>
<meta name='createdcontent='25 September 2002'/>
<meta name='modifiedcontent='20 January 2020'/>
<meta name=' warning content=' Under development, IntegerTrigger example needed. '/>
<meta name='referencecontent=' EventUtilityExamples.x3d '/>
<meta name='subjectcontent='BooleanFilter BooleanToggle BooleanTrigger IntegerTrigger TimeTrigger'/>
<meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<WorldInfo title='EventUtilityPrototypes.x3d'/>
<ProtoDeclare name='BooleanFilterappinfo='BooleanFilter selectively passes true false or negated events.' >
<ProtoInterface>
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='set_boolean is the input value to be filtered.' />

<field name='inputTruetype='SFBoolaccessType='outputOnly'
 appinfo='inputTrue only passes a true value when set_boolean input is true.' />

<field name='inputFalsetype='SFBoolaccessType='outputOnly'
 appinfo='inputFalse only passes a false value when set_boolean is false.' />

<field name='inputNegatetype='SFBoolaccessType='outputOnly'
 appinfo='inputNegate provides opposite value by negating set_boolean input.' />
</ProtoInterface>
<ProtoBody>
<Script DEF='BooleanFilterScript'>
<field name='set_booleantype='SFBoolaccessType='inputOnly'/>
<field name='inputTruetype='SFBoolaccessType='outputOnly'/>
<field name='inputFalsetype='SFBoolaccessType='outputOnly'/>
<field name='inputNegatetype='SFBoolaccessType='outputOnly'/>
<IS>
<connect nodeField='set_booleanprotoField='set_boolean'/>
<connect nodeField='inputTrueprotoField='inputTrue'/>
<connect nodeField='inputFalseprotoField='inputFalse'/>
<connect nodeField='inputNegateprotoField='inputNegate'/>
</IS>
<![CDATA[
          
ecmascript:

function set_boolean (value, timestamp)
{
	if (value) inputTrue  = value;
	else       inputFalse = value;
	inputNegate = !value;

//	if (value) Browser.println ('[BooleanFilter] set_boolean=' + value + ', inputTrue='  + inputTrue  + ', inputNegate=' + inputNegate);
//	else       Browser.println ('[BooleanFilter] set_boolean=' + value + ', inputFalse=' + inputFalse + ', inputNegate=' + inputNegate);
}

        
]]>
</Script>
</ProtoBody>
</ProtoDeclare>
<!-- ======================================== -->
<ProtoDeclare name='BooleanToggleappinfo='BooleanToggle maintains state and negates output when a true input is provided.' >
<ProtoInterface>
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='If set_boolean input is true toggle state.' />

<field name='set_toggletype='SFBoolaccessType='inputOnly'
 appinfo='Reset persistent state value.' />

<field name='toggletype='SFBoolvalue='falseaccessType='initializeOnly'
 appinfo='Persistent state value that gets toggled or reset.' />

<field name='toggle_changedtype='SFBoolaccessType='outputOnly'
 appinfo='Output toggled persistent state value.' />

<!-- warning: toggle depends on exposedField functionality in Script node, not compatible with VRML 97. implemented as inputOnly/initializeOnly/outputOnly triplet. -->
</ProtoInterface>
<ProtoBody>
<Group>
<Script DEF='BooleanToggleScript'>
<field name='set_booleantype='SFBoolaccessType='inputOnly'/>
<field name='set_toggletype='SFBoolaccessType='inputOnly'/>
<field name='toggletype='SFBoolvalue='falseaccessType='initializeOnly'/>
<field name='toggle_changedtype='SFBoolaccessType='outputOnly'/>
<field name='traceEnabledtype='SFBoolvalue='falseaccessType='initializeOnly'/>
<IS>
<connect nodeField='set_booleanprotoField='set_boolean'/>
<connect nodeField='set_toggleprotoField='set_toggle'/>
<connect nodeField='toggle_changedprotoField='toggle_changed'/>
</IS>
<![CDATA[
            
ecmascript:

function initialize ()
{
	if (traceEnabled) Browser.println ('[BooleanToggle] toggle=' + toggle);

}
function set_boolean (value, timestamp)
{
	if (value == true)  // only toggle on true input
	{
		if (toggle == true) toggle = false;
		else                toggle = true;
	}
	toggle_changed = toggle;
//	Browser.println ('[BooleanToggle] traceEnabled=' + traceEnabled);
	if (traceEnabled) Browser.println ('[BooleanToggle] set_boolean=' + value + ', toggle=' + toggle);
}
function set_toggle (value, timestamp)
{
	toggle = value;
	toggle_changed = toggle;
	if (traceEnabled) Browser.println ('[BooleanToggle] set_toggle=' + set_toggle);
}

          
]]>
</Script>
</Group>
</ProtoBody>
</ProtoDeclare>
<!-- ======================================== -->
<ProtoDeclare name='BooleanTriggerappinfo='BooleanTrigger converts time events to boolean true events.' >
<ProtoInterface>
<field name='set_triggerTimetype='SFTimeaccessType='inputOnly'
 appinfo='set_triggerTime provides input time event typical event sent is TouchSensor touchTime.' />

<field name='triggerTruetype='SFBoolaccessType='outputOnly'
 appinfo='triggerTrue outputs a true value whenever a triggerTime event is received.' />
</ProtoInterface>
<ProtoBody>
<Script DEF='TriggerBooleanScript'>
<field name='set_triggerTimetype='SFTimeaccessType='inputOnly'/>
<field name='triggerTruetype='SFBoolaccessType='outputOnly'/>
<IS>
<connect nodeField='set_triggerTimeprotoField='set_triggerTime'/>
<connect nodeField='triggerTrueprotoField='triggerTrue'/>
</IS>
<![CDATA[
          
ecmascript:

function set_triggerTime (value, timestamp)
{
	triggerTrue = true;
//	Browser.println ('triggerTrue = true');
}

        
]]>
</Script>
</ProtoBody>
</ProtoDeclare>
<!-- ======================================== -->
<ProtoDeclare name='IntegerTriggerappinfo='IntegerTrigger converts boolean true or time input events to integer value (suitable for Switch node).' >
<ProtoInterface>
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='If set_boolean input is true trigger output of integer value.' />

<field name='set_integerKeytype='SFInt32accessType='inputOnly'
 appinfo='Resets value used for output when triggered later.' />

<field name='integerKeytype='SFInt32value='-1accessType='inputOutput'
 appinfo='integerKey is value for output when triggered.' />

<field name='integerKey_changedtype='SFInt32accessType='outputOnly'
 appinfo='Reports change in integerKey value.' />

<field name='triggerValuetype='SFInt32accessType='outputOnly'
 appinfo='triggerValue provides integer event output matching integerKey when true set_boolean received.' />
</ProtoInterface>
<ProtoBody>
<Group>
<Switch DEF='IntegerKeyHolderwhichChoice='-1'>
<IS>
<connect nodeField='whichChoiceprotoField='integerKey'/>
</IS>
</Switch>
<Script DEF='TriggerIntegerScriptdirectOutput='true'>
<field name='set_booleantype='SFBoolaccessType='inputOnly'/>
<field name='set_integerKeytype='SFInt32accessType='inputOnly'/>
<field name='integerKeyHolderNodetype='SFNodeaccessType='initializeOnly'>
<Switch USE=' IntegerKeyHolder'/>
</field>
<field name='integerKey_changedtype='SFInt32accessType='outputOnly'/>
<field name='triggerValuetype='SFInt32accessType='outputOnly'/>
<IS>
<connect nodeField='set_booleanprotoField='set_boolean'/>
<connect nodeField='set_integerKeyprotoField='set_integerKey'/>
<connect nodeField='integerKey_changedprotoField='integerKey_changed'/>
<connect nodeField='triggerValueprotoField='triggerValue'/>
</IS>
<![CDATA[
            
ecmascript:

function set_boolean (inputValue, timestamp)
{
	if (inputValue == true)
	{
		integerKey = integerKeyHolderNode.whichChoice;
		triggerValue = integerKey; // send output event
	}
}
function set_integerKey (inputValue, timestamp)
{
	integerKey = inputValue;
	integerKeyHolderNode.whichChoice = integerKey;
	integerKey_changed = integerKey; // send output event
}

          
]]>
</Script>
</Group>
</ProtoBody>
</ProtoDeclare>
<!-- ======================================== -->
<ProtoDeclare name='TimeTriggerappinfo='TimeTrigger converts boolean true events to time events.' >
<ProtoInterface>
<field name='set_booleantype='SFBoolaccessType='inputOnly'
 appinfo='If set_boolean input is true trigger output time value.' />

<field name='triggerTimetype='SFTimeaccessType='outputOnly'
 appinfo='triggerTime is output time event sent when set_boolean input is true.' />
</ProtoInterface>
<ProtoBody>
<Script DEF='TriggerTimeScript'>
<field name='set_booleantype='SFBoolaccessType='inputOnly'/>
<field name='triggerTimetype='SFTimeaccessType='outputOnly'/>
<IS>
<connect nodeField='set_booleanprotoField='set_boolean'/>
<connect nodeField='triggerTimeprotoField='triggerTime'/>
</IS>
<![CDATA[
          
ecmascript:

function set_boolean (value, timestamp)
{
	if (value) triggerTime = timestamp;
}

        
]]>
</Script>
</ProtoBody>
</ProtoDeclare>
<!-- ======================================== -->
<Anchor description='EventUtilityExamplesparameter='"target=_blank"'
  url=' EventUtilityExamples.x3d"https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.x3d" "EventUtilityExamples.wrl" "https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.wrl" ' >
<Shape>
<Text string='"EventUtilityPrototype" "defines prototypes" "" "Click text to see" "EventUtilityExamples"'>
<FontStyle justify='"MIDDLE" "MIDDLE"size='0.9'/>
</Text>
<Appearance>
<Material diffuseColor='1 1 0.2'/>
</Appearance>
</Shape>
</Anchor>
</Scene>
</X3D>
<!--

to top <!-- Event Graph ROUTE Table shows event connections -->
 
<!-- Index for DEF nodes: BooleanFilterScript, BooleanToggleScript, IntegerKeyHolder, TriggerBooleanScript, TriggerIntegerScript, TriggerTimeScript

Index for ProtoDeclare definitions: BooleanFilter, BooleanToggle, BooleanTrigger, IntegerTrigger, TimeTrigger
-->

Event Graph ROUTE Table with 0 ROUTE total, showing X3D event-model relationships for this scene.

Each row shows an event cascade that may occur during a single timestamp interval between frame renderings, as part of the X3D execution model.

BooleanToggleScript
Script
No ROUTE connection found for output from this node.
 



-->

<!-- Online at
https://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypesIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d -->

<!-- Color legend: X3D terminology <X3dNode DEF='idName' field='value'/> matches XML terminology <XmlElement DEF='idName' attribute='value'/>
(Light-blue background: event-based behavior node or statement) (Grey background inside box: inserted documentation) (Magenta background: X3D Extensibility)
    <ProtoDeclare name='ProtoName'> <field name='fieldName'/> </ProtoDeclare> -->

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