#VRML V2.0 utf8 ##################### HUDMenu PROTO ############################ PROTO HUDMenu [#exposedField MFNode someHUDItem NULL eventOut MFString load_url_into_world eventOut MFString remove_url_from_world eventIn MFNode addHUDItem eventIn MFNode removeHUDItem eventIn MFString url_passed_from_child ] { DEF HUDGroup Group { } DEF HUDScript Script { eventIn MFNode addItem IS addHUDItem eventIn MFNode removeItem IS removeHUDItem eventOut MFNode removeMeFromGroup eventOut MFNode addMeToGroup url "javascript: function initialize(){ count=0; } function addItem(Item) { count++; addMeToGroup=Item; } function removeItem(Item) { removeMeFromGroup=Item; count--; } " } ROUTE HUDScript.removeMeFromGroup TO HUDGroup.addChildren ROUTE HUDScript.addMeToGroup TO HUDGroup.addChildren } ##################### HUDMenuItem PROTO ############################ PROTO HUDMenuItem [field MFString objectURL "" exposedField SFVec3f menu_translation 0 0 0 exposedField SFRotation menu_rotation 0 0 1 0 field MFString onTexture "" field MFString offTexture "" eventOut MFNode passObjectToWorld eventOut MFNode removeObjectFromWorld eventIn SFVec3f translation_changed eventIn SFRotation rotation_changed ] { Transform { translation 0 0 -0.2 children [ DEF WorldItemSwitch Switch { whichChoice 0 choice [ DEF InlineTransform Transform { children [ Inline { url IS objectURL } ] } ] } Transform { translation IS menu_translation # This is unique for each MenuItem rotation IS menu_rotation # allowing multiple MenuItems in a singel HUD. scale 0.03 0.01 0.03 children [ DEF MenuSensor TouchSensor { enabled TRUE } # MenuSensor TouchSensor Shape { appearance Appearance { texture DEF ButtonTexture ImageTexture { url "" } # texture ImageTexture } # Appearance geometry DEF MenuButton IndexedFaceSet { coord Coordinate { point [ 0 0 0, 1 1 0, 0 1 0, 1 0 0 ] } # coordinate coordIndex [ 0 3 1 2 ] } # geometry IndexedFaceSet } # children Shape ] } ] } DEF MenuScript Script{ eventIn SFRotation rotation_changed IS rotation_changed eventIn SFVec3f translation_changed IS translation_changed eventIn SFTime touchTime field MFString onButtonURL IS onTexture field MFString offButtonURL IS offTexture eventOut SFInt32 whichChoice eventOut MFString buttonURL eventOut SFVec3f set_translation eventOut SFRotation set_rotation url "javascript: function initialize() { buttonURL=offButtonURL; whichChoice=-1; } // initialize() function rotation_changed(val){ set_rotation=val.inverse(); } function translation_changed(val){ set_translation=val.multiply(-1); } function touchTime(val){ if (whichChoice==-1){ // Then turn it On (to 0) whichChoice=0; buttonURL=onButtonURL; } else if (whichChoice==0) { // Then turn it Off (to -1) whichChoice=-1; buttonURL=offButtonURL; } else { buttonURL=new MFString(''); } // else } // touchTime() " } # DEF MenuScript Script ROUTE MenuScript.set_rotation TO InlineTransform.set_rotation ROUTE MenuScript.set_translation TO InlineTransform.set_translation ROUTE MenuScript.buttonURL TO ButtonTexture.set_url ROUTE MenuScript.whichChoice TO WorldItemSwitch.whichChoice ROUTE MenuSensor.touchTime TO MenuScript.touchTime } ##################### WORLD GROUP PROTO ############################ PROTO WorldGroup [eventIn MFNode remove_component eventIn MFNode add_component # eventIn SFVec3f hud_translation_changed # eventIn SFRotation hud_rotation_changed ] { DEF WorldTransform Transform { children [ DEF WorldGroup Group { children Inline { url "jan19.wrl" } } ] } DEF WorldScript Script { # eventIn SFVec3f hud_translation_changed IS hud_translation_changed # eventIn SFRotation hud_rotation_changed IS hud_rotation_changed eventIn MFNode remove_component IS remove_component eventIn MFNode add_component IS add_component eventOut MFNode removeMe eventOut MFNode addMe eventOut SFVec3f this_translation eventOut SFRotation this_rotation url "javascript: function remove_component(val){ removeMe=val; } function add_component(val){ addMe=val; } // function hud_translation_changed(val){ // this_translation=val.multiply(-1); // // } // function hud_rotation_changed(val){ // } " } ROUTE WorldScript.this_translation TO WorldTransform.set_translation ROUTE WorldScript.this_rotation TO WorldTransform.set_rotation ROUTE WorldScript.removeMe TO WorldGroup.removeChildren ROUTE WorldScript.addMe TO WorldGroup.addChildren } ################### PositionSensor (for HUD) #################### DEF POSITIONSENSOR ProximitySensor { # enabled FALSE size 400000 400000 400000 } ######################## World Transform ######################## Transform { children [ DEF World Group { } ] } ######## BEGIN MENU CONSTRUCTION NOW ######## DEF HUDTransform Transform { #translation 0 0 10 children [ Collision { collide FALSE children [ DirectionalLight { ambientIntensity 0.8 } # DEF HUD HUDMenu {} Group { children [ Transform { children DEF TRANSECT_MENU HUDMenuItem { objectURL "transects.wrl" menu_translation -0.15 0 0 menu_rotation 0 0 1 0 onTexture "transectson.gif" offTexture "transectsoff.gif" } } Transform { children DEF RAINGAUGE_MENU HUDMenuItem { objectURL "raingauges.wrl" menu_translation -0.15 0.02 0 menu_rotation 0 0 1 0 onTexture "raingaugeson.gif" offTexture "raingaugesoff.gif" } } Transform { children DEF CORRAL_MENU HUDMenuItem { objectURL "corrals.wrl" menu_translation -0.15 0.01 0 menu_rotation 0 0 1 0 onTexture "corralson.gif" offTexture "corralsoff.gif" } } Transform { children DEF SRER_MENU HUDMenuItem { objectURL "tanks.wrl" menu_translation -0.15 -0.01 0 menu_rotation 0 0 1 0 onTexture "tankson.gif" offTexture "tanksoff.gif" } } ] } ] } ] } ######################## HUD Viewpoint ######################## DEF HUDVIEW Viewpoint { isBound TRUE description "HUD" position 0 0 10 orientation 0 0 -1 0 } ROUTE POSITIONSENSOR.position_changed TO HUDTransform.set_translation ROUTE POSITIONSENSOR.orientation_changed TO HUDTransform.set_rotation #ROUTE POSITIONSENSOR.position_changed TO World.hud_translation_changed #ROUTE POSITIONSENSOR.orientation_changed TO World.hud_rotation_changed ROUTE RAINGAUGE_MENU.passObjectToWorld TO World.addChildren ROUTE RAINGAUGE_MENU.removeObjectFromWorld TO World.removeChildren #ROUTE RAINGAUGE_MENU.passObjectToWorld TO World.add_component #ROUTE RAINGAUGE_MENU.removeObjectFromWorld TO World.remove_component #ROUTE TRANSECT_MENU.passObjectToWorld TO World.add_component #ROUTE TRANSECT_MENU.removeObjectFromWorld TO World.remove_component #ROUTE CORRAL_MENU.passObjectToWorld TO World.add_component #ROUTE CORRAL_MENU.removeObjectFromWorld TO World.remove_component #ROUTE SRER_MENU.passObjectToWorld TO World.add_component #ROUTE SRER_MENU.removeObjectFromWorld TO World.remove_component