From d94727fbe5211f9a3fa8eb07f0ffc9cd2f62f8cf Mon Sep 17 00:00:00 2001 From: Furkan Calik <70354160+furkanCalik7@users.noreply.github.com> Date: Sun, 6 Oct 2024 20:23:39 +0300 Subject: [PATCH 01/29] Update using_transforms.rst to clarify rotate_local() axis usage --- tutorials/3d/using_transforms.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tutorials/3d/using_transforms.rst b/tutorials/3d/using_transforms.rst index c3e9f113638..1041109ae3e 100644 --- a/tutorials/3d/using_transforms.rst +++ b/tutorials/3d/using_transforms.rst @@ -201,6 +201,8 @@ To rotate relative to object space (the node's own transform), use the following // Rotate around the object's local X axis by 0.1 radians. RotateObjectLocal(new Vector3(1, 0, 0), 0.1f); +The axis should be defined in the local coordinate system of the object. For example, to rotate around the object's local X, Y, or Z axes, use ``Vector3.RIGHT`` for the X-axis, ``Vector3.UP`` for the Y-axis, and ``Vector3.FORWARD`` for the Z-axis. + Precision errors ================ From 32705a4f9dc25d3b970ebbd32e5b0abea471c92f Mon Sep 17 00:00:00 2001 From: Zach Coleman Date: Thu, 15 Aug 2024 12:19:10 -0700 Subject: [PATCH 02/29] Update handling_quit_requests.rst --- tutorials/inputs/handling_quit_requests.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tutorials/inputs/handling_quit_requests.rst b/tutorials/inputs/handling_quit_requests.rst index fae7f3cde32..e470e5f3f55 100644 --- a/tutorials/inputs/handling_quit_requests.rst +++ b/tutorials/inputs/handling_quit_requests.rst @@ -60,8 +60,10 @@ at any time by either the user or the OS. A way to plan ahead for this possibility is to utilize ``NOTIFICATION_APPLICATION_PAUSED`` in order to perform any needed actions as the app is being suspended. +.. note:: On iOS, you only have approximately 5 seconds to finish a task started by this signal. If you go over this allotment, iOS will kill the app instead of pausing it. + On Android, pressing the Back button will exit the application if -**Application > Config > Quit** On Go Back is checked in the Project Settings +**Application > Config > Quit On Go Back** is checked in the Project Settings (which is the default). This will fire ``NOTIFICATION_WM_GO_BACK_REQUEST``. From bb8c89f04c395f0bae1a1da7b5257483e52b7c04 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 17 Nov 2024 08:00:41 -0500 Subject: [PATCH 03/29] Update android export page for AAB requirement (#9637) * Update android export page for AAB requirement --------- Co-authored-by: Max Hilbrunner --- tutorials/export/exporting_for_android.rst | 36 ++++++++++------------ 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/tutorials/export/exporting_for_android.rst b/tutorials/export/exporting_for_android.rst index 2e90f36a2cd..2a95927f4b9 100644 --- a/tutorials/export/exporting_for_android.rst +++ b/tutorials/export/exporting_for_android.rst @@ -121,8 +121,11 @@ This way, your application will look great on all Android devices and versions. Exporting for Google Play Store ------------------------------- -Uploading an APK to Google's Play Store requires you to sign using a non-debug -keystore file; such file can be generated like this: +All new apps uploaded to Google Play after August 2021 must be an AAB (Android App Bundle) +file. + +Uploading an AAB or APK to Google's Play Store requires you to sign using a non-debug +keystore file; such a file can be generated like this: .. code-block:: shell @@ -130,7 +133,7 @@ keystore file; such file can be generated like this: This keystore and key are used to verify your developer identity, remember the password and keep it in a safe place! It is suggested to use only upper and lowercase letters and numbers. Special characters may cause errors. -Use Google's Android Developer guides to learn more about `APK signing `__. +Use Google's Android Developer guides to learn more about `app signing `__. Now fill in the following forms in your Android Export Presets: @@ -144,22 +147,17 @@ Don't forget to uncheck the **Export With Debug** checkbox while exporting. .. image:: img/export-with-debug-button.png -Optimizing the APK size ------------------------ - -By default, the APK will contain native libraries for both ARMv7 and ARMv8 -architectures. This increases its size significantly. To create a smaller APK, -uncheck either **Armeabi-v 7a** or **Arm 64 -v 8a** in your project's Android -export preset. This will create an APK that only contains a library for -a single architecture. Note that applications targeting ARMv7 can also run on -ARMv8 devices, but the opposite is not true. - -Since August 2019, Google Play requires all applications to be available in -64-bit form. This means you cannot upload an APK that contains *just* an ARMv7 -library. To solve this, you can upload several APKs to Google Play using its -`Multiple APK support `__. -Each APK should target a single architecture; creating an APK for ARMv7 -and ARMv8 is usually sufficient to cover most devices in use today. +Optimizing the file size +------------------------ + +If you're working with APKs and not AABs, by default, the APK will contain native +libraries for both ARMv7 and ARMv8 architectures. This increases its size significantly. +To create a smaller file, uncheck either **Armeabi-v 7a** or **Arm 64 -v 8a** in +your project's Android export preset. This will create an APK that only contains +a library for a single architecture. Note that applications targeting ARMv7 can +also run on ARMv8 devices, but the opposite is not true. The reason you don't do +this to save space with AABs is that Google automatically splits up the AAB on their +backend, so the user only downloads what they need. You can optimize the size further by compiling an Android export template with only the features you need. See :ref:`doc_optimizing_for_size` for more From 3c0106b92d08af1fc0b5d164ac893117ffeace25 Mon Sep 17 00:00:00 2001 From: ntlblpm Date: Sun, 17 Nov 2024 18:30:24 -0500 Subject: [PATCH 04/29] Update vectors_advanced.rst --- tutorials/math/vectors_advanced.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/math/vectors_advanced.rst b/tutorials/math/vectors_advanced.rst index 1d0b80ed302..58372106721 100644 --- a/tutorials/math/vectors_advanced.rst +++ b/tutorials/math/vectors_advanced.rst @@ -23,7 +23,7 @@ because of its usage. (Just like we call (0,0) the Origin!). The plane passes by the origin and the surface of it is perpendicular to the unit vector (or *normal*). The -side towards the vector points to is the positive half-space, while the +side the vector points to is the positive half-space, while the other side is the negative half-space. In 3D this is exactly the same, except that the plane is an infinite surface (imagine an infinite, flat sheet of paper that you can orient and is pinned to the origin) instead From fec6259365002a7b37da6081670e3bd5d14e5c47 Mon Sep 17 00:00:00 2001 From: ntlblpm Date: Sun, 17 Nov 2024 18:54:28 -0500 Subject: [PATCH 05/29] Update matrices_and_transforms.rst --- tutorials/math/matrices_and_transforms.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/math/matrices_and_transforms.rst b/tutorials/math/matrices_and_transforms.rst index 05f4c0dd879..7443dd012aa 100644 --- a/tutorials/math/matrices_and_transforms.rst +++ b/tutorials/math/matrices_and_transforms.rst @@ -352,7 +352,7 @@ from X*1 + Y*-1, which is (1, 0) - (1, 1), or (1 - 1, 0 - 1), or (0, -1). This matches up with our observation of where the top-right corner of the image is. -Hopefully you now fully understand the how a transformation matrix affects +Hopefully you now fully understand how a transformation matrix affects the object, and the relationship between the basis vectors and how the object's "UV" or "intra-coordinates" have their world position changed. From e163152e0338d06994d511643be23bcfed6d2fcd Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Mon, 18 Nov 2024 20:20:10 +0100 Subject: [PATCH 06/29] Document `rand_weighted()` in Random number generation (#10283) * Document `rand_weighted()` in Random number generation --------- Co-authored-by: Max Hilbrunner --- tutorials/math/random_number_generation.rst | 58 ++++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/tutorials/math/random_number_generation.rst b/tutorials/math/random_number_generation.rst index b9abb724979..a12f43eb3a1 100644 --- a/tutorials/math/random_number_generation.rst +++ b/tutorials/math/random_number_generation.rst @@ -33,6 +33,9 @@ Global scope methods are easier to set up, but they don't offer as much control. RandomNumberGenerator requires more code to use, but allows creating multiple instances, each with their own seed and state. +This tutorial uses global scope methods, except when the method only exists in +the RandomNumberGenerator class. + The randomize() method ---------------------- @@ -81,6 +84,7 @@ across runs: public override void _Ready() { GD.Seed(12345); + // To use a string as a seed, you can hash it to a number. GD.Seed("Hello world".Hash()); } @@ -105,9 +109,9 @@ Let's look at some of the most commonly used functions and methods to generate random numbers in Godot. The function :ref:`randi() ` returns a random -number between 0 and 2^32-1. Since the maximum value is huge, you most likely -want to use the modulo operator (``%``) to bound the result between 0 and the -denominator: +number between ``0`` and ``2^32 - 1``. Since the maximum value is huge, you most +likely want to use the modulo operator (``%``) to bound the result between 0 and +the denominator: .. tabs:: .. code-tab:: gdscript GDScript @@ -145,7 +149,7 @@ varying by the deviation (1.0 by default): .. code-tab:: csharp - // Prints a normally distributed floating-point number between 0.0 and 1.0. + // Prints a random floating-point number from a normal distribution with a mean of 0.0 and deviation of 1.0. GD.Print(GD.Randfn()); :ref:`randf_range() ` takes two arguments @@ -174,7 +178,7 @@ and ``to``, and returns a random integer between ``from`` and ``to``: .. code-tab:: csharp - // Prints a random integer number between -10 and 10. + // Prints a random integer between -10 and 10. GD.Print(GD.RandiRange(-10, 10)); Get a random array element @@ -255,7 +259,7 @@ prevent repetition: func get_fruit(): var random_fruit = _fruits[randi() % _fruits.size()] while random_fruit == _last_fruit: - # The last fruit was picked, try again until we get a different fruit. + # The last fruit was picked. Try again until we get a different fruit. random_fruit = _fruits[randi() % _fruits.size()] # Note: if the random element to pick is passed by reference, @@ -286,7 +290,7 @@ prevent repetition: string randomFruit = _fruits[GD.Randi() % _fruits.Length]; while (randomFruit == _lastFruit) { - // The last fruit was picked, try again until we get a different fruit. + // The last fruit was picked. Try again until we get a different fruit. randomFruit = _fruits[GD.Randi() % _fruits.Length]; } @@ -379,7 +383,7 @@ floating-point number between 0.0 and 1.0. We can use this to create a } else if (randomFloat < 0.95f) { - // 15% chance of being returned + // 15% chance of being returned. return "Uncommon"; } else @@ -389,6 +393,44 @@ floating-point number between 0.0 and 1.0. We can use this to create a } } +You can also get a weighted random *index* using the +:ref:`rand_weighted() ` method +on a RandomNumberGenerator instance. This returns a random integer +between 0 and the size of the array that is passed as a parameter. Each value in the +array is a floating-point number that represents the *relative* likelihood that it +will be returned as an index. A higher value means the value is more likely to be +returned as an index, while a value of ``0`` means it will never be returned as an index. + +For example, if ``[0.5, 1, 1, 2]`` is passed as a parameter, then the method is twice +as likely to return ``3`` (the index of the value ``2``) and twice as unlikely to return +``0`` (the index of the value ``0.5``) compared to the indices ``1`` and ``2``. + +Since the returned value matches the array's size, it can be used as an index to +get a value from another array as follows: + +.. tabs:: + .. code-tab:: gdscript GDScript + + # Prints a random element using the weighted index that is returned by `rand_weighted()`. + # Here, "apple" will be returned twice as rarely as "orange" and "pear". + # "banana" is twice as common as "orange" and "pear", and four times as common as "apple". + var fruits = ["apple", "orange", "pear", "banana"] + var probabilities = [0.5, 1, 1, 2]; + + var random = RandomNumberGenerator.new() + print(fruits[random.rand_weighted(probabilities)]) + + .. code-tab:: csharp + + // Prints a random element using the weighted index that is returned by `RandWeighted()`. + // Here, "apple" will be returned twice as rarely as "orange" and "pear". + // "banana" is twice as common as "orange" and "pear", and four times as common as "apple". + string[] fruits = { "apple", "orange", "pear", "banana" }; + float[] probabilities = { 0.5, 1, 1, 2 }; + + var random = new RandomNumberGenerator(); + GD.Print(fruits[random.RandWeighted(probabilities)]); + .. _doc_random_number_generation_shuffle_bags: "Better" randomness using shuffle bags From 8b1a1b644c8587ff2a88c9eb5cb3b33d1080d0e5 Mon Sep 17 00:00:00 2001 From: Mark Wilson <23439518+wlsnmrk@users.noreply.github.com> Date: Sun, 8 Oct 2023 17:51:46 -0400 Subject: [PATCH 07/29] Improved style for cross-language examples. * Replaced "foo"/"bar" example values with "my value". * Changed C# public field to property and GDScript to match. * Used PascalCase for C# property. * Used camelCase for C# local variable. * Used "var" for C# local variable declarations. * Used PascalCase for GDScript class/script variable. * Improved clarity of comments documenting expected output. * Eliminated horizontal scroll in C# code example. * Fixed a comma splice in the page text. * Removed an out-of-date warning block. --- .../scripting/cross_language_scripting.rst | 74 +++++++++++-------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/tutorials/scripting/cross_language_scripting.rst b/tutorials/scripting/cross_language_scripting.rst index 8b193e1b86c..fd9f5bb5537 100644 --- a/tutorials/scripting/cross_language_scripting.rst +++ b/tutorials/scripting/cross_language_scripting.rst @@ -16,7 +16,11 @@ The following two scripts will be used as references throughout this page. extends Node - var my_field: String = "foo" + var my_property: String = "my gdscript value": + get: + return my_property + set(value): + my_property = value signal my_signal @@ -40,7 +44,7 @@ The following two scripts will be used as references throughout this page. public partial class MyCSharpNode : Node { - public string myField = "bar"; + public string MyProperty { get; set; } = "my c# value"; [Signal] public delegate void MySignalEventHandler(); @@ -86,8 +90,8 @@ with :ref:`new() `. .. code-block:: gdscript - var my_csharp_script = load("res://Path/To/MyCSharpNode.cs") - var my_csharp_node = my_csharp_script.new() + var MyCSharpScript = load("res://Path/To/MyCSharpNode.cs") + var my_csharp_node = MyCSharpScript.new() .. warning:: @@ -112,8 +116,8 @@ be instantiated with :ref:`GDScript.New() `. .. code-block:: csharp - GDScript MyGDScript = GD.Load("res://path/to/my_gd_script.gd"); - GodotObject myGDScriptNode = (GodotObject)MyGDScript.New(); // This is a GodotObject. + var myGDScript = GD.Load("res://path/to/my_gd_script.gd"); + var myGDScriptNode = (GodotObject)myGDScript.New(); // This is a GodotObject. Here we are using an :ref:`class_Object`, but you can use type conversion like explained in :ref:`doc_c_sharp_features_type_conversion_and_casting`. @@ -129,22 +133,26 @@ anything to worry about. .. code-block:: gdscript - print(my_csharp_node.myField) # bar - my_csharp_node.myField = "BAR" - print(my_csharp_node.myField) # BAR + # Output: "my c# value". + print(my_csharp_node.MyProperty) + my_csharp_node.MyProperty = "MY C# VALUE" + # Output: "MY C# VALUE". + print(my_csharp_node.MyProperty) Accessing GDScript fields from C# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As C# is statically typed, accessing GDScript from C# is a bit more -convoluted, you will have to use :ref:`GodotObject.Get() ` +convoluted. You will have to use :ref:`GodotObject.Get() ` and :ref:`GodotObject.Set() `. The first argument is the name of the field you want to access. .. code-block:: csharp - GD.Print(myGDScriptNode.Get("my_field")); // foo - myGDScriptNode.Set("my_field", "FOO"); - GD.Print(myGDScriptNode.Get("my_field")); // FOO + // Output: "my gdscript value". + GD.Print(myGDScriptNode.Get("my_property")); + myGDScriptNode.Set("my_property", "MY GDSCRIPT VALUE"); + // Output: "MY GDSCRIPT VALUE". + GD.Print(myGDScriptNode.Get("my_property")); Keep in mind that when setting a field value you should only use types the GDScript side knows about. @@ -163,13 +171,18 @@ If that's impossible, you'll see the following error: ``Invalid call. Nonexisten .. code-block:: gdscript - my_csharp_node.PrintNodeName(self) # myGDScriptNode - # my_csharp_node.PrintNodeName() # This line will fail. + # Output: "my_gd_script_node" (or name of node where this code is placed). + my_csharp_node.PrintNodeName(self) + # This line will fail. + # my_csharp_node.PrintNodeName() - my_csharp_node.PrintNTimes("Hello there!", 2) # Hello there! Hello there! + # Outputs "Hello there!" twice, once per line. + my_csharp_node.PrintNTimes("Hello there!", 2) - my_csharp_node.PrintArray(["a", "b", "c"]) # a, b, c - my_csharp_node.PrintArray([1, 2, 3]) # 1, 2, 3 + # Output: "a", "b", "c" (one per line). + my_csharp_node.PrintArray(["a", "b", "c"]) + # Output: "1", "2", "3" (one per line). + my_csharp_node.PrintArray([1, 2, 3]) Calling GDScript methods from C# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -181,22 +194,21 @@ to said method. .. code-block:: csharp - myGDScriptNode.Call("print_node_name", this); // my_csharp_node - // myGDScriptNode.Call("print_node_name"); // This line will fail silently and won't error out. + // Output: "MyCSharpNode" (or name of node where this code is placed). + myGDScriptNode.Call("print_node_name", this); + // This line will fail silently and won't error out. + // myGDScriptNode.Call("print_node_name"); - myGDScriptNode.Call("print_n_times", "Hello there!", 2); // Hello there! Hello there! + // Outputs "Hello there!" twice, once per line. + myGDScriptNode.Call("print_n_times", "Hello there!", 2); string[] arr = new string[] { "a", "b", "c" }; - myGDScriptNode.Call("print_array", arr); // a, b, c - myGDScriptNode.Call("print_array", new int[] { 1, 2, 3 }); // 1, 2, 3 - // Note how the type of each array entry does not matter as long as it can be handled by the marshaller. - -.. warning:: - - As you can see, if the first argument of the called method is an array, - you'll need to cast it as ``object``. - Otherwise, each element of your array will be treated as a single argument - and the function signature won't match. + // Output: "a", "b", "c" (one per line). + myGDScriptNode.Call("print_array", arr); + // Output: "1", "2", "3" (one per line). + myGDScriptNode.Call("print_array", new int[] { 1, 2, 3 }); + // Note how the type of each array entry does not matter + // as long as it can be handled by the marshaller. .. _connecting_to_signals_cross_language: From eb2a0a003c15ad224f56fe272f406a45a54b7625 Mon Sep 17 00:00:00 2001 From: tetrapod00 <145553014+tetrapod00@users.noreply.github.com> Date: Tue, 19 Nov 2024 11:58:55 -0800 Subject: [PATCH 08/29] Fix wrong editor setting in Overview of Debugging Tools --- tutorials/scripting/debug/overview_of_debugging_tools.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/scripting/debug/overview_of_debugging_tools.rst b/tutorials/scripting/debug/overview_of_debugging_tools.rst index aef754601d6..e0e13e01b8e 100644 --- a/tutorials/scripting/debug/overview_of_debugging_tools.rst +++ b/tutorials/scripting/debug/overview_of_debugging_tools.rst @@ -223,7 +223,7 @@ The **Break** button causes a break in the script like a breakpoint would. a function if possible. Otherwise, it does the same thing as **Step Over**. The **Debug with External Editor** option lets you debug your game with an external editor. -This option is also accessible in **Editor Settings > Debugger**. +You can set a shortcut for it in **Editor Settings > Shortcuts > Debugger**. When the debugger breaks on a breakpoint, a green triangle arrow is visible in the script editor's gutter. This arrow indicates the line of code the debugger From 4f1c98685d07edcccaf678bd3e0a45a6357867a4 Mon Sep 17 00:00:00 2001 From: tetrapod00 <145553014+tetrapod00@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:52:03 -0800 Subject: [PATCH 09/29] Remove performance comparison from C# Basics --- tutorials/scripting/c_sharp/c_sharp_basics.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tutorials/scripting/c_sharp/c_sharp_basics.rst b/tutorials/scripting/c_sharp/c_sharp_basics.rst index 224ec48a393..54047a6ff20 100644 --- a/tutorials/scripting/c_sharp/c_sharp_basics.rst +++ b/tutorials/scripting/c_sharp/c_sharp_basics.rst @@ -357,12 +357,6 @@ You can read more about this error on the `C# language reference `_, -the performance of C# in Godot — while generally in the same order of magnitude -— is roughly **~4×** that of GDScript in some naive cases. C++ is still -a little faster; the specifics are going to vary according to your use case. -GDScript is likely fast enough for most general scripting workloads. - Most properties of Godot C# objects that are based on ``GodotObject`` (e.g. any ``Node`` like ``Control`` or ``Node3D`` like ``Camera3D``) require native (interop) calls as they talk to Godot's C++ core. From d1042305d637d87a82da150e7bea5e19da18cb94 Mon Sep 17 00:00:00 2001 From: Jonathan Sekela Date: Sat, 28 Sep 2024 23:31:43 -0400 Subject: [PATCH 10/29] Add dev_build and dev_mode flags to scons compilation instructions for desktop editor pages --- .../development/compiling/compiling_for_linuxbsd.rst | 6 ++++++ contributing/development/compiling/compiling_for_macos.rst | 6 ++++++ .../development/compiling/compiling_for_windows.rst | 6 ++++++ .../compiling/introduction_to_the_buildsystem.rst | 2 ++ 4 files changed, 20 insertions(+) diff --git a/contributing/development/compiling/compiling_for_linuxbsd.rst b/contributing/development/compiling/compiling_for_linuxbsd.rst index f3fcbc3f368..432c198ef52 100644 --- a/contributing/development/compiling/compiling_for_linuxbsd.rst +++ b/contributing/development/compiling/compiling_for_linuxbsd.rst @@ -248,6 +248,12 @@ Start a terminal, go to the root dir of the engine source code and type: ``linuxbsd``. If you are looking to compile Godot 3.x, make sure to use the `3.x branch of this documentation `__. +.. tip:: + If you are compiling Godot to make changes or contribute to the engine, + you may want to use the SCons options ``dev_build=yes`` or ``dev_mode=yes``. + See :ref:`doc_introduction_to_the_buildsystem_development_and_production_aliases` + for more info. + If all goes well, the resulting binary executable will be placed in the "bin" subdirectory. This executable file contains the whole engine and runs without any dependencies. Executing it will bring up the Project diff --git a/contributing/development/compiling/compiling_for_macos.rst b/contributing/development/compiling/compiling_for_macos.rst index 65ae80af523..41f6023098f 100644 --- a/contributing/development/compiling/compiling_for_macos.rst +++ b/contributing/development/compiling/compiling_for_macos.rst @@ -59,6 +59,12 @@ To support both architectures in a single "Universal 2" binary, run the above tw lipo -create bin/godot.macos.editor.x86_64 bin/godot.macos.editor.arm64 -output bin/godot.macos.editor.universal +.. tip:: + If you are compiling Godot to make changes or contribute to the engine, + you may want to use the SCons options ``dev_build=yes`` or ``dev_mode=yes``. + See :ref:`doc_introduction_to_the_buildsystem_development_and_production_aliases` + for more info. + If all goes well, the resulting binary executable will be placed in the ``bin/`` subdirectory. This executable file contains the whole engine and runs without any dependencies. Executing it will bring up the Project diff --git a/contributing/development/compiling/compiling_for_windows.rst b/contributing/development/compiling/compiling_for_windows.rst index d212027a75e..7b26863bb3b 100644 --- a/contributing/development/compiling/compiling_for_windows.rst +++ b/contributing/development/compiling/compiling_for_windows.rst @@ -146,6 +146,12 @@ the engine source code (using ``cd``) and type: .. note:: When compiling with multiple CPU threads, SCons may warn about pywin32 being missing. You can safely ignore this warning. +.. tip:: + If you are compiling Godot to make changes or contribute to the engine, + you may want to use the SCons options ``dev_build=yes`` or ``dev_mode=yes``. + See :ref:`doc_introduction_to_the_buildsystem_development_and_production_aliases` + for more info. + If all goes well, the resulting binary executable will be placed in ``C:\godot\bin\`` with the name ``godot.windows.editor.x86_32.exe`` or ``godot.windows.editor.x86_64.exe``. By default, SCons will build a binary matching diff --git a/contributing/development/compiling/introduction_to_the_buildsystem.rst b/contributing/development/compiling/introduction_to_the_buildsystem.rst index 2b01c0f8a59..73ec7587f7f 100644 --- a/contributing/development/compiling/introduction_to_the_buildsystem.rst +++ b/contributing/development/compiling/introduction_to_the_buildsystem.rst @@ -139,6 +139,8 @@ run projects but does not include the editor or the Project Manager. scons platform= target=editor/template_debug/template_release +.. _doc_introduction_to_the_buildsystem_development_and_production_aliases: + Development and production aliases ---------------------------------- From 3eb1469ed0620b61e42c9c4170c869a5aeed19a3 Mon Sep 17 00:00:00 2001 From: tetrapod00 <145553014+tetrapod00@users.noreply.github.com> Date: Mon, 18 Nov 2024 18:22:30 -0800 Subject: [PATCH 11/29] Add FAQ entry "Which programming language is fastest?" Compares the performance of C#, GDScript, and C++. Co-Authored-By: Hugo Locurcio Co-Authored-By: Andre Sacilotto <66838864+andresacilotto@users.noreply.github.com> --- about/faq.rst | 32 +++++++++++++++++++ .../scripting/c_sharp/c_sharp_basics.rst | 5 +++ 2 files changed, 37 insertions(+) diff --git a/about/faq.rst b/about/faq.rst index a5864dba9b4..a491bdbb854 100644 --- a/about/faq.rst +++ b/about/faq.rst @@ -167,6 +167,38 @@ The main reasons for creating a custom scripting language for Godot were: GDScript was designed to curtail the issues above, and more. +.. _doc_faq_which_programming_language_is_fastest: + +Which programming language is fastest? +-------------------------------------- + +In most games, the *scripting language* itself is not the cause of performance +problems. Instead, performance is slowed by inefficient algorithms (which are +slow in all languages), by GPU performance, or by the common C++ engine code +like physics or navigation. All languages supported by Godot are fast enough for +general-purpose scripting. You should choose a language based on other factors, +like ease-of-use, familiarity, platform support, or language features. + +In general, the performance of C# and GDScript is within the same order of +magnitude, and C++ is faster than both. + +Comparing GDScript performance to C# is tricky, since C# can be faster in some +specific cases. The C# *language* itself tends to be faster than GDScript, which +means that C# can be faster in situations with few calls to Godot engine code. +However, C# can be slower than GDScript when making many Godot API calls, due +to the cost of *marshalling*. C#'s performance can also be brought down by garbage +collection which occurs at random and unpredictable moments. This can result in +stuttering issues in complex projects, and is not exclusive to Godot. + +C++, using :ref:`GDExtension `, will almost always be +faster than either C# or GDScript. However, C++ is less easy to use than C# or +GDScript, and is slower to develop with. + +You can also use multiple languages within a single project, with +:ref:`cross-language scripting `, or by using +GDExtension and scripting languages together. Be aware that doing so comes with +its own complications. + What 3D model formats does Godot support? ----------------------------------------- diff --git a/tutorials/scripting/c_sharp/c_sharp_basics.rst b/tutorials/scripting/c_sharp/c_sharp_basics.rst index 54047a6ff20..274a4f0aa4d 100644 --- a/tutorials/scripting/c_sharp/c_sharp_basics.rst +++ b/tutorials/scripting/c_sharp/c_sharp_basics.rst @@ -357,6 +357,11 @@ You can read more about this error on the `C# language reference Date: Thu, 21 Nov 2024 06:34:12 +0530 Subject: [PATCH 12/29] Clarify Area2D warning behavior (#10173) * Clarify Area2D warning behavior * Apply suggestions from code review --------- Co-authored-by: tetrapod <145553014+tetrapod00@users.noreply.github.com> --- .../first_2d_game/02.player_scene.rst | 15 +++++++++++++-- .../first_2d_game/img/no_shape_warning.webp | Bin 0 -> 15010 bytes 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 getting_started/first_2d_game/img/no_shape_warning.webp diff --git a/getting_started/first_2d_game/02.player_scene.rst b/getting_started/first_2d_game/02.player_scene.rst index 20799618811..24612d023bb 100644 --- a/getting_started/first_2d_game/02.player_scene.rst +++ b/getting_started/first_2d_game/02.player_scene.rst @@ -20,8 +20,16 @@ what the object *is*. Click the "Other Node" button and add an :ref:`Area2D .. image:: img/add_node.webp -Godot will display a warning icon next to the node in the scene tree. You can -ignore it for now. We will address it later. +When you add the ``Area2D`` node, Godot will display the following **warning icon** +next to it in the scene tree: + +.. image:: img/no_shape_warning.webp + +This warning tells us that the ``Area2D`` node requires a shape to detect collisions or overlaps. +We can **ignore the warning temporarily** because we will first set up the player's visuals +(using an animated sprite). Once the visuals are ready, we will add a collision shape as a child +node. This will allow us to accurately size and position the shape based on the sprite’s appearance. + With ``Area2D`` we can detect objects that overlap or run into the player. Change the node's name to ``Player`` by double-clicking on it. Now that we've @@ -98,6 +106,9 @@ When you're finished, your ``Player`` scene should look like this: .. image:: img/player_scene_nodes.webp +Once this is done, the warning on the ``Area2D`` node will disappear, as it now has +a shape assigned and can interact with other objects. + Make sure to save the scene again after these changes. In the next part, we'll add a script to the player node to move and animate it. diff --git a/getting_started/first_2d_game/img/no_shape_warning.webp b/getting_started/first_2d_game/img/no_shape_warning.webp new file mode 100644 index 0000000000000000000000000000000000000000..5caa74b07786b8e1dd7e5c5374bd55e1c58a17ae GIT binary patch literal 15010 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 literal 0 HcmV?d00001 From ce1be2c6e505a6348b05e5a55fa41f381dca285d Mon Sep 17 00:00:00 2001 From: tetrapod00 <145553014+tetrapod00@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:49:01 -0800 Subject: [PATCH 13/29] Add GDScript naming convention summary table Co-Authored-By: Edwin <60202421+emarino135@users.noreply.github.com> Co-Authored-By: Hugo Locurcio --- .../gdscript/gdscript_styleguide.rst | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tutorials/scripting/gdscript/gdscript_styleguide.rst b/tutorials/scripting/gdscript/gdscript_styleguide.rst index 89c4eb4dc4c..9dd84ad05da 100644 --- a/tutorials/scripting/gdscript/gdscript_styleguide.rst +++ b/tutorials/scripting/gdscript/gdscript_styleguide.rst @@ -620,7 +620,29 @@ Naming conventions These naming conventions follow the Godot Engine style. Breaking these will make your code clash with the built-in naming conventions, leading to inconsistent -code. +code. As a summary table: + ++---------------+----------------+----------------------------------------------------+ +| Type | Convention | Example | ++===============+================+====================================================+ +| File names | snake_case | ``yaml_parser.gd`` | ++---------------+----------------+----------------------------------------------------+ +| Class names | PascalCase | ``class_name YAMLParser`` | ++---------------+----------------+----------------------------------------------------+ +| Node names | PascalCase | ``Camera3D``, ``Player`` | ++---------------+----------------+----------------------------------------------------+ +| Functions | snake_case | ``func load_level():`` | ++---------------+----------------+----------------------------------------------------+ +| Variables | snake_case | ``var particle_effect`` | ++---------------+----------------+----------------------------------------------------+ +| Signals | snake_case | ``signal door_opened`` | ++---------------+----------------+----------------------------------------------------+ +| Constants | CONSTANT_CASE | ``const MAX_SPEED = 200`` | ++---------------+----------------+----------------------------------------------------+ +| Enum names | PascalCase | ``enum Element`` | ++---------------+----------------+----------------------------------------------------+ +| Enum members | CONSTANT_CASE | ``{EARTH, WATER, AIR, FIRE}`` | ++---------------+----------------+----------------------------------------------------+ File names ~~~~~~~~~~ From d560aac2cc960eb10e54b4c417953cc9826d84a4 Mon Sep 17 00:00:00 2001 From: mechalynx <8427257+mechalynx@users.noreply.github.com> Date: Fri, 22 Nov 2024 03:21:58 +0200 Subject: [PATCH 14/29] Update PackedArray explanation to match Godot 4.0 behavior (#10304) Add paragraphs describing the differences between PackedArray and normal or typed Array. --------- Co-authored-by: tetrapod <145553014+tetrapod00@users.noreply.github.com> --- .../scripting/gdscript/gdscript_basics.rst | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/tutorials/scripting/gdscript/gdscript_basics.rst b/tutorials/scripting/gdscript/gdscript_basics.rst index 6e008105e91..4c28b531c51 100644 --- a/tutorials/scripting/gdscript/gdscript_basics.rst +++ b/tutorials/scripting/gdscript/gdscript_basics.rst @@ -878,12 +878,26 @@ native or user class, or enum. Nested array types (like ``Array[Array[int]]``) a Packed arrays ^^^^^^^^^^^^^ -GDScript arrays are allocated linearly in memory for speed. -Large arrays (more than tens of thousands of elements) may however cause -memory fragmentation. If this is a concern, special types of -arrays are available. These only accept a single data type. They avoid memory -fragmentation and use less memory, but are atomic and tend to run slower than generic -arrays. They are therefore only recommended to use for large data sets: +PackedArrays are generally faster to iterate on and modify compared to a typed +Array of the same type (e.g. PackedInt64Array versus Array[int]) and consume +less memory. In the worst case, they are expected to be as fast as an untyped +Array. Conversely, non-Packed Arrays (typed or not) have extra convenience +methods such as :ref:`Array.map ` that PackedArrays +lack. Consult the :ref:`class reference ` for details +on the methods available. Typed Arrays are generally faster to iterate on and +modify than untyped Arrays. + +While all Arrays can cause memory fragmentation when they become large enough, +if memory usage and performance (iteration and modification speed) is a concern +and the type of data you're storing is compatible with one of the ``Packed`` +Array types, then using those may yield improvements. However, if you do not +have such concerns (e.g. the size of your array does not reach the tens of +thousands of elements) it is likely more helpful to use regular or typed +Arrays, as they provide convenience methods that can make your code easier to +write and maintain (and potentially faster if your data requires such +operations a lot). If the data you will store is of a known type (including +your own defined classes), prefer to use a typed Array as it may yield better +performance in iteration and modification compared to an untyped Array. - :ref:`PackedByteArray `: An array of bytes (integers from 0 to 255). - :ref:`PackedInt32Array `: An array of 32-bit integers. From 250aefc23fca3c36db56c507fefdef1862896244 Mon Sep 17 00:00:00 2001 From: "Yevhen Babiichuk (DustDFG)" Date: Fri, 22 Nov 2024 18:26:30 +0200 Subject: [PATCH 15/29] Delete mention of OpenGL ES 2 --- tutorials/performance/using_multimesh.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tutorials/performance/using_multimesh.rst b/tutorials/performance/using_multimesh.rst index 9e9d355ad16..b48e8cd0d49 100644 --- a/tutorials/performance/using_multimesh.rst +++ b/tutorials/performance/using_multimesh.rst @@ -17,8 +17,7 @@ MultiMeshes ----------- A :ref:`MultiMesh` is a single draw primitive that can draw up to millions -of objects in one go. It's extremely efficient because it uses the GPU hardware to do this -(in OpenGL ES 2.0, it's less efficient because there is no hardware support for it, though). +of objects in one go. It's extremely efficient because it uses the GPU hardware to do this. The only drawback is that there is no *screen* or *frustum* culling possible for individual instances. This means, that millions of objects will be *always* or *never* drawn, depending on the visibility From d9964f7b1832d678c01ae913ee40d46e418e05c8 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 16 Oct 2024 17:47:03 +0200 Subject: [PATCH 16/29] Mention documentation comments in GDScript basics --- tutorials/scripting/gdscript/gdscript_basics.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tutorials/scripting/gdscript/gdscript_basics.rst b/tutorials/scripting/gdscript/gdscript_basics.rst index 4c28b531c51..8c6947de20b 100644 --- a/tutorials/scripting/gdscript/gdscript_basics.rst +++ b/tutorials/scripting/gdscript/gdscript_basics.rst @@ -565,6 +565,21 @@ considered a comment. The list of highlighted keywords and their colors can be changed in the **Text Editor > Theme > Comment Markers** section of the Editor Settings. +Use two hash symbols (``##``) instead of one (``#``) to add a *documentation +comment*, which will appear in the script documentation and in the inspector +description of an exported variable. Documentation comments must be placed +directly *above* a documentable item (such as a member variable), or at the top +of a file. Dedicated formatting options are also available. See +:ref:`doc_gdscript_documentation_comments` for details. + + +:: + ## This comment will appear in the script documentation. + var value + + ## This comment will appear in the inspector tooltip, and in the documentation. + @export var exported_value + Code regions ------------ From 7b0674e73ab87453ba512d93b6ce419d20b6d4ee Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sat, 23 Nov 2024 18:31:16 +0100 Subject: [PATCH 17/29] Document focus StyleBox caveats in Introduction to GUI skinning --- tutorials/ui/gui_skinning.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tutorials/ui/gui_skinning.rst b/tutorials/ui/gui_skinning.rst index d52d14e51f6..affd1a015e4 100644 --- a/tutorials/ui/gui_skinning.rst +++ b/tutorials/ui/gui_skinning.rst @@ -86,6 +86,12 @@ a unique name and must be one of the following data types: not limited to the :ref:`Panel ` control, as styleboxes are used by many controls for their backgrounds and overlays. + Different controls will apply StyleBoxes in a different manner. Most notably, + ``focus`` styleboxes are drawn as an *overlay* to other styleboxes (such as + ``normal`` or ``pressed``) to allow the base stylebox to remain visible. + This means the focus stylebox should be designed as an outline or translucent + box, so that its background can remain visible. + Theme types ~~~~~~~~~~~ From 13a47e3b0040072147e14118854db3c30c17b9e3 Mon Sep 17 00:00:00 2001 From: tetrapod00 <145553014+tetrapod00@users.noreply.github.com> Date: Sat, 23 Nov 2024 22:55:15 -0800 Subject: [PATCH 18/29] Remove link to Reddit list of tutorials --- community/tutorials.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/community/tutorials.rst b/community/tutorials.rst index 8a8467a43b6..18d61d28899 100644 --- a/community/tutorials.rst +++ b/community/tutorials.rst @@ -3,7 +3,10 @@ Tutorials and resources ======================= -This is a list of third-party tutorials and resources created by the Godot community. For resources, remember that there is the official `Godot Asset Library `_ full of official and community resources too! Also, have a look at this `huge list over at Reddit `_. +This is a list of third-party tutorials and resources created by the Godot +community. For resources, remember that there is the official +`Godot Asset Library `_ full of +official and community resources too! Think there is something missing here? Feel free to submit a `Pull Request `_ as always. From 54dd8c12a891f900be00b0b7b38811f71ce66786 Mon Sep 17 00:00:00 2001 From: Tyson Nottingham Date: Sat, 23 Nov 2024 12:24:32 -0800 Subject: [PATCH 19/29] Use Stretch Ratio instead of prior Ratio terminology --- tutorials/ui/gui_containers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/ui/gui_containers.rst b/tutorials/ui/gui_containers.rst index f5aac4ab123..35ec1eb02e0 100644 --- a/tutorials/ui/gui_containers.rst +++ b/tutorials/ui/gui_containers.rst @@ -78,7 +78,7 @@ Arranges child controls vertically or horizontally (via :ref:`HBoxContainer Date: Sun, 24 Nov 2024 12:49:39 -0800 Subject: [PATCH 20/29] Remove wiki reference in Introduction to 3D --- tutorials/3d/introduction_to_3d.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tutorials/3d/introduction_to_3d.rst b/tutorials/3d/introduction_to_3d.rst index 674e5f5e24f..5f876139c21 100644 --- a/tutorials/3d/introduction_to_3d.rst +++ b/tutorials/3d/introduction_to_3d.rst @@ -19,10 +19,9 @@ which are almost identical to their 2D counterparts. `Github repository `__ or the :ref:`Asset Library `. -In 3D, math is a little more complex than in 2D, so also checking the -:ref:`doc_vector_math` entry in the wiki (which was especially created for game -developers, not mathematicians or engineers) will help pave the way for you -to develop 3D games efficiently. +In 3D, math is a little more complex than in 2D. For an introduction to the +relevant math written for game developers, not mathemeticians or engineers, +check out :ref:`doc_vector_math` and :ref:`doc_using_transforms`. 3D workspace ~~~~~~~~~~~~ From ccf9538a6e3dfc18794b415727e246f260cf20d8 Mon Sep 17 00:00:00 2001 From: Anish Mishra Date: Tue, 26 Nov 2024 01:16:51 +0530 Subject: [PATCH 21/29] update groups image in saving_games tutorial --- tutorials/io/img/groups.png | Bin 3551 -> 0 bytes tutorials/io/img/groups.webp | Bin 0 -> 16318 bytes tutorials/io/saving_games.rst | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 tutorials/io/img/groups.png create mode 100644 tutorials/io/img/groups.webp diff --git a/tutorials/io/img/groups.png b/tutorials/io/img/groups.png deleted file mode 100644 index 0658058aba951120f17c8c1b305ce3f6be99d776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3551 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 diff --git a/tutorials/io/img/groups.webp b/tutorials/io/img/groups.webp new file mode 100644 index 0000000000000000000000000000000000000000..2805512f8fceefb4c5921c4f0895378da0fb65bc GIT binary patch literal 16318 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 S;NKt1pbqdSG*9@4uKxwk5&F*n literal 0 HcmV?d00001 diff --git a/tutorials/io/saving_games.rst b/tutorials/io/saving_games.rst index 27347278dcd..18209896c95 100644 --- a/tutorials/io/saving_games.rst +++ b/tutorials/io/saving_games.rst @@ -34,7 +34,7 @@ We will start by adding objects we wish to save to the "Persist" group. We can do this through either the GUI or script. Let's add the relevant nodes using the GUI: -.. image:: img/groups.png +.. image:: img/groups.webp Once this is done, when we need to save the game, we can get all objects to save them and then tell them all to save with this script: From c66f8114602b883f75d71f91bf50ca1b4e1a3bb1 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Wed, 16 Oct 2024 16:55:47 +0200 Subject: [PATCH 22/29] Document `generate_bundle=yes` SCons option in Compiling for macOS and iOS - Reorder instructions to mention ARM64 builds first in macOS, as this is the primary architecture in use now (with all new Macs since 2023 being sold with Apple Silicon only). The `lipo` command still works as before, as it infers the architecture from the input files. - Remove the manual bundle generation steps to make the page shorter (similar to Compiling for Android). - Remove references to the master branch (this was only relevant when 4.0 was still in development). --- .../compiling/compiling_for_ios.rst | 45 +++++++--------- .../compiling/compiling_for_macos.rst | 52 ++++++++----------- tutorials/export/exporting_for_macos.rst | 2 +- 3 files changed, 41 insertions(+), 58 deletions(-) diff --git a/contributing/development/compiling/compiling_for_ios.rst b/contributing/development/compiling/compiling_for_ios.rst index 6cd9686f73c..c5d370daff6 100644 --- a/contributing/development/compiling/compiling_for_ios.rst +++ b/contributing/development/compiling/compiling_for_ios.rst @@ -20,9 +20,6 @@ Requirements Xcode and need to install iOS support, go to *Xcode -> Settings... -> Platforms*. - Go to *Xcode -> Settings... -> Locations -> Command Line Tools* and select an installed version. Even if one is already selected, re-select it. - -If you are building the ``master`` branch: - - Download and follow README instructions to build a static ``.xcframework`` from the `MoltenVK SDK `__. @@ -49,46 +46,40 @@ If you are building the ``master`` branch: Compiling --------- -Open a Terminal, go to the root dir of the engine source code and type: +Open a Terminal, go to the root folder of the engine source code and type +the following to compile a debug build: :: - scons platform=ios target=template_debug + scons platform=ios target=template_debug generate_bundle=yes -for a debug build, or: +To compile a release build: :: - scons platform=ios target=template_release - -for a release build (check ``platform/ios/detect.py`` for the compiler -flags used for each configuration). + scons platform=ios target=template_release generate_bundle=yes -Alternatively, you can run +Alternatively, you can run the following command for Xcode simulator libraries (optional): :: - scons platform=ios target=template_debug ios_simulator=yes arch=x86_64 scons platform=ios target=template_debug ios_simulator=yes arch=arm64 + scons platform=ios target=template_debug ios_simulator=yes arch=x86_64 generate_bundle=yes -for a Simulator libraries. +These simulator libraries cannot be used to run the exported project on the +target device. Instead, they can be used to run the exported project directly on +your Mac while still testing iOS platform-specific functionality. To create an Xcode project like in the official builds, you need to use the template located in ``misc/dist/ios_xcode``. The release and debug libraries -should be placed in ``libgodot.ios.debug.xcframework`` and ``libgodot.ios.release.xcframework`` respectively. - -:: - - cp -r misc/dist/ios_xcode . - - cp libgodot.ios.template_debug.arm64.a ios_xcode/libgodot.ios.debug.xcframework/ios-arm64/libgodot.a - lipo -create libgodot.ios.template_debug.arm64.simulator.a libgodot.ios.template_debug.x86_64.simulator.a -output ios_xcode/libgodot.ios.debug.xcframework/ios-arm64_x86_64-simulator/libgodot.a - - cp libgodot.ios.template_release.arm64.a ios_xcode/libgodot.ios.release.xcframework/ios-arm64/libgodot.a - lipo -create libgodot.ios.template_release.arm64.simulator.a libgodot.ios.template_release.x86_64.simulator.a -output ios_xcode/libgodot.ios.release.xcframework/ios-arm64_x86_64-simulator/libgodot.a - -The MoltenVK static ``.xcframework`` folder must also be placed in the ``ios_xcode`` -folder once it has been created. +should be placed in ``libgodot.ios.debug.xcframework`` and +``libgodot.ios.release.xcframework`` respectively. This process can be automated +by using the ``generate_bundle=yes`` option on the *last* SCons command used to +build export templates (so that all binaries can be included). + +The MoltenVK static ``.xcframework`` folder must also be placed in the +``ios_xcode`` folder once it has been created. MoltenVK is always statically +linked on iOS; there is no dynamic linking option available, unlike macOS. Run --- diff --git a/contributing/development/compiling/compiling_for_macos.rst b/contributing/development/compiling/compiling_for_macos.rst index 41f6023098f..ff1448be0b2 100644 --- a/contributing/development/compiling/compiling_for_macos.rst +++ b/contributing/development/compiling/compiling_for_macos.rst @@ -125,54 +125,46 @@ To build macOS export templates, you have to compile using the targets without the editor: ``target=template_release`` (release template) and ``target=template_debug``. -Official templates are universal binaries which support both Intel x86_64 and -ARM64 architectures. You can also create export templates that support only one -of those two architectures by leaving out the ``lipo`` step below. +Official templates are *Universal 2* binaries which support both ARM64 and Intel +x86_64 architectures. -- For Intel x86_64:: +- To support ARM64 (Apple Silicon) + Intel x86_64:: - scons platform=macos target=template_release arch=x86_64 + scons platform=macos target=template_debug arch=arm64 + scons platform=macos target=template_release arch=arm64 scons platform=macos target=template_debug arch=x86_64 + scons platform=macos target=template_release arch=x86_64 generate_bundle=yes -- For Arm64 (Apple M1):: +- To support ARM64 (Apple Silicon) only (smaller file size, but less compatible with older hardware):: - scons platform=macos target=template_release arch=arm64 scons platform=macos target=template_debug arch=arm64 - -To support both architectures in a single "Universal 2" binary, run the above -two commands blocks and then use ``lipo`` to bundle them together:: - - lipo -create bin/godot.macos.template_release.x86_64 bin/godot.macos.template_release.arm64 -output bin/godot.macos.template_release.universal - lipo -create bin/godot.macos.template_debug.x86_64 bin/godot.macos.template_debug.arm64 -output bin/godot.macos.template_debug.universal + scons platform=macos target=template_release arch=arm64 generate_bundle=yes To create an ``.app`` bundle like in the official builds, you need to use the -template located in ``misc/dist/macos_template.app``. The release and debug -builds should be placed in ``macos_template.app/Contents/MacOS`` with the names -``godot_macos_release.universal`` and ``godot_macos_debug.universal`` respectively. You can do so -with the following commands (assuming a universal build, otherwise replace the -``.universal`` extension with the one of your arch-specific binaries):: - - cp -r misc/dist/macos_template.app . - mkdir -p macos_template.app/Contents/MacOS - cp bin/godot.macos.template_release.universal macos_template.app/Contents/MacOS/godot_macos_release.universal - cp bin/godot.macos.template_debug.universal macos_template.app/Contents/MacOS/godot_macos_debug.universal - chmod +x macos_template.app/Contents/MacOS/godot_macos* +template located in ``misc/dist/macos_template.app``. This process can be automated by using +the ``generate_bundle=yes`` option on the *last* SCons command used to build export templates +(so that all binaries can be included). This option also takes care of calling ``lipo`` to create +an *Universal 2* binary from two separate ARM64 and x86_64 binaries (if both were compiled beforehand). .. note:: - If you are building the ``master`` branch, you also need to include support - for the MoltenVK Vulkan portability library. By default, it will be linked - statically from your installation of the Vulkan SDK for macOS. - You can also choose to link it dynamically by passing ``use_volk=yes`` and - including the dynamic library in your ``.app`` bundle:: + You also need to include support for the MoltenVK Vulkan portability + library. By default, it will be linked statically from your installation of + the Vulkan SDK for macOS. You can also choose to link it dynamically by + passing ``use_volk=yes`` and including the dynamic library in your ``.app`` + bundle:: mkdir -p macos_template.app/Contents/Frameworks cp /macOS/libs/libMoltenVK.dylib macos_template.app/Contents/Frameworks/libMoltenVK.dylib + In most cases, static linking should be preferred as it makes distribution + easier. The main upside of dynamic linking is that it allows updating + MoltenVK without having to recompile export templates. + You can then zip the ``macos_template.app`` folder to reproduce the ``macos.zip`` template from the official Godot distribution:: - zip -q -9 -r macos.zip macos_template.app + zip -r9 macos.zip macos_template.app Using Pyston for faster development ----------------------------------- diff --git a/tutorials/export/exporting_for_macos.rst b/tutorials/export/exporting_for_macos.rst index ddc3c60a4e7..54240469a00 100644 --- a/tutorials/export/exporting_for_macos.rst +++ b/tutorials/export/exporting_for_macos.rst @@ -11,7 +11,7 @@ Exporting for macOS macOS apps exported with the official export templates are exported as a single "Universal 2" binary ``.app`` bundle, a folder with a specific structure which stores the executable, libraries and all the project files. This bundle can be exported as is, packed in a ZIP archive or DMG disk image (only supported when exporting from a computer running macOS). -`Universal binaries for macOS support both Intel x86_64 and ARM64 (Apple silicon, i.e. M1) architectures `__. +`Universal binaries for macOS support both Intel x86_64 and ARM64 (Apple Silicon) architectures `__. Requirements ------------ From 4302a9808133b89f7f394dcccd9c5d1ac11bffc0 Mon Sep 17 00:00:00 2001 From: Danila Zolotarev Date: Tue, 26 Nov 2024 17:48:13 +0300 Subject: [PATCH 23/29] Fix wording of OpenGL ES support on desktop in Internal rendering architecture (#9945) --- .../core_and_modules/internal_rendering_architecture.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contributing/development/core_and_modules/internal_rendering_architecture.rst b/contributing/development/core_and_modules/internal_rendering_architecture.rst index b2c8e0b791d..75ab68ef643 100644 --- a/contributing/development/core_and_modules/internal_rendering_architecture.rst +++ b/contributing/development/core_and_modules/internal_rendering_architecture.rst @@ -228,8 +228,8 @@ support Vulkan. OpenGL 3.3 Core Profile is used on desktop platforms to run this driver, as most graphics drivers on desktop don't support OpenGL ES. WebGL 2.0 is used for web exports. -It is possible to use the use of OpenGL ES 3.0 directly on desktop platforms -using the ``--rendering-driver opengl3_es`` command line argument, although this +It is possible to use OpenGL ES 3.0 directly on desktop platforms +by passing the ``--rendering-driver opengl3_es`` command line argument, although this will only work on graphics drivers that feature native OpenGL ES support (such as Mesa). From 68eb940c28efdcd48fe206ceebf9d6b4cee1d0d6 Mon Sep 17 00:00:00 2001 From: RB35 <53859034+RB35@users.noreply.github.com> Date: Thu, 28 Nov 2024 07:18:13 +1100 Subject: [PATCH 24/29] Update C# Rider install steps for now built-in plugin "Godot Support" (#10323) * Plugin now bundled with rider so can't be installed As of Rider 2024.2 the plugin is bundled with the software and can't be installed which can be confusing. https://plugins.jetbrains.com/plugin/13882-godot-support --------- Co-authored-by: tetrapod <145553014+tetrapod00@users.noreply.github.com> --- tutorials/scripting/c_sharp/c_sharp_basics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/scripting/c_sharp/c_sharp_basics.rst b/tutorials/scripting/c_sharp/c_sharp_basics.rst index 274a4f0aa4d..d160c74f539 100644 --- a/tutorials/scripting/c_sharp/c_sharp_basics.rst +++ b/tutorials/scripting/c_sharp/c_sharp_basics.rst @@ -90,7 +90,7 @@ In Godot's **Editor → Editor Settings** menu: In Rider: - Set **MSBuild version** to **.NET Core**. -- Install the **Godot support** plugin. +- If you are using a Rider version below 2024.2, install the **Godot support** plugin. This functionality is now built into Rider. Visual Studio Code ~~~~~~~~~~~~~~~~~~ From dc9254582aa22029de177895901a8a29086e3bac Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 29 Nov 2024 02:05:45 +0100 Subject: [PATCH 25/29] Remove instructions on setting up Pyston for faster development This is done for several reasons: - Recent CPython versions such as 3.13 have mostly caught up with Pyston in terms of performance. If the trend continues, CPython may supersede Pyston's performance in the long term. This is especially the case if the experimental JIT is eventually able to run Godot's SCons setup. - Pyston is not maintained anymore (its last release was in 2022), and the last Python version it can run is 3.8. Python 3.8 is now end-of-life. Godot's SCons setup (as well as SCons itself) will eventually require Python versions newer than 3.8. --- .../compiling/compiling_for_linuxbsd.rst | 33 +------------------ .../compiling/compiling_for_macos.rst | 18 +--------- 2 files changed, 2 insertions(+), 49 deletions(-) diff --git a/contributing/development/compiling/compiling_for_linuxbsd.rst b/contributing/development/compiling/compiling_for_linuxbsd.rst index 432c198ef52..20638c0e8e4 100644 --- a/contributing/development/compiling/compiling_for_linuxbsd.rst +++ b/contributing/development/compiling/compiling_for_linuxbsd.rst @@ -250,7 +250,7 @@ Start a terminal, go to the root dir of the engine source code and type: .. tip:: If you are compiling Godot to make changes or contribute to the engine, - you may want to use the SCons options ``dev_build=yes`` or ``dev_mode=yes``. + you may want to use the SCons options ``dev_build=yes`` or ``dev_mode=yes``. See :ref:`doc_introduction_to_the_buildsystem_development_and_production_aliases` for more info. @@ -579,34 +579,3 @@ running ``scons -h``, then looking for options starting with ``builtin_``. across Linux distributions anymore. Do not use this approach for creating binaries you intend to distribute to others, unless you're creating a package for a Linux distribution. - -Using Pyston for faster development ------------------------------------ - -You can use `Pyston `__ to run SCons. Pyston is a JIT-enabled -implementation of the Python language (which SCons is written in). It is currently -only compatible with Linux. Pyston can speed up incremental builds significantly, -often by a factor between 1.5× and 2×. Pyston can be combined with Clang and LLD -to get even faster builds. - -- Download the `latest portable Pyston release `__. -- Extract the portable ``.tar.gz`` to a set location, such as ``$HOME/.local/opt/pyston/`` (create folders as needed). -- Use ``cd`` to reach the extracted Pyston folder from a terminal, - then run ``./pyston -m pip install scons`` to install SCons within Pyston. -- To make SCons via Pyston easier to run, create a symbolic link of its wrapper - script to a location in your ``PATH`` environment variable:: - - ln -s ~/.local/opt/pyston/bin/scons ~/.local/bin/pyston-scons - -- Instead of running ``scons ``, run ``pyston-scons `` - to compile Godot. - -If you can't run ``pyston-scons`` after creating the symbolic link, -make sure ``$HOME/.local/bin/`` is part of your user's ``PATH`` environment variable. - -.. note:: - - Alternatively, you can run ``python -m pip install pyston_lite_autoload`` - then run SCons as usual. This will automatically load a subset of Pyston's - optimizations in any Python program you run. However, this won't bring as - much of a performance improvement compared to installing "full" Pyston. diff --git a/contributing/development/compiling/compiling_for_macos.rst b/contributing/development/compiling/compiling_for_macos.rst index ff1448be0b2..5e984641f16 100644 --- a/contributing/development/compiling/compiling_for_macos.rst +++ b/contributing/development/compiling/compiling_for_macos.rst @@ -61,7 +61,7 @@ To support both architectures in a single "Universal 2" binary, run the above tw .. tip:: If you are compiling Godot to make changes or contribute to the engine, - you may want to use the SCons options ``dev_build=yes`` or ``dev_mode=yes``. + you may want to use the SCons options ``dev_build=yes`` or ``dev_mode=yes``. See :ref:`doc_introduction_to_the_buildsystem_development_and_production_aliases` for more info. @@ -166,22 +166,6 @@ template from the official Godot distribution:: zip -r9 macos.zip macos_template.app -Using Pyston for faster development ------------------------------------ - -You can use `Pyston `__ to run SCons. Pyston is a -JIT-enabled implementation of the Python language (which SCons is written in). -Its "full" version is currently only compatible with Linux, but Pyston-lite is -also compatible with macOS (both x86 and ARM). Pyston can speed up incremental -builds significantly, often by a factor between 1.5× and 2×. Pyston can be -combined with alternative linkers such as LLD or Mold to get even faster builds. - -To install Pyston-lite, run ``python -m pip install pyston_lite_autoload`` then -run SCons as usual. This will automatically load a subset of Pyston's -optimizations in any Python program you run. However, this won't bring as much -of a performance improvement compared to installing "full" Pyston (which -currently can't be done on macOS). - Cross-compiling for macOS from Linux ------------------------------------ From 83d7bb50560f06c448e5e6617708a37ed7eeca93 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Fri, 29 Nov 2024 02:03:36 +0100 Subject: [PATCH 26/29] Fix outdated reference to `godot.tools.html` in Compiling for the Web It's `godot.editor.html` since Godot 4.0. --- contributing/development/compiling/compiling_for_web.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing/development/compiling/compiling_for_web.rst b/contributing/development/compiling/compiling_for_web.rst index 89e1a1e916c..e6d9bcf4098 100644 --- a/contributing/development/compiling/compiling_for_web.rst +++ b/contributing/development/compiling/compiling_for_web.rst @@ -125,7 +125,7 @@ server requirements. python platform/web/serve.py This will serve the contents of the ``bin/`` folder and open the default web - browser automatically. In the page that opens, access ``godot.tools.html`` + browser automatically. In the page that opens, access ``godot.editor.html`` and you should be able to test the web editor this way. Note that for production use cases, this Python-based web server should not From 43ef9a70ac23e893bc0e1ce848ee2050429571e4 Mon Sep 17 00:00:00 2001 From: ntlblpm Date: Fri, 29 Nov 2024 01:46:08 -0500 Subject: [PATCH 27/29] Update saving_games.rst --- tutorials/io/saving_games.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/io/saving_games.rst b/tutorials/io/saving_games.rst index 18209896c95..0776d93d3be 100644 --- a/tutorials/io/saving_games.rst +++ b/tutorials/io/saving_games.rst @@ -61,7 +61,7 @@ Serializing The next step is to serialize the data. This makes it much easier to read from and store to disk. In this case, we're assuming each member of group Persist is an instanced node and thus has a path. GDScript -has helper class :ref:`JSON` to convert between dictionary and string, +has the helper class :ref:`JSON` to convert between dictionary and string. Our node needs to contain a save function that returns this data. The save function will look like this: From 4ba3e374cd9fb97bfa4134ad54768fbf85332083 Mon Sep 17 00:00:00 2001 From: Quinn <3379314+quinnyo@users.noreply.github.com> Date: Fri, 29 Nov 2024 21:59:59 +1000 Subject: [PATCH 28/29] Replace mentions of Reference with RefCounted --- contributing/development/core_and_modules/object_class.rst | 2 +- tutorials/scripting/gdscript/gdscript_basics.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contributing/development/core_and_modules/object_class.rst b/contributing/development/core_and_modules/object_class.rst index e2afbdad761..ffa69908cbf 100644 --- a/contributing/development/core_and_modules/object_class.rst +++ b/contributing/development/core_and_modules/object_class.rst @@ -274,7 +274,7 @@ References: Resources ---------- -:ref:`Resource ` inherits from Reference, so all resources +:ref:`Resource ` inherits from RefCounted, so all resources are reference counted. Resources can optionally contain a path, which reference a file on disk. This can be set with ``resource.set_path(path)``, though this is normally done by the resource loader. No two different diff --git a/tutorials/scripting/gdscript/gdscript_basics.rst b/tutorials/scripting/gdscript/gdscript_basics.rst index 8c6947de20b..bd6ca5d9fc7 100644 --- a/tutorials/scripting/gdscript/gdscript_basics.rst +++ b/tutorials/scripting/gdscript/gdscript_basics.rst @@ -1035,7 +1035,7 @@ it will raise an error. Valid types are: - Built-in types (Array, Vector2, int, String, etc.). -- Engine classes (Node, Resource, Reference, etc.). +- Engine classes (Node, Resource, RefCounted, etc.). - Constant names if they contain a script resource (``MyScript`` if you declared ``const MyScript = preload("res://my_script.gd")``). - Other classes in the same script, respecting scope (``InnerClass.NestedClass`` if you declared ``class NestedClass`` inside the ``class InnerClass`` in the same scope). - Script classes declared with the ``class_name`` keyword. From 3489cc51fb35734306a4c42f7185b57e932bcc38 Mon Sep 17 00:00:00 2001 From: Sai Nane Date: Thu, 28 Nov 2024 14:07:56 +0000 Subject: [PATCH 29/29] Update file_access.h location `os/file_access.h` moved to `io/file_access.h` in 9e328bb5b: https://github.com/godotengine/godot/commit/9e328bb5b --- .../core_and_modules/custom_resource_format_loaders.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contributing/development/core_and_modules/custom_resource_format_loaders.rst b/contributing/development/core_and_modules/custom_resource_format_loaders.rst index 9066fbdb6e7..fd78c193bca 100644 --- a/contributing/development/core_and_modules/custom_resource_format_loaders.rst +++ b/contributing/development/core_and_modules/custom_resource_format_loaders.rst @@ -269,7 +269,7 @@ calls into ``std::istream``. .. code-block:: cpp - #include "core/os/file_access.h" + #include "core/io/file_access.h" #include #include @@ -304,7 +304,7 @@ References - `istream `_ - `streambuf `_ -- `core/io/file_access.h `_ +- `core/io/file_access.h `_ Registering the new file format -------------------------------