babylon.loadingScreen.ts 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. module BABYLON {
  2. export interface ILoadingScreen {
  3. displayLoadingUI: () => void;
  4. hideLoadingUI: () => void;
  5. //default loader support
  6. loadingUIBackgroundColor: string;
  7. loadingUIText: string;
  8. }
  9. export class DefaultLoadingScreen implements ILoadingScreen {
  10. private _loadingDiv: HTMLDivElement;
  11. private _loadingTextDiv: HTMLDivElement;
  12. constructor(private _renderingCanvas: HTMLCanvasElement, private _loadingText = "", private _loadingDivBackgroundColor = "black") {
  13. }
  14. public displayLoadingUI(): void {
  15. if (this._loadingDiv) {
  16. // Do not add a loading screen if there is already one
  17. return;
  18. }
  19. this._loadingDiv = document.createElement("div");
  20. this._loadingDiv.id = "babylonjsLoadingDiv";
  21. this._loadingDiv.style.opacity = "0";
  22. this._loadingDiv.style.transition = "opacity 1.5s ease";
  23. // Loading text
  24. this._loadingTextDiv = document.createElement("div");
  25. this._loadingTextDiv.style.position = "absolute";
  26. this._loadingTextDiv.style.left = "0";
  27. this._loadingTextDiv.style.top = "50%";
  28. this._loadingTextDiv.style.marginTop = "80px";
  29. this._loadingTextDiv.style.width = "100%";
  30. this._loadingTextDiv.style.height = "20px";
  31. this._loadingTextDiv.style.fontFamily = "Arial";
  32. this._loadingTextDiv.style.fontSize = "14px";
  33. this._loadingTextDiv.style.color = "white";
  34. this._loadingTextDiv.style.textAlign = "center";
  35. this._loadingTextDiv.innerHTML = "Loading";
  36. this._loadingDiv.appendChild(this._loadingTextDiv);
  37. //set the predefined text
  38. this._loadingTextDiv.innerHTML = this._loadingText;
  39. // Loading img
  40. var imgBack = new Image();
  41. imgBack.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuM4zml1AAAARbSURBVHhe7Z09aFNRFMc716kuLrq4FdyLq4Wi4CAoRQcR0UJBUBdRiuLSIYMo6CA4FF2sgw6CFAdFUOpSQYcWO4hD26UQCfXrIQrx/JJzw1OSWq3NPeL/B4Fy+0jg/HO+7j3vpUcI8b/Q39+/49ihfWdPHT94Yf/e3Se3bd263f8lus218TPn6vV6Ya8Wi/MzNRNmj18iusX9W1evmP1/EKNEIVG6CMbG6E3bt+fT++pHha8NoHdT72bLE8NDg7tGU64gLLndV4Wc4m8j/pS+vr4tGB/DT16v3Fyr8dvBe/jbit8BL0AES9LX1iPAz+BR/hFiLVCynj95dPzNy6fv3IZ/k4L3948Sq7FzYGBg4vLFGxitabuOFCbWNKGrMnbiUuo18KaV6tIHv6YtvL9/nOgE31jCktmrY7k6+/zhE4yP4Vf7hiNqh/BWWEl8mzDol4p22Lf7cIdvdUMEvv0Y2S9fE5S1hLzpqTsPkiep//gFGPnR3Yl7GL5p/xYFBrTwM+iXio3GqpwDGL5p/xYNIX7XG8Q6IJRgdIzf1KBBgafII7oMidhyQtVFaMA2Bt7il4huQRhaXphbcR2g4RXqBzKAGHiCCwGFVUAj/m/RTRDj29cvn10I0PZ3LghH5f4CL1EFlQmqqXK3jDDKFxmhQ3Yt6oQseUZGKmMnTpsOqc8o1F9kBOMjQlOLeqEeIyOc6JV6jYLJD/+XyIFvnzdgl9aXRQ5I2qZDK1SpospMqaoqON/wZZGDciLnMMiXRS7IF4hhqMTNTdk7CFu+LHLhR7BQqBvPDJUUQqCGvCMATHUgBmhWNgApmdOda9YpM+VwRYfuyyIXDK8hBlilNerLIheMZCKGwlUAyru6GlwOgPUbRxADdJ9FAChxXY864viyyEXqPxhc0M2TAfAbatSdRyHtXymhByEdRnE3ky+JnHAIhSA0h74kckETmHoQbSgGwJrCIRMEPSRIBCRIMAhZaYhaggQhJXUJEoRU9mofKwh+F22dLRRfEjlJM7w6KQwCoQpBOKTyJZETjmwRxKqtGV8SOSkNOGjKPQppBEgDDkFgpxdBVGkFgaYQQXRIFQSObk0P5ZFIpAZRHXsQ0r0hCluBWKkuvVbYCkQaCdL5ehBScudJP4yY+rLISdps1NBDEJKXMMmoSfggWC4ZQRR17oFYXph7hSiquIKQ+hJGTX1J5MYSPD/GVdNzsgLBwZVCVyAQAkF0ohiI/c1fS6tNXq9UfEnkhudmIQolsS+J3Hh/UtNDzQLhj42VKJFInqLwFYiUU5ToA+HdfI0JevUpQUAIn+vSz2lHIuUV/dJOIHhOY/IWVWGBIHQtzs88s9zyWBuTgcBLzGOmeNnfF/QslSDgMeQW85i3DOQxuipxAkCyZ8SIm4Omp+7MMlCB59j6sKZcMoM4iIEoeI2J9AKxrFobZx0v4vYInuHFS4J1GQRCAGaLEYQXfyMML5XSQgghhBBCCCH+cXp6vgNhKpSKX/XdOAAAAABJRU5ErkJggg==";
  42. imgBack.style.position = "absolute";
  43. imgBack.style.left = "50%";
  44. imgBack.style.top = "50%";
  45. imgBack.style.marginLeft = "-50px";
  46. imgBack.style.marginTop = "-50px";
  47. imgBack.style.transition = "transform 1.0s ease";
  48. imgBack.style.webkitTransition = "-webkit-transform 1.0s ease";
  49. var deg = 360;
  50. var onTransitionEnd = () => {
  51. deg += 360;
  52. imgBack.style.transform = "rotateZ(" + deg + "deg)";
  53. imgBack.style.webkitTransform = "rotateZ(" + deg + "deg)";
  54. }
  55. imgBack.addEventListener("transitionend", onTransitionEnd);
  56. imgBack.addEventListener("webkitTransitionEnd", onTransitionEnd);
  57. this._loadingDiv.appendChild(imgBack);
  58. // front image
  59. var imgFront = new Image();
  60. imgFront.src = "data:image/png;base64,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";
  61. imgFront.style.position = "absolute";
  62. imgFront.style.left = "50%";
  63. imgFront.style.top = "50%";
  64. imgFront.style.marginLeft = "-50px";
  65. imgFront.style.marginTop = "-50px";
  66. this._loadingDiv.appendChild(imgFront);
  67. this._resizeLoadingUI();
  68. window.addEventListener("resize", this._resizeLoadingUI);
  69. this._loadingDiv.style.backgroundColor = this._loadingDivBackgroundColor;
  70. document.body.appendChild(this._loadingDiv);
  71. setTimeout(() => {
  72. this._loadingDiv.style.opacity = "1";
  73. imgBack.style.transform = "rotateZ(360deg)";
  74. imgBack.style.webkitTransform = "rotateZ(360deg)";
  75. }, 0);
  76. }
  77. public hideLoadingUI(): void {
  78. if (!this._loadingDiv) {
  79. return;
  80. }
  81. var onTransitionEnd = () => {
  82. if (!this._loadingDiv) {
  83. return;
  84. }
  85. document.body.removeChild(this._loadingDiv);
  86. window.removeEventListener("resize", this._resizeLoadingUI);
  87. this._loadingDiv = null;
  88. }
  89. this._loadingDiv.style.opacity = "0";
  90. this._loadingDiv.addEventListener("transitionend", onTransitionEnd);
  91. }
  92. public set loadingUIText(text: string) {
  93. this._loadingText = text;
  94. if (this._loadingTextDiv) {
  95. this._loadingTextDiv.innerHTML = this._loadingText;
  96. }
  97. }
  98. public get loadingUIBackgroundColor(): string {
  99. return this._loadingDivBackgroundColor;
  100. }
  101. public set loadingUIBackgroundColor(color: string) {
  102. this._loadingDivBackgroundColor = color;
  103. if (!this._loadingDiv) {
  104. return;
  105. }
  106. this._loadingDiv.style.backgroundColor = this._loadingDivBackgroundColor;
  107. }
  108. // Resize
  109. private _resizeLoadingUI = () => {
  110. var canvasRect = this._renderingCanvas.getBoundingClientRect();
  111. this._loadingDiv.style.position = "absolute";
  112. this._loadingDiv.style.left = canvasRect.left + "px";
  113. this._loadingDiv.style.top = canvasRect.top + "px";
  114. this._loadingDiv.style.width = canvasRect.width + "px";
  115. this._loadingDiv.style.height = canvasRect.height + "px";
  116. }
  117. }
  118. }