$.getScript(ROOT_PATH + 'vendors/simplex.js').done(function () {


var simplex = new SimplexNoise();

window.onresize = myChart.resize;

var UPDATE_DURATION = 1000;

function initVisualizer() {

    config = {
        numWaves: 2,
        randomize: randomize,
        color1: '#000',
        color2: "#300",
        color3: "#fff",
        size: 150,
        roughness: 0.5,
        metalness: 0.
    };

    //gui.add(config, "numWaves", 1, 3).name("Waves number").onChange(update).listen();
    for (var i = 0; i < 2; i++) {
        config["wave" + i + "axis" + "x"] = Math.random();
        config["wave" + i + "axis" + "y"] = Math.random();
        config["wave" + i + "rounding"] = Math.random();
        config["wave" + i + "square"] = Math.random();
    }

    function randomize() {
        //config.numWaves = Math.floor(Math.random() * 3) + 1;
        for (var i = 0; i < 2; i++) {
            config["wave" + i + "axis" + "x"] = Math.random();
            config["wave" + i + "axis" + "y"] = Math.random();
            config["wave" + i + "rounding"] = Math.random();
            config["wave" + i + "square"] = Math.random();
        }

        // Iterate over all controllers
        for (var i in gui.__controllers) {
            gui.__controllers[i].updateDisplay();
        }
        update();
    }

    function update() {
        var item = [];
        var dataProvider = [];

        var mod = .1

        //config.numWaves = Math.round(config.numWaves)

        //var occurenceR = Math.random() * .02
        //var r = 0//Math.random()
        for (var s = 0; s < config.size * config.size; s++) {
            var x = s % config.size;
            var y = Math.floor(s / config.size);

            //if (Math.random() < occurenceR)
            //    r = Math.random()

            var output = 0;
            for (var i = 0; i < config.numWaves; i++) {
                var n = simplex.noise2D(i * 213 + (-50 + x) * mod * (1 - config["wave" + i + "axis" + "x"]) * .5, i * 3124 + (-50 + y) * mod * (1 - config["wave" + i + "axis" + "y"]) * .5)
                n = Math.pow(n, 1.95 - 1.9 * config["wave" + i + "rounding"])
                var square = Math.floor((1.1 - config["wave" + i + "square"]) * 100)
                n = Math.round(n * square) / square;
                    //output*=n
                if (output < n)
                    output = n;
            }
            dataProvider.push([x, y, (output + 0.1) * 2]);
        }


        myChart.setOption({
            visualMap: {
                inRange: {
                    barSize: 100 / config.size,
                    color: [config.color1, config.color2, config.color3],
                }
            },
            series: [{
                data: dataProvider,
                realisticMaterial: {
                    roughness: config.roughness,
                    metalness: config.metalness
                }
            }]
        });
        //setTimeout(update, UPDATE_DURATION);
    }

    update();
}
var focalRange = 40
var blurRadius = 4

myChart.setOption(option = {
    toolbox: {
        left: 20,
        iconStyle: {
            normal: {
                borderColor: '#fff'
            }
        }
    },
    tooltip: {},
    visualMap: {
        show: false,
        min: 0.1,
        max: 2.5,
        inRange: {
            color: ['#000', '#300', '#fff']
        }
    },
    xAxis3D: {
        type: 'value'
    },
    yAxis3D: {
        type: 'value'
    },
    zAxis3D: {
        type: 'value',
        min: -6,
        max: 6
    },
    grid3D: {
        show: false,
        environment: '#000',
        viewControl: {
            distance: 100,
            maxDistance: 150,
            minDistance: 50,
            alpha: 38,
            beta: 220,
            minAlpha: 10,
            //maxBeta: 360,
        },
        postEffect: {
            enable: true,
            SSAO: {
                enable: true,
                intensity: 1.3,
                radius: 5
            },
            screenSpaceReflection: {
                enable: false
            },
            depthOfField: {
                enable: true,
                blurRadius: blurRadius,
                focalRange: focalRange,
                focalDistance: 70
            }
        },
        light: {
            main: {
                intensity: 1,
                shadow: true,
                shadowQuality: 'high',
                alpha: 30
            },
            ambient: {
                intensity: 0
            },
            ambientCubemap: {
                texture: ROOT_PATH + 'data-gl/asset/pisa.hdr',
                exposure: 2,
                diffuseIntensity: 1,
                specularIntensity: 1
            }
        }
    },
    series: [{
        type: 'bar3D',
        silent: true,
        shading: 'realistic',
        realisticMaterial: {
            roughness: 0.5,
            metalness: 0
        },
        instancing: true,
        barSize: 0.6,
        data: [],
        lineStyle: {
            width: 4
        },
        itemStyle: {
            color: "#fff"
        },
        animation: false,
        animationDurationUpdate: UPDATE_DURATION
    }]
});

setTimeout(function() {
    initVisualizer();
});


});