index.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. var onload = function () {
  2. var canvas = document.getElementById("renderCanvas");
  3. // Demos
  4. var demos = [
  5. { title: "HEART", scene: "heart", screenshot: "heart.jpg", size: "14 MB", big:true },
  6. { title: "ESPILIT", scene: "Espilit", screenshot: "espilit.jpg", size: "50 MB" },
  7. { title: "WINDOWS CAFE", scene: "WCafe", screenshot: "wcafe.jpg", size: "28 MB" },
  8. {
  9. title: "FLAT 2009", scene: "Flat2009", screenshot: "flat2009.jpg", size: "44 MB", onload: function () {
  10. var ecran = scene.getMeshByName("Ecran");
  11. ecran.material.diffuseTexture = new BABYLON.VideoTexture("video", ["Scenes/Flat2009/babylonjs.mp4", "Scenes/Flat2009/babylonjs.webm"], 256, scene, true);
  12. }
  13. },
  14. { title: "THE CAR", scene: "theCar", screenshot: "thecar.jpg", size: "100 MB" },
  15. { title: "VIPER", scene: "Viper", screenshot: "viper.jpg", size: "18 MB" },
  16. { title: "SPACESHIP", scene: "spaceship", screenshot: "spaceship.jpg", size: "1 MB" },
  17. { title: "OMEGA CRUSHER", scene: "SpaceDek", screenshot: "omegacrusher.jpg", size: "10 MB" }];
  18. var tests = [
  19. { title: "TEST SCENE #1", id: 0, screenshot: "testscene.jpg", size: "10 MB" },
  20. { title: "TEST LIGHTS", id: 1, screenshot: "testlight.jpg", size: "0.1 MB" },
  21. { title: "TEST BUMP", id: 2, screenshot: "bump.jpg", size: "0.1 MB" },
  22. { title: "TEST FOG", id: 3, screenshot: "fog.jpg", size: "0.1 MB" },
  23. { title: "TEST MULTIMATERIAL", id: 4, screenshot: "multimat.jpg", size: "0.1 MB" },
  24. { title: "TEST BLENDER", scene: "blender", screenshot: "blender.jpg", size: "0.2 MB" }
  25. ];
  26. // UI
  27. var opacityMask = document.getElementById("opacityMask");
  28. var menuPanel = document.getElementById("screen1");
  29. var items = document.getElementById("items");
  30. var testItems = document.getElementById("testItems");
  31. var renderZone = document.getElementById("renderZone");
  32. var controlPanel = document.getElementById("controlPanel");
  33. var wireframe = document.getElementById("wireframe");
  34. var divFps = document.getElementById("fps");
  35. var stats = document.getElementById("stats");
  36. var enableStats = document.getElementById("enableStats");
  37. var loadingBack = document.getElementById("loadingBack");
  38. var loadingText = document.getElementById("loadingText");
  39. var hardwareScalingLevel = document.getElementById("hardwareScalingLevel");
  40. var collisions = document.getElementById("collisions");
  41. var status = document.getElementById("status");
  42. var fullscreen = document.getElementById("fullscreen");
  43. var touchCamera = document.getElementById("touchCamera");
  44. var itemClick = function (demo) {
  45. return function () {
  46. // Check support
  47. if (!BABYLON.Engine.isSupported()) {
  48. document.getElementById("notSupported").className = "";
  49. opacityMask.className = "";
  50. } else {
  51. loadScene(demo.id !== undefined ? demo.id : demo.scene, function () {
  52. if (demo.collisions !== undefined) {
  53. scene.collisionsEnabled = demo.collisions;
  54. }
  55. if (demo.onload) {
  56. demo.onload();
  57. }
  58. });
  59. };
  60. };
  61. };
  62. var createItem = function (item, root) {
  63. var span = document.createElement("span");
  64. var img = document.createElement("img");
  65. var div = document.createElement("div");
  66. var label2 = document.createElement("label");
  67. if (item.big) {
  68. span.className = "big-item";
  69. var newImg = document.createElement("img");
  70. var newText = document.createElement("div");
  71. newImg.id = "newImg";
  72. newImg.src = "Assets/SpotLast.png";
  73. newText.innerHTML = "LAST<br>UPDATE";
  74. newText.id = "newText";
  75. span.appendChild(newImg);
  76. span.appendChild(newText);
  77. } else {
  78. span.className = "item";
  79. }
  80. img.className = "item-image";
  81. img.src = "Screenshots/" + item.screenshot;
  82. span.appendChild(img);
  83. div.className = "item-text";
  84. div.innerHTML = item.title;
  85. span.appendChild(div);
  86. label2.className = "item-text-right";
  87. label2.innerHTML = item.size;
  88. span.appendChild(label2);
  89. span.onclick = itemClick(item);
  90. root.appendChild(span);
  91. };
  92. // Demos
  93. for (var index = 0; index < demos.length; index++) {
  94. var demo = demos[index];
  95. createItem(demo, items);
  96. }
  97. // Tests
  98. for (var index = 0; index < tests.length; index++) {
  99. var test = tests[index];
  100. createItem(test, testItems);
  101. }
  102. // Go Back
  103. var goBack = function () {
  104. if (scene) {
  105. scene.dispose();
  106. scene = null;
  107. }
  108. menuPanel.className = "";
  109. renderZone.className = "movedRight";
  110. };
  111. // History
  112. if (window.onpopstate !== undefined) {
  113. window.onpopstate = function () {
  114. goBack();
  115. };
  116. }
  117. // Babylon
  118. var engine = new BABYLON.Engine(canvas, true);
  119. var scene;
  120. var restoreUI = function () {
  121. loadingBack.className = "loadingBack";
  122. loadingText.className = "loadingText";
  123. menuPanel.className = "movedLeft";
  124. renderZone.className = "";
  125. opacityMask.className = "hidden";
  126. };
  127. var loadScene = function (name, then) {
  128. // Cleaning
  129. if (scene) {
  130. scene.dispose();
  131. scene = null;
  132. }
  133. // History
  134. if (history.pushState) {
  135. history.pushState({}, name, "index.html");
  136. }
  137. // Loading
  138. var importScene = function () {
  139. loadingBack.removeEventListener("transitionend", importScene);
  140. loadingBack.removeEventListener("webkitTransitionend", importScene);
  141. engine.resize();
  142. if (typeof name == "number") {
  143. var newScene;
  144. switch (name) {
  145. case 0:
  146. newScene = CreateTestScene(engine);
  147. break;
  148. case 1:
  149. newScene = CreateLightsTestScene(engine);
  150. break;
  151. case 2:
  152. newScene = CreateBumpScene(engine);
  153. break;
  154. case 3:
  155. newScene = CreateFogScene(engine);
  156. break;
  157. case 4:
  158. newScene = CreateMultiMaterialScene(engine);
  159. break;
  160. }
  161. newScene.activeCamera.attachControl(canvas);
  162. scene = newScene;
  163. if (then) {
  164. then();
  165. }
  166. // UI
  167. restoreUI();
  168. return;
  169. }
  170. BABYLON.SceneLoader.Load("Scenes/" + name + "/", name + ".babylon", engine, function (newScene) {
  171. scene = newScene;
  172. loadingText.innerHTML = "Streaming textures...";
  173. scene.executeWhenReady(function () {
  174. if (scene.activeCamera) {
  175. scene.activeCamera.attachControl(canvas);
  176. if (newScene.activeCamera.keysUp) {
  177. newScene.activeCamera.keysUp.push(90); // Z
  178. newScene.activeCamera.keysDown.push(83); // S
  179. newScene.activeCamera.keysLeft.push(65); // A
  180. newScene.activeCamera.keysRight.push(69); // E
  181. }
  182. }
  183. if (then) {
  184. then();
  185. }
  186. // UI
  187. restoreUI();
  188. });
  189. }, function (evt) {
  190. loadingText.innerHTML = "Loading, please wait..." + (evt.loaded * 100 / evt.total).toFixed() + "%";
  191. });
  192. };
  193. loadingBack.addEventListener("transitionend", importScene);
  194. loadingBack.addEventListener("webkitTransitionend", importScene);
  195. loadingBack.className = "";
  196. loadingText.className = "";
  197. opacityMask.className = "";
  198. loadingText.innerHTML = "Loading, please wait...";
  199. // Render loop
  200. var renderFunction = function () {
  201. // Fps
  202. divFps.innerHTML = BABYLON.Tools.GetFps().toFixed() + " fps";
  203. // Render scene
  204. if (scene) {
  205. scene.render();
  206. // Stats
  207. if (enableStats.checked) {
  208. stats.innerHTML = "Total vertices: " + scene.getTotalVertices() + "<br>"
  209. + "Active vertices: " + scene.getActiveVertices() + "<br>"
  210. + "Active particles: " + scene.getActiveParticles() + "<br><br><br>"
  211. + "Frame duration: " + scene.getLastFrameDuration() + " ms<br><br>"
  212. + "<i>Evaluate Active Meshes duration:</i> " + scene.getEvaluateActiveMeshesDuration() + " ms<br>"
  213. + "<i>Render Targets duration:</i> " + scene.getRenderTargetsDuration() + " ms<br>"
  214. + "<i>Particles duration:</i> " + scene.getParticlesDuration() + " ms<br>"
  215. + "<i>Sprites duration:</i> " + scene.getSpritesDuration() + " ms<br>"
  216. + "<i>Render duration:</i> " + scene.getRenderDuration() + " ms";
  217. }
  218. }
  219. };
  220. // Launch render loop
  221. engine.runRenderLoop(renderFunction);
  222. // Resize
  223. window.addEventListener("resize", function () {
  224. engine.resize();
  225. });
  226. // Caps
  227. var caps = engine.getCaps();
  228. document.getElementById("extensions").innerHTML =
  229. "Max textures image units: <b>" + caps.maxTexturesImageUnits + "</b><br>" +
  230. "Max texture size: <b>" + caps.maxTextureSize + "</b><br>" +
  231. "Max cubemap texture size: <b>" + caps.maxCubemapTextureSize + "</b><br>" +
  232. "Max render texture size: <b>" + caps.maxRenderTextureSize + "</b><br>";
  233. }
  234. // UI
  235. var panelIsClosed = true;
  236. var aboutIsClosed = true;
  237. document.getElementById("clickableTag").addEventListener("click", function () {
  238. if (panelIsClosed) {
  239. panelIsClosed = false;
  240. controlPanel.style.webkitTransform = "translateY(0px)";
  241. controlPanel.style.transform = "translateY(0px)";
  242. } else {
  243. panelIsClosed = true;
  244. controlPanel.style.webkitTransform = "translateY(250px)";
  245. controlPanel.style.transform = "translateY(250px)";
  246. }
  247. });
  248. document.getElementById("aboutLink").addEventListener("click", function () {
  249. if (aboutIsClosed) {
  250. aboutIsClosed = false;
  251. aboutPanel.style.webkitTransform = "translateX(0px)";
  252. aboutPanel.style.transform = "translateX(0px)";
  253. } else {
  254. aboutIsClosed = true;
  255. aboutPanel.style.webkitTransform = "translateX(-500px)";
  256. aboutPanel.style.transform = "translateX(-500px)";
  257. }
  258. });
  259. document.getElementById("notSupported").addEventListener("click", function () {
  260. document.getElementById("notSupported").className = "hidden";
  261. opacityMask.className = "hidden";
  262. });
  263. opacityMask.addEventListener("click", function () {
  264. document.getElementById("notSupported").className = "hidden";
  265. opacityMask.className = "hidden";
  266. });
  267. document.getElementById("aboutPanel").addEventListener("click", function (evt) {
  268. evt.cancelBubble = true;
  269. });
  270. document.getElementById("menuPanel").addEventListener("click", function (evt) {
  271. if (!aboutIsClosed) {
  272. aboutIsClosed = true;
  273. aboutPanel.style.webkitTransform = "translateX(-500px)";
  274. aboutPanel.style.transform = "translateX(-500px)";
  275. }
  276. });
  277. canvas.addEventListener("click", function (evt) {
  278. if (!panelIsClosed) {
  279. panelIsClosed = true;
  280. controlPanel.style.webkitTransform = "translateY(250px)";
  281. controlPanel.style.transform = "translateY(250px)";
  282. }
  283. if (evt.ctrlKey) {
  284. if (!scene)
  285. return;
  286. var pickResult = scene.pick(evt.clientX, evt.clientY);
  287. if (pickResult.hit) {
  288. status.innerHTML = "Selected object: " + pickResult.pickedMesh.name;
  289. // Animations
  290. scene.beginAnimation(pickResult.pickedMesh, 0, 100, true, 1.0);
  291. var material = pickResult.pickedMesh.material;
  292. if (material) {
  293. scene.beginAnimation(material, 0, 100, true, 1.0);
  294. }
  295. // Emit particles
  296. var particleSystem = new BABYLON.ParticleSystem("particles", 400, scene);
  297. particleSystem.particleTexture = new BABYLON.Texture("Assets/Flare.png", scene);
  298. particleSystem.minAngularSpeed = -0.5;
  299. particleSystem.maxAngularSpeed = 0.5;
  300. particleSystem.minSize = 0.1;
  301. particleSystem.maxSize = 0.5;
  302. particleSystem.minLifeTime = 0.5;
  303. particleSystem.maxLifeTime = 2.0;
  304. particleSystem.minEmitPower = 0.5;
  305. particleSystem.maxEmitPower = 1.0;
  306. particleSystem.emitter = pickResult.pickedPoint;
  307. particleSystem.emitRate = 400;
  308. particleSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;
  309. particleSystem.minEmitBox = new BABYLON.Vector3(0, 0, 0);
  310. particleSystem.maxEmitBox = new BABYLON.Vector3(0, 0, 0);
  311. particleSystem.direction1 = new BABYLON.Vector3(-1, -1, -1);
  312. particleSystem.direction2 = new BABYLON.Vector3(1, 1, 1);
  313. particleSystem.color1 = new BABYLON.Color4(1, 0, 0, 1);
  314. particleSystem.color2 = new BABYLON.Color4(0, 1, 1, 1);
  315. particleSystem.gravity = new BABYLON.Vector3(0, -5, 0);
  316. particleSystem.disposeOnStop = true;
  317. particleSystem.targetStopDuration = 0.1;
  318. particleSystem.start();
  319. } else {
  320. status.innerHTML = "";
  321. }
  322. }
  323. });
  324. wireframe.addEventListener("change", function () {
  325. if (engine) {
  326. engine.forceWireframe = wireframe.checked;
  327. }
  328. });
  329. enableStats.addEventListener("change", function () {
  330. stats.className = enableStats.checked ? "" : "hidden";
  331. });
  332. fullscreen.addEventListener("click", function () {
  333. if (engine) {
  334. engine.switchFullscreen(document.getElementById("rootDiv"));
  335. }
  336. });
  337. touchCamera.addEventListener("click", function () {
  338. if (!scene) {
  339. return;
  340. }
  341. var camera = new BABYLON.TouchCamera("touchCamera", scene.activeCamera.position, scene);
  342. camera.rotation = scene.activeCamera.rotation.clone();
  343. camera.fov = scene.activeCamera.fov;
  344. camera.minZ = scene.activeCamera.minZ;
  345. camera.maxZ = scene.activeCamera.maxZ;
  346. camera.ellipsoid = scene.activeCamera.ellipsoid.clone();
  347. camera.checkCollisions = scene.activeCamera.checkCollisions;
  348. camera.applyGravity = scene.activeCamera.applyGravity;
  349. camera.speed = scene.activeCamera.speed;
  350. scene.activeCamera.detachControl(canvas);
  351. scene.activeCamera = camera;
  352. scene.activeCamera.attachControl(canvas);
  353. });
  354. hardwareScalingLevel.addEventListener("change", function () {
  355. if (!engine)
  356. return;
  357. engine.setHardwareScalingLevel(hardwareScalingLevel.selectedIndex + 1);
  358. });
  359. collisions.addEventListener("change", function () {
  360. if (scene) {
  361. scene.collisionsEnabled = collisions.checked;
  362. }
  363. });
  364. // Query string
  365. var queryString = window.location.search;
  366. if (queryString) {
  367. var index = parseInt(queryString.replace("?", ""));
  368. if (index >= demos.length) {
  369. itemClick(tests[index - demos.length])();
  370. } else {
  371. itemClick(demos[index])();
  372. }
  373. }
  374. };