shell.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <!doctype html>
  2. <html lang="en-us">
  3. <head>
  4. <meta charset=utf-8>
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  7. <title>Urho3D</title>
  8. <style>
  9. body, html {
  10. padding: 0;
  11. margin: 0;
  12. margin: 0;
  13. overflow: hidden;
  14. }
  15. .emscripten {
  16. padding-right: 0;
  17. margin-left: auto;
  18. margin-right: auto;
  19. display: block;
  20. }
  21. div.emscripten {
  22. text-align: center;
  23. }
  24. #fullscreen-button {
  25. position: absolute;
  26. width: 2em;
  27. height: 2em;
  28. left: 50%;
  29. top: 4px;
  30. -moz-transform: translateX(-50%);
  31. -webkit-transform: translateX(-50%);
  32. transform: translateX(-50%);
  33. stroke: #999999;
  34. stroke-width: 10px;
  35. }
  36. #fullscreen-button:hover {
  37. fill: #999999;
  38. cursor: pointer;
  39. }
  40. #canvas {
  41. position: absolute;
  42. top: 0;
  43. left: 0;
  44. width: 100%;
  45. height: 100%;
  46. background-color: #000;
  47. border: 1px solid #000000;
  48. border: none;
  49. cursor: default !important;
  50. }
  51. .centered {
  52. position: absolute;
  53. top: 50%;
  54. left: 50%;
  55. -moz-transform: translateX(-50%) translateY(-50%);
  56. -webkit-transform: translateX(-50%) translateY(-50%);
  57. transform: translateX(-50%) translateY(-50%);
  58. }
  59. </style>
  60. </head>
  61. <body>
  62. <div class="centered">
  63. <div class="emscripten" id="status">Downloading...</div>
  64. <progress hidden id="progress" max=100 value=10></progress>
  65. </div>
  66. <canvas id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1 width=100 height=100 style="display: none;"></canvas>
  67. <div id="fullscreen-button" onclick="enterFullscreen()" style="display: none;">
  68. <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
  69. viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
  70. <path d="M93.1,139.6l46.5-46.5L93.1,46.5L139.6,0H0v139.6l46.5-46.5L93.1,139.6z M93.1,372.4l-46.5,46.5L0,372.4V512h139.6
  71. l-46.5-46.5l46.5-46.5L93.1,372.4z M372.4,139.6H139.6v232.7h232.7V139.6z M325.8,325.8H186.2V186.2h139.6V325.8z M372.4,0
  72. l46.5,46.5l-46.5,46.5l46.5,46.5l46.5-46.5l46.5,46.5V0H372.4z M418.9,372.4l-46.5,46.5l46.5,46.5L372.4,512H512V372.4l-46.5,46.5
  73. L418.9,372.4z"/>
  74. </svg>
  75. </div>
  76. <script>
  77. var canvasElement = document.getElementById('canvas');
  78. var devicePixelRatio = window.devicePixelRatio || 1;
  79. var canvasWidth = 0;
  80. var canvasHeight = 0;
  81. // Detect the visible width and height of the window
  82. function calculateCanvasSize() {
  83. canvasWidth = parseInt(window.getComputedStyle(canvasElement).getPropertyValue('width')) * devicePixelRatio;
  84. canvasHeight = parseInt(window.getComputedStyle(canvasElement).getPropertyValue('height')) * devicePixelRatio;
  85. }
  86. calculateCanvasSize();
  87. // Detect fullscreen change and resize canvas resolution accordingly
  88. function viewportResizeHandler() {
  89. if (document.hidden) {
  90. return;
  91. }
  92. calculateCanvasSize();
  93. if (Module['JSCanvasSize']) {
  94. if (isFullScreen()) {
  95. Module.JSCanvasSize(screen.width * devicePixelRatio, screen.height * devicePixelRatio, true, devicePixelRatio);
  96. } else {
  97. Module.JSCanvasSize(canvasWidth, canvasHeight, false, devicePixelRatio);
  98. }
  99. }
  100. }
  101. function visibilityChanged() {
  102. if (document.hidden) {
  103. return;
  104. }
  105. // Overwrite some emscripten functions that break the input
  106. __registerFocusEventCallback = function() {
  107. if (!JSEvents.focusEvent) JSEvents.focusEvent = _malloc(256);
  108. };
  109. __registerFullscreenChangeEventCallback = function() {
  110. if (!JSEvents.fullscreenChangeEvent) JSEvents.fullscreenChangeEvent = _malloc(280);
  111. };
  112. setTimeout(() => {
  113. viewportResizeHandler();
  114. }, 100);
  115. }
  116. document.addEventListener('fullscreenchange', viewportResizeHandler, false);
  117. document.addEventListener('mozfullscreenchange', viewportResizeHandler, false);
  118. document.addEventListener('webkitfullscreenchange', viewportResizeHandler, false);
  119. document.addEventListener('MSFullscreenChange', viewportResizeHandler, false);
  120. document.addEventListener('visibilitychange', visibilityChanged, false);
  121. document.addEventListener('msvisibilitychange', visibilityChanged, false);
  122. document.addEventListener('webkitvisibilitychange', visibilityChanged, false);
  123. var resizeTimeout = false;
  124. // When window size has changed, resize the canvas accordingly
  125. window.addEventListener('resize', function(evt) {
  126. // resize event is called before the resizing has finished, we must wait a bit so the new calculations use the new viewport size
  127. if (resizeTimeout) {
  128. clearTimeout(resizeTimeout);
  129. }
  130. resizeTimeout = setTimeout(() => {
  131. viewportResizeHandler(evt);
  132. }, 1000);
  133. });
  134. // Enter the fullscreen mode
  135. function enterFullscreen(show) {
  136. if (show === undefined) show = !isFullScreen();
  137. if (show) {
  138. if (canvasElement.requestFullscreen) canvasElement.requestFullscreen();
  139. else if (canvasElement.webkitRequestFullScreen) canvasElement.webkitRequestFullScreen();
  140. else if (canvasElement.mozRequestFullScreen) canvasElement.mozRequestFullScreen();
  141. else if (canvasElement.msRequestFullscreen) canvasElement.msRequestFullscreen();
  142. } else {
  143. if (document.exitFullscreen) document.exitFullscreen();
  144. else if (document.webkitExitFullscreen) document.webkitExitFullscreen();
  145. else if (document.mozCancelFullScreen) document.mozCancelFullScreen();
  146. else if (document.msExitFullscreen) document.msExitFullscreen();
  147. }
  148. }
  149. function isFullScreen() {
  150. return !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement);
  151. }
  152. // App is ready to launch, make canvas and fullscreen button visible
  153. function ready() {
  154. document.getElementById('canvas').style.display = 'block';
  155. document.getElementById('fullscreen-button').style.display = 'block';
  156. if (document.hidden) {
  157. return;
  158. }
  159. // Overwrite some emscripten functions that break the input
  160. __registerFocusEventCallback = function() {
  161. if (!JSEvents.focusEvent) JSEvents.focusEvent = _malloc(256);
  162. };
  163. __registerFullscreenChangeEventCallback = function() {
  164. if (!JSEvents.fullscreenChangeEvent) JSEvents.fullscreenChangeEvent = _malloc(280);
  165. };
  166. setTimeout(() => {
  167. viewportResizeHandler();
  168. }, 100);
  169. }
  170. var Module = {
  171. preRun: [],
  172. postRun: [],
  173. canvas: canvasElement,
  174. forcedAspectRatio: false,
  175. print: function (text) {
  176. console.log(text);
  177. },
  178. printErr: function(text) {
  179. console.error(text);
  180. },
  181. // Urho3D called method which tells the canvas the current renderer resolution, based on E_SCREENMODE event values
  182. SetRendererSize: function(width, height) {
  183. console.log('Engine renderer size changed to', width, height);
  184. calculateCanvasSize();
  185. if (document.hidden) {
  186. return;
  187. }
  188. var aspectRatio = width / height;
  189. canvasElement.width = width;
  190. canvasElement.height = height;
  191. // Compare calculated canvas resolution with the actual renderer resolution
  192. if (canvasWidth === width && canvasHeight === height) {
  193. return;
  194. }
  195. // Renderer resolution is wrong, update it with the calculated values
  196. console.log('Renderer and canvas resolution mismatch, updating renderer resolution width', this.canvas.width, 'to', width, 'and height', this.canvas.height, 'to', height);
  197. Module.JSCanvasSize(canvasWidth, canvasHeight, false, devicePixelRatio);
  198. },
  199. // Retrieve the current status of the application
  200. setStatus: function(text) {
  201. if (text === 'Running...') {
  202. ready();
  203. }
  204. if (Module.setStatus.interval) clearInterval(Module.setStatus.interval);
  205. var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
  206. var statusElement = document.getElementById('status');
  207. var progressElement = document.getElementById('progress');
  208. if (m) {
  209. text = m[1];
  210. progressElement.value = parseInt(m[2])*100;
  211. progressElement.max = parseInt(m[4])*100;
  212. progressElement.hidden = false;
  213. } else {
  214. progressElement.value = null;
  215. progressElement.max = null;
  216. progressElement.hidden = true;
  217. }
  218. statusElement.innerHTML = text;
  219. },
  220. totalDependencies: 0,
  221. monitorRunDependencies: function(left) {
  222. this.totalDependencies = Math.max(this.totalDependencies, left);
  223. Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
  224. },
  225. };
  226. Module.setStatus('Downloading...');
  227. </script>
  228. {{{ SCRIPT }}}
  229. </body>
  230. </html>