AvatarRelativeOverlays = function() {
    // id -> position & rotation
    this.overlays = {};
    this.lastAvatarTransform = {
        position: ZERO_VECTOR,
        rotation: IDENTITY_QUATERNION,
    };
}

// FIXME judder in movement is annoying....  add an option to
// automatically hide all overlays when the position or orientation change and then
// restore the ones that were previously visible once the movement stops.
AvatarRelativeOverlays.prototype.onUpdate = function(deltaTime) {
    // cache avatar position and orientation and only update on change
    if (Vec3.equal(this.lastAvatarTransform.position, MyAvatar.position) &&
        Quat.equal(this.lastAvatarTransform.rotation, MyAvatar.orientation)) {
        return;
    }

    this.lastAvatarTransform.position = MyAvatar.position;
    this.lastAvatarTransform.rotation = MyAvatar.orientation;
    for (var overlayId in this.overlays) {
        this.updateOverlayTransform(overlayId);
    }
}

AvatarRelativeOverlays.prototype.updateOverlayTransform = function(overlayId) {
    Overlays.editOverlay(overlayId, {
        position: getEyeRelativePosition(this.overlays[overlayId].position),
        rotation: getAvatarRelativeRotation(this.overlays[overlayId].rotation),
    })
}

AvatarRelativeOverlays.prototype.addOverlay = function(type, overlayDefinition) {
    var overlayId = Overlays.addOverlay(type, overlayDefinition);
    if (!overlayId) {
        logDebug("Failed to create overlay of type " + type);
        return;
    }
    this.overlays[overlayId] = {
        position: overlayDefinition.position || ZERO_VECTOR,
        rotation: overlayDefinition.rotation || IDENTITY_QUATERNION,
    };
    this.updateOverlayTransform(overlayId);
    return overlayId;
}

AvatarRelativeOverlays.prototype.deleteAll = function() {
    for (var overlayId in this.overlays) {
        Overlays.deleteOverlay(overlayId);
    }
    this.overlays = {};
}