Eye

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


mrl