More code block cleanups.

This commit is contained in:
Relintai 2023-01-12 22:00:14 +01:00
parent f77227608c
commit 8e5258c966
60 changed files with 906 additions and 797 deletions

View File

@ -81,11 +81,11 @@ The commit hash is written inside that file.
If you're using a stable release as the "good" or "bad" build, use one of the If you're using a stable release as the "good" or "bad" build, use one of the
following commit hashes depending on the version: following commit hashes depending on the version:
.. code-block:: none ```
3.2-stable 3.2-stable
3.1-stable 3.1-stable
3.0-stable 3.0-stable
```
To refer to the latest state of the master branch, you can use `master` To refer to the latest state of the master branch, you can use `master`
instead of a commit hash. instead of a commit hash.
@ -94,21 +94,21 @@ instead of a commit hash.
is done, in the terminal window, use `cd` to reach the Godot repository is done, in the terminal window, use `cd` to reach the Godot repository
folder and enter the following command: folder and enter the following command:
.. code-block:: shell ```
# <good commit hash> is hash of the build that works as expected. # <good commit hash> is hash of the build that works as expected.
# <bad commit hash> is hash of the build exhibiting the bug. # <bad commit hash> is hash of the build exhibiting the bug.
$ git bisect start $ git bisect start
$ git bisect good <good commit hash> $ git bisect good <good commit hash>
$ git bisect bad <bad commit hash> $ git bisect bad <bad commit hash>
```
Compile Godot. This assumes you've set up a build environment: Compile Godot. This assumes you've set up a build environment:
.. code-block:: shell ```
# <platform> is the platform you're targeting for regression testing, # <platform> is the platform you're targeting for regression testing,
# like "windows", "x11" or "osx". # like "windows", "x11" or "osx".
$ scons platform=<platform> -j4 $ scons platform=<platform> -j4
```
Since building Godot takes a while, you want to dedicate as many CPU threads as Since building Godot takes a while, you want to dedicate as many CPU threads as
possible to the task. This is what the `-j` parameter does. Here, the command possible to the task. This is what the `-j` parameter does. Here, the command
@ -118,15 +118,15 @@ Run the binary located in the `bin/` folder and try to reproduce the bug.
If the build **still** exhibits the bug, run the following command: If the build **still** exhibits the bug, run the following command:
.. code-block:: shell ```
$ git bisect bad $ git bisect bad
```
If the build **does not** exhibit the bug, run the following command: If the build **does not** exhibit the bug, run the following command:
.. code-block:: shell ```
$ git bisect good $ git bisect good
```
After entering one of the commands above, Git will switch to a different commit. After entering one of the commands above, Git will switch to a different commit.
You should now build Godot again, try to reproduce the bug, then enter `git You should now build Godot again, try to reproduce the bug, then enter `git

View File

@ -25,40 +25,39 @@ Note:
You may need to write `python3 -m pip` (Unix) or `py -m pip` (Windows) instead of `pip3`. You may need to write `python3 -m pip` (Unix) or `py -m pip` (Windows) instead of `pip3`.
If both approaches fail, `check that you have pip3 installed ( https://pip.pypa.io/en/stable/installation/ )`. If both approaches fail, `check that you have pip3 installed ( https://pip.pypa.io/en/stable/installation/ )`.
.. code:: sh ```
git clone https://github.com/godotengine/godot-docs.git git clone https://github.com/godotengine/godot-docs.git
pip3 install -r requirements.txt pip3 install -r requirements.txt
```
With the programs installed, you can build the HTML documentation from the root With the programs installed, you can build the HTML documentation from the root
folder of this repository with the following command: folder of this repository with the following command:
.. code:: sh ```
# On Linux and macOS # On Linux and macOS
make html make html
# On Windows, you need to execute the `make.bat` file instead. # On Windows, you need to execute the `make.bat` file instead.
make.bat html make.bat html
```
If you run into errors, you may try the following command: If you run into errors, you may try the following command:
.. code:: sh ```
make SPHINXBUILD=~/.local/bin/sphinx-build html make SPHINXBUILD=~/.local/bin/sphinx-build html
```
Building the documentation requires at least 8 GB of RAM to run without disk Building the documentation requires at least 8 GB of RAM to run without disk
swapping, which slows it down. If you have at least 16 GB of RAM, you can speed swapping, which slows it down. If you have at least 16 GB of RAM, you can speed
up compilation by running: up compilation by running:
.. code:: sh ```
# On Linux/macOS # On Linux/macOS
make html SPHINXOPTS=-j2 make html SPHINXOPTS=-j2
# On Windows # On Windows
set SPHINXOPTS=-j2 && make html set SPHINXOPTS=-j2 && make html
```
The compilation will take some time as the `classes/` folder contains hundreds The compilation will take some time as the `classes/` folder contains hundreds
of files. of files.

View File

@ -15,8 +15,7 @@ See also:
The reference for each class is contained in an XML file like the one below: The reference for each class is contained in an XML file like the one below:
.. code-block:: xml ```
<class name="Node2D" inherits="CanvasItem" version="4.0"> <class name="Node2D" inherits="CanvasItem" version="4.0">
<brief_description> <brief_description>
A 2D game object, inherited by all 2D-related nodes. Has a position, rotation, scale, and Z index. A 2D game object, inherited by all 2D-related nodes. Has a position, rotation, scale, and Z index.
@ -61,7 +60,7 @@ The reference for each class is contained in an XML file like the one below:
<constants> <constants>
</constants> </constants>
</class> </class>
```
It starts with brief and long descriptions. In the generated docs, the brief It starts with brief and long descriptions. In the generated docs, the brief
description is always at the top of the page, while the long description lies description is always at the top of the page, while the long description lies
@ -71,14 +70,14 @@ member variables, constants, and signals in separate XML nodes.
For each, you want to learn how they work in Godot's source code. Then, fill For each, you want to learn how they work in Godot's source code. Then, fill
their documentation by completing or improving the text in these tags: their documentation by completing or improving the text in these tags:
- `<brief_description )` - `<brief_description>`
- `<description )` - `<description>`
- `<constant )` - `<constant>`
- `<method )` (in its `<description )` tag; return types and arguments don't take separate - `<method>` (in its `<description>` tag; return types and arguments don't take separate
documentation strings) documentation strings)
- `<member )` - `<member>`
- `<signal )` (in its `<description )` tag; arguments don't take separate documentation strings) - `<signal>` (in its `<description>` tag; arguments don't take separate documentation strings)
- `<constant )` - `<constant>`
Write in a clear and simple language. Always follow the `writing guidelines Write in a clear and simple language. Always follow the `writing guidelines
( doc_docs_writing_guidelines )` to keep your descriptions short and easy to read. ( doc_docs_writing_guidelines )` to keep your descriptions short and easy to read.
@ -110,7 +109,7 @@ errors if anything's wrong.
Alternatively, you can build Godot and open the modified page in the built-in Alternatively, you can build Godot and open the modified page in the built-in
code reference. To learn how to compile the engine, read the `compilation code reference. To learn how to compile the engine, read the `compilation
guide <toc-devel-compiling )`. guide ( toc-devel-compiling )`.
We recommend using a code editor that supports XML files like Vim, Atom, Visual Studio Code, We recommend using a code editor that supports XML files like Vim, Atom, Visual Studio Code,
Notepad++, or another to comfortably edit the file. You can also use their Notepad++, or another to comfortably edit the file. You can also use their
@ -162,21 +161,21 @@ Use `[codeblock]` for pre-formatted code blocks. Inside `[codeblock]`,
always use **four spaces** for indentation. The parser will delete tabs. For always use **four spaces** for indentation. The parser will delete tabs. For
example: example:
.. code-block:: none ```
[codeblock] [codeblock]
func _ready(): func _ready():
var sprite = get_node("Sprite") var sprite = get_node("Sprite")
print(sprite.get_pos()) print(sprite.get_pos())
[/codeblock] [/codeblock]
```
Will display as: Will display as:
.. code-block:: gdscript ```
func _ready(): func _ready():
var sprite = get_node("Sprite") var sprite = get_node("Sprite")
print(sprite.get_pos()) print(sprite.get_pos())
```
If you need to have different code version in GDScript and C#, use If you need to have different code version in GDScript and C#, use
`[codeblocks]` instead. If you use `[codeblocks]`, you also need to have at `[codeblocks]` instead. If you use `[codeblocks]`, you also need to have at
@ -186,8 +185,7 @@ Always write GDScript code examples first! You can use this `experimental code
translation tool ( https://github.com/HaSa1002/codetranslator )` to speed up your translation tool ( https://github.com/HaSa1002/codetranslator )` to speed up your
workflow. workflow.
.. code-block:: none ```
[codeblocks] [codeblocks]
[gdscript] [gdscript]
func _ready(): func _ready():
@ -202,6 +200,7 @@ workflow.
} }
[/csharp] [/csharp]
[/codeblocks] [/codeblocks]
```
The above will display as: The above will display as:
@ -215,24 +214,24 @@ gdscript GDScript
To denote important information, add a paragraph starting with "[b]Note:[/b]" at To denote important information, add a paragraph starting with "[b]Note:[/b]" at
the end of the description: the end of the description:
.. code-block:: none ```
[b]Note:[/b] Only available when using the Vulkan renderer. [b]Note:[/b] Only available when using the Vulkan renderer.
```
To denote crucial information that could cause security issues or loss of data To denote crucial information that could cause security issues or loss of data
if not followed carefully, add a paragraph starting with "[b]Warning:[/b]" at if not followed carefully, add a paragraph starting with "[b]Warning:[/b]" at
the end of the description: the end of the description:
.. code-block:: none ```
[b]Warning:[/b] If this property is set to [code]true[/code], it allows clients to execute arbitrary code on the server. [b]Warning:[/b] If this property is set to [code]true[/code], it allows clients to execute arbitrary code on the server.
```
For deprecated properties, add a paragraph starting with "[i]Deprecated.[/i]". For deprecated properties, add a paragraph starting with "[i]Deprecated.[/i]".
Notice the use of italics instead of bold: Notice the use of italics instead of bold:
.. code-block:: none ```
[i]Deprecated.[/i] This property has been replaced by [member other_property]. [i]Deprecated.[/i] This property has been replaced by [member other_property].
```
In all the paragraphs described above, make sure the punctuation is part of the In all the paragraphs described above, make sure the punctuation is part of the
BBCode tags for consistency. BBCode tags for consistency.

View File

@ -85,9 +85,9 @@ Manual usage
You can apply clang-format manually one or more files with the following You can apply clang-format manually one or more files with the following
command: command:
:: ```
clang-format -i <path/to/file(s)> clang-format -i <path/to/file(s)>
```
- `-i` means that the changes should be written directly to the file (by - `-i` means that the changes should be written directly to the file (by
default clang-format would only output the fixed version to the terminal). default clang-format would only output the fixed version to the terminal).
@ -159,8 +159,7 @@ ones, the following rules should be followed:
Example: Example:
.. code-block:: cpp ```
/*************************************************************************/ /*************************************************************************/
/* my_new_file.h */ /* my_new_file.h */
/*************************************************************************/ /*************************************************************************/
@ -203,9 +202,9 @@ Example:
... ...
#endif // MY_NEW_FILE_H #endif // MY_NEW_FILE_H
```
.. code-block:: cpp ```
/*************************************************************************/ /*************************************************************************/
/* my_new_file.cpp */ /* my_new_file.cpp */
/*************************************************************************/ /*************************************************************************/
@ -243,6 +242,7 @@ Example:
#include <zlib.h> #include <zlib.h>
#include <zstd.h> #include <zstd.h>
```
Java Java
---- ----
@ -272,10 +272,9 @@ Installation
Here's how to install black: Here's how to install black:
:: ```
pip3 install black --user pip3 install black --user
```
You then have different possibilities to apply black to your changes: You then have different possibilities to apply black to your changes:
@ -285,9 +284,9 @@ Manual usage
You can apply `black` manually to one or more files with the following You can apply `black` manually to one or more files with the following
command: command:
:: ```
black -l 120 <path/to/file(s)> black -l 120 <path/to/file(s)>
```
- `-l 120` means that the allowed number of characters per line is 120. - `-l 120` means that the allowed number of characters per line is 120.
This number was agreed upon by the developers. This number was agreed upon by the developers.
@ -328,20 +327,20 @@ Godot's codebase.
**Example:** **Example:**
.. code-block:: cpp ```
// Compute the first 10,000 decimals of Pi. // Compute the first 10,000 decimals of Pi.
// FIXME: Don't crash when computing the 1,337th decimal due to `increment` // FIXME: Don't crash when computing the 1,337th decimal due to `increment`
// being negative. // being negative.
```
Don't repeat what the code says in a comment. Explain the *why* rather than *how*. Don't repeat what the code says in a comment. Explain the *why* rather than *how*.
**Bad:** **Bad:**
.. code-block:: cpp ```
// Draw loading screen. // Draw loading screen.
draw_load_screen(); draw_load_screen();
```
You can use Javadoc-style comments above function or macro definitions. It's You can use Javadoc-style comments above function or macro definitions. It's
recommended to use Javadoc-style comments *only* for methods which are not recommended to use Javadoc-style comments *only* for methods which are not
@ -351,8 +350,7 @@ instead.
**Example:** **Example:**
.. code-block:: cpp ```
/** /**
* Returns the number of nodes in the universe. * Returns the number of nodes in the universe.
* This can potentially be a very large number, hence the 64-bit return type. * This can potentially be a very large number, hence the 64-bit return type.
@ -360,14 +358,15 @@ instead.
uint64_t Universe::get_node_count() { uint64_t Universe::get_node_count() {
// ... // ...
} }
```
For member variables, don't use Javadoc-style comments but use single-line comments instead: For member variables, don't use Javadoc-style comments but use single-line comments instead:
.. code-block:: cpp ```
class Universe { class Universe {
// The cached number of nodes in the universe. // The cached number of nodes in the universe.
// This value may not always be up-to-date with the current number of nodes // This value may not always be up-to-date with the current number of nodes
// in the universe. // in the universe.
uint64_t node_count_cached = 0; uint64_t node_count_cached = 0;
}; };
```

View File

@ -125,12 +125,10 @@ Titles
Always begin pages with their title and a Sphinx reference name: Always begin pages with their title and a Sphinx reference name:
:: ```
Insert your title here Insert your title here
====================== ======================
```
The reference `doc_insert_your_title_here` and the title should match. The reference `doc_insert_your_title_here` and the title should match.
@ -169,18 +167,17 @@ Adding images and attachments
To add images, please put them in an `img/` folder next to the `.rst` file with To add images, please put them in an `img/` folder next to the `.rst` file with
a meaningful name and include them in your page with: a meaningful name and include them in your page with:
.. code:: rst ```
![](img/image_name.png) ![](img/image_name.png)
```
Similarly, you can include attachments, like assets as support material for a Similarly, you can include attachments, like assets as support material for a
tutorial, by placing them into a `files/` folder next to the `.rst` file, and tutorial, by placing them into a `files/` folder next to the `.rst` file, and
using this inline markup: using this inline markup:
.. code:: rst ```
:download:`myfilename.zip ( files/myfilename.zip )` :download:`myfilename.zip ( files/myfilename.zip )`
```
License License
------- -------

View File

@ -75,13 +75,13 @@ Note:
Please don't use the `auto` keyword for type inference. While it can avoid Please don't use the `auto` keyword for type inference. While it can avoid
repetition, it can also lead to confusing code: repetition, it can also lead to confusing code:
.. code-block:: cpp ```
// Not so confusing... // Not so confusing...
auto button = memnew(Button); auto button = memnew(Button);
// ...but what about this? // ...but what about this?
auto result = EditorNode::get_singleton()->get_complex_result(); auto result = EditorNode::get_singleton()->get_complex_result();
```
Keep in mind hover documentation often isn't readily available for pull request Keep in mind hover documentation often isn't readily available for pull request
reviewers. Most of the time, reviewers will use GitHub's online viewer to review reviewers. Most of the time, reviewers will use GitHub's online viewer to review

View File

@ -49,33 +49,31 @@ Use the active voice when possible. Take the classes, methods, and
constants you describe as the subject. It's natural to write using the constants you describe as the subject. It's natural to write using the
passive voice, but it's harder to read and produces longer sentences. passive voice, but it's harder to read and produces longer sentences.
.. highlight:: none
Passive: Passive:
:: ```
The man **was bitten** by the dog. The man **was bitten** by the dog.
```
Active: Active:
:: ```
The dog bit the man. The dog bit the man.
```
**Don't** use the passive voice: **Don't** use the passive voice:
:: ```
void edit_set_pivot ( Vector2 pivot ) void edit_set_pivot ( Vector2 pivot )
[...] This method **is implemented** only in some nodes that inherit Node2D. [...] This method **is implemented** only in some nodes that inherit Node2D.
```
**Do** use the node's name as a noun: **Do** use the node's name as a noun:
:: ```
void edit_set_pivot ( Vector2 pivot ) void edit_set_pivot ( Vector2 pivot )
[...] Only some Node2Ds **implement** this method. [...] Only some Node2Ds **implement** this method.
```
Use precise action verbs Use precise action verbs
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
@ -86,18 +84,18 @@ and any expression you can replace with a single word.
**Don't** repeat the method's name. It already states it sets the pivot **Don't** repeat the method's name. It already states it sets the pivot
value to a new one: value to a new one:
:: ```
void edit_set_pivot ( Vector2 pivot ) void edit_set_pivot ( Vector2 pivot )
Set the pivot position of the 2D node to [code]pivot[/code] value. [...] Set the pivot position of the 2D node to [code]pivot[/code] value. [...]
```
**Do** explain what's the consequence of this "set": use precise verbs **Do** explain what's the consequence of this "set": use precise verbs
like `place`, `position`, `rotate`, `fade`, etc. like `place`, `position`, `rotate`, `fade`, etc.
:: ```
void edit_set_pivot ( Vector2 pivot ) void edit_set_pivot ( Vector2 pivot )
Position the node's pivot to the [code]pivot[/code] value. [...] Position the node's pivot to the [code]pivot[/code] value. [...]
```
Avoid verbs that end in -ing Avoid verbs that end in -ing
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -107,17 +105,17 @@ The progressive forms describe continuous actions. E.g. "is calling",
**Don't** use the progressive form for instant changes. **Don't** use the progressive form for instant changes.
:: ```
Vector2 move ( Vector2 rel_vec ) Vector2 move ( Vector2 rel_vec )
Move the body in the given direction, **stopping** if there is an obstacle. [...] Move the body in the given direction, **stopping** if there is an obstacle. [...]
```
**Do** use simple present, past, or future. **Do** use simple present, past, or future.
:: ```
Vector2 move ( Vector2 rel_vec ) Vector2 move ( Vector2 rel_vec )
Moves the body in the vector's direction. The body **stops** if it collides with an obstacle. [...] Moves the body in the vector's direction. The body **stops** if it collides with an obstacle. [...]
```
Exception: If the subject is not clear, replacing "ing" verbs is not an Exception: If the subject is not clear, replacing "ing" verbs is not an
improvement. For example, in the previous sentence, "it replaces" improvement. For example, in the previous sentence, "it replaces"
@ -128,7 +126,6 @@ continuous in time. Anything like animation or coroutines.
Tip: Tip:
Verbs can turn into adjectival nouns with -ing. This is not a Verbs can turn into adjectival nouns with -ing. This is not a
conjugation, so you may use them: `the remaining movement`, conjugation, so you may use them: `the remaining movement`,
`the missing file`, etc. `the missing file`, etc.
@ -142,15 +139,15 @@ add key information to the description.
**Don't** use redundant or meaningless adverbs. Words that lengthen the **Don't** use redundant or meaningless adverbs. Words that lengthen the
documentation but don't add any information: documentation but don't add any information:
:: ```
**Basically** a big texture [...] **Basically** a big texture [...]
```
**Do** write short sentences in a simple, descriptive language: **Do** write short sentences in a simple, descriptive language:
:: ```
A big texture [...] A big texture [...]
```
Ban these 8 words Ban these 8 words
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
@ -175,48 +172,48 @@ easily, actually, clearly.
**Don't** example. The banned words lengthen the description and take **Don't** example. The banned words lengthen the description and take
attention away from the most important info: attention away from the most important info:
:: ```
**TextureRect** **TextureRect**
Control frame that **simply** draws an assigned texture. It can stretch or not. It's a **simple** way to **just** show an image in a UI. Control frame that **simply** draws an assigned texture. It can stretch or not. It's a **simple** way to **just** show an image in a UI.
```
**Do** remove them: **Do** remove them:
:: ```
**TextureRect** **TextureRect**
[Control] node that displays a texture. The texture can stretch to the node's bounding box or stay in the center. Useful to display sprites in your UIs. [Control] node that displays a texture. The texture can stretch to the node's bounding box or stay in the center. Useful to display sprites in your UIs.
```
"Simple" never helps. Remember, for other users, anything could be "Simple" never helps. Remember, for other users, anything could be
complex or frustrate them. There's nothing like a good old *it's simple* complex or frustrate them. There's nothing like a good old *it's simple*
to make you cringe. Here's the old brief description, the first sentence to make you cringe. Here's the old brief description, the first sentence
on the Timer node's page: on the Timer node's page:
:: ```
**Timer** **Timer**
A **simple** Timer node. A **simple** Timer node.
```
**Do** explain what the node does instead: **Do** explain what the node does instead:
:: ```
**Timer** **Timer**
Calls a function of your choice after a certain duration. Calls a function of your choice after a certain duration.
```
**Don't** use "basic", it is too vague: **Don't** use "basic", it is too vague:
:: ```
**Vector3** **Vector3**
Vector class, which performs **basic** 3D vector math operations. Vector class, which performs **basic** 3D vector math operations.
```
**Do** use the brief description to offer an overview of the node: **Do** use the brief description to offer an overview of the node:
:: ```
**Vector3** **Vector3**
Provides essential math functions to manipulate 3D vectors: cross product, normalize, rotate, etc. Provides essential math functions to manipulate 3D vectors: cross product, normalize, rotate, etc.
```
Use explicit references Use explicit references
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@ -226,15 +223,15 @@ Favor explicit references over implicit ones.
**Don't** use words like "the former", "the latter", etc. They're not **Don't** use words like "the former", "the latter", etc. They're not
the most common in English, and they require you to check the reference. the most common in English, and they require you to check the reference.
:: ```
[code]w[/code] and [code]h[/code] define right and bottom margins. The **latter** two resize the texture so it fits in the defined margin. [code]w[/code] and [code]h[/code] define right and bottom margins. The **latter** two resize the texture so it fits in the defined margin.
```
**Do** repeat words. They remove all ambiguity: **Do** repeat words. They remove all ambiguity:
:: ```
[code]w[/code] and [code]h[/code] define right and bottom margins. **[code]w[/code] and [code]h[/code]** resize the texture so it fits the margin. [code]w[/code] and [code]h[/code] define right and bottom margins. **[code]w[/code] and [code]h[/code]** resize the texture so it fits the margin.
```
If you need to repeat the same variable name 3 or 4 times, you probably If you need to repeat the same variable name 3 or 4 times, you probably
need to rephrase your description. need to rephrase your description.
@ -247,16 +244,16 @@ milk" instead.
**Don't** write "of the X": **Don't** write "of the X":
:: ```
The region **of the AtlasTexture that is** used. The region **of the AtlasTexture that is** used.
```
**Do** use `'s`. It lets you put the main subject at the start of the **Do** use `'s`. It lets you put the main subject at the start of the
sentence, and keep it short: sentence, and keep it short:
:: ```
The **AtlasTexture's** used region. The **AtlasTexture's** used region.
```
Use the Oxford comma to enumerate anything Use the Oxford comma to enumerate anything
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -271,17 +268,16 @@ From the Oxford dictionary:
**Don't** leave the last element of a list without a comma: **Don't** leave the last element of a list without a comma:
:: ```
Create a KinematicBody2D node, a CollisionShape2D node and a sprite node. Create a KinematicBody2D node, a CollisionShape2D node and a sprite node.
```
**Do** add a comma before `and` or `or`, for the last **Do** add a comma before `and` or `or`, for the last
element of a list with more than two elements. element of a list with more than two elements.
:: ```
Create a KinematicBody2D node, a CollisionShape2D node, and a sprite node. Create a KinematicBody2D node, a CollisionShape2D node, and a sprite node.
```
How to write methods and classes How to write methods and classes
-------------------------------- --------------------------------
@ -298,45 +294,43 @@ The exception is topics that explain static typing concepts to users.
**Don't** add a type hint with a colon or by casting: **Don't** add a type hint with a colon or by casting:
:: ```
const MainAttack := preload("res://fire_attack.gd") const MainAttack := preload("res://fire_attack.gd")
var hit_points := 5 var hit_points := 5
var name: String = "Bob" var name: String = "Bob"
var body_sprite := $Sprite as Sprite var body_sprite := $Sprite as Sprite
```
**Do** write constants and variables with dynamic typing: **Do** write constants and variables with dynamic typing:
:: ```
const MainAttack = preload("res://fire_attack.gd") const MainAttack = preload("res://fire_attack.gd")
var hit_points = 5 var hit_points = 5
var name = "Bob" var name = "Bob"
var body_sprite = $Sprite var body_sprite = $Sprite
```
**Don't** write functions with inferred arguments or return types: **Don't** write functions with inferred arguments or return types:
:: ```
func choose(arguments: PackedStringArray) -> String: func choose(arguments: PackedStringArray) -> String:
# Chooses one of the arguments from array with equal chances # Chooses one of the arguments from array with equal chances
randomize() randomize()
var size := arguments.size() var size := arguments.size()
var choice: int = randi() % size var choice: int = randi() % size
return arguments[choice] return arguments[choice]
```
**Do** write functions using dynamic typing: **Do** write functions using dynamic typing:
:: ```
func choose(arguments): func choose(arguments):
# Chooses one of the arguments from array with equal chances # Chooses one of the arguments from array with equal chances
randomize() randomize()
var size = arguments.size() var size = arguments.size()
var choice = randi() % size var choice = randi() % size
return arguments[choice] return arguments[choice]
```
Use real-world code examples where appropriate Use real-world code examples where appropriate
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -351,19 +345,18 @@ could use the code snippets in a live project.
**Don't** write made-up examples: **Don't** write made-up examples:
:: ```
onready var a = preload("res://MyPath") onready var a = preload("res://MyPath")
onready var my_node = $MyNode onready var my_node = $MyNode
func foo(): func foo():
# Do stuff # Do stuff
```
**Do** write concrete examples: **Do** write concrete examples:
:: ```
onready var sfx_player_gun = preload("res://Assets/Sound/SFXPlayerGun.ogg") onready var sfx_player_gun = preload("res://Assets/Sound/SFXPlayerGun.ogg")
onready var audio_player = $Audio/AudioStreamPlayer onready var audio_player = $Audio/AudioStreamPlayer
@ -371,6 +364,7 @@ could use the code snippets in a live project.
func play_shooting_sound(): func play_shooting_sound():
audio_player.stream = sfx_player_gun audio_player.stream = sfx_player_gun
audio_player.play() audio_player.play()
```
Of course, there are times when using real-world examples is impractical. In Of course, there are times when using real-world examples is impractical. In
those situations, you should still avoid using names such as `my_var`, those situations, you should still avoid using names such as `my_var`,
@ -390,17 +384,17 @@ functionality, in up to 200 characters.
**Don't** write tiny and vague summaries: **Don't** write tiny and vague summaries:
:: ```
**Node2D** **Node2D**
Base node for 2D system. Base node for 2D system.
```
**Do** give an overview of the node's functionality: **Do** give an overview of the node's functionality:
:: ```
**Node2D** **Node2D**
A 2D game object, inherited by all 2D-related nodes. Has a position, rotation, scale, and Z index. A 2D game object, inherited by all 2D-related nodes. Has a position, rotation, scale, and Z index.
```
Use the node's full description to provide more information, and a code Use the node's full description to provide more information, and a code
example, if possible. example, if possible.
@ -414,17 +408,17 @@ for any method whose name starts with `set` or `get`.
**Don't** use the passive voice: **Don't** use the passive voice:
:: ```
Vector2 move ( Vector2 rel_vec ) Vector2 move ( Vector2 rel_vec )
[...] The returned vector is how much movement was remaining before being stopped. [...] The returned vector is how much movement was remaining before being stopped.
```
**Do** always use "Returns". **Do** always use "Returns".
:: ```
Vector2 move ( Vector2 rel_vec ) Vector2 move ( Vector2 rel_vec )
[...] Returns the remaining movement before the body was stopped. [...] Returns the remaining movement before the body was stopped.
```
Notice the exception to the "direct voice" rule: with the move method, Notice the exception to the "direct voice" rule: with the move method,
an external collider can influence the method and the body that calls an external collider can influence the method and the body that calls
@ -441,11 +435,10 @@ Also, surround boolean values, variable names and methods with `[code][/code]`.
**Do** start with "if true": **Do** start with "if true":
:: ```
Timer.autostart Timer.autostart
If [code]true[/code], the timer will automatically start when entering the scene tree. If [code]true[/code], the timer will automatically start when entering the scene tree.
```
Use `[code]` around arguments Use `[code]` around arguments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -94,12 +94,10 @@ Titles
Always begin pages with their title and a Sphinx reference name: Always begin pages with their title and a Sphinx reference name:
:: ```
Insert your title here Insert your title here
====================== ======================
```
The reference allows linking to this page using the ``` format, e.g. The reference allows linking to this page using the ``` format, e.g.
```doc_insert_your_title_here``` would link to the above example page ```doc_insert_your_title_here``` would link to the above example page

View File

@ -3,8 +3,6 @@
Editor and docs localization Editor and docs localization
============================ ============================
.. highlight:: none
Godot aims to make game development available to everyone, including people who Godot aims to make game development available to everyone, including people who
may not know or be comfortable with English. Therefore, we do our best to make may not know or be comfortable with English. Therefore, we do our best to make
the most important resources available in many languages, thanks to the the most important resources available in many languages, thanks to the
@ -222,7 +220,7 @@ The editor translations originate from C++ strings, and may use:
placed in your translation where necessary for it to be meaningful after placed in your translation where necessary for it to be meaningful after
substitution. You may need to refer to the source string location to substitution. You may need to refer to the source string location to
understand what kind of content will be substituted if it's not clear from the understand what kind of content will be substituted if it's not clear from the
sentence. Example (`%s` will be substituted with a file name or path):: sentence. Example (`%s` will be substituted with a file name or path):
# PO file: # PO file:
"There is no '%s' file." "There is no '%s' file."
@ -236,7 +234,7 @@ The editor translations originate from C++ strings, and may use:
breaks in the same way as the original English string (Weblate will issue a breaks in the same way as the original English string (Weblate will issue a
warning if you don't). Line breaks might sometimes be used for vertical warning if you don't). Line breaks might sometimes be used for vertical
spacing, or manual wrapping of long lines which would otherwise be too long spacing, or manual wrapping of long lines which would otherwise be too long
especially in the editor translation). Example:: especially in the editor translation). Example:
# PO file: # PO file:
"Scene '%s' is currently being edited.\n" "Scene '%s' is currently being edited.\n"
@ -256,8 +254,9 @@ Online documentation (RST)
The documentation translations originate from reStructuredText (RST) files, The documentation translations originate from reStructuredText (RST) files,
which also use their own markup syntax to style text, create internal and which also use their own markup syntax to style text, create internal and
external links, etc. Here are some examples:: external links, etc. Here are some examples:
```
# "development" is styled bold. # "development" is styled bold.
# "Have a look here" is a link pointing to https://docs.godotengine.org/en/latest. # "Have a look here" is a link pointing to https://docs.godotengine.org/en/latest.
# You should translate "Have a look here", but not the URL, unless there is # You should translate "Have a look here", but not the URL, unless there is
@ -293,6 +292,7 @@ external links, etc. Here are some examples::
Save the scene. Click Scene -> Save, or press :kbd:`Ctrl + S` on Windows/Linux Save the scene. Click Scene -> Save, or press :kbd:`Ctrl + S` on Windows/Linux
or :kbd:`Cmd + S` on macOS. or :kbd:`Cmd + S` on macOS.
```
See also: See also:
@ -312,13 +312,15 @@ Some of the tags used are from the original BBCode (e.g. `[b]Bold[/b]` and
`[i]Italics[/i]`), while others are Godot-specific and used for advanced `[i]Italics[/i]`), while others are Godot-specific and used for advanced
features such as inline code (e.g. `[code]true[/code]`), linking to another features such as inline code (e.g. `[code]true[/code]`), linking to another
class (e.g. `[Node2D]`) or to a property in a given class (e.g. class (e.g. `[Node2D]`) or to a property in a given class (e.g.
`[member Node2D.position]`), or for multiline code blocks. Example:: `[member Node2D.position]`), or for multiline code blocks. Example:
```
Returns a color according to the standardized [code]name[/code] with [code]alpha[/code] ranging from 0 to 1. Returns a color according to the standardized [code]name[/code] with [code]alpha[/code] ranging from 0 to 1.
[codeblock] [codeblock]
red = ColorN("red", 1) red = ColorN("red", 1)
[/codeblock] [/codeblock]
Supported color names are the same as the constants defined in [Color]. Supported color names are the same as the constants defined in [Color].
```
In the above example, `[code]name[/code]`, `[code]alpha[/code]`, and In the above example, `[code]name[/code]`, `[code]alpha[/code]`, and
`[Color]` should *not* be translated, as they refer respectively to argument `[Color]` should *not* be translated, as they refer respectively to argument

View File

@ -95,9 +95,9 @@ Note:
To clone your fork from GitHub, use the following command: To clone your fork from GitHub, use the following command:
:: ```
$ git clone https://github.com/USERNAME/godot $ git clone https://github.com/USERNAME/godot
```
Note: Note:
In our examples, the "$" character denotes the command line prompt In our examples, the "$" character denotes the command line prompt
@ -107,16 +107,16 @@ Note:
After a little while, you should have a `godot` directory in your current After a little while, you should have a `godot` directory in your current
working directory. Move into it using the `cd` command: working directory. Move into it using the `cd` command:
:: ```
$ cd godot $ cd godot
```
We will start by setting up a reference to the original repository that we forked: We will start by setting up a reference to the original repository that we forked:
:: ```
$ git remote add upstream https://github.com/godotengine/godot $ git remote add upstream https://github.com/godotengine/godot
$ git fetch upstream $ git fetch upstream
```
This will create a reference named `upstream` pointing to the original This will create a reference named `upstream` pointing to the original
`godotengine/godot` repository. This will be useful when you want to pull new `godotengine/godot` repository. This will be useful when you want to pull new
@ -150,44 +150,44 @@ By default, the `git clone` should have put you on the `master` branch of
your fork (`origin`). To start your own feature development, we will create your fork (`origin`). To start your own feature development, we will create
a feature branch: a feature branch:
:: ```
# Create the branch based on the current branch (master) # Create the branch based on the current branch (master)
$ git branch better-project-manager $ git branch better-project-manager
# Change the current branch to the new one # Change the current branch to the new one
$ git checkout better-project-manager $ git checkout better-project-manager
```
This command is equivalent: This command is equivalent:
:: ```
# Change the current branch to a new named one, based on the current branch # Change the current branch to a new named one, based on the current branch
$ git checkout -b better-project-manager $ git checkout -b better-project-manager
```
If you want to go back to the `master` branch, you'd use: If you want to go back to the `master` branch, you'd use:
:: ```
$ git checkout master $ git checkout master
```
You can see which branch you are currently on with the `git branch` You can see which branch you are currently on with the `git branch`
command: command:
:: ```
$ git branch $ git branch
2.1 2.1
* better-project-manager * better-project-manager
master master
```
Be sure to always go back to the `master` branch before creating a new branch, Be sure to always go back to the `master` branch before creating a new branch,
as your current branch will be used as the base for the new one. Alternatively, as your current branch will be used as the base for the new one. Alternatively,
you can specify a custom base branch after the new branch's name: you can specify a custom base branch after the new branch's name:
:: ```
$ git checkout -b my-new-feature master $ git checkout -b my-new-feature master
```
Updating your branch Updating your branch
-------------------- --------------------
@ -202,9 +202,9 @@ To ensure there won't be conflicts between the feature you develop and the
current upstream `master` branch, you will have to update your branch by current upstream `master` branch, you will have to update your branch by
*pulling* the upstream branch. *pulling* the upstream branch.
:: ```
$ git pull --rebase upstream master $ git pull --rebase upstream master
```
The `--rebase` argument will ensure that any local changes that you committed The `--rebase` argument will ensure that any local changes that you committed
will be re-applied *on top* of the pulled branch, which is usually what we want will be re-applied *on top* of the pulled branch, which is usually what we want
@ -299,8 +299,7 @@ need to make changes, and learn by doing.
Here's how the shell history could look like on our example: Here's how the shell history could look like on our example:
:: ```
# It's nice to know where you're starting from # It's nice to know where you're starting from
$ git log $ git log
@ -328,6 +327,7 @@ Here's how the shell history could look like on our example:
$ git add editor/project_manager.cpp $ git add editor/project_manager.cpp
$ git commit -m "Add a pretty banner to the project manager" $ git commit -m "Add a pretty banner to the project manager"
$ git log $ git log
```
With this, we should have two new commits in our `better-project-manager` With this, we should have two new commits in our `better-project-manager`
branch which were not in the `master` branch. They are still only local branch which were not in the `master` branch. They are still only local
@ -341,17 +341,17 @@ done in the local repository (unlike Subversion where a commit will modify
the remote repository directly). You need to *push* the new commits to a the remote repository directly). You need to *push* the new commits to a
remote branch to share them with the world. The syntax for this is: remote branch to share them with the world. The syntax for this is:
:: ```
$ git push ( remote> ( local branch>[:( remote branch>] $ git push ( remote> ( local branch>[:( remote branch>]
```
The part about the remote branch can be omitted if you want it to have the The part about the remote branch can be omitted if you want it to have the
same name as the local branch, which is our case in this example, so we will same name as the local branch, which is our case in this example, so we will
do: do:
:: ```
$ git push origin better-project-manager $ git push origin better-project-manager
```
Git will ask you for your username and password, and the changes will be sent Git will ask you for your username and password, and the changes will be sent
to your remote. If you check the fork's page on GitHub, you should see a new to your remote. If you check the fork's page on GitHub, you should see a new
@ -390,8 +390,7 @@ The good news is that you can modify a pull request simply by acting on the
branch you made the pull request from. You can e.g. make a new commit on that branch you made the pull request from. You can e.g. make a new commit on that
branch, push it to your fork, and the PR will be updated automatically: branch, push it to your fork, and the PR will be updated automatically:
:: ```
# Check out your branch again if you had changed in the meantime # Check out your branch again if you had changed in the meantime
$ git checkout better-project-manager $ git checkout better-project-manager
@ -400,6 +399,7 @@ branch, push it to your fork, and the PR will be updated automatically:
$ git add editor/project_manager.cpp $ git add editor/project_manager.cpp
$ git commit -m "Fix a typo in the banner's title" $ git commit -m "Fix a typo in the banner's title"
$ git push origin better-project-manager $ git push origin better-project-manager
```
However, be aware that in our PR workflow, we favor commits that bring the However, be aware that in our PR workflow, we favor commits that bring the
codebase from one functional state to another functional state, without having codebase from one functional state to another functional state, without having
@ -409,8 +409,7 @@ reason to keep the changes separate). Instead of authoring a new commit,
consider using `git commit --amend` to amend the previous commit with your consider using `git commit --amend` to amend the previous commit with your
fixes. The above example would then become: fixes. The above example would then become:
:: ```
# Check out your branch again if you had changed in the meantime # Check out your branch again if you had changed in the meantime
$ git checkout better-project-manager $ git checkout better-project-manager
@ -423,6 +422,7 @@ fixes. The above example would then become:
# As we modified the last commit, it no longer matches the one from your # As we modified the last commit, it no longer matches the one from your
# remote branch, so we need to force push to overwrite that branch. # remote branch, so we need to force push to overwrite that branch.
$ git push --force origin better-project-manager $ git push --force origin better-project-manager
```
.. Kept for compatibility with the previous title, linked in many PRs. .. Kept for compatibility with the previous title, linked in many PRs.
@ -457,9 +457,9 @@ While you can give any commit ID to `git rebase -i` and review everything in
between, the most common and convenient workflow involves rebasing on the between, the most common and convenient workflow involves rebasing on the
upstream `master` branch, which you can do with: upstream `master` branch, which you can do with:
:: ```
$ git rebase -i upstream/master $ git rebase -i upstream/master
```
Note: Note:
Referencing branches in Git is a bit tricky due to the distinction Referencing branches in Git is a bit tricky due to the distinction
@ -481,10 +481,10 @@ This will open a text editor (`vi` by default, see
`Git docs ( https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_editor )` `Git docs ( https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_editor )`
to configure your favorite one) with something which may look like this: to configure your favorite one) with something which may look like this:
.. code-block:: text ```
pick 1b4aad7 Add a pretty banner to the project manager pick 1b4aad7 Add a pretty banner to the project manager
pick e07077e Fix a typo in the banner's title pick e07077e Fix a typo in the banner's title
```
The editor will also show instructions regarding how you can act on those The editor will also show instructions regarding how you can act on those
commits. In particular, it should tell you that "pick" means to use that commits. In particular, it should tell you that "pick" means to use that
@ -494,10 +494,10 @@ that "fixup" will discard the commit log from the squashed commit. In our
example, we are not interested in keeping the log of the "Fix a typo" commit, example, we are not interested in keeping the log of the "Fix a typo" commit,
so we use: so we use:
.. code-block:: text ```
pick 1b4aad7 Add a pretty banner to the project manager pick 1b4aad7 Add a pretty banner to the project manager
fixup e07077e Fix a typo in the banner's title fixup e07077e Fix a typo in the banner's title
```
Upon saving and quitting the editor, the rebase will occur. The second commit Upon saving and quitting the editor, the rebase will occur. The second commit
will be melded into the first one, and `git log` and `git show` should will be melded into the first one, and `git log` and `git show` should
@ -509,22 +509,22 @@ diverged. Indeed, commit 1b4aad7 in the above example will have changed, and
therefore got a new commit hash. If you try to push to your remote branch, it therefore got a new commit hash. If you try to push to your remote branch, it
will raise an error: will raise an error:
:: ```
$ git push origin better-project-manager $ git push origin better-project-manager
To https://github.com/akien-mga/godot To https://github.com/akien-mga/godot
! [rejected] better-project-manager -> better-project-manager (non-fast-forward) ! [rejected] better-project-manager -> better-project-manager (non-fast-forward)
error: failed to push some refs to 'https://akien-mga@github.com/akien-mga/godot' error: failed to push some refs to 'https://akien-mga@github.com/akien-mga/godot'
hint: Updates were rejected because the tip of your current branch is behind hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. hint: its remote counterpart.
```
This is a sane behavior, Git will not let you push changes that would This is a sane behavior, Git will not let you push changes that would
override remote content. But that's actually what we want to do here, so we override remote content. But that's actually what we want to do here, so we
will have to *force* it: will have to *force* it:
:: ```
$ git push --force origin better-project-manager $ git push --force origin better-project-manager
```
And tadaa! Git will happily *replace* your remote branch with what you had And tadaa! Git will happily *replace* your remote branch with what you had
locally (so make sure that's what you wanted, using `git log`). This will locally (so make sure that's what you wanted, using `git log`). This will
@ -540,18 +540,18 @@ for the remote branch on GitHub.
To delete our better project manager branch locally, use this command: To delete our better project manager branch locally, use this command:
:: ```
$ git branch -d better-project-manager $ git branch -d better-project-manager
```
Alternatively, if the branch hadn't been merged yet and we wanted to delete it anyway, instead Alternatively, if the branch hadn't been merged yet and we wanted to delete it anyway, instead
of `-d` you would use `-D`. of `-d` you would use `-D`.
Next, to delete the remote branch on GitHub use this command: Next, to delete the remote branch on GitHub use this command:
:: ```
$ git push origin -d better-project-manager $ git push origin -d better-project-manager
```
You can also delete the remote branch from the GitHub PR itself, a button should appear once You can also delete the remote branch from the GitHub PR itself, a button should appear once
it has been merged or closed. it has been merged or closed.

View File

@ -70,9 +70,11 @@ When you create a new class or modify the engine's API, you need to re-generate
To do so, you first need to compile Godot. See the To do so, you first need to compile Godot. See the
`doc_introduction_to_the_buildsystem` page to learn how. Then, execute the `doc_introduction_to_the_buildsystem` page to learn how. Then, execute the
compiled Godot binary from the Godot root directory with the `--doctool` option. compiled Godot binary from the Godot root directory with the `--doctool` option.
For example, if you're on 64-bit Linux, the command is:: For example, if you're on 64-bit Linux, the command is:
```
./bin/godot.linuxbsd.tools.64 --doctool ./bin/godot.linuxbsd.tools.64 --doctool
```
The XML files in doc/classes should then be up-to-date with current Godot Engine The XML files in doc/classes should then be up-to-date with current Godot Engine
features. You can then check what changed using the `git diff` command. Please features. You can then check what changed using the `git diff` command. Please

View File

@ -61,15 +61,15 @@ Setting up the buildsystem
- Accept the SDK component licenses by running the following command - Accept the SDK component licenses by running the following command
where `android_sdk_path` is the path to the Android SDK, then answering all the prompts with `y`: where `android_sdk_path` is the path to the Android SDK, then answering all the prompts with `y`:
:: ```
tools/bin/sdkmanager --sdk_root=( android_sdk_path> --licenses tools/bin/sdkmanager --sdk_root=( android_sdk_path> --licenses
```
- Complete setup by running the following command where `android_sdk_path` is the path to the Android SDK. - Complete setup by running the following command where `android_sdk_path` is the path to the Android SDK.
:: ```
tools/bin/sdkmanager --sdk_root=( android_sdk_path> "platform-tools" "build-tools;30.0.3" "platforms;android-29" "cmdline-tools;latest" "cmake;3.10.2.4988404" tools/bin/sdkmanager --sdk_root=( android_sdk_path> "platform-tools" "build-tools;30.0.3" "platforms;android-29" "cmdline-tools;latest" "cmake;3.10.2.4988404"
```
See also: See also:
To set the environment variable on Windows, press :kbd:`Windows + R`, type To set the environment variable on Windows, press :kbd:`Windows + R`, type
@ -95,8 +95,7 @@ root directory with the following arguments:
- Release template (used when exporting with **Debugging Enabled** unchecked) - Release template (used when exporting with **Debugging Enabled** unchecked)
:: ```
scons platform=android target=release android_arch=armv7 scons platform=android target=release android_arch=armv7
scons platform=android target=release android_arch=arm64v8 scons platform=android target=release android_arch=arm64v8
cd platform/android/java cd platform/android/java
@ -104,14 +103,13 @@ root directory with the following arguments:
.\gradlew generateGodotTemplates .\gradlew generateGodotTemplates
# On Linux and macOS # On Linux and macOS
./gradlew generateGodotTemplates ./gradlew generateGodotTemplates
```
The resulting APK will be located at `bin/android_release.apk`. The resulting APK will be located at `bin/android_release.apk`.
- Debug template (used when exporting with **Debugging Enabled** checked) - Debug template (used when exporting with **Debugging Enabled** checked)
:: ```
scons platform=android target=release_debug android_arch=armv7 scons platform=android target=release_debug android_arch=armv7
scons platform=android target=release_debug android_arch=arm64v8 scons platform=android target=release_debug android_arch=arm64v8
cd platform/android/java cd platform/android/java
@ -119,7 +117,7 @@ The resulting APK will be located at `bin/android_release.apk`.
.\gradlew generateGodotTemplates .\gradlew generateGodotTemplates
# On Linux and macOS # On Linux and macOS
./gradlew generateGodotTemplates ./gradlew generateGodotTemplates
```
The resulting APK will be located at `bin/android_debug.apk`. The resulting APK will be located at `bin/android_debug.apk`.
@ -131,8 +129,7 @@ command a third and fourth time with the `android_arch=x86`, and
`android_arch=x86_64` arguments before building the APK with Gradle. For `android_arch=x86_64` arguments before building the APK with Gradle. For
example, for the release template: example, for the release template:
:: ```
scons platform=android target=release android_arch=armv7 scons platform=android target=release android_arch=armv7
scons platform=android target=release android_arch=arm64v8 scons platform=android target=release android_arch=arm64v8
scons platform=android target=release android_arch=x86 scons platform=android target=release android_arch=x86
@ -142,7 +139,7 @@ example, for the release template:
.\gradlew generateGodotTemplates .\gradlew generateGodotTemplates
# On Linux and macOS # On Linux and macOS
./gradlew generateGodotTemplates ./gradlew generateGodotTemplates
```
This will create a fat binary that works on all platforms. This will create a fat binary that works on all platforms.
The final APK size of exported projects will depend on the platforms you choose The final APK size of exported projects will depend on the platforms you choose
@ -154,14 +151,13 @@ Cleaning the generated export templates
You can use the following commands to remove the generated export templates: You can use the following commands to remove the generated export templates:
:: ```
cd platform/android/java cd platform/android/java
# On Windows # On Windows
.\gradlew cleanGodotTemplates .\gradlew cleanGodotTemplates
# On Linux and macOS # On Linux and macOS
./gradlew cleanGodotTemplates ./gradlew cleanGodotTemplates
```
Using the export templates Using the export templates
-------------------------- --------------------------
@ -226,9 +222,9 @@ If so:
If it still fails, open a command line and run `logcat ( https://developer.android.com/studio/command-line/logcat )`: If it still fails, open a command line and run `logcat ( https://developer.android.com/studio/command-line/logcat )`:
:: ```
adb logcat adb logcat
```
Then check the output while the application is installed; Then check the output while the application is installed;
the error message should be presented there. the error message should be presented there.

View File

@ -30,24 +30,24 @@ Compiling
Open a Terminal, go to the root dir of the engine source code and type: Open a Terminal, go to the root dir of the engine source code and type:
:: ```
$ scons p=iphone target=debug $ scons p=iphone target=debug
```
for a debug build, or: for a debug build, or:
:: ```
$ scons p=iphone target=release $ scons p=iphone target=release
```
for a release build (check `platform/iphone/detect.py` for the compiler for a release build (check `platform/iphone/detect.py` for the compiler
flags used for each configuration). flags used for each configuration).
Alternatively, you can run Alternatively, you can run
:: ```
$ scons p=iphone arch=x86_64 target=debug $ scons p=iphone arch=x86_64 target=debug
```
for a Simulator executable. for a Simulator executable.
@ -57,24 +57,24 @@ The best way to provide these is to create a bundle in which there are both 32-b
It can be done in three steps: first compile the 32-bit version, then compile the 64-bit version and then use `lipo` to bundle them into one "universal" binary. It can be done in three steps: first compile the 32-bit version, then compile the 64-bit version and then use `lipo` to bundle them into one "universal" binary.
All those steps can be performed with following commands: All those steps can be performed with following commands:
:: ```
$ scons p=iphone tools=no target=release arch=arm $ scons p=iphone tools=no target=release arch=arm
$ scons p=iphone tools=no target=release arch=arm64 $ scons p=iphone tools=no target=release arch=arm64
$ lipo -create bin/libgodot.iphone.opt.arm.a bin/libgodot.iphone.opt.arm64.a -output bin/libgodot.iphone.release.fat.a $ lipo -create bin/libgodot.iphone.opt.arm.a bin/libgodot.iphone.opt.arm64.a -output bin/libgodot.iphone.release.fat.a
$ lipo -create bin/libgodot_camera_module.iphone.opt.arm.a bin/libgodot_camera_module.iphone.opt.arm64.a -output bin/libgodot_camera_module.iphone.release.fat.a $ lipo -create bin/libgodot_camera_module.iphone.opt.arm.a bin/libgodot_camera_module.iphone.opt.arm64.a -output bin/libgodot_camera_module.iphone.release.fat.a
$ lipo -create bin/libgodot_arkit_module.iphone.opt.arm.a bin/libgodot_arkit_module.iphone.opt.arm64.a -output bin/libgodot_arkit_module.iphone.release.fat.a $ lipo -create bin/libgodot_arkit_module.iphone.opt.arm.a bin/libgodot_arkit_module.iphone.opt.arm64.a -output bin/libgodot_arkit_module.iphone.release.fat.a
```
If you also want to provide a simulator build (reduces the chance of any linker errors with dependencies), you'll need to build and lipo the `x86_64` architecture as well. If you also want to provide a simulator build (reduces the chance of any linker errors with dependencies), you'll need to build and lipo the `x86_64` architecture as well.
:: ```
$ scons p=iphone tools=no target=release arch=arm $ scons p=iphone tools=no target=release arch=arm
$ scons p=iphone tools=no target=release arch=arm64 $ scons p=iphone tools=no target=release arch=arm64
$ scons p=iphone tools=no target=release arch=x86_64 $ scons p=iphone tools=no target=release arch=x86_64
$ lipo -create bin/libgodot.iphone.opt.arm.a bin/libgodot.iphone.opt.arm64.a bin/libgodot.iphone.opt.x86_64.a -output bin/libgodot.iphone.release.fat.a $ lipo -create bin/libgodot.iphone.opt.arm.a bin/libgodot.iphone.opt.arm64.a bin/libgodot.iphone.opt.x86_64.a -output bin/libgodot.iphone.release.fat.a
$ lipo -create bin/libgodot_camera_module.iphone.opt.arm.a bin/libgodot_camera_module.iphone.opt.arm64.a bin/libgodot_camera_module.iphone.opt.x86_64.a -output bin/libgodot_camera_module.iphone.release.fat.a $ lipo -create bin/libgodot_camera_module.iphone.opt.arm.a bin/libgodot_camera_module.iphone.opt.arm64.a bin/libgodot_camera_module.iphone.opt.x86_64.a -output bin/libgodot_camera_module.iphone.release.fat.a
$ lipo -create bin/libgodot_arkit_module.iphone.opt.arm.a bin/libgodot_arkit_module.iphone.opt.arm64.a bin/libgodot_arkit_module.iphone.opt.x86_64.a -output bin/libgodot_arkit_module.iphone.release.fat.a $ lipo -create bin/libgodot_arkit_module.iphone.opt.arm.a bin/libgodot_arkit_module.iphone.opt.arm64.a bin/libgodot_arkit_module.iphone.opt.x86_64.a -output bin/libgodot_arkit_module.iphone.release.fat.a
```
Run Run
--- ---

View File

@ -23,18 +23,22 @@ For compiling under macOS, the following is required:
Note: Note:
If you have `Homebrew ( https://brew.sh/ )` installed, you can easily If you have `Homebrew ( https://brew.sh/ )` installed, you can easily
install SCons and yasm using the following command:: install SCons and yasm using the following command:
```
brew install scons yasm brew install scons yasm
```
Installing Homebrew will also fetch the Command Line Tools Installing Homebrew will also fetch the Command Line Tools
for Xcode automatically if you don't have them already. for Xcode automatically if you don't have them already.
Similarly, if you have `MacPorts ( https://www.macports.org/ )` Similarly, if you have `MacPorts ( https://www.macports.org/ )`
installed, you can easily install SCons and yasm using the installed, you can easily install SCons and yasm using the
following command:: following command:
```
sudo port install scons yasm sudo port install scons yasm
```
See also: See also:
To get the Godot source code for compiling, see To get the Godot source code for compiling, see
@ -48,17 +52,23 @@ Compiling
Start a terminal, go to the root directory of the engine source code. Start a terminal, go to the root directory of the engine source code.
To compile for Intel (x86-64) powered Macs, use:: To compile for Intel (x86-64) powered Macs, use
```
scons platform=osx arch=x86_64 --jobs=$(sysctl -n hw.logicalcpu) scons platform=osx arch=x86_64 --jobs=$(sysctl -n hw.logicalcpu)
```
To compile for Apple Silicon (ARM64) powered Macs, use:: To compile for Apple Silicon (ARM64) powered Macs, use:
```
scons platform=osx arch=arm64 --jobs=$(sysctl -n hw.logicalcpu) scons platform=osx arch=arm64 --jobs=$(sysctl -n hw.logicalcpu)
```
To support both architectures in a single "Universal 2" binary, run the above two commands and then use `lipo` to bundle them together:: To support both architectures in a single "Universal 2" binary, run the above two commands and then use `lipo` to bundle them together:
```
lipo -create bin/godot.osx.tools.x86_64 bin/godot.osx.tools.arm64 -output bin/godot.osx.tools.universal lipo -create bin/godot.osx.tools.x86_64 bin/godot.osx.tools.arm64 -output bin/godot.osx.tools.universal
```
If all goes well, the resulting binary executable will be placed in the If all goes well, the resulting binary executable will be placed in the
`bin/` subdirectory. This executable file contains the whole engine and `bin/` subdirectory. This executable file contains the whole engine and
@ -73,30 +83,38 @@ Note:
To create an `.app` bundle like in the official builds, you need to use the To create an `.app` bundle like in the official builds, you need to use the
template located in `misc/dist/osx_tools.app`. Typically, for an optimized template located in `misc/dist/osx_tools.app`. Typically, for an optimized
editor binary built with `target=release_debug`:: editor binary built with `target=release_debug`:
```
cp -r misc/dist/osx_tools.app ./Godot.app cp -r misc/dist/osx_tools.app ./Godot.app
mkdir -p Godot.app/Contents/MacOS mkdir -p Godot.app/Contents/MacOS
cp bin/godot.osx.opt.tools.universal Godot.app/Contents/MacOS/Godot cp bin/godot.osx.opt.tools.universal Godot.app/Contents/MacOS/Godot
chmod +x Godot.app/Contents/MacOS/Godot chmod +x Godot.app/Contents/MacOS/Godot
```
Compiling a headless/server build Compiling a headless/server build
--------------------------------- ---------------------------------
To compile a *headless* build which provides editor functionality to export To compile a *headless* build which provides editor functionality to export
projects in an automated manner, use:: projects in an automated manner, use:
```
scons platform=server tools=yes target=release_debug --jobs=$(sysctl -n hw.logicalcpu) scons platform=server tools=yes target=release_debug --jobs=$(sysctl -n hw.logicalcpu)
```
To compile a debug *server* build which can be used with To compile a debug *server* build which can be used with
`remote debugging tools ( doc_command_line_tutorial )`, use:: `remote debugging tools ( doc_command_line_tutorial )`, use:
```
scons platform=server tools=no target=release_debug --jobs=$(sysctl -n hw.logicalcpu) scons platform=server tools=no target=release_debug --jobs=$(sysctl -n hw.logicalcpu)
```
To compile a release *server* build which is optimized to run dedicated game servers, To compile a release *server* build which is optimized to run dedicated game servers,
use:: use:
```
scons platform=server tools=no target=release --jobs=$(sysctl -n hw.logicalcpu) scons platform=server tools=no target=release --jobs=$(sysctl -n hw.logicalcpu)
```
Building export templates Building export templates
------------------------- -------------------------
@ -109,39 +127,49 @@ Official templates are universal binaries which support both Intel x86_64 and
ARM64 architectures. You can also create export templates that support only one ARM64 architectures. You can also create export templates that support only one
of those two architectures by leaving out the `lipo` step below. of those two architectures by leaving out the `lipo` step below.
- For Intel x86_64:: - For Intel x86_64:
```
scons platform=osx tools=no target=release arch=x86_64 --jobs=$(sysctl -n hw.logicalcpu) scons platform=osx tools=no target=release arch=x86_64 --jobs=$(sysctl -n hw.logicalcpu)
scons platform=osx tools=no target=release_debug arch=x86_64 --jobs=$(sysctl -n hw.logicalcpu) scons platform=osx tools=no target=release_debug arch=x86_64 --jobs=$(sysctl -n hw.logicalcpu)
```
- For ARM64 (Apple M1):: - For ARM64 (Apple M1):
```
scons platform=osx tools=no target=release arch=arm64 --jobs=$(sysctl -n hw.logicalcpu) scons platform=osx tools=no target=release arch=arm64 --jobs=$(sysctl -n hw.logicalcpu)
scons platform=osx tools=no target=release_debug arch=arm64 --jobs=$(sysctl -n hw.logicalcpu) scons platform=osx tools=no target=release_debug arch=arm64 --jobs=$(sysctl -n hw.logicalcpu)
```
To support both architectures in a single "Universal 2" binary, run the above To support both architectures in a single "Universal 2" binary, run the above
two commands blocks and then use `lipo` to bundle them together:: two commands blocks and then use `lipo` to bundle them together:
```
lipo -create bin/godot.osx.opt.x86_64 bin/godot.osx.opt.arm64 -output bin/godot.osx.opt.universal lipo -create bin/godot.osx.opt.x86_64 bin/godot.osx.opt.arm64 -output bin/godot.osx.opt.universal
lipo -create bin/godot.osx.opt.debug.x86_64 bin/godot.osx.opt.debug.arm64 -output bin/godot.osx.opt.debug.universal lipo -create bin/godot.osx.opt.debug.x86_64 bin/godot.osx.opt.debug.arm64 -output bin/godot.osx.opt.debug.universal
```
To create an `.app` bundle like in the official builds, you need to use the To create an `.app` bundle like in the official builds, you need to use the
template located in `misc/dist/osx_template.app`. The release and debug template located in `misc/dist/osx_template.app`. The release and debug
builds should be placed in `osx_template.app/Contents/MacOS` with the names builds should be placed in `osx_template.app/Contents/MacOS` with the names
`godot_osx_release.64` and `godot_osx_debug.64` respectively. You can do so `godot_osx_release.64` and `godot_osx_debug.64` respectively. You can do so
with the following commands (assuming a universal build, otherwise replace the with the following commands (assuming a universal build, otherwise replace the
`.universal` extension with the one of your arch-specific binaries):: `.universal` extension with the one of your arch-specific binaries):
```
cp -r misc/dist/osx_template.app . cp -r misc/dist/osx_template.app .
mkdir -p osx_template.app/Contents/MacOS mkdir -p osx_template.app/Contents/MacOS
cp bin/godot.osx.opt.universal osx_template.app/Contents/MacOS/godot_osx_release.64 cp bin/godot.osx.opt.universal osx_template.app/Contents/MacOS/godot_osx_release.64
cp bin/godot.osx.opt.debug.universal osx_template.app/Contents/MacOS/godot_osx_debug.64 cp bin/godot.osx.opt.debug.universal osx_template.app/Contents/MacOS/godot_osx_debug.64
chmod +x osx_template.app/Contents/MacOS/godot_osx* chmod +x osx_template.app/Contents/MacOS/godot_osx*
```
You can then zip the `osx_template.app` folder to reproduce the `osx.zip` You can then zip the `osx_template.app` folder to reproduce the `osx.zip`
template from the official Godot distribution:: template from the official Godot distribution:
```
zip -q -9 -r osx.zip osx_template.app zip -q -9 -r osx.zip osx_template.app
```
Cross-compiling for macOS from Linux Cross-compiling for macOS from Linux
------------------------------------ ------------------------------------
@ -153,9 +181,11 @@ as a target. First, follow the instructions to install it:
Clone the `OSXCross repository ( https://github.com/tpoechtrager/osxcross )` Clone the `OSXCross repository ( https://github.com/tpoechtrager/osxcross )`
somewhere on your machine (or download a ZIP file and extract it somewhere), somewhere on your machine (or download a ZIP file and extract it somewhere),
e.g.:: e.g.:
```
git clone --depth=1 https://github.com/tpoechtrager/osxcross.git "$HOME/osxcross" git clone --depth=1 https://github.com/tpoechtrager/osxcross.git "$HOME/osxcross"
```
1. Follow the instructions to package the SDK: 1. Follow the instructions to package the SDK:
https://github.com/tpoechtrager/osxcross#packaging-the-sdk https://github.com/tpoechtrager/osxcross#packaging-the-sdk
@ -164,14 +194,20 @@ e.g.::
After that, you will need to define the `OSXCROSS_ROOT` as the path to After that, you will need to define the `OSXCROSS_ROOT` as the path to
the OSXCross installation (the same place where you cloned the the OSXCross installation (the same place where you cloned the
repository/extracted the zip), e.g.:: repository/extracted the zip), e.g.:
```
export OSXCROSS_ROOT="$HOME/osxcross" export OSXCROSS_ROOT="$HOME/osxcross"
```
Now you can compile with SCons like you normally would:: Now you can compile with SCons like you normally would:
```
scons platform=osx scons platform=osx
```
If you have an OSXCross SDK version different from the one expected by the SCons buildsystem, you can specify a custom one with the `osxcross_sdk` argument:: If you have an OSXCross SDK version different from the one expected by the SCons buildsystem, you can specify a custom one with the `osxcross_sdk` argument:
```
scons platform=osx osxcross_sdk=darwin15 scons platform=osx osxcross_sdk=darwin15
```

View File

@ -54,9 +54,11 @@ Set the `ANGLE_SRC_PATH` to the directory where you downloaded the ANGLE
source code. The build process will also build ANGLE to produce the source code. The build process will also build ANGLE to produce the
required DLLs for the selected architecture. required DLLs for the selected architecture.
Once you're set, run the SCons command similarly to the other platforms:: Once you're set, run the SCons command similarly to the other platforms:
```
C:\godot>scons platform=uwp C:\godot>scons platform=uwp
```
Creating UWP export templates Creating UWP export templates
----------------------------- -----------------------------
@ -66,10 +68,12 @@ You need all three architectures with `debug` and `release` templates to
be able to export. be able to export.
Open the command prompt for one architecture and run SCons twice (once for Open the command prompt for one architecture and run SCons twice (once for
each target):: each target):
```
C:\godot>scons platform=uwp target=release_debug C:\godot>scons platform=uwp target=release_debug
C:\godot>scons platform=uwp target=release C:\godot>scons platform=uwp target=release
```
Repeat for the other architectures. Repeat for the other architectures.
@ -84,14 +88,16 @@ under `winrt/10/src/Release_%arch%` (where `%arch%` can be `Win32`,
putting them along with the executable. putting them along with the executable.
Add the files in the `uwp_template` folder to a ZIP. Rename the resulting Add the files in the `uwp_template` folder to a ZIP. Rename the resulting
Zip according to the target/architecture of the template:: Zip according to the target/architecture of the template:
```
uwp_x86_debug.zip uwp_x86_debug.zip
uwp_x86_release.zip uwp_x86_release.zip
uwp_x64_debug.zip uwp_x64_debug.zip
uwp_x64_release.zip uwp_x64_release.zip
uwp_arm_debug.zip uwp_arm_debug.zip
uwp_arm_release.zip uwp_arm_release.zip
```
Move those templates to the `[versionstring]\templates` folder in Godot Move those templates to the `[versionstring]\templates` folder in Godot
settings path, where `versionstring` is the version of Godot you have compiled settings path, where `versionstring` is the version of Godot you have compiled

View File

@ -35,18 +35,22 @@ and `source ./emsdk_env.sh`/`emsdk_env.bat`.
Open a terminal and navigate to the root directory of the engine source code. Open a terminal and navigate to the root directory of the engine source code.
Then instruct SCons to build the JavaScript platform. Specify `target` as Then instruct SCons to build the JavaScript platform. Specify `target` as
either `release` for a release build or `release_debug` for a debug build:: either `release` for a release build or `release_debug` for a debug build:
```
scons platform=javascript tools=no target=release scons platform=javascript tools=no target=release
scons platform=javascript tools=no target=release_debug scons platform=javascript tools=no target=release_debug
```
By default, the `JavaScript singleton ( doc_javascript_eval )` will be built By default, the `JavaScript singleton ( doc_javascript_eval )` will be built
into the engine. Official export templates also have the JavaScript singleton into the engine. Official export templates also have the JavaScript singleton
enabled. Since `eval()` calls can be a security concern, the enabled. Since `eval()` calls can be a security concern, the
`javascript_eval` option can be used to build without the singleton:: `javascript_eval` option can be used to build without the singleton:
```
scons platform=javascript tools=no target=release javascript_eval=no scons platform=javascript tools=no target=release javascript_eval=no
scons platform=javascript tools=no target=release_debug javascript_eval=no scons platform=javascript tools=no target=release_debug javascript_eval=no
```
The engine will now be compiled to WebAssembly by Emscripten. Once finished, The engine will now be compiled to WebAssembly by Emscripten. Once finished,
the resulting file will be placed in the `bin` subdirectory. Its name is the resulting file will be placed in the `bin` subdirectory. Its name is
@ -54,13 +58,17 @@ the resulting file will be placed in the `bin` subdirectory. Its name is
for debug. for debug.
Finally, rename the zip archive to `webassembly_release.zip` for the Finally, rename the zip archive to `webassembly_release.zip` for the
release template:: release template:
```
mv bin/godot.javascript.opt.zip bin/webassembly_release.zip mv bin/godot.javascript.opt.zip bin/webassembly_release.zip
```
And `webassembly_debug.zip` for the debug template:: And `webassembly_debug.zip` for the debug template:
```
mv bin/godot.javascript.opt.debug.zip bin/webassembly_debug.zip mv bin/godot.javascript.opt.debug.zip bin/webassembly_debug.zip
```
Threads and GDNative Threads and GDNative
-------------------- --------------------
@ -70,37 +78,45 @@ performance and compatibility reasons. See the
`export page ( doc_javascript_export_options )` for more info. `export page ( doc_javascript_export_options )` for more info.
You can build the export templates using the option `threads_enabled=yes` or You can build the export templates using the option `threads_enabled=yes` or
`gdnative_enabled=yes` to enable threads or GDNative support:: `gdnative_enabled=yes` to enable threads or GDNative support:
```
scons platform=javascript tools=no threads_enabled=yes target=release scons platform=javascript tools=no threads_enabled=yes target=release
scons platform=javascript tools=no threads_enabled=yes target=release_debug scons platform=javascript tools=no threads_enabled=yes target=release_debug
scons platform=javascript tools=no gdnative_enabled=yes target=release scons platform=javascript tools=no gdnative_enabled=yes target=release
scons platform=javascript tools=no gdnative_enabled=yes target=release_debug scons platform=javascript tools=no gdnative_enabled=yes target=release_debug
```
Once finished, the resulting file will be placed in the `bin` subdirectory. Once finished, the resulting file will be placed in the `bin` subdirectory.
Its name will have either the `.threads` or `.gdnative` suffix. Its name will have either the `.threads` or `.gdnative` suffix.
Finally, rename the zip archives to `webassembly_release_threads.zip` and Finally, rename the zip archives to `webassembly_release_threads.zip` and
`webassembly_release_gdnative.zip` for the release template:: `webassembly_release_gdnative.zip` for the release template:
```
mv bin/godot.javascript.opt.threads.zip bin/webassembly_threads_release.zip mv bin/godot.javascript.opt.threads.zip bin/webassembly_threads_release.zip
mv bin/godot.javascript.opt.gdnative.zip bin/webassembly_gdnative_release.zip mv bin/godot.javascript.opt.gdnative.zip bin/webassembly_gdnative_release.zip
```
And `webassembly_debug_threads.zip` and `webassembly_debug_gdnative.zip` for And `webassembly_debug_threads.zip` and `webassembly_debug_gdnative.zip` for
the debug template:: the debug template:
```
mv bin/godot.javascript.opt.debug.threads.zip bin/webassembly_threads_debug.zip mv bin/godot.javascript.opt.debug.threads.zip bin/webassembly_threads_debug.zip
mv bin/godot.javascript.opt.debug.gdnative.zip bin/webassembly_gdnative_debug.zip mv bin/godot.javascript.opt.debug.gdnative.zip bin/webassembly_gdnative_debug.zip
```
Building the Editor Building the Editor
------------------- -------------------
It is also possible to build a version of the Godot editor that can run in the It is also possible to build a version of the Godot editor that can run in the
browser. The editor version requires threads support and is not recommended browser. The editor version requires threads support and is not recommended
over the native build. You can build the editor with:: over the native build. You can build the editor with:
```
scons platform=javascript tools=yes threads_enabled=yes target=release_debug scons platform=javascript tools=yes threads_enabled=yes target=release_debug
```
Once finished, the resulting file will be placed in the `bin` subdirectory. Once finished, the resulting file will be placed in the `bin` subdirectory.
Its name will be `godot.javascript.opt.tools.threads.zip`. You can upload the Its name will be `godot.javascript.opt.tools.threads.zip`. You can upload the

View File

@ -28,16 +28,20 @@ For compiling under Windows, the following is required:
Note: Note:
If you have `Scoop ( https://scoop.sh/ )` installed, you can easily If you have `Scoop ( https://scoop.sh/ )` installed, you can easily
install MinGW and other dependencies using the following command:: install MinGW and other dependencies using the following command:
```
scoop install gcc python scons make scoop install gcc python scons make
```
Note: Note:
If you have `MSYS2 ( https://www.msys2.org/ )` installed, you can easily If you have `MSYS2 ( https://www.msys2.org/ )` installed, you can easily
install MinGW and other dependencies using the following command:: install MinGW and other dependencies using the following command:
```
pacman -S mingw-w64-x86_64-python3-pip mingw-w64-x86_64-gcc \ pacman -S mingw-w64-x86_64-python3-pip mingw-w64-x86_64-gcc \
mingw-w64-i686-python3-pip mingw-w64-i686-gcc make mingw-w64-i686-python3-pip mingw-w64-i686-gcc make
```
For each MSYS2 MinGW subsystem, you should then run For each MSYS2 MinGW subsystem, you should then run
`pip3 install scons` in its shell. `pip3 install scons` in its shell.
@ -52,9 +56,11 @@ See also:
Setting up SCons Setting up SCons
---------------- ----------------
To install SCons, open the command prompt and run the following command:: To install SCons, open the command prompt and run the following command:
```
python -m pip install scons python -m pip install scons
```
If you are prompted with the message If you are prompted with the message
`Defaulting to user installation because normal site-packages is not `Defaulting to user installation because normal site-packages is not
@ -134,13 +140,17 @@ Running SCons
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
After opening a command prompt, change to the root directory of After opening a command prompt, change to the root directory of
the engine source code (using `cd`) and type:: the engine source code (using `cd`) and type:
```
C:\godot> scons platform=windows C:\godot> scons platform=windows
```
You can specify a number of CPU threads to use to speed up the build:: You can specify a number of CPU threads to use to speed up the build:
```
C:\godot> scons -j6 platform=windows C:\godot> scons -j6 platform=windows
```
In general, it is OK to have at least as many threads compiling Godot as you In general, it is OK to have at least as many threads compiling Godot as you
have cores in your CPU, if not one or two more. Feel free to add the `-j` have cores in your CPU, if not one or two more. Feel free to add the `-j`
@ -186,9 +196,11 @@ Folder-based editors don't require any particular setup to start working with Go
codebase. To edit projects with Visual Studio they need to be set up as a solution. codebase. To edit projects with Visual Studio they need to be set up as a solution.
You can create a Visual Studio solution via SCons by running SCons with You can create a Visual Studio solution via SCons by running SCons with
the `vsproj=yes` parameter, like this:: the `vsproj=yes` parameter, like this:
```
scons p=windows vsproj=yes scons p=windows vsproj=yes
```
You will be able to open Godot's source in a Visual Studio solution now, You will be able to open Godot's source in a Visual Studio solution now,
and able to build Godot using Visual Studio's **Build** button. and able to build Godot using Visual Studio's **Build** button.
@ -207,20 +219,20 @@ here are some known ones:
+----------------+--------------------------------------------------------------+ +----------------+--------------------------------------------------------------+
| **Arch Linux** | Install `mingw-w64-gcc from the AUR`. | | **Arch Linux** | Install `mingw-w64-gcc from the AUR`. |
+----------------+--------------------------------------------------------------+ +----------------+--------------------------------------------------------------+
| **Debian** / | :: | | **Debian** / | |
| **Ubuntu** | | | **Ubuntu** | |
| | apt install mingw-w64 | | | apt install mingw-w64 |
+----------------+--------------------------------------------------------------+ +----------------+--------------------------------------------------------------+
| **Fedora** | :: | | **Fedora** | |
| | | | | |
| | dnf install mingw64-gcc-c++ mingw64-winpthreads-static \ | | | dnf install mingw64-gcc-c++ mingw64-winpthreads-static \ |
| | mingw32-gcc-c++ mingw32-winpthreads-static | | | mingw32-gcc-c++ mingw32-winpthreads-static |
+----------------+--------------------------------------------------------------+ +----------------+--------------------------------------------------------------+
| **macOS** | :: | | **macOS** | |
| | | | | |
| | brew install mingw-w64 | | | brew install mingw-w64 |
+----------------+--------------------------------------------------------------+ +----------------+--------------------------------------------------------------+
| **Mageia** | :: | | **Mageia** | |
| | | | | |
| | urpmi mingw64-gcc-c++ mingw64-winpthreads-static \ | | | urpmi mingw64-gcc-c++ mingw64-winpthreads-static \ |
| | mingw32-gcc-c++ mingw32-winpthreads-static | | | mingw32-gcc-c++ mingw32-winpthreads-static |
@ -229,24 +241,30 @@ here are some known ones:
.. _mingw-w64-gcc from the AUR: https://aur.archlinux.org/packages/mingw-w64-gcc/ .. _mingw-w64-gcc from the AUR: https://aur.archlinux.org/packages/mingw-w64-gcc/
Before attempting the compilation, SCons will check for Before attempting the compilation, SCons will check for
the following binaries in your `PATH` environment variable:: the following binaries in your `PATH` environment variable:
```
i686-w64-mingw32-gcc i686-w64-mingw32-gcc
x86_64-w64-mingw32-gcc x86_64-w64-mingw32-gcc
```
If the binaries are not located in the `PATH` (e.g. `/usr/bin`), If the binaries are not located in the `PATH` (e.g. `/usr/bin`),
you can define the following environment variables to give a hint to you can define the following environment variables to give a hint to
the build system:: the build system:
```
export MINGW32_PREFIX="/path/to/i686-w64-mingw32-" export MINGW32_PREFIX="/path/to/i686-w64-mingw32-"
export MINGW64_PREFIX="/path/to/x86_64-w64-mingw32-" export MINGW64_PREFIX="/path/to/x86_64-w64-mingw32-"
```
To make sure you are doing things correctly, executing the following in To make sure you are doing things correctly, executing the following in
the shell should result in a working compiler (the version output may the shell should result in a working compiler (the version output may
differ based on your system):: differ based on your system):
```
${MINGW32_PREFIX}gcc --version ${MINGW32_PREFIX}gcc --version
# i686-w64-mingw32-gcc (GCC) 6.1.0 20160427 (Mageia MinGW 6.1.0-1.mga6) # i686-w64-mingw32-gcc (GCC) 6.1.0 20160427 (Mageia MinGW 6.1.0-1.mga6)
```
Troubleshooting Troubleshooting
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
@ -256,43 +274,53 @@ Cross-compiling from some Ubuntu versions may lead to
due to a default configuration lacking support for POSIX threading. due to a default configuration lacking support for POSIX threading.
You can change that configuration following those instructions, You can change that configuration following those instructions,
for 64-bit:: for 64-bit:
```
sudo update-alternatives --config x86_64-w64-mingw32-gcc sudo update-alternatives --config x86_64-w64-mingw32-gcc
<choose x86_64-w64-mingw32-gcc-posix from the list> <choose x86_64-w64-mingw32-gcc-posix from the list>
sudo update-alternatives --config x86_64-w64-mingw32-g++ sudo update-alternatives --config x86_64-w64-mingw32-g++
<choose x86_64-w64-mingw32-g++-posix from the list> <choose x86_64-w64-mingw32-g++-posix from the list>
```
And for 32-bit:: And for 32-bit:
```
sudo update-alternatives --config i686-w64-mingw32-gcc sudo update-alternatives --config i686-w64-mingw32-gcc
<choose i686-w64-mingw32-gcc-posix from the list> <choose i686-w64-mingw32-gcc-posix from the list>
sudo update-alternatives --config i686-w64-mingw32-g++ sudo update-alternatives --config i686-w64-mingw32-g++
<choose i686-w64-mingw32-g++-posix from the list> <choose i686-w64-mingw32-g++-posix from the list>
```
Creating Windows export templates Creating Windows export templates
--------------------------------- ---------------------------------
Windows export templates are created by compiling Godot without the editor, Windows export templates are created by compiling Godot without the editor,
with the following flags:: with the following flags:
```
C:\godot> scons platform=windows tools=no target=release_debug bits=32 C:\godot> scons platform=windows tools=no target=release_debug bits=32
C:\godot> scons platform=windows tools=no target=release bits=32 C:\godot> scons platform=windows tools=no target=release bits=32
C:\godot> scons platform=windows tools=no target=release_debug bits=64 C:\godot> scons platform=windows tools=no target=release_debug bits=64
C:\godot> scons platform=windows tools=no target=release bits=64 C:\godot> scons platform=windows tools=no target=release bits=64
```
If you plan on replacing the standard export templates, copy these to the If you plan on replacing the standard export templates, copy these to the
following location, replacing `( version )` with the version identifier following location, replacing `( version )` with the version identifier
(such as `3.1.1.stable` or `3.2.dev`):: (such as `3.1.1.stable` or `3.2.dev`):
```
%USERPROFILE%\AppData\Roaming\Godot\templates\<version>\ %USERPROFILE%\AppData\Roaming\Godot\templates\<version>\
```
With the following names:: With the following names:
```
windows_32_debug.exe windows_32_debug.exe
windows_32_release.exe windows_32_release.exe
windows_64_debug.exe windows_64_debug.exe
windows_64_release.exe windows_64_release.exe
```
However, if you are using custom modules or custom engine code, you However, if you are using custom modules or custom engine code, you
may instead want to configure your binaries as custom export templates may instead want to configure your binaries as custom export templates

View File

@ -41,60 +41,60 @@ See also:
Distro-specific one-liners Distro-specific one-liners
^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **Alpine Linux** | :: | | **Alpine Linux** | |
| | | | | |
| | apk add scons pkgconf gcc g++ libx11-dev libxcursor-dev libxinerama-dev libxi-dev libxrandr-dev \ | | | apk add scons pkgconf gcc g++ libx11-dev libxcursor-dev libxinerama-dev libxi-dev libxrandr-dev \ |
| | mesa-dev libexecinfo-dev eudev-dev alsa-lib-dev pulseaudio-dev | | | mesa-dev libexecinfo-dev eudev-dev alsa-lib-dev pulseaudio-dev |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **Arch Linux** | :: | | **Arch Linux** | |
| | | | | |
| | pacman -S --needed scons pkgconf gcc libxcursor libxinerama libxi libxrandr mesa glu libglvnd \ | | | pacman -S --needed scons pkgconf gcc libxcursor libxinerama libxi libxrandr mesa glu libglvnd \ |
| | alsa-lib pulseaudio yasm | | | alsa-lib pulseaudio yasm |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **Debian** / | :: | | **Debian** / | |
| **Ubuntu** | | | **Ubuntu** | |
| | sudo apt-get install build-essential scons pkg-config libx11-dev libxcursor-dev libxinerama-dev \ | | | sudo apt-get install build-essential scons pkg-config libx11-dev libxcursor-dev libxinerama-dev \ |
| | libgl1-mesa-dev libglu-dev libasound2-dev libpulse-dev libudev-dev libxi-dev libxrandr-dev yasm | | | libgl1-mesa-dev libglu-dev libasound2-dev libpulse-dev libudev-dev libxi-dev libxrandr-dev yasm |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **Fedora** | :: | | **Fedora** | |
| | | | | |
| | sudo dnf install scons pkgconfig libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel \ | | | sudo dnf install scons pkgconfig libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel \ |
| | libXi-devel mesa-libGL-devel mesa-libGLU-devel alsa-lib-devel pulseaudio-libs-devel \ | | | libXi-devel mesa-libGL-devel mesa-libGLU-devel alsa-lib-devel pulseaudio-libs-devel \ |
| | libudev-devel yasm gcc-c++ libstdc++-static libatomic-static | | | libudev-devel yasm gcc-c++ libstdc++-static libatomic-static |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **FreeBSD** | :: | | **FreeBSD** | |
| | | | | |
| | sudo pkg install py37-scons pkgconf xorg-libraries libXcursor libXrandr libXi xorgproto libGLU \ | | | sudo pkg install py37-scons pkgconf xorg-libraries libXcursor libXrandr libXi xorgproto libGLU \ |
| | alsa-lib pulseaudio yasm | | | alsa-lib pulseaudio yasm |
| | | | | |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **Gentoo** | :: | | **Gentoo** | |
| | | | | |
| | emerge -an dev-util/scons x11-libs/libX11 x11-libs/libXcursor x11-libs/libXinerama x11-libs/libXi \ | | | emerge -an dev-util/scons x11-libs/libX11 x11-libs/libXcursor x11-libs/libXinerama x11-libs/libXi \ |
| | media-libs/mesa media-libs/glu media-libs/alsa-lib media-sound/pulseaudio dev-lang/yasm | | | media-libs/mesa media-libs/glu media-libs/alsa-lib media-sound/pulseaudio dev-lang/yasm |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **Mageia** | :: | | **Mageia** | |
| | | | | |
| | urpmi scons task-c++-devel pkgconfig "pkgconfig(alsa)" "pkgconfig(glu)" "pkgconfig(libpulse)" \ | | | urpmi scons task-c++-devel pkgconfig "pkgconfig(alsa)" "pkgconfig(glu)" "pkgconfig(libpulse)" \ |
| | "pkgconfig(udev)" "pkgconfig(x11)" "pkgconfig(xcursor)" "pkgconfig(xinerama)" "pkgconfig(xi)" \ | | | "pkgconfig(udev)" "pkgconfig(x11)" "pkgconfig(xcursor)" "pkgconfig(xinerama)" "pkgconfig(xi)" \ |
| | "pkgconfig(xrandr)" yasm | | | "pkgconfig(xrandr)" yasm |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **OpenBSD** | :: | | **OpenBSD** | |
| | | | | |
| | pkg_add python scons llvm yasm | | | pkg_add python scons llvm yasm |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **openSUSE** | :: | | **openSUSE** | |
| | | | | |
| | sudo zypper install scons pkgconfig libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel \ | | | sudo zypper install scons pkgconfig libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel \ |
| | libXi-devel Mesa-libGL-devel alsa-devel libpulse-devel libudev-devel libGLU1 yasm | | | libXi-devel Mesa-libGL-devel alsa-devel libpulse-devel libudev-devel libGLU1 yasm |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **NetBSD** | :: | | **NetBSD** | |
| | | | | |
| | pkg_add pkg-config py37-scons yasm | | | pkg_add pkg-config py37-scons yasm |
| | | | | |
| | For audio support, you can optionally install `pulseaudio`. | | | For audio support, you can optionally install `pulseaudio`. |
+------------------+-----------------------------------------------------------------------------------------------------------+ +------------------+-----------------------------------------------------------------------------------------------------------+
| **Solus** | :: | | **Solus** | |
| | | | | |
| | sudo eopkg install -c system.devel scons libxcursor-devel libxinerama-devel libxi-devel \ | | | sudo eopkg install -c system.devel scons libxcursor-devel libxinerama-devel libxi-devel \ |
| | libxrandr-devel mesalib-devel libglu alsa-lib-devel pulseaudio-devel yasm | | | libxrandr-devel mesalib-devel libglu alsa-lib-devel pulseaudio-devel yasm |
@ -105,9 +105,9 @@ Compiling
Start a terminal, go to the root dir of the engine source code and type: Start a terminal, go to the root dir of the engine source code and type:
:: ```
scons -j8 platform=x11 scons -j8 platform=x11
```
A good rule of thumb for the `-j` (*jobs*) flag, is to have at least as many A good rule of thumb for the `-j` (*jobs*) flag, is to have at least as many
threads compiling Godot as you have cores in your CPU, if not one or two more. threads compiling Godot as you have cores in your CPU, if not one or two more.
@ -123,9 +123,9 @@ Note:
If you wish to compile using Clang rather than GCC, use this command: If you wish to compile using Clang rather than GCC, use this command:
:: ```
scons platform=x11 use_llvm=yes scons platform=x11 use_llvm=yes
```
Using Clang appears to be a requirement for OpenBSD, otherwise fonts Using Clang appears to be a requirement for OpenBSD, otherwise fonts
would not build. would not build.
@ -150,19 +150,25 @@ Compiling a headless/server build
--------------------------------- ---------------------------------
To compile a *headless* build which provides editor functionality to export To compile a *headless* build which provides editor functionality to export
projects in an automated manner, use:: projects in an automated manner, use:
```
scons -j8 platform=server tools=yes target=release_debug scons -j8 platform=server tools=yes target=release_debug
```
To compile a debug *server* build which can be used with To compile a debug *server* build which can be used with
`remote debugging tools ( doc_command_line_tutorial )`, use:: `remote debugging tools ( doc_command_line_tutorial )`, use:
```
scons -j8 platform=server tools=no target=release_debug scons -j8 platform=server tools=no target=release_debug
```
To compile a *server* build which is optimized to run dedicated game servers, To compile a *server* build which is optimized to run dedicated game servers,
use:: use:
```
scons -j8 platform=server tools=no target=release scons -j8 platform=server tools=no target=release
```
Building export templates Building export templates
------------------------- -------------------------
@ -181,35 +187,35 @@ following parameters:
- (32 bits) - (32 bits)
:: ```
scons platform=x11 tools=no target=release bits=32 scons platform=x11 tools=no target=release bits=32
scons platform=x11 tools=no target=release_debug bits=32 scons platform=x11 tools=no target=release_debug bits=32
```
- (64 bits) - (64 bits)
:: ```
scons platform=x11 tools=no target=release bits=64 scons platform=x11 tools=no target=release bits=64
scons platform=x11 tools=no target=release_debug bits=64 scons platform=x11 tools=no target=release_debug bits=64
```
Note that cross-compiling for the opposite bits (64/32) as your host Note that cross-compiling for the opposite bits (64/32) as your host
platform is not always straight-forward and might need a chroot environment. platform is not always straight-forward and might need a chroot environment.
To create standard export templates, the resulting files must be copied to: To create standard export templates, the resulting files must be copied to:
:: ```
$HOME/.local/share/godot/templates/[gd-version]/ $HOME/.local/share/godot/templates/[gd-version]/
```
and named like this (even for \*BSD which is seen as "Linux X11" by Godot): and named like this (even for \*BSD which is seen as "Linux X11" by Godot):
:: ```
linux_x11_32_debug linux_x11_32_debug
linux_x11_32_release linux_x11_32_release
linux_x11_64_debug linux_x11_64_debug
linux_x11_64_release linux_x11_64_release
```
However, if you are writing your custom modules or custom C++ code, you However, if you are writing your custom modules or custom C++ code, you
might instead want to configure your binaries as custom export templates might instead want to configure your binaries as custom export templates
@ -232,9 +238,11 @@ the default GCC + GNU ld setup:
- Clang tends to give more useful error messages compared to GCC. - Clang tends to give more useful error messages compared to GCC.
To do so, install Clang and the `lld` package from your distribution's package manager To do so, install Clang and the `lld` package from your distribution's package manager
then use the following SCons command:: then use the following SCons command:
```
scons platform=x11 use_llvm=yes use_lld=yes scons platform=x11 use_llvm=yes use_lld=yes
```
After the build is completed, a new binary with a `.llvm` suffix will be After the build is completed, a new binary with a `.llvm` suffix will be
created in the `bin/` folder. created in the `bin/` folder.
@ -256,9 +264,11 @@ to get even faster builds.
- Use `cd` to reach the extracted Pyston folder from a terminal, - Use `cd` to reach the extracted Pyston folder from a terminal,
then run `./pyston -m pip install scons` to install SCons within Pyston. 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 - To make SCons via Pyston easier to run, create a symbolic link of its wrapper
script to a location in your `PATH` environment variable:: script to a location in your `PATH` environment variable:
```
ln -s ~/.local/opt/pyston/bin/scons ~/.local/bin/pyston-scons ln -s ~/.local/opt/pyston/bin/scons ~/.local/bin/pyston-scons
```
- Instead of running `scons ( build arguments )`, run `pyston-scons ( build arguments )` - Instead of running `scons ( build arguments )`, run `pyston-scons ( build arguments )`
to compile Godot. to compile Godot.

View File

@ -30,16 +30,16 @@ Step by step
Alternatively, you can generate it yourself using Alternatively, you can generate it yourself using
`OpenSSL ( https://www.openssl.org/ )` command-line tools: `OpenSSL ( https://www.openssl.org/ )` command-line tools:
:: ```
openssl rand -hex 32 > godot.gdkey openssl rand -hex 32 > godot.gdkey
```
The output in `godot.gdkey` should be similar to: The output in `godot.gdkey` should be similar to:
:: ```
# NOTE: Do not use the key below! Generate your own key instead. # NOTE: Do not use the key below! Generate your own key instead.
aeb1bc56aaf580cc31784e9c41551e9ed976ecba10d315db591e749f3f64890f aeb1bc56aaf580cc31784e9c41551e9ed976ecba10d315db591e749f3f64890f
```
You can generate the key without redirecting the output to a file, but You can generate the key without redirecting the output to a file, but
that way you can minimize the risk of exposing the key. that way you can minimize the risk of exposing the key.
@ -76,8 +76,7 @@ If you get an error like below, it means the key wasn't properly included in
your Godot build. Godot is encrypting the scripts during export, but can't read your Godot build. Godot is encrypting the scripts during export, but can't read
them at runtime. them at runtime.
:: ```
ERROR: open_and_parse: Condition "String::md5(md5.digest) != String::md5(md5d)" is true. Returning: ERR_FILE_CORRUPT ERROR: open_and_parse: Condition "String::md5(md5.digest) != String::md5(md5d)" is true. Returning: ERR_FILE_CORRUPT
At: core/io/file_access_encrypted.cpp:103 At: core/io/file_access_encrypted.cpp:103
ERROR: load_byte_code: Condition ' err ' is true. returned: err ERROR: load_byte_code: Condition ' err ' is true. returned: err
@ -98,3 +97,4 @@ them at runtime.
At: core/object.cpp:2081 At: core/object.cpp:2081
ERROR: clear: Resources Still in use at Exit! ERROR: clear: Resources Still in use at Exit!
At: core/resource.cpp:425 At: core/resource.cpp:425
```

View File

@ -53,69 +53,69 @@ darling-dmg
Clone the repository on your machine: Clone the repository on your machine:
:: ```
$ git clone https://github.com/darlinghq/darling-dmg.git $ git clone https://github.com/darlinghq/darling-dmg.git
```
Build it: Build it:
:: ```
$ cd darling-dmg $ cd darling-dmg
$ mkdir build $ mkdir build
$ cd build $ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release $ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make -j 4 # The number is the amount of cores your processor has, for faster build $ make -j 4 # The number is the amount of cores your processor has, for faster build
$ cd ../.. $ cd ../..
```
Preparing the SDK Preparing the SDK
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
Mount the XCode image: Mount the XCode image:
:: ```
$ mkdir xcode $ mkdir xcode
$ ./darling-dmg/build/darling-dmg /path/to/Xcode_7.1.1.dmg xcode $ ./darling-dmg/build/darling-dmg /path/to/Xcode_7.1.1.dmg xcode
[...] [...]
Everything looks OK, disk mounted Everything looks OK, disk mounted
```
Extract the iOS SDK: Extract the iOS SDK:
:: ```
$ mkdir -p iPhoneSDK/iPhoneOS9.1.sdk $ mkdir -p iPhoneSDK/iPhoneOS9.1.sdk
$ cp -r xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/* iPhoneSDK/iPhoneOS9.1.sdk $ cp -r xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/* iPhoneSDK/iPhoneOS9.1.sdk
$ cp -r xcode/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/* iPhoneSDK/iPhoneOS9.1.sdk/usr/include/c++ $ cp -r xcode/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/* iPhoneSDK/iPhoneOS9.1.sdk/usr/include/c++
$ fusermount -u xcode # unmount the image $ fusermount -u xcode # unmount the image
```
Pack the SDK: Pack the SDK:
:: ```
$ cd iPhoneSDK $ cd iPhoneSDK
$ tar -cf - * | xz -9 -c - > iPhoneOS9.1.sdk.tar.xz $ tar -cf - * | xz -9 -c - > iPhoneOS9.1.sdk.tar.xz
```
Toolchain Toolchain
~~~~~~~~~ ~~~~~~~~~
Build cctools: Build cctools:
:: ```
$ git clone https://github.com/tpoechtrager/cctools-port.git $ git clone https://github.com/tpoechtrager/cctools-port.git
$ cd cctools-port/usage_examples/ios_toolchain $ cd cctools-port/usage_examples/ios_toolchain
$ ./build.sh /path/iPhoneOS9.1.sdk.tar.xz arm64 $ ./build.sh /path/iPhoneOS9.1.sdk.tar.xz arm64
```
Copy the tools to a nicer place. Note that the SCons scripts for Copy the tools to a nicer place. Note that the SCons scripts for
building will look under `usr/bin` inside the directory you provide building will look under `usr/bin` inside the directory you provide
for the toolchain binaries, so you must copy to such subdirectory, akin for the toolchain binaries, so you must copy to such subdirectory, akin
to the following commands: to the following commands:
:: ```
$ mkdir -p /home/user/iostoolchain/usr $ mkdir -p /home/user/iostoolchain/usr
$ cp -r target/bin /home/user/iostoolchain/usr/ $ cp -r target/bin /home/user/iostoolchain/usr/
```
Now you should have the iOS toolchain binaries in Now you should have the iOS toolchain binaries in
`/home/user/iostoolchain/usr/bin`. `/home/user/iostoolchain/usr/bin`.
@ -131,17 +131,17 @@ SCons build command.
For the iPhone platform to be detected, you need the `OSXCROSS_IOS` For the iPhone platform to be detected, you need the `OSXCROSS_IOS`
environment variable defined to anything. environment variable defined to anything.
:: ```
$ export OSXCROSS_IOS=anything $ export OSXCROSS_IOS=anything
```
Now you can compile for iPhone using SCons like the standard Godot Now you can compile for iPhone using SCons like the standard Godot
way, with some additional arguments to provide the correct paths: way, with some additional arguments to provide the correct paths:
:: ```
$ scons -j 4 platform=iphone arch=arm target=release_debug IPHONESDK="/path/to/iPhoneSDK" IPHONEPATH="/path/to/iostoolchain" ios_triple="arm-apple-darwin11-" $ scons -j 4 platform=iphone arch=arm target=release_debug IPHONESDK="/path/to/iPhoneSDK" IPHONEPATH="/path/to/iostoolchain" ios_triple="arm-apple-darwin11-"
$ scons -j 4 platform=iphone arch=arm64 target=release_debug IPHONESDK="/path/to/iPhoneSDK" IPHONEPATH="/path/to/iostoolchain" ios_triple="arm-apple-darwin11-" $ scons -j 4 platform=iphone arch=arm64 target=release_debug IPHONESDK="/path/to/iPhoneSDK" IPHONEPATH="/path/to/iostoolchain" ios_triple="arm-apple-darwin11-"
```
Producing fat binaries Producing fat binaries
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
@ -151,11 +151,10 @@ Apple requires a fat binary with both architectures (`armv7` and
`arm-apple-darwin11-lipo` executable. The following example assumes `arm-apple-darwin11-lipo` executable. The following example assumes
you are in the root Godot source directory: you are in the root Godot source directory:
:: ```
$ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot.iphone.opt.debug.arm.a bin/libgodot.iphone.opt.debug.arm64.a -output bin/libgodot.iphone.debug.fat.a $ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot.iphone.opt.debug.arm.a bin/libgodot.iphone.opt.debug.arm64.a -output bin/libgodot.iphone.debug.fat.a
$ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot_camera_module.iphone.opt.debug.arm.a bin/libgodot_camera_module.iphone.opt.debug.arm64.a -output bin/libgodot_camera_module.iphone.debug.fat.a $ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot_camera_module.iphone.opt.debug.arm.a bin/libgodot_camera_module.iphone.opt.debug.arm64.a -output bin/libgodot_camera_module.iphone.debug.fat.a
$ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot_arkit_module.iphone.opt.debug.arm.a bin/libgodot_arkit_module.iphone.opt.debug.arm64.a -output bin/libgodot_arkit_module.iphone.debug.fat.a $ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot_arkit_module.iphone.opt.debug.arm.a bin/libgodot_arkit_module.iphone.opt.debug.arm64.a -output bin/libgodot_arkit_module.iphone.debug.fat.a
```
Then you will have iOS fat binaries in `bin` directory. Then you will have iOS fat binaries in `bin` directory.

View File

@ -28,24 +28,26 @@ Afterwards, to get the latest development version of the Godot source code
If you are using the `git` command line client, this is done by entering If you are using the `git` command line client, this is done by entering
the following in a terminal: the following in a terminal:
:: ```
git clone https://github.com/godotengine/godot.git git clone https://github.com/godotengine/godot.git
# You can add the --depth 1 argument to omit the commit history. # You can add the --depth 1 argument to omit the commit history.
# Faster, but not all Git operations (like blame) will work. # Faster, but not all Git operations (like blame) will work.
```
For any stable release, visit the `release page ( https://github.com/godotengine/godot/releases )` For any stable release, visit the `release page ( https://github.com/godotengine/godot/releases )`
and click on the link for the release you want. and click on the link for the release you want.
You can then download and extract the source from the download link on the page. You can then download and extract the source from the download link on the page.
With `git`, you can also clone a stable release by specifying its branch or tag With `git`, you can also clone a stable release by specifying its branch or tag
after the `--branch` (or just `-b`) argument:: after the `--branch` (or just `-b`) argument:
```
# Clone the continuously maintained stable branch (`3.x` as of writing). # Clone the continuously maintained stable branch (`3.x` as of writing).
git clone https://github.com/godotengine/godot.git -b 3.x git clone https://github.com/godotengine/godot.git -b 3.x
# Clone the `3.2.3-stable` tag. This is a fixed revision that will never change. # Clone the `3.2.3-stable` tag. This is a fixed revision that will never change.
git clone https://github.com/godotengine/godot.git -b 3.2.3-stable git clone https://github.com/godotengine/godot.git -b 3.2.3-stable
```
There are also generally branches besides `master` for each major version. There are also generally branches besides `master` for each major version.

View File

@ -59,8 +59,9 @@ SCons is invoked by just calling `scons`. If no platform is specified,
SCons will detect the target platform automatically based on the host platform. SCons will detect the target platform automatically based on the host platform.
It will then start building for the target platform right away. It will then start building for the target platform right away.
To list the available target platforms, use `scons platform=list`:: To list the available target platforms, use `scons platform=list`:
```
scons platform=list scons platform=list
scons: Reading SConscript files ... scons: Reading SConscript files ...
The following platforms are available: The following platforms are available:
@ -72,13 +73,14 @@ To list the available target platforms, use `scons platform=list`::
x11 x11
Please run SCons again and select a valid platform: platform=<string> Please run SCons again and select a valid platform: platform=<string>
```
To build for a platform (for example, x11), run with the `platform=` (or To build for a platform (for example, x11), run with the `platform=` (or
`p=` to make it short) argument: `p=` to make it short) argument:
:: ```
scons platform=x11 scons platform=x11
```
This will start the build process, which will take a while. If you want This will start the build process, which will take a while. If you want
SCons to build faster, use the `-j <cores )` parameter to specify how many SCons to build faster, use the `-j <cores )` parameter to specify how many
@ -87,32 +89,36 @@ can use your computer for something else :)
Example for using 4 cores: Example for using 4 cores:
:: ```
scons platform=x11 -j 4 scons platform=x11 -j 4
```
Resulting binary Resulting binary
---------------- ----------------
The resulting binaries will be placed in the `bin/` subdirectory, The resulting binaries will be placed in the `bin/` subdirectory,
generally with this naming convention:: generally with this naming convention:
```
godot.<platform>.[opt].[tools/debug].<architecture>[extension] godot.<platform>.[opt].[tools/debug].<architecture>[extension]
```
For the previous build attempt, the result would look like this:: For the previous build attempt, the result would look like this:
```
ls bin ls bin
bin/godot.x11.tools.64 bin/godot.x11.tools.64
```
This means that the binary is for X11, is not optimized, has tools (the This means that the binary is for X11, is not optimized, has tools (the
whole editor) compiled in, and is meant for 64 bits. whole editor) compiled in, and is meant for 64 bits.
A Windows binary with the same configuration will look like this: A Windows binary with the same configuration will look like this:
.. code-block:: console ```
C:\godot> dir bin/ C:\godot> dir bin/
godot.windows.tools.64.exe godot.windows.tools.64.exe
```
Copy that binary to any location you like, as it contains the project manager, Copy that binary to any location you like, as it contains the project manager,
editor and all means to execute the game. However, it lacks the data to export editor and all means to execute the game. However, it lacks the data to export
@ -133,10 +139,9 @@ disabled for everything else. Disabling tools produces a binary that can
run projects but that does not include the editor or the project run projects but that does not include the editor or the project
manager. manager.
:: ```
scons platform=<platform> tools=yes/no scons platform=<platform> tools=yes/no
```
Target Target
@ -154,9 +159,9 @@ Target controls optimization and debug flags. Each mode means:
`tools=yes`, as the editor requires some debug functionality and run-time `tools=yes`, as the editor requires some debug functionality and run-time
checks to run. checks to run.
:: ```
scons platform=<platform> target=debug/release_debug/release scons platform=<platform> target=debug/release_debug/release
```
This flag appends the `.debug` suffix (for debug), or `.tools` (for debug This flag appends the `.debug` suffix (for debug), or `.tools` (for debug
with tools enabled). When optimization is enabled (release), it appends with tools enabled). When optimization is enabled (release), it appends
@ -173,9 +178,9 @@ else.
- **64**: Build binaries for 64-bit platforms. - **64**: Build binaries for 64-bit platforms.
- **default**: Build for the architecture that matches the host platform. - **default**: Build for the architecture that matches the host platform.
:: ```
scons platform=<platform> bits=default/32/64 scons platform=<platform> bits=default/32/64
```
This flag appends `.32` or `.64` suffixes to resulting binaries when This flag appends `.32` or `.64` suffixes to resulting binaries when
relevant. If `bits=default` is used, the suffix will match the detected relevant. If `bits=default` is used, the suffix will match the detected
@ -197,9 +202,9 @@ packages, just like the built-in `modules/` directory.
For instance, it's possible to provide both relative, absolute, and user For instance, it's possible to provide both relative, absolute, and user
directory paths containing such modules: directory paths containing such modules:
:: ```
scons custom_modules="../modules,/abs/path/to/modules,~/src/godot_modules" scons custom_modules="../modules,/abs/path/to/modules,~/src/godot_modules"
```
Note: Note:
@ -246,14 +251,14 @@ Using a file
The default `custom.py` file can be created at the root of the Godot Engine The default `custom.py` file can be created at the root of the Godot Engine
source to initialize any SCons build options passed via the command line: source to initialize any SCons build options passed via the command line:
.. code-block:: python ```
# custom.py # custom.py
optimize = "size" optimize = "size"
module_mono_enabled = "yes" module_mono_enabled = "yes"
use_llvm = "yes" use_llvm = "yes"
extra_suffix = "game_title" extra_suffix = "game_title"
```
You can also disable some of the builtin modules before compiling, saving some You can also disable some of the builtin modules before compiling, saving some
time it takes to build the engine. See `doc_optimizing_for_size` page for more details. time it takes to build the engine. See `doc_optimizing_for_size` page for more details.
@ -269,9 +274,9 @@ See also:
Another custom file can be specified explicitly with the `profile` command Another custom file can be specified explicitly with the `profile` command
line option, both overriding the default build configuration: line option, both overriding the default build configuration:
.. code-block:: shell ```
scons profile=path/to/custom.py scons profile=path/to/custom.py
```
Note: Note:
Build options set from the file can be overridden by the command line Build options set from the file can be overridden by the command line
@ -279,8 +284,7 @@ Note:
It's also possible to override the options conditionally: It's also possible to override the options conditionally:
.. code-block:: python ```
# custom.py # custom.py
import version import version
@ -290,6 +294,7 @@ It's also possible to override the options conditionally:
pass pass
elif version.major == 4: elif version.major == 4:
pass pass
```
Using the SCONSFLAGS Using the SCONSFLAGS
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
@ -324,8 +329,7 @@ If you download the official export templates package and unzip it, you
will notice that most files are optimized binaries or packages for each will notice that most files are optimized binaries or packages for each
platform: platform:
.. code-block:: none ```
android_debug.apk android_debug.apk
android_release.apk android_release.apk
webassembly_debug.zip webassembly_debug.zip
@ -342,6 +346,7 @@ platform:
windows_32_release.exe windows_32_release.exe
windows_64_debug.exe windows_64_debug.exe
windows_64_release.exe windows_64_release.exe
```
To create those yourself, follow the instructions detailed for each To create those yourself, follow the instructions detailed for each
platform in this same tutorial section. Each platform explains how to platform in this same tutorial section. Each platform explains how to

View File

@ -30,9 +30,9 @@ If you build Windows (MinGW), Linux or macOS binaries from source, remember to
strip debug symbols from binaries by installing the `strip` package from your strip debug symbols from binaries by installing the `strip` package from your
distribution then running: distribution then running:
:: ```
strip path/to/godot.binary strip path/to/godot.binary
```
On Windows, `strip.exe` is included in most MinGW toolchain setups. On Windows, `strip.exe` is included in most MinGW toolchain setups.
@ -59,9 +59,9 @@ Optimizing for size instead of speed
Godot 3.1 onwards allows compiling using size optimizations (instead of speed). Godot 3.1 onwards allows compiling using size optimizations (instead of speed).
To enable this, set the `optimize` flag to `size`: To enable this, set the `optimize` flag to `size`:
:: ```
scons p=windows target=release tools=no optimize=size scons p=windows target=release tools=no optimize=size
```
Some platforms such as WebAssembly already use this mode by default. Some platforms such as WebAssembly already use this mode by default.
@ -77,9 +77,9 @@ terms of performance and file size. It works by eliminating duplicate
template functions and unused code. It can currently be used with the GCC template functions and unused code. It can currently be used with the GCC
and MSVC compilers: and MSVC compilers:
:: ```
scons p=windows target=release tools=no use_lto=yes scons p=windows target=release tools=no use_lto=yes
```
Linking becomes much slower and more RAM-consuming with this option, Linking becomes much slower and more RAM-consuming with this option,
so it should be used only for release builds: so it should be used only for release builds:
@ -98,9 +98,9 @@ Disabling 3D
For 2D games, having the whole 3D engine available usually makes no sense. Because of this, there is a build flag to disable it: For 2D games, having the whole 3D engine available usually makes no sense. Because of this, there is a build flag to disable it:
:: ```
scons p=windows target=release tools=no disable_3d=yes scons p=windows target=release tools=no disable_3d=yes
```
Tools must be disabled in order to use this flag, as the editor is not designed Tools must be disabled in order to use this flag, as the editor is not designed
to operate without 3D support. Without it, the binary size can be reduced to operate without 3D support. Without it, the binary size can be reduced
@ -116,9 +116,9 @@ Disabling advanced GUI objects
Most small games don't require complex GUI controls such as Tree, ItemList, Most small games don't require complex GUI controls such as Tree, ItemList,
TextEdit or GraphEdit. They can be disabled using a build flag: TextEdit or GraphEdit. They can be disabled using a build flag:
:: ```
scons p=windows target=release tools=no disable_advanced_gui=yes scons p=windows target=release tools=no disable_advanced_gui=yes
```
This is everything that will be disabled: This is everything that will be disabled:
@ -155,17 +155,17 @@ Disabling unwanted modules
A lot of Godot's functions are offered as modules. A lot of Godot's functions are offered as modules.
You can see a list of modules with the following command: You can see a list of modules with the following command:
:: ```
scons --help scons --help
```
The list of modules that can be disabled will appear, together with all The list of modules that can be disabled will appear, together with all
build options. If you are working on a simple 2D game, you could disable build options. If you are working on a simple 2D game, you could disable
a lot of them: a lot of them:
:: ```
scons p=windows target=release tools=no module_arkit_enabled=no module_assimp_enabled=no module_bmp_enabled=no module_bullet_enabled=no module_camera_enabled=no module_csg_enabled=no module_dds_enabled=no module_enet_enabled=no module_etc_enabled=no module_gdnative_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_jsonrpc_enabled=no module_mbedtls_enabled=no module_mobile_vr_enabled=no module_opensimplex_enabled=no module_opus_enabled=no module_pvr_enabled=no module_recast_enabled=no module_regex_enabled=no module_squish_enabled=no module_svg_enabled=no module_tga_enabled=no module_theora_enabled=no module_tinyexr_enabled=no module_upnp_enabled=no module_vhacd_enabled=no module_vorbis_enabled=no module_webm_enabled=no module_webrtc_enabled=no module_websocket_enabled=no module_xatlas_unwrap_enabled=no scons p=windows target=release tools=no module_arkit_enabled=no module_assimp_enabled=no module_bmp_enabled=no module_bullet_enabled=no module_camera_enabled=no module_csg_enabled=no module_dds_enabled=no module_enet_enabled=no module_etc_enabled=no module_gdnative_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_jsonrpc_enabled=no module_mbedtls_enabled=no module_mobile_vr_enabled=no module_opensimplex_enabled=no module_opus_enabled=no module_pvr_enabled=no module_recast_enabled=no module_regex_enabled=no module_squish_enabled=no module_svg_enabled=no module_tga_enabled=no module_theora_enabled=no module_tinyexr_enabled=no module_upnp_enabled=no module_vhacd_enabled=no module_vorbis_enabled=no module_webm_enabled=no module_webrtc_enabled=no module_websocket_enabled=no module_xatlas_unwrap_enabled=no
```
If this proves not to work for your use case, you should review the list of If this proves not to work for your use case, you should review the list of
modules and see which ones you actually still need for your game (e.g. you modules and see which ones you actually still need for your game (e.g. you
@ -176,8 +176,7 @@ Alternatively, you can supply a list of disabled modules by creating
`custom.py` at the root of the source, with the contents similar to the `custom.py` at the root of the source, with the contents similar to the
following: following:
.. code-block:: python ```
# custom.py # custom.py
module_arkit_enabled = "no" module_arkit_enabled = "no"
@ -212,6 +211,7 @@ following:
module_webrtc_enabled = "no" module_webrtc_enabled = "no"
module_websocket_enabled = "no" module_websocket_enabled = "no"
module_xatlas_unwrap_enabled = "no" module_xatlas_unwrap_enabled = "no"
```
See also: See also:

View File

@ -13,14 +13,13 @@ a speech synthesis (text-to-speech) library written in C++.
To bind to an external library, set up a module directory similar to the Summator example: To bind to an external library, set up a module directory similar to the Summator example:
.. code-block:: none ```
godot/modules/tts/ godot/modules/tts/
```
Next, you will create a header file with a simple TTS class: Next, you will create a header file with a simple TTS class:
.. code-block:: cpp ```
/* tts.h */ /* tts.h */
#ifndef GODOT_TTS_H #ifndef GODOT_TTS_H
@ -41,11 +40,11 @@ Next, you will create a header file with a simple TTS class:
}; };
#endif // GODOT_TTS_H #endif // GODOT_TTS_H
```
And then you'll add the cpp file. And then you'll add the cpp file.
.. code-block:: cpp ```
/* tts.cpp */ /* tts.cpp */
#include "tts.h" #include "tts.h"
@ -66,14 +65,15 @@ And then you'll add the cpp file.
TTS::TTS() { TTS::TTS() {
festival_initialize(true, 210000); //not the best way to do it as this should only ever be called once. festival_initialize(true, 210000); //not the best way to do it as this should only ever be called once.
} }
```
Just as before, the new class needs to be registered somehow, so two more files Just as before, the new class needs to be registered somehow, so two more files
need to be created: need to be created:
.. code-block:: none ```
register_types.h register_types.h
register_types.cpp register_types.cpp
```
.. important:: .. important::
These files must be in the top-level folder of your module (next to your These files must be in the top-level folder of your module (next to your
@ -81,16 +81,15 @@ need to be created:
These files should contain the following: These files should contain the following:
.. code-block:: cpp ```
/* register_types.h */ /* register_types.h */
void register_tts_types(); void register_tts_types();
void unregister_tts_types(); void unregister_tts_types();
/* yes, the word in the middle must be the same as the module folder name */ /* yes, the word in the middle must be the same as the module folder name */
```
.. code-block:: cpp ```
/* register_types.cpp */ /* register_types.cpp */
#include "register_types.h" #include "register_types.h"
@ -105,28 +104,29 @@ These files should contain the following:
void unregister_tts_types() { void unregister_tts_types() {
// Nothing to do here in this example. // Nothing to do here in this example.
} }
```
Next, you need to create a `SCsub` file so the build system compiles Next, you need to create a `SCsub` file so the build system compiles
this module: this module:
.. code-block:: python ```
# SCsub # SCsub
Import('env') Import('env')
env_tts = env.Clone() env_tts = env.Clone()
env_tts.add_source_files(env.modules_sources, "*.cpp") # Add all cpp files to the build env_tts.add_source_files(env.modules_sources, "*.cpp") # Add all cpp files to the build
```
You'll need to install the external library on your machine to get the .a library files. See the library's official You'll need to install the external library on your machine to get the .a library files. See the library's official
documentation for specific instructions on how to do this for your operation system. We've included the documentation for specific instructions on how to do this for your operation system. We've included the
installation commands for Linux below, for reference. installation commands for Linux below, for reference.
.. code-block:: shell ```
sudo apt-get install festival festival-dev <-- Installs festival and speech_tools libraries sudo apt-get install festival festival-dev <-- Installs festival and speech_tools libraries
apt-cache search festvox-* <-- Displays list of voice packages apt-cache search festvox-* <-- Displays list of voice packages
sudo apt-get install festvox-don festvox-rablpc16k festvox-kallpc16k festvox-kdlpc16k <-- Installs voices sudo apt-get install festvox-don festvox-rablpc16k festvox-kallpc16k festvox-kdlpc16k <-- Installs voices
```
.. important:: .. important::
The voices that Festival uses (and any other potential external/3rd-party The voices that Festival uses (and any other potential external/3rd-party
@ -139,18 +139,18 @@ files accessible to the compiler, while also keeping the module code self-contai
festival and speech_tools libraries can be installed from the modules/tts/ directory via festival and speech_tools libraries can be installed from the modules/tts/ directory via
git using the following commands: git using the following commands:
.. code-block:: shell ```
git clone https://github.com/festvox/festival git clone https://github.com/festvox/festival
git clone https://github.com/festvox/speech_tools git clone https://github.com/festvox/speech_tools
```
If you don't want the external repository source files committed to your repository, you If you don't want the external repository source files committed to your repository, you
can link to them instead by adding them as submodules (from within the modules/tts/ directory), as seen below: can link to them instead by adding them as submodules (from within the modules/tts/ directory), as seen below:
.. code-block:: shell ```
git submodule add https://github.com/festvox/festival git submodule add https://github.com/festvox/festival
git submodule add https://github.com/festvox/speech_tools git submodule add https://github.com/festvox/speech_tools
```
.. important:: .. important::
Please note that Git submodules are not used in the Godot repository. If Please note that Git submodules are not used in the Godot repository. If
@ -161,8 +161,7 @@ can link to them instead by adding them as submodules (from within the modules/t
To add include directories for the compiler to look at you can append it to the To add include directories for the compiler to look at you can append it to the
environment's paths: environment's paths:
.. code-block:: python ```
# These paths are relative to /modules/tts/ # These paths are relative to /modules/tts/
env_tts.Append(CPPPATH=["speech_tools/include", "festival/src/include"]) env_tts.Append(CPPPATH=["speech_tools/include", "festival/src/include"])
@ -177,13 +176,13 @@ environment's paths:
# Check with the documentation of the external library to see which library # Check with the documentation of the external library to see which library
# files should be included/linked. # files should be included/linked.
env.Append(LIBS=['Festival', 'estools', 'estbase', 'eststring']) env.Append(LIBS=['Festival', 'estools', 'estbase', 'eststring'])
```
If you want to add custom compiler flags when building your module, you need to clone If you want to add custom compiler flags when building your module, you need to clone
`env` first, so it won't add those flags to whole Godot build (which can cause errors). `env` first, so it won't add those flags to whole Godot build (which can cause errors).
Example `SCsub` with custom flags: Example `SCsub` with custom flags:
.. code-block:: python ```
# SCsub # SCsub
Import('env') Import('env')
@ -195,11 +194,11 @@ Example `SCsub` with custom flags:
# If you need to, you can: # If you need to, you can:
# - Append CFLAGS for C code only. # - Append CFLAGS for C code only.
# - Append CXXFLAGS for C++ code only. # - Append CXXFLAGS for C++ code only.
```
The final module should look like this: The final module should look like this:
.. code-block:: none ```
godot/modules/tts/festival/ godot/modules/tts/festival/
godot/modules/tts/libpath/libestbase.a godot/modules/tts/libpath/libestbase.a
godot/modules/tts/libpath/libestools.a godot/modules/tts/libpath/libestools.a
@ -212,17 +211,18 @@ The final module should look like this:
godot/modules/tts/register_types.h godot/modules/tts/register_types.h
godot/modules/tts/register_types.cpp godot/modules/tts/register_types.cpp
godot/modules/tts/SCsub godot/modules/tts/SCsub
```
Using the module Using the module
---------------- ----------------
You can now use your newly created module from any script: You can now use your newly created module from any script:
:: ```
var t = TTS.new() var t = TTS.new()
var script = "Hello world. This is a test!" var script = "Hello world. This is a test!"
var is_spoken = t.say_text(script) var is_spoken = t.say_text(script)
print('is_spoken: ', is_spoken) print('is_spoken: ', is_spoken)
```
And the output will be `is_spoken: True` if the text is spoken. And the output will be `is_spoken: True` if the text is spoken.

View File

@ -10,8 +10,7 @@ but it can also be useful for those writing custom C++ modules.
Print text Print text
---------- ----------
.. code-block:: cpp ```
// Prints a message to standard output. // Prints a message to standard output.
print_line("Message"); print_line("Message");
@ -27,6 +26,7 @@ Print text
// This can be used to avoid spamming the console output. // This can be used to avoid spamming the console output.
ERR_PRINT_ONCE("Message"); ERR_PRINT_ONCE("Message");
WARN_PRINT_ONCE("Message"); WARN_PRINT_ONCE("Message");
```
If you need to add placeholders in your messages, use format strings as If you need to add placeholders in your messages, use format strings as
described below. described below.
@ -37,8 +37,7 @@ Format a string
The `vformat()` function returns a formatted `String`. It behaves The `vformat()` function returns a formatted `String`. It behaves
in a way similar to C's `sprintf()`: in a way similar to C's `sprintf()`:
.. code-block:: cpp ```
vformat("My name is %s.", "Godette"); vformat("My name is %s.", "Godette");
vformat("%d bugs on the wall!", 1234); vformat("%d bugs on the wall!", 1234);
vformat("Pi is approximately %f.", 3.1416); vformat("Pi is approximately %f.", 3.1416);
@ -47,6 +46,7 @@ in a way similar to C's `sprintf()`:
// You may need to do this if passing the result as an argument // You may need to do this if passing the result as an argument
// to a method that expects a `const char *` instead of a String. // to a method that expects a `const char *` instead of a String.
vformat("My name is %s.", "Godette").c_str(); vformat("My name is %s.", "Godette").c_str();
```
In most cases, try to use `vformat()` instead of string concatenation as it In most cases, try to use `vformat()` instead of string concatenation as it
makes for more readable code. makes for more readable code.
@ -56,13 +56,13 @@ Convert an integer or float to a string
This is mainly useful when printing numbers directly. This is mainly useful when printing numbers directly.
.. code-block:: cpp ```
// Prints "42" using integer-to-string conversion. // Prints "42" using integer-to-string conversion.
print_line(itos(42)); print_line(itos(42));
// Prints "123.45" using real-to-string conversion. // Prints "123.45" using real-to-string conversion.
print_line(rtos(123.45)); print_line(rtos(123.45));
```
Internationalize a string Internationalize a string
------------------------- -------------------------
@ -77,20 +77,20 @@ There are two types of internationalization in Godot's codebase:
projects if they provide a translation for the given string. This kind of projects if they provide a translation for the given string. This kind of
translation shouldn't be used in editor-only code. translation shouldn't be used in editor-only code.
.. code-block:: cpp ```
// Returns the translated string that matches the user's locale settings. // Returns the translated string that matches the user's locale settings.
// Translations are located in `editor/translations`. // Translations are located in `editor/translations`.
// The localization template is generated automatically; don't modify it. // The localization template is generated automatically; don't modify it.
TTR("Exit the editor?"); TTR("Exit the editor?");
```
To insert placeholders in localizable strings, wrap the localization macro in a To insert placeholders in localizable strings, wrap the localization macro in a
`vformat()` call as follows: `vformat()` call as follows:
.. code-block:: cpp ```
String file_path = "example.txt"; String file_path = "example.txt";
vformat(TTR("Couldn't open \"%s\" for reading."), file_path); vformat(TTR("Couldn't open \"%s\" for reading."), file_path);
```
Note: Note:
@ -106,14 +106,14 @@ Clamp a value
Godot provides macros for clamping a value with a lower bound (`MAX`), an Godot provides macros for clamping a value with a lower bound (`MAX`), an
upper bound (`MIN`) or both (`CLAMP`): upper bound (`MIN`) or both (`CLAMP`):
.. code-block:: cpp ```
int a = 3; int a = 3;
int b = 5; int b = 5;
MAX(b, 6); // 6 MAX(b, 6); // 6
MIN(2, a); // 2 MIN(2, a); // 2
CLAMP(a, 10, 30); // 10 CLAMP(a, 10, 30); // 10
```
This works with any type that can be compared to other values (like `int` and This works with any type that can be compared to other values (like `int` and
`float`). `float`).
@ -124,14 +124,14 @@ Microbenchmarking
If you want to benchmark a piece of code but don't know how to use a profiler, If you want to benchmark a piece of code but don't know how to use a profiler,
use this snippet: use this snippet:
.. code-block:: cpp ```
uint64_t begin = OS::get_singleton()->get_ticks_usec(); uint64_t begin = OS::get_singleton()->get_ticks_usec();
// Your code here... // Your code here...
uint64_t end = OS::get_singleton()->get_ticks_usec(); uint64_t end = OS::get_singleton()->get_ticks_usec();
print_line(vformat("Snippet took %d microseconds", end - begin)); print_line(vformat("Snippet took %d microseconds", end - begin));
```
This will print the time spent between the `begin` declaration and the `end` This will print the time spent between the `begin` declaration and the `end`
declaration. declaration.
@ -149,8 +149,7 @@ Get project/editor settings
There are four macros available for this: There are four macros available for this:
.. code-block:: cpp ```
// Returns the specified project setting's value, // Returns the specified project setting's value,
// defaulting to `false` if it doesn't exist. // defaulting to `false` if it doesn't exist.
GLOBAL_DEF("section/subsection/value", false); GLOBAL_DEF("section/subsection/value", false);
@ -158,16 +157,17 @@ There are four macros available for this:
// Returns the specified editor setting's value, // Returns the specified editor setting's value,
// defaulting to "Untitled" if it doesn't exist. // defaulting to "Untitled" if it doesn't exist.
EDITOR_DEF("section/subsection/value", "Untitled"); EDITOR_DEF("section/subsection/value", "Untitled");
```
If a default value has been specified elsewhere, don't specify it again to avoid If a default value has been specified elsewhere, don't specify it again to avoid
repetition: repetition:
.. code-block:: cpp ```
// Returns the value of the project setting. // Returns the value of the project setting.
GLOBAL_GET("section/subsection/value"); GLOBAL_GET("section/subsection/value");
// Returns the value of the editor setting. // Returns the value of the editor setting.
EDITOR_GET("section/subsection/value"); EDITOR_GET("section/subsection/value");
```
It's recommended to use `GLOBAL_DEF`/`EDITOR_DEF` only once per setting and It's recommended to use `GLOBAL_DEF`/`EDITOR_DEF` only once per setting and
use `GLOBAL_GET`/`EDITOR_GET` in all other places where it's referenced. use `GLOBAL_GET`/`EDITOR_GET` in all other places where it's referenced.
@ -200,8 +200,7 @@ Note:
Also, always try to return processable data so the engine can keep running Also, always try to return processable data so the engine can keep running
well. well.
.. code-block:: cpp ```
// Conditionally prints an error message and returns from the function. // Conditionally prints an error message and returns from the function.
// Use this in methods which don't return a value. // Use this in methods which don't return a value.
ERR_FAIL_COND_MSG(!mesh.is_valid(), vformat("Couldn't load mesh at: %s", path)); ERR_FAIL_COND_MSG(!mesh.is_valid(), vformat("Couldn't load mesh at: %s", path));
@ -237,7 +236,7 @@ Note:
// except for testing crash handling code. Godot's philosophy // except for testing crash handling code. Godot's philosophy
// is to never crash, both in the editor and in exported projects. // is to never crash, both in the editor and in exported projects.
CRASH_NOW_MSG("Can't predict the future! Aborting."); CRASH_NOW_MSG("Can't predict the future! Aborting.");
```
See also: See also:

View File

@ -32,8 +32,7 @@ Importing the project
- Under **Language Support** open the **Includes/Imports** tab and add the following paths: - Under **Language Support** open the **Includes/Imports** tab and add the following paths:
.. code-block:: none ```
. // A dot, to indicate the root of the Godot project . // A dot, to indicate the root of the Godot project
core/ core/
core/os/ core/os/
@ -41,6 +40,7 @@ Importing the project
drivers/ drivers/
platform/<your_platform>/ // Replace <your_platform> with a folder platform/<your_platform>/ // Replace <your_platform> with a folder
corresponding to your current platform corresponding to your current platform
```
.. figure:: img/kdevelop_addincludes.png) .. figure:: img/kdevelop_addincludes.png)
:figclass: figure-w480 :figclass: figure-w480

View File

@ -81,9 +81,9 @@ To enable debugging support you need to edit the external build target's build a
the project directory within the script. the project directory within the script.
- Create a script that will give the binary a name that Xcode can recognize, e.g.: - Create a script that will give the binary a name that Xcode can recognize, e.g.:
.. code-block:: shell ```
ln -f ${PROJECT_DIR}/godot/bin/godot.osx.tools.64 ${PROJECT_DIR}/godot/bin/godot ln -f ${PROJECT_DIR}/godot/bin/godot.osx.tools.64 ${PROJECT_DIR}/godot/bin/godot
```
.. figure:: img/xcode_7_setup_build_post_action.png) .. figure:: img/xcode_7_setup_build_post_action.png)
:figclass: figure-w480 :figclass: figure-w480

View File

@ -79,24 +79,24 @@ should not be used. Instead, a few other ones are provided.
For C-style allocation, Godot provides a few macros: For C-style allocation, Godot provides a few macros:
.. code-block:: none ```
memalloc() memalloc()
memrealloc() memrealloc()
memfree() memfree()
```
These are equivalent to the usual malloc, realloc, free of the standard C These are equivalent to the usual malloc, realloc, free of the standard C
library. library.
For C++-style allocation, special macros are provided: For C++-style allocation, special macros are provided:
.. code-block:: none ```
memnew( Class / Class(args) ) memnew( Class / Class(args) )
memdelete( instance ) memdelete( instance )
memnew_arr( Class , amount ) memnew_arr( Class , amount )
memdelete_arr( pointer to array ) memdelete_arr( pointer to array )
```
which are equivalent to new, delete, new[] and delete[]. which are equivalent to new, delete, new[] and delete[].
@ -107,21 +107,21 @@ For dynamic memory, the PoolVector<> template is provided. PoolVector is a
standard vector class, and is very similar to vector in the C++ standard library. standard vector class, and is very similar to vector in the C++ standard library.
To create a PoolVector buffer, use this: To create a PoolVector buffer, use this:
.. code-block:: cpp ```
PoolVector<int> data; PoolVector<int> data;
```
PoolVector can be accessed using the [] operator and a few helpers exist for this: PoolVector can be accessed using the [] operator and a few helpers exist for this:
.. code-block:: cpp ```
PoolVector<int>::Read r = data.read() PoolVector<int>::Read r = data.read()
int someint = r[4] int someint = r[4]
```
.. code-block:: cpp ```
PoolVector<int>::Write w = data.write() PoolVector<int>::Write w = data.write()
w[4] = 22; w[4] = 22;
```
These operations allow fast read/write from PoolVectors and keep it These operations allow fast read/write from PoolVectors and keep it
locked until they go out of scope. However, PoolVectors should be used locked until they go out of scope. However, PoolVectors should be used
@ -149,11 +149,11 @@ in C++ are often inlined and make the binary size much fatter, both in
debug symbols and code. List, Set and Map can be iterated using debug symbols and code. List, Set and Map can be iterated using
pointers, like this: pointers, like this:
.. code-block:: cpp ```
for(List<int>::Element *E=somelist.front();E;E=E->next()) { for(List<int>::Element *E=somelist.front();E;E=E->next()) {
print_line(E->get()); // print the element print_line(E->get()); // print the element
} }
```
The Vector<> class also has a few nice features: The Vector<> class also has a few nice features:

View File

@ -45,8 +45,7 @@ ResourceLoader. ResourceLoader loads once and references the same
object regardless how many times `load` is called on a specific resource. object regardless how many times `load` is called on a specific resource.
Therefore, playback state must be self-contained in AudioStreamPlayback. Therefore, playback state must be self-contained in AudioStreamPlayback.
.. code-block:: cpp ```
/* audiostream_mytone.h */ /* audiostream_mytone.h */
#include "core/reference.h" #include "core/reference.h"
@ -75,9 +74,9 @@ Therefore, playback state must be self-contained in AudioStreamPlayback.
protected: protected:
static void _bind_methods(); static void _bind_methods();
}; };
```
.. code-block:: cpp ```
/* audiostream_mytone.cpp */ /* audiostream_mytone.cpp */
#include "audiostream_mytone.h" #include "audiostream_mytone.h"
@ -112,6 +111,7 @@ Therefore, playback state must be self-contained in AudioStreamPlayback.
ClassDB::bind_method(D_METHOD("reset"), &AudioStreamMyTone::reset); ClassDB::bind_method(D_METHOD("reset"), &AudioStreamMyTone::reset);
ClassDB::bind_method(D_METHOD("get_stream_name"), &AudioStreamMyTone::get_stream_name); ClassDB::bind_method(D_METHOD("get_stream_name"), &AudioStreamMyTone::get_stream_name);
} }
```
References: References:
~~~~~~~~~~~ ~~~~~~~~~~~
@ -126,8 +126,7 @@ AudioStreamPlayer uses `mix` callback to obtain PCM data. The callback must matc
Since AudioStreamPlayback is controlled by the audio thread, i/o and dynamic memory allocation are forbidden. Since AudioStreamPlayback is controlled by the audio thread, i/o and dynamic memory allocation are forbidden.
.. code-block:: cpp ```
/* audiostreamplayer_mytone.h */ /* audiostreamplayer_mytone.h */
#include "core/reference.h" #include "core/reference.h"
@ -163,9 +162,9 @@ Since AudioStreamPlayback is controlled by the audio thread, i/o and dynamic mem
AudioStreamPlaybackMyTone(); AudioStreamPlaybackMyTone();
~AudioStreamPlaybackMyTone(); ~AudioStreamPlaybackMyTone();
}; };
```
.. code-block:: cpp ```
/* audiostreamplayer_mytone.cpp */ /* audiostreamplayer_mytone.cpp */
#include "audiostreamplayer_mytone.h" #include "audiostreamplayer_mytone.h"
@ -227,6 +226,7 @@ Since AudioStreamPlayback is controlled by the audio thread, i/o and dynamic mem
bool AudioStreamPlaybackMyTone::is_playing() const { bool AudioStreamPlaybackMyTone::is_playing() const {
return active; return active;
} }
```
Resampling Resampling
~~~~~~~~~~ ~~~~~~~~~~
@ -238,8 +238,7 @@ Godot provides cubic interpolation for audio resampling.
Instead of overloading `mix`, AudioStreamPlaybackResampled uses `mix_internal` to Instead of overloading `mix`, AudioStreamPlaybackResampled uses `mix_internal` to
query AudioFrames and `get_stream_sampling_rate` to query current mix rate. query AudioFrames and `get_stream_sampling_rate` to query current mix rate.
.. code-block:: cpp ```
#include "core/reference.h" #include "core/reference.h"
#include "core/resource.h" #include "core/resource.h"
#include "servers/audio/audio_stream.h" #include "servers/audio/audio_stream.h"
@ -279,8 +278,7 @@ query AudioFrames and `get_stream_sampling_rate` to query current mix rate.
~AudioStreamPlaybackResampledMyTone(); ~AudioStreamPlaybackResampledMyTone();
}; };
.. code-block:: cpp ```
#include "mytone_audiostream_resampled.h" #include "mytone_audiostream_resampled.h"
#include "core/math/math_funcs.h" #include "core/math/math_funcs.h"
@ -343,6 +341,7 @@ query AudioFrames and `get_stream_sampling_rate` to query current mix rate.
bool AudioStreamPlaybackResampledMyTone::is_playing() const { bool AudioStreamPlaybackResampledMyTone::is_playing() const {
return active; return active;
} }
```
References: References:
~~~~~~~~~~~ ~~~~~~~~~~~

View File

@ -38,8 +38,7 @@ Creating a Godot server
At minimum, a server must have a static instance, a sleep timer, a thread loop, At minimum, a server must have a static instance, a sleep timer, a thread loop,
an initialization state and a cleanup procedure. an initialization state and a cleanup procedure.
.. code-block:: cpp ```
#ifndef HILBERT_HOTEL_H #ifndef HILBERT_HOTEL_H
#define HILBERT_HOTEL_H #define HILBERT_HOTEL_H
@ -91,9 +90,9 @@ an initialization state and a cleanup procedure.
}; };
#endif #endif
```
.. code-block:: cpp ```
#include "hilbert_hotel.h" #include "hilbert_hotel.h"
#include "core/dictionary.h" #include "core/dictionary.h"
@ -235,9 +234,9 @@ an initialization state and a cleanup procedure.
HilbertHotel::HilbertHotel() { HilbertHotel::HilbertHotel() {
singleton = this; singleton = this;
} }
```
.. code-block:: cpp ```
/* prime_225.h */ /* prime_225.h */
#include "core/int_types.h" #include "core/int_types.h"
@ -269,6 +268,7 @@ an initialization state and a cleanup procedure.
1283,1289,1291,1297,1301,1303,1307,1319,1321, 1283,1289,1291,1297,1301,1303,1307,1319,1321,
1327,1361,1367,1373,1381,1399,1409,1423,1427 1327,1361,1367,1373,1381,1399,1409,1423,1427
}; };
```
Custom managed resource data Custom managed resource data
---------------------------- ----------------------------
@ -278,8 +278,7 @@ Godot servers implement a mediator pattern. All data types inherit `RID_Data`.
RID_Owner maintains a list of RIDs. In practice, RIDs are similar to writing RID_Owner maintains a list of RIDs. In practice, RIDs are similar to writing
object-oriented C code. object-oriented C code.
.. code-block:: cpp ```
class InfiniteBus : public RID_Data { class InfiniteBus : public RID_Data {
RID self; RID self;
@ -311,6 +310,7 @@ object-oriented C code.
InfiniteBus(uint64_t prime) : prime_num(prime), num(1) {}; InfiniteBus(uint64_t prime) : prime_num(prime), num(1) {};
~InfiniteBus() {}; ~InfiniteBus() {};
} }
```
References References
~~~~~~~~~~~ ~~~~~~~~~~~
@ -332,8 +332,7 @@ class must be created to reference the proper Godot server.
In `register_server_types()`, `Engine::get_singleton()->add_singleton` In `register_server_types()`, `Engine::get_singleton()->add_singleton`
is used to register the dummy class in GDScript. is used to register the dummy class in GDScript.
.. code-block:: cpp ```
/* register_types.cpp */ /* register_types.cpp */
#include "register_types.h" #include "register_types.h"
@ -364,14 +363,15 @@ is used to register the dummy class in GDScript.
memdelete(_hilbert_hotel); memdelete(_hilbert_hotel);
} }
} }
```
.. code-block:: cpp ```
/* register_types.h */ /* register_types.h */
/* Yes, the word in the middle must be the same as the module folder name */ /* Yes, the word in the middle must be the same as the module folder name */
void register_hilbert_hotel_types(); void register_hilbert_hotel_types();
void unregister_hilbert_hotel_types(); void unregister_hilbert_hotel_types();
```
- `servers/register_server_types.cpp ( https://github.com/godotengine/godot/blob/master/servers/register_server_types.cpp )` - `servers/register_server_types.cpp ( https://github.com/godotengine/godot/blob/master/servers/register_server_types.cpp )`
@ -380,24 +380,23 @@ Bind methods
The dummy class binds singleton methods to GDScript. In most cases, the dummy class methods wraps around. The dummy class binds singleton methods to GDScript. In most cases, the dummy class methods wraps around.
.. code-block:: cpp ```
Variant _HilbertHotel::get_bus_info(RID id) { Variant _HilbertHotel::get_bus_info(RID id) {
return HilbertHotel::get_singleton()->get_bus_info(id); return HilbertHotel::get_singleton()->get_bus_info(id);
} }
```
Binding Signals Binding Signals
It is possible to emit signals to GDScript by calling the GDScript dummy object. It is possible to emit signals to GDScript by calling the GDScript dummy object.
.. code-block:: cpp ```
void HilbertHotel::_emit_occupy_room(uint64_t room, RID rid) { void HilbertHotel::_emit_occupy_room(uint64_t room, RID rid) {
_HilbertHotel::get_singleton()->_occupy_room(room, rid); _HilbertHotel::get_singleton()->_occupy_room(room, rid);
} }
```
.. code-block:: cpp ```
class _HilbertHotel : public Object { class _HilbertHotel : public Object {
GDCLASS(_HilbertHotel, Object); GDCLASS(_HilbertHotel, Object);
@ -422,9 +421,9 @@ It is possible to emit signals to GDScript by calling the GDScript dummy object.
}; };
#endif #endif
```
.. code-block:: cpp ```
_HilbertHotel *_HilbertHotel::singleton = NULL; _HilbertHotel *_HilbertHotel::singleton = NULL;
_HilbertHotel *_HilbertHotel::get_singleton() { return singleton; } _HilbertHotel *_HilbertHotel::get_singleton() { return singleton; }
@ -461,6 +460,7 @@ It is possible to emit signals to GDScript by calling the GDScript dummy object.
_HilbertHotel::~_HilbertHotel() { _HilbertHotel::~_HilbertHotel() {
} }
```
MessageQueue MessageQueue
------------ ------------
@ -481,8 +481,7 @@ Summing it up
Here is the GDScript sample code: Here is the GDScript sample code:
:: ```
extends Node extends Node
func _ready(): func _ready():
@ -501,6 +500,7 @@ Here is the GDScript sample code:
func _print_occupy_room(room_number, r_id): func _print_occupy_room(room_number, r_id):
print("Room number: " + str(room_number) + ", RID: " + str(r_id)) print("Room number: " + str(room_number) + ", RID: " + str(r_id))
print(HilbertHotel.get_bus_info(r_id)) print(HilbertHotel.get_bus_info(r_id))
```
Notes Notes
~~~~~ ~~~~~

View File

@ -44,8 +44,7 @@ a different VCS into modules and use it.
The example module will be called "summator" (`godot/modules/summator`). The example module will be called "summator" (`godot/modules/summator`).
Inside we will create a simple summator class: Inside we will create a simple summator class:
.. code-block:: cpp ```
/* summator.h */ /* summator.h */
#ifndef SUMMATOR_H #ifndef SUMMATOR_H
@ -70,11 +69,11 @@ Inside we will create a simple summator class:
}; };
#endif // SUMMATOR_H #endif // SUMMATOR_H
```
And then the cpp file. And then the cpp file.
.. code-block:: cpp ```
/* summator.cpp */ /* summator.cpp */
#include "summator.h" #include "summator.h"
@ -104,27 +103,26 @@ And then the cpp file.
Then, the new class needs to be registered somehow, so two more files Then, the new class needs to be registered somehow, so two more files
need to be created: need to be created:
.. code-block:: none ```
register_types.h register_types.h
register_types.cpp register_types.cpp
```
.. important:: .. important:
These files must be in the top-level folder of your module (next to your These files must be in the top-level folder of your module (next to your
`SCsub` and `config.py` files) for the module to be registered properly. `SCsub` and `config.py` files) for the module to be registered properly.
These files should contain the following: These files should contain the following:
.. code-block:: cpp ```
/* register_types.h */ /* register_types.h */
void register_summator_types(); void register_summator_types();
void unregister_summator_types(); void unregister_summator_types();
/* yes, the word in the middle must be the same as the module folder name */ /* yes, the word in the middle must be the same as the module folder name */
```
.. code-block:: cpp ```
/* register_types.cpp */ /* register_types.cpp */
#include "register_types.h" #include "register_types.h"
@ -139,25 +137,26 @@ These files should contain the following:
void unregister_summator_types() { void unregister_summator_types() {
// Nothing to do here in this example. // Nothing to do here in this example.
} }
```
Next, we need to create a `SCsub` file so the build system compiles Next, we need to create a `SCsub` file so the build system compiles
this module: this module:
.. code-block:: python ```
# SCsub # SCsub
Import('env') Import('env')
env.add_source_files(env.modules_sources, "*.cpp") # Add all cpp files to the build env.add_source_files(env.modules_sources, "*.cpp") # Add all cpp files to the build
```
With multiple sources, you can also add each file individually to a Python With multiple sources, you can also add each file individually to a Python
string list: string list:
.. code-block:: python ```
src_list = ["summator.cpp", "other.cpp", "etc.cpp"] src_list = ["summator.cpp", "other.cpp", "etc.cpp"]
env.add_source_files(env.modules_sources, src_list) env.add_source_files(env.modules_sources, src_list)
```
This allows for powerful possibilities using Python to construct the file list This allows for powerful possibilities using Python to construct the file list
using loops and logic statements. Look at some modules that ship with Godot by using loops and logic statements. Look at some modules that ship with Godot by
@ -166,17 +165,16 @@ default for examples.
To add include directories for the compiler to look at you can append it to the To add include directories for the compiler to look at you can append it to the
environment's paths: environment's paths:
.. code-block:: python ```
env.Append(CPPPATH=["mylib/include"]) # this is a relative path env.Append(CPPPATH=["mylib/include"]) # this is a relative path
env.Append(CPPPATH=["#myotherlib/include"]) # this is an 'absolute' path env.Append(CPPPATH=["#myotherlib/include"]) # this is an 'absolute' path
```
If you want to add custom compiler flags when building your module, you need to clone If you want to add custom compiler flags when building your module, you need to clone
`env` first, so it won't add those flags to whole Godot build (which can cause errors). `env` first, so it won't add those flags to whole Godot build (which can cause errors).
Example `SCsub` with custom flags: Example `SCsub` with custom flags:
.. code-block:: python ```
# SCsub # SCsub
Import('env') Import('env')
@ -188,12 +186,12 @@ Example `SCsub` with custom flags:
# If you need to, you can: # If you need to, you can:
# - Append CFLAGS for C code only. # - Append CFLAGS for C code only.
# - Append CXXFLAGS for C++ code only. # - Append CXXFLAGS for C++ code only.
```
And finally, the configuration file for the module, this is a simple And finally, the configuration file for the module, this is a simple
python script that must be named `config.py`: python script that must be named `config.py`:
.. code-block:: python ```
# config.py # config.py
def can_build(env, platform): def can_build(env, platform):
@ -201,6 +199,7 @@ python script that must be named `config.py`:
def configure(env): def configure(env):
pass pass
```
The module is asked if it's OK to build for the specific platform (in The module is asked if it's OK to build for the specific platform (in
this case, `True` means it will build for every platform). this case, `True` means it will build for every platform).
@ -208,14 +207,14 @@ this case, `True` means it will build for every platform).
And that's it. Hope it was not too complex! Your module should look like And that's it. Hope it was not too complex! Your module should look like
this: this:
.. code-block:: none ```
godot/modules/summator/config.py godot/modules/summator/config.py
godot/modules/summator/summator.h godot/modules/summator/summator.h
godot/modules/summator/summator.cpp godot/modules/summator/summator.cpp
godot/modules/summator/register_types.h godot/modules/summator/register_types.h
godot/modules/summator/register_types.cpp godot/modules/summator/register_types.cpp
godot/modules/summator/SCsub godot/modules/summator/SCsub
```
You can then zip it and share the module with everyone else. When You can then zip it and share the module with everyone else. When
building for every platform (instructions in the previous sections), building for every platform (instructions in the previous sections),
@ -281,18 +280,18 @@ practical thing to do:
So if you feel like the independent structure of custom modules is needed, lets So if you feel like the independent structure of custom modules is needed, lets
take our "summator" module and move it to the engine's parent directory: take our "summator" module and move it to the engine's parent directory:
.. code-block:: shell ```
mkdir ../modules mkdir ../modules
mv modules/summator ../modules mv modules/summator ../modules
```
Compile the engine with our module by providing `custom_modules` build option Compile the engine with our module by providing `custom_modules` build option
which accepts a comma-separated list of directory paths containing custom C++ which accepts a comma-separated list of directory paths containing custom C++
modules, similar to the following: modules, similar to the following:
.. code-block:: shell ```
scons custom_modules=../modules scons custom_modules=../modules
```
The build system shall detect all modules under the `../modules` directory The build system shall detect all modules under the `../modules` directory
and compile them accordingly, including our "summator" module. and compile them accordingly, including our "summator" module.
@ -333,8 +332,7 @@ changed, finding such files and eventually linking the final binary takes a long
The solution to avoid such a cost is to build our own module as a shared The solution to avoid such a cost is to build our own module as a shared
library that will be dynamically loaded when starting our game's binary. library that will be dynamically loaded when starting our game's binary.
.. code-block:: python ```
# SCsub # SCsub
Import('env') Import('env')
@ -370,16 +368,17 @@ library that will be dynamically loaded when starting our game's binary.
# (e.g. ".x11.tools.64") but without the final ".so". # (e.g. ".x11.tools.64") but without the final ".so".
shared_lib_shim = shared_lib[0].name.rsplit('.', 1)[0] shared_lib_shim = shared_lib[0].name.rsplit('.', 1)[0]
env.Append(LIBS=[shared_lib_shim]) env.Append(LIBS=[shared_lib_shim])
```
Once compiled, we should end up with a `bin` directory containing both the Once compiled, we should end up with a `bin` directory containing both the
`godot*` binary and our `libsummator*.so`. However given the .so is not in `godot*` binary and our `libsummator*.so`. However given the .so is not in
a standard directory (like `/usr/lib`), we have to help our binary find it a standard directory (like `/usr/lib`), we have to help our binary find it
during runtime with the `LD_LIBRARY_PATH` environment variable: during runtime with the `LD_LIBRARY_PATH` environment variable:
.. code-block:: shell ```
export LD_LIBRARY_PATH="$PWD/bin/" export LD_LIBRARY_PATH="$PWD/bin/"
./bin/godot* ./bin/godot*
```
Note: Note:
@ -391,8 +390,7 @@ module as shared library (for development) or as a part of the Godot binary
(for release). To do that we can define a custom flag to be passed to SCons (for release). To do that we can define a custom flag to be passed to SCons
using the `ARGUMENT` command: using the `ARGUMENT` command:
.. code-block:: python ```
# SCsub # SCsub
Import('env') Import('env')
@ -416,6 +414,7 @@ using the `ARGUMENT` command:
else: else:
# Static compilation # Static compilation
module_env.add_source_files(env.modules_sources, sources) module_env.add_source_files(env.modules_sources, sources)
```
Now by default `scons` command will build our module as part of Godot's binary Now by default `scons` command will build our module as part of Godot's binary
and as a shared library when passing `summator_shared=yes`. and as a shared library when passing `summator_shared=yes`.
@ -423,9 +422,9 @@ and as a shared library when passing `summator_shared=yes`.
Finally, you can even speed up the build further by explicitly specifying your Finally, you can even speed up the build further by explicitly specifying your
shared module as target in the SCons command: shared module as target in the SCons command:
.. code-block:: shell ```
scons summator_shared=yes platform=x11 bin/libsummator.x11.tools.64.so scons summator_shared=yes platform=x11 bin/libsummator.x11.tools.64.so
```
Writing custom documentation Writing custom documentation
---------------------------- ----------------------------
@ -443,8 +442,7 @@ There are several steps in order to setup custom docs for the module:
2. Now, we need to edit `config.py`, add the following snippet: 2. Now, we need to edit `config.py`, add the following snippet:
.. code-block:: python ```
def get_doc_path(): def get_doc_path():
return "doc_classes" return "doc_classes"
@ -452,6 +450,7 @@ There are several steps in order to setup custom docs for the module:
return [ return [
"Summator", "Summator",
] ]
```
The `get_doc_path()` function is used by the build system to determine The `get_doc_path()` function is used by the build system to determine
the location of the docs. In this case, they will be located in the the location of the docs. In this case, they will be located in the
@ -468,12 +467,15 @@ Tip:
You can use Git to check if you have missed some of your classes by checking the You can use Git to check if you have missed some of your classes by checking the
untracked files with `git status`. For example:: untracked files with `git status`. For example:
```
user@host:~/godot$ git status user@host:~/godot$ git status
```
Example output:: Example output:
```
Untracked files: Untracked files:
(use "git add <file>..." to include in what will be committed) (use "git add <file>..." to include in what will be committed)
@ -482,7 +484,7 @@ Tip:
doc/classes/MyClass5D.xml doc/classes/MyClass5D.xml
doc/classes/MyClass6D.xml doc/classes/MyClass6D.xml
... ...
```
3. Now we can generate the documentation: 3. Now we can generate the documentation:
@ -494,9 +496,9 @@ to an another folder, and just copy over the files that you need.
Run command: Run command:
:: ```
user@host:~/godot/bin$ ./bin/<godot_binary> --doctool . user@host:~/godot/bin$ ./bin/<godot_binary> --doctool .
```
Now if you go to the `godot/modules/summator/doc_classes` folder, you will see Now if you go to the `godot/modules/summator/doc_classes` folder, you will see
that it contains a `Summator.xml` file, or any other classes, that you referenced that it contains a `Summator.xml` file, or any other classes, that you referenced
@ -518,11 +520,10 @@ on top of the newer ones.
Note that if you don't have write access rights to your supplied `<path )`, Note that if you don't have write access rights to your supplied `<path )`,
you might encounter an error similar to the following: you might encounter an error similar to the following:
.. code-block:: console ```
ERROR: Can't write doc file: docs/doc/classes/@GDScript.xml ERROR: Can't write doc file: docs/doc/classes/@GDScript.xml
At: editor/doc/doc_data.cpp:956 At: editor/doc/doc_data.cpp:956
```
@ -548,10 +549,10 @@ Once you've created your icon(s), proceed with the following steps:
If you'd like to store your icons somewhere else within your module, If you'd like to store your icons somewhere else within your module,
add the following code snippet to `config.py` to override the default path: add the following code snippet to `config.py` to override the default path:
.. code-block:: python ```
def get_icons_path(): def get_icons_path():
return "path/to/icons" return "path/to/icons"
```
Summing up Summing up
---------- ----------

View File

@ -55,8 +55,7 @@ resources with the `load` function. To load a resource, `load` must
read and handle data serialization. read and handle data serialization.
.. code-block:: cpp ```
/* resource_loader_json.h */ /* resource_loader_json.h */
#ifndef RESOURCE_LOADER_JSON_H #ifndef RESOURCE_LOADER_JSON_H
@ -73,9 +72,9 @@ read and handle data serialization.
virtual String get_resource_type(const String &p_path) const; virtual String get_resource_type(const String &p_path) const;
}; };
#endif // RESOURCE_LOADER_JSON_H #endif // RESOURCE_LOADER_JSON_H
```
.. code-block:: cpp ```
/* resource_loader_json.cpp */ /* resource_loader_json.cpp */
#include "resource_loader_json.h" #include "resource_loader_json.h"
@ -104,6 +103,7 @@ read and handle data serialization.
bool ResourceFormatLoaderJson::handles_type(const String &p_type) const { bool ResourceFormatLoaderJson::handles_type(const String &p_type) const {
return ClassDB::is_parent_class(p_type, "Resource"); return ClassDB::is_parent_class(p_type, "Resource");
} }
```
Creating a ResourceFormatSaver Creating a ResourceFormatSaver
------------------------------ ------------------------------
@ -111,8 +111,7 @@ Creating a ResourceFormatSaver
If you'd like to be able to edit and save a resource, you can implement a If you'd like to be able to edit and save a resource, you can implement a
`ResourceFormatSaver`: `ResourceFormatSaver`:
.. code-block:: cpp ```
/* resource_saver_json.h */ /* resource_saver_json.h */
#ifndef RESOURCE_SAVER_JSON_H #ifndef RESOURCE_SAVER_JSON_H
@ -128,9 +127,9 @@ If you'd like to be able to edit and save a resource, you can implement a
virtual void get_recognized_extensions(const RES &p_resource, List<String> *r_extensions) const; virtual void get_recognized_extensions(const RES &p_resource, List<String> *r_extensions) const;
}; };
#endif // RESOURCE_SAVER_JSON_H #endif // RESOURCE_SAVER_JSON_H
```
.. code-block:: cpp ```
/* resource_saver_json.cpp */ /* resource_saver_json.cpp */
#include "resource_saver_json.h" #include "resource_saver_json.h"
@ -153,6 +152,7 @@ If you'd like to be able to edit and save a resource, you can implement a
r_extensions->push_back("json"); r_extensions->push_back("json");
} }
} }
```
Creating custom data types Creating custom data types
-------------------------- --------------------------
@ -163,8 +163,7 @@ understand additional binary formats such as machine learning models.
Here is an example of creating a custom datatype: Here is an example of creating a custom datatype:
.. code-block:: cpp ```
/* resource_json.h */ /* resource_json.h */
#ifndef RESOURCE_JSON_H #ifndef RESOURCE_JSON_H
@ -195,9 +194,9 @@ Here is an example of creating a custom datatype:
Dictionary get_dict(); Dictionary get_dict();
}; };
#endif // RESOURCE_JSON_H #endif // RESOURCE_JSON_H
```
.. code-block:: cpp ```
/* resource_json.cpp */ /* resource_json.cpp */
#include "resource_json.h" #include "resource_json.h"
@ -257,6 +256,7 @@ Here is an example of creating a custom datatype:
Dictionary JsonResource::get_dict() { Dictionary JsonResource::get_dict() {
return content; return content;
} }
```
Considerations Considerations
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
@ -267,8 +267,7 @@ Therefore, Godot call translations are required.
For example, here is the code for translating `FileAccess` For example, here is the code for translating `FileAccess`
calls into `std::istream`. calls into `std::istream`.
.. code-block:: cpp ```
#include "core/os/file_access.h" #include "core/os/file_access.h"
#include <istream> #include <istream>
@ -297,7 +296,7 @@ calls into `std::istream`.
private: private:
FileAccess *_file; FileAccess *_file;
}; };
```
References References
~~~~~~~~~~ ~~~~~~~~~~
@ -313,15 +312,14 @@ Godot registers `ResourcesFormatLoader` with a `ResourceLoader`
handler. The handler selects the proper loader automatically handler. The handler selects the proper loader automatically
when `load` is called. when `load` is called.
.. code-block:: cpp ```
/* register_types.h */ /* register_types.h */
void register_json_types(); void register_json_types();
void unregister_json_types(); void unregister_json_types();
```
.. code-block:: cpp ```
/* register_types.cpp */ /* register_types.cpp */
#include "register_types.h" #include "register_types.h"
@ -351,6 +349,7 @@ when `load` is called.
ResourceSaver::remove_resource_format_saver(json_saver); ResourceSaver::remove_resource_format_saver(json_saver);
json_saver.unref(); json_saver.unref();
} }
```
References References
~~~~~~~~~~ ~~~~~~~~~~
@ -363,8 +362,7 @@ Loading it on GDScript
Save a file called `demo.json` with the following contents and place it in the Save a file called `demo.json` with the following contents and place it in the
project's root folder: project's root folder:
.. code-block:: json ```
{ {
"savefilename": "demo.json", "savefilename": "demo.json",
"demo": [ "demo": [
@ -375,12 +373,15 @@ project's root folder:
"loaders" "loaders"
] ]
} }
```
Then attach the following script to any node:: Then attach the following script to any node::
```
extends Node extends Node
onready var json_resource = load("res://demo.json") onready var json_resource = load("res://demo.json")
func _ready(): func _ready():
print(json_resource.get_dict()) print(json_resource.get_dict())
```

View File

@ -26,15 +26,15 @@ project. To launch a project directly, you need to run the editor by
passing the `-e` argument to Godot Engine's binary from within your passing the `-e` argument to Godot Engine's binary from within your
project's folder. Typically: project's folder. Typically:
.. code-block:: none ```
$ cd ~/myproject $ cd ~/myproject
$ gdb godot $ gdb godot
> run -e > run -e
```
Or: Or:
.. code-block:: none ```
$ gdb godot $ gdb godot
> run -e --path ~/myproject > run -e --path ~/myproject
```

View File

@ -9,8 +9,7 @@ If you want to debug an official build of the editor it should be re-signed with
Create an `editor.entitlements` text file with the following contents: Create an `editor.entitlements` text file with the following contents:
.. code-block:: xml ```
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
@ -31,10 +30,13 @@ Create an `editor.entitlements` text file with the following contents:
<true/> <true/>
</dict> </dict>
</plist> </plist>
```
Then use the following command to re-sign the editor:: Then use the following command to re-sign the editor:
```
codesign -s - --deep --force --options=runtime --entitlements ./editor.entitlements ./path/to/Godot.app codesign -s - --deep --force --options=runtime --entitlements ./editor.entitlements ./path/to/Godot.app
```
Debugging exported project Debugging exported project
-------------------------- --------------------------

View File

@ -17,21 +17,21 @@ inherit directly or indirectly from it. Objects provide reflection and
editable properties, and declaring them is a matter of using a single editable properties, and declaring them is a matter of using a single
macro like this. macro like this.
.. code-block:: cpp ```
class CustomObject : public Object { class CustomObject : public Object {
GDCLASS(CustomObject, Object); // this is required to inherit GDCLASS(CustomObject, Object); // this is required to inherit
}; };
```
This makes Objects gain a lot of functionality, like for example This makes Objects gain a lot of functionality, like for example
.. code-block:: cpp ```
obj = memnew(CustomObject); obj = memnew(CustomObject);
print_line("Object class: ", obj->get_class()); // print object class print_line("Object class: ", obj->get_class()); // print object class
obj2 = Object::cast_to<OtherClass>(obj); // converting between classes, this also works without RTTI enabled. obj2 = Object::cast_to<OtherClass>(obj); // converting between classes, this also works without RTTI enabled.
```
References: References:
~~~~~~~~~~~ ~~~~~~~~~~~
@ -47,18 +47,18 @@ their methods properties and integer constants.
Classes are registered by calling: Classes are registered by calling:
.. code-block:: cpp ```
ClassDB::register_class<MyCustomClass>() ClassDB::register_class<MyCustomClass>()
```
Registering it will allow the class to be instanced by scripts, code, or Registering it will allow the class to be instanced by scripts, code, or
creating them again when deserializing. creating them again when deserializing.
Registering as virtual is the same but it can't be instanced. Registering as virtual is the same but it can't be instanced.
.. code-block:: cpp ```
ClassDB::register_virtual_class<MyCustomClass>() ClassDB::register_virtual_class<MyCustomClass>()
```
Object-derived classes can override the static function Object-derived classes can override the static function
`static void _bind_methods()`. When one class is registered, this `static void _bind_methods()`. When one class is registered, this
@ -70,15 +70,15 @@ virtual automatically.
Inside `bind_methods`, there are a couple of things that can be done. Inside `bind_methods`, there are a couple of things that can be done.
Registering functions is one: Registering functions is one:
.. code-block:: cpp ```
ClassDB::bind_method(D_METHOD("methodname", "arg1name", "arg2name"), &MyCustomMethod); ClassDB::bind_method(D_METHOD("methodname", "arg1name", "arg2name"), &MyCustomMethod);
```
Default values for arguments can be passed in reverse order: Default values for arguments can be passed in reverse order:
.. code-block:: cpp ```
ClassDB::bind_method(D_METHOD("methodname", "arg1name", "arg2name"), &MyCustomType::method, DEFVAL(-1)); // default value for arg2name ClassDB::bind_method(D_METHOD("methodname", "arg1name", "arg2name"), &MyCustomType::method, DEFVAL(-1)); // default value for arg2name
```
`D_METHOD` is a macro that converts "methodname" to a StringName for more `D_METHOD` is a macro that converts "methodname" to a StringName for more
efficiency. Argument names are used for introspection, but when efficiency. Argument names are used for introspection, but when
@ -101,26 +101,26 @@ Constants
Classes often have enums such as: Classes often have enums such as:
.. code-block:: cpp ```
enum SomeMode { enum SomeMode {
MODE_FIRST, MODE_FIRST,
MODE_SECOND MODE_SECOND
}; };
```
For these to work when binding to methods, the enum must be declared For these to work when binding to methods, the enum must be declared
convertible to int, for this a macro is provided: convertible to int, for this a macro is provided:
.. code-block:: cpp ```
VARIANT_ENUM_CAST(MyClass::SomeMode); // now functions that take SomeMode can be bound. VARIANT_ENUM_CAST(MyClass::SomeMode); // now functions that take SomeMode can be bound.
```
The constants can also be bound inside `bind_methods`, by using: The constants can also be bound inside `bind_methods`, by using:
.. code-block:: cpp ```
BIND_CONSTANT(MODE_FIRST); BIND_CONSTANT(MODE_FIRST);
BIND_CONSTANT(MODE_SECOND); BIND_CONSTANT(MODE_SECOND);
```
Properties (set/get) Properties (set/get)
-------------------- --------------------
@ -133,15 +133,15 @@ Objects export properties, properties are useful for the following:
Properties are usually defined by the PropertyInfo() class. Usually Properties are usually defined by the PropertyInfo() class. Usually
constructed as: constructed as:
.. code-block:: cpp ```
PropertyInfo(type, name, hint, hint_string, usage_flags) PropertyInfo(type, name, hint, hint_string, usage_flags)
```
For example: For example:
.. code-block:: cpp ```
PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "0,49,1", PROPERTY_USAGE_EDITOR) PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "0,49,1", PROPERTY_USAGE_EDITOR)
```
This is an integer property, named "amount", hint is a range, range goes This is an integer property, named "amount", hint is a range, range goes
from 0 to 49 in steps of 1 (integers). It is only usable for the editor from 0 to 49 in steps of 1 (integers). It is only usable for the editor
@ -149,9 +149,9 @@ from 0 to 49 in steps of 1 (integers). It is only usable for the editor
Another example: Another example:
.. code-block:: cpp ```
PropertyInfo(Variant::STRING, "modes", PROPERTY_HINT_ENUM, "Enabled,Disabled,Turbo") PropertyInfo(Variant::STRING, "modes", PROPERTY_HINT_ENUM, "Enabled,Disabled,Turbo")
```
This is a string property, can take any string but the editor will only This is a string property, can take any string but the editor will only
allow the defined hint ones. Since no usage flags were specified, the allow the defined hint ones. Since no usage flags were specified, the
@ -169,9 +169,9 @@ impossible unless using operator [].
From `bind_methods()`, properties can be created and bound as long as From `bind_methods()`, properties can be created and bound as long as
set/get functions exist. Example: set/get functions exist. Example:
.. code-block:: cpp ```
ADD_PROPERTY(PropertyInfo(Variant::INT, "amount"), "set_amount", "get_amount") ADD_PROPERTY(PropertyInfo(Variant::INT, "amount"), "set_amount", "get_amount")
```
This creates the property using the setter and the getter. This creates the property using the setter and the getter.
@ -188,12 +188,12 @@ they are NOT virtual, DO NOT make them virtual, they are called for
every override and the previous ones are not invalidated (multilevel every override and the previous ones are not invalidated (multilevel
call). call).
.. code-block:: cpp ```
protected: protected:
void _get_property_list(List<PropertyInfo> *r_props) const; // return list of properties void _get_property_list(List<PropertyInfo> *r_props) const; // return list of properties
bool _get(const StringName &p_property, Variant &r_value) const; // return true if property was found bool _get(const StringName &p_property, Variant &r_value) const; // return true if property was found
bool _set(const StringName &p_property, const Variant &p_value); // return true if property was found bool _set(const StringName &p_property, const Variant &p_value); // return true if property was found
```
This is also a little less efficient since `p_property` must be This is also a little less efficient since `p_property` must be
compared against the desired names in serial order. compared against the desired names in serial order.
@ -204,12 +204,12 @@ Dynamic casting
Godot provides dynamic casting between Object-derived classes, for Godot provides dynamic casting between Object-derived classes, for
example: example:
.. code-block:: cpp ```
void somefunc(Object *some_obj) { void somefunc(Object *some_obj) {
Button *button = Object::cast_to<Button>(some_obj); Button *button = Object::cast_to<Button>(some_obj);
} }
```
If cast fails, NULL is returned. This system uses RTTI, but it also If cast fails, NULL is returned. This system uses RTTI, but it also
works fine (although a bit slower) when RTTI is disabled. This is useful works fine (although a bit slower) when RTTI is disabled. This is useful
@ -222,11 +222,11 @@ Signals
Objects can have a set of signals defined (similar to Delegates in other Objects can have a set of signals defined (similar to Delegates in other
languages). Connecting to them is rather easy: languages). Connecting to them is rather easy:
.. code-block:: cpp ```
obj->connect(<signal>, target_instance, target_method) obj->connect(<signal>, target_instance, target_method)
// for example: // for example:
obj->connect("enter_tree", this, "_node_entered_tree") obj->connect("enter_tree", this, "_node_entered_tree")
```
The method `node_entered_tree` must be registered to the class using The method `node_entered_tree` must be registered to the class using
`ClassDB::bind_method` (explained before). `ClassDB::bind_method` (explained before).
@ -234,9 +234,9 @@ The method `node_entered_tree` must be registered to the class using
Adding signals to a class is done in `bind_methods`, using the Adding signals to a class is done in `bind_methods`, using the
`ADD_SIGNAL` macro, for example: `ADD_SIGNAL` macro, for example:
.. code-block:: cpp ```
ADD_SIGNAL(MethodInfo("been_killed")) ADD_SIGNAL(MethodInfo("been_killed"))
```
Notifications Notifications
------------- -------------
@ -252,13 +252,13 @@ References
reference count. It is the base for reference counted object types. reference count. It is the base for reference counted object types.
Declaring them must be done using Ref<> template. For example: Declaring them must be done using Ref<> template. For example:
.. code-block:: cpp ```
class MyReference: public Reference { class MyReference: public Reference {
GDCLASS(MyReference, Reference); GDCLASS(MyReference, Reference);
}; };
Ref<MyReference> myref(memnew(MyReference)); Ref<MyReference> myref(memnew(MyReference));
```
`myref` is reference counted. It will be freed when no more Ref<> `myref` is reference counted. It will be freed when no more Ref<>
templates point to it. templates point to it.
@ -289,9 +289,9 @@ Resource loading
Resources can be loaded with the ResourceLoader API, like this: Resources can be loaded with the ResourceLoader API, like this:
.. code-block:: cpp ```
Ref<Resource> res = ResourceLoader::load("res://someresource.res") Ref<Resource> res = ResourceLoader::load("res://someresource.res")
```
If a reference to that resource has been loaded previously and is in If a reference to that resource has been loaded previously and is in
memory, the resource loader will return that reference. This means that memory, the resource loader will return that reference. This means that
@ -310,9 +310,9 @@ Resource saving
Saving a resource can be done with the resource saver API: Saving a resource can be done with the resource saver API:
.. code-block:: cpp ```
ResourceSaver::save("res://someresource.res", instance) ResourceSaver::save("res://someresource.res", instance)
```
Instance will be saved. Sub resources that have a path to a file will be Instance will be saved. Sub resources that have a path to a file will be
saved as a reference to that resource. Sub resources without a path will saved as a reference to that resource. Sub resources without a path will

View File

@ -16,9 +16,9 @@ For instance, you can use the open source `Inkscape ( https://inkscape.org/ )` e
Clone the `godot` repository containing all the editor icons: Clone the `godot` repository containing all the editor icons:
.. code-block:: bash ```
git clone https://github.com/godotengine/godot.git git clone https://github.com/godotengine/godot.git
```
The icons must be created in a vector graphics editor in SVG format. There are The icons must be created in a vector graphics editor in SVG format. There are
two main requirements to follow: two main requirements to follow:
@ -58,9 +58,9 @@ optimized before being added to the engine, to do so:
2. Run the command below, replacing `svg_source.svg` with the path to your 2. Run the command below, replacing `svg_source.svg` with the path to your
SVG file (which can be a relative or absolute path): SVG file (which can be a relative or absolute path):
.. code-block:: bash ```
svgcleaner --multipass svg_source.svg svg_optimized.svg svgcleaner --multipass svg_source.svg svg_optimized.svg
```
The `--multipass` switch improves compression, so make sure to include it. The `--multipass` switch improves compression, so make sure to include it.
The optimized icon will be saved to `svg_optimized.svg`. You can also change The optimized icon will be saved to `svg_optimized.svg`. You can also change

View File

@ -61,11 +61,10 @@ Below every heading comes zero or more `key = value` pairs. The
values can be complex datatypes such as Arrays, Transforms, Colors, and values can be complex datatypes such as Arrays, Transforms, Colors, and
so on. For example, a spatial node looks like: so on. For example, a spatial node looks like:
:: ```
[node name="Cube" type="Spatial" parent="."] [node name="Cube" type="Spatial" parent="."]
transform=Transform( 1.0, 0.0, 0.0 ,0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 ) transform=Transform( 1.0, 0.0, 0.0 ,0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 )
```
The scene tree The scene tree
-------------- --------------
@ -90,20 +89,18 @@ the scene root's name. If the node is a direct child of the scene root,
the path should be `"."`. Here is an example scene tree the path should be `"."`. Here is an example scene tree
(but without any node content): (but without any node content):
:: ```
[node name="Player" type="Spatial"] ; The scene root [node name="Player" type="Spatial"] ; The scene root
[node name="Arm" parent="." type="Spatial"] ; Parented to the scene root [node name="Arm" parent="." type="Spatial"] ; Parented to the scene root
[node name="Hand" parent="Arm" type="Spatial"] [node name="Hand" parent="Arm" type="Spatial"]
[node name="Finger" parent="Arm/Hand" type="Spatial"] [node name="Finger" parent="Arm/Hand" type="Spatial"]
```
Similar to the internal resource, the document for each node is currently Similar to the internal resource, the document for each node is currently
incomplete. Fortunately, it is easy to find out because you can simply incomplete. Fortunately, it is easy to find out because you can simply
save a file with that node in it. Some example nodes are: save a file with that node in it. Some example nodes are:
:: ```
[node type="CollisionShape" name="SphereCollision" parent="SpherePhysics"] [node type="CollisionShape" name="SphereCollision" parent="SpherePhysics"]
shape = SubResource(8) shape = SubResource(8)
@ -134,7 +131,7 @@ save a file with that node in it. Some example nodes are:
fov = 50 fov = 50
transform = Transform( 0.6859206557273865 , -0.32401350140571594 , 0.6515582203865051 , 0.0 , 0.8953956365585327 , 0.44527143239974976 , -0.7276763319969177 , -0.3054208755493164 , 0.6141703724861145 ,14.430776596069336 ,10.093015670776367 ,13.058500289916992 ) transform = Transform( 0.6859206557273865 , -0.32401350140571594 , 0.6515582203865051 , 0.0 , 0.8953956365585327 , 0.44527143239974976 , -0.7276763319969177 , -0.3054208755493164 , 0.6141703724861145 ,14.430776596069336 ,10.093015670776367 ,13.058500289916992 )
far = 100.0 far = 100.0
```
NodePath NodePath
~~~~~~~~ ~~~~~~~~
@ -145,23 +142,21 @@ the node anywhere in the scene tree. For instance, MeshInstance uses
`NodePath()` to point to its skeleton. Likewise, Animation tracks use `NodePath()` to point to its skeleton. Likewise, Animation tracks use
`NodePath()` to point to node properties to animate. `NodePath()` to point to node properties to animate.
:: ```
[node name="mesh" type="MeshInstance" parent="Armature001"] [node name="mesh" type="MeshInstance" parent="Armature001"]
mesh = SubResource(1) mesh = SubResource(1)
skeleton = NodePath("..:") skeleton = NodePath("..:")
```
```
::
[sub_resource id=3 type="Animation"] [sub_resource id=3 type="Animation"]
... ...
tracks/0/type = "transform tracks/0/type = "transform
tracks/0/path = NodePath("Cube:") tracks/0/path = NodePath("Cube:")
... ...
```
Skeleton Skeleton
~~~~~~~~ ~~~~~~~~
@ -187,8 +182,7 @@ bone attributes consist of:
Here's an example of a skeleton node with two bones: Here's an example of a skeleton node with two bones:
:: ```
[node name="Skeleton" type="Skeleton" parent="Armature001" index="0"] [node name="Skeleton" type="Skeleton" parent="Armature001" index="0"]
bones/0/name = "Bone.001" bones/0/name = "Bone.001"
@ -203,7 +197,7 @@ Here's an example of a skeleton node with two bones:
bones/1/pose = Transform( 1.0, 0.0, -0.0, 0.0, 1.0, -0.0, -0.0, -0.0, 1.0, 0.0, 0.0, -0.0 ) bones/1/pose = Transform( 1.0, 0.0, -0.0, 0.0, 1.0, -0.0, -0.0, -0.0, 1.0, 0.0, 0.0, -0.0 )
bones/1/enabled = true bones/1/enabled = true
bones/1/bound_children = [ ] bones/1/bound_children = [ ]
```
BoneAttachment BoneAttachment
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
@ -215,8 +209,7 @@ BoneAttachment node in its `bound_children` list.
An example of one MeshInstance parented to a bone in Skeleton: An example of one MeshInstance parented to a bone in Skeleton:
:: ```
[node name="Armature" type="Skeleton" parent="."] [node name="Armature" type="Skeleton" parent="."]
transform = Transform(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, -0.0219986, 0.0125825, 0.0343127) transform = Transform(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, -0.0219986, 0.0125825, 0.0343127)
@ -235,7 +228,7 @@ An example of one MeshInstance parented to a bone in Skeleton:
mesh = SubResource(1) mesh = SubResource(1)
transform = Transform(1.0, 0.0, 0.0, 0.0, 1.86265e-09, 1.0, 0.0, -1.0, 0.0, 0.0219986, -0.0343127, 2.25595) transform = Transform(1.0, 0.0, 0.0, 0.0, 1.86265e-09, 1.0, 0.0, -1.0, 0.0, 0.0219986, -0.0343127, 2.25595)
```
AnimationPlayer AnimationPlayer
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
@ -246,8 +239,7 @@ Animation resource. All the animation resources use the root node of
AnimationPlayer. The root node is stored as AnimationPlayer. The root node is stored as
`root_node=NodePath(Path/To/Node)`. `root_node=NodePath(Path/To/Node)`.
:: ```
[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="1"] [node name="AnimationPlayer" type="AnimationPlayer" parent="." index="1"]
root_node = NodePath("..") root_node = NodePath("..")
@ -257,7 +249,7 @@ AnimationPlayer. The root node is stored as
playback_speed = 1.0 playback_speed = 1.0
anims/default = SubResource( 2 ) anims/default = SubResource( 2 )
blend_times = [ ] blend_times = [ ]
```
Resources Resources
--------- ---------
@ -287,11 +279,10 @@ are also valid.
Some example external resources are: Some example external resources are:
:: ```
[ext_resource path="res://characters/player.dae" type="PackedScene" id=1] [ext_resource path="res://characters/player.dae" type="PackedScene" id=1]
[ext_resource path="metal.tres" type="Material" id=2] [ext_resource path="metal.tres" type="Material" id=2]
```
Like TSCN files, a TRES file may contain single-line comments starting with a Like TSCN files, a TRES file may contain single-line comments starting with a
semicolon (`;`). However, comments will be discarded when saving the resource semicolon (`;`). However, comments will be discarded when saving the resource
@ -306,13 +297,12 @@ resource looks similar to those of external resources, except that it doesn't
have a path. Internal resources also have `key=value` pairs under each have a path. Internal resources also have `key=value` pairs under each
heading. For example, a capsule collision shape looks like: heading. For example, a capsule collision shape looks like:
:: ```
[sub_resource type="CapsuleShape" id=2] [sub_resource type="CapsuleShape" id=2]
radius = 0.5 radius = 0.5
height = 3.0 height = 3.0
```
Some internal resources contain links to other internal resources (such as a Some internal resources contain links to other internal resources (such as a
mesh having a material). In this case, the referring resource must appear mesh having a material). In this case, the referring resource must appear
@ -357,8 +347,7 @@ TSCN files support two surface formats:
An example of ArrayMesh: An example of ArrayMesh:
:: ```
[sub_resource id=1 type="ArrayMesh"] [sub_resource id=1 type="ArrayMesh"]
surfaces/0 = { surfaces/0 = {
@ -376,7 +365,7 @@ An example of ArrayMesh:
], ],
"morph_arrays":[] "morph_arrays":[]
} }
```
Animation Animation
~~~~~~~~~ ~~~~~~~~~
@ -424,8 +413,7 @@ Each track is described by a list of key-value pairs in the format
4-number rotation quaternion (X, Y, Z, W) and finally a 3-number 4-number rotation quaternion (X, Y, Z, W) and finally a 3-number
scale vector. The default transition in a Transform track is 1.0. scale vector. The default transition in a Transform track is 1.0.
:: ```
[sub_resource type="Animation" id=2] [sub_resource type="Animation" id=2]
length = 4.95833 length = 4.95833
@ -445,3 +433,4 @@ Each track is described by a list of key-value pairs in the format
tracks/1/imported = true tracks/1/imported = true
tracks/1/enabled = false tracks/1/enabled = false
tracks/1/keys = PoolRealArray( 0, 1, 0, 5.96046e-08, 0, 0, 0, 0, 1, 1, 1, 1, 4.95833, 1, 0, 5.96046e-08, 0, 0, 0, 0, 1, 1, 1, 1 ) tracks/1/keys = PoolRealArray( 0, 1, 0, 5.96046e-08, 0, 0, 0, 0, 1, 1, 1, 1, 4.95833, 1, 0, 5.96046e-08, 0, 0, 0, 0, 1, 1, 1, 1 )
```

View File

@ -121,9 +121,9 @@ Randomness
All physics parameters can be randomized. Random values range from `0` to All physics parameters can be randomized. Random values range from `0` to
`1`. The formula to randomize a parameter is: `1`. The formula to randomize a parameter is:
:: ```
initial_value = param_value + param_value * randomness initial_value = param_value + param_value * randomness
```
Fixed FPS Fixed FPS
~~~~~~~~~ ~~~~~~~~~

View File

@ -23,14 +23,14 @@ You can choose to either receive these callbacks as `signals`, or as `notificati
Notifications can be handled in GDScript or other scripting languages: Notifications can be handled in GDScript or other scripting languages:
.. code-block:: none ```
func _notification(what): func _notification(what):
match what: match what:
NOTIFICATION_ENTER_GAMEPLAY: NOTIFICATION_ENTER_GAMEPLAY:
print("notification enter gameplay") print("notification enter gameplay")
NOTIFICATION_EXIT_GAMEPLAY: NOTIFICATION_EXIT_GAMEPLAY:
print("notification exit gameplay") print("notification exit gameplay")
```
Signals are sent just as any other signal. They can be attached to functions using the editor inspector. The signals are called `gameplay_entered` and `gameplay_exited`. Signals are sent just as any other signal. They can be attached to functions using the editor inspector. The signals are called `gameplay_entered` and `gameplay_exited`.

View File

@ -221,9 +221,9 @@ The video and audio's bitrate will be variable to maximize quality while saving
space in parts of the video/audio that don't require a high bitrate (such as space in parts of the video/audio that don't require a high bitrate (such as
static scenes). static scenes).
:: ```
ffmpeg -i input.mp4 -q:v 6 -q:a 6 output.ogv ffmpeg -i input.mp4 -q:v 6 -q:a 6 output.ogv
```
FFmpeg: Resize the video then convert it FFmpeg: Resize the video then convert it
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -232,6 +232,6 @@ The following command resizes a video to be 720 pixels tall (720p), while
preserving its existing aspect ratio. This helps decrease the file size preserving its existing aspect ratio. This helps decrease the file size
significantly if the source is recorded at a higher resolution than 720p: significantly if the source is recorded at a higher resolution than 720p:
:: ```
ffmpeg -i input.mp4 -vf "scale=-1:720" -q:v 6 -q:a 6 output.ogv ffmpeg -i input.mp4 -vf "scale=-1:720" -q:v 6 -q:a 6 output.ogv
```

View File

@ -174,8 +174,7 @@ with the geometry etc.
Create a script like this: Create a script like this:
:: ```
tool # Needed so it runs in the editor. tool # Needed so it runs in the editor.
extends EditorScenePostImport extends EditorScenePostImport
@ -183,6 +182,7 @@ Create a script like this:
func post_import(scene): func post_import(scene):
# Do your stuff here. # Do your stuff here.
return scene # remember to return the imported scene return scene # remember to return the imported scene
```
The `post_import` function takes the imported scene as argument (the The `post_import` function takes the imported scene as argument (the
parameter is actually the root node of the scene). The scene that parameter is actually the root node of the scene). The scene that
@ -339,15 +339,19 @@ hood).
The script must start with an animation filter statement (as denoted by the line beginning with an The script must start with an animation filter statement (as denoted by the line beginning with an
`@`). For example, if we would like to apply filters to all imported animations which have a name `@`). For example, if we would like to apply filters to all imported animations which have a name
ending in `"_Loop"`:: ending in `"_Loop"`:
```
@+*_Loop @+*_Loop
```
Similarly, additional patterns can be added to the same line, separated by commas. Here is a Similarly, additional patterns can be added to the same line, separated by commas. Here is a
modified example to additionally *include* all animations with names that begin with `"Arm_Left"`, modified example to additionally *include* all animations with names that begin with `"Arm_Left"`,
but also *exclude* all animations which have names ending in `"Attack"`:: but also *exclude* all animations which have names ending in `"Attack"`:
```
@+*_Loop, +Arm_Left*, -*Attack @+*_Loop, +Arm_Left*, -*Attack
```
Following the animation selection filter statement, we add track filtering patterns to indicate Following the animation selection filter statement, we add track filtering patterns to indicate
which animation tracks should be kept or discarded. If no track filter patterns are specified, then which animation tracks should be kept or discarded. If no track filter patterns are specified, then
@ -360,12 +364,14 @@ further down in the filter script.
For example: include all tracks in animations with names ending in `"_Loop"`, but discard any For example: include all tracks in animations with names ending in `"_Loop"`, but discard any
tracks affecting a `"Skeleton"` which end in `"Control"`, unless they have `"Arm"` in their tracks affecting a `"Skeleton"` which end in `"Control"`, unless they have `"Arm"` in their
name:: name:
```
@+*_Loop @+*_Loop
+* +*
-Skeleton:*Control -Skeleton:*Control
+*Arm* +*Arm*
```
In the above example, tracks like `"Skeleton:Leg_Control"` would be discarded, while tracks such In the above example, tracks like `"Skeleton:Leg_Control"` would be discarded, while tracks such
as `"Skeleton:Head"` or `"Skeleton:Arm_Left_Control"` would be retained. as `"Skeleton:Head"` or `"Skeleton:Arm_Left_Control"` would be retained.

View File

@ -96,13 +96,13 @@ to escape any double quotes a message may contain by preceding them with
another double quote. Alternatively, you can select another delimiter than another double quote. Alternatively, you can select another delimiter than
comma in the import options. comma in the import options.
.. code-block:: none ```
keys,en,es,ja keys,en,es,ja
GREET,"Hello, friend!","Hola, amigo!",こんにちは GREET,"Hello, friend!","Hola, amigo!",こんにちは
ASK,How are you?,Cómo está?,元気ですか ASK,How are you?,Cómo está?,元気ですか
BYE,Goodbye,Adiós,さようなら BYE,Goodbye,Adiós,さようなら
QUOTE,"""Hello"" said the man.","""Hola"" dijo el hombre.",「こんにちは」男は言いました QUOTE,"""Hello"" said the man.","""Hola"" dijo el hombre.",「こんにちは」男は言いました
```
CSV importer CSV importer
------------ ------------

View File

@ -28,8 +28,7 @@ As an example, one can usually place into a single folder their basic assets,
such as sprite images, 3D model meshes, materials, and music, etc. such as sprite images, 3D model meshes, materials, and music, etc.
They can then use a separate folder to store built levels that use them. They can then use a separate folder to store built levels that use them.
.. code-block:: none ```
/project.godot /project.godot
/docs/.gdignore # See "Ignoring specific folders" below /docs/.gdignore # See "Ignoring specific folders" below
/docs/learning.html /docs/learning.html
@ -43,6 +42,7 @@ They can then use a separate folder to store built levels that use them.
/characters/npcs/suzanne/suzanne.dae /characters/npcs/suzanne/suzanne.dae
/characters/npcs/suzanne/suzanne.png) /characters/npcs/suzanne/suzanne.png)
/levels/riverdale/riverdale.scn /levels/riverdale/riverdale.scn
```
Style guide Style guide
----------- -----------
@ -112,16 +112,20 @@ Note:
On Windows 10, to further avoid mistakes related to case sensitivity, On Windows 10, to further avoid mistakes related to case sensitivity,
you can also make the project folder case-sensitive. After enabling the Windows you can also make the project folder case-sensitive. After enabling the Windows
Subsystem for Linux feature, run the following command in a PowerShell window:: Subsystem for Linux feature, run the following command in a PowerShell window:
```
# To enable case-sensitivity: # To enable case-sensitivity:
fsutil file setcasesensitiveinfo <path to project folder> enable fsutil file setcasesensitiveinfo <path to project folder> enable
# To disable case-sensitivity: # To disable case-sensitivity:
fsutil file setcasesensitiveinfo <path to project folder> disable fsutil file setcasesensitiveinfo <path to project folder> disable
```
If you haven't enabled the Windows Subsystem for Linux, you can enter the If you haven't enabled the Windows Subsystem for Linux, you can enter the
following line in a PowerShell window *running as Administrator* then reboot following line in a PowerShell window *running as Administrator* then reboot
when asked:: when asked:
```
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

View File

@ -40,6 +40,8 @@ Working with Git on Windows
Most Git for Windows clients are configured with the `core.autocrlf` set to `true`. Most Git for Windows clients are configured with the `core.autocrlf` set to `true`.
This can lead to files unnecessarily being marked as modified by Git due to their line endings being converted automatically. This can lead to files unnecessarily being marked as modified by Git due to their line endings being converted automatically.
It is better to set this option as:: It is better to set this option as:
```
git config --global core.autocrlf input git config --global core.autocrlf input
```

View File

@ -173,21 +173,21 @@ for any of the following commands to work correctly.
This can be done by giving the path to the `project.godot` file This can be done by giving the path to the `project.godot` file
of your project as either the first argument, like this: of your project as either the first argument, like this:
:: ```
godot path_to_your_project/project.godot [other] [commands] [and] [args] godot path_to_your_project/project.godot [other] [commands] [and] [args]
```
Or by using the `--path` argument: Or by using the `--path` argument:
:: ```
godot --path path_to_your_project [other] [commands] [and] [args] godot --path path_to_your_project [other] [commands] [and] [args]
```
For example, the full command for exporting your game (as explained below) might look like this: For example, the full command for exporting your game (as explained below) might look like this:
:: ```
godot --path path_to_your_project --export my_export_preset_name game.exe godot --path path_to_your_project --export my_export_preset_name game.exe
```
Creating a project Creating a project
------------------ ------------------
@ -197,11 +197,11 @@ Creating a project from the command line can be done by navigating the
shell to the desired place and making a project.godot file. shell to the desired place and making a project.godot file.
:: ```
mkdir newgame mkdir newgame
cd newgame cd newgame
touch project.godot touch project.godot
```
The project can now be opened with Godot. The project can now be opened with Godot.
@ -214,16 +214,16 @@ Running the editor is done by executing Godot with the `-e` flag. This
must be done from within the project directory or a subdirectory, must be done from within the project directory or a subdirectory,
otherwise the command is ignored and the project manager appears. otherwise the command is ignored and the project manager appears.
:: ```
godot -e godot -e
```
If a scene has been created and saved, it can be edited later by running If a scene has been created and saved, it can be edited later by running
the same code with that scene as argument. the same code with that scene as argument.
:: ```
godot -e scene.tscn godot -e scene.tscn
```
Erasing a scene Erasing a scene
--------------- ---------------
@ -232,9 +232,9 @@ Godot is friends with your filesystem and will not create extra
metadata files. Use `rm` to erase a scene file. Make sure nothing metadata files. Use `rm` to erase a scene file. Make sure nothing
references that scene or else an error will be thrown upon opening. references that scene or else an error will be thrown upon opening.
:: ```
rm scene.tscn rm scene.tscn
```
Running the game Running the game
---------------- ----------------
@ -242,16 +242,16 @@ Running the game
To run the game, simply execute Godot within the project directory or To run the game, simply execute Godot within the project directory or
subdirectory. subdirectory.
:: ```
godot godot
```
When a specific scene needs to be tested, pass that scene to the command When a specific scene needs to be tested, pass that scene to the command
line. line.
:: ```
godot scene.tscn godot scene.tscn
```
Debugging Debugging
--------- ---------
@ -260,14 +260,13 @@ Catching errors in the command line can be a difficult task because they
just fly by. For this, a command line debugger is provided by adding just fly by. For this, a command line debugger is provided by adding
`-d`. It works for running either the game or a simple scene. `-d`. It works for running either the game or a simple scene.
:: ```
godot -d godot -d
```
:: ```
godot -d scene.tscn godot -d scene.tscn
```
Exporting Exporting
@ -277,10 +276,10 @@ Exporting the project from the command line is also supported. This is
especially useful for continuous integration setups. The version of Godot especially useful for continuous integration setups. The version of Godot
that is headless (server build, no video) is ideal for this. that is headless (server build, no video) is ideal for this.
:: ```
godot --export "Linux/X11" /var/builds/project godot --export "Linux/X11" /var/builds/project
godot --export Android /var/builds/project.apk godot --export Android /var/builds/project.apk
```
The preset name must match the name of an export preset defined in the The preset name must match the name of an export preset defined in the
project's `export_presets.cfg` file. If the preset name contains spaces or project's `export_presets.cfg` file. If the preset name contains spaces or
@ -311,21 +310,21 @@ The script must inherit from `SceneTree` or `MainLoop`.
Here is a simple `sayhello.gd` example of how it works: Here is a simple `sayhello.gd` example of how it works:
.. code-block:: python ```
#!/usr/bin/env -S godot -s #!/usr/bin/env -S godot -s
extends SceneTree extends SceneTree
func _init(): func _init():
print("Hello!") print("Hello!")
quit() quit()
```
And how to run it: And how to run it:
:: ```
# Prints "Hello!" to standard output. # Prints "Hello!" to standard output.
godot -s sayhello.gd godot -s sayhello.gd
```
If no `project.godot` exists at the path, current path is assumed to be the If no `project.godot` exists at the path, current path is assumed to be the
current working directory (unless `--path` is specified). current working directory (unless `--path` is specified).
@ -335,16 +334,16 @@ a *shebang*. If the Godot binary is in your `PATH` as `godot`,
it allows you to run the script as follows in modern Linux it allows you to run the script as follows in modern Linux
distributions, as well as macOS: distributions, as well as macOS:
:: ```
# Mark script as executable. # Mark script as executable.
chmod +x sayhello.gd chmod +x sayhello.gd
# Prints "Hello!" to standard output. # Prints "Hello!" to standard output.
./sayhello.gd ./sayhello.gd
```
If the above doesn't work in your current version of Linux or macOS, you can If the above doesn't work in your current version of Linux or macOS, you can
always have the shebang run Godot straight from where it is located as follows: always have the shebang run Godot straight from where it is located as follows:
:: ```
#!/usr/bin/godot -s #!/usr/bin/godot -s
```

View File

@ -1,6 +1,3 @@
.. meta::
:keywords: cheatsheet, cheat sheet, shortcut
Default editor shortcuts Default editor shortcuts

View File

@ -21,15 +21,15 @@ export an ICO file with GIMP.
It is also possible to convert a PNG image to an hiDPI-friendly ICO file It is also possible to convert a PNG image to an hiDPI-friendly ICO file
using this `ImageMagick ( https://www.imagemagick.org/ )` command: using this `ImageMagick ( https://www.imagemagick.org/ )` command:
.. code-block:: none ```
magick convert icon.png) -define icon:auto-resize=256,128,64,48,32,16 icon.ico magick convert icon.png) -define icon:auto-resize=256,128,64,48,32,16 icon.ico
```
Depending on which version of ImageMagick you installed, you might need to leave out the `magick` and run this command instead: Depending on which version of ImageMagick you installed, you might need to leave out the `magick` and run this command instead:
.. code-block:: none ```
convert icon.png) -define icon:auto-resize=256,128,64,48,32,16 icon.ico convert icon.png) -define icon:auto-resize=256,128,64,48,32,16 icon.ico
```
Warning: Warning:

View File

@ -239,9 +239,9 @@ command-line tool that Godot uses to communicate with your device.
Next, create a debug keystore by running the following command on your Next, create a debug keystore by running the following command on your
system's command line: system's command line:
.. code-block:: shell ```
keytool -keyalg RSA -genkeypair -alias androiddebugkey -keypass android -keystore debug.keystore -storepass android -dname "CN=Android Debug,O=Android,C=US" -validity 9999 keytool -keyalg RSA -genkeypair -alias androiddebugkey -keypass android -keystore debug.keystore -storepass android -dname "CN=Android Debug,O=Android,C=US" -validity 9999
```
Click on *Editor -> Editor Settings* in Godot and select the *Export/Android* Click on *Editor -> Editor Settings* in Godot and select the *Export/Android*
section. Here, you need to set the paths to the Android SDK applications on section. Here, you need to set the paths to the Android SDK applications on
@ -258,9 +258,9 @@ leave this on **Landscape**.
Click the **Export Project** button and Godot will build an APK you can download Click the **Export Project** button and Godot will build an APK you can download
on your device. To do this on the command line, use the following: on your device. To do this on the command line, use the following:
.. code-block:: shell ```
adb install dodge.apk adb install dodge.apk
```
Note: Note:
Your device may need to be in *developer mode*. Consult your Your device may need to be in *developer mode*. Consult your

View File

@ -40,9 +40,9 @@ Download and install the Android SDK.
- Once the command line tools are installed, run the `sdkmanager ( https://developer.android.com/studio/command-line/sdkmanager )` command to complete the setup process: - Once the command line tools are installed, run the `sdkmanager ( https://developer.android.com/studio/command-line/sdkmanager )` command to complete the setup process:
:: ```
sdkmanager --sdk_root=<android_sdk_path> "platform-tools" "build-tools;30.0.3" "platforms;android-31" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;21.4.7075529" sdkmanager --sdk_root=<android_sdk_path> "platform-tools" "build-tools;30.0.3" "platforms;android-31" "cmdline-tools;latest" "cmake;3.10.2.4988404" "ndk;21.4.7075529"
```
Note: Note:
@ -60,9 +60,11 @@ projects, ant or eclipse probably generated one for you (in the `~/.android` dir
macOS, in the `C:\Users\<user>\.android\` directory on Windows). macOS, in the `C:\Users\<user>\.android\` directory on Windows).
If you can't find it or need to generate one, the keytool command from If you can't find it or need to generate one, the keytool command from
the JDK can be used for this purpose:: the JDK can be used for this purpose:
```
keytool -keyalg RSA -genkeypair -alias androiddebugkey -keypass android -keystore debug.keystore -storepass android -dname "CN=Android Debug,O=Android,C=US" -validity 9999 -deststoretype pkcs12 keytool -keyalg RSA -genkeypair -alias androiddebugkey -keypass android -keystore debug.keystore -storepass android -dname "CN=Android Debug,O=Android,C=US" -validity 9999 -deststoretype pkcs12
```
This will create a `debug.keystore` file in your current directory. You should move it to a memorable location such as `%USERPROFILE%\.android\`, because you will need its location in a later step. For more information on `keytool` usage, see `this Q&A article ( https://godotengine.org/qa/21349/jdk-android-file-missing )`. This will create a `debug.keystore` file in your current directory. You should move it to a memorable location such as `%USERPROFILE%\.android\`, because you will need its location in a later step. For more information on `keytool` usage, see `this Q&A article ( https://godotengine.org/qa/21349/jdk-android-file-missing )`.
@ -131,9 +133,9 @@ Exporting for Google Play Store
Uploading an APK to Google's Play Store requires you to sign using a non-debug 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: keystore file; such file can be generated like this:
.. code-block:: shell ```
keytool -v -genkey -keystore mygame.keystore -alias mygame -keyalg RSA -validity 10000 keytool -v -genkey -keystore mygame.keystore -alias mygame -keyalg RSA -validity 10000
```
This keystore and key are used to verify your developer identity, remember the password and keep it in a safe place! This keystore and key are used to verify your developer identity, remember the password and keep it in a safe place!
Use Google's Android Developer guides to learn more about `APK signing ( https://developer.android.com/studio/publish/app-signing )`. Use Google's Android Developer guides to learn more about `APK signing ( https://developer.android.com/studio/publish/app-signing )`.

View File

@ -80,9 +80,11 @@ same folder as the PCK file you've exported. The server binary should have the
same name as the PCK (excluding the extension). This lets Godot detect and use same name as the PCK (excluding the extension). This lets Godot detect and use
the PCK file automatically. If you want to start a server with a PCK that has a the PCK file automatically. If you want to start a server with a PCK that has a
different name, you can specify the path to the PCK file using the different name, you can specify the path to the PCK file using the
`--main-pack` command-line argument:: `--main-pack` command-line argument:
```
./godot-server --main-pack my_project.pck ./godot-server --main-pack my_project.pck
```
Starting the dedicated server Starting the dedicated server
----------------------------- -----------------------------
@ -90,23 +92,27 @@ Starting the dedicated server
If both your client and server are part of the same Godot project, you will have If both your client and server are part of the same Godot project, you will have
to add a way to start the server directly using a command-line argument. This to add a way to start the server directly using a command-line argument. This
can be done by adding the following code snippet in your main scene (or a can be done by adding the following code snippet in your main scene (or a
singleton)'s `ready()` method:: singleton)'s `ready()` method:
```
if "--server" in OS.get_cmdline_args(): if "--server" in OS.get_cmdline_args():
# Run your server startup code here... # Run your server startup code here...
# Using this check, you can start a dedicated server by running # Using this check, you can start a dedicated server by running
# a Godot binary (headless or not) with the `--server` command-line argument. # a Godot binary (headless or not) with the `--server` command-line argument.
pass pass
```
Alternatively, you can make the dedicated server always start up if a headless Alternatively, you can make the dedicated server always start up if a headless
or server binary is detected:: or server binary is detected:
```
# Note: Feature tags are case-sensitive! It's "Server", not "server". # Note: Feature tags are case-sensitive! It's "Server", not "server".
if OS.has_feature("Server"): if OS.has_feature("Server"):
# Run your server startup code here... # Run your server startup code here...
# Note that using this check may break unit testing scripts when # Note that using this check may break unit testing scripts when
# running them with headless or server binaries. # running them with headless or server binaries.
pass pass
```
If your client and server are separate Godot projects, your server should most If your client and server are separate Godot projects, your server should most
likely be configured in a way where running the main scene starts a server likely be configured in a way where running the main scene starts a server

View File

@ -48,24 +48,30 @@ Prompts, since it comes with these tools and they can be located in the path.
You can get more detailed instructions from `Microsoft's documentation You can get more detailed instructions from `Microsoft's documentation
( https://msdn.microsoft.com/en-us/library/windows/desktop/jj835832(v=vs.85).aspx )`. ( https://msdn.microsoft.com/en-us/library/windows/desktop/jj835832(v=vs.85).aspx )`.
First, run `MakeCert` to create a private key:: First, run `MakeCert` to create a private key:
```
MakeCert /n publisherName /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e expirationDate /sv MyKey.pvk MyKey.cer MakeCert /n publisherName /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e expirationDate /sv MyKey.pvk MyKey.cer
```
Where `publisherName` matches the Publisher Name of your package and Where `publisherName` matches the Publisher Name of your package and
`expirationDate` is in the `mm/dd/yyyy` format. `expirationDate` is in the `mm/dd/yyyy` format.
Next, create a Personal Information Exchange (.pfx) file using `Pvk2Pfx.exe`:: Next, create a Personal Information Exchange (.pfx) file using `Pvk2Pfx.exe`:
```
Pvk2Pfx /pvk MyKey.pvk /pi pvkPassword /spc MyKey.cer /pfx MyKey.pfx [/po pfxPassword] Pvk2Pfx /pvk MyKey.pvk /pi pvkPassword /spc MyKey.cer /pfx MyKey.pfx [/po pfxPassword]
```
If you don't specify a password with `/po` argument, the PFX will have the If you don't specify a password with `/po` argument, the PFX will have the
same password as the private key. same password as the private key.
You will also need to trust this certificate in order to be able to install your You will also need to trust this certificate in order to be able to install your
app. Open the Command Prompt as Administrator and run the following command:: app. Open the Command Prompt as Administrator and run the following command:
```
Certutil -addStore TrustedPeople MyKey.cer Certutil -addStore TrustedPeople MyKey.cer
```
Setting up automatic signing Setting up automatic signing
---------------------------- ----------------------------

View File

@ -288,10 +288,10 @@ same name. It takes a string as an argument and executes it as JavaScript code.
This allows interacting with the browser in ways not possible with script This allows interacting with the browser in ways not possible with script
languages integrated into Godot. languages integrated into Godot.
:: ```
func my_func(): func my_func():
JavaScript.eval("alert('Calling JavaScript per GDScript!');") JavaScript.eval("alert('Calling JavaScript per GDScript!');")
```
The value of the last JavaScript statement is converted to a GDScript value and The value of the last JavaScript statement is converted to a GDScript value and
returned by `eval()` under certain circumstances: returned by `eval()` under certain circumstances:
@ -302,11 +302,11 @@ returned by `eval()` under certain circumstances:
* JavaScript `ArrayBuffer`, `TypedArray` and `DataView` are returned as * JavaScript `ArrayBuffer`, `TypedArray` and `DataView` are returned as
GDScript `PoolByteArray` GDScript `PoolByteArray`
:: ```
func my_func2(): func my_func2():
var js_return = JavaScript.eval("var myNumber = 1; myNumber + 2;") var js_return = JavaScript.eval("var myNumber = 1; myNumber + 2;")
print(js_return) # prints '3.0' print(js_return) # prints '3.0'
```
Any other JavaScript value is returned as `null`. Any other JavaScript value is returned as `null`.
@ -314,8 +314,9 @@ HTML5 export templates may be `built ( doc_compiling_for_web )` without
support for the singleton to improve security. With such templates, and on support for the singleton to improve security. With such templates, and on
platforms other than HTML5, calling `JavaScript.eval` will also return platforms other than HTML5, calling `JavaScript.eval` will also return
`null`. The availability of the singleton can be checked with the `null`. The availability of the singleton can be checked with the
`JavaScript` `feature tag ( doc_feature_tags )`:: `JavaScript` `feature tag ( doc_feature_tags )`:
```
func my_func3(): func my_func3():
if OS.has_feature('JavaScript'): if OS.has_feature('JavaScript'):
JavaScript.eval(""" JavaScript.eval("""
@ -323,6 +324,7 @@ platforms other than HTML5, calling `JavaScript.eval` will also return
""") """)
else: else:
print("The JavaScript singleton is NOT available") print("The JavaScript singleton is NOT available")
```
Tip: Tip:
GDScript's multi-line strings, surrounded by 3 quotes `"""` as in GDScript's multi-line strings, surrounded by 3 quotes `"""` as in
@ -330,9 +332,11 @@ Tip:
The `eval` method also accepts a second, optional Boolean argument, which The `eval` method also accepts a second, optional Boolean argument, which
specifies whether to execute the code in the global execution context, specifies whether to execute the code in the global execution context,
defaulting to `false` to prevent polluting the global namespace:: defaulting to `false` to prevent polluting the global namespace:
```
func my_func4(): func my_func4():
# execute in global execution context, # execute in global execution context,
# thus adding a new JavaScript global variable `SomeGlobal` # thus adding a new JavaScript global variable `SomeGlobal`
JavaScript.eval("var SomeGlobal = {};", true) JavaScript.eval("var SomeGlobal = {};", true)
```

View File

@ -3,8 +3,6 @@
Exporting projects Exporting projects
================== ==================
.. highlight:: none
Why export? Why export?
----------- -----------
@ -142,9 +140,9 @@ with the `--export` and `--export-debug` command line parameters.
Exporting from the command line still requires an export preset to define Exporting from the command line still requires an export preset to define
the export parameters. A basic invocation of the command would be: the export parameters. A basic invocation of the command would be:
.. code-block:: shell ```
godot --export "Windows Desktop" some_name.exe godot --export "Windows Desktop" some_name.exe
```
This will export to `some_name.exe`, assuming there is a preset This will export to `some_name.exe`, assuming there is a preset
called "Windows Desktop" and the template can be found. (The export preset name called "Windows Desktop" and the template can be found. (The export preset name
@ -166,17 +164,17 @@ You can also configure it to export *only* the PCK or ZIP file, allowing
a single exported main pack file to be used with multiple Godot executables. a single exported main pack file to be used with multiple Godot executables.
When doing so, the export preset name must still be specified on the command line: When doing so, the export preset name must still be specified on the command line:
.. code-block:: shell ```
godot --export-pack "Windows Desktop" some_name.pck godot --export-pack "Windows Desktop" some_name.pck
```
It is often useful to combine the `--export` flag with the `--path` It is often useful to combine the `--export` flag with the `--path`
flag, so that you do not need to `cd` to the project folder before running flag, so that you do not need to `cd` to the project folder before running
the command: the command:
.. code-block:: shell ```
godot --path /path/to/project --export "Windows Desktop" some_name.exe godot --path /path/to/project --export "Windows Desktop" some_name.exe
```
See also: See also:
@ -211,14 +209,16 @@ Warning:
Due to a `known bug ( https://github.com/godotengine/godot/pull/42123 )`, Due to a `known bug ( https://github.com/godotengine/godot/pull/42123 )`,
when using a ZIP file as a pack file, the exported binary will not try to use when using a ZIP file as a pack file, the exported binary will not try to use
it automatically. Therefore, you have to create a *launcher script* that it automatically. Therefore, you have to create a *launcher script* that
the player can double-click or run from a terminal to launch the project:: the player can double-click or run from a terminal to launch the project:
:: launch.bat (Windows) ```
launch.bat (Windows)
@echo off @echo off
my_project.exe --main-pack my_project.zip my_project.exe --main-pack my_project.zip
# launch.sh (Linux) # launch.sh (Linux)
./my_project.x86_64 --main-pack my_project.zip ./my_project.x86_64 --main-pack my_project.zip
```
Save the launcher script and place it in the same folder as the exported binary. Save the launcher script and place it in the same folder as the exported binary.
On Linux, make sure to give executable permissions to the launcher script using On Linux, make sure to give executable permissions to the launcher script using

View File

@ -19,10 +19,9 @@ Each *feature* is represented as a string, which can refer to many of the follow
Features can be queried at run-time from the singleton API by calling: Features can be queried at run-time from the singleton API by calling:
:: ```
OS.has_feature(name) OS.has_feature(name)
```
Default features Default features
---------------- ----------------

View File

@ -63,32 +63,36 @@ want the player's name to be translated if it matches a translation key. To
disable automatic translation on a specific node, use disable automatic translation on a specific node, use
`Object.set_message_translation( Object_method_set_message_translation )` `Object.set_message_translation( Object_method_set_message_translation )`
and send a `Object.notification( Object_method_notification )` to update the and send a `Object.notification( Object_method_notification )` to update the
translation:: translation:
```
func _ready(): func _ready():
# This assumes you have a node called "Label" as a child of the node # This assumes you have a node called "Label" as a child of the node
# that has the script attached. # that has the script attached.
var label = get_node("Label") var label = get_node("Label")
label.set_message_translation(false) label.set_message_translation(false)
label.notification(NOTIFICATION_TRANSLATION_CHANGED) label.notification(NOTIFICATION_TRANSLATION_CHANGED)
```
For more complex UI nodes such as OptionButtons, you may have to use this instead:: For more complex UI nodes such as OptionButtons, you may have to use this instead:
```
func _ready(): func _ready():
var option_button = get_node("OptionButton") var option_button = get_node("OptionButton")
option_button.set_message_translation(false) option_button.set_message_translation(false)
option_button.notification(NOTIFICATION_TRANSLATION_CHANGED) option_button.notification(NOTIFICATION_TRANSLATION_CHANGED)
option_button.get_popup().set_message_translation(false) option_button.get_popup().set_message_translation(false)
option_button.get_popup().notification(NOTIFICATION_TRANSLATION_CHANGED) option_button.get_popup().notification(NOTIFICATION_TRANSLATION_CHANGED)
```
In code, the `Object.tr()` In code, the `Object.tr()`
function can be used. This will just look up the text in the function can be used. This will just look up the text in the
translations and convert it if found: translations and convert it if found:
:: ```
level.set_text(tr("LEVEL_5_NAME")) level.set_text(tr("LEVEL_5_NAME"))
status.set_text(tr("GAME_STATUS_" + str(status_index))) status.set_text(tr("GAME_STATUS_" + str(status_index)))
```
Making controls resizable Making controls resizable
-------------------------- --------------------------
@ -128,9 +132,9 @@ Translations can also be tested when running Godot from the command line.
For example, to test a game in French, the following argument can be For example, to test a game in French, the following argument can be
supplied: supplied:
.. code-block:: shell ```
godot --language fr godot --language fr
```
Translating the project name Translating the project name
---------------------------- ----------------------------

View File

@ -71,14 +71,14 @@ each locale will be defined in its own file.
Create a directory named `locale` in the project directory. In this directory, Create a directory named `locale` in the project directory. In this directory,
save a file named `messages.pot` with the following contents: save a file named `messages.pot` with the following contents:
:: ```
# Don't remove the two lines below, they're required for gettext to work correctly. # Don't remove the two lines below, they're required for gettext to work correctly.
msgid "" msgid ""
msgstr "" msgstr ""
msgid "Hello world!" msgid "Hello world!"
msgstr "" msgstr ""
```
Messages in gettext are made of `msgid` and `msgstr` pairs. Messages in gettext are made of `msgid` and `msgstr` pairs.
`msgid` is the source string (usually in English), `msgstr` will be `msgid` is the source string (usually in English), `msgstr` will be
@ -95,27 +95,27 @@ create and update the POT file from your scene files and scripts.
After installing `babel` and `babel-godot`, for example using pip: After installing `babel` and `babel-godot`, for example using pip:
.. code-block:: shell ```
pip3 install babel babel-godot pip3 install babel babel-godot
```
Write a mapping file (for example `babelrc`) which will indicate which files Write a mapping file (for example `babelrc`) which will indicate which files
pybabel needs to process (note that we process GDScript as Python, which is pybabel needs to process (note that we process GDScript as Python, which is
generally sufficient): generally sufficient):
.. code-block:: none ```
[python: **.gd] [python: **.gd]
encoding = utf-8 encoding = utf-8
[godot_scene: **.tscn] [godot_scene: **.tscn]
encoding = utf-8 encoding = utf-8
```
You can then run pybabel like so: You can then run pybabel like so:
.. code-block:: shell ```
pybabel extract -F babelrc -k text -k LineEdit/placeholder_text -k tr -o godot-l10n.pot . pybabel extract -F babelrc -k text -k LineEdit/placeholder_text -k tr -o godot-l10n.pot .
```
Use the `-k` option to specify what needs to be extracted. In this case, Use the `-k` option to specify what needs to be extracted. In this case,
arguments to `tr()` will be translated, as well arguments to `tr()` will be translated, as well
@ -129,9 +129,9 @@ The `msginit` command is used to turn a PO template into a messages file.
For instance, to create a French localization file, use the following command For instance, to create a French localization file, use the following command
while in the `locale` directory: while in the `locale` directory:
.. code-block:: shell ```
msginit --no-translator --input=messages.pot --locale=fr msginit --no-translator --input=messages.pot --locale=fr
```
The command above will create a file named `fr.po` in the same directory The command above will create a file named `fr.po` in the same directory
as the PO template. as the PO template.
@ -160,10 +160,10 @@ that they contain new strings, while removing strings that are no longer
present in the PO template. This can be done automatically using the present in the PO template. This can be done automatically using the
`msgmerge` tool: `msgmerge` tool:
.. code-block:: shell ```
# The order matters: specify the message file *then* the PO template! # The order matters: specify the message file *then* the PO template!
msgmerge --update --backup=none fr.po messages.pot msgmerge --update --backup=none fr.po messages.pot
```
If you want to keep a backup of the original message file (which would be If you want to keep a backup of the original message file (which would be
saved as `fr.po~` in this example), remove the `--backup=none` argument. saved as `fr.po~` in this example), remove the `--backup=none` argument.
@ -185,9 +185,9 @@ Checking the validity of a PO file or template
It is possible to check whether a gettext file's syntax is valid by running It is possible to check whether a gettext file's syntax is valid by running
the command below: the command below:
.. code-block:: shell ```
msgfmt fr.po --check msgfmt fr.po --check
```
If there are syntax errors or warnings, they will be displayed in the console. If there are syntax errors or warnings, they will be displayed in the console.
Otherwise, `msgfmt` won't output anything. Otherwise, `msgfmt` won't output anything.
@ -202,9 +202,9 @@ PO files.
You can generate a MO file with the command below: You can generate a MO file with the command below:
.. code-block:: shell ```
msgfmt fr.po --no-hash -o fr.mo msgfmt fr.po --no-hash -o fr.mo
```
If the PO file is valid, this command will create a `fr.mo` file besides If the PO file is valid, this command will create a `fr.mo` file besides
the PO file. This MO file can then be loaded in Godot as described below. the PO file. This MO file can then be loaded in Godot as described below.
@ -213,9 +213,9 @@ The original PO file should be kept in version control so you can update
your translation in the future. In case you lose the original PO file and your translation in the future. In case you lose the original PO file and
wish to decompile a MO file into a text-based PO file, you can do so with: wish to decompile a MO file into a text-based PO file, you can do so with:
.. code-block:: shell ```
msgunfmt fr.mo > fr.po msgunfmt fr.mo > fr.po
```
The decompiled file will not include comments or fuzzy strings, as these are The decompiled file will not include comments or fuzzy strings, as these are
never compiled in the MO file in the first place. never compiled in the MO file in the first place.

View File

@ -70,8 +70,7 @@ gdscript GDScript
As you press keys, move the mouse, and perform other inputs, you'll see each As you press keys, move the mouse, and perform other inputs, you'll see each
event scroll by in the output window. Here's an example of the output: event scroll by in the output window. Here's an example of the output:
:: ```
A A
InputEventMouseMotion : button_mask=0, position=(108, 108), relative=(26, 1), speed=(164.152496, 159.119843), pressure=(0), tilt=(0, 0) InputEventMouseMotion : button_mask=0, position=(108, 108), relative=(26, 1), speed=(164.152496, 159.119843), pressure=(0), tilt=(0, 0)
InputEventMouseButton : button_index=BUTTON_LEFT, pressed=true, position=(108, 107), button_mask=1, doubleclick=false InputEventMouseButton : button_index=BUTTON_LEFT, pressed=true, position=(108, 107), button_mask=1, doubleclick=false
@ -80,6 +79,7 @@ event scroll by in the output window. Here's an example of the output:
F F
Alt Alt
InputEventMouseMotion : button_mask=0, position=(108, 107), relative=(0, -1), speed=(164.152496, 159.119843), pressure=(0), tilt=(0, 0) InputEventMouseMotion : button_mask=0, position=(108, 107), relative=(0, -1), speed=(164.152496, 159.119843), pressure=(0), tilt=(0, 0)
```
As you can see, the results are very different for the different types of As you can see, the results are very different for the different types of
input. Key events are even printed as their key symbols. For example, let's input. Key events are even printed as their key symbols. For example, let's

View File

@ -33,17 +33,17 @@ functionality you want the built-in aspects of the shader to have.
For example, if you do not want to have lights affect an object, set the render For example, if you do not want to have lights affect an object, set the render
mode to `unshaded`: mode to `unshaded`:
.. code-block:: glsl ```
render_mode unshaded; render_mode unshaded;
```
You can also stack multiple render modes together. For example, if you want to You can also stack multiple render modes together. For example, if you want to
use toon shading instead of more-realistic PBR shading, set the diffuse mode and use toon shading instead of more-realistic PBR shading, set the diffuse mode and
specular mode to toon: specular mode to toon:
.. code-block:: glsl ```
render_mode diffuse_toon, specular_toon; render_mode diffuse_toon, specular_toon;
```
This model of built-in functionality allows you to write complex custom shaders This model of built-in functionality allows you to write complex custom shaders
by changing only a few parameters. by changing only a few parameters.
@ -60,11 +60,11 @@ First let's set the color of the water. We do that by setting `ALBEDO`.
Let's set it to a nice shade of blue. Let's set it to a nice shade of blue.
.. code-block:: glsl ```
void fragment() { void fragment() {
ALBEDO = vec3(0.1, 0.3, 0.5); ALBEDO = vec3(0.1, 0.3, 0.5);
} }
```
![](img/albedo.png) ![](img/albedo.png)
@ -97,13 +97,13 @@ Water is not a metal, so we will set its `METALLIC` property to `0.0`. Water
is also highly reflective, so we will set its `ROUGHNESS` property to be quite is also highly reflective, so we will set its `ROUGHNESS` property to be quite
low as well. low as well.
.. code-block:: glsl ```
void fragment() { void fragment() {
METALLIC = 0.0; METALLIC = 0.0;
ROUGHNESS = 0.01; ROUGHNESS = 0.01;
ALBEDO = vec3(0.1, 0.3, 0.5); ALBEDO = vec3(0.1, 0.3, 0.5);
} }
```
![](img/plastic.png) ![](img/plastic.png)
@ -120,9 +120,9 @@ In order to increase the specular reflections, we will do two things. First, we
will change the render mode for specular to toon because the toon render mode will change the render mode for specular to toon because the toon render mode
has larger specular highlights. has larger specular highlights.
.. code-block:: glsl ```
render_mode specular_toon; render_mode specular_toon;
```
![](img/specular-toon.png) ![](img/specular-toon.png)
@ -131,14 +131,14 @@ glancing angles. Usually it is used to emulate the way light passes through
fabric on the edges of an object, but we will use it here to help achieve a nice fabric on the edges of an object, but we will use it here to help achieve a nice
watery effect. watery effect.
.. code-block:: glsl ```
void fragment() { void fragment() {
RIM = 0.2; RIM = 0.2;
METALLIC = 0.0; METALLIC = 0.0;
ROUGHNESS = 0.01; ROUGHNESS = 0.01;
ALBEDO = vec3(0.1, 0.3, 0.5); ALBEDO = vec3(0.1, 0.3, 0.5);
} }
```
![](img/rim.png) ![](img/rim.png)
@ -150,9 +150,9 @@ mesh's surface, while the `VIEW` vector is the direction between your eye and
that point on the surface. The dot product between them is a handy way to tell that point on the surface. The dot product between them is a handy way to tell
when you are looking at the surface head-on or at a glancing angle. when you are looking at the surface head-on or at a glancing angle.
.. code-block:: glsl ```
float fresnel = sqrt(1.0 - dot(NORMAL, VIEW)); float fresnel = sqrt(1.0 - dot(NORMAL, VIEW));
```
And mix it into both `ROUGHNESS` and `ALBEDO`. This is the benefit of And mix it into both `ROUGHNESS` and `ALBEDO`. This is the benefit of
ShaderMaterials over SpatialMaterials. With SpatialMaterial, we could set ShaderMaterials over SpatialMaterials. With SpatialMaterial, we could set
@ -160,8 +160,7 @@ these properties with a texture, or to a flat number. But with shaders we can
set them based on any mathematical function that we can dream up. set them based on any mathematical function that we can dream up.
.. code-block:: glsl ```
void fragment() { void fragment() {
float fresnel = sqrt(1.0 - dot(NORMAL, VIEW)); float fresnel = sqrt(1.0 - dot(NORMAL, VIEW));
RIM = 0.2; RIM = 0.2;
@ -169,6 +168,7 @@ set them based on any mathematical function that we can dream up.
ROUGHNESS = 0.01 * (1.0 - fresnel); ROUGHNESS = 0.01 * (1.0 - fresnel);
ALBEDO = vec3(0.1, 0.3, 0.5) + (0.1 * fresnel); ALBEDO = vec3(0.1, 0.3, 0.5) + (0.1 * fresnel);
} }
```
![](img/fresnel.png) ![](img/fresnel.png)
@ -193,35 +193,35 @@ In the last tutorial we calculated height by reading from a heightmap. For this
tutorial, we will do the same. Put the heightmap code in a function called tutorial, we will do the same. Put the heightmap code in a function called
`height()`. `height()`.
.. code-block:: glsl ```
float height(vec2 position) { float height(vec2 position) {
return texture(noise, position / 10.0).x; // Scaling factor is based on mesh size (this PlaneMesh is 10×10). return texture(noise, position / 10.0).x; // Scaling factor is based on mesh size (this PlaneMesh is 10×10).
} }
```
In order to use `TIME` in the `height()` function, we need to pass it in. In order to use `TIME` in the `height()` function, we need to pass it in.
.. code-block:: glsl ```
float height(vec2 position, float time) { float height(vec2 position, float time) {
} }
```
And make sure to correctly pass it in inside the vertex function. And make sure to correctly pass it in inside the vertex function.
.. code-block:: glsl ```
void vertex() { void vertex() {
vec2 pos = VERTEX.xz; vec2 pos = VERTEX.xz;
float k = height(pos, TIME); float k = height(pos, TIME);
VERTEX.y = k; VERTEX.y = k;
} }
```
Instead of using a normalmap to calculate normals. We are going to compute them Instead of using a normalmap to calculate normals. We are going to compute them
manually in the `vertex()` function. To do so use the following line of code. manually in the `vertex()` function. To do so use the following line of code.
.. code-block:: glsl ```
NORMAL = normalize(vec3(k - height(pos + vec2(0.1, 0.0), TIME), 0.1, k - height(pos + vec2(0.0, 0.1), TIME))); NORMAL = normalize(vec3(k - height(pos + vec2(0.1, 0.0), TIME), 0.1, k - height(pos + vec2(0.0, 0.1), TIME)));
```
We need to compute `NORMAL` manually because in the next section we will be We need to compute `NORMAL` manually because in the next section we will be
using math to create complex-looking waves. using math to create complex-looking waves.
@ -229,12 +229,12 @@ using math to create complex-looking waves.
Now, we are going to make the `height()` function a little more complicated by Now, we are going to make the `height()` function a little more complicated by
offsetting `position` by the cosine of `TIME`. offsetting `position` by the cosine of `TIME`.
.. code-block:: glsl ```
float height(vec2 position, float time) { float height(vec2 position, float time) {
vec2 offset = 0.01 * cos(position + time); vec2 offset = 0.01 * cos(position + time);
return texture(noise, (position / 10.0) - offset).x; return texture(noise, (position / 10.0) - offset).x;
} }
```
This results in waves that move slowly, but not in a very natural way. The next This results in waves that move slowly, but not in a very natural way. The next
section will dig deeper into using shaders to create more complex effects, in section will dig deeper into using shaders to create more complex effects, in
@ -254,35 +254,35 @@ modifying the `height()` function and by introducing a new function called
We are going to call `wave()` multiple times in `height()` in order to fake We are going to call `wave()` multiple times in `height()` in order to fake
the way waves look. the way waves look.
.. code-block:: glsl ```
float wave(vec2 position){ float wave(vec2 position){
position += texture(noise, position / 10.0).x * 2.0 - 1.0; position += texture(noise, position / 10.0).x * 2.0 - 1.0;
vec2 wv = 1.0 - abs(sin(position)); vec2 wv = 1.0 - abs(sin(position));
return pow(1.0 - pow(wv.x * wv.y, 0.65), 4.0); return pow(1.0 - pow(wv.x * wv.y, 0.65), 4.0);
} }
```
At first this looks complicated. So let's go through it line-by-line. At first this looks complicated. So let's go through it line-by-line.
.. code-block:: glsl ```
position += texture(noise, position / 10.0).x * 2.0 - 1.0; position += texture(noise, position / 10.0).x * 2.0 - 1.0;
```
Offset the position by the `noise` texture. This will make the waves curve, so Offset the position by the `noise` texture. This will make the waves curve, so
they won't be straight lines completely aligned with the grid. they won't be straight lines completely aligned with the grid.
.. code-block:: glsl ```
vec2 wv = 1.0 - abs(sin(position)); vec2 wv = 1.0 - abs(sin(position));
```
Define a wave-like function using `sin()` and `position`. Normally `sin()` Define a wave-like function using `sin()` and `position`. Normally `sin()`
waves are very round. We use `abs()` to absolute to give them a sharp ridge waves are very round. We use `abs()` to absolute to give them a sharp ridge
and constrain them to the 0-1 range. And then we subtract it from `1.0` to put and constrain them to the 0-1 range. And then we subtract it from `1.0` to put
the peak on top. the peak on top.
.. code-block:: glsl ```
return pow(1.0 - pow(wv.x * wv.y, 0.65), 4.0); return pow(1.0 - pow(wv.x * wv.y, 0.65), 4.0);
```
Multiply the x-directional wave by the y-directional wave and raise it to a Multiply the x-directional wave by the y-directional wave and raise it to a
power to sharpen the peaks. Then subtract that from `1.0` so that the ridges power to sharpen the peaks. Then subtract that from `1.0` so that the ridges
@ -290,12 +290,12 @@ become peaks and raise that to a power to sharpen the ridges.
We can now replace the contents of our `height()` function with `wave()`. We can now replace the contents of our `height()` function with `wave()`.
.. code-block:: glsl ```
float height(vec2 position, float time) { float height(vec2 position, float time) {
float h = wave(position); float h = wave(position);
return h; return h;
} }
```
Using this, you get: Using this, you get:
@ -304,12 +304,12 @@ Using this, you get:
The shape of the sin wave is too obvious. So let's spread the waves out a bit. The shape of the sin wave is too obvious. So let's spread the waves out a bit.
We do this by scaling `position`. We do this by scaling `position`.
.. code-block:: glsl ```
float height(vec2 position, float time) { float height(vec2 position, float time) {
float h = wave(position * 0.4); float h = wave(position * 0.4);
return h; return h;
} }
```
Now it looks much better. Now it looks much better.
@ -324,8 +324,7 @@ going to multiply the output of the wave to make them shorter or taller
Here is an example for how you could layer the four waves to achieve nicer Here is an example for how you could layer the four waves to achieve nicer
looking waves. looking waves.
.. code-block:: glsl ```
float height(vec2 position, float time) { float height(vec2 position, float time) {
float d = wave((position + time) * 0.4) * 0.3; float d = wave((position + time) * 0.4) * 0.3;
d += wave((position - time) * 0.3) * 0.3; d += wave((position - time) * 0.3) * 0.3;
@ -333,6 +332,7 @@ looking waves.
d += wave((position - time) * 0.6) * 0.2; d += wave((position - time) * 0.6) * 0.2;
return d; return d;
} }
```
Note that we add time to two and subtract it from the other two. This makes the Note that we add time to two and subtract it from the other two. This makes the
waves move in different directions creating a complex effect. Also note that the waves move in different directions creating a complex effect. Also note that the

View File

@ -137,14 +137,16 @@ To handle clicked `[url]` tags, connect the RichTextLabel node's
`meta_clicked` signal to a script function. `meta_clicked` signal to a script function.
For example, the following method can be connected to `meta_clicked` to open For example, the following method can be connected to `meta_clicked` to open
clicked URLs using the user's default web browser:: clicked URLs using the user's default web browser:
```
# This assumes RichTextLabel's `meta_clicked` signal was connected to # This assumes RichTextLabel's `meta_clicked` signal was connected to
# the function below using the signal connection dialog. # the function below using the signal connection dialog.
func _richtextlabel_on_meta_clicked(meta): func _richtextlabel_on_meta_clicked(meta):
# `meta` is not guaranteed to be a String, so convert it to a String # `meta` is not guaranteed to be a String, so convert it to a String
# to avoid script errors at run-time. # to avoid script errors at run-time.
OS.shell_open(str(meta)) OS.shell_open(str(meta))
```
For more advanced use cases, it's also possible to store JSON in an `[url]` For more advanced use cases, it's also possible to store JSON in an `[url]`
tag's option and parse it in the function that handles the `meta_clicked` signal. tag's option and parse it in the function that handles the `meta_clicked` signal.
@ -270,8 +272,7 @@ Here are some examples of custom effects:
Ghost Ghost
~~~~~ ~~~~~
:: ```
tool tool
extends RichTextEffect extends RichTextEffect
class_name RichTextGhost class_name RichTextGhost
@ -289,12 +290,12 @@ Ghost
var alpha = sin(char_fx.elapsed_time * speed + (char_fx.absolute_index / span)) * 0.5 + 0.5 var alpha = sin(char_fx.elapsed_time * speed + (char_fx.absolute_index / span)) * 0.5 + 0.5
char_fx.color.a = alpha char_fx.color.a = alpha
return true return true
```
Pulse Pulse
~~~~~ ~~~~~
:: ```
tool tool
extends RichTextEffect extends RichTextEffect
class_name RichTextPulse class_name RichTextPulse
@ -316,12 +317,12 @@ Pulse
char_fx.color = char_fx.color.linear_interpolate(color, sined_time) char_fx.color = char_fx.color.linear_interpolate(color, sined_time)
char_fx.offset = Vector2(0, -1) * y_off char_fx.offset = Vector2(0, -1) * y_off
return true return true
```
Matrix Matrix
~~~~~~ ~~~~~~
:: ```
tool tool
extends RichTextEffect extends RichTextEffect
class_name RichTextMatrix class_name RichTextMatrix
@ -352,10 +353,11 @@ Matrix
value += 65 value += 65
char_fx.character = value char_fx.character = value
return true return true
```
This will add a few new BBCode commands, which can be used like so: This will add a few new BBCode commands, which can be used like so:
:: ```
[center][ghost]This is a custom [matrix]effect[/matrix][/ghost] made in [center][ghost]This is a custom [matrix]effect[/matrix][/ghost] made in
[pulse freq=5.0 height=2.0][pulse color=#00FFAA freq=2.0]GDScript[/pulse][/pulse].[/center] [pulse freq=5.0 height=2.0][pulse color=#00FFAA freq=2.0]GDScript[/pulse][/pulse].[/center]
```

View File

@ -45,8 +45,7 @@ To center a control in its parent, set its anchors to 0.5 and each margin
to half of its relevant dimension. For example, the code below shows how to half of its relevant dimension. For example, the code below shows how
a TextureRect can be centered in its parent: a TextureRect can be centered in its parent:
:: ```
var rect = TextureRect.new() var rect = TextureRect.new()
rect.texture = load("res://icon.png)") rect.texture = load("res://icon.png)")
rect.anchor_left = 0.5 rect.anchor_left = 0.5
@ -59,6 +58,7 @@ a TextureRect can be centered in its parent:
rect.margin_top = -texture_size.y / 2 rect.margin_top = -texture_size.y / 2
rect.margin_bottom = -texture_size.y / 2 rect.margin_bottom = -texture_size.y / 2
add_child(rect) add_child(rect)
```
Setting each anchor to 0.5 moves the reference point for the margins to Setting each anchor to 0.5 moves the reference point for the margins to
the center of its parent. From there, we set negative margins so that the center of its parent. From there, we set negative margins so that