diff --git a/examples/entityScripts/alternativeLightController.js b/examples/entityScripts/alternativeLightController.js new file mode 100644 index 0000000000..c3ea56ff77 --- /dev/null +++ b/examples/entityScripts/alternativeLightController.js @@ -0,0 +1,100 @@ +(function() { + this.preload = function(entityId) { + var soundURLs = ["https://hifi-public.s3.amazonaws.com/sounds/Switches%20and%20sliders/lamp_switch_1.wav", + "https://hifi-public.s3.amazonaws.com/sounds/Switches%20and%20sliders/lamp_switch_2.wav", + "https://hifi-public.s3.amazonaws.com/sounds/Switches%20and%20sliders/lamp_switch_3.wav"]; + this.entityId = entityId; + this.properties = Entities.getEntityProperties(this.entityId); + this.previousPosition = this.properties.position; + this.previousRotation = this.properties.rotation; + this.getUserData() + if (!this.userData) { + this.userData = {}; + this.userData.lightOn = false; + this.userData.soundIndex = Math.floor(Math.random() * soundURLs.length); + this.updateUserData(); + } + this.sound = SoundCache.getSound(soundURLs[this.userData.soundIndex]); + } + + + this.getUserData = function() { + if (this.properties.userData) { + this.userData = JSON.parse(this.properties.userData); + } + return false; + } + + this.updateUserData = function() { + Entities.editEntity(this.entityId, { + userData: JSON.stringify(this.userData) + }); + } + + this.clickReleaseOnEntity = function(entityId, mouseEvent) { + if (!mouseEvent.isLeftButton) { + return; + } + //first find closest light + this.entityId = entityId + this.playSound(); + this.properties = Entities.getEntityProperties(this.entityId) + this.light = this.findClosestLight(); + if (this.light) { + this.lightProperties = Entities.getEntityProperties(this.light); + this.getUserData(); + Entities.editEntity(this.light, { + visible: !this.userData.lightOn + }); + + this.userData.lightOn = !this.userData.lightOn; + this.updateUserData(); + this.tryMoveLight(); + } + } + + this.playSound = function() { + if (this.sound && this.sound.downloaded) { + Audio.playSound(this.sound, { + position: this.properties.position, + volume: 0.3 + }); + } else { + print("Warning: Couldn't play sound."); + } + } + + this.tryMoveLight = function() { + if (this.light) { + //compute offset position + var offsetPosition = Quat.multiply(Quat.inverse(this.previousRotation), Vec3.subtract(this.lightProperties.position, this.previousPosition)); + var newPosition = Vec3.sum(this.properties.position, Vec3.multiplyQbyV(this.properties.rotation, offsetPosition)); + if (!Vec3.equal(newPosition, this.lightProperties.position)) { + Entities.editEntity(this.light, {position: newPosition}); + } + this.previousPosition = this.properties.position; + this.previousRotation = this.properties.rotation; + } + + } + + this.findClosestLight = function() { + var entities = Entities.findEntities(this.properties.position, 10); + var lightEntities = []; + var closestLight = null; + var nearestDistance = 20 + + for (var i = 0; i < entities.length; i++) { + var props = Entities.getEntityProperties(entities[i]); + if (props.type === "Light") { + var distance = Vec3.distance(props.position, this.properties.position) + if (distance < nearestDistance) { + closestLight = entities[i]; + nearestDistance = distance + } + } + } + return closestLight; + } + +}); \ No newline at end of file