frame.js 6.0 KB

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