shell.html 10 KB

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