<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D profile='Immersiveversion='3.0xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation=' http://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='6 September 2010'/>
<meta name='warningcontent='Under development, IntegerTrigger example needed.'/>
<meta name='referencecontent='EventUtilityExamples.x3d'/>
<meta name='subjectcontent='BooleanFilter BooleanToggle BooleanTrigger IntegerTrigger TimeTrigger'/>
<meta name='identifiercontent=' http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityPrototypes.x3d '/>
<meta name='generatorcontent='X3D-Edit 3.2, https://savage.nps.edu/X3D-Edit'/>
<meta name='licensecontent=' ../license.html'/>
</head>
<!-- -->
<Scene>
<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.print ('[BooleanFilter] set_boolean=' + value + ', inputTrue='  + inputTrue  + ', inputNegate=' + inputNegate);
//	else       Browser.print ('[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.'/>
<!-- warning: toggle depends on exposedField functionality in Script node, not compatible with VRML 97. implemented as inputOnly/initializeOnly/outputOnly triplet. -->
<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.'/>
</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.print ('[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.print ('[BooleanToggle] traceEnabled=' + traceEnabled);
	if (traceEnabled) Browser.print ('[BooleanToggle] set_boolean=' + value + ', toggle=' + toggle);
}
function set_toggle (value, timestamp)
{
	toggle = value;
	toggle_changed = toggle;
	if (traceEnabled) Browser.print ('[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.print ('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='IntegerKeyHolderwhichChoice='-1'/>
</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" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.x3d" "EventUtilityExamples.wrl" "http://www.web3d.org/x3d/content/examples/Basic/development/EventUtilityExamples.wrl" '>
<Shape>
<Text string='"EventUtilityPrototype" "defines prototypes" "" "Click text to see" "EventUtilityExamples"solid='false'>
<FontStyle justify='"MIDDLE" "MIDDLE"size='0.9'/>
</Text>
<Appearance>
<Material diffuseColor='1 1 0.2'/>
</Appearance>
</Shape>
</Anchor>
</Scene>
</X3D>
<!--

Index for ProtoDeclare definitions: BooleanFilter, BooleanToggle, BooleanTrigger, IntegerTrigger, TimeTrigger
Index for DEF nodes: BooleanFilterScript, BooleanToggleScript, IntegerKeyHolder, TriggerBooleanScript, TriggerIntegerScript, TriggerTimeScript
-->

<!-- Color key: <X3dNode DEF='idName' field='value'/> matches <XmlElement DEF='idName' attribute='value'/>     <Prototype name='ProtoName'> <field name='fieldName'/> </Prototype> -->