summaryrefslogtreecommitdiff
path: root/misc/dist
diff options
context:
space:
mode:
Diffstat (limited to 'misc/dist')
-rw-r--r--misc/dist/html/editor.html1456
-rw-r--r--misc/dist/html/full-size.html470
-rw-r--r--misc/dist/html/manifest.json2
-rw-r--r--misc/dist/html/offline-export.html71
-rw-r--r--misc/dist/html/offline.html74
-rw-r--r--misc/dist/icon_console.svg120
-rw-r--r--misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj3
-rw-r--r--misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist1
-rw-r--r--misc/dist/linux/godot.622
-rw-r--r--misc/dist/shell/_godot.zsh-completion14
-rw-r--r--misc/dist/shell/godot.bash-completion18
-rw-r--r--misc/dist/shell/godot.fish20
12 files changed, 1217 insertions, 1054 deletions
diff --git a/misc/dist/html/editor.html b/misc/dist/html/editor.html
index 7c44dd45a1..93afbf085d 100644
--- a/misc/dist/html/editor.html
+++ b/misc/dist/html/editor.html
@@ -1,757 +1,757 @@
<!DOCTYPE html>
-<html xmlns="https://www.w3.org/1999/xhtml" lang="en">
-<head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" />
- <meta name="author" content="Godot Engine" />
- <meta name="description" content="Use the Godot Engine editor directly in your web browser, without having to install anything." />
- <meta name="mobile-web-app-capable" content="yes" />
- <meta name="apple-mobile-web-app-capable" content="yes" />
- <meta name="application-name" content="Godot" />
- <meta name="apple-mobile-web-app-title" content="Godot" />
- <meta name="theme-color" content="#202531" />
- <meta name="msapplication-navbutton-color" content="#202531" />
- <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
- <meta name="msapplication-starturl" content="/latest" />
- <meta property="og:site_name" content="Godot Engine Web Editor" />
- <meta property="og:url" name="twitter:url" content="https://editor.godotengine.org/releases/latest/" />
- <meta property="og:title" name="twitter:title" content="Free and open source 2D and 3D game engine" />
- <meta property="og:description" name="twitter:description" content="Use the Godot Engine editor directly in your web browser, without having to install anything." />
- <meta property="og:image" name="twitter:image" content="https://godotengine.org/themes/godotengine/assets/og_image.png" />
- <meta property="og:type" content="website" />
- <meta name="twitter:card" content="summary" />
- <link id="-gd-engine-icon" rel="icon" type="image/png" href="favicon.png" />
- <link rel="apple-touch-icon" type="image/png" href="favicon.png" />
- <link rel="manifest" href="manifest.json" />
- <title>Godot Engine Web Editor (@GODOT_VERSION@)</title>
- <style>
- *:focus {
- /* More visible outline for better keyboard navigation. */
- outline: 0.125rem solid hsl(220, 100%, 62.5%);
- /* Make the outline always appear above other elements. */
- /* Otherwise, one of its sides can be hidden by tabs in the Download and More layouts. */
- position: relative;
- }
-
- body {
- touch-action: none;
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- margin: 0;
- border: 0 none;
- padding: 0;
- text-align: center;
- background-color: #333b4f;
- overflow: hidden;
- }
-
- a {
- color: hsl(205, 100%, 75%);
- text-decoration-color: hsla(205, 100%, 75%, 0.3);
- text-decoration-thickness: 0.125rem;
- }
-
- a:hover {
- filter: brightness(117.5%);
- }
-
- a:active {
- filter: brightness(82.5%);
- }
-
- .welcome-modal {
- display: none;
- position: fixed;
- z-index: 1;
- left: 0;
- top: 0;
- width: 100%;
- height: 100%;
- overflow: auto;
- background-color: hsla(0, 0%, 0%, 0.5);
- text-align: left;
- }
-
- .welcome-modal-title {
- text-align: center;
- }
-
- .welcome-modal-content {
- background-color: #333b4f;
- box-shadow: 0 0.25rem 0.25rem hsla(0, 0%, 0%, 0.5);
- line-height: 1.5;
- max-width: 38rem;
- margin: 4rem auto 0 auto;
- color: white;
- border-radius: 0.5rem;
- padding: 1rem 1rem 2rem 1rem;
- }
-
- #tabs-buttons {
- /* Match the default background color of the editor window for a seamless appearance. */
- background-color: #202531;
- }
-
- #tab-game {
- /* Use a pure black background to better distinguish the running project */
- /* from the editor window, and to use a more neutral background color (no tint). */
- background-color: black;
- /* Make the background span the entire page height. */
- min-height: 100vh;
- }
-
- #canvas, #gameCanvas {
- display: block;
- margin: 0;
- color: white;
- }
-
- /* Don't show distracting focus outlines for the main tabs' contents. */
- #tab-editor canvas:focus,
- #tab-game canvas:focus,
- #canvas:focus,
- #gameCanvas:focus {
- outline: none;
- }
-
- .godot {
- color: #e0e0e0;
- background-color: #3b3943;
- background-image: linear-gradient(to bottom, #403e48, #35333c);
- border: 1px solid #45434e;
- box-shadow: 0 0 1px 1px #2f2d35;
- }
-
- .btn {
- appearance: none;
- color: #e0e0e0;
- background-color: #262c3b;
- border: 1px solid #202531;
- padding: 0.5rem 1rem;
- margin: 0 0.5rem;
- }
-
- .btn:not(:disabled):hover {
- color: #e0e1e5;
- border-color: #666c7b;
- }
-
- .btn:active {
- border-color: #699ce8;
- color: #699ce8;
- }
-
- .btn:disabled {
- color: #aaa;
- border-color: #242937;
- }
-
- .btn.tab-btn {
- padding: 0.3rem 1rem;
- }
-
- .btn.close-btn {
- padding: 0.3rem 1rem;
- margin-left: -0.75rem;
- font-weight: 700;
- }
-
-
- /* Status display
- * ============== */
-
- #status {
- position: absolute;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- display: flex;
- justify-content: center;
- align-items: center;
- /* don't consume click events - make children visible explicitly */
- visibility: hidden;
- }
-
- #status-progress {
- width: 366px;
- height: 7px;
- background-color: #38363A;
- border: 1px solid #444246;
- padding: 1px;
- box-shadow: 0 0 2px 1px #1B1C22;
- border-radius: 2px;
- visibility: visible;
- }
-
- @media only screen and (orientation:portrait) {
- #status-progress {
- width: 61.8%;
- }
- }
-
- #status-progress-inner {
- height: 100%;
- width: 0;
- box-sizing: border-box;
- transition: width 0.5s linear;
- background-color: #202020;
- border: 1px solid #222223;
- box-shadow: 0 0 1px 1px #27282E;
- border-radius: 3px;
- }
-
- #status-indeterminate {
- visibility: visible;
- position: relative;
- }
-
- #status-indeterminate > div {
- width: 4.5px;
- height: 0;
- border-style: solid;
- border-width: 9px 3px 0 3px;
- border-color: #2b2b2b transparent transparent transparent;
- transform-origin: center 21px;
- position: absolute;
- }
-
- #status-indeterminate > div:nth-child(1) { transform: rotate( 22.5deg); }
- #status-indeterminate > div:nth-child(2) { transform: rotate( 67.5deg); }
- #status-indeterminate > div:nth-child(3) { transform: rotate(112.5deg); }
- #status-indeterminate > div:nth-child(4) { transform: rotate(157.5deg); }
- #status-indeterminate > div:nth-child(5) { transform: rotate(202.5deg); }
- #status-indeterminate > div:nth-child(6) { transform: rotate(247.5deg); }
- #status-indeterminate > div:nth-child(7) { transform: rotate(292.5deg); }
- #status-indeterminate > div:nth-child(8) { transform: rotate(337.5deg); }
-
- #status-notice {
- margin: 0 100px;
- line-height: 1.3;
- visibility: visible;
- padding: 4px 6px;
- visibility: visible;
- }
- </style>
-</head>
-<body>
- <div
- id="welcome-modal"
- class="welcome-modal"
- role="dialog"
- aria-labelledby="welcome-modal-title"
- aria-describedby="welcome-modal-description"
- onclick="if (event.target === this) closeWelcomeModal(false)"
- >
- <div class="welcome-modal-content">
- <h2 id="welcome-modal-title" class="welcome-modal-title">Important - Please read before continuing</h2>
- <div id="welcome-modal-description">
- <p>
- The Godot Web Editor has some limitations compared to the native version.
- Its main focus is education and experimentation;
- <strong>it is not recommended for production</strong>.
- </p>
- <p>
- Refer to the
- <a
- href="https://docs.godotengine.org/en/latest/tutorials/editor/using_the_web_editor.html"
- target="_blank"
- rel="noopener"
- >Web editor documentation</a> for usage instructions and limitations.
- </p>
- </div>
- <div id="welcome-modal-description-no-cross-origin-isolation" style="display: none">
- <p>
- The web server does not support cross-origin isolation,
- which is required for the Godot Web Editor to function.
- </p>
- <p>
- <strong>Reasons for cross-origin isolation being disabled:</strong>
- <ul>
- <li id="welcome-modal-reason-not-secure">
- This page is not served from a secure context (HTTPS <i>or</i> localhost).
- </li>
- <li>
- This page may not be served with cross-origin isolation headers
- (check with the developer tools' Network tab).
- </li>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
+ <meta name="author" content="Godot Engine">
+ <meta name="description" content="Use the Godot Engine editor directly in your web browser, without having to install anything.">
+ <meta name="mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <meta name="application-name" content="Godot">
+ <meta name="apple-mobile-web-app-title" content="Godot">
+ <meta name="theme-color" content="#202531">
+ <meta name="msapplication-navbutton-color" content="#202531">
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+ <meta name="msapplication-starturl" content="/latest">
+ <meta property="og:site_name" content="Godot Engine Web Editor">
+ <meta property="og:url" name="twitter:url" content="https://editor.godotengine.org/releases/latest/">
+ <meta property="og:title" name="twitter:title" content="Free and open source 2D and 3D game engine">
+ <meta property="og:description" name="twitter:description" content="Use the Godot Engine editor directly in your web browser, without having to install anything.">
+ <meta property="og:image" name="twitter:image" content="https://godotengine.org/themes/godotengine/assets/og_image.png">
+ <meta property="og:type" content="website">
+ <meta name="twitter:card" content="summary">
+ <link id="-gd-engine-icon" rel="icon" type="image/png" href="favicon.png">
+ <link rel="apple-touch-icon" type="image/png" href="favicon.png">
+ <link rel="manifest" href="manifest.json">
+ <title>Godot Engine Web Editor (@GODOT_VERSION@)</title>
+ <style>
+*:focus {
+ /* More visible outline for better keyboard navigation. */
+ outline: 0.125rem solid hsl(220, 100%, 62.5%);
+ /* Make the outline always appear above other elements. */
+ /* Otherwise, one of its sides can be hidden by tabs in the Download and More layouts. */
+ position: relative;
+}
+
+body {
+ touch-action: none;
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ margin: 0;
+ border: 0 none;
+ padding: 0;
+ text-align: center;
+ background-color: #333b4f;
+ overflow: hidden;
+}
+
+a {
+ color: hsl(205, 100%, 75%);
+ text-decoration-color: hsla(205, 100%, 75%, 0.3);
+ text-decoration-thickness: 0.125rem;
+}
+
+a:hover {
+ filter: brightness(117.5%);
+}
+
+a:active {
+ filter: brightness(82.5%);
+}
+
+.welcome-modal {
+ display: none;
+ position: fixed;
+ z-index: 1;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ background-color: hsla(0, 0%, 0%, 0.5);
+ text-align: left;
+}
+
+.welcome-modal-title {
+ text-align: center;
+}
+
+.welcome-modal-content {
+ background-color: #333b4f;
+ box-shadow: 0 0.25rem 0.25rem hsla(0, 0%, 0%, 0.5);
+ line-height: 1.5;
+ max-width: 38rem;
+ margin: 4rem auto 0 auto;
+ color: white;
+ border-radius: 0.5rem;
+ padding: 1rem 1rem 2rem 1rem;
+}
+
+#tabs-buttons {
+ /* Match the default background color of the editor window for a seamless appearance. */
+ background-color: #202531;
+}
+
+#tab-game {
+ /* Use a pure black background to better distinguish the running project */
+ /* from the editor window, and to use a more neutral background color (no tint). */
+ background-color: black;
+ /* Make the background span the entire page height. */
+ min-height: 100vh;
+}
+
+#canvas, #gameCanvas {
+ display: block;
+ margin: 0;
+ color: white;
+}
+
+/* Don't show distracting focus outlines for the main tabs' contents. */
+#tab-editor canvas:focus,
+#tab-game canvas:focus,
+#canvas:focus,
+#gameCanvas:focus {
+ outline: none;
+}
+
+.godot {
+ color: #e0e0e0;
+ background-color: #3b3943;
+ background-image: linear-gradient(to bottom, #403e48, #35333c);
+ border: 1px solid #45434e;
+ box-shadow: 0 0 1px 1px #2f2d35;
+}
+
+.btn {
+ appearance: none;
+ color: #e0e0e0;
+ background-color: #262c3b;
+ border: 1px solid #202531;
+ padding: 0.5rem 1rem;
+ margin: 0 0.5rem;
+}
+
+.btn:not(:disabled):hover {
+ color: #e0e1e5;
+ border-color: #666c7b;
+}
+
+.btn:active {
+ border-color: #699ce8;
+ color: #699ce8;
+}
+
+.btn:disabled {
+ color: #aaa;
+ border-color: #242937;
+}
+
+.btn.tab-btn {
+ padding: 0.3rem 1rem;
+}
+
+.btn.close-btn {
+ padding: 0.3rem 1rem;
+ margin-left: -0.75rem;
+ font-weight: 700;
+}
+
+/* Status display */
+
+#status {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ /* don't consume click events - make children visible explicitly */
+ visibility: hidden;
+}
+
+#status-progress {
+ width: 366px;
+ height: 7px;
+ background-color: #38363A;
+ border: 1px solid #444246;
+ padding: 1px;
+ box-shadow: 0 0 2px 1px #1B1C22;
+ border-radius: 2px;
+ visibility: visible;
+}
+
+@media only screen and (orientation:portrait) {
+ #status-progress {
+ width: 61.8%;
+ }
+}
+
+#status-progress-inner {
+ height: 100%;
+ width: 0;
+ box-sizing: border-box;
+ transition: width 0.5s linear;
+ background-color: #202020;
+ border: 1px solid #222223;
+ box-shadow: 0 0 1px 1px #27282E;
+ border-radius: 3px;
+}
+
+#status-indeterminate {
+ visibility: visible;
+ position: relative;
+}
+
+#status-indeterminate > div {
+ width: 4.5px;
+ height: 0;
+ border-style: solid;
+ border-width: 9px 3px 0 3px;
+ border-color: #2b2b2b transparent transparent transparent;
+ transform-origin: center 21px;
+ position: absolute;
+}
+
+#status-indeterminate > div:nth-child(1) { transform: rotate( 22.5deg); }
+#status-indeterminate > div:nth-child(2) { transform: rotate( 67.5deg); }
+#status-indeterminate > div:nth-child(3) { transform: rotate(112.5deg); }
+#status-indeterminate > div:nth-child(4) { transform: rotate(157.5deg); }
+#status-indeterminate > div:nth-child(5) { transform: rotate(202.5deg); }
+#status-indeterminate > div:nth-child(6) { transform: rotate(247.5deg); }
+#status-indeterminate > div:nth-child(7) { transform: rotate(292.5deg); }
+#status-indeterminate > div:nth-child(8) { transform: rotate(337.5deg); }
+
+#status-notice {
+ margin: 0 100px;
+ line-height: 1.3;
+ visibility: visible;
+ padding: 4px 6px;
+ visibility: visible;
+}
+ </style>
+ </head>
+ <body>
+ <div
+ id="welcome-modal"
+ class="welcome-modal"
+ role="dialog"
+ aria-labelledby="welcome-modal-title"
+ aria-describedby="welcome-modal-description"
+ onclick="if (event.target === this) closeWelcomeModal(false)"
+ >
+ <div class="welcome-modal-content">
+ <h2 id="welcome-modal-title" class="welcome-modal-title">Important - Please read before continuing</h2>
+ <div id="welcome-modal-description">
+ <p>
+ The Godot Web Editor has some limitations compared to the native version.
+ Its main focus is education and experimentation;
+ <strong>it is not recommended for production</strong>.
+ </p>
+ <p>
+ Refer to the
+ <a
+ href="https://docs.godotengine.org/en/latest/tutorials/editor/using_the_web_editor.html"
+ target="_blank"
+ rel="noopener"
+ >Web editor documentation</a> for usage instructions and limitations.
+ </p>
+ </div>
+ <div id="welcome-modal-missing-description" style="display: none">
+ <p>
+ <strong>The following features required by the Godot Web Editor are missing:</strong>
+ </p>
+ <ul id="welcome-modal-missing-list">
</ul>
- </p>
- <p>
- If you are self-hosting the web editor,
- refer to
- <a
- href="https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html#threads"
- target="_blank"
- rel="noopener"
- >Exporting for the Web - Threads</a> for more information.
- </p>
- </div>
- <div style="text-align: center">
- <button id="welcome-modal-dismiss" class="btn" type="button" onclick="closeWelcomeModal(true)" style="margin-top: 1rem">
- OK, don't show again
- </button>
- </div>
- </div>
- </div>
- <div id="tabs-buttons">
- <button id="btn-tab-loader" class="btn tab-btn" onclick="showTab('loader')">Loader</button>
- <button id="btn-tab-editor" class="btn tab-btn" disabled="disabled" onclick="showTab('editor')">Editor</button>
- <button id="btn-close-editor" class="btn close-btn" disabled="disabled" onclick="closeEditor()">×</button>
- <button id="btn-tab-game" class="btn tab-btn" disabled="disabled" onclick="showTab('game')">Game</button>
- <button id="btn-close-game" class="btn close-btn" disabled="disabled" onclick="closeGame()">×</button>
- <button id="btn-tab-update" class="btn tab-btn" style="display: none;">Update</button>
- </div>
- <div id="tabs">
- <div id="tab-loader">
- <div style="color: #e0e0e0;" id="persistence">
- <br />
- <img src="logo.svg" alt="Godot Engine logo" width="1024" height="414" style="width: auto; height: auto; max-width: min(85%, 50vh); max-height: 250px" />
- <br />
- @GODOT_VERSION@
- <br />
- <a href="releases/">Need an old version?</a>
- <br />
- <br />
- <br />
- <label for="videoMode" style="margin-right: 1rem">Video driver:</label>
- <select id="videoMode">
- <option value="" selected="selected">Auto</option>
- <option value="opengl3">WebGL 2</option>
- </select>
- <br />
- <br />
- <label for="zip-file" style="margin-right: 1rem">Preload project ZIP:</label> <input id="zip-file" type="file" name="files" style="margin-bottom: 1rem"/>
- <br />
-<a href="demo.zip">(Try this for example)</a>
- <br />
- <br />
- <button id="startButton" class="btn" style="margin-bottom: 4rem; font-weight: 700">Start Godot editor</button>
- <br />
- <button class="btn" onclick="clearPersistence()" style="margin-bottom: 1.5rem">Clear persistent data</button>
- <br />
- <a href="https://docs.godotengine.org/en/latest/tutorials/editor/using_the_web_editor.html">Web editor documentation</a>
+ <p>
+ If you are self-hosting the web editor,
+ refer to
+ <a
+ href="https://docs.godotengine.org/en/latest/tutorials/export/exporting_for_web.html"
+ target="_blank"
+ rel="noopener"
+ >Exporting for the Web</a> for more information.
+ </p>
+ </div>
+ <div style="text-align: center">
+ <button id="welcome-modal-dismiss" class="btn" type="button" onclick="closeWelcomeModal(true)" style="margin-top: 1rem">
+ OK, don't show again
+ </button>
+ </div>
</div>
</div>
- <div id="tab-editor" style="display: none;">
- <canvas id="editor-canvas" tabindex="1">
- HTML5 canvas appears to be unsupported in the current browser.<br />
- Please try updating or use a different browser.
- </canvas>
+ <div id="tabs-buttons">
+ <button id="btn-tab-loader" class="btn tab-btn" onclick="showTab('loader')">Loader</button>
+ <button id="btn-tab-editor" class="btn tab-btn" disabled="disabled" onclick="showTab('editor')">Editor</button>
+ <button id="btn-close-editor" class="btn close-btn" disabled="disabled" onclick="closeEditor()">×</button>
+ <button id="btn-tab-game" class="btn tab-btn" disabled="disabled" onclick="showTab('game')">Game</button>
+ <button id="btn-close-game" class="btn close-btn" disabled="disabled" onclick="closeGame()">×</button>
+ <button id="btn-tab-update" class="btn tab-btn" style="display: none;">Update</button>
</div>
- <div id="tab-game" style="display: none;">
- <canvas id="game-canvas" tabindex="2">
- HTML5 canvas appears to be unsupported in the current browser.<br />
- Please try updating or use a different browser.
- </canvas>
- </div>
- <div id="tab-status" style="display: none;">
- <div id="status-progress" style="display: none;" oncontextmenu="event.preventDefault();"><div id="status-progress-inner"></div></div>
- <div id="status-indeterminate" style="display: none;" oncontextmenu="event.preventDefault();">
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
+ <div id="tabs">
+ <div id="tab-loader">
+ <div style="color: #e0e0e0;" id="persistence">
+ <br >
+ <img src="logo.svg" alt="Godot Engine logo" width="1024" height="414" style="width: auto; height: auto; max-width: min(85%, 50vh); max-height: 250px">
+ <br >
+ @GODOT_VERSION@
+ <br >
+ <a href="releases/">Need an old version?</a>
+ <br >
+ <br >
+ <br >
+ <label for="videoMode" style="margin-right: 1rem">Video driver:</label>
+ <select id="videoMode">
+ <option value="" selected="selected">Auto</option>
+ <option value="opengl3">WebGL 2</option>
+ </select>
+ <br >
+ <br >
+ <label for="zip-file" style="margin-right: 1rem">Preload project ZIP:</label>
+ <input id="zip-file" type="file" name="files" style="margin-bottom: 1rem">
+ <br >
+ <a href="demo.zip">(Try this for example)</a>
+ <br >
+ <br >
+ <button id="startButton" class="btn" style="margin-bottom: 4rem; font-weight: 700">Start Godot editor</button>
+ <br >
+ <button class="btn" onclick="clearPersistence()" style="margin-bottom: 1.5rem">Clear persistent data</button>
+ <br >
+ <a href="https://docs.godotengine.org/en/latest/tutorials/editor/using_the_web_editor.html">Web editor documentation</a>
+ </div>
+ </div>
+ <div id="tab-editor" style="display: none;">
+ <canvas id="editor-canvas" tabindex="1">
+ HTML5 canvas appears to be unsupported in the current browser.<br >
+ Please try updating or use a different browser.
+ </canvas>
+ </div>
+ <div id="tab-game" style="display: none;">
+ <canvas id="game-canvas" tabindex="2">
+ HTML5 canvas appears to be unsupported in the current browser.<br >
+ Please try updating or use a different browser.
+ </canvas>
+ </div>
+ <div id="tab-status" style="display: none;">
+ <div id="status-progress" style="display: none;" oncontextmenu="event.preventDefault();">
+ <div id="status-progress-inner"></div>
+ </div>
+ <div id="status-indeterminate" style="display: none;" oncontextmenu="event.preventDefault();">
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ </div>
+ <div id="status-notice" class="godot" style="display: none;"></div>
</div>
- <div id="status-notice" class="godot" style="display: none;"></div>
</div>
- </div>
- <script>//<![CDATA[
- window.addEventListener("load", () => {
- function notifyUpdate(sw) {
- const btn = document.getElementById("btn-tab-update");
- btn.onclick = function () {
- if (!window.confirm("Are you sure you want to update?\nClicking \"OK\" will reload all active instances!")) {
- return;
- }
- sw.postMessage("update");
- btn.innerHTML = "Updating...";
- btn.disabled = true;
- };
- btn.style.display = "";
- }
- if ("serviceWorker" in navigator) {
- navigator.serviceWorker.register("service.worker.js").then(function (reg) {
- if (reg.waiting) {
- notifyUpdate(reg.waiting);
- }
- reg.addEventListener("updatefound", function () {
- const update = reg.installing;
- update.addEventListener("statechange", function () {
- if (update.state === "installed") {
- // It's a new install, claim and perform aggressive caching.
- if (!reg.active) {
- update.postMessage("claim");
- } else {
- notifyUpdate(update);
- }
- }
- });
- });
- });
- }
-
- if (!crossOriginIsolated) {
- // Display error dialog as threading support is required for the editor.
- setButtonEnabled('startButton', false);
- document.getElementById("welcome-modal-description").style.display = "none";
- document.getElementById("welcome-modal-description-no-cross-origin-isolation").style.display = "block";
- document.getElementById("welcome-modal-dismiss").style.display = "none";
- document.getElementById("welcome-modal-reason-not-secure").style.display = window.isSecureContext ? "none" : "list-item";
- }
-
- if (!crossOriginIsolated || localStorage.getItem("welcomeModalDismissed") !== 'true') {
- document.getElementById("welcome-modal").style.display = "block";
- document.getElementById("welcome-modal-dismiss").focus();
+ <script>
+window.addEventListener('load', () => {
+ function notifyUpdate(sw) {
+ const btn = document.getElementById('btn-tab-update');
+ btn.onclick = function () {
+ if (!window.confirm('Are you sure you want to update?\nClicking "OK" will reload all active instances!')) {
+ return;
}
- });
-
- function closeWelcomeModal(dontShowAgain) {
- document.getElementById("welcome-modal").style.display = "none";
- if (dontShowAgain) {
- localStorage.setItem("welcomeModalDismissed", 'true');
+ sw.postMessage('update');
+ btn.innerHTML = 'Updating...';
+ btn.disabled = true;
+ };
+ btn.style.display = '';
+ }
+ if ('serviceWorker' in navigator) {
+ navigator.serviceWorker.register('service.worker.js').then(function (reg) {
+ if (reg.waiting) {
+ notifyUpdate(reg.waiting);
}
- }
- //]]></script>
- <script src="godot.tools.js"></script>
- <script>//<![CDATA[
-
- var editor = null;
- var game = null;
- var setStatusMode;
- var setStatusNotice;
- var video_driver = "";
-
- function clearPersistence() {
- function deleteDB(path) {
- return new Promise(function(resolve, reject) {
- var req = indexedDB.deleteDatabase(path);
- req.onsuccess = function() {
- resolve();
- };
- req.onerror = function(err) {
- reject(err);
- };
- req.onblocked = function(err) {
- reject(err);
+ reg.addEventListener('updatefound', function () {
+ const update = reg.installing;
+ update.addEventListener('statechange', function () {
+ if (update.state === 'installed') {
+ // It's a new install, claim and perform aggressive caching.
+ if (!reg.active) {
+ update.postMessage('claim');
+ } else {
+ notifyUpdate(update);
+ }
}
-
});
- }
- if (!window.confirm("Are you sure you want to delete all the locally stored files?\nClicking \"OK\" will permanently remove your projects and editor settings!")) {
- return;
- }
- Promise.all([
- deleteDB("/home/web_user"),
- ]).then(function(results) {
- alert("Done.");
- }).catch(function (err) {
- alert("Error deleting local files. Please retry after reloading the page.");
- });
- }
-
- function selectVideoMode() {
- var select = document.getElementById('videoMode');
- video_driver = select.selectedOptions[0].value;
- }
-
- var tabs = [
- document.getElementById('tab-loader'),
- document.getElementById('tab-editor'),
- document.getElementById('tab-game')
- ]
- function showTab(name) {
- tabs.forEach(function (elem) {
- if (elem.id == 'tab-' + name) {
- elem.style.display = 'block';
- if (name == 'editor' || name == 'game') {
- const canvas = document.getElementById(name + '-canvas');
- canvas.focus();
- }
- } else {
- elem.style.display = 'none';
- }
});
- }
-
- function setButtonEnabled(id, enabled) {
- if (enabled) {
- document.getElementById(id).disabled = "";
- } else {
- document.getElementById(id).disabled = "disabled";
+ });
+ }
+
+ const missing = Engine.getMissingFeatures();
+ if (missing.length) {
+ // Display error dialog as threading support is required for the editor.
+ document.getElementById('startButton').disabled = 'disabled';
+ document.getElementById('welcome-modal-description').style.display = 'none';
+ document.getElementById('welcome-modal-missing-description').style.display = 'block';
+ document.getElementById('welcome-modal-dismiss').style.display = 'none';
+ const list = document.getElementById('welcome-modal-missing-list');
+ for (let i = 0; i < missing.length; i++) {
+ const node = document.createElement('li');
+ node.innerText = missing[i];
+ list.appendChild(node);
+ }
+ }
+
+ if (missing.length || localStorage.getItem('welcomeModalDismissed') !== 'true') {
+ document.getElementById('welcome-modal').style.display = 'block';
+ document.getElementById('welcome-modal-dismiss').focus();
+ }
+});
+
+function closeWelcomeModal(dontShowAgain) { // eslint-disable-line no-unused-vars
+ document.getElementById('welcome-modal').style.display = 'none';
+ if (dontShowAgain) {
+ localStorage.setItem('welcomeModalDismissed', 'true');
+ }
+}
+ </script>
+ <script src="godot.editor.js"></script>
+ <script>
+let editor = null;
+let game = null;
+let setStatusMode;
+let setStatusNotice;
+let video_driver = '';
+
+function clearPersistence() { // eslint-disable-line no-unused-vars
+ function deleteDB(path) {
+ return new Promise(function (resolve, reject) {
+ const req = indexedDB.deleteDatabase(path);
+ req.onsuccess = function () {
+ resolve();
+ };
+ req.onerror = function (err) {
+ reject(err);
+ };
+ req.onblocked = function (err) {
+ reject(err);
+ };
+ });
+ }
+ if (!window.confirm('Are you sure you want to delete all the locally stored files?\nClicking "OK" will permanently remove your projects and editor settings!')) {
+ return;
+ }
+ Promise.all([
+ deleteDB('/home/web_user'),
+ ]).then(function (results) {
+ alert('Done.');
+ }).catch(function (err) {
+ alert('Error deleting local files. Please retry after reloading the page.');
+ });
+}
+
+function selectVideoMode() {
+ const select = document.getElementById('videoMode');
+ video_driver = select.selectedOptions[0].value;
+}
+
+const tabs = [
+ document.getElementById('tab-loader'),
+ document.getElementById('tab-editor'),
+ document.getElementById('tab-game'),
+];
+function showTab(name) {
+ tabs.forEach(function (elem) {
+ if (elem.id === `tab-${name}`) {
+ elem.style.display = 'block';
+ if (name === 'editor' || name === 'game') {
+ const canvas = document.getElementById(`${name}-canvas`);
+ canvas.focus();
}
+ } else {
+ elem.style.display = 'none';
+ }
+ });
+}
+
+function setButtonEnabled(id, enabled) {
+ if (enabled) {
+ document.getElementById(id).disabled = '';
+ } else {
+ document.getElementById(id).disabled = 'disabled';
+ }
+}
+
+function setLoaderEnabled(enabled) {
+ setButtonEnabled('btn-tab-loader', enabled);
+ setButtonEnabled('btn-tab-editor', !enabled);
+ setButtonEnabled('btn-close-editor', !enabled);
+}
+
+function setGameTabEnabled(enabled) {
+ setButtonEnabled('btn-tab-game', enabled);
+ setButtonEnabled('btn-close-game', enabled);
+}
+
+function closeGame() {
+ if (game) {
+ game.requestQuit();
+ }
+}
+
+function closeEditor() { // eslint-disable-line no-unused-vars
+ closeGame();
+ if (editor) {
+ editor.requestQuit();
+ }
+}
+
+function startEditor(zip) {
+ const INDETERMINATE_STATUS_STEP_MS = 100;
+ const persistentPaths = ['/home/web_user'];
+
+ let editorCanvas = document.getElementById('editor-canvas');
+ let gameCanvas = document.getElementById('game-canvas');
+ const statusProgress = document.getElementById('status-progress');
+ const statusProgressInner = document.getElementById('status-progress-inner');
+ const statusIndeterminate = document.getElementById('status-indeterminate');
+ const statusNotice = document.getElementById('status-notice');
+ const headerDiv = document.getElementById('tabs-buttons');
+
+ let initializing = true;
+ let statusMode = 'hidden';
+
+ showTab('status');
+
+ let animationCallbacks = [];
+ function animate(time) {
+ animationCallbacks.forEach((callback) => callback(time));
+ requestAnimationFrame(animate);
+ }
+ requestAnimationFrame(animate);
+
+ let lastScale = 0;
+ let lastWidth = 0;
+ let lastHeight = 0;
+ function adjustCanvasDimensions() {
+ const scale = window.devicePixelRatio || 1;
+ const headerHeight = headerDiv.offsetHeight + 1;
+ const width = window.innerWidth;
+ const height = window.innerHeight - headerHeight;
+ if (lastScale !== scale || lastWidth !== width || lastHeight !== height) {
+ editorCanvas.width = width * scale;
+ editorCanvas.height = height * scale;
+ editorCanvas.style.width = `${width}px`;
+ editorCanvas.style.height = `${height}px`;
+ lastScale = scale;
+ lastWidth = width;
+ lastHeight = height;
+ }
+ }
+ animationCallbacks.push(adjustCanvasDimensions);
+ adjustCanvasDimensions();
+
+ function replaceCanvas(from) {
+ const out = document.createElement('canvas');
+ out.id = from.id;
+ out.tabIndex = from.tabIndex;
+ from.parentNode.replaceChild(out, from);
+ lastScale = 0;
+ return out;
+ }
+
+ function animateStatusIndeterminate(ms) {
+ const i = Math.floor((ms / INDETERMINATE_STATUS_STEP_MS) % 8);
+ if (statusIndeterminate.children[i].style.borderTopColor === '') {
+ Array.prototype.slice.call(statusIndeterminate.children).forEach((child) => {
+ child.style.borderTopColor = '';
+ });
+ statusIndeterminate.children[i].style.borderTopColor = '#dfdfdf';
}
+ }
- function setLoaderEnabled(enabled) {
- setButtonEnabled('btn-tab-loader', enabled);
- setButtonEnabled('btn-tab-editor', !enabled);
- setButtonEnabled('btn-close-editor', !enabled);
- }
-
- function setGameTabEnabled(enabled) {
- setButtonEnabled('btn-tab-game', enabled);
- setButtonEnabled('btn-close-game', enabled);
+ setStatusMode = function (mode) {
+ if (statusMode === mode || !initializing) {
+ return;
}
-
- function closeGame() {
+ [statusProgress, statusIndeterminate, statusNotice].forEach((elem) => {
+ elem.style.display = 'none';
+ });
+ animationCallbacks = animationCallbacks.filter(function (value) {
+ return (value !== animateStatusIndeterminate);
+ });
+ switch (mode) {
+ case 'progress':
+ statusProgress.style.display = 'block';
+ break;
+ case 'indeterminate':
+ statusIndeterminate.style.display = 'block';
+ animationCallbacks.push(animateStatusIndeterminate);
+ break;
+ case 'notice':
+ statusNotice.style.display = 'block';
+ break;
+ case 'hidden':
+ break;
+ default:
+ throw new Error('Invalid status mode');
+ }
+ statusMode = mode;
+ };
+
+ setStatusNotice = function (text) {
+ while (statusNotice.lastChild) {
+ statusNotice.removeChild(statusNotice.lastChild);
+ }
+ const lines = text.split('\n');
+ lines.forEach((line) => {
+ statusNotice.appendChild(document.createTextNode(line));
+ statusNotice.appendChild(document.createElement('br'));
+ });
+ };
+
+ const gameConfig = {
+ 'persistentPaths': persistentPaths,
+ 'unloadAfterInit': false,
+ 'canvas': gameCanvas,
+ 'canvasResizePolicy': 1,
+ 'onExit': function () {
+ gameCanvas = replaceCanvas(gameCanvas);
+ setGameTabEnabled(false);
+ showTab('editor');
+ game = null;
+ },
+ };
+
+ let OnEditorExit = function () {
+ showTab('loader');
+ setLoaderEnabled(true);
+ };
+ function Execute(args) {
+ const is_editor = args.filter(function (v) {
+ return v === '--editor' || v === '-e';
+ }).length !== 0;
+ const is_project_manager = args.filter(function (v) {
+ return v === '--project-manager';
+ }).length !== 0;
+ const is_game = !is_editor && !is_project_manager;
+ if (video_driver) {
+ args.push('--rendering-driver', video_driver);
+ }
+
+ if (is_game) {
if (game) {
- game.requestQuit();
- }
- }
-
- function closeEditor() {
- closeGame();
- if (editor) {
- editor.requestQuit();
- }
- }
-
- function startEditor(zip) {
- const INDETERMINATE_STATUS_STEP_MS = 100;
- const persistentPaths = ['/home/web_user'];
-
- var editorCanvas = document.getElementById('editor-canvas');
- var gameCanvas = document.getElementById('game-canvas');
- var statusProgress = document.getElementById('status-progress');
- var statusProgressInner = document.getElementById('status-progress-inner');
- var statusIndeterminate = document.getElementById('status-indeterminate');
- var statusNotice = document.getElementById('status-notice');
- var headerDiv = document.getElementById('tabs-buttons');
-
- var initializing = true;
- var statusMode = 'hidden';
-
- showTab('status');
-
- var animationCallbacks = [];
- function animate(time) {
- animationCallbacks.forEach(callback => callback(time));
- requestAnimationFrame(animate);
- }
- requestAnimationFrame(animate);
-
- var lastScale = 0;
- var lastWidth = 0;
- var lastHeight = 0;
- function adjustCanvasDimensions() {
- var scale = window.devicePixelRatio || 1;
- var headerHeight = headerDiv.offsetHeight + 1;
- var width = window.innerWidth;
- var height = window.innerHeight - headerHeight;
- if (lastScale !== scale || lastWidth !== width || lastHeight !== height) {
- editorCanvas.width = width * scale;
- editorCanvas.height = height * scale;
- editorCanvas.style.width = width + "px";
- editorCanvas.style.height = height + "px";
- lastScale = scale;
- lastWidth = width;
- lastHeight = height;
- }
- }
- animationCallbacks.push(adjustCanvasDimensions);
- adjustCanvasDimensions();
-
- function replaceCanvas(from) {
- const out = document.createElement("canvas");
- out.id = from.id;
- out.tabIndex = from.tabIndex;
- from.parentNode.replaceChild(out, from);
- lastScale = 0;
- return out;
+ console.error('A game is already running. Close it first');
+ return;
}
-
- setStatusMode = function setStatusMode(mode) {
- if (statusMode === mode || !initializing)
- return;
- [statusProgress, statusIndeterminate, statusNotice].forEach(elem => {
- elem.style.display = 'none';
- });
- animationCallbacks = animationCallbacks.filter(function(value) {
- return (value != animateStatusIndeterminate);
- });
- switch (mode) {
- case 'progress':
- statusProgress.style.display = 'block';
- break;
- case 'indeterminate':
- statusIndeterminate.style.display = 'block';
- animationCallbacks.push(animateStatusIndeterminate);
- break;
- case 'notice':
- statusNotice.style.display = 'block';
- break;
- case 'hidden':
- break;
- default:
- throw new Error('Invalid status mode');
- }
- statusMode = mode;
- };
-
- function animateStatusIndeterminate(ms) {
- var i = Math.floor(ms / INDETERMINATE_STATUS_STEP_MS % 8);
- if (statusIndeterminate.children[i].style.borderTopColor == '') {
- Array.prototype.slice.call(statusIndeterminate.children).forEach(child => {
- child.style.borderTopColor = '';
+ setGameTabEnabled(true);
+ game = new Engine(gameConfig);
+ showTab('game');
+ game.init().then(function () {
+ requestAnimationFrame(function () {
+ game.start({ 'args': args, 'canvas': gameCanvas }).then(function () {
+ gameCanvas.focus();
});
- statusIndeterminate.children[i].style.borderTopColor = '#dfdfdf';
- }
- }
-
- setStatusNotice = function setStatusNotice(text) {
- while (statusNotice.lastChild) {
- statusNotice.removeChild(statusNotice.lastChild);
- }
- var lines = text.split('\n');
- lines.forEach((line) => {
- statusNotice.appendChild(document.createTextNode(line));
- statusNotice.appendChild(document.createElement('br'));
});
- };
-
- const gameConfig = {
- 'persistentPaths': persistentPaths,
- 'unloadAfterInit': false,
- 'canvas': gameCanvas,
- 'canvasResizePolicy': 1,
- 'onExit': function () {
- gameCanvas = replaceCanvas(gameCanvas);
- setGameTabEnabled(false);
- showTab('editor');
- game = null;
- },
- };
-
- var OnEditorExit = function () {
- showTab('loader');
+ });
+ } else { // New editor instances will be run in the same canvas. We want to wait for it to exit.
+ OnEditorExit = function (code) {
setLoaderEnabled(true);
- };
- function Execute(args) {
- const is_editor = args.filter(function(v) { return v == '--editor' || v == '-e' }).length != 0;
- const is_project_manager = args.filter(function(v) { return v == '--project-manager' }).length != 0;
- const is_game = !is_editor && !is_project_manager;
- if (video_driver) {
- args.push('--rendering-driver', video_driver);
- }
-
- if (is_game) {
- if (game) {
- console.error("A game is already running. Close it first");
- return;
- }
- setGameTabEnabled(true);
- game = new Engine(gameConfig);
- showTab('game');
- game.init().then(function() {
- requestAnimationFrame(function() {
- game.start({'args': args, 'canvas': gameCanvas}).then(function() {
- gameCanvas.focus();
- });
- });
+ setTimeout(function () {
+ editor.init().then(function () {
+ setLoaderEnabled(false);
+ OnEditorExit = function () {
+ showTab('loader');
+ setLoaderEnabled(true);
+ };
+ editor.start({ 'args': args, 'persistentDrops': is_project_manager, 'canvas': editorCanvas });
});
- } else { // New editor instances will be run in the same canvas. We want to wait for it to exit.
- OnEditorExit = function(code) {
- setLoaderEnabled(true);
- setTimeout(function() {
- editor.init().then(function() {
- setLoaderEnabled(false);
- OnEditorExit = function() {
- showTab('loader');
- setLoaderEnabled(true);
- };
- editor.start({'args': args, 'persistentDrops': is_project_manager, 'canvas': editorCanvas});
- });
- }, 0);
- OnEditorExit = null;
- };
- }
- }
-
- const editorConfig = {
- 'unloadAfterInit': false,
- 'onProgress': function progressFunction (current, total) {
- if (total > 0) {
- statusProgressInner.style.width = current/total * 100 + '%';
- setStatusMode('progress');
- if (current === total) {
- // wait for progress bar animation
- setTimeout(() => {
- setStatusMode('indeterminate');
- }, 100);
- }
- } else {
- setStatusMode('indeterminate');
- }
- },
- 'canvas': editorCanvas,
- 'canvasResizePolicy': 0,
- 'onExit': function() {
- editorCanvas = replaceCanvas(editorCanvas);
- if (OnEditorExit) {
- OnEditorExit();
- }
- },
- 'onExecute': Execute,
- 'persistentPaths': persistentPaths,
+ }, 0);
+ OnEditorExit = null;
};
- editor = new Engine(editorConfig);
-
- function displayFailureNotice(err) {
- var msg = err.message || err;
- console.error(msg);
- setStatusNotice(msg);
- setStatusMode('notice');
- initializing = false;
- };
-
- if (!Engine.isWebGLAvailable()) {
- displayFailureNotice('WebGL not available');
+ }
+ }
+
+ const editorConfig = {
+ 'unloadAfterInit': false,
+ 'onProgress': function progressFunction(current, total) {
+ if (total > 0) {
+ statusProgressInner.style.width = `${(current / total) * 100}%`;
+ setStatusMode('progress');
+ if (current === total) {
+ // wait for progress bar animation
+ setTimeout(() => {
+ setStatusMode('indeterminate');
+ }, 100);
+ }
} else {
setStatusMode('indeterminate');
- editor.init('godot.tools').then(function() {
- if (zip) {
- editor.copyToFS("/tmp/preload.zip", zip);
- }
- try {
- // Avoid user creating project in the persistent root folder.
- editor.copyToFS("/home/web_user/keep", new Uint8Array());
- } catch(e) {
- // File exists
- }
- selectVideoMode();
- showTab('editor');
- setLoaderEnabled(false);
- const args = ['--project-manager', '--single-window'];
- if (video_driver) {
- args.push('--rendering-driver', video_driver);
- }
- editor.start({'args': args, 'persistentDrops': true}).then(function() {
- setStatusMode('hidden');
- initializing = false;
- });
- }).catch(displayFailureNotice);
}
- };
- document.getElementById("startButton").onclick = function() {
- preloadZip(document.getElementById('zip-file')).then(function(zip) {
- startEditor(zip);
+ },
+ 'canvas': editorCanvas,
+ 'canvasResizePolicy': 0,
+ 'onExit': function () {
+ editorCanvas = replaceCanvas(editorCanvas);
+ if (OnEditorExit) {
+ OnEditorExit();
+ }
+ },
+ 'onExecute': Execute,
+ 'persistentPaths': persistentPaths,
+ };
+ editor = new Engine(editorConfig);
+
+ function displayFailureNotice(err) {
+ const msg = err.message || err;
+ console.error(msg);
+ setStatusNotice(msg);
+ setStatusMode('notice');
+ initializing = false;
+ }
+
+ if (!Engine.isWebGLAvailable()) {
+ displayFailureNotice('WebGL not available');
+ } else {
+ setStatusMode('indeterminate');
+ editor.init('godot.editor').then(function () {
+ if (zip) {
+ editor.copyToFS('/tmp/preload.zip', zip);
+ }
+ try {
+ // Avoid user creating project in the persistent root folder.
+ editor.copyToFS('/home/web_user/keep', new Uint8Array());
+ } catch (e) {
+ // File exists
+ }
+ selectVideoMode();
+ showTab('editor');
+ setLoaderEnabled(false);
+ const args = ['--project-manager', '--single-window'];
+ if (video_driver) {
+ args.push('--rendering-driver', video_driver);
+ }
+ editor.start({ 'args': args, 'persistentDrops': true }).then(function () {
+ setStatusMode('hidden');
+ initializing = false;
});
- }
-
- function preloadZip(target) {
- return new Promise(function(resolve, reject) {
- if (target.files.length > 0) {
- target.files[0].arrayBuffer().then(function(data) {
- resolve(data);
- });
- } else {
- resolve();
- }
+ }).catch(displayFailureNotice);
+ }
+}
+
+function preloadZip(target) {
+ return new Promise(function (resolve, reject) {
+ if (target.files.length > 0) {
+ target.files[0].arrayBuffer().then(function (data) {
+ resolve(data);
});
- }
- //]]></script>
-</body>
+ } else {
+ resolve();
+ }
+ });
+}
+
+document.getElementById('startButton').onclick = function () {
+ preloadZip(document.getElementById('zip-file')).then(function (zip) {
+ startEditor(zip);
+ });
+};
+ </script>
+ </body>
</html>
diff --git a/misc/dist/html/full-size.html b/misc/dist/html/full-size.html
index f385b82f1d..6710cb1533 100644
--- a/misc/dist/html/full-size.html
+++ b/misc/dist/html/full-size.html
@@ -1,245 +1,245 @@
<!DOCTYPE html>
-<html xmlns='https://www.w3.org/1999/xhtml' lang='' xml:lang=''>
-<head>
- <meta charset='utf-8' />
- <meta name='viewport' content='width=device-width, user-scalable=no' />
- <title>$GODOT_PROJECT_NAME</title>
- <style type='text/css'>
-
- body {
- touch-action: none;
- margin: 0;
- border: 0 none;
- padding: 0;
- text-align: center;
- background-color: black;
- }
-
- #canvas {
- display: block;
- margin: 0;
- color: white;
- }
-
- #canvas:focus {
- outline: none;
- }
-
- .godot {
- font-family: 'Noto Sans', 'Droid Sans', Arial, sans-serif;
- color: #e0e0e0;
- background-color: #3b3943;
- background-image: linear-gradient(to bottom, #403e48, #35333c);
- border: 1px solid #45434e;
- box-shadow: 0 0 1px 1px #2f2d35;
- }
-
-
- /* Status display
- * ============== */
-
- #status {
- position: absolute;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- display: flex;
- justify-content: center;
- align-items: center;
- /* don't consume click events - make children visible explicitly */
- visibility: hidden;
- }
-
- #status-progress {
- width: 366px;
- height: 7px;
- background-color: #38363A;
- border: 1px solid #444246;
- padding: 1px;
- box-shadow: 0 0 2px 1px #1B1C22;
- border-radius: 2px;
- visibility: visible;
- }
-
- @media only screen and (orientation:portrait) {
- #status-progress {
- width: 61.8%;
- }
- }
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, user-scalable=no">
+ <title>$GODOT_PROJECT_NAME</title>
+ <style>
+body {
+ touch-action: none;
+ margin: 0;
+ border: 0 none;
+ padding: 0;
+ text-align: center;
+ background-color: black;
+}
+
+#canvas {
+ display: block;
+ margin: 0;
+ color: white;
+}
+
+#canvas:focus {
+ outline: none;
+}
+
+.godot {
+ font-family: 'Noto Sans', 'Droid Sans', Arial, sans-serif;
+ color: #e0e0e0;
+ background-color: #3b3943;
+ background-image: linear-gradient(to bottom, #403e48, #35333c);
+ border: 1px solid #45434e;
+ box-shadow: 0 0 1px 1px #2f2d35;
+}
+
+/* Status display */
+
+#status {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ /* don't consume click events - make children visible explicitly */
+ visibility: hidden;
+}
+
+#status-progress {
+ width: 366px;
+ height: 7px;
+ background-color: #38363A;
+ border: 1px solid #444246;
+ padding: 1px;
+ box-shadow: 0 0 2px 1px #1B1C22;
+ border-radius: 2px;
+ visibility: visible;
+}
+
+@media only screen and (orientation:portrait) {
+ #status-progress {
+ width: 61.8%;
+ }
+}
+
+#status-progress-inner {
+ height: 100%;
+ width: 0;
+ box-sizing: border-box;
+ transition: width 0.5s linear;
+ background-color: #202020;
+ border: 1px solid #222223;
+ box-shadow: 0 0 1px 1px #27282E;
+ border-radius: 3px;
+}
+
+#status-indeterminate {
+ height: 42px;
+ visibility: visible;
+ position: relative;
+}
+
+#status-indeterminate > div {
+ width: 4.5px;
+ height: 0;
+ border-style: solid;
+ border-width: 9px 3px 0 3px;
+ border-color: #2b2b2b transparent transparent transparent;
+ transform-origin: center 21px;
+ position: absolute;
+}
+
+#status-indeterminate > div:nth-child(1) { transform: rotate( 22.5deg); }
+#status-indeterminate > div:nth-child(2) { transform: rotate( 67.5deg); }
+#status-indeterminate > div:nth-child(3) { transform: rotate(112.5deg); }
+#status-indeterminate > div:nth-child(4) { transform: rotate(157.5deg); }
+#status-indeterminate > div:nth-child(5) { transform: rotate(202.5deg); }
+#status-indeterminate > div:nth-child(6) { transform: rotate(247.5deg); }
+#status-indeterminate > div:nth-child(7) { transform: rotate(292.5deg); }
+#status-indeterminate > div:nth-child(8) { transform: rotate(337.5deg); }
+
+#status-notice {
+ margin: 0 100px;
+ line-height: 1.3;
+ visibility: visible;
+ padding: 4px 6px;
+ visibility: visible;
+}
+ </style>
+ $GODOT_HEAD_INCLUDE
+ </head>
+ <body>
+ <canvas id="canvas">
+ HTML5 canvas appears to be unsupported in the current browser.<br >
+ Please try updating or use a different browser.
+ </canvas>
+ <div id="status">
+ <div id="status-progress" style="display: none;" oncontextmenu="event.preventDefault();">
+ <div id ="status-progress-inner"></div>
+ </div>
+ <div id="status-indeterminate" style="display: none;" oncontextmenu="event.preventDefault();">
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ </div>
+ <div id="status-notice" class="godot" style="display: none;"></div>
+ </div>
- #status-progress-inner {
- height: 100%;
- width: 0;
- box-sizing: border-box;
- transition: width 0.5s linear;
- background-color: #202020;
- border: 1px solid #222223;
- box-shadow: 0 0 1px 1px #27282E;
- border-radius: 3px;
+ <script src="$GODOT_URL"></script>
+ <script>
+const GODOT_CONFIG = $GODOT_CONFIG;
+const engine = new Engine(GODOT_CONFIG);
+
+(function () {
+ const INDETERMINATE_STATUS_STEP_MS = 100;
+ const statusProgress = document.getElementById('status-progress');
+ const statusProgressInner = document.getElementById('status-progress-inner');
+ const statusIndeterminate = document.getElementById('status-indeterminate');
+ const statusNotice = document.getElementById('status-notice');
+
+ let initializing = true;
+ let statusMode = 'hidden';
+
+ let animationCallbacks = [];
+ function animate(time) {
+ animationCallbacks.forEach((callback) => callback(time));
+ requestAnimationFrame(animate);
+ }
+ requestAnimationFrame(animate);
+
+ function animateStatusIndeterminate(ms) {
+ const i = Math.floor((ms / INDETERMINATE_STATUS_STEP_MS) % 8);
+ if (statusIndeterminate.children[i].style.borderTopColor === '') {
+ Array.prototype.slice.call(statusIndeterminate.children).forEach((child) => {
+ child.style.borderTopColor = '';
+ });
+ statusIndeterminate.children[i].style.borderTopColor = '#dfdfdf';
}
+ }
- #status-indeterminate {
- height: 42px;
- visibility: visible;
- position: relative;
+ function setStatusMode(mode) {
+ if (statusMode === mode || !initializing) {
+ return;
}
-
- #status-indeterminate > div {
- width: 4.5px;
- height: 0;
- border-style: solid;
- border-width: 9px 3px 0 3px;
- border-color: #2b2b2b transparent transparent transparent;
- transform-origin: center 21px;
- position: absolute;
+ [statusProgress, statusIndeterminate, statusNotice].forEach((elem) => {
+ elem.style.display = 'none';
+ });
+ animationCallbacks = animationCallbacks.filter(function (value) {
+ return (value !== animateStatusIndeterminate);
+ });
+ switch (mode) {
+ case 'progress':
+ statusProgress.style.display = 'block';
+ break;
+ case 'indeterminate':
+ statusIndeterminate.style.display = 'block';
+ animationCallbacks.push(animateStatusIndeterminate);
+ break;
+ case 'notice':
+ statusNotice.style.display = 'block';
+ break;
+ case 'hidden':
+ break;
+ default:
+ throw new Error('Invalid status mode');
}
+ statusMode = mode;
+ }
- #status-indeterminate > div:nth-child(1) { transform: rotate( 22.5deg); }
- #status-indeterminate > div:nth-child(2) { transform: rotate( 67.5deg); }
- #status-indeterminate > div:nth-child(3) { transform: rotate(112.5deg); }
- #status-indeterminate > div:nth-child(4) { transform: rotate(157.5deg); }
- #status-indeterminate > div:nth-child(5) { transform: rotate(202.5deg); }
- #status-indeterminate > div:nth-child(6) { transform: rotate(247.5deg); }
- #status-indeterminate > div:nth-child(7) { transform: rotate(292.5deg); }
- #status-indeterminate > div:nth-child(8) { transform: rotate(337.5deg); }
-
- #status-notice {
- margin: 0 100px;
- line-height: 1.3;
- visibility: visible;
- padding: 4px 6px;
- visibility: visible;
+ function setStatusNotice(text) {
+ while (statusNotice.lastChild) {
+ statusNotice.removeChild(statusNotice.lastChild);
}
- </style>
-$GODOT_HEAD_INCLUDE
-</head>
-<body>
- <canvas id='canvas'>
- HTML5 canvas appears to be unsupported in the current browser.<br />
- Please try updating or use a different browser.
- </canvas>
- <div id='status'>
- <div id='status-progress' style='display: none;' oncontextmenu='event.preventDefault();'><div id ='status-progress-inner'></div></div>
- <div id='status-indeterminate' style='display: none;' oncontextmenu='event.preventDefault();'>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- </div>
- <div id='status-notice' class='godot' style='display: none;'></div>
- </div>
-
- <script type='text/javascript' src='$GODOT_URL'></script>
- <script type='text/javascript'>//<![CDATA[
-
- const GODOT_CONFIG = $GODOT_CONFIG;
- var engine = new Engine(GODOT_CONFIG);
-
- (function() {
- const INDETERMINATE_STATUS_STEP_MS = 100;
- var statusProgress = document.getElementById('status-progress');
- var statusProgressInner = document.getElementById('status-progress-inner');
- var statusIndeterminate = document.getElementById('status-indeterminate');
- var statusNotice = document.getElementById('status-notice');
-
- var initializing = true;
- var statusMode = 'hidden';
-
- var animationCallbacks = [];
- function animate(time) {
- animationCallbacks.forEach(callback => callback(time));
- requestAnimationFrame(animate);
- }
- requestAnimationFrame(animate);
-
- function setStatusMode(mode) {
-
- if (statusMode === mode || !initializing)
- return;
- [statusProgress, statusIndeterminate, statusNotice].forEach(elem => {
- elem.style.display = 'none';
- });
- animationCallbacks = animationCallbacks.filter(function(value) {
- return (value != animateStatusIndeterminate);
- });
- switch (mode) {
- case 'progress':
- statusProgress.style.display = 'block';
- break;
- case 'indeterminate':
- statusIndeterminate.style.display = 'block';
- animationCallbacks.push(animateStatusIndeterminate);
- break;
- case 'notice':
- statusNotice.style.display = 'block';
- break;
- case 'hidden':
- break;
- default:
- throw new Error('Invalid status mode');
- }
- statusMode = mode;
- }
-
- function animateStatusIndeterminate(ms) {
- var i = Math.floor(ms / INDETERMINATE_STATUS_STEP_MS % 8);
- if (statusIndeterminate.children[i].style.borderTopColor == '') {
- Array.prototype.slice.call(statusIndeterminate.children).forEach(child => {
- child.style.borderTopColor = '';
- });
- statusIndeterminate.children[i].style.borderTopColor = '#dfdfdf';
- }
- }
-
- function setStatusNotice(text) {
- while (statusNotice.lastChild) {
- statusNotice.removeChild(statusNotice.lastChild);
- }
- var lines = text.split('\n');
- lines.forEach((line) => {
- statusNotice.appendChild(document.createTextNode(line));
- statusNotice.appendChild(document.createElement('br'));
- });
- };
-
- function displayFailureNotice(err) {
- var msg = err.message || err;
- console.error(msg);
- setStatusNotice(msg);
- setStatusMode('notice');
- initializing = false;
- };
-
- if (!Engine.isWebGLAvailable()) {
- displayFailureNotice('WebGL not available');
- } else {
- setStatusMode('indeterminate');
- engine.startGame({
- 'onProgress': function (current, total) {
- if (total > 0) {
- statusProgressInner.style.width = current/total * 100 + '%';
- setStatusMode('progress');
- if (current === total) {
- // wait for progress bar animation
- setTimeout(() => {
- setStatusMode('indeterminate');
- }, 500);
- }
- } else {
+ const lines = text.split('\n');
+ lines.forEach((line) => {
+ statusNotice.appendChild(document.createTextNode(line));
+ statusNotice.appendChild(document.createElement('br'));
+ });
+ }
+
+ function displayFailureNotice(err) {
+ const msg = err.message || err;
+ console.error(msg);
+ setStatusNotice(msg);
+ setStatusMode('notice');
+ initializing = false;
+ }
+
+ const missing = Engine.getMissingFeatures();
+ if (missing.length !== 0) {
+ const missingMsg = 'Error\nThe following features required to run Godot projects on the Web are missing:\n';
+ displayFailureNotice(missingMsg + missing.join('\n'));
+ } else {
+ setStatusMode('indeterminate');
+ engine.startGame({
+ 'onProgress': function (current, total) {
+ if (total > 0) {
+ statusProgressInner.style.width = `${(current / total) * 100}%`;
+ setStatusMode('progress');
+ if (current === total) {
+ // wait for progress bar animation
+ setTimeout(() => {
setStatusMode('indeterminate');
- }
- },
- }).then(() => {
- setStatusMode('hidden');
- initializing = false;
- }, displayFailureNotice);
- }
- })();
- //]]></script>
-</body>
+ }, 500);
+ }
+ } else {
+ setStatusMode('indeterminate');
+ }
+ },
+ }).then(() => {
+ setStatusMode('hidden');
+ initializing = false;
+ }, displayFailureNotice);
+ }
+}());
+ </script>
+ </body>
</html>
diff --git a/misc/dist/html/manifest.json b/misc/dist/html/manifest.json
index ccfb793b20..75af81cda1 100644
--- a/misc/dist/html/manifest.json
+++ b/misc/dist/html/manifest.json
@@ -3,7 +3,7 @@
"short_name": "Godot",
"description": "Multi-platform 2D and 3D game engine with a feature-rich editor (Web edition)",
"lang": "en",
- "start_url": "./godot.tools.html",
+ "start_url": "./godot.editor.html",
"display": "standalone",
"theme_color": "#202531",
"icons": [
diff --git a/misc/dist/html/offline-export.html b/misc/dist/html/offline-export.html
index 41ab42b04b..ae5298ae46 100644
--- a/misc/dist/html/offline-export.html
+++ b/misc/dist/html/offline-export.html
@@ -1,42 +1,41 @@
<!DOCTYPE html>
<html lang="en">
-<head>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>You are offline</title>
- <style>
- html {
- background-color: #000000;
- color: #ffffff;
- }
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>You are offline</title>
+ <style>
+html {
+ background-color: #000000;
+ color: #ffffff;
+}
- body {
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- margin: 2rem;
- }
+body {
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ margin: 2rem;
+}
- p {
- margin-block: 1rem;
- }
+p {
+ margin-block: 1rem;
+}
- button {
- display: block;
- padding: 1rem 2rem;
- margin: 3rem auto 0;
- }
- </style>
-</head>
-<body>
- <h1>You are offline</h1>
- <p>This application requires an Internet connection to run for the first time.</p>
- <p>Press the button below to try reloading:</p>
- <button type="button">Reload</button>
-
- <script>
- document.querySelector("button").addEventListener("click", () => {
- window.location.reload();
- });
- </script>
-</body>
+button {
+ display: block;
+ padding: 1rem 2rem;
+ margin: 3rem auto 0;
+}
+ </style>
+ </head>
+ <body>
+ <h1>You are offline</h1>
+ <p>This application requires an Internet connection to run for the first time.</p>
+ <p>Press the button below to try reloading:</p>
+ <button type="button">Reload</button>
+ <script>
+document.querySelector('button').addEventListener('click', () => {
+ window.location.reload();
+});
+ </script>
+ </body>
</html>
diff --git a/misc/dist/html/offline.html b/misc/dist/html/offline.html
index 5cfc3362d9..123181e3e0 100644
--- a/misc/dist/html/offline.html
+++ b/misc/dist/html/offline.html
@@ -1,44 +1,44 @@
<!DOCTYPE html>
<html lang="en">
-<head>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <meta name="theme-color" content="#202531" />
- <meta name="msapplication-navbutton-color" content="#202531" />
- <title>You are offline</title>
- <style>
- html {
- background-color: #333b4f;
- color: #e0e0e0;
- }
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="theme-color" content="#202531">
+ <meta name="msapplication-navbutton-color" content="#202531">
+ <title>You are offline</title>
+ <style>
+html {
+ background-color: #333b4f;
+ color: #e0e0e0;
+}
- body {
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- margin: 2rem;
- }
+body {
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ margin: 2rem;
+}
- p {
- margin-block: 1rem;
- }
+p {
+ margin-block: 1rem;
+}
- button {
- display: block;
- padding: 1rem 2rem;
- margin: 3rem auto 0;
- }
- </style>
-</head>
-<body>
- <h1>You are offline</h1>
- <p>This application requires an Internet connection to run for the first time.</p>
- <p>Press the button below to try reloading:</p>
- <button type="button">Reload</button>
+button {
+ display: block;
+ padding: 1rem 2rem;
+ margin: 3rem auto 0;
+}
+ </style>
+ </head>
+ <body>
+ <h1>You are offline</h1>
+ <p>This application requires an Internet connection to run for the first time.</p>
+ <p>Press the button below to try reloading:</p>
+ <button type="button">Reload</button>
- <script>
- document.querySelector("button").addEventListener("click", () => {
- window.location.reload();
- });
- </script>
-</body>
+ <script>
+document.querySelector('button').addEventListener('click', () => {
+ window.location.reload();
+});
+ </script>
+ </body>
</html>
diff --git a/misc/dist/icon_console.svg b/misc/dist/icon_console.svg
new file mode 100644
index 0000000000..d486482f3b
--- /dev/null
+++ b/misc/dist/icon_console.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="1024"
+ height="1024"
+ id="svg3030"
+ version="1.1"
+ inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
+ sodipodi:docname="icon_console.svg"
+ inkscape:export-filename="/home/akien/Projects/godot/godot.git/icon.png"
+ inkscape:export-xdpi="24"
+ inkscape:export-ydpi="24"
+ xml:space="preserve"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
+ id="defs3032" /><sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.28259086"
+ inkscape:cx="955.44491"
+ inkscape:cy="1380.0871"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="3840"
+ inkscape:window-height="2054"
+ inkscape:window-x="-11"
+ inkscape:window-y="594"
+ inkscape:window-maximized="1"
+ inkscape:document-rotation="0"
+ inkscape:showpageshadow="0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1" /><metadata
+ id="metadata3035"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-98.519719)"><g
+ inkscape:label="Layer 1"
+ id="layer1-6"
+ transform="translate(1.7750003e-7,-2.4372979)"><g
+ id="g78-0"
+ transform="matrix(4.162611,0,0,-4.162611,919.24059,771.67186)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 c 0,0 -0.325,1.994 -0.515,1.976 l -36.182,-3.491 c -2.879,-0.278 -5.115,-2.574 -5.317,-5.459 l -0.994,-14.247 -27.992,-1.997 -1.904,12.912 c -0.424,2.872 -2.932,5.037 -5.835,5.037 h -38.188 c -2.902,0 -5.41,-2.165 -5.834,-5.037 l -1.905,-12.912 -27.992,1.997 -0.994,14.247 c -0.202,2.886 -2.438,5.182 -5.317,5.46 l -36.2,3.49 c -0.187,0.018 -0.324,-1.978 -0.511,-1.978 l -0.049,-7.83 30.658,-4.944 1.004,-14.374 c 0.203,-2.91 2.551,-5.263 5.463,-5.472 l 38.551,-2.75 c 0.146,-0.01 0.29,-0.016 0.434,-0.016 2.897,0 5.401,2.166 5.825,5.038 l 1.959,13.286 h 28.005 l 1.959,-13.286 c 0.423,-2.871 2.93,-5.037 5.831,-5.037 0.142,0 0.284,0.005 0.423,0.015 l 38.556,2.75 c 2.911,0.209 5.26,2.562 5.463,5.472 l 1.003,14.374 30.645,4.966 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path80-3"
+ inkscape:connector-curvature="0" /></g><g
+ id="g82-3-2"
+ transform="matrix(4.162611,0,0,-4.162611,104.69892,525.90697)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 v -47.514 -6.035 -5.492 c 0.108,-0.001 0.216,-0.005 0.323,-0.015 l 36.196,-3.49 c 1.896,-0.183 3.382,-1.709 3.514,-3.609 l 1.116,-15.978 31.574,-2.253 2.175,14.747 c 0.282,1.912 1.922,3.329 3.856,3.329 h 38.188 c 1.933,0 3.573,-1.417 3.855,-3.329 l 2.175,-14.747 31.575,2.253 1.115,15.978 c 0.133,1.9 1.618,3.425 3.514,3.609 l 36.182,3.49 c 0.107,0.01 0.214,0.014 0.322,0.015 v 4.711 l 0.015,0.005 V 0 c 5.09692,6.4164715 9.92323,13.494208 13.621,19.449 -5.651,9.62 -12.575,18.217 -19.976,26.182 -6.864,-3.455 -13.531,-7.369 -19.828,-11.534 -3.151,3.132 -6.7,5.694 -10.186,8.372 -3.425,2.751 -7.285,4.768 -10.946,7.118 1.09,8.117 1.629,16.108 1.846,24.448 -9.446,4.754 -19.519,7.906 -29.708,10.17 -4.068,-6.837 -7.788,-14.241 -11.028,-21.479 -3.842,0.642 -7.702,0.88 -11.567,0.926 v 0.006 c -0.027,0 -0.052,-0.006 -0.075,-0.006 -0.024,0 -0.049,0.006 -0.073,0.006 V 63.652 C 93.903,63.606 90.046,63.368 86.203,62.726 82.965,69.964 79.247,77.368 75.173,84.205 64.989,81.941 54.915,78.789 45.47,74.035 45.686,65.695 46.225,57.704 47.318,49.587 43.65,47.237 39.795,45.22 36.369,42.469 32.888,39.791 29.333,37.229 26.181,34.097 19.884,38.262 13.219,42.176 6.353,45.631 -1.048,37.666 -7.968,29.069 -13.621,19.449 -9.1783421,12.475308 -4.4130298,5.4661124 0,0 Z"
+ style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path84-6-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccsssscccccccccccccccccccsccccccccccc" /></g><g
+ id="g86-7-9"
+ transform="matrix(4.162611,0,0,-4.162611,784.07144,817.24284)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 -1.121,-16.063 c -0.135,-1.936 -1.675,-3.477 -3.611,-3.616 l -38.555,-2.751 c -0.094,-0.007 -0.188,-0.01 -0.281,-0.01 -1.916,0 -3.569,1.406 -3.852,3.33 l -2.211,14.994 H -81.09 l -2.211,-14.994 c -0.297,-2.018 -2.101,-3.469 -4.133,-3.32 l -38.555,2.751 c -1.936,0.139 -3.476,1.68 -3.611,3.616 L -130.721,0 -163.268,3.138 c 0.015,-3.498 0.06,-7.33 0.06,-8.093 0,-34.374 43.605,-50.896 97.781,-51.086 h 0.066 0.067 c 54.176,0.19 97.766,16.712 97.766,51.086 0,0.777 0.047,4.593 0.063,8.093 z"
+ style="fill:#478cbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path88-5-4"
+ inkscape:connector-curvature="0" /></g><g
+ id="g90-3-1"
+ transform="matrix(4.162611,0,0,-4.162611,389.21484,625.67104)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 c 0,-12.052 -9.765,-21.815 -21.813,-21.815 -12.042,0 -21.81,9.763 -21.81,21.815 0,12.044 9.768,21.802 21.81,21.802 C -9.765,21.802 0,12.044 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path92-5-3"
+ inkscape:connector-curvature="0" /></g><g
+ id="g94-6-7"
+ transform="matrix(4.162611,0,0,-4.162611,367.36686,631.05679)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 c 0,-7.994 -6.479,-14.473 -14.479,-14.473 -7.996,0 -14.479,6.479 -14.479,14.473 0,7.994 6.483,14.479 14.479,14.479 C -6.479,14.479 0,7.994 0,0"
+ style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path96-2-8"
+ inkscape:connector-curvature="0" /></g><g
+ id="g98-9-8"
+ transform="matrix(4.162611,0,0,-4.162611,511.99336,724.73954)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 c -3.878,0 -7.021,2.858 -7.021,6.381 v 20.081 c 0,3.52 3.143,6.381 7.021,6.381 3.878,0 7.028,-2.861 7.028,-6.381 V 6.381 C 7.028,2.858 3.878,0 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path100-1-3"
+ inkscape:connector-curvature="0" /></g><g
+ id="g102-2-8"
+ transform="matrix(4.162611,0,0,-4.162611,634.78706,625.67104)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 c 0,-12.052 9.765,-21.815 21.815,-21.815 12.041,0 21.808,9.763 21.808,21.815 0,12.044 -9.767,21.802 -21.808,21.802 C 9.765,21.802 0,12.044 0,0"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path104-7-1"
+ inkscape:connector-curvature="0" /></g><g
+ id="g106-0-5"
+ transform="matrix(4.162611,0,0,-4.162611,656.64056,631.05679)"
+ style="stroke-width:0.320312"><path
+ d="m 0,0 c 0,-7.994 6.477,-14.473 14.471,-14.473 8.002,0 14.479,6.479 14.479,14.473 0,7.994 -6.477,14.479 -14.479,14.479 C 6.477,14.479 0,7.994 0,0"
+ style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.320312"
+ id="path108-9-3"
+ inkscape:connector-curvature="0" /></g></g><path
+ id="path581"
+ style="fill:#414042;fill-opacity:1;stroke-width:20;stroke:#ffffff;stroke-opacity:1;stroke-dasharray:none"
+ d="m 559.63672,752.49433 c -9.61602,0 -17.48438,7.86834 -17.48438,17.48437 v 295.125 c 0,9.6161 7.86836,17.4844 17.48438,17.4844 h 384.64062 c 9.61603,0 17.48438,-7.8683 17.48438,-17.4844 v -295.125 c 0,-9.61603 -7.86835,-17.48437 -17.48438,-17.48437 z"
+ sodipodi:nodetypes="sccssccss" /><path
+ id="path10"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:10.7638"
+ d="m 604.19435,828.87215 -19.37462,19.37464 c -5.38188,4.3055 -5.38188,11.84096 0,17.22283 l 66.73589,66.73469 -66.73589,66.73589 c -5.38188,5.3819 -5.38188,12.9161 0,17.2216 l 19.37462,19.3747 c 5.38188,5.3818 12.91613,5.3818 17.22163,0 l 75.33586,-75.33592 19.38547,-19.38425 c 5.46258,-5.17192 5.07049,-13.02396 0,-17.22284 l -19.37462,-19.37462 -75.34671,-75.34672 c -4.96088,-4.18442 -12.91229,-4.15049 -17.22163,0 z"
+ sodipodi:nodetypes="ccccscsccccccc" /><path
+ d="M 917.91967,991.872 H 760.9701 c -5.88562,0 -9.80935,3.9237 -9.80935,9.8093 v 29.4281 c 0,5.8856 3.92373,9.8093 9.80935,9.8093 h 156.94957 c 5.88561,0 9.80934,-3.9237 9.80934,-9.8093 v -29.4281 c 0,-5.8856 -3.92373,-9.8093 -9.80934,-9.8093 z"
+ fill="url(#paint5_linear)"
+ id="path25"
+ style="fill:#ffffff;fill-opacity:1;stroke-width:9.80938" /></g></svg>
diff --git a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
index 467aa3ce83..e717b501f4 100644
--- a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
+++ b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
@@ -164,7 +164,7 @@
};
buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */;
compatibilityVersion = "Xcode 3.2";
- developmentRegion = English;
+ developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
@@ -249,7 +249,6 @@
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
diff --git a/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist b/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist
index e9d22f6b4d..b88dfae5b2 100644
--- a/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist
+++ b/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist
@@ -58,5 +58,6 @@
</array>
$additional_plist_content
$plist_launch_screen_name
+ <key>CADisableMinimumFrameDurationOnPhone</key><true/>
</dict>
</plist>
diff --git a/misc/dist/linux/godot.6 b/misc/dist/linux/godot.6
index 07e2a389a7..2481869d8a 100644
--- a/misc/dist/linux/godot.6
+++ b/misc/dist/linux/godot.6
@@ -130,16 +130,22 @@ Run a script.
\fB\-\-check\-only\fR
Only parse for errors and quit (use with --script).
.TP
-\fB\-\-export\fR <preset> <path>
-Export the project using the given preset and matching release template. The preset name should match one defined in export_presets.cfg.
+\fB\-\-export\-release\fR <preset> <path>
+Export the project in release mode using the given preset and output path. The preset name should match one defined in export_presets.cfg.
.br
-<path> should be absolute or relative to the project directory, and include the filename for the binary (e.g. 'builds/game.exe'). The target directory should exist.
+<path> should be absolute or relative to the project directory, and include the filename for the binary (e.g. 'builds/game.exe').
+.br
+The target directory must exist.
.TP
\fB\-\-export\-debug\fR <preset> <path>
-Same as \-\-export, but using the debug template.
+Export the project in debug mode using the given preset and output path. The preset name should match one defined in export_presets.cfg.
+.br
+<path> should be absolute or relative to the project directory, and include the filename for the binary (e.g. 'builds/game.exe').
+.br
+The target directory must exist.
.TP
\fB\-\-export\-pack\fR <preset> <path>
-Same as \-\-export, but only export the game pack for the given preset. The <path> extension determines whether it will be in PCK or ZIP format.
+Export the project data only using the given preset and output path. The <path> extension determines whether it will be in PCK or ZIP format.
.TP
\fB\-\-doctool\fR <path>
Dump the engine API reference to the given <path> in XML format, merging if existing files are found.
@@ -150,6 +156,12 @@ Disallow dumping the base types (used with \fB\-\-doctool\fR).
\fB\-\-build\-solutions\fR
Build the scripting solutions (e.g. for C# projects). Implies \-\-editor and requires a valid project to edit.
.TP
+\fB\-\-dump\-gdextension\-interface\fR
+Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.
+.TP
+\fB\-\-dump\-extension\-api\fR
+Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder.
+.TP
\fB\-\-test\fR <test>
Run a unit test ('string', 'math', 'physics', 'physics_2d', 'render', 'oa_hash_map', 'gui', 'shaderlang', 'gd_tokenizer', 'gd_parser', 'gd_compiler', 'gd_bytecode', 'ordered_hash_map', 'astar').
.SH FILES
diff --git a/misc/dist/shell/_godot.zsh-completion b/misc/dist/shell/_godot.zsh-completion
index b17bb6e66b..8e2f6a92bd 100644
--- a/misc/dist/shell/_godot.zsh-completion
+++ b/misc/dist/shell/_godot.zsh-completion
@@ -44,19 +44,21 @@ _arguments \
'--remote-fs-password[password for remote filesystem]:remote filesystem password' \
'--audio-driver[set the audio driver]:audio driver name' \
'--display-driver[set the display driver]:display driver name' \
+ "--rendering-method[set the renderer]:renderer name:((forward_plus\:'Desktop renderer' mobile\:'Desktop and mobile renderer' gl_compatibility\:'Desktop, mobile and web renderer'))" \
"--rendering-driver[set the rendering driver]:rendering driver name:((vulkan\:'Vulkan renderer' opengl3\:'OpenGL ES 3.0 renderer' dummy\:'Dummy renderer'))" \
"--gpu-index[use a specific GPU (run with --verbose to get available device list)]:device index" \
'--text-driver[set the text driver]:text driver name' \
'--tablet-driver[set the pen tablet input driver]:tablet driver name' \
'--headless[enable headless mode (--display-driver headless --audio-driver Dummy), useful for servers and with --script]' \
+ '--write-movie[writes a video to the specified path (usually with .avi or .png extension)]:path to output video file' \
'(-f --fullscreen)'{-f,--fullscreen}'[request fullscreen mode]' \
'(-m --maximized)'{-m,--maximized}'[request a maximized window]' \
'(-w --windowed)'{-w,--windowed}'[request windowed mode]' \
'(-t --always-on-top)'{-t,--always-on-top}'[request an always-on-top window]' \
'--resolution[request window resolution]:resolution in WxH format' \
'--position[request window position]:position in X,Y format' \
- '--headless[enable headless mode (--display-driver headless --audio-driver Dummy). Useful for servers and with --script]' \
'--single-window[use a single window (no separate subwindows)]' \
+ '--xr-mode[select Extended Reality (XR) mode]:Extended Reality (XR) mode:(default off on)' \
'(-d --debug)'{-d,--debug}'[debug (local stdout debugger)]' \
'(-b --breakpoints)'{-b,--breakpoints}'[specify the breakpoint list as source::line comma-separated pairs, no spaces (use %20 instead)]:breakpoint list' \
'--profiling[enable profiling in the script debugger]' \
@@ -69,19 +71,23 @@ _arguments \
'--debug-stringnames[print all StringName allocations to stdout when the engine quits]' \
'--frame-delay[simulate high CPU load (delay each frame by the given number of milliseconds)]:number of milliseconds' \
'--time-scale[force time scale (higher values are faster, 1.0 is normal speed)]:time scale' \
+ '--disable-vsync[disable vertical synchronization even if enabled in the project settings]' \
'--disable-render-loop[disable render loop so rendering only occurs when called explicitly from script]' \
'--disable-crash-handler[disable crash handler when supported by the platform code]' \
'--fixed-fps[force a fixed number of frames per second (this setting disables real-time synchronization)]:frames per second' \
'--print-fps[print the frames per second to the stdout]' \
'(-s, --script)'{-s,--script}'[run a script]:path to script:_files' \
'--check-only[only parse for errors and quit (use with --script)]' \
- '--export[export the project using the given preset and matching release template]:export preset name then path' \
- '--export-debug[same as --export, but using the debug template]:export preset name then path' \
- '--export-pack[same as --export, but only export the game pack for the given preset]:export preset name then path' \
+ '--export-release[export the project in release mode using the given preset and output path]:export preset name then path' \
+ '--export-debug[export the project in debug mode using the given preset and output path]:export preset name then path' \
+ '--export-pack[export the project data only as a PCK or ZIP file using the given preset and output path]:export preset name then path' \
'--convert-3to4[converts project from Godot 3.x to Godot 4.x]' \
'--validate-conversion-3to4[shows what elements will be renamed when converting project from Godot 3.x to Godot 4.x]' \
'--doctool[dump the engine API reference to the given path in XML format, merging if existing files are found]:path to base Godot build directory (optional):_dirs' \
'--no-docbase[disallow dumping the base types (used with --doctool)]' \
'--build-solutions[build the scripting solutions (e.g. for C# projects)]' \
+ '--dump-gdextension-interface[generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.]' \
'--dump-extension-api[generate JSON dump of the Godot API for GDExtension bindings named "extension_api.json" in the current folder]' \
+ '--startup-benchmark[benchmark the startup time and print it to console]' \
+ '--startup-benchmark-file[benchmark the startup time and save it to a given file in JSON format]:path to output JSON file' \
'--test[run all unit tests; run with "--test --help" for more information]'
diff --git a/misc/dist/shell/godot.bash-completion b/misc/dist/shell/godot.bash-completion
index 1ab687e1fc..73107c0cf3 100644
--- a/misc/dist/shell/godot.bash-completion
+++ b/misc/dist/shell/godot.bash-completion
@@ -47,19 +47,21 @@ _complete_godot_options() {
--remote-fs-password
--audio-driver
--display-driver
+--rendering-method
--rendering-driver
--gpu-index
--text-driver
--tablet-driver
--headless
+--write-movie
--fullscreen
--maximized
--windowed
--always-on-top
--resolution
--position
---headless
--single-window
+--xr-mode
--debug
--breakpoints
--profiling
@@ -72,13 +74,14 @@ _complete_godot_options() {
--debug-stringnames
--frame-delay
--time-scale
+--disable-vsync
--disable-render-loop
--disable-crash-handler
--fixed-fps
--print-fps
--script
--check-only
---export
+--export-release
--export-debug
--export-pack
--convert-3to4
@@ -86,7 +89,10 @@ _complete_godot_options() {
--doctool
--no-docbase
--build-solutions
+--dump-gdextension-interface
--dump-extension-api
+--startup-benchmark
+--startup-benchmark-file
--test
" -- "$1"))
}
@@ -112,10 +118,18 @@ _complete_godot_bash() {
local IFS=$' \n\t'
# shellcheck disable=SC2207
COMPREPLY=($(compgen -W "unsafe safe separate" -- "$cur"))
+ elif [[ $prev == "--rendering-method" ]]; then
+ local IFS=$' \n\t'
+ # shellcheck disable=SC2207
+ COMPREPLY=($(compgen -W "forward_plus mobile gl_compatibility" -- "$cur"))
elif [[ $prev == "--rendering-driver" ]]; then
local IFS=$' \n\t'
# shellcheck disable=SC2207
COMPREPLY=($(compgen -W "vulkan opengl3 dummy" -- "$cur"))
+ elif [[ $prev == "--xr-mode" ]]; then
+ local IFS=$' \n\t'
+ # shellcheck disable=SC2207
+ COMPREPLY=($(compgen -W "default off on" -- "$cur"))
elif [[ $prev == "--path" || $prev == "--doctool" ]]; then
local IFS=$'\n\t'
# shellcheck disable=SC2207
diff --git a/misc/dist/shell/godot.fish b/misc/dist/shell/godot.fish
index d58066c135..83680214f2 100644
--- a/misc/dist/shell/godot.fish
+++ b/misc/dist/shell/godot.fish
@@ -23,6 +23,13 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
+function godot_rendering_method_args
+ # Use a function instead of a fixed string to customize the argument descriptions.
+ echo -e "forward_plus\tHigh-end desktop renderer"
+ echo -e "mobile\tHigh-end mobile/desktop renderer"
+ echo -e "gl_compatibility\tLow-end desktop, mobile and web renderer"
+end
+
function godot_rendering_driver_args
# Use a function instead of a fixed string to customize the argument descriptions.
echo -e "vulkan\tVulkan renderer"
@@ -53,11 +60,13 @@ complete -c godot -l remote-fs -d "Use a remote filesystem (<host/IP>[:<port>] a
complete -c godot -l remote-fs-password -d "Password for remote filesystem" -x
complete -c godot -l audio-driver -d "Set the audio driver" -x
complete -c godot -l display-driver -d "Set the display driver" -x
+complete -c godot -l rendering-method -d "Set the renderer" -x -a "(godot_rendering_method_args)"
complete -c godot -l rendering-driver -d "Set the rendering driver" -x -a "(godot_rendering_driver_args)"
complete -c godot -l gpu-index -d "Use a specific GPU (run with --verbose to get available device list)" -x
complete -c godot -l text-driver -d "Set the text driver" -x
complete -c godot -l tablet-driver -d "Set the pen tablet input driver" -x
complete -c godot -l headless -d "Enable headless mode (--display-driver headless --audio-driver Dummy). Useful for servers and with --script"
+complete -c godot -l write-movie -d "Writes a video to the specified path (usually with .avi or .png extension). --fixed-fps is forced when enabled" -x
# Display options:
complete -c godot -s f -l fullscreen -d "Request fullscreen mode"
@@ -66,8 +75,8 @@ complete -c godot -s w -l windowed -d "Request windowed mode"
complete -c godot -s t -l always-on-top -d "Request an always-on-top window"
complete -c godot -l resolution -d "Request window resolution" -x
complete -c godot -l position -d "Request window position" -x
-complete -c godot -l headless -d "Enable headless mode (--display-driver headless --audio-driver Dummy). Useful for servers and with --script"
complete -c godot -l single-window -d "Use a single window (no separate subwindows)"
+complete -c godot -l xr-mode -d "Select Extended Reality (XR) mode" -a "default off on"
# Debug options:
complete -c godot -s d -l debug -d "Debug (local stdout debugger)"
@@ -90,13 +99,16 @@ complete -c godot -l print-fps -d "Print the frames per second to the stdout"
# Standalone tools:
complete -c godot -s s -l script -d "Run a script" -r
complete -c godot -l check-only -d "Only parse for errors and quit (use with --script)"
-complete -c godot -l export -d "Export the project using the given preset and matching release template" -x
-complete -c godot -l export-debug -d "Same as --export, but using the debug template" -x
-complete -c godot -l export-pack -d "Same as --export, but only export the game pack for the given preset" -x
+complete -c godot -l export-release -d "Export the project in release mode using the given preset and output path" -x
+complete -c godot -l export-debug -d "Export the project in debug mode using the given preset and output path" -x
+complete -c godot -l export-pack -d "Export the project data only as a PCK or ZIP file using the given preset and output path" -x
complete -c godot -l convert-3to4 -d "Converts project from Godot 3.x to Godot 4.x"
complete -c godot -l validate-conversion-3to4 -d "Shows what elements will be renamed when converting project from Godot 3.x to Godot 4.x"
complete -c godot -l doctool -d "Dump the engine API reference to the given path in XML format, merging if existing files are found" -r
complete -c godot -l no-docbase -d "Disallow dumping the base types (used with --doctool)"
complete -c godot -l build-solutions -d "Build the scripting solutions (e.g. for C# projects)"
+complete -c godot -l dump-gdextension-interface -d "Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension"
complete -c godot -l dump-extension-api -d "Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder"
+complete -c godot -l startup-benchmark -d "Benchmark the startup time and print it to console"
+complete -c godot -l startup-benchmark-file -d "Benchmark the startup time and save it to a given file in JSON format" -x
complete -c godot -l test -d "Run all unit tests; run with '--test --help' for more information" -x