<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Normal 2D view and WebVR</title>
        <script src="https://code.jquery.com/pep/0.4.2/pep.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.6.2/dat.gui.min.js"></script>
        <script src="https://preview.babylonjs.com/ammo.js"></script>
        <script src="https://preview.babylonjs.com/cannon.js"></script>
        <script src="https://preview.babylonjs.com/Oimo.js"></script>
        <script src="https://preview.babylonjs.com/gltf_validator.js"></script>
        <script src="https://preview.babylonjs.com/earcut.min.js"></script>
        <script src="https://preview.babylonjs.com/babylon.js"></script>
        <script src="https://preview.babylonjs.com/inspector/babylon.inspector.bundle.js"></script>
        <script src="https://preview.babylonjs.com/materialsLibrary/babylonjs.materials.min.js"></script>
        <script src="https://preview.babylonjs.com/proceduralTexturesLibrary/babylonjs.proceduralTextures.min.js"></script>
        <script src="https://preview.babylonjs.com/postProcessesLibrary/babylonjs.postProcess.min.js"></script>
        <script src="https://preview.babylonjs.com/loaders/babylonjs.loaders.js"></script>
        <script src="https://preview.babylonjs.com/serializers/babylonjs.serializers.min.js"></script>
        <script src="https://preview.babylonjs.com/gui/babylon.gui.min.js"></script>
        <style>
            html, body {
                overflow: hidden;
                width: 100%;
                height: 100%;
                margin: 0;
                padding: 0;
            }
            #renderCanvas {
                width: 100%;
                height: 100%;
                touch-action: none;
            }
        </style>
    </head>
<body>
    <canvas id="renderCanvas"></canvas>
    <script src="script.js"></script>
</body>
</html>

// Code goes here

var canvas = document.getElementById("renderCanvas");
var createScene = function() {
    var scene = new BABYLON.Scene(engine);
    var camera = new BABYLON.ArcRotateCamera("Camera", 0, 0, 10, BABYLON.Vector3.Zero(), scene);
    var material = new BABYLON.StandardMaterial("kosh", scene);
    material.diffuseColor = BABYLON.Color3.Purple();
    var light = new BABYLON.PointLight("Omni0", new BABYLON.Vector3(-17.6, 18.8, -49.9), scene);
    camera.setPosition(new BABYLON.Vector3(-15, 10, -20));
    camera.minZ = 1.0;
    camera.maxZ = 120.0;
    camera.attachControl(canvas, true);
    var skybox = BABYLON.Mesh.CreateBox("skyBox", 100.0, scene);
    var skyboxMaterial = new BABYLON.StandardMaterial("skyBox", scene);
    skyboxMaterial.backFaceCulling = false;
    skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("textures/TropicalSunnyDay", scene);
    skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
    skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
    skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
    skyboxMaterial.disableLighting = true;
    skybox.material = skyboxMaterial;
    BABYLON.Effect.ShadersStore["customDepthVertexShader"] = "#ifdef GL_ES\n" +
        "precision highp float;\n" + "#endif\n" +
        "attribute vec3 position;\n" +
        "uniform mat4 worldViewProjection;\n" +
        "void main(void) {\n" +
        "gl_Position = worldViewProjection * vec4(position, 1.0);\n" +
        "}";
    BABYLON.Effect.ShadersStore["customDepthPixelShader"] = "#ifdef GL_ES\n" +
        "precision highp float;\n" + "#endif\n" +
        "void main(void) {\n" +
        "float depth =  1.0 - (2.0 / (100.0 + 1.0 - gl_FragCoord.z * (100.0 - 1.0)));\n" +
        "gl_FragColor = vec4(depth, depth, depth, 1.0);\n" +
        "}\n" +
        "";
    var depthMaterial = new BABYLON.ShaderMaterial("customDepth", scene, "customDepth", {
        attributes: ["position"],
        uniforms: ["worldViewProjection"]
    });
    depthMaterial.backFaceCulling = false;
    var plane = BABYLON.Mesh.CreatePlane("map", 10, scene);
    plane.billboardMode = BABYLON.AbstractMesh.BILLBOARDMODE_ALL;
    plane.scaling.y = 1.0 / engine.getAspectRatio(scene.activeCamera);
    var renderTarget = new BABYLON.RenderTargetTexture("depth", 1024, scene, true);
    //renderTarget.renderList.push(skybox);
    scene.customRenderTargets.push(renderTarget);
    renderTarget.onBeforeRender = function() {
        for (var index = 0; index < renderTarget.renderList.length; index++) 
        {
            renderTarget.renderList[index]._savedMaterial = renderTarget.renderList[index].material;
            renderTarget.renderList[index].material = depthMaterial;
        }
    }
    renderTarget.onAfterRender = function() {
        for (var index = 0; index < renderTarget.renderList.length; index++) 
        {
            renderTarget.renderList[index].material = renderTarget.renderList[index]._savedMaterial;
        }
    }
    var spheresCount = 20;
    var alpha = 0;
    for (var index = 0; index < spheresCount; index++) 
    {
        var sphere = BABYLON.Mesh.CreateSphere("Sphere" + index, 32, 3, scene);
        sphere.position.x = 10 * Math.cos(alpha);
        sphere.position.z = 10 * Math.sin(alpha);
        sphere.material = material;
        alpha += (2 * Math.PI) / spheresCount;
        renderTarget.renderList.push(sphere);
    }
    var mat = new BABYLON.StandardMaterial("plan mat", scene);
    mat.emissiveTexture = renderTarget;
    mat.disableLighting = true;
    plane.material = mat;
    scene.registerBeforeRender(function() {
        camera.alpha += 0.01 * scene.getAnimationRatio();
    });
    return scene;
};
var engine = new BABYLON.Engine(canvas, true, {
    preserveDrawingBuffer: true,
    stencil: true
});
var scene = createScene();
engine.runRenderLoop(function() {
    if (scene)
    {
        scene.render();
    }
});
window.addEventListener("resize", function() {
    engine.resize();
});




/* Styles go here */