#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
}