#VRML V2.0 utf8 PROTO LEVEL [ exposedField SFVec3f position 0 0 0 field SFRotation rotation 0 0 0 0 field MFNode contains [] field MFNode geometry [] field MFNode behavior [] eventIn SFTime clock_tick field SFFloat max_level 10.0 field SFFloat min_level 0.0 field SFFloat level 1.0 eventIn SFFloat input_rate eventIn SFFloat output_rate field SFFloat delta_time 1.0 eventOut SFFloat level_changed ] { Transform { translation IS position rotation IS rotation children [ Group {children IS contains} Group {children IS geometry} Group {children IS behavior} ] } DEF RateS Script { eventIn SFTime clock_tick IS clock_tick field SFFloat max_level IS max_level field SFFloat min_level IS min_level field SFFloat level IS level eventIn SFFloat input_rate IS input_rate eventIn SFFloat output_rate IS output_rate field SFFloat delta_time IS delta_time eventOut SFFloat level_changed IS level_changed field SFFloat inRate 0.0 field SFFloat outRate 0.0 url "javascript: function clock_tick(value, ts) { level = level + ((inRate - outRate) / delta_time); if (level > max_level) level = max_level; else if (level < min_level) level = min_level; level_changed = level; } function input_rate(value, ts) { inRate = value; } function output_rate(value, ts) { outRate = value; }" } } PROTO RATE [ exposedField SFVec3f position 0 0 0 field SFRotation rotation 0 0 0 0 field MFNode contains [] field MFNode geometry [] field MFNode behavior [] eventIn SFTime clock_tick field SFFloat rate 1.0 eventIn SFFloat set_rate eventOut SFFloat rate_changed ] { Transform { translation IS position rotation IS rotation children [ Group {children IS contains} Group {children IS geometry} Group {children IS behavior} ] } DEF RateS Script { eventIn SFTime clock_tick IS clock_tick field SFFloat rate IS rate eventIn SFFloat set_rate IS set_rate eventOut SFFloat rate_changed IS rate_changed field SFFloat upOrDown 1.0 url "javascript: function clock_tick(value, ts) { deltaRate = Math.random(); if (deltaRate > 0.5) deltaRate = (deltaRate - 0.5) * -1; rate = rate + (deltaRate * 0.1); if (rate > 3) rate = 3; else if (rate < 0) rate = 0; rate_changed = rate; } function set_rate(value, ts) { rate = value; }" } } PROTO LEVEL_GEO [ eventIn SFFloat set_y exposedField MFString text [] field SFVec3f position 0 0 0 field SFVec3f textPosition 0 0 0 field SFFloat trans 0.0 ] { Transform { translation IS position children [ Shape { geometry Cylinder { height 6.0 radius 3.0 } appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 transparency IS trans } } } Transform { translation 0 -2.95 0 children Shape { geometry DEF InnerC Extrusion { crossSection [ 2.9 0, 2.5114 -1.45, 1.45 -2.5114, 0 -2.9, -1.45 -2.5114, -2.5114 -1.45, -2.9 0, -2.5114 1.45, -1.45 2.5114, 0 2.9, 1.45 2.5114, 2.5114 1.45, 2.9 0 ] spine [ 0 0 0 ] } appearance Appearance { material Material { diffuseColor 0 0 1 } } } } DEF Anim Script { eventIn SFFloat set_y IS set_y field SFVec3f curr_y 0 0 0 field SFVec3f new_y 0 0 0 field MFVec3f y_out [] eventOut MFVec3f y_changed eventOut SFTime start_anim url "javascript: function set_y(y,ts) { new_y.y = y*5.9; y_out[0] = curr_y; y_out[1] = new_y; y_changed = y_out; start_anim = ts; curr_y = new_y; }" } DEF NewSpine Script { eventIn SFVec3f set_spine eventOut MFVec3f spine_changed url "javascript: function set_spine(spine1) { spine_changed[1] = spine1; }" } DEF AnimT TimeSensor { cycleInterval 0.5 } DEF PI PositionInterpolator { key [ 0.0, 1.0 ] } Transform { translation IS textPosition children Billboard { axisOfRotation 0 0 0 children Shape { geometry Text { string IS text fontStyle FontStyle { justify [ "MIDDLE" "MIDDLE" ] } } appearance Appearance { material Material { diffuseColor 0 0 0 } } } } } ]} ROUTE Anim.y_changed TO PI.keyValue ROUTE Anim.start_anim TO AnimT.startTime ROUTE AnimT.fraction_changed TO PI.set_fraction ROUTE PI.value_changed TO NewSpine.set_spine ROUTE NewSpine.spine_changed TO InnerC.set_spine } #LEVEL_GEO