index.js 31 KB

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