//  skyboxTest.js
//  examples/tests/skybox
//
//  Created by Zach Pomerantz on  3/10/2016.
//  Copyright 2016 High Fidelity, Inc.
//
//  This test cycles through different variations on the skybox with a mouseclick.
//  For the test to pass, you should observe the following cycle:
//  - Procedural skybox (no texture, no color)
//  - Procedural skybox (no texture, with color)
//  - Procedural skybox (with texture, no color)
//  - Procedural skybox (with texture, with color)
//  - Color skybox (no texture)
//  - Color skybox (with texture)
//  - Texture skybox (no color)
//
//  As you run the test, descriptions of the expected rendered skybox will appear as overlays.
//
//  NOTE: This does not test uniforms/textures applied to a procedural shader through userData.
//
//  Distributed under the Apache License, Version 2.0.
//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//

var PX_URL = Script.resolvePath('px.fs');
var PX_RGBA_URL = Script.resolvePath('px_rgba.fs');
var PX_TEX_URL = Script.resolvePath('px_tex.fs');
var PX_TEX_RGBA_URL = Script.resolvePath('px_tex_rgba.fs');

var TEX_URL = 'https://hifi-public.s3.amazonaws.com/alan/Playa/Skies/Test-Sky_out.png';
var NO_TEX = '';

var COLOR = { red: 255, green: 0, blue: 255 };
var NO_COLOR = { red: 0, green: 0, blue: 0 };

var data = { ProceduralEntity: { shaderUrl: PX_URL } };

var zone = Entities.addEntity({
    type: 'Zone',
    dimensions: { x: 50, y: 50, z: 50 },
    position: MyAvatar.position,
    backgroundMode: 'skybox'
});
var text = Overlays.addOverlay('text', {
    text: 'Click this box to advance tests; note that red value cycling means white->light blue',
    x: Window.innerWidth / 2 - 250, y: Window.innerHeight / 2 - 25,
    width: 500, height: 50
});

print('Zone:', zone);
print('Text:', text);

var edits = [
    ['Red value should cycle', getEdit(PX_URL, NO_TEX, NO_COLOR)],
    ['Red value should cycle, no green', getEdit(PX_RGBA_URL, NO_TEX, COLOR)],
    ['Red value should cycle, each face tinted differently', getEdit(PX_TEX_URL, TEX_URL, NO_COLOR)],
    ['Red value should cycle, each face tinted differently, no green', getEdit(PX_TEX_RGBA_URL, TEX_URL, COLOR)],
    ['No green', getEdit(null, NO_TEX, COLOR)],
    ['Each face colored differently, no green', getEdit(null, TEX_URL, COLOR)],
    ['Each face colored differently', getEdit(null, TEX_URL, NO_COLOR)],
];

Controller.mousePressEvent.connect(function(e) { if (Overlays.getOverlayAtPoint(e) === text) next(); });

Script.scriptEnding.connect(function() {
    Overlays.deleteOverlay(text);
    Entities.deleteEntity(zone);
});

var i = 0;
function next() {
    var edit = edits[i];
    Overlays.editOverlay(text, { text: edit[0] });
    Entities.editEntity(zone, edit[1]);
    i++;
    i %= edits.length;
}

function getEdit(px, url, color) {
    return { userData: px ? getUserData(px) : '', backgroundMode: 'skybox', skybox: { url: url, color: color } }
}
function getUserData(px) { return JSON.stringify({ ProceduralEntity: { shaderUrl: px } }); }