index.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  1. /// <reference path="babylon.js" />
  2. document.addEventListener("DOMContentLoaded", function () {
  3. onload();
  4. }, false);
  5. var onload = function () {
  6. var canvas = document.getElementById("renderCanvas");
  7. var backImg = document.getElementById("back");
  8. backImg.style.maxWidth = window.innerWidth + "px";
  9. window.addEventListener("resize", function () {
  10. backImg.style.maxWidth = window.innerWidth + "px";
  11. });
  12. function hideAllUI() {
  13. var divsToHide = document.querySelectorAll("#renderZone > div");
  14. for (var i = 0; i < divsToHide.length; ++i) {
  15. if (divsToHide[i].id == "fps") continue;
  16. divsToHide[i].className += " hidden";
  17. }
  18. }
  19. function restoreAllUI() {
  20. var divsToHide = document.querySelectorAll("#renderZone > div");
  21. for (var i = 0; i < divsToHide.length; ++i) {
  22. if (divsToHide[i].id == "fps") continue;
  23. divsToHide[i].className = divsToHide[i].className.replace(" hidden", "");
  24. }
  25. }
  26. // Demos
  27. var demos = [
  28. {
  29. title: "HILLVALLEY", scene: "hillvalley", screenshot: "hill.jpg", size: "70 MB - Original by Camille JOLY<BR>Optimized by Michel ROUSSEAU", incremental: false, big: true, onload: function () {
  30. scene.collisionsEnabled = false;
  31. scene.lightsEnabled = false;
  32. scene.createOrUpdateSelectionOctree();
  33. for (var matIndex = 0; matIndex < scene.materials.length; matIndex++) {
  34. scene.materials[matIndex].checkReadyOnEveryCall = false;
  35. }
  36. }
  37. },
  38. {
  39. title: "TRAIN", scene: "Train", screenshot: "train.jpg", size: "70 MB", onload: function () {
  40. scene.collisionsEnabled = false;
  41. for (var index = 0; index < scene.cameras.length; index++) {
  42. scene.cameras[index].minZ = 10;
  43. }
  44. scene.activeCamera.detachControl(canvas);
  45. scene.activeCamera = scene.cameras[6];
  46. scene.activeCamera.attachControl(canvas);
  47. scene.getMaterialByName("terrain_eau").bumpTexture = null;
  48. // Postprocesses
  49. var bwPostProcess = new BABYLON.BlackAndWhitePostProcess("Black and White", 1.0, scene.cameras[2]);
  50. scene.cameras[2].name = "B&W";
  51. var sepiaKernelMatrix = BABYLON.Matrix.FromValues(
  52. 0.393, 0.349, 0.272, 0,
  53. 0.769, 0.686, 0.534, 0,
  54. 0.189, 0.168, 0.131, 0,
  55. 0, 0, 0, 0
  56. );
  57. var sepiaPostProcess = new BABYLON.FilterPostProcess("Sepia", sepiaKernelMatrix, 1.0, scene.cameras[3]);
  58. scene.cameras[3].name = "SEPIA";
  59. var serializationObject = BABYLON.SceneSerializer.Serialize(scene);
  60. var string = JSON.stringify(serializationObject);
  61. }
  62. },
  63. {
  64. title: "ROBOT", url: "Scenes/Robot/index.html", screenshot: "robot.jpg", size: "8.5 MB", onload: function () {
  65. scene.collisionsEnabled = false;
  66. }
  67. },
  68. { title: "WORLDMONGER", url: "Scenes/Worldmonger/index.html", screenshot: "worldmonger.jpg", size: "8.5 MB" },
  69. { title: "HEART", scene: "Heart", screenshot: "heart.jpg", size: "14 MB", },
  70. {
  71. title: "ESPILIT", scene: "Espilit", screenshot: "espilit.jpg", size: "50 MB", incremental: true, onload: function () {
  72. scene.autoClear = true;
  73. scene.createOrUpdateSelectionOctree();
  74. 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]);
  75. }
  76. },
  77. { title: "WINDOWS CAFE", scene: "WCafe", screenshot: "wcafe.jpg", size: "28 MB", anchor: "WCAFE" },
  78. {
  79. title: "FLAT 2009",
  80. scene: "Flat2009",
  81. screenshot: "flat2009.jpg",
  82. size: "44 MB",
  83. onload: function () {
  84. var ecran = scene.getMeshByName("Ecran");
  85. ecran.material.diffuseTexture = new BABYLON.VideoTexture("video", ["Scenes/Flat2009/babylonjs.mp4", "Scenes/Flat2009/babylonjs.webm"], 256, scene, true, true);
  86. scene.createOrUpdateSelectionOctree();
  87. }
  88. },
  89. { title: "THE CAR", scene: "TheCar", screenshot: "thecar.jpg", size: "100 MB", incremental: true, anchor: "THECAR" },
  90. { title: "VIPER", scene: "Viper", screenshot: "viper.jpg", size: "18 MB" },
  91. { title: "SPACESHIP", scene: "Spaceship", screenshot: "spaceship.jpg", size: "1 MB" },
  92. {
  93. title: "OMEGA CRUSHER", scene: "SpaceDek", screenshot: "omegacrusher.jpg", size: "10 MB", anchor: "OMEGA", onload: function () {
  94. scene.collisionsEnabled = false;
  95. }
  96. }];
  97. var oculusProcessing = function () {
  98. var originCamera = scene.activeCamera;
  99. scene.activeCamera = null;
  100. scene.activeCameras = [];
  101. scene.autoClear = true;
  102. BABYLON.OculusOrientedCamera.BuildOculusStereoCamera(scene, "Oculus", originCamera.minZ, originCamera.maxZ, originCamera.position,
  103. { yaw: 3, pitch: 0, roll: 0 }, true, true, true);
  104. hideAllUI();
  105. };
  106. var oculusProcessingWithCollisionsAndGravity = function () {
  107. var originCamera = scene.activeCamera;
  108. scene.activeCamera = null;
  109. scene.activeCameras = [];
  110. scene.autoClear = true;
  111. BABYLON.OculusOrientedCamera.BuildOculusStereoCamera(scene, "Oculus", originCamera.minZ, originCamera.maxZ, originCamera.position,
  112. { yaw: 3, pitch: 0, roll: 0 }, true);
  113. hideAllUI();
  114. };
  115. var oculusTests = [
  116. {
  117. title: "HILLVALLEY", scene: "hillvalley", screenshot: "hill2.jpg", size: "70 MB", anchor: "OCC0", onload: oculusProcessing
  118. },
  119. {
  120. title: "HEART", scene: "Heart", screenshot: "heart.jpg", size: "14 MB", anchor: "OCC1", onload: oculusProcessingWithCollisionsAndGravity
  121. },
  122. {
  123. title: "ESPILIT", scene: "Espilit", screenshot: "espilit.jpg", size: "50 MB", anchor: "OCC2", onload: oculusProcessingWithCollisionsAndGravity
  124. },
  125. {
  126. title: "WINDOWS CAFE", scene: "wcafe", screenshot: "wcafe.jpg", size: "28 MB", anchor: "OCC3", onload: oculusProcessingWithCollisionsAndGravity
  127. },
  128. {
  129. title: "Flat 2009", scene: "Flat2009", screenshot: "Flat2009.jpg", size: "44 MB", anchor: "OCC4", onload: oculusProcessingWithCollisionsAndGravity
  130. }
  131. ];
  132. var tests = [
  133. { title: "POSTPROCESS - CONVOLUTION", id: 16, screenshot: "convolution.jpg", size: "1 MB", anchor: "PPCONVOLUTION" },
  134. { title: "CONSTRUCTIVE SOLID GEOMETRIES", id: 15, screenshot: "csg.jpg", size: "1 MB", anchor: "CSG" },
  135. { title: "CUSTOM SHADER - CELL SHADING", id: 14, screenshot: "cellshading.jpg", size: "1 MB", anchor: "CUSTOMSHADER" },
  136. { title: "EDITOR", url: "http://www.babylonjs.com/editor", screenshot: "editor.jpg", size: "1 MB" },
  137. { title: "PHYSICS", id: 13, screenshot: "physics.jpg", size: "1.0 MB", anchor: "PHYSICS" },
  138. { title: "LENS FLARES", id: 12, screenshot: "lens.jpg", size: "1.0 MB", anchor: "LENS" },
  139. { title: "POSTPROCESS - REFRACTION", id: 11, screenshot: "postprocessRefraction.jpg", size: "1.0 MB", anchor: "PPREF" },
  140. { title: "POSTPROCESS - BLOOM", id: 10, screenshot: "postprocessBloom.jpg", size: "1.0 MB", anchor: "PPBLOOM" },
  141. { title: "OCTREE - 8000 spheres", id: 8, screenshot: "octree.jpg", size: "0.1 MB", anchor: "OCTREE" },
  142. { title: "BONES", id: 9, screenshot: "bones.jpg", size: "10 MB" },
  143. { title: "CHARTING", id: 7, screenshot: "charting.jpg", size: "0.1 MB" },
  144. { title: "SHADOWS", id: 6, screenshot: "shadows.jpg", size: "1.0 MB" },
  145. { title: "HEIGHTMAP", id: 5, screenshot: "heightmap.jpg", size: "1.0 MB" },
  146. { title: "LIGHTS", id: 1, screenshot: "testlight.jpg", size: "0.1 MB" },
  147. { title: "BUMP", id: 2, screenshot: "bump.jpg", size: "0.1 MB" },
  148. { title: "FOG", id: 3, screenshot: "fog.jpg", size: "0.1 MB" },
  149. { title: "MULTIMATERIAL", id: 4, screenshot: "multimat.jpg", size: "0.1 MB" },
  150. { title: "BLENDER", scene: "blender", screenshot: "blender.jpg", size: "0.2 MB" },
  151. { title: "SCENE #1", id: 0, screenshot: "testscene.jpg", size: "10 MB" }
  152. ];
  153. var thirdParties = [
  154. { title: "LIGHT SPEED READY", url: "http://xanmia.github.io/Light-Speed-Ready/game.html", screenshot: "Light Speed Ready.jpg", size: "by Xanmia" },
  155. { title: "DRIFT", url: "http://www.visualiser.fr/Babylon/Drift/default.htm", screenshot: "Drift.jpg", size: "by S. Girardin" },
  156. { title: "BING 3D MAPS", url: "http://babylonbing.azurewebsites.net/", screenshot: "bing3D.jpg", size: "by A. Beaulieu" },
  157. { title: "CAR GAME", url: "http://babylon.azurewebsites.net", screenshot: "car.jpg", size: "by G. Carlander" },
  158. { title: "CYCLE GAME", url: "http://tronbabylon.azurewebsites.net/", screenshot: "tron.jpg", size: "by G. Carlander" },
  159. { title: "GALLERY", url: "http://guillaume.carlander.fr/Babylon/Gallery/", screenshot: "gallery.png", size: "by G. Carlander" },
  160. { title: "Catalog3D", url: "http://apps.microsoft.com/windows/en-gb/app/catalog-3d-by-sokrate/43771ce3-02f0-4365-98c3-557cd8acdad2", screenshot: "sokrate3D.jpg", size: "by SOKRATE" },
  161. { title: "PSN TELECENTRES", url: "http://psntelecentres.com/visite_virtuelle.html", screenshot: "psn.jpg", size: "by SOKRATE" },
  162. { title: "VIRTUAL EXPO", url: "http://www.sokrate.fr/expovirtuelle/index.htm", screenshot: "expo.jpg", size: "by SOKRATE" },
  163. { title: "3delyvisions SKYBOX TOUR", url: "http://urbanproductions.com/wingy/babylon/skyboxes/skybox_tour.htm", screenshot: "tour.jpg", size: "by Wingnut" }
  164. ];
  165. // UI
  166. var opacityMask = document.getElementById("opacityMask");
  167. var menuPanel = document.getElementById("screen1");
  168. var items = document.getElementById("items");
  169. var testItems = document.getElementById("testItems");
  170. var _3rdItems = document.getElementById("3rdItems");
  171. var oculusDemosElem = document.getElementById("oculusDemos");
  172. var renderZone = document.getElementById("renderZone");
  173. var controlPanel = document.getElementById("controlPanel");
  174. var cameraPanel = document.getElementById("cameraPanel");
  175. var wireframe = document.getElementById("wireframe");
  176. var divFps = document.getElementById("fps");
  177. var stats = document.getElementById("stats");
  178. var enableStats = document.getElementById("enableStats");
  179. var loadingBack = document.getElementById("loadingBack");
  180. var loadingText = document.getElementById("loadingText");
  181. var hardwareScalingLevel = document.getElementById("hardwareScalingLevel");
  182. var collisions = document.getElementById("collisions");
  183. var postProcess = document.getElementById("postProcess");
  184. var mirrors = document.getElementById("mirrors");
  185. var status = document.getElementById("status");
  186. var fullscreen = document.getElementById("fullscreen");
  187. var touchCamera = document.getElementById("touchCamera");
  188. var deviceOrientationCamera = document.getElementById("deviceOrientationCamera");
  189. var virtualJoysticksCamera = document.getElementById("virtualJoysticksCamera");
  190. var camerasList = document.getElementById("camerasList");
  191. var toggleFsaa4 = document.getElementById("toggleFsaa4");
  192. var toggleFxaa = document.getElementById("toggleFxaa");
  193. var toggleBandW = document.getElementById("toggleBandW");
  194. var toggleSepia = document.getElementById("toggleSepia");
  195. var sceneChecked;
  196. var itemClick = function (demo) {
  197. return function () {
  198. // Check support
  199. if (!BABYLON.Engine.isSupported()) {
  200. document.getElementById("notSupported").className = "";
  201. opacityMask.className = "";
  202. } else {
  203. restoreAllUI();
  204. if (demo.url) {
  205. window.location = demo.url;
  206. return;
  207. }
  208. loadScene(demo.id !== undefined ? demo.id : demo.scene, demo.incremental ? ".incremental" : "", function () {
  209. if (demo.collisions !== undefined) {
  210. scene.collisionsEnabled = demo.collisions;
  211. }
  212. if (demo.onload) {
  213. demo.onload();
  214. }
  215. });
  216. };
  217. };
  218. };
  219. var removeChildren = function (root) {
  220. while (root.childNodes.length) {
  221. root.removeChild(root.childNodes[0]);
  222. }
  223. };
  224. var createItem = function (item, root) {
  225. var span = document.createElement("span");
  226. var img = document.createElement("img");
  227. var div = document.createElement("div");
  228. var label2 = document.createElement("label");
  229. if (item.big) {
  230. span.className = "big-item";
  231. var newImg = document.createElement("img");
  232. var newText = document.createElement("div");
  233. newImg.id = "newImg";
  234. newImg.src = "Assets/SpotLast.png";
  235. newText.innerHTML = "LAST<br>UPDATE";
  236. newText.id = "newText";
  237. span.appendChild(newImg);
  238. span.appendChild(newText);
  239. } else {
  240. span.className = "item";
  241. }
  242. img.className = "item-image";
  243. img.src = "Screenshots/" + item.screenshot;
  244. span.appendChild(img);
  245. div.className = "item-text";
  246. div.innerHTML = item.title;
  247. span.appendChild(div);
  248. label2.className = "item-text-right";
  249. label2.innerHTML = item.size;
  250. span.appendChild(label2);
  251. span.onclick = itemClick(item);
  252. root.appendChild(span);
  253. };
  254. // Demos
  255. removeChildren(items);
  256. for (var index = 0; index < demos.length; index++) {
  257. var demo = demos[index];
  258. createItem(demo, items);
  259. }
  260. // Tests
  261. removeChildren(testItems);
  262. for (index = 0; index < tests.length; index++) {
  263. var test = tests[index];
  264. createItem(test, testItems);
  265. }
  266. // 3rd party
  267. removeChildren(_3rdItems);
  268. for (index = 0; index < thirdParties.length; index++) {
  269. var thirdParty = thirdParties[index];
  270. createItem(thirdParty, _3rdItems);
  271. }
  272. if (oculusDemosElem) {
  273. removeChildren(oculusDemosElem);
  274. for (index = 0; index < oculusTests.length; ++index) {
  275. var test = oculusTests[index];
  276. createItem(test, oculusDemosElem);
  277. }
  278. }
  279. // Go Back
  280. var goBack = function () {
  281. if (scene) {
  282. scene.dispose();
  283. scene = null;
  284. }
  285. menuPanel.className = "";
  286. renderZone.className = "movedRight";
  287. };
  288. // History
  289. if (window.onpopstate !== undefined) {
  290. window.onpopstate = function () {
  291. goBack();
  292. };
  293. }
  294. // Babylon
  295. var engine = new BABYLON.Engine(canvas, true);
  296. var scene;
  297. var restoreUI = function () {
  298. loadingBack.className = "loadingBack";
  299. loadingText.className = "loadingText";
  300. menuPanel.className = "movedLeft";
  301. renderZone.className = "";
  302. opacityMask.className = "hidden";
  303. sceneChecked = true;
  304. camerasList.options.length = 0;
  305. for (var index = 0; index < scene.cameras.length; index++) {
  306. var camera = scene.cameras[index];
  307. var option = new Option();
  308. option.text = camera.name;
  309. option.value = camera;
  310. if (camera == scene.activeCamera) {
  311. option.selected = true;
  312. }
  313. camerasList.appendChild(option);
  314. }
  315. };
  316. var loadScene = function (name, incremental, then) {
  317. // Cleaning
  318. if (scene) {
  319. scene.dispose();
  320. scene = null;
  321. }
  322. sceneChecked = false;
  323. // History
  324. if (history.pushState) {
  325. history.pushState({}, name, window.location.pathname + window.location.search);
  326. }
  327. // Loading
  328. var importScene = function () {
  329. loadingBack.removeEventListener("transitionend", importScene);
  330. loadingBack.removeEventListener("webkitTransitionend", importScene);
  331. engine.resize();
  332. if (typeof name == "number") {
  333. var newScene;
  334. switch (name) {
  335. case 0:
  336. newScene = CreateTestScene(engine);
  337. break;
  338. case 1:
  339. newScene = CreateLightsTestScene(engine);
  340. break;
  341. case 2:
  342. newScene = CreateBumpScene(engine);
  343. break;
  344. case 3:
  345. newScene = CreateFogScene(engine);
  346. break;
  347. case 4:
  348. newScene = CreateMultiMaterialScene(engine);
  349. break;
  350. case 5:
  351. newScene = CreateHeightMapTestScene(engine);
  352. break;
  353. case 6:
  354. newScene = CreateShadowsTestScene(engine);
  355. break;
  356. case 7:
  357. newScene = CreateChartingTestScene(engine);
  358. break;
  359. case 8:
  360. newScene = CreateOctreeTestScene(engine);
  361. break;
  362. case 9:
  363. newScene = CreateBonesTestScene(engine);
  364. break;
  365. case 10:
  366. newScene = CreatePostProcessBloomTestScene(engine);
  367. break;
  368. case 11:
  369. newScene = CreatePostProcessRefractionTestScene(engine);
  370. break;
  371. case 12:
  372. newScene = CreateLensFlaresTestScene(engine);
  373. break;
  374. case 13:
  375. newScene = CreatePhysicsScene(engine);
  376. break;
  377. case 14:
  378. newScene = CreateCellShadingScene(engine);
  379. break;
  380. case 15:
  381. newScene = CreateCSGTestScene(engine);
  382. break;
  383. case 16:
  384. newScene = CreateConvolutionTestScene(engine);
  385. break;
  386. }
  387. scene = newScene;
  388. scene.executeWhenReady(function () {
  389. if (scene.activeCamera) {
  390. scene.activeCamera.attachControl(canvas);
  391. if (then) {
  392. then();
  393. }
  394. }
  395. // UI
  396. restoreUI();
  397. });
  398. return;
  399. };
  400. var dlCount = 0;
  401. BABYLON.SceneLoader.Load("Scenes/" + name + "/", name + incremental + ".babylon", engine, function (newScene) {
  402. scene = newScene;
  403. scene.executeWhenReady(function () {
  404. if (scene.activeCamera) {
  405. scene.activeCamera.attachControl(canvas);
  406. if (newScene.activeCamera.keysUp) {
  407. newScene.activeCamera.keysUp.push(90); // Z
  408. newScene.activeCamera.keysUp.push(87); // W
  409. newScene.activeCamera.keysDown.push(83); // S
  410. newScene.activeCamera.keysLeft.push(65); // A
  411. newScene.activeCamera.keysLeft.push(81); // Q
  412. newScene.activeCamera.keysRight.push(69); // E
  413. newScene.activeCamera.keysRight.push(68); // D
  414. }
  415. }
  416. if (then) {
  417. then();
  418. }
  419. // UI
  420. restoreUI();
  421. });
  422. }, function (evt) {
  423. if (evt.lengthComputable) {
  424. loadingText.innerHTML = "Loading, please wait..." + (evt.loaded * 100 / evt.total).toFixed() + "%";
  425. } else {
  426. dlCount = evt.loaded / (1024 * 1024);
  427. loadingText.innerHTML = "Loading, please wait..." + Math.floor(dlCount * 100.0) / 100.0 + " MB already loaded.";
  428. }
  429. });
  430. };
  431. loadingBack.addEventListener("transitionend", importScene);
  432. loadingBack.addEventListener("webkitTransitionend", importScene);
  433. loadingBack.className = "";
  434. loadingText.className = "";
  435. opacityMask.className = "";
  436. loadingText.innerHTML = "Loading, please wait...";
  437. };
  438. // Render loop
  439. var renderFunction = function () {
  440. // Fps
  441. divFps.innerHTML = BABYLON.Tools.GetFps().toFixed() + " fps";
  442. // Render scene
  443. if (scene) {
  444. if (!sceneChecked) {
  445. var remaining = scene.getWaitingItemsCount();
  446. loadingText.innerHTML = "Streaming items..." + (remaining ? (remaining + " remaining") : "");
  447. }
  448. scene.render();
  449. // Stats
  450. if (enableStats.checked) {
  451. stats.innerHTML = "Total vertices: " + scene.getTotalVertices() + "<br>"
  452. + "Active vertices: " + scene.getActiveVertices() + "<br>"
  453. + "Active particles: " + scene.getActiveParticles() + "<br><br><br>"
  454. + "Frame duration: " + scene.getLastFrameDuration() + " ms<br><br>"
  455. + "<i>Evaluate Active Meshes duration:</i> " + scene.getEvaluateActiveMeshesDuration() + " ms<br>"
  456. + "<i>Render Targets duration:</i> " + scene.getRenderTargetsDuration() + " ms<br>"
  457. + "<i>Particles duration:</i> " + scene.getParticlesDuration() + " ms<br>"
  458. + "<i>Sprites duration:</i> " + scene.getSpritesDuration() + " ms<br>"
  459. + "<i>Render duration:</i> " + scene.getRenderDuration() + " ms";
  460. }
  461. // Streams
  462. if (scene.useDelayedTextureLoading) {
  463. var waiting = scene.getWaitingItemsCount();
  464. if (waiting > 0) {
  465. status.innerHTML = "Streaming items..." + waiting + " remaining";
  466. } else {
  467. status.innerHTML = "";
  468. }
  469. }
  470. }
  471. };
  472. // Launch render loop
  473. engine.runRenderLoop(renderFunction);
  474. // Resize
  475. window.addEventListener("resize", function () {
  476. engine.resize();
  477. });
  478. // Caps
  479. var caps = engine.getCaps();
  480. document.getElementById("extensions").innerHTML =
  481. "Max textures image units: <b>" + caps.maxTexturesImageUnits + "</b><br>" +
  482. "Max texture size: <b>" + caps.maxTextureSize + "</b><br>" +
  483. "Max cubemap texture size: <b>" + caps.maxCubemapTextureSize + "</b><br>" +
  484. "Max render texture size: <b>" + caps.maxRenderTextureSize + "</b><br>";
  485. // UI
  486. var panelIsClosed = true;
  487. var cameraPanelIsClosed = true;
  488. var aboutIsClosed = true;
  489. document.getElementById("clickableTag").addEventListener("click", function () {
  490. if (panelIsClosed) {
  491. panelIsClosed = false;
  492. controlPanel.style.webkitTransform = "translateY(0px)";
  493. controlPanel.style.transform = "translateY(0px)";
  494. } else {
  495. panelIsClosed = true;
  496. controlPanel.style.webkitTransform = "translateY(250px)";
  497. controlPanel.style.transform = "translateY(250px)";
  498. }
  499. });
  500. document.getElementById("cameraClickableTag").addEventListener("click", function () {
  501. if (cameraPanelIsClosed) {
  502. cameraPanelIsClosed = false;
  503. cameraPanel.style.webkitTransform = "translateX(0px)";
  504. cameraPanel.style.transform = "translateX(0px)";
  505. } else {
  506. hideCameraPanel();
  507. }
  508. });
  509. document.getElementById("aboutLink").addEventListener("click", function () {
  510. if (aboutIsClosed) {
  511. aboutIsClosed = false;
  512. aboutPanel.style.webkitTransform = "translateX(0px)";
  513. aboutPanel.style.transform = "translateX(0px)";
  514. } else {
  515. aboutIsClosed = true;
  516. aboutPanel.style.webkitTransform = "translateX(-120%)";
  517. aboutPanel.style.transform = "translateX(-120%)";
  518. }
  519. });
  520. document.getElementById("notSupported").addEventListener("click", function () {
  521. document.getElementById("notSupported").className = "hidden";
  522. opacityMask.className = "hidden";
  523. });
  524. opacityMask.addEventListener("click", function () {
  525. document.getElementById("notSupported").className = "hidden";
  526. opacityMask.className = "hidden";
  527. });
  528. document.getElementById("aboutPanel").addEventListener("click", function (evt) {
  529. evt.cancelBubble = true;
  530. });
  531. var hideCameraPanel = function () {
  532. cameraPanelIsClosed = true;
  533. cameraPanel.style.webkitTransform = "translateX(17em)";
  534. cameraPanel.style.transform = "translateX(17em)";
  535. };
  536. document.getElementById("menuPanel").addEventListener("click", function (evt) {
  537. if (!aboutIsClosed) {
  538. aboutIsClosed = true;
  539. aboutPanel.style.webkitTransform = "translateX(-120%)";
  540. aboutPanel.style.transform = "translateX(-120%)";
  541. hideCameraPanel();
  542. }
  543. });
  544. canvas.addEventListener("mousedown", function (evt) {
  545. if (!panelIsClosed) {
  546. panelIsClosed = true;
  547. controlPanel.style.webkitTransform = "translateY(250px)";
  548. controlPanel.style.transform = "translateY(250px)";
  549. }
  550. if (!scene)
  551. return;
  552. var pickResult = scene.pick(evt.clientX, evt.clientY);
  553. if (pickResult.hit) {
  554. if (evt.ctrlKey) {
  555. status.innerHTML = "Selected object: " + pickResult.pickedMesh.name + "(" + pickResult.pickedPoint.x + "," + pickResult.pickedPoint.y + "," + pickResult.pickedPoint.z + ")";
  556. // Animations
  557. scene.beginAnimation(pickResult.pickedMesh, 0, 100, true, 1.0);
  558. var material = pickResult.pickedMesh.material;
  559. if (material) {
  560. scene.beginAnimation(material, 0, 100, true, 1.0);
  561. }
  562. // Emit particles
  563. var particleSystem = new BABYLON.ParticleSystem("particles", 400, scene);
  564. particleSystem.particleTexture = new BABYLON.Texture("Assets/Flare.png", scene);
  565. particleSystem.minAngularSpeed = -0.5;
  566. particleSystem.maxAngularSpeed = 0.5;
  567. particleSystem.minSize = 0.1;
  568. particleSystem.maxSize = 0.5;
  569. particleSystem.minLifeTime = 0.5;
  570. particleSystem.maxLifeTime = 2.0;
  571. particleSystem.minEmitPower = 0.5;
  572. particleSystem.maxEmitPower = 1.0;
  573. particleSystem.emitter = pickResult.pickedPoint;
  574. particleSystem.emitRate = 400;
  575. particleSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;
  576. particleSystem.minEmitBox = new BABYLON.Vector3(0, 0, 0);
  577. particleSystem.maxEmitBox = new BABYLON.Vector3(0, 0, 0);
  578. particleSystem.direction1 = new BABYLON.Vector3(-1, -1, -1);
  579. particleSystem.direction2 = new BABYLON.Vector3(1, 1, 1);
  580. particleSystem.color1 = new BABYLON.Color4(1, 0, 0, 1);
  581. particleSystem.color2 = new BABYLON.Color4(0, 1, 1, 1);
  582. particleSystem.gravity = new BABYLON.Vector3(0, -5, 0);
  583. particleSystem.disposeOnStop = true;
  584. particleSystem.targetStopDuration = 0.1;
  585. particleSystem.start();
  586. } else {
  587. var dir = pickResult.pickedPoint.subtract(scene.activeCamera.position);
  588. dir.normalize();
  589. pickResult.pickedMesh.applyImpulse(dir.scale(10), pickResult.pickedPoint);
  590. status.innerHTML = "";
  591. }
  592. }
  593. });
  594. wireframe.addEventListener("change", function () {
  595. if (engine) {
  596. engine.forceWireframe = wireframe.checked;
  597. }
  598. });
  599. enableStats.addEventListener("change", function () {
  600. stats.className = enableStats.checked ? "" : "hidden";
  601. });
  602. fullscreen.addEventListener("click", function () {
  603. if (engine) {
  604. engine.switchFullscreen(true);
  605. }
  606. });
  607. var switchCamera = function (camera) {
  608. if (scene.activeCamera.rotation) {
  609. camera.rotation = scene.activeCamera.rotation.clone();
  610. }
  611. camera.fov = scene.activeCamera.fov;
  612. camera.minZ = scene.activeCamera.minZ;
  613. camera.maxZ = scene.activeCamera.maxZ;
  614. if (scene.activeCamera.ellipsoid) {
  615. camera.ellipsoid = scene.activeCamera.ellipsoid.clone();
  616. }
  617. camera.checkCollisions = scene.activeCamera.checkCollisions;
  618. camera.applyGravity = scene.activeCamera.applyGravity;
  619. camera.speed = scene.activeCamera.speed;
  620. camera.postProcesses = scene.activeCamera.postProcesses;
  621. scene.activeCamera.postProcesses = [];
  622. scene.activeCamera.detachControl(canvas);
  623. if (scene.activeCamera.dispose) scene.activeCamera.dispose();
  624. scene.activeCamera = camera;
  625. scene.activeCamera.attachControl(canvas);
  626. hideCameraPanel();
  627. };
  628. touchCamera.addEventListener("click", function () {
  629. if (!scene) {
  630. return;
  631. }
  632. var camera = new BABYLON.TouchCamera("touchCamera", scene.activeCamera.position, scene);
  633. switchCamera(camera);
  634. });
  635. virtualJoysticksCamera.addEventListener("click", function () {
  636. if (!scene) {
  637. return;
  638. }
  639. var camera = new BABYLON.VirtualJoysticksCamera("virtualJoysticksCamera", scene.activeCamera.position, scene);
  640. switchCamera(camera);
  641. });
  642. deviceOrientationCamera.addEventListener("click", function () {
  643. if (!scene) {
  644. return;
  645. }
  646. var camera = new BABYLON.DeviceOrientationCamera("deviceOrientationCamera", scene.activeCamera.position, scene);
  647. switchCamera(camera);
  648. });
  649. hardwareScalingLevel.addEventListener("change", function () {
  650. if (!engine)
  651. return;
  652. engine.setHardwareScalingLevel(hardwareScalingLevel.selectedIndex + 1);
  653. });
  654. collisions.addEventListener("change", function () {
  655. if (scene) {
  656. scene.collisionsEnabled = collisions.checked;
  657. }
  658. });
  659. postProcess.addEventListener("change", function () {
  660. if (scene) {
  661. scene.postProcessesEnabled = postProcess.checked;
  662. }
  663. });
  664. mirrors.addEventListener("change", function () {
  665. if (scene) {
  666. scene.renderTargetsEnabled = mirrors.checked;
  667. }
  668. });
  669. toggleBandW.addEventListener("click", function () {
  670. if (scene && scene.activeCamera) {
  671. if (scene.activeCamera.__bandw_cookie) {
  672. scene.activeCamera.__bandw_cookie.dispose(),
  673. scene.activeCamera.__bandw_cookie = null;
  674. toggleBandW.className = "smallButtonControlPanel";
  675. } else {
  676. scene.activeCamera.__bandw_cookie = new BABYLON.BlackAndWhitePostProcess("bandw", 1.0, scene.activeCamera);
  677. toggleBandW.className = "smallButtonControlPanel pushed";
  678. }
  679. }
  680. });
  681. toggleFxaa.addEventListener("click", function () {
  682. if (scene && scene.activeCamera) {
  683. if (scene.activeCamera.__fxaa_cookie) {
  684. scene.activeCamera.__fxaa_cookie.dispose(),
  685. scene.activeCamera.__fxaa_cookie = null;
  686. toggleFxaa.className = "smallButtonControlPanel";
  687. } else {
  688. scene.activeCamera.__fxaa_cookie = new BABYLON.FxaaPostProcess("fxaa", 1.0, scene.activeCamera);
  689. toggleFxaa.className = "smallButtonControlPanel pushed";
  690. }
  691. }
  692. });
  693. toggleFsaa4.addEventListener("click", function () {
  694. if (scene && scene.activeCamera) {
  695. if (scene.activeCamera.__fsaa_cookie) {
  696. scene.activeCamera.__fsaa_cookie.dispose(),
  697. scene.activeCamera.__fsaa_cookie = null;
  698. toggleFsaa4.className = "smallButtonControlPanel";
  699. } else {
  700. var fx = new BABYLON.PassPostProcess("fsaa", 2.0, scene.activeCamera);
  701. fx.renderTargetSamplingMode = BABYLON.Texture.BILINEAR_SAMPLINGMODE;
  702. scene.activeCamera.__fsaa_cookie = fx;
  703. toggleFsaa4.className = "smallButtonControlPanel pushed";
  704. }
  705. }
  706. });
  707. toggleSepia.addEventListener("click", function () {
  708. if (scene && scene.activeCamera) {
  709. if (scene.activeCamera.__sepia_cookie) {
  710. scene.activeCamera.__sepia_cookie.dispose(),
  711. scene.activeCamera.__sepia_cookie = null;
  712. toggleSepia.className = "smallButtonControlPanel";
  713. } else {
  714. var sepiaKernelMatrix = BABYLON.Matrix.FromValues(
  715. 0.393, 0.349, 0.272, 0,
  716. 0.769, 0.686, 0.534, 0,
  717. 0.189, 0.168, 0.131, 0,
  718. 0, 0, 0, 0
  719. );
  720. scene.activeCamera.__sepia_cookie = new BABYLON.FilterPostProcess("Sepia", sepiaKernelMatrix, 1.0, scene.activeCamera);
  721. toggleSepia.className = "smallButtonControlPanel pushed";
  722. }
  723. }
  724. });
  725. // Cameras
  726. camerasList.addEventListener("change", function (ev) {
  727. scene.activeCamera.detachControl(canvas);
  728. scene.activeCamera = scene.cameras[camerasList.selectedIndex];
  729. scene.activeCamera.attachControl(canvas);
  730. });
  731. // Query string
  732. var queryString = window.location.search;
  733. if (queryString) {
  734. var query = queryString.replace("?", "");
  735. var index = parseInt(query);
  736. if (!isNaN(index)) {
  737. if (index >= demos.length) {
  738. itemClick(tests[index - demos.length])();
  739. } else {
  740. itemClick(demos[index])();
  741. }
  742. } else {
  743. for (index = 0; index < demos.length; index++) {
  744. if (demos[index].anchor && demos[index].anchor === query || demos[index].title === query) {
  745. itemClick(demos[index])();
  746. return;
  747. }
  748. }
  749. for (index = 0; index < tests.length; index++) {
  750. if (tests[index].anchor && tests[index].anchor === query || tests[index].title === query) {
  751. itemClick(tests[index])();
  752. return;
  753. }
  754. }
  755. for (index = 0; index < oculusTests.length; index++) {
  756. if (oculusTests[index].anchor && oculusTests[index].anchor === query || oculusTests[index].title === query) {
  757. itemClick(oculusTests[index])();
  758. return;
  759. }
  760. }
  761. }
  762. }
  763. };