frame.js 6.0 KB

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