index.js 18 KB

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