X3D Model Documentation: MaterialChoiceExample.x3d

  1  <?xml version="1.0" encoding="UTF-8"?>
  2 
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "https://www.web3d.org/specifications/x3d-3.0.dtd">
  3  <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'>
  4       <head>
  5            <meta name='titlecontent=' MaterialChoiceExample.x3d '/>
  6            <meta name='descriptioncontent='Example for toggle-able Material node that can choose among an array of material nodes, and is switchable at run time.'/>
  7            <meta name='creatorcontent='Don Brutzman and MV4205 class'/>
  8            <meta name='createdcontent='2 May 2004'/>
  9            <meta name='modifiedcontent='28 November 2019'/>
 10            <meta name='referencecontent=' MaterialChoicePrototype.x3d '/>
 11            <meta name='identifiercontent=' https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoiceExample.x3d '/>
 12            <meta name='generatorcontent='X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit'/>
 13            <meta name='licensecontent='../../license.html'/>
 14       </head>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: AddNewMaterialScript, AnimationGroup, Clock, ClockStopper, ClockStopperFilter, FS, MC, RotateBox, TestAppend, TestDelete0, TestDelete1, TestDelete2, TestDeleteAll, TestDeleteOne, TestLoop, TestNext, TestPrevious, ToggleLoop, TouchAppend, TouchDelete0, TouchDelete0Trigger, TouchDelete1, TouchDelete1Trigger, TouchDelete2, TouchDelete2Trigger, TouchDeleteAll, TouchLoop, TouchNext, TouchPrevious, TriggerNext

Index for Viewpoint node: Viewpoint_1

Index for ExternProtoDeclare definition: MaterialChoice
-->
 15       <Scene>
 16            <WorldInfo title='MaterialChoiceExample.x3d'/>
 17            <ExternProtoDeclare name='MaterialChoice'   url=' "MaterialChoicePrototype.x3d#MaterialChoice" "https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoicePrototype.x3d#MaterialChoice" "MaterialChoicePrototype.wrl#MaterialChoice" "https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoicePrototype.wrl#MaterialChoice" '>
 18                 <field name='set_indextype='SFInt32accessType='inputOnly'/>
 19                 <field name='indextype='SFInt32accessType='initializeOnly'
                appinfo='which Material node is chosen, with array index starting at 0'/>
 20                 <field name='index_changedtype='SFInt32accessType='outputOnly'/>
 21                 <field name='set_fractiontype='SFFloataccessType='inputOnly'/>
 22                 <field name='fractiontype='SFFloataccessType='initializeOnly'
                appinfo='fraction to interpolate between current and next Material node (if any) across all field values.'/>
 23                 <field name='nexttype='SFBoolaccessType='inputOnly'/>
 24                 <field name='previoustype='SFBoolaccessType='inputOnly'/>
 25                 <field name='materialstype='MFNodeaccessType='initializeOnly'
                appinfo='array of available Material nodes defaults to zeroth Material'/>
 26                 <field name='appendMaterialtype='SFNodeaccessType='inputOnly'
                appinfo='append another Material node to materials array'/>
 27                 <field name='deleteMaterialtype='SFInt32accessType='inputOnly'
                appinfo='delete Material node indicated by input index value'/>
 28                 <field name='deleteAllMaterialstype='SFBoolaccessType='inputOnly'
                appinfo='deletes all Material nodes resets scene to default Material values defined in X3D Specification'/>
 29            </ExternProtoDeclare>
 30            <!-- ==================== -->
 31            <Viewpoint description='MaterialChoice index is sequenced to change selected Material valueposition='0 0 6'/>
 32            <Transform DEF='RotateBoxrotation='1 0 0 0.79'>
 33                 <Transform rotation='0 1 0 0.79'>
 34                      <Shape>
 35                           <Box/>
 36                           <Appearance>
 37 
 38                                     <fieldValue name='indexvalue='0'/>
 39                                     <fieldValue name='fractionvalue='0.0'/>
 40                                     <fieldValue name='materials'>
 41                                          <Material ambientIntensity='0.24diffuseColor='1 0.452381 0.40339shininess='0.9specularColor='0.686486 0.396903 0.419275'>
 42                                               <!-- Universal Media Library: ArtDeco 3 -->
 43                                          </Material>
 44                                          <Material ambientIntensity='0.24diffuseColor='0.330519 0.3389 0.6shininess='0.78specularColor='0.290909 0.290909 0.290909'>
 45                                               <!-- Universal Media Library: ArtDeco 8 -->
 46                                          </Material>
 47                                          <Material ambientIntensity='0.25diffuseColor='0 0.251004 0.239248shininess='0.06specularColor='0.177935 0.249369 0.229278'>
 48                                               <!-- Universal Media Library: ArtDeco 19 -->
 49                                          </Material>
 50                                     </fieldValue>
 51                                </ProtoInstance>
 52                           </Appearance>
 53                      </Shape>
 54                 </Transform>
 55            </Transform>
 56            <!-- other tests -->
 57            <Group DEF='AnimationGroup'>
 58                 <!-- Animate the MaterialChoice automatically -->
 59 
               <!-- ROUTE information for Clock node:  [from ClockStopperFilter.inputNegate to enabled ] [from ToggleLoop.toggle_changed to enabled ] [from cycleTime to TriggerNext.set_triggerTime ] -->
               <TimeSensor DEF='ClockcycleInterval='2enabled='falseloop='true'/>
 60 
               <!-- ROUTE information for TriggerNext node:  [from Clock.cycleTime to set_triggerTime ] [from triggerTrue to MC.next ] -->
               <BooleanTrigger DEF='TriggerNext'/>
 61                 < ROUTE  fromNode='Clock' fromField='cycleTime' toNode='TriggerNext' toField='set_triggerTime'/>
 62                 < ROUTE  fromNode='TriggerNext' fromField='triggerTrue' toNode='MC' toField='next'/>
 63                 <!-- iff another action starts (i.e. touch true), then negate value and stop clock -->
 64 
 65 
               <!-- ROUTE information for ClockStopperFilter node:  [from ClockStopper.inputTrue to set_boolean ] [from inputNegate to Clock.enabled ] -->
               <BooleanFilter DEF='ClockStopperFilter'/>
 66                 < ROUTE  fromNode='ClockStopper' fromField='inputTrue' toNode='ClockStopperFilter' toField='set_boolean'/>
 67                 < ROUTE  fromNode='ClockStopperFilter' fromField='inputNegate' toNode='Clock' toField='enabled'/>
 68            </Group>
 69            <Transform DEF='TestNexttranslation='-2.5 2 0'>
 70                 <Billboard axisOfRotation='0 0 0'>
 71                      <Shape>
 72                           <Text string='"next"'>
 73 
                              <!-- FontStyle FS is a DEF node that has 8 USE nodes: USE_1, USE_2, USE_3, USE_4, USE_5, USE_6, USE_7, USE_8 -->
                              <FontStyle DEF='FSsize='0.6'/>
 74                           </Text>
 75                           <Appearance>
 76                                <Material diffuseColor='0 0.9 0'/>
 77                           </Appearance>
 78                      </Shape>
 79 
                    <!-- ROUTE information for TouchNext node:  [from isActive to ClockStopper.set_boolean ] [from isActive to MC.next ] -->
                    <TouchSensor DEF='TouchNextdescription='touch for next Material'/>
 80                      < ROUTE  fromNode='TouchNext' fromField='isActive' toNode='ClockStopper' toField='set_boolean'/>
 81                      < ROUTE  fromNode='TouchNext' fromField='isActive' toNode='MC' toField='next'/>
 82                 </Billboard>
 83            </Transform>
 84            <Transform DEF='TestPrevioustranslation='1 2 0'>
 85                 <Billboard axisOfRotation='0 0 0'>
 86                      <Shape>
 87                           <Text string='"previous"'>
 88                                <FontStyle USE='FS'/>
 89                           </Text>
 90                           <Appearance>
 91                                <Material diffuseColor='0.9 0 0'/>
 92                           </Appearance>
 93                      </Shape>
 94 
                    <!-- ROUTE information for TouchPrevious node:  [from isActive to ClockStopper.set_boolean ] [from isActive to MC.previous ] -->
                    <TouchSensor DEF='TouchPreviousdescription='touch for previous Material'/>
 95                      < ROUTE  fromNode='TouchPrevious' fromField='isActive' toNode='ClockStopper' toField='set_boolean'/>
 96                      < ROUTE  fromNode='TouchPrevious' fromField='isActive' toNode='MC' toField='previous'/>
 97                 </Billboard>
 98            </Transform>
 99            <Transform DEF='TestLooptranslation='-3 -2 0'>
100                 <Billboard axisOfRotation='0 0 0'>
101                      <Shape>
102                           <Text string='"loop"'>
103                                <FontStyle USE='FS'/>
104                           </Text>
105                           <Appearance>
106                                <Material diffuseColor='0 0 0.9'/>
107                           </Appearance>
108                      </Shape>
109 
                    <!-- ROUTE information for TouchLoop node:  [from isActive to ToggleLoop.set_boolean ] -->
                    <TouchSensor DEF='TouchLoopdescription='touch to loop through Materials'/>
110 
                    <!-- ROUTE information for ToggleLoop node:  [from TouchLoop.isActive to set_boolean ] [from toggle_changed to Clock.enabled ] -->
                    <BooleanToggle DEF='ToggleLoopcontainerField='children'/>
111                      < ROUTE  fromNode='TouchLoop' fromField='isActive' toNode='ToggleLoop' toField='set_boolean'/>
112                      < ROUTE  fromNode='ToggleLoop' fromField='toggle_changed' toNode='Clock' toField='enabled'/>
113                 </Billboard>
114            </Transform>
115            <Transform DEF='TestAppendtranslation='1 -2 0'>
116                 <Billboard axisOfRotation='0 0 0'>
117                      <Shape>
118                           <Text string='"append"'>
119                                <FontStyle USE='FS'/>
120                           </Text>
121                           <Appearance>
122                                <Material diffuseColor='0.6 0.6 0'/>
123                           </Appearance>
124                      </Shape>
125 
                    <!-- ROUTE information for TouchAppend node:  [from isActive to ClockStopper.set_boolean ] [from isActive to AddNewMaterialScript.generateAndAppendMaterial ] -->
                    <TouchSensor DEF='TouchAppenddescription='touch to add a new Material'/>
126 
                    <!-- ROUTE information for AddNewMaterialScript node:  [from TouchAppend.isActive to generateAndAppendMaterial ] [from newMaterial to MC.appendMaterial ] -->
                    <Script DEF='AddNewMaterialScriptdirectOutput='true'>
127                           <field name='generateAndAppendMaterialtype='SFBoolaccessType='inputOnly'/>
128                           <field name='newMaterialtype='SFNodeaccessType='outputOnly'/>
129                           <field name='defaultMaterialtype='SFNodeaccessType='initializeOnly'>
130                                <Material/>
131                           </field>
132                           <field name='traceEnabledtype='SFBoolvalue='falseaccessType='initializeOnly'/>
  <![CDATA[
          
ecmascript:

function initialize ()
{
	if (traceEnabled) Browser.println ('[ MaterialChoiceExample ] AddNewMaterialScript.initialize()');
}

function generateAndAppendMaterial(trigger, timestamp)
{
   if (trigger == true)
   {
	if (traceEnabled) Browser.println ('[MaterialChoiceExample AddNewMaterialScript] generateAndAppendMaterial(' + trigger + ')');
	newColor = new SFColor (Math.random(), Math.random(), Math.random());
	defaultMaterial.diffuseColor = newColor;
	newMaterial = defaultMaterial;
	if (traceEnabled) Browser.println ('[ MaterialChoiceExample AddNewMaterialScript] append Material with diffuseColor (' + newColor + ')');
   }
}

        
]]>
134                      </Script>
135                      < ROUTE  fromNode='TouchAppend' fromField='isActive' toNode='ClockStopper' toField='set_boolean'/>
136                      < ROUTE  fromNode='TouchAppend' fromField='isActive' toNode='AddNewMaterialScript' toField='generateAndAppendMaterial'/>
137                      < ROUTE  fromNode='AddNewMaterialScript' fromField='newMaterial' toNode='MC' toField='appendMaterial'/>
138                 </Billboard>
139            </Transform>
140            <Transform DEF='TestDeleteOnetranslation='-3 0 0'>
141                 <Transform>
142                      <Billboard axisOfRotation='0 0 0'>
143                           <Shape>
144                                <Text string='"delete"'>
145                                     <FontStyle USE='FS'/>
146                                </Text>
147                                <Appearance>
148                                     <Material/>
149                                </Appearance>
150                           </Shape>
151                      </Billboard>
152                 </Transform>
153                 <Transform DEF='TestDelete0translation='0 -0.5 0'>
154                      <Billboard axisOfRotation='0 0 0'>
155                           <Shape>
156                                <Text string='"0"'>
157                                     <FontStyle USE='FS'/>
158                                </Text>
159                                <Appearance>
160                                     <Material/>
161                                </Appearance>
162                           </Shape>
163                      </Billboard>
164 
                    <!-- ROUTE information for TouchDelete0 node:  [from isActive to ClockStopper.set_boolean ] [from isActive to TouchDelete0Trigger.set_boolean ] -->
                    <TouchSensor DEF='TouchDelete0description='touch to delete Material[0]'/>
165 
                    <!-- ROUTE information for TouchDelete0Trigger node:  [from TouchDelete0.isActive to set_boolean ] [from triggerValue to MC.deleteMaterial ] -->
                    <IntegerTrigger DEF='TouchDelete0TriggerintegerKey='0'/>
166                      < ROUTE  fromNode='TouchDelete0' fromField='isActive' toNode='ClockStopper' toField='set_boolean'/>
167                      < ROUTE  fromNode='TouchDelete0' fromField='isActive' toNode='TouchDelete0Trigger' toField='set_boolean'/>
168                      < ROUTE  fromNode='TouchDelete0Trigger' fromField='triggerValue' toNode='MC' toField='deleteMaterial'/>
169                 </Transform>
170                 <Transform DEF='TestDelete1translation='0.5 -0.5 0'>
171                      <Billboard axisOfRotation='0 0 0'>
172                           <Shape>
173                                <Text string='"1"'>
174                                     <FontStyle USE='FS'/>
175                                </Text>
176                                <Appearance>
177                                     <Material/>
178                                </Appearance>
179                           </Shape>
180                      </Billboard>
181 
                    <!-- ROUTE information for TouchDelete2 node:  [from isActive to ClockStopper.set_boolean ] [from isActive to TouchDelete2Trigger.set_boolean ] -->
                    <TouchSensor DEF='TouchDelete2description='touch to delete Material[1]'/>
182 
                    <!-- ROUTE information for TouchDelete2Trigger node:  [from TouchDelete2.isActive to set_boolean ] [from triggerValue to MC.deleteMaterial ] -->
                    <IntegerTrigger DEF='TouchDelete2TriggerintegerKey='1'/>
183                      < ROUTE  fromNode='TouchDelete2' fromField='isActive' toNode='ClockStopper' toField='set_boolean'/>
184                      < ROUTE  fromNode='TouchDelete2' fromField='isActive' toNode='TouchDelete2Trigger' toField='set_boolean'/>
185                      < ROUTE  fromNode='TouchDelete2Trigger' fromField='triggerValue' toNode='MC' toField='deleteMaterial'/>
186                 </Transform>
187                 <Transform DEF='TestDelete2translation='1 -0.5 0'>
188                      <Billboard axisOfRotation='0 0 0'>
189                           <Shape>
190                                <Text string='"2"'>
191                                     <FontStyle USE='FS'/>
192                                </Text>
193                                <Appearance>
194                                     <Material/>
195                                </Appearance>
196                           </Shape>
197                      </Billboard>
198 
                    <!-- ROUTE information for TouchDelete1 node:  [from isActive to ClockStopper.set_boolean ] [from isActive to TouchDelete1Trigger.set_boolean ] -->
                    <TouchSensor DEF='TouchDelete1description='touch to delete Material[2]'/>
199 
                    <!-- ROUTE information for TouchDelete1Trigger node:  [from TouchDelete1.isActive to set_boolean ] [from triggerValue to MC.deleteMaterial ] -->
                    <IntegerTrigger DEF='TouchDelete1TriggerintegerKey='1'/>
200                      < ROUTE  fromNode='TouchDelete1' fromField='isActive' toNode='ClockStopper' toField='set_boolean'/>
201                      < ROUTE  fromNode='TouchDelete1' fromField='isActive' toNode='TouchDelete1Trigger' toField='set_boolean'/>
202                      < ROUTE  fromNode='TouchDelete1Trigger' fromField='triggerValue' toNode='MC' toField='deleteMaterial'/>
203                 </Transform>
204            </Transform>
205            <Transform DEF='TestDeleteAlltranslation='1.8 0 0'>
206                 <Billboard axisOfRotation='0 0 0'>
207                      <Shape>
208                           <Text string='"delete" " all"'>
209                                <FontStyle USE='FS'/>
210                           </Text>
211                           <Appearance>
212                                <Material/>
213                           </Appearance>
214                      </Shape>
215 
                    <!-- ROUTE information for TouchDeleteAll node:  [from isActive to ClockStopper.set_boolean ] [from isActive to MC.deleteAllMaterials ] -->
                    <TouchSensor DEF='TouchDeleteAlldescription='touch to delete all Materials'/>
216                      < ROUTE  fromNode='TouchDeleteAll' fromField='isActive' toNode='ClockStopper' toField='set_boolean'/>
217                      < ROUTE  fromNode='TouchDeleteAll' fromField='isActive' toNode='MC' toField='deleteAllMaterials'/>
218                 </Billboard>
219            </Transform>
220       </Scene>
221  </X3D>
<!--

<!--
Event Graph ROUTE Table shows event connections.
-->
<!-- to top DEF nodes index: AddNewMaterialScript, AnimationGroup, Clock, ClockStopper, ClockStopperFilter, FS, MC, RotateBox, TestAppend, TestDelete0, TestDelete1, TestDelete2, TestDeleteAll, TestDeleteOne, TestLoop, TestNext, TestPrevious, ToggleLoop, TouchAppend, TouchDelete0, TouchDelete0Trigger, TouchDelete1, TouchDelete1Trigger, TouchDelete2, TouchDelete2Trigger, TouchDeleteAll, TouchLoop, TouchNext, TouchPrevious, TriggerNext

Index for Viewpoint node: Viewpoint_1

Index for ExternProtoDeclare definition: MaterialChoice
-->
X3D Tooltips element index: Appearance, Billboard, BooleanFilter, BooleanToggle, BooleanTrigger, Box, ExternProtoDeclare, field, fieldValue, FontStyle, Group, head, IntegerTrigger, Material, meta, ProtoInstance, ROUTE, Scene, Script, Shape, Text, TimeSensor, TouchSensor, Transform, Viewpoint, WorldInfo, X3D, plus documentation for accessType definitions, type definitions, XML data types, and field types

Event Graph ROUTE Table entries with 24 ROUTE connections 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.

TouchAppend
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ClockStopper
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopper
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(2)
ClockStopperFilter
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopperFilter
BooleanFilter
inputNegate
SFBool

ROUTE
event to
(3)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(4)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(5)
MC
ProtoInstance
next
SFBool
TouchAppend
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
AddNewMaterialScript
Script
generateAndAppendMaterial
SFBool
then
 
 
 
AddNewMaterialScript
Script
newMaterial
SFNode

ROUTE
event to
(2)
MC
ProtoInstance
appendMaterial
SFNode

TouchDelete0
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ClockStopper
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopper
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(2)
ClockStopperFilter
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopperFilter
BooleanFilter
inputNegate
SFBool

ROUTE
event to
(3)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(4)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(5)
MC
ProtoInstance
next
SFBool
TouchDelete0
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
TouchDelete0Trigger
IntegerTrigger
set_boolean
SFBool
then
 
 
 
TouchDelete0Trigger
IntegerTrigger
triggerValue
SFInt32

ROUTE
event to
(2)
MC
ProtoInstance
deleteMaterial
SFInt32

TouchDelete1
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ClockStopper
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopper
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(2)
ClockStopperFilter
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopperFilter
BooleanFilter
inputNegate
SFBool

ROUTE
event to
(3)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(4)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(5)
MC
ProtoInstance
next
SFBool
TouchDelete1
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
TouchDelete1Trigger
IntegerTrigger
set_boolean
SFBool
then
 
 
 
TouchDelete1Trigger
IntegerTrigger
triggerValue
SFInt32

ROUTE
event to
(2)
MC
ProtoInstance
deleteMaterial
SFInt32

TouchDelete2
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ClockStopper
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopper
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(2)
ClockStopperFilter
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopperFilter
BooleanFilter
inputNegate
SFBool

ROUTE
event to
(3)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(4)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(5)
MC
ProtoInstance
next
SFBool
TouchDelete2
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
TouchDelete2Trigger
IntegerTrigger
set_boolean
SFBool
then
 
 
 
TouchDelete2Trigger
IntegerTrigger
triggerValue
SFInt32

ROUTE
event to
(2)
MC
ProtoInstance
deleteMaterial
SFInt32

TouchDeleteAll
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ClockStopper
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopper
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(2)
ClockStopperFilter
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopperFilter
BooleanFilter
inputNegate
SFBool

ROUTE
event to
(3)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(4)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(5)
MC
ProtoInstance
next
SFBool
TouchDeleteAll
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
MC
ProtoInstance
deleteAllMaterials
SFBool

TouchLoop
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ToggleLoop
BooleanToggle
set_boolean
SFBool
then
 
 
 
ToggleLoop
BooleanToggle
toggle_changed
SFBool

ROUTE
event to
(2)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(3)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(4)
MC
ProtoInstance
next
SFBool

TouchNext
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ClockStopper
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopper
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(2)
ClockStopperFilter
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopperFilter
BooleanFilter
inputNegate
SFBool

ROUTE
event to
(3)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(4)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(5)
MC
ProtoInstance
next
SFBool
TouchNext
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
MC
ProtoInstance
next
SFBool

TouchPrevious
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
ClockStopper
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopper
BooleanFilter
inputTrue
SFBool

ROUTE
event to
(2)
ClockStopperFilter
BooleanFilter
set_boolean
SFBool
then
 
 
 
ClockStopperFilter
BooleanFilter
inputNegate
SFBool

ROUTE
event to
(3)
Clock
TimeSensor
enabled
SFBool
then
 
 
 
Clock
TimeSensor
cycleTime
SFTime

ROUTE
event to
(4)
TriggerNext
BooleanTrigger
set_triggerTime
SFTime
then
 
 
 
TriggerNext
BooleanTrigger
triggerTrue
SFBool

ROUTE
event to
(5)
MC
ProtoInstance
next
SFBool
TouchPrevious
TouchSensor
isActive
SFBool

ROUTE
event to
(1)
MC
ProtoInstance
previous
SFBool

      AddNewMaterialScript
Script
newMaterial
SFNode

ROUTE
event to
(1)
MC
ProtoInstance
appendMaterial
SFNode

      MC
ProtoInstance
MaterialChoice
No direct ROUTE connection found for events to/from this node.
This ProtoInstance contains SFNode/MFNode fieldValue declarations with
direct access to other nodes, and thus has potential to produce run-time animation. 

Additional guidance on X3D animation can be found in the 10-Step Animation Design Process and Event Tracing hint sheets. Have fun with X3D! 😀

-->
<!-- Online at
https://www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoiceExampleIndex.html -->
<!-- Version control at
https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/content/examples/Savage/Tools/Animation/MaterialChoiceExample.x3d -->

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

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