index.js 17 KB

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