frame.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. (function () {
  2. var snippetUrl = "http://babylonjs-api.azurewebsites.net/api/snippet";
  3. var currentSnippetToken;
  4. var engine;
  5. var fpsLabel = document.getElementById("fpsLabel");
  6. var scripts;
  7. var zipCode;
  8. BABYLON.Engine.ShadersRepository = "/src/Shaders/";
  9. var loadScript = function (scriptURL, title) {
  10. var xhr = new XMLHttpRequest();
  11. xhr.open('GET', scriptURL, true);
  12. xhr.onreadystatechange = function () {
  13. if (xhr.readyState === 4) {
  14. if (xhr.status === 200) {
  15. blockEditorChange = true;
  16. jsEditor.setValue(xhr.responseText);
  17. jsEditor.setPosition({ lineNumber: 0, column: 0 });
  18. blockEditorChange = false;
  19. compileAndRun();
  20. document.getElementById("currentScript").innerHTML = title;
  21. currentSnippetToken = null;
  22. }
  23. }
  24. };
  25. xhr.send(null);
  26. };
  27. compileAndRun = function (code) {
  28. try {
  29. if (!BABYLON.Engine.isSupported()) {
  30. showError("Your browser does not support WebGL");
  31. return;
  32. }
  33. if (engine) {
  34. engine.dispose();
  35. engine = null;
  36. }
  37. var canvas = document.getElementById("renderCanvas");
  38. engine = new BABYLON.Engine(canvas, true);
  39. engine.renderEvenInBackground = false;
  40. BABYLON.Camera.ForceAttachControlToAlwaysPreventDefault = true;
  41. engine.runRenderLoop(function () {
  42. if (engine.scenes.length === 0) {
  43. return;
  44. }
  45. if (canvas.width !== canvas.clientWidth) {
  46. engine.resize();
  47. }
  48. var scene = engine.scenes[0];
  49. if (scene.activeCamera || scene.activeCameras.length > 0) {
  50. scene.render();
  51. }
  52. fpsLabel.innerHTML = engine.getFps().toFixed() + " fps";
  53. });
  54. var scene;
  55. if (code.indexOf("createScene") !== -1) { // createScene
  56. eval(code);
  57. scene = createScene();
  58. if (!scene) {
  59. showError("createScene function must return a scene.");
  60. return;
  61. }
  62. zipCode = code + "\r\n\r\nvar scene = createScene();";
  63. } else if (code.indexOf("CreateScene") !== -1) { // CreateScene
  64. eval(code);
  65. scene = CreateScene();
  66. if (!scene) {
  67. showError("CreateScene function must return a scene.");
  68. return;
  69. }
  70. zipCode = code + "\r\n\r\nvar scene = CreateScene();";
  71. } else if (code.indexOf("createscene") !== -1) { // createscene
  72. eval(code);
  73. scene = createscene();
  74. if (!scene) {
  75. showError("createscene function must return a scene.");
  76. return;
  77. }
  78. zipCode = code + "\r\n\r\nvar scene = createscene();";
  79. } else { // Direct code
  80. scene = new BABYLON.Scene(engine);
  81. eval("runScript = function(scene, canvas) {" + code + "}");
  82. runScript(scene, canvas);
  83. zipCode = "var scene = new BABYLON.Scene(engine);\r\n\r\n" + code;
  84. }
  85. } catch (e) {
  86. showError(e.message);
  87. }
  88. };
  89. window.addEventListener("resize", function () {
  90. if (engine) {
  91. engine.resize();
  92. }
  93. });
  94. // UI
  95. var cleanHash = function () {
  96. var splits = decodeURIComponent(location.hash.substr(1)).split("#");
  97. if (splits.length > 2) {
  98. splits.splice(2, splits.length - 2);
  99. }
  100. location.hash = splits.join("#");
  101. }
  102. var checkHash = function () {
  103. if (location.hash) {
  104. cleanHash();
  105. try {
  106. var xmlHttp = new XMLHttpRequest();
  107. xmlHttp.onreadystatechange = function () {
  108. if (xmlHttp.readyState === 4) {
  109. if (xmlHttp.status === 200) {
  110. var snippet = JSON.parse(xmlHttp.responseText);
  111. compileAndRun(snippet.code.toString());
  112. document.getElementById("refresh").addEventListener("click", function () {
  113. compileAndRun(snippet.code.toString());
  114. });
  115. }
  116. }
  117. }
  118. var hash = location.hash.substr(1);
  119. currentSnippetToken = hash.split("#")[0];
  120. xmlHttp.open("GET", snippetUrl + "/" + hash.replace("#", "/"));
  121. xmlHttp.send();
  122. document.getElementById("link").href = "http://www.babylonjs-playground.com/#" + hash;
  123. } catch (e) {
  124. }
  125. }
  126. }
  127. checkHash();
  128. })();