index.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. document.addEventListener("DOMContentLoaded", function () {
  2. onload();
  3. }, false);
  4. var onload = function () {
  5. var canvas = document.getElementById("renderCanvas");
  6. // Demos
  7. var demos = [
  8. {
  9. title: "TRAIN", scene: "Train", screenshot: "train.jpg", size: "70 MB", big: true, onload: function () {
  10. scene.collisionsEnabled = false;
  11. for (var index = 0; index < scene.cameras.length; index++) {
  12. scene.cameras[index].minZ = 10;
  13. }
  14. scene.activeCamera.detachControl(canvas);
  15. scene.activeCamera = scene.cameras[6];
  16. scene.activeCamera.attachControl(canvas);
  17. scene.getMaterialByName("terrain_eau").bumpTexture = null;
  18. // Postprocesses
  19. var bwPostProcess = new BABYLON.BlackAndWhitePostProcess("Black and White", 1.0, scene.cameras[2]);
  20. scene.cameras[2].name = "B&W";
  21. var sepiaKernelMatrix = BABYLON.Matrix.FromValues(
  22. 0.393, 0.349, 0.272, 0,
  23. 0.769, 0.686, 0.534, 0,
  24. 0.189, 0.168, 0.131, 0,
  25. 0, 0, 0, 0
  26. );
  27. var sepiaPostProcess = new BABYLON.ConvolutionPostProcess("Sepia", sepiaKernelMatrix, 1.0, scene.cameras[3]);
  28. scene.cameras[3].name = "SEPIA";
  29. }
  30. },
  31. {
  32. title: "ROBOT", url: "Scenes/Robot/index.html", screenshot: "robot.jpg", size: "8.5 MB", onload: function () {
  33. scene.collisionsEnabled = false;
  34. }
  35. },
  36. { title: "WORLDMONGER", url: "Scenes/Worldmonger/index.html", screenshot: "worldmonger.jpg", size: "8.5 MB" },
  37. { title: "HEART", scene: "Heart", screenshot: "heart.jpg", size: "14 MB", },
  38. {
  39. title: "ESPILIT", scene: "Espilit", screenshot: "espilit.jpg", size: "50 MB", incremental: true, onload: function () {
  40. scene.autoClear = true;
  41. scene.createOrUpdateSelectionOctree();
  42. 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]);
  43. }
  44. },
  45. { title: "WINDOWS CAFE", scene: "WCafe", screenshot: "wcafe.jpg", size: "28 MB" },
  46. {
  47. title: "FLAT 2009",
  48. scene: "Flat2009",
  49. screenshot: "flat2009.jpg",
  50. size: "44 MB",
  51. onload: function () {
  52. var ecran = scene.getMeshByName("Ecran");
  53. ecran.material.diffuseTexture = new BABYLON.VideoTexture("video", ["Scenes/Flat2009/babylonjs.mp4", "Scenes/Flat2009/babylonjs.webm"], 256, scene, true);
  54. scene.createOrUpdateSelectionOctree();
  55. }
  56. },
  57. { title: "THE CAR", scene: "TheCar", screenshot: "thecar.jpg", size: "100 MB", incremental: true },
  58. { title: "VIPER", scene: "Viper", screenshot: "viper.jpg", size: "18 MB" },
  59. { title: "SPACESHIP", scene: "Spaceship", screenshot: "spaceship.jpg", size: "1 MB" },
  60. {
  61. title: "OMEGA CRUSHER", scene: "SpaceDek", screenshot: "omegacrusher.jpg", size: "10 MB", onload: function () {
  62. scene.collisionsEnabled = false;
  63. }
  64. }];
  65. var tests = [
  66. { title: "POSTPROCESS - REFRACTION", id: 11, screenshot: "postprocessRefraction.jpg", size: "1.0 MB" },
  67. { title: "POSTPROCESS - BLOOM", id: 10, screenshot: "postprocessBloom.jpg", size: "1.0 MB" },
  68. { title: "OCTREE - 8000 spheres", id: 8, screenshot: "octree.jpg", size: "0.1 MB" },
  69. { title: "BONES", id: 9, screenshot: "bones.jpg", size: "10 MB" },
  70. { title: "CHARTING", id: 7, screenshot: "charting.jpg", size: "0.1 MB" },
  71. { title: "SHADOWS", id: 6, screenshot: "shadows.jpg", size: "1.0 MB" },
  72. { title: "HEIGHTMAP", id: 5, screenshot: "heightmap.jpg", size: "1.0 MB" },
  73. { title: "LIGHTS", id: 1, screenshot: "testlight.jpg", size: "0.1 MB" },
  74. { title: "BUMP", id: 2, screenshot: "bump.jpg", size: "0.1 MB" },
  75. { title: "FOG", id: 3, screenshot: "fog.jpg", size: "0.1 MB" },
  76. { title: "MULTIMATERIAL", id: 4, screenshot: "multimat.jpg", size: "0.1 MB" },
  77. { title: "BLENDER", scene: "blender", screenshot: "blender.jpg", size: "0.2 MB" },
  78. { title: "SCENE #1", id: 0, screenshot: "testscene.jpg", size: "10 MB" }
  79. ];
  80. var thirdParties = [
  81. { title: "CAR GAME", url: "http://babylon.azurewebsites.net", screenshot: "car.jpg", size: "by G. Carlander" },
  82. { title: "CYCLE GAME", url: "http://tronbabylon.azurewebsites.net/", screenshot: "tron.jpg", size: "by G. Carlander" },
  83. { title: "GALLERY", url: "http://guillaume.carlander.fr/Babylon/Gallery/", screenshot: "gallery.png", size: "by G. Carlander" }
  84. ];
  85. // UI
  86. var opacityMask = document.getElementById("opacityMask");
  87. var menuPanel = document.getElementById("screen1");
  88. var items = document.getElementById("items");
  89. var testItems = document.getElementById("testItems");
  90. var _3rdItems = document.getElementById("3rdItems");
  91. var renderZone = document.getElementById("renderZone");
  92. var controlPanel = document.getElementById("controlPanel");
  93. var cameraPanel = document.getElementById("cameraPanel");
  94. var wireframe = document.getElementById("wireframe");
  95. var divFps = document.getElementById("fps");
  96. var stats = document.getElementById("stats");
  97. var enableStats = document.getElementById("enableStats");
  98. var loadingBack = document.getElementById("loadingBack");
  99. var loadingText = document.getElementById("loadingText");
  100. var hardwareScalingLevel = document.getElementById("hardwareScalingLevel");
  101. var collisions = document.getElementById("collisions");
  102. var postProcess = document.getElementById("postProcess");
  103. var status = document.getElementById("status");
  104. var fullscreen = document.getElementById("fullscreen");
  105. var touchCamera = document.getElementById("touchCamera");
  106. var deviceOrientationCamera = document.getElementById("deviceOrientationCamera");
  107. var camerasList = document.getElementById("camerasList");
  108. var toggleFsaa4 = document.getElementById("toggleFsaa4");
  109. var toggleFxaa = document.getElementById("toggleFxaa");
  110. var toggleBandW = document.getElementById("toggleBandW");
  111. var toggleSepia = document.getElementById("toggleSepia");
  112. var sceneChecked;
  113. var itemClick = function (demo) {
  114. return function () {
  115. // Check support
  116. if (!BABYLON.Engine.isSupported()) {
  117. document.getElementById("notSupported").className = "";
  118. opacityMask.className = "";
  119. } else {
  120. if (demo.url) {
  121. window.location = demo.url;
  122. return;
  123. }
  124. loadScene(demo.id !== undefined ? demo.id : demo.scene, demo.incremental ? ".incremental" : "", function () {
  125. if (demo.collisions !== undefined) {
  126. scene.collisionsEnabled = demo.collisions;
  127. }
  128. if (demo.onload) {
  129. demo.onload();
  130. }
  131. });
  132. };
  133. };
  134. };
  135. var removeChildren = function (root) {
  136. while (root.childNodes.length) {
  137. root.removeChild(root.childNodes[0]);
  138. }
  139. };
  140. var createItem = function (item, root) {
  141. var span = document.createElement("span");
  142. var img = document.createElement("img");
  143. var div = document.createElement("div");
  144. var label2 = document.createElement("label");
  145. if (item.big) {
  146. span.className = "big-item";
  147. var newImg = document.createElement("img");
  148. var newText = document.createElement("div");
  149. newImg.id = "newImg";
  150. newImg.src = "Assets/SpotLast.png";
  151. newText.innerHTML = "LAST<br>UPDATE";
  152. newText.id = "newText";
  153. span.appendChild(newImg);
  154. span.appendChild(newText);
  155. } else {
  156. span.className = "item";
  157. }
  158. img.className = "item-image";
  159. img.src = "Screenshots/" + item.screenshot;
  160. span.appendChild(img);
  161. div.className = "item-text";
  162. div.innerHTML = item.title;
  163. span.appendChild(div);
  164. label2.className = "item-text-right";
  165. label2.innerHTML = item.size;
  166. span.appendChild(label2);
  167. span.onclick = itemClick(item);
  168. root.appendChild(span);
  169. };
  170. // Demos
  171. removeChildren(items);
  172. for (var index = 0; index < demos.length; index++) {
  173. var demo = demos[index];
  174. createItem(demo, items);
  175. }
  176. // Tests
  177. removeChildren(testItems);
  178. for (index = 0; index < tests.length; index++) {
  179. var test = tests[index];
  180. createItem(test, testItems);
  181. }
  182. // 3rd party
  183. removeChildren(_3rdItems);
  184. for (index = 0; index < thirdParties.length; index++) {
  185. var thirdParty = thirdParties[index];
  186. createItem(thirdParty, _3rdItems);
  187. }
  188. // Go Back
  189. var goBack = function () {
  190. if (scene) {
  191. scene.dispose();
  192. scene = null;
  193. }
  194. menuPanel.className = "";
  195. renderZone.className = "movedRight";
  196. };
  197. // History
  198. if (window.onpopstate !== undefined) {
  199. window.onpopstate = function () {
  200. goBack();
  201. };
  202. }
  203. // Babylon
  204. var engine = new BABYLON.Engine(canvas, true);
  205. var scene;
  206. var restoreUI = function () {
  207. loadingBack.className = "loadingBack";
  208. loadingText.className = "loadingText";
  209. menuPanel.className = "movedLeft";
  210. renderZone.className = "";
  211. opacityMask.className = "hidden";
  212. sceneChecked = true;
  213. camerasList.options.length = 0;
  214. for (var index = 0; index < scene.cameras.length; index++) {
  215. var camera = scene.cameras[index];
  216. var option = new Option();
  217. option.text = camera.name;
  218. option.value = camera;
  219. if (camera == scene.activeCamera) {
  220. option.selected = true;
  221. }
  222. camerasList.appendChild(option);
  223. }
  224. };
  225. var loadScene = function (name, incremental, then) {
  226. // Cleaning
  227. if (scene) {
  228. scene.dispose();
  229. scene = null;
  230. }
  231. sceneChecked = false;
  232. // History
  233. if (history.pushState) {
  234. history.pushState({}, name, window.location.pathname + window.location.search);
  235. }
  236. // Loading
  237. var importScene = function () {
  238. loadingBack.removeEventListener("transitionend", importScene);
  239. loadingBack.removeEventListener("webkitTransitionend", importScene);
  240. engine.resize();
  241. if (typeof name == "number") {
  242. var newScene;
  243. switch (name) {
  244. case 0:
  245. newScene = CreateTestScene(engine);
  246. break;
  247. case 1:
  248. newScene = CreateLightsTestScene(engine);
  249. break;
  250. case 2:
  251. newScene = CreateBumpScene(engine);
  252. break;
  253. case 3:
  254. newScene = CreateFogScene(engine);
  255. break;
  256. case 4:
  257. newScene = CreateMultiMaterialScene(engine);
  258. break;
  259. case 5:
  260. newScene = CreateHeightMapTestScene(engine);
  261. break;
  262. case 6:
  263. newScene = CreateShadowsTestScene(engine);
  264. break;
  265. case 7:
  266. newScene = CreateChartingTestScene(engine);
  267. break;
  268. case 8:
  269. newScene = CreateOctreeTestScene(engine);
  270. break;
  271. case 9:
  272. newScene = CreateBonesTestScene(engine);
  273. break;
  274. case 10:
  275. newScene = CreatePostProcessBloomTestScene(engine);
  276. break;
  277. case 11:
  278. newScene = CreatePostProcessRefractionTestScene(engine);
  279. }
  280. scene = newScene;
  281. scene.executeWhenReady(function () {
  282. if (scene.activeCamera) {
  283. scene.activeCamera.attachControl(canvas);
  284. if (then) {
  285. then();
  286. }
  287. }
  288. // UI
  289. restoreUI();
  290. });
  291. return;
  292. };
  293. var dlCount = 0;
  294. BABYLON.SceneLoader.Load("Scenes/" + name + "/", name + incremental + ".babylon", engine, function (newScene) {
  295. scene = newScene;
  296. scene.executeWhenReady(function () {
  297. if (scene.activeCamera) {
  298. scene.activeCamera.attachControl(canvas);
  299. if (newScene.activeCamera.keysUp) {
  300. newScene.activeCamera.keysUp.push(90); // Z
  301. newScene.activeCamera.keysUp.push(87); // W
  302. newScene.activeCamera.keysDown.push(83); // S
  303. newScene.activeCamera.keysLeft.push(65); // A
  304. newScene.activeCamera.keysLeft.push(81); // Q
  305. newScene.activeCamera.keysRight.push(69); // E
  306. newScene.activeCamera.keysRight.push(68); // D
  307. }
  308. }
  309. if (then) {
  310. then();
  311. }
  312. // UI
  313. restoreUI();
  314. });
  315. }, function (evt) {
  316. if (evt.lengthComputable) {
  317. loadingText.innerHTML = "Loading, please wait..." + (evt.loaded * 100 / evt.total).toFixed() + "%";
  318. } else {
  319. dlCount = evt.loaded / (1024 * 1024);
  320. loadingText.innerHTML = "Loading, please wait..." + Math.floor(dlCount * 100.0) / 100.0 + " MB already loaded.";
  321. }
  322. });
  323. };
  324. loadingBack.addEventListener("transitionend", importScene);
  325. loadingBack.addEventListener("webkitTransitionend", importScene);
  326. loadingBack.className = "";
  327. loadingText.className = "";
  328. opacityMask.className = "";
  329. loadingText.innerHTML = "Loading, please wait...";
  330. };
  331. // Render loop
  332. var renderFunction = function () {
  333. // Fps
  334. divFps.innerHTML = BABYLON.Tools.GetFps().toFixed() + " fps";
  335. // Render scene
  336. if (scene) {
  337. if (!sceneChecked) {
  338. var remaining = scene.getWaitingItemsCount();
  339. loadingText.innerHTML = "Streaming items..." + (remaining ? (remaining + " remaining") : "");
  340. }
  341. scene.render();
  342. // Stats
  343. if (enableStats.checked) {
  344. stats.innerHTML = "Total vertices: " + scene.getTotalVertices() + "<br>"
  345. + "Active vertices: " + scene.getActiveVertices() + "<br>"
  346. + "Active particles: " + scene.getActiveParticles() + "<br><br><br>"
  347. + "Frame duration: " + scene.getLastFrameDuration() + " ms<br><br>"
  348. + "<i>Evaluate Active Meshes duration:</i> " + scene.getEvaluateActiveMeshesDuration() + " ms<br>"
  349. + "<i>Render Targets duration:</i> " + scene.getRenderTargetsDuration() + " ms<br>"
  350. + "<i>Particles duration:</i> " + scene.getParticlesDuration() + " ms<br>"
  351. + "<i>Sprites duration:</i> " + scene.getSpritesDuration() + " ms<br>"
  352. + "<i>Render duration:</i> " + scene.getRenderDuration() + " ms";
  353. }
  354. // Streams
  355. if (scene.useDelayedTextureLoading) {
  356. var waiting = scene.getWaitingItemsCount();
  357. if (waiting > 0) {
  358. status.innerHTML = "Streaming items..." + waiting + " remaining";
  359. } else {
  360. status.innerHTML = "";
  361. }
  362. }
  363. }
  364. };
  365. // Launch render loop
  366. engine.runRenderLoop(renderFunction);
  367. // Resize
  368. window.addEventListener("resize", function () {
  369. engine.resize();
  370. });
  371. // Caps
  372. var caps = engine.getCaps();
  373. document.getElementById("extensions").innerHTML =
  374. "Max textures image units: <b>" + caps.maxTexturesImageUnits + "</b><br>" +
  375. "Max texture size: <b>" + caps.maxTextureSize + "</b><br>" +
  376. "Max cubemap texture size: <b>" + caps.maxCubemapTextureSize + "</b><br>" +
  377. "Max render texture size: <b>" + caps.maxRenderTextureSize + "</b><br>";
  378. // UI
  379. var panelIsClosed = true;
  380. var cameraPanelIsClosed = true;
  381. var aboutIsClosed = true;
  382. document.getElementById("clickableTag").addEventListener("click", function () {
  383. if (panelIsClosed) {
  384. panelIsClosed = false;
  385. controlPanel.style.webkitTransform = "translateY(0px)";
  386. controlPanel.style.transform = "translateY(0px)";
  387. } else {
  388. panelIsClosed = true;
  389. controlPanel.style.webkitTransform = "translateY(250px)";
  390. controlPanel.style.transform = "translateY(250px)";
  391. }
  392. });
  393. document.getElementById("cameraClickableTag").addEventListener("click", function () {
  394. if (cameraPanelIsClosed) {
  395. cameraPanelIsClosed = false;
  396. cameraPanel.style.webkitTransform = "translateX(0px)";
  397. cameraPanel.style.transform = "translateX(0px)";
  398. } else {
  399. cameraPanelIsClosed = true;
  400. cameraPanel.style.webkitTransform = "translateX(300px)";
  401. cameraPanel.style.transform = "translateX(300px)";
  402. }
  403. });
  404. document.getElementById("aboutLink").addEventListener("click", function () {
  405. if (aboutIsClosed) {
  406. aboutIsClosed = false;
  407. aboutPanel.style.webkitTransform = "translateX(0px)";
  408. aboutPanel.style.transform = "translateX(0px)";
  409. } else {
  410. aboutIsClosed = true;
  411. aboutPanel.style.webkitTransform = "translateX(-120%)";
  412. aboutPanel.style.transform = "translateX(-120%)";
  413. }
  414. });
  415. document.getElementById("notSupported").addEventListener("click", function () {
  416. document.getElementById("notSupported").className = "hidden";
  417. opacityMask.className = "hidden";
  418. });
  419. opacityMask.addEventListener("click", function () {
  420. document.getElementById("notSupported").className = "hidden";
  421. opacityMask.className = "hidden";
  422. });
  423. document.getElementById("aboutPanel").addEventListener("click", function (evt) {
  424. evt.cancelBubble = true;
  425. });
  426. document.getElementById("menuPanel").addEventListener("click", function (evt) {
  427. if (!aboutIsClosed) {
  428. aboutIsClosed = true;
  429. aboutPanel.style.webkitTransform = "translateX(-120%)";
  430. aboutPanel.style.transform = "translateX(-120%)";
  431. }
  432. });
  433. canvas.addEventListener("click", function (evt) {
  434. if (!panelIsClosed) {
  435. panelIsClosed = true;
  436. cameraPanelIsClosed = true;
  437. controlPanel.style.webkitTransform = "translateY(250px)";
  438. controlPanel.style.transform = "translateY(250px)";
  439. cameraPanel.style.webkitTransform = "translateX(300px)";
  440. cameraPanel.style.transform = "translateX(300px)";
  441. }
  442. if (evt.ctrlKey) {
  443. if (!scene)
  444. return;
  445. var pickResult = scene.pick(evt.clientX, evt.clientY);
  446. if (pickResult.hit) {
  447. status.innerHTML = "Selected object: " + pickResult.pickedMesh.name;
  448. // Animations
  449. scene.beginAnimation(pickResult.pickedMesh, 0, 100, true, 1.0);
  450. var material = pickResult.pickedMesh.material;
  451. if (material) {
  452. scene.beginAnimation(material, 0, 100, true, 1.0);
  453. }
  454. // Emit particles
  455. var particleSystem = new BABYLON.ParticleSystem("particles", 400, scene);
  456. particleSystem.particleTexture = new BABYLON.Texture("Assets/Flare.png", scene);
  457. particleSystem.minAngularSpeed = -0.5;
  458. particleSystem.maxAngularSpeed = 0.5;
  459. particleSystem.minSize = 0.1;
  460. particleSystem.maxSize = 0.5;
  461. particleSystem.minLifeTime = 0.5;
  462. particleSystem.maxLifeTime = 2.0;
  463. particleSystem.minEmitPower = 0.5;
  464. particleSystem.maxEmitPower = 1.0;
  465. particleSystem.emitter = pickResult.pickedPoint;
  466. particleSystem.emitRate = 400;
  467. particleSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;
  468. particleSystem.minEmitBox = new BABYLON.Vector3(0, 0, 0);
  469. particleSystem.maxEmitBox = new BABYLON.Vector3(0, 0, 0);
  470. particleSystem.direction1 = new BABYLON.Vector3(-1, -1, -1);
  471. particleSystem.direction2 = new BABYLON.Vector3(1, 1, 1);
  472. particleSystem.color1 = new BABYLON.Color4(1, 0, 0, 1);
  473. particleSystem.color2 = new BABYLON.Color4(0, 1, 1, 1);
  474. particleSystem.gravity = new BABYLON.Vector3(0, -5, 0);
  475. particleSystem.disposeOnStop = true;
  476. particleSystem.targetStopDuration = 0.1;
  477. particleSystem.start();
  478. } else {
  479. status.innerHTML = "";
  480. }
  481. }
  482. });
  483. wireframe.addEventListener("change", function () {
  484. if (engine) {
  485. engine.forceWireframe = wireframe.checked;
  486. }
  487. });
  488. enableStats.addEventListener("change", function () {
  489. stats.className = enableStats.checked ? "" : "hidden";
  490. });
  491. fullscreen.addEventListener("click", function () {
  492. if (engine) {
  493. engine.switchFullscreen(true);
  494. }
  495. });
  496. var switchCamera = function (camera) {
  497. if (scene.activeCamera.rotation) {
  498. camera.rotation = scene.activeCamera.rotation.clone();
  499. }
  500. camera.fov = scene.activeCamera.fov;
  501. camera.minZ = scene.activeCamera.minZ;
  502. camera.maxZ = scene.activeCamera.maxZ;
  503. if (scene.activeCamera.ellipsoid) {
  504. camera.ellipsoid = scene.activeCamera.ellipsoid.clone();
  505. }
  506. camera.checkCollisions = scene.activeCamera.checkCollisions;
  507. camera.applyGravity = scene.activeCamera.applyGravity;
  508. camera.speed = scene.activeCamera.speed;
  509. camera.postProcesses = scene.activeCamera.postProcesses;
  510. scene.activeCamera.postProcesses = [];
  511. scene.activeCamera.detachControl(canvas);
  512. scene.activeCamera = camera;
  513. scene.activeCamera.attachControl(canvas);
  514. };
  515. touchCamera.addEventListener("click", function () {
  516. if (!scene) {
  517. return;
  518. }
  519. var camera = new BABYLON.TouchCamera("touchCamera", scene.activeCamera.position, scene);
  520. switchCamera(camera);
  521. });
  522. deviceOrientationCamera.addEventListener("click", function () {
  523. if (!scene) {
  524. return;
  525. }
  526. var camera = new BABYLON.DeviceOrientationCamera("deviceOrientationCamera", scene.activeCamera.position, scene);
  527. switchCamera(camera);
  528. });
  529. hardwareScalingLevel.addEventListener("change", function () {
  530. if (!engine)
  531. return;
  532. engine.setHardwareScalingLevel(hardwareScalingLevel.selectedIndex + 1);
  533. });
  534. collisions.addEventListener("change", function () {
  535. if (scene) {
  536. scene.collisionsEnabled = collisions.checked;
  537. }
  538. });
  539. postProcess.addEventListener("change", function () {
  540. if (scene) {
  541. scene.postProcessesEnabled = postProcess.checked;
  542. }
  543. });
  544. toggleBandW.addEventListener("click", function () {
  545. if (scene && scene.activeCamera) {
  546. if (scene.activeCamera.__bandw_cookie) {
  547. scene.activeCamera.__bandw_cookie.dispose(),
  548. scene.activeCamera.__bandw_cookie = null;
  549. } else {
  550. scene.activeCamera.__bandw_cookie = new BABYLON.BlackAndWhitePostProcess("bandw", 1.0, scene.activeCamera);
  551. }
  552. }
  553. });
  554. toggleFxaa.addEventListener("click", function () {
  555. if (scene && scene.activeCamera) {
  556. if (scene.activeCamera.__fxaa_cookie) {
  557. scene.activeCamera.__fxaa_cookie.dispose(),
  558. scene.activeCamera.__fxaa_cookie = null;
  559. } else {
  560. scene.activeCamera.__fxaa_cookie = new BABYLON.FxaaPostProcess("fxaa", 1.0, scene.activeCamera);
  561. }
  562. }
  563. });
  564. toggleFsaa4.addEventListener("click", function () {
  565. if (scene && scene.activeCamera) {
  566. if (scene.activeCamera.__fsaa_cookie) {
  567. scene.activeCamera.__fsaa_cookie.dispose(),
  568. scene.activeCamera.__fsaa_cookie = null;
  569. } else {
  570. var fx = new BABYLON.PassPostProcess("fsaa", 2.0, scene.activeCamera);
  571. fx.renderTargetSamplingMode = BABYLON.Texture.BILINEAR_SAMPLINGMODE;
  572. scene.activeCamera.__fsaa_cookie = fx;
  573. }
  574. }
  575. });
  576. toggleSepia.addEventListener("click", function () {
  577. if (scene && scene.activeCamera) {
  578. if (scene.activeCamera.__sepia_cookie) {
  579. scene.activeCamera.__sepia_cookie.dispose(),
  580. scene.activeCamera.__sepia_cookie = null;
  581. } else {
  582. var sepiaKernelMatrix = BABYLON.Matrix.FromValues(
  583. 0.393, 0.349, 0.272, 0,
  584. 0.769, 0.686, 0.534, 0,
  585. 0.189, 0.168, 0.131, 0,
  586. 0, 0, 0, 0
  587. );
  588. scene.activeCamera.__sepia_cookie = new BABYLON.ConvolutionPostProcess("Sepia", sepiaKernelMatrix, 1.0, scene.activeCamera);
  589. }
  590. }
  591. });
  592. // Cameras
  593. camerasList.addEventListener("change", function (ev) {
  594. scene.activeCamera.detachControl(canvas);
  595. scene.activeCamera = scene.cameras[camerasList.selectedIndex];
  596. scene.activeCamera.attachControl(canvas);
  597. });
  598. // Query string
  599. var queryString = window.location.search;
  600. if (queryString) {
  601. var query = queryString.replace("?", "");
  602. var index = parseInt(query);
  603. if (!isNaN(index)) {
  604. if (index >= demos.length) {
  605. itemClick(tests[index - demos.length])();
  606. } else {
  607. itemClick(demos[index])();
  608. }
  609. } else {
  610. for (index = 0; index < demos.length; index++) {
  611. if (demos[index].title === query) {
  612. itemClick(demos[index])();
  613. return;
  614. }
  615. }
  616. for (index = 0; index < tests.length; index++) {
  617. if (tests[index].title === query) {
  618. itemClick(tests[index])();
  619. return;
  620. }
  621. }
  622. }
  623. }
  624. };