(function() { Script.include("http://hifi-public.s3.amazonaws.com/scripts/libraries/utils.js");//../../libraries/utils.js"); // Constants const CLOCKFACE_UID = "50a4580f-3bf8-4bf5-8af8-0bc6865f7608"; //; Set to match the UID of the clock face please const CLOCKBODY_UID = "50a4580f-3bf8-4bf5-8af8-0bc6865f7608"; //; Set to match the UID of the clock please const SND_TICKING_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/Sounds/cuckoo_clock/cuckoo_tick.L.wav"; const SND_CUCKOO_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/Sounds/cuckoo_clock/cuckoo%20mix.wav"; //://hifi-content.s3.amazonaws.com/DomainContent/Home/Sounds/cuckoo_clock/cuckoo_strike1.L.wav"; const ANIM_CUCKOO_URL = "http://hifi-content.s3.amazonaws.com/caitlyn/dev/cuckoo/clockFaceTest3.fbx"; // Timekeeping var secPos = 0; var minPos = 0; var hourPos = 0; var d = new Date(); // Clock hands var secondJointIndex = Entities.getJointIndex(CLOCKFACE_UID, "jointSecond"); var minuteJointIndex = Entities.getJointIndex(CLOCKFACE_UID, "jointMinute"); var hourJointIndex = Entities.getJointIndex(CLOCKFACE_UID, "jointHour"); // Chime and cuckooing logistics var isCuckooing = false; var cuckooSoundTimer; var cuckooCount = 0; // Cuckoos called on the hour var chimeCount = 0; // Chimes called on the quarter hour: 4, 1, 2, 3 var cuckooingTime = 0; var ChimeTypes = { HOUR: 0, QUARTER: 1, HALF: 2, THREEQUARTER: 3 }; // Sound caching var tickerSound = SoundCache.getSound(SND_TICKING_URL); var cuckooSound = SoundCache.getSound(SND_CUCKOO_URL); var sndPosition = Entities.getEntityProperties(CLOCKBODY_UID, "position").position; // Accept a parameter and chime appropriately function ChimeClock(chimeType) { var d = new Date(); h = d.getHours(); h = h % 12; if (isCuckooing) return; cuckooCount = 0; if (chimeType == ChimeTypes.QUARTER) chimeCount = 1; // DEPENDING ON CHIME TYPE, PLAY THE APPROPRIATE NUMBER OF TIMES if (chimeType == ChimeTypes.HALF) chimeCount = 2; if (chimeType == ChimeTypes.THREEQUARTER) chimeCount = 3; if (chimeType == ChimeTypes.HOUR) { isCuckooing = true; cuckooCount = h; cuckooingTime = d.getTime() + (cuckooCount * 3000); chimeCount = 4; PlayCuckooSound(); cuckooSoundTimer = Script.setInterval(function() { PlayCuckooSound(); }, 3000); Entities.editEntity(CLOCKBODY_UID, { animation: { url: ANIM_CUCKOO_URL, fps: 30, firstFrame: 0, lastFrame: 90, currentFrame: 0, loop: true, running: true } }); } } // Move the clock hand. Actually we are rotating the joint to which each child is parented function SetClockHand(entityID, jointIndex) { // pass current time as parameter resetChime = true; var d = new Date(); h = d.getHours(); h = h % 12; jointRot = Entities.getAbsoluteJointRotationInObjectFrame(entityID, jointIndex); // get current rotation of the joint entRot = Quat.safeEulerAngles(jointRot); parentRot = Quat.safeEulerAngles(Entities.getEntityProperties(entityID, "rotation")); entRot.x = parentRot.x; entRot.y = parentRot.y; if (jointIndex == secondJointIndex) { secPos = 360 - 360 / (60 / d.getSeconds()); entRot.z = secPos; } if (jointIndex == minuteJointIndex) { minRot = 60 / d.getMinutes(); minRot = 360 / minRot; entRot.z = 360 - minRot; //print("minRot "+minRot) if (minRot == 0) ChimeClock(ChimeTypes.HOUR); if (minRot == 180) ChimeClock(ChimeTypes.HALF); if (minRot == 90) ChimeClock(ChimeTypes.QUARTER); if (minRot == 270) ChimeClock(ChimeTypes.THREEQUARTER); } if (jointIndex == hourJointIndex) { hourPos = 360 - 360 / (12 / h); entRot.z = hourPos; } newRot = Quat.fromVec3Degrees(entRot); Entities.setAbsoluteJointRotationInObjectFrame(entityID, jointIndex, newRot); } // Continuously monitor the state of the cuckooing in order to turn it off. function Update(deltaTime) { var dt = new Date(); s = dt.getTime(); // print(s); if (s > cuckooingTime - 3000) Script.clearTimeout(cuckooSoundTimer); if (cuckooingTime > 0 && s > cuckooingTime) { // turn off cuckoo isCuckooing = false; cuckooingTime = 0; //Script.clearTimeout(cuckooSoundTimer); Entities.editEntity(CLOCKBODY_UID, { animation: { url: ANIM_CUCKOO_URL, currentFrame: 0, loop: true, running: false } }); } } // Cuckoo! function PlayCuckooSound() { var options = { loop: false, position: sndPosition, volume: 0.11 } var cuckooInjector = Audio.playSound(cuckooSound, options); } // Make sure the clock doors are closed and fire up the ticker function InitClock() { cuckooingTime = d.getTime() + (5 * 3000); // 3000 = 3 seconds Entities.editEntity(CLOCKBODY_UID, { animation: { url: ANIM_CUCKOO_URL, fps: 30, firstFrame: 0, lastFrame: 90, currentFrame: 0, loop: true, running: false } }); var options = { loop: true, position: sndPosition, volume: 0.11 } var tickingInjector = Audio.playSound(tickerSound, options); } InitClock(); ChimeClock(ChimeTypes.HOUR); //var secondHandTimer = Script.setInterval(function() { SetClockHand(CLOCKFACE_UID, secondJointIndex); }, 1000); //var minuteHandTimer = Script.setInterval(function() { SetClockHand(CLOCKFACE_UID, minuteJointIndex); }, 1000); //var hourHandTimer = Script.setInterval(function() { SetClockHand(CLOCKFACE_UID, hourJointIndex); }, 1000); // Connect a call back that happens every frame. Script.update.connect(Update);