summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
Diffstat (limited to 'misc')
-rwxr-xr-xmisc/ci/android-tools-linux.sh108
-rw-r--r--misc/dist/html/editor.html475
-rw-r--r--misc/dist/html/fixed-size.html1
-rw-r--r--misc/dist/html/full-size.html29
-rw-r--r--misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj16
-rw-r--r--misc/dist/ios_xcode/godot_ios/vulkan/icd.d/MoltenVK_icd.json7
-rw-r--r--misc/dist/linux/x-godot-project.xml10
-rwxr-xr-xmisc/dist/osx_tools.app/Contents/Info.plist2
-rw-r--r--misc/scons/compilation_db.py177
-rwxr-xr-xmisc/scripts/black_format.sh4
-rwxr-xr-xmisc/scripts/clang_format.sh4
-rwxr-xr-xmisc/scripts/file_format.sh27
12 files changed, 537 insertions, 323 deletions
diff --git a/misc/ci/android-tools-linux.sh b/misc/ci/android-tools-linux.sh
deleted file mode 100755
index 6114551861..0000000000
--- a/misc/ci/android-tools-linux.sh
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/bin/bash
-
-# SDK
-# https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip
-# SHA-256 444e22ce8ca0f67353bda4b85175ed3731cae3ffa695ca18119cbacef1c1bea0
-# latest version available here: https://developer.android.com/studio/index.html
-
-# NDK
-# https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip
-# SHA-1 0bf02d4e8b85fd770fd7b9b2cdec57f9441f27a2
-# latest version available here: https://developer.android.com/ndk/downloads/index.html
-
-BASH_RC=~/.bashrc
-GODOT_BUILD_TOOLS_PATH=./godot-dev/build-tools
-mkdir -p $GODOT_BUILD_TOOLS_PATH
-cd $GODOT_BUILD_TOOLS_PATH
-
-ANDROID_BASE_URL=http://dl.google.com/android/repository
-
-ANDROID_SDK_RELEASE=4333796
-ANDROID_SDK_DIR=android-sdk
-ANDROID_SDK_FILENAME=sdk-tools-linux-$ANDROID_SDK_RELEASE.zip
-ANDROID_SDK_URL=$ANDROID_BASE_URL/$ANDROID_SDK_FILENAME
-ANDROID_SDK_PATH=$GODOT_BUILD_TOOLS_PATH/$ANDROID_SDK_DIR
-ANDROID_SDK_SHA256=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
-
-ANDROID_NDK_RELEASE=r21
-ANDROID_NDK_DIR=android-ndk
-ANDROID_NDK_FILENAME=android-ndk-$ANDROID_NDK_RELEASE-linux-x86_64.zip
-ANDROID_NDK_URL=$ANDROID_BASE_URL/$ANDROID_NDK_FILENAME
-ANDROID_NDK_PATH=$GODOT_BUILD_TOOLS_PATH/$ANDROID_NDK_DIR
-ANDROID_NDK_SHA1=afc9c0b9faad222898ac8168c78ad4ccac8a1b5c
-
-echo
-echo "Download and install Android development tools ..."
-echo
-
-if [ ! -e $ANDROID_SDK_FILENAME ]; then
- echo "Downloading: Android SDK ..."
- curl -L -O $ANDROID_SDK_URL
-else
- echo $ANDROID_SDK_SHA1 $ANDROID_SDK_FILENAME > $ANDROID_SDK_FILENAME.sha1
- if [ $(shasum -a 256 < $ANDROID_SDK_FILENAME | awk '{print $1;}') != $ANDROID_SDK_SHA1 ]; then
- echo "Downloading: Android SDK ..."
- curl -L -O $ANDROID_SDK_URL
- fi
-fi
-
-if [ ! -d $ANDROID_SDK_DIR ]; then
- echo "Extracting: Android SDK ..."
- unzip -qq $ANDROID_SDK_FILENAME -d $ANDROID_SDK_DIR
- echo
-fi
-
-if [ ! -e $ANDROID_NDK_FILENAME ]; then
- echo "Downloading: Android NDK ..."
- curl -L -O $ANDROID_NDK_URL
-else
- echo $ANDROID_NDK_MD5 $ANDROID_NDK_FILENAME > $ANDROID_NDK_FILENAME.md5
- if [ $(shasum -a 1 < $ANDROID_NDK_FILENAME | awk '{print $1;}') != $ANDROID_NDK_SHA1 ]; then
- echo "Downloading: Android NDK ..."
- curl -L -O $ANDROID_NDK_URL
- fi
-fi
-
-if [ ! -d $ANDROID_NDK_DIR ]; then
- echo "Extracting: Android NDK ..."
- unzip -qq $ANDROID_NDK_FILENAME
- mv android-ndk-$ANDROID_NDK_RELEASE $ANDROID_NDK_DIR
- echo
-fi
-
-mkdir -p ~/.android && echo "count=0" > ~/.android/repositories.cfg
-echo "Installing: Accepting Licenses ..."
-yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager --licenses > /dev/null
-echo "Installing: Android Build and Platform Tools ..."
-yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager 'tools' > /dev/null
-yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager 'platform-tools' > /dev/null
-yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager 'build-tools;29.0.3' > /dev/null
-echo
-
-EXPORT_VAL="export ANDROID_HOME=$ANDROID_SDK_PATH"
-if ! grep -q "^$EXPORT_VAL" $BASH_RC; then
- echo $EXPORT_VAL >> $BASH_RC
-fi
-#eval $EXPORT_VAL
-
-EXPORT_VAL="export ANDROID_NDK_ROOT=$ANDROID_NDK_PATH"
-if ! grep -q "^$EXPORT_VAL" $BASH_RC; then
- echo $EXPORT_VAL >> $BASH_RC
-fi
-#eval $EXPORT_VAL
-
-EXPORT_VAL="export PATH=$PATH:$ANDROID_SDK_PATH/tools"
-if ! grep -q "^export PATH=.*$ANDROID_SDK_PATH/tools.*" $BASH_RC; then
- echo $EXPORT_VAL >> $BASH_RC
-fi
-#eval $EXPORT_VAL
-
-EXPORT_VAL="export PATH=$PATH:$ANDROID_SDK_PATH/tools/bin"
-if ! grep -q "^export PATH=.*$ANDROID_SDK_PATH/tools/bin.*" $BASH_RC; then
- echo $EXPORT_VAL >> $BASH_RC
-fi
-#eval $EXPORT_VAL
-
-echo
-echo "Done!"
-echo
diff --git a/misc/dist/html/editor.html b/misc/dist/html/editor.html
new file mode 100644
index 0000000000..5b6ad2df65
--- /dev/null
+++ b/misc/dist/html/editor.html
@@ -0,0 +1,475 @@
+<!DOCTYPE html>
+<html xmlns='http://www.w3.org/1999/xhtml' lang='' xml:lang=''>
+<head>
+ <meta charset='utf-8' />
+ <meta name='viewport' content='width=device-width, user-scalable=no' />
+ <link id='-gd-engine-icon' rel='icon' type='image/png' href='favicon.png' />
+ <title></title>
+ <style type='text/css'>
+
+ body {
+ touch-action: none;
+ margin: 0;
+ border: 0 none;
+ padding: 0;
+ text-align: center;
+ background-color: black;
+ overflow: hidden;
+ }
+
+ #canvas, #gameCanvas {
+ display: block;
+ margin: 0;
+ color: white;
+ }
+
+ #canvas:focus, #gameCanvas: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 {
+ 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="tabs-buttons">
+ <button id="btn-tab-loader" class="tab-btn" onclick="showTab('loader')">Loader</button>
+ <button id="btn-tab-editor" class="tab-btn" disabled="disabled" onclick="showTab('editor')">Editor</button>
+ <button id="btn-close-editor" class="close-btn" disabled="disabled" onclick="closeEditor()">X</button>
+ <button id="btn-tab-game" class="tab-btn" disabled="disabled" onclick="showTab('game')">Game</button>
+ <button id="btn-close-game" class="close-btn" disabled="disabled" onclick="closeGame()">X</button>
+ </div>
+ <div id='tabs'>
+ <div id='tab-loader'>
+ <div style="color: white;" id="persistence">
+ <label for="videoMode" style="display: none;">Select video driver:</label><br />
+ <select id="videoMode" style="display: none;">
+ <option value="GLES2" selected="selected">WebGL</option>
+ <option value="GLES3">WebGL 2</option>
+ </select>
+ <br />
+ <label for="zip-file">Preload project zip: </label><input id="zip-file" type="file" id="files" name="files"/>
+ <br />
+ <button id="startButton">Start Godot Editor</button>
+ <br />
+ <br />
+ <button onclick="clearPersistence()">Clear persistent data</button>
+ </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>
+
+ <script type='text/javascript' src='godot.tools.js'></script>
+ <script type='text/javascript'>//<![CDATA[
+
+ var engine = new Engine;
+ var game = null;
+ var setStatusMode;
+ var setStatusNotice;
+ var video_driver = "GLES2";
+
+ 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);
+ }
+
+ });
+ }
+ if (!window.confirm("Are you sure you want to delete all the locally stored files?")) {
+ return;
+ }
+ Promise.all([
+ deleteDB("/home/web_user/projects"),
+ deleteDB("/home/web_user/.config")
+ ]).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';
+ } 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() {
+ closeGame();
+ if (engine) {
+ engine.requestQuit();
+ }
+ }
+
+ function startEditor(zip) {
+
+ const INDETERMINATE_STATUS_STEP_MS = 100;
+ const persistentPaths = ['/home/web_user/.config', '/home/web_user/projects'];
+
+ 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 initializing = true;
+ var statusMode = 'hidden';
+
+ showTab('status');
+
+ var animationCallbacks = [];
+ function animate(time) {
+ animationCallbacks.forEach(callback => callback(time));
+ requestAnimationFrame(animate);
+ }
+ requestAnimationFrame(animate);
+
+ function adjustCanvasDimensions() {
+ var scale = window.devicePixelRatio || 1;
+ var header = document.getElementById('tabs-buttons');
+ var headerHeight = header.offsetHeight + 1;
+ var width = window.innerWidth;
+ var height = window.innerHeight - headerHeight;
+ editorCanvas.width = width * scale;
+ editorCanvas.height = height * scale;
+ editorCanvas.style.width = width + "px";
+ editorCanvas.style.height = height + "px";
+ }
+ animationCallbacks.push(adjustCanvasDimensions);
+ adjustCanvasDimensions();
+
+ 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 = '';
+ });
+ 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'));
+ });
+ };
+
+ engine.setProgressFunc((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');
+ }
+ });
+
+ engine.setPersistentPaths(persistentPaths);
+
+ engine.setOnExecute(function(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 (is_project_manager) {
+ args.push('--video-driver', video_driver);
+ }
+ if (is_game) {
+ if (game) {
+ console.error("A game is already running. Close it first");
+ return;
+ }
+ setGameTabEnabled(true);
+ game = new Engine();
+ game.setPersistentPaths(persistentPaths);
+ game.setUnloadAfterInit(false);
+ game.setOnExecute(engine.onExecute);
+ game.setCanvas(gameCanvas);
+ game.setCanvasResizedOnStart(true);
+ game.setOnExit(function() {
+ setGameTabEnabled(false);
+ showTab('editor');
+ game = null;
+ });
+ showTab('game');
+ game.init().then(function() {
+ requestAnimationFrame(function() {
+ game.start.apply(game, args).then(function() {
+ gameCanvas.focus();
+ });
+ });
+ });
+ } else { // New editor instances will be run in the same canvas. We want to wait for it to exit.
+ engine.setOnExit(function(code) {
+ setLoaderEnabled(true);
+ setTimeout(function() {
+ engine.init().then(function() {
+ setLoaderEnabled(false);
+ engine.setOnExit(function() {
+ showTab('loader');
+ setLoaderEnabled(true);
+ });
+ engine.start.apply(engine, args);
+ });
+ }, 0);
+ engine.setOnExit(null);
+ });
+ }
+ });
+
+ 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.setCanvas(editorCanvas);
+ engine.setUnloadAfterInit(false); // Don't want to reload when starting game.
+ engine.init('godot.tools').then(function() {
+ if (zip) {
+ engine.copyToFS("/home/web_user/preload.zip", zip);
+ }
+ try {
+ // Avoid user creating project in the persistent root folder.
+ engine.copyToFS("/home/web_user/projects/keep", new Uint8Array());
+ } catch(e) {
+ // File exists
+ }
+ //selectVideoMode();
+ showTab('editor');
+ setLoaderEnabled(false);
+ engine.setOnExit(function() {
+ showTab('loader');
+ setLoaderEnabled(true);
+ });
+ engine.start('--video-driver', video_driver).then(function() {
+ setStatusMode('hidden');
+ initializing = false;
+ });
+ }).catch(displayFailureNotice);
+ }
+ };
+ document.getElementById("startButton").onclick = function() {
+ preloadZip(document.getElementById('zip-file')).then(function(zip) {
+ startEditor(zip);
+ });
+ }
+
+ 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();
+ }
+ });
+ }
+ //]]></script>
+</body>
+</html>
diff --git a/misc/dist/html/fixed-size.html b/misc/dist/html/fixed-size.html
index a5633115d5..85064b34fd 100644
--- a/misc/dist/html/fixed-size.html
+++ b/misc/dist/html/fixed-size.html
@@ -236,7 +236,6 @@ $GODOT_HEAD_INCLUDE
const DEBUG_ENABLED = $GODOT_DEBUG_ENABLED;
const INDETERMINATE_STATUS_STEP_MS = 100;
- var container = document.getElementById('container');
var canvas = document.getElementById('canvas');
var statusProgress = document.getElementById('status-progress');
var statusProgressInner = document.getElementById('status-progress-inner');
diff --git a/misc/dist/html/full-size.html b/misc/dist/html/full-size.html
index 435013cb5e..58cf8ba4d8 100644
--- a/misc/dist/html/full-size.html
+++ b/misc/dist/html/full-size.html
@@ -147,6 +147,7 @@ $GODOT_HEAD_INCLUDE
const MAIN_PACK = '$GODOT_BASENAME.pck';
const EXTRA_ARGS = JSON.parse('$GODOT_ARGS');
const INDETERMINATE_STATUS_STEP_MS = 100;
+ const FULL_WINDOW = $GODOT_FULL_WINDOW;
var canvas = document.getElementById('canvas');
var statusProgress = document.getElementById('status-progress');
@@ -156,6 +157,9 @@ $GODOT_HEAD_INCLUDE
var initializing = true;
var statusMode = 'hidden';
+ var lastWidth = 0;
+ var lastHeight = 0;
+ var lastScale = 0;
var animationCallbacks = [];
function animate(time) {
@@ -165,14 +169,23 @@ $GODOT_HEAD_INCLUDE
requestAnimationFrame(animate);
function adjustCanvasDimensions() {
- var scale = window.devicePixelRatio || 1;
- var width = window.innerWidth;
- var height = window.innerHeight;
- canvas.width = width * scale;
- canvas.height = height * scale;
+ const scale = window.devicePixelRatio || 1;
+ if (lastWidth != window.innerWidth || lastHeight != window.innerHeight || lastScale != scale) {
+ lastScale = scale;
+ lastWidth = window.innerWidth;
+ lastHeight = window.innerHeight;
+ canvas.width = Math.floor(lastWidth * scale);
+ canvas.height = Math.floor(lastHeight * scale);
+ canvas.style.width = lastWidth + "px";
+ canvas.style.height = lastHeight + "px";
+ }
+ }
+ if (FULL_WINDOW) {
+ animationCallbacks.push(adjustCanvasDimensions);
+ adjustCanvasDimensions();
+ } else {
+ engine.setCanvasResizedOnStart(true);
}
- animationCallbacks.push(adjustCanvasDimensions);
- adjustCanvasDimensions();
setStatusMode = function setStatusMode(mode) {
@@ -201,7 +214,7 @@ $GODOT_HEAD_INCLUDE
throw new Error('Invalid status mode');
}
statusMode = mode;
- }
+ };
function animateStatusIndeterminate(ms) {
diff --git a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
index 54dda2563d..d8da520ed7 100644
--- a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
+++ b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
@@ -12,6 +12,8 @@
$modules_buildfile
1FF8DBB11FBA9DE1009DE660 /* dummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FF8DBB01FBA9DE1009DE660 /* dummy.cpp */; };
D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D07CD44D1C5D589C00B7FB28 /* Images.xcassets */; };
+ 9039D3BE24C093AC0020482C /* MoltenVK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9039D3BD24C093AC0020482C /* MoltenVK.a */; };
+ 9073252C24BF980B0063BCD4 /* vulkan in Resources */ = {isa = PBXBuildFile; fileRef = 905036DC24BF932E00301046 /* vulkan */; };
D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */; };
D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7718AEBFEB004A7AAE /* $binary.pck */; };
$pbx_launch_screen_build_reference
@@ -37,6 +39,8 @@
$modules_fileref
1FF4C1881F584E6300A41E41 /* $binary.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "$binary.entitlements"; sourceTree = "<group>"; };
1FF8DBB01FBA9DE1009DE660 /* dummy.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = dummy.cpp; sourceTree = "<group>"; };
+ 9039D3BD24C093AC0020482C /* MoltenVK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = MoltenVK; path = MoltenVK.a; sourceTree = "<group>"; };
+ 905036DC24BF932E00301046 /* vulkan */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vulkan; path = "$binary/vulkan"; sourceTree = "<group>"; };
D07CD44D1C5D589C00B7FB28 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
D0BCFE3418AEBDA2004A7AAE /* $binary.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "$binary.app"; sourceTree = BUILT_PRODUCTS_DIR; };
D0BCFE4318AEBDA2004A7AAE /* $binary-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "$binary-Info.plist"; sourceTree = "<group>"; };
@@ -52,6 +56,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 9039D3BE24C093AC0020482C /* MoltenVK.a in Frameworks */,
DEADBEEF2F582BE20003B888 /* $binary.a */,
$modules_buildphase
$additional_pbx_frameworks_build
@@ -64,6 +69,7 @@
D0BCFE2B18AEBDA2004A7AAE = {
isa = PBXGroup;
children = (
+ 905036DC24BF932E00301046 /* vulkan */,
1F1575711F582BE20003B888 /* dylibs */,
D0BCFE7718AEBFEB004A7AAE /* $binary.pck */,
D0BCFE4118AEBDA2004A7AAE /* $binary */,
@@ -84,6 +90,7 @@
D0BCFE3618AEBDA2004A7AAE /* Frameworks */ = {
isa = PBXGroup;
children = (
+ 9039D3BD24C093AC0020482C /* MoltenVK.a */,
DEADBEEF1F582BE20003B888 /* $binary.a */,
$modules_buildgrp
$additional_pbx_frameworks_refs
@@ -248,6 +255,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 9073252C24BF980B0063BCD4 /* vulkan in Resources */,
D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */,
D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */,
$pbx_launch_screen_build_phase
@@ -319,7 +327,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
OTHER_LDFLAGS = "$linker_flags";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -358,7 +366,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
OTHER_LDFLAGS = "$linker_flags";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -378,7 +386,7 @@
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
DEVELOPMENT_TEAM = $team_id;
INFOPLIST_FILE = "$binary/$binary-Info.plist";
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -408,7 +416,7 @@
CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
DEVELOPMENT_TEAM = $team_id;
INFOPLIST_FILE = "$binary/$binary-Info.plist";
- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
diff --git a/misc/dist/ios_xcode/godot_ios/vulkan/icd.d/MoltenVK_icd.json b/misc/dist/ios_xcode/godot_ios/vulkan/icd.d/MoltenVK_icd.json
new file mode 100644
index 0000000000..7501cb548c
--- /dev/null
+++ b/misc/dist/ios_xcode/godot_ios/vulkan/icd.d/MoltenVK_icd.json
@@ -0,0 +1,7 @@
+{
+ "file_format_version" : "1.0.0",
+ "ICD": {
+ "library_path": "./../../Frameworks/MoltenVK.framework/MoltenVK",
+ "api_version" : "1.0.0"
+ }
+}
diff --git a/misc/dist/linux/x-godot-project.xml b/misc/dist/linux/x-godot-project.xml
index 0572e4e54e..9f28bab2ae 100644
--- a/misc/dist/linux/x-godot-project.xml
+++ b/misc/dist/linux/x-godot-project.xml
@@ -1,8 +1,8 @@
<?xml version="1.0"?>
- <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
- <mime-type type="application/x-godot-project">
- <comment>Godot Engine project</comment>
- <icon name="godot" />
- <glob pattern="*.godot" weight="100" />
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-godot-project">
+ <comment>Godot Engine project</comment>
+ <icon name="godot" />
+ <glob pattern="*.godot" weight="100" />
</mime-type>
</mime-info>
diff --git a/misc/dist/osx_tools.app/Contents/Info.plist b/misc/dist/osx_tools.app/Contents/Info.plist
index fd62bc0ef5..508586904c 100755
--- a/misc/dist/osx_tools.app/Contents/Info.plist
+++ b/misc/dist/osx_tools.app/Contents/Info.plist
@@ -111,7 +111,7 @@
<string>GDScript.icns</string>
<key>UTTypeConformsTo</key>
<array>
- <string>public.data</string>
+ <string>public.script</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
diff --git a/misc/scons/compilation_db.py b/misc/scons/compilation_db.py
deleted file mode 100644
index 87db32adc9..0000000000
--- a/misc/scons/compilation_db.py
+++ /dev/null
@@ -1,177 +0,0 @@
-# Copyright 2015 MongoDB Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import json
-import SCons
-import itertools
-
-# Implements the ability for SCons to emit a compilation database for the MongoDB project. See
-# http://clang.llvm.org/docs/JSONCompilationDatabase.html for details on what a compilation
-# database is, and why you might want one. The only user visible entry point here is
-# 'env.CompilationDatabase'. This method takes an optional 'target' to name the file that
-# should hold the compilation database, otherwise, the file defaults to compile_commands.json,
-# which is the name that most clang tools search for by default.
-
-# TODO: Is there a better way to do this than this global? Right now this exists so that the
-# emitter we add can record all of the things it emits, so that the scanner for the top level
-# compilation database can access the complete list, and also so that the writer has easy
-# access to write all of the files. But it seems clunky. How can the emitter and the scanner
-# communicate more gracefully?
-__COMPILATION_DB_ENTRIES = []
-
-# We make no effort to avoid rebuilding the entries. Someday, perhaps we could and even
-# integrate with the cache, but there doesn't seem to be much call for it.
-class __CompilationDbNode(SCons.Node.Python.Value):
- def __init__(self, value):
- SCons.Node.Python.Value.__init__(self, value)
- self.Decider(changed_since_last_build_node)
-
-
-def changed_since_last_build_node(child, target, prev_ni, node):
- """ Dummy decider to force always building"""
- return True
-
-
-def makeEmitCompilationDbEntry(comstr):
- """
- Effectively this creates a lambda function to capture:
- * command line
- * source
- * target
- :param comstr: unevaluated command line
- :return: an emitter which has captured the above
- """
- user_action = SCons.Action.Action(comstr)
-
- def EmitCompilationDbEntry(target, source, env):
- """
- This emitter will be added to each c/c++ object build to capture the info needed
- for clang tools
- :param target: target node(s)
- :param source: source node(s)
- :param env: Environment for use building this node
- :return: target(s), source(s)
- """
-
- dbtarget = __CompilationDbNode(source)
-
- entry = env.__COMPILATIONDB_Entry(
- target=dbtarget,
- source=[],
- __COMPILATIONDB_UTARGET=target,
- __COMPILATIONDB_USOURCE=source,
- __COMPILATIONDB_UACTION=user_action,
- __COMPILATIONDB_ENV=env,
- )
-
- # TODO: Technically, these next two lines should not be required: it should be fine to
- # cache the entries. However, they don't seem to update properly. Since they are quick
- # to re-generate disable caching and sidestep this problem.
- env.AlwaysBuild(entry)
- env.NoCache(entry)
-
- __COMPILATION_DB_ENTRIES.append(dbtarget)
-
- return target, source
-
- return EmitCompilationDbEntry
-
-
-def CompilationDbEntryAction(target, source, env, **kw):
- """
- Create a dictionary with evaluated command line, target, source
- and store that info as an attribute on the target
- (Which has been stored in __COMPILATION_DB_ENTRIES array
- :param target: target node(s)
- :param source: source node(s)
- :param env: Environment for use building this node
- :param kw:
- :return: None
- """
-
- command = env["__COMPILATIONDB_UACTION"].strfunction(
- target=env["__COMPILATIONDB_UTARGET"], source=env["__COMPILATIONDB_USOURCE"], env=env["__COMPILATIONDB_ENV"],
- )
-
- entry = {
- "directory": env.Dir("#").abspath,
- "command": command,
- "file": str(env["__COMPILATIONDB_USOURCE"][0]),
- }
-
- target[0].write(entry)
-
-
-def WriteCompilationDb(target, source, env):
- entries = []
-
- for s in __COMPILATION_DB_ENTRIES:
- entries.append(s.read())
-
- with open(str(target[0]), "w") as target_file:
- json.dump(entries, target_file, sort_keys=True, indent=4, separators=(",", ": "))
-
-
-def ScanCompilationDb(node, env, path):
- return __COMPILATION_DB_ENTRIES
-
-
-def generate(env, **kwargs):
-
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- env["COMPILATIONDB_COMSTR"] = kwargs.get("COMPILATIONDB_COMSTR", "Building compilation database $TARGET")
-
- components_by_suffix = itertools.chain(
- itertools.product(
- env["CPPSUFFIXES"],
- [
- (static_obj, SCons.Defaults.StaticObjectEmitter, "$CXXCOM"),
- (shared_obj, SCons.Defaults.SharedObjectEmitter, "$SHCXXCOM"),
- ],
- ),
- )
-
- for entry in components_by_suffix:
- suffix = entry[0]
- builder, base_emitter, command = entry[1]
-
- # Ensure we have a valid entry
- # used to auto ignore header files
- if suffix in builder.emitter:
- emitter = builder.emitter[suffix]
- builder.emitter[suffix] = SCons.Builder.ListEmitter([emitter, makeEmitCompilationDbEntry(command),])
-
- env["BUILDERS"]["__COMPILATIONDB_Entry"] = SCons.Builder.Builder(
- action=SCons.Action.Action(CompilationDbEntryAction, None),
- )
-
- env["BUILDERS"]["__COMPILATIONDB_Database"] = SCons.Builder.Builder(
- action=SCons.Action.Action(WriteCompilationDb, "$COMPILATIONDB_COMSTR"),
- target_scanner=SCons.Scanner.Scanner(function=ScanCompilationDb, node_class=None),
- )
-
- def CompilationDatabase(env, target):
- result = env.__COMPILATIONDB_Database(target=target, source=[])
-
- env.AlwaysBuild(result)
- env.NoCache(result)
-
- return result
-
- env.AddMethod(CompilationDatabase, "CompilationDatabase")
-
-
-def exists(env):
- return True
diff --git a/misc/scripts/black_format.sh b/misc/scripts/black_format.sh
index 04dfe32f60..f93e8cbc2a 100755
--- a/misc/scripts/black_format.sh
+++ b/misc/scripts/black_format.sh
@@ -16,11 +16,9 @@ PY_FILES=$(find \( -path "./.git" \
black -l 120 $PY_FILES
git diff > patch.patch
-FILESIZE="$(stat -c%s patch.patch)"
-MAXSIZE=5
# If no patch has been generated all is OK, clean up, and exit.
-if (( FILESIZE < MAXSIZE )); then
+if [ ! -s patch.patch ] ; then
printf "Files in this commit comply with the black style rules.\n"
rm -f patch.patch
exit 0
diff --git a/misc/scripts/clang_format.sh b/misc/scripts/clang_format.sh
index 5131f7fe33..e686305dea 100755
--- a/misc/scripts/clang_format.sh
+++ b/misc/scripts/clang_format.sh
@@ -39,11 +39,9 @@ while IFS= read -rd '' f; do
done
git diff > patch.patch
-FILESIZE="$(stat -c%s patch.patch)"
-MAXSIZE=5
# If no patch has been generated all is OK, clean up, and exit.
-if (( FILESIZE < MAXSIZE )); then
+if [ ! -s patch.patch ] ; then
printf "Files in this commit comply with the clang-format style rules.\n"
rm -f patch.patch
exit 0
diff --git a/misc/scripts/file_format.sh b/misc/scripts/file_format.sh
index 30988e51c6..c570ec23a7 100755
--- a/misc/scripts/file_format.sh
+++ b/misc/scripts/file_format.sh
@@ -1,7 +1,13 @@
#!/usr/bin/env bash
# This script ensures proper POSIX text file formatting and a few other things.
-# This is supplementary to clang-black-format.sh, but should be run before it.
+# This is supplementary to clang_format.sh and black_format.sh, but should be
+# run before them.
+
+# We need dos2unix and recode.
+if [ ! -x "$(command -v dos2unix)" -o ! -x "$(command -v recode)" ]; then
+ printf "Install 'dos2unix' and 'recode' to use this script.\n"
+fi
set -uo pipefail
IFS=$'\n\t'
@@ -25,26 +31,21 @@ while IFS= read -rd '' f; do
elif [[ "$f" == "platform/android/java/lib/src/com/google"* ]]; then
continue
fi
- # Ensures that files are UTF-8 formatted.
+ # Ensure that files are UTF-8 formatted.
recode UTF-8 "$f" 2> /dev/null
- # Ensures that files have LF line endings.
+ # Ensure that files have LF line endings and do not contain a BOM.
dos2unix "$f" 2> /dev/null
- # Ensures that files do not contain a BOM.
- sed -i '1s/^\xEF\xBB\xBF//' "$f"
- # Ensures that files end with newline characters.
- tail -c1 < "$f" | read -r _ || echo >> "$f";
- # Remove trailing space characters.
- sed -z -i 's/\x20\x0A/\x0A/g' "$f"
+ # Remove trailing space characters and ensures that files end
+ # with newline characters. -l option handles newlines conveniently.
+ perl -i -ple 's/\s*$//g' "$f"
# Remove the character sequence "== true" if it has a leading space.
- sed -z -i 's/\x20== true//g' "$f"
+ perl -i -pe 's/\x20== true//g' "$f"
done
git diff > patch.patch
-FILESIZE="$(stat -c%s patch.patch)"
-MAXSIZE=5
# If no patch has been generated all is OK, clean up, and exit.
-if (( FILESIZE < MAXSIZE )); then
+if [ ! -s patch.patch ] ; then
printf "Files in this commit comply with the formatting rules.\n"
rm -f patch.patch
exit 0