var POINT_LIGHT_URL = "http://s3.amazonaws.com/hifi-public/images/tools/point-light.svg"; var SPOT_LIGHT_URL = "http://s3.amazonaws.com/hifi-public/images/tools/spot-light.svg"; LightOverlayManager = function() { var self = this; var visible = false; // List of all created overlays var allOverlays = []; // List of overlays not currently being used var unusedOverlays = []; // Map from EntityItemID.id to overlay id var entityOverlays = {}; // Map from EntityItemID.id to EntityItemID object var entityIDs = {}; this.updatePositions = function(ids) { for (var id in entityIDs) { var entityID = entityIDs[id]; var properties = Entities.getEntityProperties(entityID); Overlays.editOverlay(entityOverlays[entityID.id], { position: properties.position }); } }; this.findRayIntersection = function(pickRay) { var result = Overlays.findRayIntersection(pickRay); var found = false; if (result.intersects) { for (var id in entityOverlays) { if (result.overlayID == entityOverlays[id]) { result.entityID = entityIDs[id]; found = true; break; } } if (!found) { result.intersects = false; } } return result; }; this.setVisible = function(isVisible) { if (visible != isVisible) { visible = isVisible; for (var id in entityOverlays) { Overlays.editOverlay(entityOverlays[id], { visible: visible }); } } }; // Allocate or get an unused overlay function getOverlay() { if (unusedOverlays.length == 0) { var overlay = Overlays.addOverlay("billboard", { }); allOverlays.push(overlay); } else { var overlay = unusedOverlays.pop(); }; return overlay; } function releaseOverlay(overlay) { unusedOverlays.push(overlay); Overlays.editOverlay(overlay, { visible: false }); } function addEntity(entityID) { var properties = Entities.getEntityProperties(entityID); if (properties.type == "Light" && !(entityID.id in entityOverlays)) { var overlay = getOverlay(); entityOverlays[entityID.id] = overlay; entityIDs[entityID.id] = entityID; Overlays.editOverlay(overlay, { position: properties.position, url: properties.isSpotlight ? SPOT_LIGHT_URL : POINT_LIGHT_URL, rotation: Quat.fromPitchYawRollDegrees(0, 0, 270), visible: visible, alpha: 0.9, scale: 0.5, color: { red: 255, green: 255, blue: 255 } }); } } function deleteEntity(entityID) { if (entityID.id in entityOverlays) { releaseOverlay(entityOverlays[entityID.id]); delete entityOverlays[entityID.id]; } } function changeEntityID(oldEntityID, newEntityID) { entityOverlays[newEntityID.id] = entityOverlays[oldEntityID.id]; entityIDs[newEntityID.id] = newEntityID; delete entityOverlays[oldEntityID.id]; delete entityIDs[oldEntityID.id]; } function clearEntities() { for (var id in entityOverlays) { releaseOverlay(entityOverlays[id]); } entityOverlays = {}; entityIDs = {}; } Entities.addingEntity.connect(addEntity); Entities.changingEntityID.connect(changeEntityID); Entities.deletingEntity.connect(deleteEntity); Entities.clearingEntities.connect(clearEntities); // Add existing entities var ids = Entities.findEntities(MyAvatar.position, 64000); for (var i = 0; i < ids.length; i++) { addEntity(ids[i]); } Script.scriptEnding.connect(function() { for (var i = 0; i < allOverlays.length; i++) { Overlays.deleteOverlay(allOverlays[i]); } }); };