#VRML V2.0 utf8 EXTERNPROTO Square [ field SFRotation rotation field SFVec3f size field SFVec3f position field SFColor color ] "square.wrl" PROTO Eye [ field SFTime blinkFreq 5 field SFVec3f size 1 1 1 field SFVec3f position 0 0 0 eventIn SFTime set_blinkFreq eventIn SFFloat set_lookHorizontal eventIn SFFloat set_lookVertical ] { Group { children [ Transform { translation IS position scale IS size children DEF BLINKEE Transform { children [ Square { rotation 0 0 1 .79 } DEF LOOK Transform { children Square { color 0 0 0 position 0 0 .05 size .25 .25 .25 } } ] } } DEF STARTMEUP ProximitySensor { size 1000 1000 1000 } DEF BLINKTIMER TimeSensor { cycleInterval .25 } DEF ALARM TimeSensor { cycleInterval IS blinkFreq } DEF BLINKER PositionInterpolator { key [ 0 .5 1 ] keyValue [ 1 1 1, 1 .1 1, 1 1 1 ] } DEF SCRIPT Script { eventIn SFTime set_blinkFreq IS set_blinkFreq eventIn SFTime cycleTime eventIn SFFloat set_lookHorizontal IS set_lookHorizontal eventIn SFFloat set_lookVertical IS set_lookVertical eventOut SFTime blinkFreq_changed eventOut SFTime startTime eventOut SFVec3f lookAt field SFTime blinkFreq IS blinkFreq field SFBool first TRUE field SFVec3f look 0 0 0 url "vrmlscript: function set_blinkFreq(val) { blinkFreq = val+1; } function set_lookAt(val) { lookAt = val; } function cycleTime(val) { if(first) { first = FALSE; } else { first = TRUE; // put here to send while timer stopped, else ignored blinkFreq_changed = blinkFreq; startTime = val+.1; } } // [0..1] function set_lookHorizontal(val) { look = new SFVec3f(val*2-1, look.y, 0); lookAt = look; } function set_lookVertical(val) { look = new SFVec3f(look.x, val*2-1, 0); lookAt = look; } " } ] } ROUTE STARTMEUP.enterTime TO ALARM.startTime ROUTE STARTMEUP.enterTime TO BLINKTIMER.startTime ROUTE ALARM.cycleTime TO SCRIPT.cycleTime ROUTE SCRIPT.startTime TO ALARM.startTime ROUTE SCRIPT.startTime TO BLINKTIMER.startTime ROUTE BLINKTIMER.fraction_changed TO BLINKER.set_fraction ROUTE BLINKER.value_changed TO BLINKEE.scale ROUTE SCRIPT.blinkFreq_changed TO ALARM.cycleInterval ROUTE SCRIPT.lookAt TO LOOK.translation }