index.js 17 KB

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