frame.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. 
  2. (function() {
  3. var snippetUrl = "https://snippet.babylonjs.com";
  4. var engine;
  5. var fpsLabel = document.getElementById("fpsLabel");
  6. var refreshAnchor = document.getElementById("refresh");
  7. var editAnchor = document.getElementById("edit");
  8. if (location.href.toLowerCase().indexOf("noui") > -1) {
  9. fpsLabel.style.visibility = "hidden";
  10. fpsLabel.style.display = "none";
  11. refreshAnchor.style.visibility = "hidden";
  12. refreshAnchor.style.display = "none";
  13. editAnchor.style.visibility = "hidden";
  14. editAnchor.style.display = "none";
  15. }
  16. BABYLON.Engine.ShadersRepository = "/src/Shaders/";
  17. var showError = function(error) {
  18. utils.showError(error, null);
  19. };
  20. compileAndRun = function(code) {
  21. try {
  22. if (!BABYLON.Engine.isSupported()) {
  23. showError("Your browser does not support WebGL");
  24. return;
  25. }
  26. if (engine) {
  27. engine.dispose();
  28. engine = null;
  29. }
  30. var canvas = document.getElementById("renderCanvas");
  31. var createEngineFunction = "createDefaultEngine";
  32. var createSceneFunction;
  33. var createDefaultEngine = function() {
  34. return new BABYLON.Engine(canvas, true, { stencil: true });
  35. }
  36. var scene;
  37. if (code.indexOf("createEngine") !== -1) {
  38. createEngineFunction = "createEngine";
  39. }
  40. if (code.indexOf("delayCreateScene") !== -1) { // createScene
  41. createSceneFunction = "delayCreateScene";
  42. checkCamera = false;
  43. } else if (code.indexOf("createScene") !== -1) { // createScene
  44. createSceneFunction = "createScene";
  45. } else if (code.indexOf("CreateScene") !== -1) { // CreateScene
  46. createSceneFunction = "CreateScene";
  47. } else if (code.indexOf("createscene") !== -1) { // createscene
  48. createSceneFunction = "createscene";
  49. }
  50. if (!createSceneFunction) {
  51. // just pasted code.
  52. engine = createDefaultEngine();
  53. scene = new BABYLON.Scene(engine);
  54. eval("runScript = function(scene, canvas) {" + code + "}");
  55. runScript(scene, canvas);
  56. zipCode = "var scene = new BABYLON.Scene(engine);\r\n\r\n" + code;
  57. } else {
  58. //execute the code
  59. eval(code);
  60. //create engine
  61. eval("engine = " + createEngineFunction + "()");
  62. if (!engine) {
  63. showError("createEngine function must return an engine.", null);
  64. return;
  65. }
  66. //create scene
  67. eval("scene = " + createSceneFunction + "()");
  68. if (!scene) {
  69. showError(createSceneFunction + " function must return a scene.", null);
  70. return;
  71. }
  72. // update the scene code for the zip file
  73. zipCode = code + "\r\n\r\nvar scene = " + createSceneFunction + "()";
  74. }
  75. BABYLON.Camera.ForceAttachControlToAlwaysPreventDefault = true;
  76. engine.runRenderLoop(function() {
  77. if (engine.scenes.length === 0) {
  78. return;
  79. }
  80. if (canvas.width !== canvas.clientWidth) {
  81. engine.resize();
  82. }
  83. var scene = engine.scenes[0];
  84. if (scene.activeCamera || scene.activeCameras.length > 0) {
  85. scene.render();
  86. }
  87. if (fpsLabel) {
  88. fpsLabel.innerHTML = engine.getFps().toFixed() + " fps";
  89. }
  90. });
  91. } catch (e) {
  92. // showError(e.message);
  93. }
  94. };
  95. window.addEventListener("resize", function() {
  96. if (engine) {
  97. engine.resize();
  98. }
  99. });
  100. // UI
  101. var cleanHash = function() {
  102. var splits = decodeURIComponent(location.hash.substr(1)).split("#");
  103. if (splits.length > 2) {
  104. splits.splice(2, splits.length - 2);
  105. }
  106. location.hash = splits.join("#");
  107. };
  108. var checkHash = function() {
  109. if (location.hash) {
  110. cleanHash();
  111. try {
  112. var xmlHttp = new XMLHttpRequest();
  113. xmlHttp.onreadystatechange = function() {
  114. if (xmlHttp.readyState === 4) {
  115. if (xmlHttp.status === 200) {
  116. var snippetCode = JSON.parse(JSON.parse(xmlHttp.responseText).jsonPayload).code;
  117. compileAndRun(snippetCode);
  118. var refresh = document.getElementById("refresh");
  119. if (refresh) {
  120. refresh.addEventListener("click", function() {
  121. compileAndRun(snippetCode);
  122. });
  123. }
  124. }
  125. }
  126. };
  127. var hash = location.hash.substr(1);
  128. currentSnippetToken = hash.split("#")[0];
  129. if (!hash.split("#")[1]) hash += "#0";
  130. xmlHttp.open("GET", snippetUrl + "/" + hash.replace("#", "/"));
  131. xmlHttp.send();
  132. var edit = document.getElementById("edit");
  133. if (edit) {
  134. edit.href = "//www.babylonjs-playground.com/#" + hash;
  135. }
  136. } catch (e) {
  137. }
  138. }
  139. };
  140. checkHash();
  141. })();