#VRML V2.0 utf8 # # World with PROTO interfaces and Behaviors # EXTERNPROTO FSM [ eventIn SFFloat set_clock eventIn SFString set_state field SFVec3f position field SFString start_state field MFNode states field MFNode transitions eventOut SFTime state_change_time field SFNode thisNodeName exposedField SFString old_state exposedField SFBool input ] "protos4.wrl#FSM" EXTERNPROTO FSM_STATE [ eventIn SFFloat set_clock exposedField SFBool enabled field SFNode node field SFNode nodeG field MFNode audio exposedField MFNode geometry field MFString behavior exposedField SFFloat value field SFNode fsm ] "protos4.wrl#FSM_STATE" EXTERNPROTO FSM_TRANSITION [ eventIn SFFloat set_clock field SFNode from field SFNode to field SFNode fsm field SFNode object field SFNode objectG field MFString behavior eventOut SFString state_changed exposedField SFBool state_change exposedField SFBool enabled exposedField SFBool fill exposedField MFNode geometry ] "protos4.wrl#FSM_TRANSITION" EXTERNPROTO INPUT [ eventIn SFTime touched eventOut SFBool enabled eventOut SFBool isActive eventOut SFBool state_changed field SFBool state field SFNode thisNodeName exposedField SFBool state_changing ] "protos4.wrl#INPUT" #EXTERNPROTO WATERLEVEL # [ # exposedField SFVec3f position # field SFRotation rotation # field MFNode geometry # field SFFloat level # eventIn SFTime clock_tick # eventOut SFFloat level_changed #] "protos4.wrl#WATERLEVEL" EXTERNPROTO TANK [ eventIn SFFloat set_height field SFFloat height field SFVec3f text_position field SFVec3f position field SFVec3f tank_position field SFNode thisNodeName exposedField MFString name exposedField SFFloat transparency eventIn SFBool set_up field SFBool up ] "protos4.wrl#TANK" EXTERNPROTO TANK0 [ eventIn SFBool tr ] "protos4.wrl#TANK0" EXTERNPROTO PIPE [ field SFVec3f local_frame field SFRotation frame_rotation field SFVec3f translation field SFRotation rotation field SFRotation funnel_rotation field SFVec3f vert_cyl_translation field SFFloat length exposedField SFFloat transparency ] "protos4.wrl#PIPE" # # World # #DEF B1 Background { skyColor [ 0.3 0.8 0.1, 0.3 0.3 0.3] } NavigationInfo { headlight TRUE type [ "EXAMINE", "ANY" ]} DEF Clock TimeSensor {loop TRUE} DEF Fill_Clock TimeSensor {enabled TRUE cycleInterval 4} DEF Input INPUT { thisNodeName USE Input } DEF Touch TouchSensor {enabled TRUE} DEF Water_Rise ScalarInterpolator { key [0, 1] keyValue [0, 1.75] } DEF Tank0 TANK0 { } DEF Plant FSM { position -6 -2 -6 start_state "s1" thisNodeName USE Plant # Newly added line to use exposedField 'old_state' states [ DEF Tank1 FSM_STATE { fsm USE Plant enabled TRUE geometry DEF Tank1G TANK { text_position -1 1 0 name "s1" tank_position 6 -1 -5 position 6 0 -5 } node USE Tank1 nodeG USE Tank1G behavior "javascript: function set_clock(value,ts) { name = nodeG.name; if(node.enabled) { nodeG.set_up = FALSE; nodeG.set_transparency = 0.0; } else if (fsm.old_state != name) { nodeG.set_transparency = 1; } }" } #DEF Tank1 DEF Tank2 FSM_STATE { fsm USE Plant geometry DEF Tank2G TANK { text_position -1.5 1 0 name "s2" tank_position 9 -1 0 position 9 0 0 } node USE Tank2 nodeG USE Tank2G behavior "javascript: function set_clock(value,ts) { name = nodeG.name; if(node.enabled) { nodeG.set_up = TRUE; nodeG.set_transparency = 0.0; } else if (fsm.old_state == name) { nodeG.set_up = FALSE; } else { nodeG.set_transparency = 1.0; } }" } #DEF Tank2 DEF Tank3 FSM_STATE { fsm USE Plant geometry DEF Tank3G TANK { text_position -1.5 1 0 name "s3" tank_position 3 -1 0 position 3 0 0 } node USE Tank3 nodeG USE Tank3G behavior "javascript: function set_clock(value,ts) { name = nodeG.name; if(node.enabled) { nodeG.set_up = TRUE; nodeG.set_transparency = 0.0; } else if (fsm.old_state == name) { nodeG.set_up = FALSE; } else { nodeG.set_transparency = 1.0; } }" } #DEF Tank3 ] #states transitions [ DEF Pipe1 FSM_TRANSITION { fsm USE Plant from USE Tank1 to USE Tank2 geometry Transform { children [ DEF Pipe1G PIPE { local_frame 8.5 -.8 -2.8 frame_rotation 0 1 0 2.4 translation -.2 0 0 rotation 0 0 1 1.573 } ] #children } #Transform object USE Pipe1 objectG USE Pipe1G behavior "javascript: function set_clock(value,ts) { if (from.enabled) { if (fsm.input==TRUE) { state_changed = 's2'; } } if (object.fill && object.state_change) { objectG.transparency = 0.3; } else { objectG.transparency = 1.0; } } " } #DEF Pipe1 DEF Pipe2 FSM_TRANSITION { fsm USE Plant from USE Tank2 to USE Tank3 geometry DEF Pipe2G PIPE { local_frame 5.5 -.8 0 frame_rotation 0 1 0 0.2 translation 0 0 1 rotation 0 0 1 1.573 } object USE Pipe2 objectG USE Pipe2G behavior "javascript: function set_clock(value,ts) { if (from.enabled) { if (fsm.input==FALSE) { state_changed = 's3'; } } if (object.fill && object.state_change) { objectG.transparency = 0.3; } else { objectG.transparency = 1.0; } } " } #DEF Pipe2 DEF Pipe3 FSM_TRANSITION { fsm USE Plant from USE Tank3 to USE Tank2 geometry DEF Pipe3G PIPE { local_frame 6.4 -.8 .2 frame_rotation 0 1 0 -2.85 translation -.2 0 1 rotation 0 0 1 1.571} object USE Pipe3 objectG USE Pipe3G behavior "javascript: function set_clock(value,ts) { if (from.enabled) { if (fsm.input==TRUE) { state_changed = 's2'; } } if (object.fill && object.state_change) { objectG.transparency = 0.3; } else { objectG.transparency = 1.0; } } " } #DEF Pipe3 ] #transitions }#DEF Plant # # Routes # ROUTE Clock.fraction_changed TO Plant.set_clock ROUTE Touch.touchTime TO Input.touched ROUTE Input.state_changed TO Plant.set_input ROUTE Tank1.enabled_changed TO Pipe1.set_enabled ROUTE Tank2.enabled_changed TO Pipe2.set_enabled ROUTE Tank3.enabled_changed TO Pipe3.set_enabled ROUTE Pipe1.state_changed TO Plant.set_state ROUTE Pipe2.state_changed TO Plant.set_state ROUTE Pipe3.state_changed TO Plant.set_state ROUTE Plant.state_change_time TO Fill_Clock.set_startTime ROUTE Fill_Clock.isActive TO Pipe1.set_state_change ROUTE Fill_Clock.isActive TO Pipe2.set_state_change ROUTE Fill_Clock.isActive TO Pipe3.set_state_change ROUTE Fill_Clock.isActive TO Input.state_changing ROUTE Fill_Clock.fraction_changed TO Water_Rise.set_fraction ROUTE Water_Rise.value_changed TO Tank1G.set_height ROUTE Water_Rise.value_changed TO Tank2G.set_height ROUTE Water_Rise.value_changed TO Tank3G.set_height ROUTE Input.state_changed TO Tank0.tr