<
head>
</
head>
<!--
-->
<
Scene>
<
ProtoDeclare name='
BooleanFilter'
appinfo='
BooleanFilter selectively passes true false or negated events.'>
<
ProtoInterface>
<
field name='
set_boolean'
type='
SFBool'
accessType='
inputOnly'
appinfo='
set_boolean is the input value to be filtered.'/>
<
field name='
inputTrue'
type='
SFBool'
accessType='
outputOnly'
appinfo='
inputTrue only passes a true value when set_boolean input is true.'/>
<
field name='
inputFalse'
type='
SFBool'
accessType='
outputOnly'
appinfo='
inputFalse only passes a false value when set_boolean is false.'/>
<
field name='
inputNegate'
type='
SFBool'
accessType='
outputOnly'
appinfo='
inputNegate provides opposite value by negating set_boolean input.'/>
</
ProtoInterface>
<
ProtoBody>
<
Script DEF='
BooleanFilterScript'>
<
field name='
set_boolean'
type='
SFBool'
accessType='
inputOnly'/>
<
field name='
inputTrue'
type='
SFBool'
accessType='
outputOnly'/>
<
field name='
inputFalse'
type='
SFBool'
accessType='
outputOnly'/>
<
field name='
inputNegate'
type='
SFBool'
accessType='
outputOnly'/>
<
IS>
<
connect nodeField='
set_boolean'
protoField='
set_boolean'/>
<
connect nodeField='
inputTrue'
protoField='
inputTrue'/>
<
connect nodeField='
inputFalse'
protoField='
inputFalse'/>
<
connect nodeField='
inputNegate'
protoField='
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);
}
]]>
</
ProtoDeclare>
<!-- ======================================== -->
<
ProtoDeclare name='
BooleanToggle'
appinfo='
BooleanToggle maintains state and negates output when a true input is provided.'>
<
ProtoInterface>
<
field name='
set_boolean'
type='
SFBool'
accessType='
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_toggle'
type='
SFBool'
accessType='
inputOnly'
appinfo='
Reset persistent state value.'/>
<
field name='
toggle'
type='
SFBool'
value='
false'
accessType='
initializeOnly'
appinfo='
Persistent state value that gets toggled or reset.'/>
<
field name='
toggle_changed'
type='
SFBool'
accessType='
outputOnly'
appinfo='
Output toggled persistent state value.'/>
</
ProtoInterface>
<
ProtoBody>
<
Group>
<
Script DEF='
BooleanToggleScript'>
<
field name='
set_boolean'
type='
SFBool'
accessType='
inputOnly'/>
<
field name='
set_toggle'
type='
SFBool'
accessType='
inputOnly'/>
<
field name='
toggle'
type='
SFBool'
value='
false'
accessType='
initializeOnly'/>
<
field name='
toggle_changed'
type='
SFBool'
accessType='
outputOnly'/>
<
field name='
traceEnabled'
type='
SFBool'
value='
false'
accessType='
initializeOnly'/>
<
IS>
<
connect nodeField='
set_boolean'
protoField='
set_boolean'/>
<
connect nodeField='
set_toggle'
protoField='
set_toggle'/>
<
connect nodeField='
toggle_changed'
protoField='
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);
}
]]>
</
ProtoDeclare>
<!-- ======================================== -->
<
ProtoDeclare name='
BooleanTrigger'
appinfo='
BooleanTrigger converts time events to boolean true events.'>
<
ProtoInterface>
<
field name='
set_triggerTime'
type='
SFTime'
accessType='
inputOnly'
appinfo='
set_triggerTime provides input time event typical event sent is TouchSensor touchTime.'/>
<
field name='
triggerTrue'
type='
SFBool'
accessType='
outputOnly'
appinfo='
triggerTrue outputs a true value whenever a triggerTime event is received.'/>
</
ProtoInterface>
<
ProtoBody>
<
Script DEF='
TriggerBooleanScript'>
<
field name='
set_triggerTime'
type='
SFTime'
accessType='
inputOnly'/>
<
field name='
triggerTrue'
type='
SFBool'
accessType='
outputOnly'/>
<
IS>
</
IS>
<![CDATA[
ecmascript:
function set_triggerTime (value, timestamp)
{
triggerTrue = true;
// Browser.print ('triggerTrue = true');
}
]]>
</
ProtoDeclare>
<!-- ======================================== -->
<
ProtoDeclare name='
IntegerTrigger'
appinfo='
IntegerTrigger converts boolean true or time input events to integer value (suitable for Switch node).'>
<
ProtoInterface>
<
field name='
set_boolean'
type='
SFBool'
accessType='
inputOnly'
appinfo='
If set_boolean input is true trigger output of integer value.'/>
<
field name='
set_integerKey'
type='
SFInt32'
accessType='
inputOnly'
appinfo='
Resets value used for output when triggered later.'/>
<
field name='
integerKey'
type='
SFInt32'
value='
-1'
accessType='
inputOutput'
appinfo='
integerKey is value for output when triggered.'/>
<
field name='
integerKey_changed'
type='
SFInt32'
accessType='
outputOnly'
appinfo='
Reports change in integerKey value.'/>
<
field name='
triggerValue'
type='
SFInt32'
accessType='
outputOnly'
appinfo='
triggerValue provides integer event output matching integerKey when true set_boolean received.'/>
</
ProtoInterface>
<
ProtoBody>
<
Group>
<
Switch DEF='
IntegerKeyHolder'
whichChoice='
-1'>
<
IS>
<
connect nodeField='
whichChoice'
protoField='
integerKey'/>
</
IS>
</
Switch>
<
Script DEF='
TriggerIntegerScript'
directOutput='
true'>
<
field name='
set_boolean'
type='
SFBool'
accessType='
inputOnly'/>
<
field name='
set_integerKey'
type='
SFInt32'
accessType='
inputOnly'/>
<
field name='
integerKeyHolderNode'
type='
SFNode'
accessType='
initializeOnly'>
</
field>
<
field name='
integerKey_changed'
type='
SFInt32'
accessType='
outputOnly'/>
<
field name='
triggerValue'
type='
SFInt32'
accessType='
outputOnly'/>
<
IS>
</
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
}
]]>
</
ProtoDeclare>
<!-- ======================================== -->
<
ProtoDeclare name='
TimeTrigger'
appinfo='
TimeTrigger converts boolean true events to time events.'>
<
ProtoInterface>
<
field name='
set_boolean'
type='
SFBool'
accessType='
inputOnly'
appinfo='
If set_boolean input is true trigger output time value.'/>
<
field name='
triggerTime'
type='
SFTime'
accessType='
outputOnly'
appinfo='
triggerTime is output time event sent when set_boolean input is true.'/>
</
ProtoInterface>
<
ProtoBody>
<
Script DEF='
TriggerTimeScript'>
<
field name='
set_boolean'
type='
SFBool'
accessType='
inputOnly'/>
<
field name='
triggerTime'
type='
SFTime'
accessType='
outputOnly'/>
<
IS>
<
connect nodeField='
set_boolean'
protoField='
set_boolean'/>
<
connect nodeField='
triggerTime'
protoField='
triggerTime'/>
</
IS>
<![CDATA[
ecmascript:
function set_boolean (value, timestamp)
{
if (value) triggerTime = timestamp;
}
]]>
</
Scene>