index.js 19 KB

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