Wand = function() {
    // Max updates fps
    this.DEFAULT_TIP_COLORS = [ {
        red: 128,
        green: 128,
        blue: 128,
    }, {
        red: 0,
        green: 0,
        blue: 0,
    }];
    this.POINTER_ROTATION = Quat.fromPitchYawRollDegrees(45, 0, 45);

    
    this.pointers = [
        Overlays.addOverlay("cube", {
            position: ZERO_VECTOR,
            color: this.DEFAULT_TIP_COLORS[0],
            alpha: 1.0,
            solid: true,
            visible: false,
        }),
        Overlays.addOverlay("cube", {
            position: ZERO_VECTOR,
            color: this.DEFAULT_TIP_COLORS[1],
            alpha: 1.0,
            solid: true,
            visible: false,
        }) 
    ];
    
    this.wand = Overlays.addOverlay("cube", {
        position: ZERO_VECTOR,
        color: COLORS.WHITE,
        dimensions: { x: 0.01, y: 0.01, z: 0.2 },
        alpha: 1.0,
        solid: true,
        visible: false
    });
    
    var _this = this;
    Script.scriptEnding.connect(function() {
        _this.onCleanup();
    });
} 

Wand.prototype = Object.create( ModelBase.prototype );

Wand.prototype.setVisible = function(visible) {
    ModelBase.prototype.setVisible.call(this, visible);
    Overlays.editOverlay(this.pointers[0], {
        visible: this.visible
    });
    Overlays.editOverlay(this.pointers[1], {
        visible: this.visible
    });
    Overlays.editOverlay(this.wand, {
        visible: this.visible
    });
}

Wand.prototype.setTransform = function(transform) {
    ModelBase.prototype.setTransform.call(this, transform);
    var wandPosition = Vec3.sum(this.position, Vec3.multiply(0.5, this.tipVector));
    Overlays.editOverlay(this.pointers[0], {
        position: this.tipPosition,
        rotation: this.rotation,
        visible: true,
    });
    Overlays.editOverlay(this.pointers[1], {
        position: this.tipPosition,
        rotation: Quat.multiply(this.POINTER_ROTATION, this.rotation),
        visible: true,
    });
    Overlays.editOverlay(this.wand, {
        dimensions: { x: 0.01, y: this.length * 0.9, z: 0.01 },            
        position: wandPosition,
        rotation: this.rotation,
        visible: true,
    });
}

Wand.prototype.setTipColors = function(color1, color2) {
    Overlays.editOverlay(this.pointers[0], {
        color: color1 || this.DEFAULT_TIP_COLORS[0],
    });
    Overlays.editOverlay(this.pointers[1], {
        color: color2 || this.DEFAULT_TIP_COLORS[1],
    });
}

Wand.prototype.onUpdate = function(deltaTime) {
    if (this.visible) {
        var time = new Date().getTime() / 250;
        var scale1 = Math.abs(Math.sin(time));
        var scale2 = Math.abs(Math.cos(time));
        Overlays.editOverlay(this.pointers[0], {
            scale: scale1 * 0.01,
        });
        Overlays.editOverlay(this.pointers[1], {
            scale: scale2 * 0.01,
        });
    }
}

Wand.prototype.onCleanup = function() {
    Overlays.deleteOverlay(this.pointers[0]);
    Overlays.deleteOverlay(this.pointers[1]);
    Overlays.deleteOverlay(this.wand);
}