#VRMLV2.0 utf8 ##:@* proto-clock ##@ interface EXTERNPROTO ClockMechanism [ eventIn SFInt32 set_hour eventIn SFInt32 set_minute eventIn SFInt32 set_second field SFBool autoClock field SFInt32 hour field SFInt32 minute field SFInt32 second field SFVec3f hourHandAxis field SFVec3f minuteHandAxis field SFVec3f secondHandAxis field SFBool twentyFourHours eventOut SFInt32 hour_changed eventOut SFInt32 minute_changed eventOut SFInt32 second_changed eventOut SFRotation hourHand_changed eventOut SFRotation minuteHand_changed eventOut SFRotation secondHand_changed ] { Group { children [ DEF TS TimeSensor { loop TRUE } DEF SCRIPT Script { eventIn SFInt32 set_hour IS set_hour eventIn SFInt32 set_minute IS set_minute eventIn SFInt32 set_second IS set_second eventIn SFTime set_time field SFInt32 hr field SFInt32 min field SFInt32 sec field SFVec3f hrAx field SFVec3f minAx field SFVec3f secAx field SFBool do24 field SFBool auto field SFBool first eventOut SFRotation hourHand_changed IS hourHand_changed eventOut SFRotation minuteHand_changed IS minuteHand_changed eventOut SFRotation secondHand_changed IS secondHand_changed url["javascript: // private: function autoSetTime() { currentDate = new Date(); hr = currentDate.getHours(); min = currentDate.getMinutes(); sec = currentDate.getSeconds(); } function time2Rot() { // set some constants PIPI = Math.PI * 2; numHrs = 12; if(do24) { numHrs = 24; } // find radians (what portion of a full circle-- x * 2PI; x: 0 -> 1) secRad = (sec / 60) * PIPI; minRad = (min / 60) * PIPI; hrRad = (hr / numHrs) * PIPI; // adjust minute and hour hands for smooth interpolation minRad += secRad / 60; hrRad += minRad / numHrs; // create the new rotations secondHand_changed = new SFRotation(secAx, -secRad); minuteHand_changed = new SFRotation(minAx, -minRad); hourHand_changed = new SFRotation(hrAx, -hrRad); } function initialize() { if(auto) { autoSetTime(); } } //@ public: function set_time(tickTock) { if(first || TRUE) { first = FALSE; // get time from computer, if autoClock is on if(auto) { autoSetTime(); } // or keep our own time else { sec ++; if(sec > 59) { sec = 0; min++; } if(min > 59) { min = 0; hr++; } if(do24) { if(hr > 23) { hr = 0; } } else { if(hr > 11) { hr = 0; } } } time2Rot(); hour_changed = hr; minute_changed = min; second_changed = sec; } else { first = TRUE; } } function set_hour(h) { hr = h; } function set_minute(m) { min = m; } function set_second(s) { sec = s; } "] } ] } ROUTE TS.cycleTime TO SCRIPT.set_time } ##