document.addEventListener("DOMContentLoaded", function () {
onload();
}, false);
var onload = function () {
var canvas = document.getElementById("renderCanvas");
// Demos
var demos = [
{
title: "TRAIN", scene: "Train", screenshot: "train.jpg", size: "70 MB", big: true, onload: function () {
scene.collisionsEnabled = false;
for (var index = 0; index < scene.cameras.length; index++) {
scene.cameras[index].minZ = 10;
}
scene.activeCamera.detachControl(canvas);
scene.activeCamera = scene.cameras[6];
scene.activeCamera.attachControl(canvas);
scene.getMaterialByName("terrain_eau").bumpTexture = null;
// Postprocesses
var bwPostProcess = new BABYLON.BlackAndWhitePostProcess("Black and White", 1.0, scene.cameras[2]);
scene.cameras[2].name = "B&W";
var sepiaKernelMatrix = BABYLON.Matrix.FromValues(
0.393, 0.349, 0.272, 0,
0.769, 0.686, 0.534, 0,
0.189, 0.168, 0.131, 0,
0, 0, 0, 0
);
var sepiaPostProcess = new BABYLON.ConvolutionPostProcess("Sepia", sepiaKernelMatrix, 1.0, scene.cameras[3]);
scene.cameras[3].name = "SEPIA";
}
},
{
title: "ROBOT", url: "Scenes/Robot/index.html", screenshot: "robot.jpg", size: "8.5 MB", onload: function () {
scene.collisionsEnabled = false;
}
},
{ title: "WORLDMONGER", url: "Scenes/Worldmonger/index.html", screenshot: "worldmonger.jpg", size: "8.5 MB" },
{ title: "HEART", scene: "Heart", screenshot: "heart.jpg", size: "14 MB", },
{
title: "ESPILIT", scene: "Espilit", screenshot: "espilit.jpg", size: "50 MB", incremental: true, onload: function () {
scene.autoClear = true;
scene.createOrUpdateSelectionOctree();
var postProcess = new BABYLON.RefractionPostProcess("Refraction", "/scenes/customs/refMap.jpg", new BABYLON.Color3(1.0, 1.0, 1.0), 0.5, 0.5, 1.0, scene.cameras[1]);
}
},
{ title: "WINDOWS CAFE", scene: "WCafe", screenshot: "wcafe.jpg", size: "28 MB" },
{
title: "FLAT 2009",
scene: "Flat2009",
screenshot: "flat2009.jpg",
size: "44 MB",
onload: function () {
var ecran = scene.getMeshByName("Ecran");
ecran.material.diffuseTexture = new BABYLON.VideoTexture("video", ["Scenes/Flat2009/babylonjs.mp4", "Scenes/Flat2009/babylonjs.webm"], 256, scene, true);
scene.createOrUpdateSelectionOctree();
}
},
{ title: "THE CAR", scene: "TheCar", screenshot: "thecar.jpg", size: "100 MB", incremental: true },
{ title: "VIPER", scene: "Viper", screenshot: "viper.jpg", size: "18 MB" },
{ title: "SPACESHIP", scene: "Spaceship", screenshot: "spaceship.jpg", size: "1 MB" },
{
title: "OMEGA CRUSHER", scene: "SpaceDek", screenshot: "omegacrusher.jpg", size: "10 MB", onload: function () {
scene.collisionsEnabled = false;
}
}];
var tests = [
{ title: "POSTPROCESS - REFRACTION", id: 11, screenshot: "postprocessRefraction.jpg", size: "1.0 MB" },
{ title: "POSTPROCESS - BLOOM", id: 10, screenshot: "postprocessBloom.jpg", size: "1.0 MB" },
{ title: "OCTREE - 8000 spheres", id: 8, screenshot: "octree.jpg", size: "0.1 MB" },
{ title: "BONES", id: 9, screenshot: "bones.jpg", size: "10 MB" },
{ title: "CHARTING", id: 7, screenshot: "charting.jpg", size: "0.1 MB" },
{ title: "SHADOWS", id: 6, screenshot: "shadows.jpg", size: "1.0 MB" },
{ title: "HEIGHTMAP", id: 5, screenshot: "heightmap.jpg", size: "1.0 MB" },
{ title: "LIGHTS", id: 1, screenshot: "testlight.jpg", size: "0.1 MB" },
{ title: "BUMP", id: 2, screenshot: "bump.jpg", size: "0.1 MB" },
{ title: "FOG", id: 3, screenshot: "fog.jpg", size: "0.1 MB" },
{ title: "MULTIMATERIAL", id: 4, screenshot: "multimat.jpg", size: "0.1 MB" },
{ title: "BLENDER", scene: "blender", screenshot: "blender.jpg", size: "0.2 MB" },
{ title: "SCENE #1", id: 0, screenshot: "testscene.jpg", size: "10 MB" }
];
var thirdParties = [
{ title: "CAR GAME", url: "http://babylon.azurewebsites.net", screenshot: "car.jpg", size: "by G. Carlander" },
{ title: "CYCLE GAME", url: "http://tronbabylon.azurewebsites.net/", screenshot: "tron.jpg", size: "by G. Carlander" },
{ title: "GALLERY", url: "http://guillaume.carlander.fr/Babylon/Gallery/", screenshot: "gallery.png", size: "by G. Carlander" }
];
// UI
var opacityMask = document.getElementById("opacityMask");
var menuPanel = document.getElementById("screen1");
var items = document.getElementById("items");
var testItems = document.getElementById("testItems");
var _3rdItems = document.getElementById("3rdItems");
var renderZone = document.getElementById("renderZone");
var controlPanel = document.getElementById("controlPanel");
var cameraPanel = document.getElementById("cameraPanel");
var wireframe = document.getElementById("wireframe");
var divFps = document.getElementById("fps");
var stats = document.getElementById("stats");
var enableStats = document.getElementById("enableStats");
var loadingBack = document.getElementById("loadingBack");
var loadingText = document.getElementById("loadingText");
var hardwareScalingLevel = document.getElementById("hardwareScalingLevel");
var collisions = document.getElementById("collisions");
var postProcess = document.getElementById("postProcess");
var status = document.getElementById("status");
var fullscreen = document.getElementById("fullscreen");
var touchCamera = document.getElementById("touchCamera");
var deviceOrientationCamera = document.getElementById("deviceOrientationCamera");
var camerasList = document.getElementById("camerasList");
var toggleFsaa4 = document.getElementById("toggleFsaa4");
var toggleFxaa = document.getElementById("toggleFxaa");
var toggleBandW = document.getElementById("toggleBandW");
var toggleSepia = document.getElementById("toggleSepia");
var sceneChecked;
var itemClick = function (demo) {
return function () {
// Check support
if (!BABYLON.Engine.isSupported()) {
document.getElementById("notSupported").className = "";
opacityMask.className = "";
} else {
if (demo.url) {
window.location = demo.url;
return;
}
loadScene(demo.id !== undefined ? demo.id : demo.scene, demo.incremental ? ".incremental" : "", function () {
if (demo.collisions !== undefined) {
scene.collisionsEnabled = demo.collisions;
}
if (demo.onload) {
demo.onload();
}
});
};
};
};
var removeChildren = function (root) {
while (root.childNodes.length) {
root.removeChild(root.childNodes[0]);
}
};
var createItem = function (item, root) {
var span = document.createElement("span");
var img = document.createElement("img");
var div = document.createElement("div");
var label2 = document.createElement("label");
if (item.big) {
span.className = "big-item";
var newImg = document.createElement("img");
var newText = document.createElement("div");
newImg.id = "newImg";
newImg.src = "Assets/SpotLast.png";
newText.innerHTML = "LAST
UPDATE";
newText.id = "newText";
span.appendChild(newImg);
span.appendChild(newText);
} else {
span.className = "item";
}
img.className = "item-image";
img.src = "Screenshots/" + item.screenshot;
span.appendChild(img);
div.className = "item-text";
div.innerHTML = item.title;
span.appendChild(div);
label2.className = "item-text-right";
label2.innerHTML = item.size;
span.appendChild(label2);
span.onclick = itemClick(item);
root.appendChild(span);
};
// Demos
removeChildren(items);
for (var index = 0; index < demos.length; index++) {
var demo = demos[index];
createItem(demo, items);
}
// Tests
removeChildren(testItems);
for (index = 0; index < tests.length; index++) {
var test = tests[index];
createItem(test, testItems);
}
// 3rd party
removeChildren(_3rdItems);
for (index = 0; index < thirdParties.length; index++) {
var thirdParty = thirdParties[index];
createItem(thirdParty, _3rdItems);
}
// Go Back
var goBack = function () {
if (scene) {
scene.dispose();
scene = null;
}
menuPanel.className = "";
renderZone.className = "movedRight";
};
// History
if (window.onpopstate !== undefined) {
window.onpopstate = function () {
goBack();
};
}
// Babylon
var engine = new BABYLON.Engine(canvas, true);
var scene;
var restoreUI = function () {
loadingBack.className = "loadingBack";
loadingText.className = "loadingText";
menuPanel.className = "movedLeft";
renderZone.className = "";
opacityMask.className = "hidden";
sceneChecked = true;
camerasList.options.length = 0;
for (var index = 0; index < scene.cameras.length; index++) {
var camera = scene.cameras[index];
var option = new Option();
option.text = camera.name;
option.value = camera;
if (camera == scene.activeCamera) {
option.selected = true;
}
camerasList.appendChild(option);
}
};
var loadScene = function (name, incremental, then) {
// Cleaning
if (scene) {
scene.dispose();
scene = null;
}
sceneChecked = false;
// History
if (history.pushState) {
history.pushState({}, name, window.location.pathname + window.location.search);
}
// Loading
var importScene = function () {
loadingBack.removeEventListener("transitionend", importScene);
loadingBack.removeEventListener("webkitTransitionend", importScene);
engine.resize();
if (typeof name == "number") {
var newScene;
switch (name) {
case 0:
newScene = CreateTestScene(engine);
break;
case 1:
newScene = CreateLightsTestScene(engine);
break;
case 2:
newScene = CreateBumpScene(engine);
break;
case 3:
newScene = CreateFogScene(engine);
break;
case 4:
newScene = CreateMultiMaterialScene(engine);
break;
case 5:
newScene = CreateHeightMapTestScene(engine);
break;
case 6:
newScene = CreateShadowsTestScene(engine);
break;
case 7:
newScene = CreateChartingTestScene(engine);
break;
case 8:
newScene = CreateOctreeTestScene(engine);
break;
case 9:
newScene = CreateBonesTestScene(engine);
break;
case 10:
newScene = CreatePostProcessBloomTestScene(engine);
break;
case 11:
newScene = CreatePostProcessRefractionTestScene(engine);
}
scene = newScene;
scene.executeWhenReady(function () {
if (scene.activeCamera) {
scene.activeCamera.attachControl(canvas);
if (then) {
then();
}
}
// UI
restoreUI();
});
return;
};
var dlCount = 0;
BABYLON.SceneLoader.Load("Scenes/" + name + "/", name + incremental + ".babylon", engine, function (newScene) {
scene = newScene;
scene.executeWhenReady(function () {
if (scene.activeCamera) {
scene.activeCamera.attachControl(canvas);
if (newScene.activeCamera.keysUp) {
newScene.activeCamera.keysUp.push(90); // Z
newScene.activeCamera.keysUp.push(87); // W
newScene.activeCamera.keysDown.push(83); // S
newScene.activeCamera.keysLeft.push(65); // A
newScene.activeCamera.keysLeft.push(81); // Q
newScene.activeCamera.keysRight.push(69); // E
newScene.activeCamera.keysRight.push(68); // D
}
}
if (then) {
then();
}
// UI
restoreUI();
});
}, function (evt) {
if (evt.lengthComputable) {
loadingText.innerHTML = "Loading, please wait..." + (evt.loaded * 100 / evt.total).toFixed() + "%";
} else {
dlCount = evt.loaded / (1024 * 1024);
loadingText.innerHTML = "Loading, please wait..." + Math.floor(dlCount * 100.0) / 100.0 + " MB already loaded.";
}
});
};
loadingBack.addEventListener("transitionend", importScene);
loadingBack.addEventListener("webkitTransitionend", importScene);
loadingBack.className = "";
loadingText.className = "";
opacityMask.className = "";
loadingText.innerHTML = "Loading, please wait...";
};
// Render loop
var renderFunction = function () {
// Fps
divFps.innerHTML = BABYLON.Tools.GetFps().toFixed() + " fps";
// Render scene
if (scene) {
if (!sceneChecked) {
var remaining = scene.getWaitingItemsCount();
loadingText.innerHTML = "Streaming items..." + (remaining ? (remaining + " remaining") : "");
}
scene.render();
// Stats
if (enableStats.checked) {
stats.innerHTML = "Total vertices: " + scene.getTotalVertices() + "
"
+ "Active vertices: " + scene.getActiveVertices() + "
"
+ "Active particles: " + scene.getActiveParticles() + "
"
+ "Frame duration: " + scene.getLastFrameDuration() + " ms
"
+ "Evaluate Active Meshes duration: " + scene.getEvaluateActiveMeshesDuration() + " ms
"
+ "Render Targets duration: " + scene.getRenderTargetsDuration() + " ms
"
+ "Particles duration: " + scene.getParticlesDuration() + " ms
"
+ "Sprites duration: " + scene.getSpritesDuration() + " ms
"
+ "Render duration: " + scene.getRenderDuration() + " ms";
}
// Streams
if (scene.useDelayedTextureLoading) {
var waiting = scene.getWaitingItemsCount();
if (waiting > 0) {
status.innerHTML = "Streaming items..." + waiting + " remaining";
} else {
status.innerHTML = "";
}
}
}
};
// Launch render loop
engine.runRenderLoop(renderFunction);
// Resize
window.addEventListener("resize", function () {
engine.resize();
});
// Caps
var caps = engine.getCaps();
document.getElementById("extensions").innerHTML =
"Max textures image units: " + caps.maxTexturesImageUnits + "
" +
"Max texture size: " + caps.maxTextureSize + "
" +
"Max cubemap texture size: " + caps.maxCubemapTextureSize + "
" +
"Max render texture size: " + caps.maxRenderTextureSize + "
";
// UI
var panelIsClosed = true;
var cameraPanelIsClosed = true;
var aboutIsClosed = true;
document.getElementById("clickableTag").addEventListener("click", function () {
if (panelIsClosed) {
panelIsClosed = false;
controlPanel.style.webkitTransform = "translateY(0px)";
controlPanel.style.transform = "translateY(0px)";
} else {
panelIsClosed = true;
controlPanel.style.webkitTransform = "translateY(250px)";
controlPanel.style.transform = "translateY(250px)";
}
});
document.getElementById("cameraClickableTag").addEventListener("click", function () {
if (cameraPanelIsClosed) {
cameraPanelIsClosed = false;
cameraPanel.style.webkitTransform = "translateX(0px)";
cameraPanel.style.transform = "translateX(0px)";
} else {
cameraPanelIsClosed = true;
cameraPanel.style.webkitTransform = "translateX(300px)";
cameraPanel.style.transform = "translateX(300px)";
}
});
document.getElementById("aboutLink").addEventListener("click", function () {
if (aboutIsClosed) {
aboutIsClosed = false;
aboutPanel.style.webkitTransform = "translateX(0px)";
aboutPanel.style.transform = "translateX(0px)";
} else {
aboutIsClosed = true;
aboutPanel.style.webkitTransform = "translateX(-120%)";
aboutPanel.style.transform = "translateX(-120%)";
}
});
document.getElementById("notSupported").addEventListener("click", function () {
document.getElementById("notSupported").className = "hidden";
opacityMask.className = "hidden";
});
opacityMask.addEventListener("click", function () {
document.getElementById("notSupported").className = "hidden";
opacityMask.className = "hidden";
});
document.getElementById("aboutPanel").addEventListener("click", function (evt) {
evt.cancelBubble = true;
});
document.getElementById("menuPanel").addEventListener("click", function (evt) {
if (!aboutIsClosed) {
aboutIsClosed = true;
aboutPanel.style.webkitTransform = "translateX(-120%)";
aboutPanel.style.transform = "translateX(-120%)";
}
});
canvas.addEventListener("click", function (evt) {
if (!panelIsClosed) {
panelIsClosed = true;
cameraPanelIsClosed = true;
controlPanel.style.webkitTransform = "translateY(250px)";
controlPanel.style.transform = "translateY(250px)";
cameraPanel.style.webkitTransform = "translateX(300px)";
cameraPanel.style.transform = "translateX(300px)";
}
if (evt.ctrlKey) {
if (!scene)
return;
var pickResult = scene.pick(evt.clientX, evt.clientY);
if (pickResult.hit) {
status.innerHTML = "Selected object: " + pickResult.pickedMesh.name;
// Animations
scene.beginAnimation(pickResult.pickedMesh, 0, 100, true, 1.0);
var material = pickResult.pickedMesh.material;
if (material) {
scene.beginAnimation(material, 0, 100, true, 1.0);
}
// Emit particles
var particleSystem = new BABYLON.ParticleSystem("particles", 400, scene);
particleSystem.particleTexture = new BABYLON.Texture("Assets/Flare.png", scene);
particleSystem.minAngularSpeed = -0.5;
particleSystem.maxAngularSpeed = 0.5;
particleSystem.minSize = 0.1;
particleSystem.maxSize = 0.5;
particleSystem.minLifeTime = 0.5;
particleSystem.maxLifeTime = 2.0;
particleSystem.minEmitPower = 0.5;
particleSystem.maxEmitPower = 1.0;
particleSystem.emitter = pickResult.pickedPoint;
particleSystem.emitRate = 400;
particleSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;
particleSystem.minEmitBox = new BABYLON.Vector3(0, 0, 0);
particleSystem.maxEmitBox = new BABYLON.Vector3(0, 0, 0);
particleSystem.direction1 = new BABYLON.Vector3(-1, -1, -1);
particleSystem.direction2 = new BABYLON.Vector3(1, 1, 1);
particleSystem.color1 = new BABYLON.Color4(1, 0, 0, 1);
particleSystem.color2 = new BABYLON.Color4(0, 1, 1, 1);
particleSystem.gravity = new BABYLON.Vector3(0, -5, 0);
particleSystem.disposeOnStop = true;
particleSystem.targetStopDuration = 0.1;
particleSystem.start();
} else {
status.innerHTML = "";
}
}
});
wireframe.addEventListener("change", function () {
if (engine) {
engine.forceWireframe = wireframe.checked;
}
});
enableStats.addEventListener("change", function () {
stats.className = enableStats.checked ? "" : "hidden";
});
fullscreen.addEventListener("click", function () {
if (engine) {
engine.switchFullscreen(true);
}
});
var switchCamera = function (camera) {
if (scene.activeCamera.rotation) {
camera.rotation = scene.activeCamera.rotation.clone();
}
camera.fov = scene.activeCamera.fov;
camera.minZ = scene.activeCamera.minZ;
camera.maxZ = scene.activeCamera.maxZ;
if (scene.activeCamera.ellipsoid) {
camera.ellipsoid = scene.activeCamera.ellipsoid.clone();
}
camera.checkCollisions = scene.activeCamera.checkCollisions;
camera.applyGravity = scene.activeCamera.applyGravity;
camera.speed = scene.activeCamera.speed;
camera.postProcesses = scene.activeCamera.postProcesses;
scene.activeCamera.postProcesses = [];
scene.activeCamera.detachControl(canvas);
scene.activeCamera = camera;
scene.activeCamera.attachControl(canvas);
};
touchCamera.addEventListener("click", function () {
if (!scene) {
return;
}
var camera = new BABYLON.TouchCamera("touchCamera", scene.activeCamera.position, scene);
switchCamera(camera);
});
deviceOrientationCamera.addEventListener("click", function () {
if (!scene) {
return;
}
var camera = new BABYLON.DeviceOrientationCamera("deviceOrientationCamera", scene.activeCamera.position, scene);
switchCamera(camera);
});
hardwareScalingLevel.addEventListener("change", function () {
if (!engine)
return;
engine.setHardwareScalingLevel(hardwareScalingLevel.selectedIndex + 1);
});
collisions.addEventListener("change", function () {
if (scene) {
scene.collisionsEnabled = collisions.checked;
}
});
postProcess.addEventListener("change", function () {
if (scene) {
scene.postProcessesEnabled = postProcess.checked;
}
});
toggleBandW.addEventListener("click", function () {
if (scene && scene.activeCamera) {
if (scene.activeCamera.__bandw_cookie) {
scene.activeCamera.__bandw_cookie.dispose(),
scene.activeCamera.__bandw_cookie = null;
} else {
scene.activeCamera.__bandw_cookie = new BABYLON.BlackAndWhitePostProcess("bandw", 1.0, scene.activeCamera);
}
}
});
toggleFxaa.addEventListener("click", function () {
if (scene && scene.activeCamera) {
if (scene.activeCamera.__fxaa_cookie) {
scene.activeCamera.__fxaa_cookie.dispose(),
scene.activeCamera.__fxaa_cookie = null;
} else {
scene.activeCamera.__fxaa_cookie = new BABYLON.FxaaPostProcess("fxaa", 1.0, scene.activeCamera);
}
}
});
toggleFsaa4.addEventListener("click", function () {
if (scene && scene.activeCamera) {
if (scene.activeCamera.__fsaa_cookie) {
scene.activeCamera.__fsaa_cookie.dispose(),
scene.activeCamera.__fsaa_cookie = null;
} else {
var fx = new BABYLON.PassPostProcess("fsaa", 2.0, scene.activeCamera);
fx.renderTargetSamplingMode = BABYLON.Texture.BILINEAR_SAMPLINGMODE;
scene.activeCamera.__fsaa_cookie = fx;
}
}
});
toggleSepia.addEventListener("click", function () {
if (scene && scene.activeCamera) {
if (scene.activeCamera.__sepia_cookie) {
scene.activeCamera.__sepia_cookie.dispose(),
scene.activeCamera.__sepia_cookie = null;
} else {
var sepiaKernelMatrix = BABYLON.Matrix.FromValues(
0.393, 0.349, 0.272, 0,
0.769, 0.686, 0.534, 0,
0.189, 0.168, 0.131, 0,
0, 0, 0, 0
);
scene.activeCamera.__sepia_cookie = new BABYLON.ConvolutionPostProcess("Sepia", sepiaKernelMatrix, 1.0, scene.activeCamera);
}
}
});
// Cameras
camerasList.addEventListener("change", function (ev) {
scene.activeCamera.detachControl(canvas);
scene.activeCamera = scene.cameras[camerasList.selectedIndex];
scene.activeCamera.attachControl(canvas);
});
// Query string
var queryString = window.location.search;
if (queryString) {
var query = queryString.replace("?", "");
var index = parseInt(query);
if (!isNaN(index)) {
if (index >= demos.length) {
itemClick(tests[index - demos.length])();
} else {
itemClick(demos[index])();
}
} else {
for (index = 0; index < demos.length; index++) {
if (demos[index].title === query) {
itemClick(demos[index])();
return;
}
}
for (index = 0; index < tests.length; index++) {
if (tests[index].title === query) {
itemClick(tests[index])();
return;
}
}
}
}
};