Import first batch of pages

This commit is contained in:
Rémi Verschelde
2015-12-12 17:57:44 +01:00
parent 33fe0bbde6
commit 86563cc374
43 changed files with 3995 additions and 232 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
_build/

View File

@@ -19,7 +19,7 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@@ -30,6 +30,7 @@ help:
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@@ -45,6 +46,7 @@ help:
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
@@ -89,6 +91,14 @@ qthelp:
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/GodotEngine.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@@ -166,6 +176,11 @@ doctest:
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo

3
README.md Normal file
View File

@@ -0,0 +1,3 @@
# Godot Engine documentation
This repository contains the source files of Godot Engine's documentation.

View File

@@ -0,0 +1,171 @@
Batch building templates
========================
The following is almost the same exact script we use to build all the
export templates that go to the site. If you want to build or roll them
yourself, this might be of use.
(note: mac stuff is missing)
::
#This script is intended to run on Linux or OSX. Cygwin might work.
# if this flag is set, build is tagged as release in the version
# echo $IS_RELEASE_BUILD
#Need to set path to EMScripten
export EMSCRIPTEN_ROOT=/home/to/emscripten
#Build templates
#remove this stuff, will be created anew
rm -rf templates
mkdir -p templates
# Windows 32 Release and Debug
scons -j 4 p=windows target=release tools=no bits=32
cp bin/godot.windows.opt.32.exe templates/windows_32_release.exe
upx templates/windows_32_release.exe
scons -j 4 p=windows target=release_debug tools=no bits=32
cp bin/godot.windows.opt.debug.32.exe templates/windows_32_debug.exe
upx templates/windows_32_debug.exe
# Windows 64 Release and Debug (UPX does not support it yet)
scons -j 4 p=windows target=release tools=no bits=64
cp bin/godot.windows.opt.64.exe templates/windows_64_release.exe
x86_64-w64-mingw32-strip templates/windows_64_release.exe
scons -j 4 p=windows target=release_debug tools=no bits=64
cp bin/godot.windows.opt.debug.64.exe templates/windows_64_debug.exe
x86_64-w64-mingw32-strip templates/windows_64_debug.exe
# Linux 64 Release and Debug
scons -j 4 p=x11 target=release tools=no bits=64
cp bin/godot.x11.opt.64 templates/linux_x11_64_release
upx templates/linux_x11_64_release
scons -j 4 p=x11 target=release_debug tools=no bits=64
cp bin/godot.x11.opt.debug.64 templates/linux_x11_64_debug
upx templates/linux_x11_64_debug
# Linux 32 Release and Debug
scons -j 4 p=x11 target=release tools=no bits=32
cp bin/godot.x11.opt.32 templates/linux_x11_32_release
upx templates/linux_x11_32_release
scons -j 4 p=x11 target=release_debug tools=no bits=32
cp bin/godot.x11.opt.debug.32 templates/linux_x11_32_debug
upx templates/linux_x11_32_debug
# Server for 32 and 64 bits (always in debug)
scons -j 4 p=server target=release_debug tools=no bits=64
cp bin/godot_server.server.opt.debug.64 templates/linux_server_64
upx templates/linux_server_64
scons -j 4 p=server target=release_debug tools=no bits=32
cp bin/godot_server.server.opt.debug.32 templates/linux_server_32
upx templates/linux_server_32
# Android
**IMPORTANT REPLACE THIS BY ACTUAL VALUES**
export ANDROID_HOME=/home/to/android-sdk
export ANDROID_NDK_ROOT=/home/to/android-ndk
# git does not allow empty dirs, so create those
mkdir -p platform/android/java/libs/armeabi
mkdir -p platform/android/java/libs/x86
#Android Release
scons -j 4 p=android target=release
cp bin/libgodot.android.opt.so platform/android/java/libs/armeabi/libgodot_android.so
ant -s platform/android/java/build.xml release
cp platform/android/java/bin/Godot-release-unsigned.apk templates/android_release.apk
#Android Debug
scons -j 4 p=android target=release_debug
cp bin/libgodot.android.opt.debug.so platform/android/java/libs/armeabi/libgodot_android.so
ant -s platform/android/java/build.xml release
cp platform/android/java/bin/Godot-release-unsigned.apk templates/android_debug.apk
# EMScripten
scons -j 4 p=javascript target=release
cp bin/godot.javascript.opt.html godot.html
cp bin/godot.javascript.opt.js godot.js
cp tools/html_fs/filesystem.js .
zip javascript_release.zip godot.html godot.js filesystem.js
mv javascript_release.zip templates/
scons -j 4 p=javascript target=release_debug
cp bin/godot.javascript.opt.debug.html godot.html
cp bin/godot.javascript.opt.debug.js godot.js
cp tools/html_fs/filesystem.js .
zip javascript_debug.zip godot.html godot.js filesystem.js
mv javascript_debug.zip templates/
# BlackBerry 10 (currently disabled)
#. /path/to/bbndk/bbndk-env.sh
#scons -j 4 platform/bb10/godot_bb10_opt.qnx.armle target=release
#cp platform/bb10/godot_bb10_opt.qnx.armle platform/bb10/bar
#scons -j 4 platform/bb10/godot_bb10.qnx.armle target=release_debug
#cp platform/bb10/godot_bb10.qnx.armle platform/bb10/bar
#cd platform/bb10/bar
#zip -r bb10.zip *
#mv bb10.zip ../../../templates
#cd ../../..
# BUILD ON MAC
[...]
# Build release executables with editor
mkdir -p release
scons -j 4 p=server target=release_debug bits=64
cp bin/godot_server.server.opt.tools.64 release/linux_server.64
upx release/linux_server.64
scons -j 4 p=x11 target=release_debug tools=yes bits=64
cp bin/godot.x11.opt.tools.64 release/godot_x11.64
# upx release/godot_x11.64 -- fails on some linux distros
scons -j 4 p=x11 target=release_debug tools=yes bits=32
cp bin/godot.x11.opt.tools.32 release/godot_x11.32
scons -j 4 p=windows target=release_debug tools=yes bits=64
cp bin/godot.windows.opt.tools.64.exe release/godot_win64.exe
x86_64-w64-mingw32-strip release/godot_win64.exe
#upx release/godot_win64.exe
scons -j 4 p=windows target=release_debug tools=yes bits=32
cp bin/godot.windows.opt.tools.32.exe release/godot_win32.exe
x86_64-w64-mingw32-strip release/godot_win32.exe
#upx release/godot_win64.exe
[..] # mac stuff
# Update classes.xml (used to generate doc)
cp doc/base/classes.xml .
release/linux_server.64 -doctool classes.xml
cd demos
rm -f godot_demos.zip
zip -r godot_demos *
cd ..
cd tools/export/blender25
zip -r bettercollada *
mv bettercollada.zip ../../..
cd ../../..

View File

@@ -0,0 +1,491 @@
Binary serialization API
========================
Introduction
------------
Godot has a simple serialization API based on Variant. It's used for
converting data types to an array of bytes efficiently. This API is used
in the functions ``get_var`` and ``store_var`` of the [[API:File\|File
class]] as well as the packet APIs for [[API:PacketPeer]]. This format
is not used for binary scenes and resources.
Packet specification
--------------------
| The packet is designed to be always padded to 4 bytes. All values are
little endian encoded.
| All packets have a 4 byte header representing an integer, specifying
the type of data:
+--------+--------------------------+
| Type | Value |
+========+==========================+
| 0 | null |
+--------+--------------------------+
| 1 | bool |
+--------+--------------------------+
| 2 | integer |
+--------+--------------------------+
| 3 | float |
+--------+--------------------------+
| 4 | string |
+--------+--------------------------+
| 5 | vector2 |
+--------+--------------------------+
| 6 | rect2 |
+--------+--------------------------+
| 7 | vector3 |
+--------+--------------------------+
| 8 | matrix32 |
+--------+--------------------------+
| 9 | plane |
+--------+--------------------------+
| 10 | quaternion |
+--------+--------------------------+
| 11 | aabb (rect3) |
+--------+--------------------------+
| 12 | matrix3x3 |
+--------+--------------------------+
| 13 | transform (matrix 4x3) |
+--------+--------------------------+
| 14 | color |
+--------+--------------------------+
| 15 | image |
+--------+--------------------------+
| 16 | node path |
+--------+--------------------------+
| 17 | rid (unsupported) |
+--------+--------------------------+
| 18 | object (unsupported) |
+--------+--------------------------+
| 19 | input event |
+--------+--------------------------+
| 20 | dictionary |
+--------+--------------------------+
| 21 | array |
+--------+--------------------------+
| 22 | byte array |
+--------+--------------------------+
| 23 | int array |
+--------+--------------------------+
| 24 | float array |
+--------+--------------------------+
| 25 | string array |
+--------+--------------------------+
| 26 | vector2 array |
+--------+--------------------------+
| 27 | vector3 array |
+--------+--------------------------+
| 28 | color array |
+--------+--------------------------+
Following this is the actual packet contents, which varies for each type
of packet:
0: null
~~~~~~~
1: bool
~~~~~~~
+----------+-------+-----------+---------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+===========================+
| 4 | 4 | Integer | 0 for False, 1 for True |
+----------+-------+-----------+---------------------------+
2: integer
~~~~~~~~~~
+----------+-------+-----------+--------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+==========================+
| 4 | 4 | Integer | Signed, 32-Bit Integer |
+----------+-------+-----------+--------------------------+
3: float
~~~~~~~~
+----------+-------+---------+-------------------------+
| Offset | Len | Type | Description |
+==========+=======+=========+=========================+
| 4 | 4 | Float | IEE 754 32-Bits Float |
+----------+-------+---------+-------------------------+
4: string
~~~~~~~~~
+----------+-------+-----------+----------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+============================+
| 4 | 4 | Integer | String Length (in Bytes) |
+----------+-------+-----------+----------------------------+
| 8 | X | Bytes | UTF-8 Encoded String |
+----------+-------+-----------+----------------------------+
This field is padded to 4 bytes.
5: vector2
~~~~~~~~~~
+----------+-------+---------+----------------+
| Offset | Len | Type | Description |
+==========+=======+=========+================+
| 4 | 4 | Float | X Coordinate |
+----------+-------+---------+----------------+
| 8 | 4 | Float | Y Coordinate |
+----------+-------+---------+----------------+
6: rect2
~~~~~~~~
+----------+-------+---------+----------------+
| Offset | Len | Type | Description |
+==========+=======+=========+================+
| 4 | 4 | Float | X Coordinate |
+----------+-------+---------+----------------+
| 8 | 4 | Float | Y Coordinate |
+----------+-------+---------+----------------+
| 12 | 4 | Float | X Size |
+----------+-------+---------+----------------+
| 16 | 4 | Float | Y Size |
+----------+-------+---------+----------------+
7: vector3
~~~~~~~~~~
+----------+-------+---------+----------------+
| Offset | Len | Type | Description |
+==========+=======+=========+================+
| 4 | 4 | Float | X Coordinate |
+----------+-------+---------+----------------+
| 8 | 4 | Float | Y Coordinate |
+----------+-------+---------+----------------+
| 12 | 4 | Float | Z Coordinate |
+----------+-------+---------+----------------+
8: matrix32
~~~~~~~~~~~
+----------+-------+---------+---------------+
| Offset | Len | Type | Description |
+==========+=======+=========+===============+
| 4 | 4 | Float | [0][0] |
+----------+-------+---------+---------------+
| 8 | 4 | Float | [0][1] |
+----------+-------+---------+---------------+
| 12 | 4 | Float | [1][0] |
+----------+-------+---------+---------------+
| 16 | 4 | Float | [1][1] |
+----------+-------+---------+---------------+
| 20 | 4 | Float | [2][0] |
+----------+-------+---------+---------------+
| 24 | 4 | Float | [2][1] |
+----------+-------+---------+---------------+
9: plane
~~~~~~~~
+----------+-------+---------+---------------+
| Offset | Len | Type | Description |
+==========+=======+=========+===============+
| 4 | 4 | Float | Normal X |
+----------+-------+---------+---------------+
| 8 | 4 | Float | Normal Y |
+----------+-------+---------+---------------+
| 12 | 4 | Float | Normal Z |
+----------+-------+---------+---------------+
| 16 | 4 | Float | Distance |
+----------+-------+---------+---------------+
10: quaternion
~~~~~~~~~~~~~~
+----------+-------+---------+---------------+
| Offset | Len | Type | Description |
+==========+=======+=========+===============+
| 4 | 4 | Float | Imaginary X |
+----------+-------+---------+---------------+
| 8 | 4 | Float | Imaginary Y |
+----------+-------+---------+---------------+
| 12 | 4 | Float | Imaginary Z |
+----------+-------+---------+---------------+
| 16 | 4 | Float | Real W |
+----------+-------+---------+---------------+
11: aabb (rect3)
~~~~~~~~~~~~~~~~
+----------+-------+---------+----------------+
| Offset | Len | Type | Description |
+==========+=======+=========+================+
| 4 | 4 | Float | X Coordinate |
+----------+-------+---------+----------------+
| 8 | 4 | Float | Y Coordinate |
+----------+-------+---------+----------------+
| 12 | 4 | Float | Z Coordinate |
+----------+-------+---------+----------------+
| 16 | 4 | Float | X Size |
+----------+-------+---------+----------------+
| 20 | 4 | Float | Y Size |
+----------+-------+---------+----------------+
| 24 | 4 | Float | Z Size |
+----------+-------+---------+----------------+
12: matrix3x3
~~~~~~~~~~~~~
+----------+-------+---------+---------------+
| Offset | Len | Type | Description |
+==========+=======+=========+===============+
| 4 | 4 | Float | [0][0] |
+----------+-------+---------+---------------+
| 8 | 4 | Float | [0][1] |
+----------+-------+---------+---------------+
| 12 | 4 | Float | [0][2] |
+----------+-------+---------+---------------+
| 16 | 4 | Float | [1][0] |
+----------+-------+---------+---------------+
| 20 | 4 | Float | [1][1] |
+----------+-------+---------+---------------+
| 24 | 4 | Float | [1][2] |
+----------+-------+---------+---------------+
| 28 | 4 | Float | [2][0] |
+----------+-------+---------+---------------+
| 32 | 4 | Float | [2][1] |
+----------+-------+---------+---------------+
| 36 | 4 | Float | [2][2] |
+----------+-------+---------+---------------+
13: transform (matrix 4x3)
~~~~~~~~~~~~~~~~~~~~~~~~~~
+----------+-------+---------+---------------+
| Offset | Len | Type | Description |
+==========+=======+=========+===============+
| 4 | 4 | Float | [0][0] |
+----------+-------+---------+---------------+
| 8 | 4 | Float | [0][1] |
+----------+-------+---------+---------------+
| 12 | 4 | Float | [0][2] |
+----------+-------+---------+---------------+
| 16 | 4 | Float | [1][0] |
+----------+-------+---------+---------------+
| 20 | 4 | Float | [1][1] |
+----------+-------+---------+---------------+
| 24 | 4 | Float | [1][2] |
+----------+-------+---------+---------------+
| 28 | 4 | Float | [2][0] |
+----------+-------+---------+---------------+
| 32 | 4 | Float | [2][1] |
+----------+-------+---------+---------------+
| 36 | 4 | Float | [2][2] |
+----------+-------+---------+---------------+
| 40 | 4 | Float | [3][0] |
+----------+-------+---------+---------------+
| 44 | 4 | Float | [3][1] |
+----------+-------+---------+---------------+
| 48 | 4 | Float | [3][2] |
+----------+-------+---------+---------------+
14: color
~~~~~~~~~
+----------+-------+---------+----------------+
| Offset | Len | Type | Description |
+==========+=======+=========+================+
| 4 | 4 | Float | Red (0..1) |
+----------+-------+---------+----------------+
| 8 | 4 | Float | Green (0..1) |
+----------+-------+---------+----------------+
| 12 | 4 | Float | Blue (0..1) |
+----------+-------+---------+----------------+
| 16 | 4 | Float | Alpha (0..1) |
+----------+-------+---------+----------------+
15: image
~~~~~~~~~
+---------------------+-------+-----------+------------------------------------------------------+
| Offset | Len | Type | Description |
+=====================+=======+===========+======================================================+
| 4 | 4 | Integer | Format (see FORMAT\_\* in \\"Image\\":class\_image |
+---------------------+-------+-----------+------------------------------------------------------+
| 8 | 4 | Integer | Mip-Maps (0 means no mip-maps). |
+---------------------+-------+-----------+------------------------------------------------------+
| 12 | 4 | Integer | Width (Pixels) |
+---------------------+-------+-----------+------------------------------------------------------+
| 16 | 4 | Integer | Height (Pixels) |
+---------------------+-------+-----------+------------------------------------------------------+
| 20 | 4 | Integer | Data Length |
+---------------------+-------+-----------+------------------------------------------------------+
| 24..24+DataLength | 1 | Byte | Image Data |
+---------------------+-------+-----------+------------------------------------------------------+
This field is padded to 4 bytes.
16: node path
~~~~~~~~~~~~~
+----------+-------+-----------+-----------------------------------------------------------------------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+=========================================================================================+
| 4 | 4 | Integer | String Length, or New Format (val&amp;0x80000000!=0 and NameCount=val&amp;0x7FFFFFFF) |
+----------+-------+-----------+-----------------------------------------------------------------------------------------+
For old format:
^^^^^^^^^^^^^^^
+----------+-------+---------+------------------------+
| Offset | Len | Type | Description |
+==========+=======+=========+========================+
| 8 | X | Bytes | UTF-8 Encoded String |
+----------+-------+---------+------------------------+
Padded to 4 bytes.
For new format:
^^^^^^^^^^^^^^^
+----------+-------+-----------+-------------------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+=====================================+
| 4 | 4 | Integer | Sub-Name Count |
+----------+-------+-----------+-------------------------------------+
| 8 | 4 | Integer | Flags (absolute: val&amp;1 != 0 ) |
+----------+-------+-----------+-------------------------------------+
For each Name and Sub-Name
+----------+-------+-----------+------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+========================+
| X+0 | 4 | Integer | String Length |
+----------+-------+-----------+------------------------+
| X+4 | X | Bytes | UTF-8 Encoded String |
+----------+-------+-----------+------------------------+
Every name string is is padded to 4 bytes.
17: rid (unsupported)
~~~~~~~~~~~~~~~~~~~~~
18: object (unsupported)
~~~~~~~~~~~~~~~~~~~~~~~~
19: input event
~~~~~~~~~~~~~~~
20: dictionary
~~~~~~~~~~~~~~
+----------+-------+-----------+---------------------------------------------------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+=====================================================================+
| 4 | 4 | Integer | val&amp;0x7FFFFFFF = elements, val&amp;0x80000000 = shared (bool) |
+----------+-------+-----------+---------------------------------------------------------------------+
| Then what follows is, for amount of \\"elements\\", pairs of key and
value, one after the other, using
| this same format.
21: array
~~~~~~~~~
+----------+-------+-----------+---------------------------------------------------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+=====================================================================+
| 4 | 4 | Integer | val&amp;0x7FFFFFFF = elements, val&amp;0x80000000 = shared (bool) |
+----------+-------+-----------+---------------------------------------------------------------------+
| Then what follows is, for amount of \\"elements\\", values one after
the other, using
| this same format.
22: byte array
~~~~~~~~~~~~~~
+---------------+-------+-----------+------------------------+
| Offset | Len | Type | Description |
+===============+=======+===========+========================+
| 4 | 4 | Integer | Array Length (Bytes) |
+---------------+-------+-----------+------------------------+
| 8..8+length | 1 | Byte | Byte (0..255) |
+---------------+-------+-----------+------------------------+
The array data is padded to 4 bytes.
23: int array
~~~~~~~~~~~~~
| Offset \| Len \| Type \| Description
| -- \| -- \| -- \| --
| 4\|4\|Integer\| Array Length (Integers)
| 8..8+length\*4\|4\|Integer\| 32 Bits Signed Integer
24: float array
~~~~~~~~~~~~~~~
| Offset \| Len \| Type \| Description
| -- \| -- \| -- \| --
| 4\|4\|Integer\| Array Length (Floats)
| 8..8+length\*4\|4\|Integer\| 32 Bits IEE 754 Float
25: string array
~~~~~~~~~~~~~~~~
+----------+-------+-----------+--------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+==========================+
| 4 | 4 | Integer | Array Length (Strings) |
+----------+-------+-----------+--------------------------+
For each String:
+----------+-------+-----------+------------------------+
| Offset | Len | Type | Description |
+==========+=======+===========+========================+
| X+0 | 4 | Integer | String Length |
+----------+-------+-----------+------------------------+
| X+4 | X | Bytes | UTF-8 Encoded String |
+----------+-------+-----------+------------------------+
Every string is is padded to 4 bytes.
26: vector2 array
~~~~~~~~~~~~~~~~~
+-------------------------------------------+-------+-----------+----------------+
| Offset | Len | Type | Description |
+===========================================+=======+===========+================+
| 4 | 4 | Integer | Array Length |
+-------------------------------------------+-------+-----------+----------------+
| 8..8+length\_8\|4\|Float\| X Coordinate | 4 | Float | Y Coordinate |
| 8..12+length\_8 | | | |
+-------------------------------------------+-------+-----------+----------------+
27: vector3 array
~~~~~~~~~~~~~~~~~
| Offset \| Len \| Type \| Description
| -- \| -- \| -- \| --
| 4\|4\|Integer\| Array Length
| 8..8+length\_12\|4\|Float\| X Coordinate
| 8..12+length\_12\|4\|Float\| Y Coordinate
| 8..16+length\*12\|4\|Float\| Z Coordinate
28: color array
~~~~~~~~~~~~~~~
+--------------------------------------------+-------+-----------+----------------+
| Offset | Len | Type | Description |
+============================================+=======+===========+================+
| 4 | 4 | Integer | Array Length |
+--------------------------------------------+-------+-----------+----------------+
| 8..8+length\_16\|4\|Float\| Red (0..1) | 4 | Float | Green (0..1) |
| 8..12+length\_16 | | | |
+--------------------------------------------+-------+-----------+----------------+
| 8..16+length\_16\|4\|Float\| Blue (0..1) | 4 | Float | Alpha (0..1) |
| 8..20+length\_16 | | | |
+--------------------------------------------+-------+-----------+----------------+

View File

@@ -0,0 +1,11 @@
Changing editor fonts
=====================
Godot allows changing the font for the editor, and the font for the code
editor. Both need to be in .fnt format, so they need to be imported
somewhere using the [[Importing fonts\|font import tool]].
Then copy or do whathever you want with the font, as long as the
location does not change, and set the relevant property in Editor
Settings. Code editor font is refreshed automatically, but the editor
needs to be restarted for the new global font to take effect.

View File

@@ -0,0 +1,145 @@
Command line tutorial
=====================
Some developers like using the command line extensively. Godot is
designed to be friendly to them, so here are the steps for working
entirely from the command line. Given the engine relies on little to no
external libraries, initialization times are pretty fast, making it
suitable for this workflow.
Path
----
It is recommended that your godot binary is in your PATH environment
variable, so it can be executed easily from any place by typing
``godot``. You can do so on Linux by placing the Godot binary in
``/usr/local/bin`` and making sure it is called ``godot``.
Creating a project
------------------
Creating a project from the command line is simple, just navigate the
shell to the desired place and just make an engine.cfg file exist, even
if empty.
::
user@host:~$ mkdir newgame
user@host:~$ cd newgame
user@host:~/newgame$ touch engine.cfg
That alone makes for an empty Godot project.
Running the editor
------------------
Running the editor is done by executing godot with the ``-e`` flag. This
must be done from within the project directory, or a subdirectory,
otherwise the command is ignored and the project manager appears.
::
user@host:~/newgame$ godot -e
If a scene has been created and saved, it can be edited later by running
the same code with that scene as argument.
::
user@host:~/newgame$ godot -e scene.xml
Erasing a scene
---------------
Godot is friends with your filesystem, and will not create extra
metadata files, simply use ``rm`` to erase a file. Make sure nothing
references that scene, or else an error will be thrown upon opening.
::
user@host:~/newgame$ rm scene.xml
Running the game
----------------
To run the game, simply execute Godot within the project directory or
subdirectory.
::
user@host:~/newgame$ godot
When a specific scene needs to be tested, pass that scene to the command
line.
::
user@host:~/newgame$ godot scene.xml
Debugging
---------
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
``-d``. It works for both running the game or a simple scene.
::
user@host:~/newgame$ godot -d
::
user@host:~/newgame$ godot -d scene.xml
Exporting
---------
Exporting the project from the command line is also supported. This is
specially useful for continuous integration setups. The version of Godot
that is headless (server build, no video) is ideal for this.
::
user@host:~/newgame$ godot -export \"Linux X11\" /var/builds/project
user@host:~/newgame$ godot -export Android /var/builds/project.apk
The platform names recognized by the ``-export`` switch are the same as
displayed in the export wizard of the editor. To get a list of supported
platforms from the command line, just try exporting to a non-recognized
platform and the full listing of platforms your configuration supports
will be shown.
To export a debug version of the game, use the ``-export_debug`` switch
instead of ``-export``. Their parameters and usage are the same.
Running a script
----------------
| It is possible to run a simple .gd script from the command line. This
feature is specially useful in very large projects, for batch
conversion of assets or custom import/export.
| The script must inherit from SceneTree or MainLoop.
Here is a simple example of how it works:
| <pre class=\\"python\\">
| #sayhello.gd
| extends SceneTree
| func \_init():
| print(\\"Hello!\\")
| quit()
.. raw:: html
</pre>
And how to run it:
::
user@host:~/newgame$ godot -s sayhello.gd
Hello!
If no engine.cfg exists at the path, current path is assumed to be the
current working directory (unless ``-path`` is specified).

View File

@@ -0,0 +1,21 @@
Compiling
=========
.. toctree::
:maxdepth: 1
:name: compiling
introduction_to_the_buildsystem
compiling_for_windows
compiling_for_linux
compiling_for_osx
compiling_for_android
compiling_for_ios
cross-compiling_for_ios_on_linux
compiling_for_universal_windows_apps
batch_building_templates
configure_your_ide
introduction_to_godot_development
.. compiling_for_blackberry_qnx
.. compiling_for_google_native_client

View File

@@ -0,0 +1,224 @@
Compiling for Android
=====================
Note
----
For most cases, using the built-in deployer and export templates is good
enough. Compiling the Android APK manually is mostly useful for custom
builds or custom packages for the deployer.
Also, you still need to do all the steps mentioned in the [[Exporting
for Android]] tutorial before attempting your custom export template.
Requirements
------------
For compiling under Windows, the following is required:
- Python 2.7+ (3.0 is untested as of now).
- SCons build system.
- Android SDK version 8 and 13
- Android NDK
Setting Up SCons
----------------
| Set the environment variable ANDROID\_HOME to point to the Android
SDK.
| Set the environment variable ANDROID\_NDK\_ROOT to point to the
Android NDK.
To set those environment variables on Windows, press Windows+R, type
\\"control system\\", then click on **Advanced system settings** in the
left pane, then click on **Environment variables** on the window that
appears.
To set those environment variables on Linux, use
``export ANDROID_HOME=/path/to/android-sdk`` and
``export ANDROID_NDK_ROOT=/path/to/android-ndk``.
Compiling
---------
Go to the root dir of the engine source code and type:
::
C:\\godot> scons platform=android
This should result in a regular .so in \\\\bin folder as if it was
compiled with flags: ``tools=no target=debug``. The resulting file will
be huge because it will contain all debug symbols, so for next builds,
using ``target=release_debug`` or ``target=release`` is recommended.
Copy the .so to the libs/armeabi Android folder (or symlink if you are
in Linux or OSX). Note: Git does not support empty directories so you
will have to create it if it does not exist:
::
C:\\godot> mkdir platform/android/java/libs
C:\\godot> mkdir platform/android/java/libs/armeabi
Then copy or symlink:
::
C:\\godot> copy bin/libgodot.android..so platform/android/java/libs/armeabi/libgodot_android.so
alternatively if you are under unix you can symlink:
::
user@host:~/godot$ ln -s bin/libgodot.android..so platform/android/java/libs/armeabi/libgodot_android.so
Remember that only *one* of libgodot\_android.so must exist for each
platform, for each build type (release, debug, etc), it must be
replaced.
**Note**: The file inside libs/armeabi must be renamed to
**\\"libgodot\_android.so\\"**, or else unsatisfied link error will
happen at runtime.
If you also want to include support for x86 Android, add the following
compile flag: ``x86=yes`` , then copy/symlink the resulting folder to
the x86 folder:
::
C:\\godot> cp bin/libgodot.android..x86.so platform/android/java/libs/x86/libgodot_android.so
This will create a fat binary that works in both platforms, but will add
about 6 megabytes to the APK.
Toolchain
---------
We usually try to keep the Godot Android build code up to date, but
Google changes their toolchain versions very often, so if compilation
fails due to wrong toolchain version, go to your NDK directory and check
the current numbers, then set the following environment variables:
::
NDK_TOOLCHAIN (by default set to \"arm-eabi-4.4.0\")
NDK_TARGET (by default set to \"arm-linux-androideabi-4.8\")
Building the APK
----------------
To compile the APK, go to the Java folder and run ant, either for debug
or release build:
::
C:\\godot\\platform\\android\\java> ant debug
::
C:\\godot\\platform\\android\\java> ant release
In the ``java/bin`` subfolder, the resulting apk can be used as export
template.
**Note:** If you reaaaally feel oldschool, you can copy your entire game
(or symlink) to the assets/ folder of the Java project (make sure
engine.cfg is in assets/) and it will work, but you lose all the
benefits of the export system (scripts are not byte-compiled, textures
not converted to Android compression, etc. so it's not a good idea).
Compiling export templates
--------------------------
Godot needs the freshly compiled APK as export templates. It opens the
APK, changes a few things inside, adds your file and spits it back. It's
really handy! (and required some reverse engineering of the format).
Compiling the standard export templates is done by calling scons with
the following arguments:
(debug)
::
C:\\godot> scons platform=android target=release_debug
C:\\godot> cp bin/libgodot_android.opt.debug.so platform/android/java/libs/armeabi
C:\\godot> cd platform/android/java
C:\\godot\\platform\\android\\java> ant release
Resulting APK is in:
::
platform/android/java/bin/Godot-release-unsigned.apk
(release)
::
C:\\godot> scons platform=android target=release
C:\\godot> cp bin/libgodot_android.opt.so platform/android/java/libs/armeabi
C:\\godot> cd platform/android/java
C:\\godot\\platform\\android\\java> ant release
Resulting APK is in:
::
platform/android/java/bin/Godot-release-unsigned.apk
(same as before)
They must be copied to your templates folder with the following names:
::
android_debug.apk
android_release.apk
However, if you are writing your custom modules or custom C++ code, you
might instead want to configure your APKs as custom export templates
here:
.. image:: /img/andtemplates.png
You don't even need to copy them, you can just reference the resulting
file in the bin\\\\ directory of your Godot source folder, so the next
time you build you automatically have the custom templates referenced.
Troubleshooting
---------------
Application not installed
~~~~~~~~~~~~~~~~~~~~~~~~~
Android might complain the application is not correctly installed. If
so, check the following:
- Check that the debug keystore is properly generated.
- Check that jarsigner is from JDK6.
If it still fails, open a command line and run logcat:
::
C:\\android-sdk\\platform-tools> adb logcat
| And check the output while the application is installed. Reason for
failure should be presented there.
| Seek assistance if you can't figure it out.
Application exits immediately
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If the application runs but exits immediately, there might be one of the
following reasons:
- libgodot\_android.so is not in libs/armeabi
- Device does not support armv7 (try compiling yourself for armv6)
- Device is Intel, and apk is compiled for ARM.
In any case, ``adb logcat`` should also show the cause of the error.

View File

@@ -0,0 +1,44 @@
Compiling for iOS
=================
Requirements
------------
- SCons (you can get it from macports, you should be able to run
``scons`` in a terminal when installed)
- Xcode with the iOS SDK and the command line tools.
Compiling
---------
Open a Terminal, go to the root dir of the engine source code and type:
::
$ scons p=iphone bin/godot.iphone.debug
for a debug build, or:
::
$ scons p=iphone bin/godot.iphone.opt target=release
for a release build (check platform/iphone/detect.py for the compiler
flags used for each configuration).
Alternatively, you can run
::
$ scons p=isim bin/godot.isim.tools
for a Simulator executable.
Run
---
| To run on a device or simulator, follow these instructions:
[[Exporting for iOS]].
| Replace or add your executable to the Xcode project, and change the
\\"executable name\\" property on Info.plist accordingly if you use an
alternative build.

View File

@@ -0,0 +1,102 @@
Compiling for Linux
===================
Requirements
------------
For compiling under Linux or other Unix variants, the following is
required:
- GCC or LLVM
- Python 2.7+ (3.0 is untested as of now).
- SCons build system.
- X11 and MESA development Libraries
- Xinerama Libraries
- ALSA development libraries
- Freetype (for the editor)
- OpenSSL (for HTTPS and TLS)
- pkg-config (used to detect the above three)
- libevdev-dev and libudev-dev (for facultative joypad support)
For Ubuntu users:
::
apt-get install scons pkg-config libx11-dev libxcursor-dev build-essential libasound2-dev libfreetype6-dev libgl1-mesa-dev libglu-dev libssl-dev libxinerama-dev
If you wish to have Joypad support, libevdev-dev and libudev-dev are
required.
::
apt-get install libevdev-dev libudev-dev
Compiling
---------
Start a terminal, go to the root dir of the engine source code and type:
::
user@host:~/godot$ scons platform=x11
If all goes well, the resulting binary executable will be placed in the
\\"bin\\" subdirectory. This executable file contains the whole engine
and runs without any dependencies. Executing it will bring up the
project manager.
Building export templates
-------------------------
To build Linux export templates, run the build system with the following
parameters:
(32 bits)
::
user@host:~/godot$ scons platform=x11 tools=no target=release bits=32
user@host:~/godot$ scons platform=x11 tools=no target=release_debug bits=32
(64 bits)
::
user@host:~/godot$ scons platform=x11 tools=no target=release bits=64
user@host:~/godot$ scons platform=x11 tools=no target=release_debug bits=64
Note that cross compiling for the opposite bits (64/32) as your host
platform in linux is quite difficult and might need a chroot
environment.
In Ubuntu, compilation works without a chroot but some libraries (.so)
might be missing from /usr/lib32. Symlinking the missing .so files from
/usr/lib results in a working build.
To create standard export templates, the resulting files must be copied
to:
::
/home/youruser/.godot/templates
and named like this:
::
linux_x11_32_debug
linux_x11_32_release
linux_x11_64_debug
linux_x11_64_release
However, if you are writing your custom modules or custom C++ code, you
might instead want to configure your binaries as custom export templates
here:
.. image:: /img/lintemplates.png
You don't even need to copy them, you can just reference the resulting
files in the bin/ directory of your Godot source folder, so the next
time you build you automatically have the custom templates referenced.

View File

@@ -0,0 +1,63 @@
Compiling for OSX
=================
Requirements
------------
For compiling under Linux or other Unix variants, the following is
required:
- Python 2.7+ (3.0 is untested as of now).
- SCons build system.
- XCode
Compiling
---------
Start a terminal, go to the root dir of the engine source code and type:
::
user@host:~/godot$ scons platform=osx
If all goes well, the resulting binary executable will be placed in the
\\"bin\\" subdirectory. This executable file contains the whole engine
and runs without any dependencies. Executing it will bring up the
project manager. There is a .app template to put the binary into in
tools/Godot.app.
Cross-compiling
---------------
It is possible to compile for OS X in a Linux environment (and maybe
also in Windows with Cygwin). For that you will need
\\\ `OSXCross\\ <https://github.com/tpoechtrager/osxcross>`__ for being
able to use OS X as target. First, follow the instructions to install
it:
# Clone the OSXCross repository
(https://github.com/tpoechtrager/osxcross) somewhere in your machine (or
download a Zip file and extract it somewhere). E.g.
::
~$ git clone https://github.com/tpoechtrager/osxcross.git /home/myuser/sources/osxcross
#. Follow the instructions to package the SDK:
https://github.com/tpoechtrager/osxcross#packaging-the-sdk
#. Follow the instructions to install OSXCross:
https://github.com/tpoechtrager/osxcross#installation
After that, you will need to define the ``OSXCROSS_ROOT`` as the path to
the OSXCross installation (the same place where you cloned the
repository/extracted the zip. E.g.
::
~$ export OSXCROSS_ROOT=/home/myuser/sources/oscross
Now you can compile with SCons like you normally would:
::
~/godot$ scons platform=osx

View File

@@ -0,0 +1,148 @@
Compiling for Universal Windows Apps
====================================
This page documents the current state of the \\"winrt\\" platform, used
to support \\"Windows Store Apps\\" for Windows 8.1, and Windows Phone
8.1 apps using Microsoft's new \\"Universal\\" APIs.
Requirements
------------
- Windows 8
- SCons (see [[Compiling for Windows]] for more details)
- Visual Studio 2013 for Windows (but *not* \\"for Windows Desktop\\").
Tested on \\"Microsoft Visual Studio Express 2013 for Windows Version
12.0.31101.00 Update 4\\".
Compiling
---------
The platform can compile binaries for both Windows 8.1 and Windows Phone
8.1. The architecture is decided by the environment variable
\\"PLATFORM\\".
Windows 8.1
~~~~~~~~~~~
\* Open a \\"VS 2013 x64 Cross Tools Command Prompt\\"
\* The value of environment variable \\"PLATFORM\\" should be \\"x64\\"
\* Run scons with platform=winrt from the root of the source tree
::
C:\\godot_source> scons platform=winrt
- You should get an executable file inside bin/ named according to your
build options, for the architecture \\"x64\\", for example
\\"godot.winrt.tools.x64.exe\\".
Windows Phone 8.1
~~~~~~~~~~~~~~~~~
\* Open a \\"Visual Studio 2012 ARM Phone Tools Command Prompt\\"
\* The value of environment variable \\"PLATFORM\\" should be \\"arm\\"
\* Run scons with platform=winrt from the root of the source tree
::
C:\\godot_source> scons platform=winrt
- You should get an executable file inside bin/ named according to your
build options, for the architecture \\"arm\\", for example
\\"godot.winrt.tools.arm.exe\\".
Running
-------
On Visual studio, create a new project using any of the \\"Unversal
App\\" templates found under Visual C++ -> Store Apps -> Universal Apps.
\\"Blank App\\" should be fine.
On the \\"Solution Explorer\\" box, you should have 3 sections,
\\"App.Windows (Windows 8.1)\\", \\"App.WindowsPhone (Windows Phone
8.1)\\" and \\"App.Shared\\". You need to add files to each section:
App.Shared
~~~~~~~~~~
- Add a folder named \\"game\\" containing your game content (can be
individual files or your data.pck). Remember to set the \\"Content\\"
property of each file to \\"True\\", otherwise your files won't get
included in the package.
App.Windows
~~~~~~~~~~~
\* Add your windows executable, and all the .dll files found on
platform/winrt/x64/bin on the godot source. Remember to also set the
\\"Content\\" property.
\* Find the file \\"Package.appxmanifest\\". Right click on it and
select \\"Open with...\\" then \\"XML (Text) Editor\\" from the list.
\* Find the \\"Application\\" section, and add (or modify) the
\\"Executable\\" property with the name of your .exe. Example:
::
App.WindowsPhone
~~~~~~~~~~~~~~~~
- Repeat all the steps from App.Windows, using your arm executable and
the dlls found in platform/winrt/arm/bin. Remember to set the
\\"Content\\" property for all the files.
Use the green \\"Play\\" button on the top to run. The drop down menu
next to it should let you choose the project (App.Windows or
App.WindowsPhone) and the device (\\"Local Machine\\", \\"Device\\" for
an attached phone, etc).
Angle
-----
ANGLE precompiled binaries are provided on platform/winrt/x64 and
platform/winrt/arm. They are built from MSOpenTech's \\"future-dev\\"
branch, found here:
\\\ `https://github.com/MSOpenTech/angle\\ <https://github.com/MSOpenTech/angle>`__.
The visual studio 'solutions' used are found on
\\"projects/winrt/windows/angle.sln\\" and
\\"projects/winrt/windowsphone/angle.sln\\".
What's missing
--------------
- Audio
- Semaphores
- Keyboard input
- Proper handling of screen rotation
- Proper handling of other events such as focus lost, back button, etc.
- Packaging and deploying to devices from the editor.
- Adding Angle to our tree and compiling it from there. The same source
could also be used to build for Windows (and use Angle instead of
native GL, which will be more compatible with graphics hardware)
Packages
--------
This is what we know:
- App packages are documented here:
\\\ `http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh464929.aspx\\ <http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh464929.aspx>`__
- There are 2 command line tools that might be useful, \\\ `App
Packager\\ <http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh446767.aspx>`__
and
\\\ `SignTool\\ <http://msdn.microsoft.com/en-us/library/windows/apps/xaml/ff551778.aspx>`__.
- There are a bunch of tools on \\"powershell\\" that deal with
packages that might be relevant:
\\\ `http://technet.microsoft.com/library/dn448373.aspx\\ <http://technet.microsoft.com/library/dn448373.aspx>`__
- When running a Windows 8.1 app on \\"Local Machine\\" from Visual
studio, the app seems to run from an uncompressed directory on the
filesystem in an arbitrary location (ie. outside of the proper
directory where Apps are installed), but there is some special
registry entry made for it, so we know it's possible to skip the
packaging step to run locally (in the case of very big games this can
be useful).

View File

@@ -0,0 +1,151 @@
Compiling for Windows
=====================
Requirements
------------
For compiling under Windows, the following is required:
- \\\ `Visual C++\\ <http://www.microsoft.com/visualstudio>`__, Visual
C++ Express compiler or Visual Studio Community (recommended) at
least the 2010 version (10.0) up to 2015 (14.0). **Make sure you get
a version that can compile for C++, Desktop**.
- \\\ `Python 2.7+\\ <http://www.python.org/getit/releases/2.7/>`__
(3.0 is untested as of now). Using the 32-bits installer is
recommended.
- \\\ `Pywin32 Python
Extension\\ <http://sourceforge.net/projects/pywin32>`__ for parallel
builds (which increase the build speed by a great factor).
- \\\ `SCons\\ <http://www.scons.org>`__ build system.
Setting up SCons
----------------
Python adds the interpreter (python.exe) to the path. It usually
installs in C:\\\\Python (or C:\\\\Python[Version]). SCons installs
inside the python install and provides a .bat file called
\\"scons.bat\\". The location of this file can be added to the path or
it can simply be copied to C:\\\\Python together with the interpreter
executable.
Compiling
---------
Start a Visual Studio command prompt (it sets up environment variables
needed by SCons to locate the compiler and SDK), go to the root dir of
the engine source code and type:
::
C:\\godot> scons platform=windows
If all goes well, the resulting binary executable will be placed in
C:\\\\godot\\\\bin\\\\godot.windows.tools.exe. This executable file
contains the whole engine and runs without any dependencies. Executing
it will bring up the project manager.
Development in Visual Studio or other IDEs
------------------------------------------
For most projects, using only scripting is enough but when development
in C++ is needed, for creating modules or extending the engine, working
with an IDE is usually desirable. The visual studio command prompt calls
a .bat file that sets up environment variables (vcvarsall.bat). To build
the whole engine from a single command outside the command prompt, the
following should be called in a .bat file:
::
C:\\path_to_sdk\\vcvarsall.bat && scons bin/godot.windows.tools.exe
**NOTE:** It seems the latest Visual Studio does not include a desktop
command prompt (No, Native tools for x86 is not it). The only way to
build it seems to be by running:
::
\"C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat\" && c:\\python27\\scons p=windows
(or however your VS and Scons are installed)
Cross compiling
---------------
If you are a Linux or Mac user, you need to install mingw32 and
mingw-w64. Under Ubuntu or Debian, just run the following commands:
::
apt-get install mingw32 mingw-w64
If you are using other distro, scons will check for the following
binaries:
::
i586-mingw32msvc-gcc
i686-w64-mingw32-gcc
If the binaries are named or located somewhere else, export the
following env variables:
::
export MINGW32_PREFIX=\"/path/to/i586-mingw32msvc-\"
export MINGW64_PREFIX=\"/path/to/i686-w64-mingw32-\"
To make sure you are doing things correctly, executing the following in
the shell should result in a working compiler:
::
user@host:~$ ${MINGW32_PREFIX}gcc
gcc: fatal error: no input files
Creating Windows export templates
---------------------------------
Windows export templates are created by compiling Godot as release, with
the following flags:
(for 32 bits, using Mingw32 command prompt or Visual Studio command
prompt)
::
C:\\godot> scons platform=windows tools=no target=release bits=32
C:\\godot> scons platform=windows tools=no target=release_debug bits=32
(for 64 bits, using Mingw-w64 or Visual Studio command prompt)
::
C:\\godot> scons platform=windows tools=no target=release bits=64
C:\\godot> scons platform=windows tools=no target=release_debug bits=64
If you plan on replacing the standard templates, copy these to:
::
C:\\USERS\\YOURUSER\\AppData\\Roaming\\Godot\\Templates
With the following names:
::
windows_32_debug.exe
windows_32_release.exe
windows_64_debug.exe
windows_64_release.exe
However, if you are writing your custom modules or custom C++ code, you
might instead want to configure your binaries as custom export templates
here:
.. image:: /img/wintemplates.png
You don't even need to copy them, you can just reference the resulting
files in the bin\\\\ directory of your Godot source folder, so the next
time you build you automatically have the custom templates referenced.

View File

@@ -0,0 +1,11 @@
Configure an IDE
================
With Eclipse
------------
With QtCreator
--------------
With another editor (vim, emacs, Atom...)
-----------------------------------------

View File

@@ -0,0 +1,231 @@
Core types
==========
| Godot has a rich set of classes and template that make for its core,
and everything is built upon them.
| This reference will try to list them in order for their better
understanding.
Definitions
-----------
Godot uses the standard C98 datatypes, such as ``uint8_t``,
``uint32_t``, ``int64_t``, etc. which are nowadays supported by every
compiler. Reinventing the wheel for those is not fun, as it makes code
more difficult to read.
In general, care is not taken to use the most efficient datatype for a
given task unless using large structures or arrays. ``int`` is used
through most of the code unless neccesary. This is done because nowadays
every device has at least a 32 bits bus and can do such operations in
one cycle. It makes code more readable too.
For files or memory sizes, ``size_t`` is used, which is warranted to be
64 bits.
For Unicode characters, CharType instead of wchar\_t is used, because
many architectures have 4 bytes long wchar\_t, where 2 bytes might be
desired. However, by default, this has not been forced and CharType maps
directly to wchar\_t.
References:
~~~~~~~~~~~
- \\\ `core/typedefs.h\\ <https://github.com/okamstudio/godot/blob/master/core/typedefs.h>`__
Memory model
------------
PC is a wonderful architecture. Computers often have gigabytes of RAM,
terabytes of storage and gigahertz of CPU, and when an application needs
more resources the OS will just swap out the inactive ones. Other
architectures (like mobile or consoles) are in general more limited.
| The most common memory model is the heap, where an application will
request a region of memory, and the underlying OS will try to fit it
somewhere and return it. This often works best and is very flexible,
but over time and with abuse, this can lead to segmentation.
| Segmentation slowly creates holes that are too small for most common
allocations, so that memory is wasted. There is a lot of literature
about heap and segmentation, so this topic will not be developed
further here. Modern Operating Systems use paged memory, which helps
mitigate the problem of segmentation but doesn't solve it.
However, in many studies and tests, it is shown that given enough
memory, if the maximum allocation size is below a given threshold in
proportion to the maximum heap size and proportion of memory intended to
be unused, segmentation will not be a problem over time as it will
remain constant. In other words, just leave 10-20% of your memory free
and perform all small allocations and you are fine.
Godot ensures that all objects that can be allocated dynamically are
small (less than a few kb at most). But what happens if an allocation is
too large (like an image or mesh geometry or large array)? In this case
Godot has the option to use a dynamic memory pool. This memory needs to
be locked to be accessed, and if an allocation runs out of memory, the
pool will be rearranged and compacted on demand. Depending on the need
of the game, the programmer can configure the dynamic memory pool size.
Allocating memory
-----------------
Godot has many tools for tracking memory usage in an game, specially
during debug. Because of this, the regular C and C++ library calls
should not be used. Instead, a few other ones are provided.
For C-style allocation, Godot provides a few macros:
::
memalloc()
memrealloc()
memfree()
These are equivalent to the usual malloc, realloc, free of the standard
library.
For C++-style allocation, special macros are provided:
::
memnew( Class / Class(args) )
memdelete( instance )
memnew_arr( Class , amount )
memdelete_arr( pointer to array )
which are equivalent to new, delete, new[] and delete[].
memnew/memdelete also use a little C++ magic and notify Objects right
after they are created, and right before they are deleted.
For dynamic memory, the DVector<> template is provided. Just use it
like:
::
DVector
DVector is just a standard vector class, it can be accessed using the []
operator, but that's probably slow for large amount of accesses (as it
has to lock internally). A few helpers exist for this:
::
DVector::Read r = dvector.read()
int someint = r[4]
and
::
DVector::Write w = dvector.write()
w[4]=22;
respectively. These allow fast read/write from DVectors and keep it
locked until they go out of scope.
References:
~~~~~~~~~~~
- \\\ `core/os/memory.h\\ <https://github.com/okamstudio/godot/blob/master/core/os/memory.h>`__
- \\\ `core/dvector.h\\ <https://github.com/okamstudio/godot/blob/master/core/dvector.h>`__
Containers
----------
Godot provides also a set of common containers:
- Vector
- List
- Set
- Map
The are very simple and aim to be as minimal as possible, as templates
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
pointers, like this:
::
for(List::Element *E=somelist.front();E;E=E->next()) {
print_line(E->get()); //print the element
}
The Vector<> class also has a few nice features:
- It does copy on write, so making copies of it is cheap as long as
they are not modified.
- It supports multi-threading, by using atomic operations on the
reference counter.
References:
~~~~~~~~~~~
- \\\ `core/vector.h\\ <https://github.com/okamstudio/godot/blob/master/core/vector.h>`__
- \\\ `core/list.h\\ <https://github.com/okamstudio/godot/blob/master/core/list.h>`__
- \\\ `core/set.h\\ <https://github.com/okamstudio/godot/blob/master/core/set.h>`__
- \\\ `core/map.h\\ <https://github.com/okamstudio/godot/blob/master/core/map.h>`__
String
------
Godot also provides a String class. This class has a huge amoun of
features, full Unicode support in all the functions (like case
operations) and utf8 parsing/exracting, as well as helpers for
conversion and visualization.
References:
~~~~~~~~~~~
- \\\ `core/ustring.h\\ <https://github.com/okamstudio/godot/blob/master/core/ustring.h>`__
StringName
----------
| StringNames are like a String, but they are unique. Creating a
StringName from a string results in a unique internal pointer for all
equal strings. StringNames are really useful for using strings as
identifier, as comparing them is basically comparing a pointer.
| Creation of a StringName (specially a new one) is slow, but comparison
is fast.
References:
~~~~~~~~~~~
- \\\ `core/string\_db.h\\ <https://github.com/okamstudio/godot/blob/master/core/string_db.h>`__
Math types
----------
There are several linear math types available in the core/math
directory, they are basically just that.
References:
~~~~~~~~~~~
- \\\ `core/math\\ <https://github.com/okamstudio/godot/blob/master/core/math>`__
NodePath
--------
This is a special datatype sued for storing paths in a scenetree and
referencing them fast.
References:
~~~~~~~~~~~
- \\\ `core/path\_db.h\\ <https://github.com/okamstudio/godot/blob/master/core/path_db.h>`__
RID
---
RIDs are resource IDs. Servers use these to reference data stored in
them. RIDs are opaque, meaning that the data they reference can't be
accessed directly. RIDs are unique, even for different types of
referenced data.
References:
~~~~~~~~~~~
- \\\ `core/rid.h\\ <https://github.com/okamstudio/godot/blob/master/core/rid.h>`__

View File

@@ -0,0 +1,354 @@
Creating Android modules
========================
Introduction
------------
| Making videogames portable is all fine and dandy, until mobile gaming
monetization shows up.
| This area is complex, usually a mobile game that monetizes needs
special connections to a server for stuff such as:
- Analytics
- In-app purchases
- Receipt validation
- Install tracking
- Ads
- Video ads
- Cross promotion
- In-game soft & hard currencies
- Promo codes
- A/B testing
- Login
- Cloud saves
- Leaderboards and scores
- User support & feedback
- Posting to Facebook, Twitter, etc.
- Push notifications
Oh yeah, developing for mobile is a lot of work. On iOS, you can just
write a C++ module and take advantage of the C++/ObjC
intercommunication, so this is rather easy.
For C++ developers Java is a pain, the build system is severely bloated
and interfacing it with C++ through JNI (Java Native Interface) is more
pain that you don't want even for your worst enemy.
Maybe REST?
-----------
Most of these APIs allow communication via REST+JSON APIs. Godot has
great support for HTTP, HTTPS and JSON, so consider this as an option
that works in every platform. Only write the code once and you are set
to go.
Popular engines that have half the share of apps published on mobile get
special plugins written just for them. Godot does not have that luxury
yet. So, if you write a REST implementation of a SDK for Godot, please
share it with the community.
Android module
--------------
Writing an Android module is similar to [[Custom modules in C++]], but
needs a few more steps.
Make sure you are familiar with building your own [[Compiling for
Android\|Android export templates]], as well as creating [[Custom
modules in C++\|custom modules]].
config.py
~~~~~~~~~
In the config.py for the module, some extra functions are provided for
convenience. First, it's often wise to detect if android is being built
and only enable building in this case:
| <pre class=\\"python\\">
| def can\_build(plat):
| return plat==\\"android\\"
.. raw:: html
</pre>
If more than one platform can be built (typical if implementing the
module also for iOS), check manually for Android in the configure
functions:
| <pre class=\\"python\\">
| def can\_build(plat):
| return plat\\"android\\" or plat\\"iphone\\"
| def configure(env):
| if env['platform'] == 'android':
| #androd specific code
.. raw:: html
</pre>
Java singleton
--------------
An android module will usually have a singleton class that will load it,
this class inherits from ``Godot.SingletonBase``. A singleton object
template follows:
| <pre class=\\"java\\">
| //namespace is wrong, will eventually change
| package com.android.godot;
public class MySingleton extends Godot.SingletonBase {
| public int myFunction(String p\_str) {
| // a function to bind
| }
static public Godot.SingletonBase initialize(Activity p\_activity) {
| return new MySingleton(p\_activity);
| }
| public MySingleton(Activity p\_activity) {
| //register class name and functions to bind
| registerClass(\\"MySingleton\\", new String[]{\\"myFunction\\"});
| // you might want to try initializing your singleton here, but android
| // threads are weird and this runs in another thread, so you usually
have to do
| activity.runOnUiThread(new Runnable() {
| public void run() {
| //useful way to get config info from engine.cfg
| String key = GodotLib.getGlobal(\\"plugin/api\_key\\");
| SDK.initializeHere();
| }
| });
}
// forwarded callbacks you can reimplement, as SDKs often need them
protected void onMainActivityResult(int requestCode, int resultCode,
Intent data) {}
| protected void onMainPause() {}
| protected void onMainResume() {}
| protected void onMainDestroy() {}
| protected void onGLDrawFrame(GL10 gl) {}
| protected void onGLSurfaceChanged(GL10 gl, int width, int height) {}
// singletons will always miss first onGLSurfaceChanged call
}
.. raw:: html
</pre>
Calling back to Godot from Java is a little more difficult. The instance
ID of the script must be known first, this is obtained by calling
``get_instance_ID()`` on the script. This returns an integer that can be
passed to Java.
From Java, use the calldeferred function to communicate back with Godot.
Java will most likely run in a separate thread, so calls are deferred:
<pre class=\\"java\\">GodotLib.calldeferred(, \\"\\", new
Object[]{param1,param2,etc});
.. raw:: html
</pre>
Add this singleton to the build of the project by adding the following
to config.py:
| <pre class=\\"python\\">
| def can\_build(plat):
| return plat\\"android\\" or plat\\"iphone\\"
| def configure(env):
| if env['platform'] == 'android':
| # will copy this to the java folder
| env.android\_module\_file(\\"MySingleton.java\\")
| #env.android\_module\_file(\\"MySingleton2.java\\") call again for
more files
.. raw:: html
</pre>
AndroidManifest
---------------
Some SDKs need custom values in AndroidManifest.xml. Permissions can be
edited from the godot exporter so there is no need to add those, but
maybe other functionalities are needed.
Create the custom chunk of android manifest and put it inside the
module, add it like this:
| <pre class=\\"python\\">
| def can\_build(plat):
| return plat\\"android\\" or plat\\"iphone\\"
| def configure(env):
| if env['platform'] == 'android':
| # will copy this to the java folder
| env.android\_module\_file(\\"MySingleton.java\\")
| env.android\_module\_manifest(\\"AndroidManifestChunk.xml\\")
.. raw:: html
</pre>
SDK library
-----------
So, finally it's time to add the SDK library. The library can come in
two flavors, a JAR file or an Android project for ant. JAR is the
easiest to integrate, just put it in the module directory and add it:
| <pre class=\\"python\\">
| def can\_build(plat):
| return plat\\"android\\" or plat\\"iphone\\"
| def configure(env):
| if env['platform'] == 'android':
| # will copy this to the java folder
| env.android\_module\_file(\\"MySingleton.java\\")
| env.android\_module\_manifest(\\"AndroidManifestChunk.xml\\")
| env.android\_module\_library(\\"MyLibrary-3.1.jar\\")
.. raw:: html
</pre>
SDK project
-----------
When this is an Android project, things usually get more complex. Copy
the project folder inside the module directory and configure it:
::
c:\\godot\\modules\\mymodule\\sdk-1.2> android -p . -t 15
As of this writing, godot uses minsdk 10 and target sdk 15. If this ever
changes, should be reflected in the manifest template:
\\\ `https://github.com/okamstudio/godot/blob/master/platform/android/AndroidManifest.xml.template\\ <https://github.com/okamstudio/godot/blob/master/platform/android/AndroidManifest.xml.template>`__
Then, add the module folder to the project:
| <pre class=\\"python\\">
| def can\_build(plat):
| return plat\\"android\\" or plat\\"iphone\\"
| def configure(env):
| if env['platform'] == 'android':
| # will copy this to the java folder
| env.android\_module\_file(\\"MySingleton.java\\")
| env.android\_module\_manifest(\\"AndroidManifestChunk.xml\\")
| env.android\_module\_source(\\"sdk-1.2\\",\\"\\")
.. raw:: html
</pre>
Building
--------
As you probably modify the contents of the module, and modify your .java
inside the module, you need the module to be built with the rest of
Godot, so compile android normally.
::
c:\\godot> scons p=android
This will cause your module to be included, the .jar will be copied to
the java folder, the .java will be copied to the sources folder, etc.
Each time you modify the .java scons must be called.
Afterwards, just build the ant project normally:
::
c:\\godot\\platform\\android\\java> ant release
This should generate the apk used as export template properly, as
defined in the [[Compiling for Android\|Android build instructions]].
Usually to generate the apk, again both commands must be run in
sequence:
::
c:\\godot> scons p=android
c:\\godot\\platform\\android\\java> ant release
Using the Module
~~~~~~~~~~~~~~~~
To use the Module from GDScript, first enable the singleton by adding
the following line to engine.cfg:
::
[android]
modules=\"com/android/godot/MySingleton\"
More than one singleton module can be enable by separating with comma:
::
[android]
modules=\"com/android/godot/MySingleton,com/android/godot/MyOtherSingleton\"
Then just request the singleton Java object from Globals like this:
| <pre class=\\"python\\">
| #in any file
var singleton=null
| func \_init():
| singleton = Globals.get\_singleton(\\"MySingleton\\")
| print( singleton.myFunction(\\"Hello\\") )
.. raw:: html
</pre>
Troubleshooting
---------------
(This section is a work in progress, report your problems here!)
Godot crashes upon load
~~~~~~~~~~~~~~~~~~~~~~~
Check ``adb logcat`` for possible problems, then:
- Make sure libgodot\_android.so is in the libs/armeabi folder
- Check that the methods used in the Java singleton only use simple
Java datatypes, more complex ones are not supported.
Future
------
| Godot has an experimental Java API Wrapper that allows to use the
entire Java API fro GDScript.
| It's simple to use and it's used like this:
::
class = JavaClassWrapper.wrap()
This is most likely not functional yet, if you want to test it and help
us make it work, contact us through the \\\ `developer mailing
list\\ <https://groups.google.com/forum/#!forum/godot-engine>`__.

View File

@@ -0,0 +1,157 @@
Cross-compiling for iOS on Linux
================================
The procedure for this is somewhat complex and requires a lot of steps,
but once you have the environment properly configured it will be easy to
compile Godot for iOS anytime you want.
Disclaimer
----------
While it is possible to compile for iOS on a Linux environment, Apple is
very restrictive about the tools to be used (specially hardware-wise),
allowing pretty much only their products to be used for development. So
this is **not official**. However, a \\\ `statement from Apple in
2010\\ <http://www.apple.com/pr/library/2010/09/09Statement-by-Apple-on-App-Store-Review-Guidelines.html>`__
says they relaxed some of the \\\ `App Store review
guidelines\\ <https://developer.apple.com/app-store/review/guidelines/>`__
to allow any tool to be used, as long as the resulting binary do not
download any code, which means it should be OK to use the procedure
described here and cross-compiling the binary.
Requirements
------------
- \\\ `**XCode with the iOS
SDK**\\ <https://developer.apple.com/xcode/download>`__ (a dmg image)
- \\\ `**Clang >=3.5**\\ <http://clang.llvm.org>`__ for your
development machine installed and in the ``PATH``. It needs to be
version >= 3.5 to target ``arm64`` architecture.
- \\\ `**Fuse**\\ <http://fuse.sourceforge.net>`__ for mounting and
umounting the dmg image.
- \\\ `**darling-dmg**\\ <https://github.com/darlinghq/darling-dmg>`__,
which needs to be built from source. The procedure for that is
explained below.
- For building darling-dmg, you'll need the development packages of
the following libraries: **fuse, icu, openssl, zlib, bzip2**.
- \\\ `**cctools-port**\\ <https://github.com/tpoechtrager/cctools-port>`__
for the needed build tools. The procedure for building is quite
peculiar and is described below.
- This also has some extra dependencies: **automake, autogen,
libtool**.
Configuring the environment
---------------------------
darling-dmg
~~~~~~~~~~~
# Clone the repository in your machine:
::
$ git clone https://github.com/LubosD/darling-dmg.git
# Build it:
::
$ cd darling-dmg
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=RELEASE
$ make -j 4 # The number is the amount of cores your processor have, for faster build
$ cd ../..
Preparing the SDK
~~~~~~~~~~~~~~~~~
# Mount the XCode image:
::
$ mkdir xcode
$ ./darling-dmg/build/darling-dmg /path/to/Xcode_7.1.1.dmg xcode
[...]
Everything looks OK, disk mounted
# Extract the iOS 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/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/* iPhoneSDK/iPhoneOS9.1.sdk/usr/include/c++
$ fusermount -u xcode # unmount the image
# Pack the SDK:
::
$ cd iPhoneSDK
$ tar -cf - * | xz -9 -c - > iPhoneOS9.1.sdk.tar.xz
Toolchain
~~~~~~~~~
# Build cctools:
::
$ git clone https://github.com/tpoechtrager/cctools-port.git
$ cd cctools-port/usage_examples/ios_toolchain
$ ./build.sh /path/iPhoneOS9.1.sdk.tar.xz arm64
# Copy the tools to a nicer place. Note that the SCons scripts for
building will look under ``usr/bin`` inside the directory you provide
for the toolchain binaries, so you must copy to such subdirectory, akin
to the following commands:
::
$ mkdir -p /home/user/iostoolchain/usr
$ cp -r target/bin /home/user/iostoolchain/usr/
Now you should have the iOS toolchain binaries in
``/home/user/iostoolchain/usr/bin``.
Compiling Godot for iPhone
--------------------------
Once you've done the above steps, you should keep two things in your
environment: the built toolchain and the iPhoneOS SDK directory. Those
can stay anywhere you want since you have to provide their paths to the
SCons build command.
# For the iPhone platform to be detected, you need the ``OSXCROSS_IOS``
environment variable defined to anything.
::
$ export OSXCROSS_IOS=anything
# Now you can compile for iPhone using SCons like the standard Godot
way, with some additional arguments to provide the correct paths:
::
$ scons -j 4 platform=iphone bits=32 target=release_debug IPHONESDK=\"/path/to/iPhoneSDK\" IPHONEPATH=\"/path/to/iostoolchain\" ios_triple=\"arm-apple-darwin11-\"
$ scons -j 4 platform=iphone bits=64 target=release_debug IPHONESDK=\"/path/to/iPhoneSDK\" IPHONEPATH=\"/path/to/iostoolchain\" ios_triple=\"arm-apple-darwin11-\"
Producing fat binaries
~~~~~~~~~~~~~~~~~~~~~~
Apple requires a fat binary with both achitectures (``armv7`` and
``arm64``) in a single file. To do this, use the
``arm-apple-darwin11-lipo`` executable. The following example assumes
you are in the root Godot source directory:
::
$ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/godot.iphone.opt.debug.32 bin/godot.iphone.opt.debug.64 -output bin/godot.iphone.opt.debug.fat
Then you will have an iOS fat binary in
``bin/godot.iphone.opt.debug.fat``.

View File

@@ -0,0 +1,258 @@
Custom modules in C++
=====================
Modules
-------
Godot allows extending the engine in a modular way. New modules can be
created and then enabled/disabled. This allows for adding new engine
functionality at every level without modifying the core, which can be
split for use and reuse in different modules.
Modules are located in them modules/ subdirectory of the build system.
By default, two modules exist, GDScript (which, yes it's not part of the
core engine), and the GridMap. As many new modules as desired can be
created and combined, and the SCons build system will take care of it
transparently.
What for?
---------
While it's recommended that most of a game is written in scripting (as
it is an enormous time saver), it's perfectly possible to use C++
instead. Adding C++ modules can be useful in the following scenarios:
- Binding an external library to Godot (like Bullet, Physx, FMOD, etc).
- Optimize critical parts of a game.
- Adding new functionality to the engine and/or editor.
- Porting an existing game.
- Write a whole, new game in C++ because you can't live without C++.
Creating a new module
---------------------
Before creating a module, make sure to download the source code of Godot
and manage to compile it. There are tutorials in the wiki for this.
To create a new module, the first step is creating a directory inside
modules. If you want to maintain the module separately, you can checkout
a different VCS into modules and use it.
The example module will be called \\"sumator\\", and is placed inside
the Godot source tree (C:\\\\godot refers to wherever the Godot sources
are located):
::
c:\\godot> cd modules
c:\\godot\\modules> mkdir sumator
c:\\godot\\modules> cd sumator
c:\\godot\\modules\\sumator>
Inside we will create a simple sumator class:
| <pre class=\\"cpp\\">
| /\* sumator.h \*/
| #ifndef SUMATOR\_H
| #define SUMATOR\_H
#include "reference.h&quot;
| class Sumator : public Reference {
| OBJ\_TYPE(Sumator,Reference);
int count;
| protected:
| static void \_bind\_methods();
| public:
| void add(int value);
| void reset();
| int get\_total() const;
| Sumator();
| };
#endif
.. raw:: html
</pre>
And then the cpp file.
| <pre class=\\"cpp\\">
| /\* sumator.cpp \*/
#include "sumator.h&quot;
void Sumator::add(int value) {
| count+=value;
| }
void Sumator::reset() {
| count=0;
| }
int Sumator::get\_total() const {
| return count;
| }
void Sumator::\_bind\_methods() {
| ObjectTypeDB::bind\_method("add&quot;,&Sumator::add);
| ObjectTypeDB::bind\_method("reset&quot;,&Sumator::reset);
| ObjectTypeDB::bind\_method("get\_total&quot;,&Sumator::get\_total);
| }
| Sumator::Sumator() {
| count=0;
| }
.. raw:: html
</pre>
Then, the new class needs to be registered somehow, so two more files
need to be created:
::
register_types.h
register_types.cpp
With the following contents
| <pre class=\\"cpp\\">
| /\* register\_types.h \*/
| void register\_sumator\_types();
| void unregister\_sumator\_types();
| /\* yes, the word in the middle must be the same as the module folder
name \*/
.. raw:: html
</pre>
| <pre class=\\"cpp\\">
| /\* register\_types.cpp \*/
| #include "register\_types.h&quot;
| #include "object\_type\_db.h&quot;
| #include "sumator.h&quot;
void register\_sumator\_types() {
| ObjectTypeDB::register\_type&lt;Sumator&gt;();
| }
| void unregister\_sumator\_types() {
| //nothing to do here
| }
.. raw:: html
</pre>
Next, we need to create a SCsub so the build system compiles this
module:
<pre class=\\"python\\">
#. SCsub
Import('env')
env.add\_source\_files(env.modules\_sources,"\*.cpp&quot;) # just add
all cpp files to the build
.. raw:: html
</pre>
And finally, the configuration file for the module, this is a simple
python script that must be named 'config.py'
<pre class=\\"python\\">
#. config.py
| def can\_build(platform):
| return True
| def configure(env):
| pass
.. raw:: html
</pre>
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).
The second function allows to customize the build process for the
module, like adding special compiler flags, options etc. (This can be
done in SCSub, but configure(env) is called at a previous stage). If
unsure, just ignore this.
And that's it. Hope it was not too complex! Your module should look like
this:
::
godot/modules/sumator/config.py
godot/modules/sumator/sumator.h
godot/modules/sumator/sumator.cpp
godot/modules/sumator/register_types.h
godot/modules/sumator/register_types.cpp
godot/modules/sumator/SCsub
You can then zip it and share the module with everyone else. When
building for every platform (instructions in the previous section), your
module will be included.
Using the module
----------------
Using your newly created module is very easy, from any script you can
do:
| <pre class=\\"python\\">
| var s = Sumator.new()
| s.add(10)
| s.add(20)
| s.add(30)
| print( s.get\_total() )
| s.reset()
.. raw:: html
</pre>
And the output will be ``60``.
Summing up
----------
As you see, it's really easy to develop Godot in C++. Just write your
stuff normally and remember to:
- use ``OBJ_TYPE`` macro for inheritance, so Godot can wrap it
- use ``_bind_methods`` to bind your functions to scripting, and to
allow them to work as callbacks for signals.
But this is not all, depending what you do, you will be greeted with
some surprises.
- If you inherit from [[API:Node]] (or any derived node type, such as
Sprite), your new class will appear in the editor, in the inheritance
tree in the \\"Add Node\\" dialog.
- If you inherit from [[API:Resource]], it will appear int the resource
list, and all the exposed properties can be serialized when
saved/loaded.
- By this same logic, you can extend the Editor and almost any area of
the engine.

View File

@@ -0,0 +1,13 @@
Developing in C++
=================
.. toctree::
:maxdepth: 1
:name: developing-in-c++
core_types
variant_class
object_class
custom_modules_in_c++
creating_android_modules

View File

@@ -0,0 +1,8 @@
Data and file formats
=====================
.. toctree::
:maxdepth: 1
:name: data-and-file-formats
binary_serialization_api

11
advanced_topics/index.rst Normal file
View File

@@ -0,0 +1,11 @@
Advanced topics
===============
.. toctree::
:maxdepth: 2
:name: advanced-topics
compiling
developing
formats
misc

View File

@@ -0,0 +1,13 @@
Introduction to Godot development
=================================
This page introduces the global organization of Godot Engine's source
code.
Debugging the editor with gdb
-----------------------------
If you are writing or correcting bugs affecting Godot Engine editor,
remember that the binary runs the launcher first, which runs the editor
in another process. Thus, you need to run the editor directly by passing
the ``-e`` argument to Godot Engine editor's binary.

View File

@@ -0,0 +1,218 @@
Introduction to the buildsystem
===============================
Scons
-----
Godot uses \\\ `Scons\\ <http://www.scons.org>`__ to build. We love it,
we are not changing it for anything else. We are not even sure other
build systems are up to the task of building Godot. We constantly get
requests to move the build system to CMake, or Visual Studio, but this
is not going to happen. There are many reasons why we have chosen SCons
over other alternatives and are listed as follows:
- Godot can be compiled for a dozen different platforms. All PC
platforms, all mobile platforms, many consoles, and many web-based
platforms (such as HTML5 and Chrome PNACL).
- Developers often need to compile for several of the platforms **at
the same time**, or even different targets of the same platform. They
can't afford reconfiguring and rebuilding the project each time.
SCons can do this with no sweat, without breaking the builds.
- SCons will *never* break a build no matter how many changes,
configurations, additions, removals etc. You have more chances to die
struck by lightning than needing to clean and rebuild in SCons.
- Godot build process is not simple. Several files are generated by
code (binders), others are parsed (shaders), and others need to offer
customization (plugins). This requires complex logic which is easier
to write in an actual programming language (like Python) rather than
using a mostly macro-based language only meant for building.
- Godot build process makes heavy use of cross compiling tools. Each
platform has a specific detection process, and all these must be
handled as specific cases with special code written for each.
So, please get at least a little familiar with it if you are planning to
build Godot yourself.
Platform selection
------------------
Godot's build system will begin by detecting the platforms it can build
for. If not detected, the platform will simply not appear on the list of
available platforms. The build requirements for each platform are
described in the rest of this tutorial section.
Scons is invoked by just calling ``scons``.
However, this will do nothing except list the available platforms, for
example:
::
user@host:~/godot$ scons
scons: Reading SConscript files ...
No valid target platform selected.
The following were detected:
android
server
javascript
windows
x11
Please run scons again with argument: platform=<string>
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
To build a platform (for example, x11), run with the platform= (or just
p= to make it short) argument:
::
user@host:~/godot$ scons platform=x11
This will start the build process, which will take a while. If you want
scons to build faster, use the -j parameter to specify how many cores
will be used for the build. Or just leave it using one core, so you can
use your computer for something else :)
Example for using 4 processes:
::
user@host:~/godot$ scons platform=x11 -j 4
Resulting binary
----------------
The resulting binaries will be placed in the bin/ subdirectory,
generally with this naming convention:
::
godot..[opt].[tools/debug]..
For the previous build attempt the result would look like this:
::
user@host:~/godot$ ls bin
bin/godot.x11.tools.64
This means that the binary is for X11, is not optimized, has tools (the
whole editor) compiled in, and is meant for 64 bits.
A Windows binary with the same configuration will look like this.
::
C:\\GODOT> DIR BIN/
godot.windows.tools.64.exe
Just copy that binary to wherever you like, as it self-contains the
project manager, editor and all means to execute the game. However, it
lacks the data to export it to the different platforms. For that the
export templates are needed (which can be either downloaded from
http://www.godotengine.org, or you can build them yourself).
Aside from that, there are a few standard options that can be set in all
build targets, and will be explained as follows.
Tools
-----
Tools are enabled by default in al PC targets (Linux, Windows, OSX),
disabled for everything else. Disabling tools produces a binary that can
run projects but that does not include the editor or the project
manager.
::
scons platform= tools=yes/no
Target
------
Target controls optimization and debug flags. Each mode means:
- **debug**: Build with C++ debugging symbols, runtime checks (performs
checks and reports error) and none to little optimization.
- **release\_debug**: Build without C++ debugging symbols and
optimization, but keep the runtime checks (performs checks and
reports errors). Official binaries use this configuration.
- **release**: Build without symbols, with optimization and with little
to no runtime checks. This target can't be used together with
tools=yes, as the tools require some debug functionality and run-time
checks to run.
::
scons platform= target=debug/release_debug/release
This flag appends \\".debug\\" suffix (for debug), or \\".tools\\" (for
debug with tools enables). When optimization is enabled (release) it
appends the \\".opt\\" suffix.
Bits
----
Bits is meant to control the CPU or OS version intended to run the
binaries. It works mostly on desktop platforms and ignored everywhere
else.
- **32**: Build binaries for 32 bits platform.
- **64**: Build binaries for 64 bits platform.
- **default**: Built whatever the build system feels is best. On Linux
this depends on the host platform (if not cross compiling), while on
Windows and Mac it defaults to produce 32 bits binaries unless 64
bits is specified.
::
scons platform= bits=default/32/64
This flag appends \\".32\\" or \\".64\\" suffixes to resulting binaries
when relevant.
Export templates
----------------
Official export templates are downloaded from the Godot Engine site:
http://www.godotengine.org. However, you might want to build them
yourself (in case you want newer ones, you are using custom modules, or
simply don't trust your own shadow).
If you download the official export templates package and unzip it, you
will notice that most are just optimized binaries or packages for each
platform:
::
android_debug.apk
android_release.apk
javascript_debug.zip
javascript_release.zip
linux_server_32
linux_server_64
linux_x11_32_debug
linux_x11_32_release
linux_x11_64_debug
linux_x11_64_release
osx.zip
version.txt
windows_32_debug.exe
windows_32_release.exe
windows_64_debug.exe
windows_64_release.exe
windows_debug.exe
windows_release.exe
To create those yourself, just follow the instructions detailed for each
platform in this same tutorial section. Each platform explains how to
create it's own template.
If you are working for multiple platforms, OSX is definitely the best
host platform for cross compilation, since you can cross-compile for
almost every target (except for winrt). Linux and Windows come in second
place, but Linux has the advantage of being the easier platform to set
this up.

11
advanced_topics/misc.rst Normal file
View File

@@ -0,0 +1,11 @@
Misc
====
.. toctree::
:maxdepth: 1
:name: misc
command_line_tutorial
changing_editor_fonts
services_for_ios

View File

@@ -0,0 +1,369 @@
Object class
============
Object is the base class for almost everything. Most classes in Godot
inherit directly or indirectly from it. Objects provide reflection and
editable properties, and declaring them is a matter of using a single
macro like this.
| <pre class=\\"cpp\\">
| class CustomObject : public Object {
| OBJ\_TYPE(CustomObject,Object); // this required to inherit
| };
.. raw:: html
</pre>
This makes objects gain a lot of functionality, like for example
| <pre class=\\"cpp\\">
| obj = memnew(CustomObject);
| print\_line("Object Type: ",obj->get\_type()); //print object type
obj2 = obj->cast\_to&lt;OtherType&gt;(); // converting between types,
this also works without RTTI enabled.
.. raw:: html
</pre>
References:
~~~~~~~~~~~
- \\\ `core/object.h\\ <https://github.com/okamstudio/godot/blob/master/core/object.h>`__
Registering an Object
---------------------
ObjectTypeDB is a static class that hold the entire list of registered
classes that inherit from object, as well as dynamic bindings to all
their methods properties and integer constants.
Classes are registered by calling:
<pre class=\\"cpp\\">ObjectTypeDB::register\_type()
.. raw:: html
</pre>
Registering it will allow the type to be instanced by scripts, code, or
creating them again when deserializing.
Registering as virtual is the same but it can't be instanced.
<pre class=\\"cpp\\">ObjectTypeDB::register\_virtual\_type()
.. raw:: html
</pre>
Object derived classes can override a static function
``static void _bind_methods()``, when one class is registered, this
static function is called to register all the object methods,
properties, constants, etc. It's only called once. If an Object derived
class is instanced but has not been registered, it will be registered as
virtual automatically.
Inside ``_bind_methods``, there are a couple of things that can be done.
Registering functions is one:
<pre
class=\\"cpp\\">ObjectTypeDB::register\_method(\_MD (\\"methodname\\",\\"arg1name\\",\\"arg2name\\"),&MyCustethod);
.. raw:: html
</pre>
Default values for arguments can be passed in reverse order:
<pre
class=\\"cpp\\">ObjectTypeDB::register\_method(\_MD (\\"methodname\\",\\"arg1name\\",\\"arg2name\\"),&MyCustomType::method,DEFVAL (-1));
//default argument for arg2name
.. raw:: html
</pre>
``_MD`` is a macro that convers \\"methodname\\" to a stringname for
more efficiency. Argument names are used for instrospection, but when
compiling on release, the macro ignores them, so the strings are unused
and optimized away.
Check ``_bind_methods`` of Control or Object for more examples.
If just adding modules and functionality that is not expected to be
documented as throughly, the ``_MD()`` macro can safely be ignore and a
string passing the name can be passed for brevity.
References:
~~~~~~~~~~~
- \\\ `core/object\_type\_db.h\\ <https://github.com/okamstudio/godot/blob/master/core/object_type_db.h>`__
Constants
---------
Classes often have enums such as:
| <pre class=\\"cpp\\">
| enum SomeMode {
| MODE\_FIRST,
| MODE\_SECOND
| };
.. raw:: html
</pre>
For these to work when binding to methods, the enum must be declared
convertible to int, for this a macro is provided:
<pre class=\\"cpp\\">VARIANT\_ENUM\_CAST( MyClass::SomeMode); // now
functions that take SomeMode can be bound.
.. raw:: html
</pre>
The constants can also be bound inside ``_bind_methods``, by using:
| <pre class=\\"cpp\\">
| BIND\_CONSTANT( MODE\_FIRST );
| BIND\_CONSTANT( MODE\_SECOND );
.. raw:: html
</pre>
Properties (set/get)
--------------------
Objects export properties, properties are useful for the following:
- Serializing and deserializing the object.
- Creating a list of editable values for the Object derived class.
Properties are usually defined by the PropertyInfo() class. Usually
constructed as:
<pre
class=\\"cpp\\">PropertyInfo(type,name,hint,hint\_string,usage\_flags)
.. raw:: html
</pre>
For example:
<pre
class=\\"cpp\\">PropertyInfo(Variant::INT,\\"amount\\",PROPERTY\_HINT\_RANGE,\\"0,49,1\\",PROPERTY\_USAGE\_EDITOR)
.. raw:: html
</pre>
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 (edit value visually) but wont be serialized.
or
<pre
class=\\"cpp\\">PropertyInfo(Variant::STRING,\\"modes\\",PROPERTY\_HINT\_ENUM,\\"Enabled,Disabled,Turbo\\")
.. raw:: html
</pre>
This is a string property, can take any string but the editor will only
allow the defined hint ones. Since no hint flags were specified, the
default ones are PROPERTY\_USAGE\_STORAGE and PROPERTY\_USAGE\_EDITOR.
There are plenty of hints and usages available in object.h, give them a
check.
Properties can also work like C# properties and be accessed from script
using indexing, but ths usage is generally discouraged, as using
functions is preferred for legibility. Many properties are also bound
with categories, such as \\"animation/frame\\" which also make indexing
imposssible unless using operator [].
From ``_bind_methods()``, properties can be created and bound as long as
a set/get functions exist. Example:
<pre class=\\"cpp\\">ADD\_PROPERTY(
PropertyInfo(Variant::INT,\\"amount\\"), \_SCS (\\"set\_amount\\"),
\_SCS (\\"get\_amount\\") )
.. raw:: html
</pre>
This creates the property using the setter and the getter. ``_SCS`` is a
macro that creates a StringName efficiently.
Binding properties using ``_set``/``_get``/``_get_property_list``
-----------------------------------------------------------------
An additional method of creating properties exists when more flexibility
is desired (i.e. adding or removing properties on context):
The following functions can be overriden in an Object derived class,
they are NOT virtual, DO NOT make them virtual, they are called for
every override and the previous ones are not invalidated (multilevel
call).
| <pre class=\\"cpp\\">
| void \_get\_property\_info(List \*r\_props); //return list of
propertes
| bool \_get(const StringName& p\_property, Variany& r\_value) const;
//return true if property was found
| bool \_set(const StringName& p\_property, const Variany& p\_value);
//return true if property was found
.. raw:: html
</pre>
This is also a little less efficient since ``p_property`` must be
compared against the desired names in serial order.
Dynamic casting
---------------
Godot provides dynamic casting between Object Derived classes, for
example:
| <pre class=\\"cpp\\">
| void somefunc(Object \*some\_obj) {
| Button \* button = some\_obj->cast\_to&lt;Button&gt;();
| }
.. raw:: html
</pre>
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
on platforms where a very small binary size is ideal, such as HTML5 or
consoles (with low memory footprint).
Signals
-------
Objects can have a set of signals defined (similar to Delegates in other
languages). Connecting to them is rather easy:
| <pre class=\\"cpp\\">
| obj->connect(,target\_instance,target\_method)
| //for example
| obj->connect(\\"enter\_tree\\",this,\\"\_node\_entered\_tree\\")
.. raw:: html
</pre>
The method ``_node_entered_tree`` must be registered to the class using
``ObjectTypeDB::register_method`` (explained before).
Adding signals to a class is done in ``_bind_methods``, using the
``ADD_SIGNAL`` macro, for example:
<pre class=\\"cpp\\">ADD\_SIGNAL( MethodInfo(\\"been\_killed\\") )
.. raw:: html
</pre>
References
----------
Reference inherits from Object and holds a reference count. It is the
base for reference counted object types. Declaring them must be done
using Ref<> template. For example.
| <pre class=\\"cpp\\">
| class MyReference: public Reference {
| OBJ\_TYPE( MyReference ,Reference);
| };
Ref myref = memnew( MyReference );
.. raw:: html
</pre>
``myref`` is reference counted. It will be freed when no more Ref<>
templates point to it.
References:
~~~~~~~~~~~
- \\\ `core/reference.h\\ <https://github.com/okamstudio/godot/blob/master/core/reference.h>`__
Resources:
----------
Resource inherits from Reference, so all resources are reference
counted. Resources can optionally contain a path, which reference a file
on disk. This can be set with ``resource.set_path(path)``. This is
normally done by the resource loader though. No two different resources
can have the same path, attempt to do so will result in an error.
Resources without a path are fine too.
References:
~~~~~~~~~~~
- \\\ `core/resource.h\\ <https://github.com/okamstudio/godot/blob/master/core/resource.h>`__
Resource loading
----------------
Resources can be loaded with the ResourceLoader API, like this:
<pre class=\\"cpp\\">Ref res =
ResourceLoader::load(\\"res://someresource.res\\")
.. raw:: html
</pre>
If a reference to that resource has been loaded previously and is in
memory, the resource loader will return that reference. This means that
there can be only one resource loaded from a file referenced on disk at
the same time.
- resourceinteractiveloader (TODO)
References:
~~~~~~~~~~~
- \\\ `core/io/resource\_loader.h\\ <https://github.com/okamstudio/godot/blob/master/core/io/resource_loader.h>`__
Resource saving
---------------
Saving a resource can be done with the resource saver API:
<pre
class=\\"cpp\\">ResourceSaver::save(\\"res://someresource.res\\",instance)
.. raw:: html
</pre>
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
be bundled with the saved resource and assigned sub-IDs, like
\\"res://somereource.res::1\\". This also helps to cache them when
loaded.
References:
~~~~~~~~~~~
- \\\ `core/io/resource\_saver.h\\ <https://github.com/okamstudio/godot/blob/master/core/io/resource_saver.h>`__

View File

@@ -0,0 +1,434 @@
Services for iOS
================
At the moment, there are 2 iOS APIs partially implemented, GameCenter
and Storekit. Both use the same model of asynchronous calls explained
below.
Asynchronous methods
--------------------
When requesting an asynchronous operation, the method will look like
this:
::
Error purchase(Variant p_params);
The parameter will usually be a Dictionary, with the information
necessary to make the request, and the call will have 2 phases. First,
the method will immediately return an Error value. If the Error is not
'OK', the call operation is completed, with an error probably caused
locally (no internet connection, API incorrectly configured, etc). If
the error value is 'OK', a response event will be produced and added to
the 'pending events' queue. Example:
| <pre class=\\"python\\">
| func on\_purchase\_pressed():
| var result = InAppStore.purchase( { \\\ `product\_id\\ <>`__
\\"my\_product\\" } )
| if result == OK:
| animation.play(\\"busy\\") # show the \\"waiting for response\\"
animation
| else:
| show\_error()
| # put this on a 1 second timer or something
| func check\_events():
| while InAppStore.get\_pending\_event\_count() > 0:
| var event = InAppStore.pop\_pending\_event()
| if event.type \\"purchase\\":
if event.result \\\ `ok\\ <>`__
| show\_success(event.product\_id)
| else:
| show\_error()
.. raw:: html
</pre>
Remember that when a call returns OK, the API will *always* produce an
event through the pending\_event interface, even if it's an error, or a
network timeout, etc. You should be able to, for example, safely block
the interface waiting for a reply from the server. If any of the APIs
don't behave this way it should be treated as a bug.
The pending event interface consists of 2 methods:
- ``get_pending_event_count()``
Returns the number of pending events on the queue.
- ``Variant pop_pending_event()``
Pops the first event from the queue and returns it.
Store Kit
---------
Implemented in platform/iphone/in\_app\_store.mm
The Store Kit API is accessible through the \\"InAppStore\\" singleton
(will always be available from gdscript). It is initialized
automatically. It has 2 methods for purchasing:
- ``Error purchase(Variant p_params);``
- ``Error request_product_info(Variant p_params);``
and the pending\_event interface
::
int get_pending_event_count();
Variant pop_pending_event();
purchase
~~~~~~~~
Purchases a product id through the Store Kit API.
Parameters
^^^^^^^^^^
Takes a Dictionary as a parameter, with one field, ``product_id``, a
string with your product id. Example:
::
var result = InAppStore.purchase( { \"product_id\": \"my_product\" } )
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
On error:
::
{
\"type\": \"purchase\",
\"result\": \"error\",
\"product_id\": \"the product id requested\"
}
On success:
::
{
\"type\": \"purchase\",
\"result\": \"ok\",
\"product_id\": \"the product id requested\"
}
request\_product\_info
~~~~~~~~~~~~~~~~~~~~~~
Requests the product info on a list of product IDs.
Parameters
^^^^^^^^^^
Takes a Dictionary as a parameter, with one field, ``product_ids``, a
string array with a list of product ids. Example:
::
var result = InAppStore.request_product_info( { \"product_ids\": [\"my_product1\", \"my_product2\"] } )
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
::
{
\"type\": \"product_info\",
\"result\": \"ok\",
\"invalid_ids\": [ list of requested ids that were invalid ],
\"ids\": [ list of ids that were valid ],
\"titles\": [ list of valid product titles (corresponds with list of valid ids) ],
\"descriptions\": [ list of valid product descriptions ] ,
\"prices\": [ list of valid product prices ],
\"localized_prices\": [ list of valid product localized prices ],
}
Game Center
-----------
Implemented in platform/iphone/game\_center.mm
The Game Center API is available through the \\"GameCenter\\" singleton.
It has 6 methods:
- ``Error post_score(Variant p_score);``
- ``Erroraward_achievement(Variant p_params);``
- ``Error reset_achievements();``
- ``Error request_achievements();``
- ``Error request_achievement_descriptions();``
- ``Error show_game_center(Variant p_params);``
plus the standard pending event interface.
post\_score
~~~~~~~~~~~
Posts a score to a Game Center leaderboard.
Parameters
^^^^^^^^^^
Takes a Dictionary as a parameter, with 2 fields:
- ``score`` a float number
- ``category`` a string with the category name
Example:
::
var result = GameCenter.post_score( { \"value\": 100, \"category\": \"my_leaderboard\", } )
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
On error:
::
{
\"type\": \"post_score\",
\"result\": \"error\",
\"error_code\": the value from NSError::code,
\"error_description\": the value from NSError::localizedDescription,
}
On success:
::
{
\"type\": \"post_score\",
\"result\": \"ok\",
}
award\_achievement
~~~~~~~~~~~~~~~~~~
Modifies the progress of a Game Center achievement.
Parameters
^^^^^^^^^^
Takes a Dictionary as a parameter, with 3 fields:
- ``name`` (string) the achievement name
- ``progress`` (float) the achievement progress from 0.0 to 100.0
(passed to ``GKAchievement::percentComplete``)
- ``show_completion_banner`` (bool) whether Game Center should display
an achievement banner at the top of the screen
Example:
::
var result = award_achievement( { \"name\": \"hard_mode_completed\", \"progress\": 6.1 } )
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
On error:
::
{
\"type\": \"award_achievement\",
\"result\": \"error\",
\"error_code\": the error code taken from NSError::code,
}
On success:
::
{
\"type\": \"award_achievement\",
\"result\": \"ok\",
}
reset\_achievements
~~~~~~~~~~~~~~~~~~~
Clears all Game Center achievements. The function takes no parameters.
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
On error:
::
{
\"type\": \"reset_achievements\",
\"result\": \"error\",
\"error_code\": the value from NSError::code
}
On success:
::
{
\"type\": \"reset_achievements\",
\"result\": \"ok\",
}
request\_achievements
~~~~~~~~~~~~~~~~~~~~~
Request all the Game Center achievements the player has made progress
on. The function takes no parameters.
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
On error:
::
{
\"type\": \"achievements\",
\"result\": \"error\",
\"error_code\": the value from NSError::code
}
On success:
::
{
\"type\": \"achievements\",
\"result\": \"ok\",
\"names\": [ list of the name of each achievement ],
\"progress\": [ list of the progress made on each achievement ]
}
request\_achievement\_descriptions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Request the descriptions of all existing Game Center achievements
regardless of progress. The function takes no parameters.
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
On error:
::
{
\"type\": \"achievement_descriptions\",
\"result\": \"error\",
\"error_code\": the value from NSError::code
}
On success:
::
{
\"type\": \"achievement_descriptions\",
\"result\": \"ok\",
\"names\": [ list of the name of each achievement ],
\"titles\": [ list of the title of each achievement ]
\"unachieved_descriptions\": [ list of the description of each achievement when it is unachieved ]
\"achieved_descriptions\": [ list of the description of each achievement when it is achieved ]
\"maximum_points\": [ list of the points earned by completing each achievement ]
\"hidden\": [ list of booleans indicating whether each achievement is initially visible ]
\"replayable\": [ list of booleans indicating whether each achievement can be earned more than once ]
}
show\_game\_center
~~~~~~~~~~~~~~~~~~
Displays the built in Game Center overlay showing leaderboards,
achievements, and challenges.
Parameters
^^^^^^^^^^
Takes a Dictionary as a parameter, with 2 fields:
- ``view`` (string) (optional) the name of the view to present. Accepts
\\"default\\", \\"leaderboards\\", \\"achievements\\", or
\\"challenges\\". Defaults to \\"default\\".
- ``leaderboard_name`` (string) (optional) the name of the leaderboard
to present. Only used when \\"view\\" is \\"leaderboards\\" (or
\\"default\\" is configured to show leaderboards). If not specified,
Game Center will display the aggregate leaderboard.
Examples:
::
var result = show_game_center( { \"view\": \"leaderboards\", \"leaderboard_name\": \"best_time_leaderboard\" } )
var result = show_game_center( { \"view\": \"achievements\" } )
Response event
^^^^^^^^^^^^^^
The response event will be a dictionary with the following fields:
On close:
::
{
\"type\": \"show_game_center\",
\"result\": \"ok\",
}
Multi-platform games
--------------------
When working on a multi-platform game, you won't always have the
\\"GameCenter\\" singleton available (for example when running on PC or
Android). Because the gdscript compiler looks up the singletons at
compile time, you can't just query the singletons to see and use what
you need inside a conditional block, you need to also define them as
valid identifiers (local variable or class member). This is an example
of how to work around this in a class:
| <pre class=\\"python\\">
| var GameCenter = null # define it as a class member
| func post\_score(p\_score):
| if GameCenter == null:
| return
| GameCenter.post\_score( { \\\ `value\\ <>`__ p\_score,
\\\ `category\\ <>`__ \\"my\_leaderboard\\" } )
| func check\_events():
| while GameCenter.get\_pending\_event\_count() > 0:
| # do something with events here
| pass
| func \_ready():
| # check if the singleton exists
| if Globals.has\_singleton(\\"GameCenter\\"):
| GameCenter = Globals.get\_singleton(\\"GameCenter\\")
| # connect your timer here to the \\"check\_events\\" function
.. raw:: html
</pre>

View File

@@ -0,0 +1,60 @@
Variant class
=============
About
-----
Variant is the most important datatype of Godot, it's the most important
class in the engine. A Variant takes up only 20 bytes and can store
almost any engine datatype inside of it. Variants are rarely used to
hold information for long periods of time, instead they are used mainly
for communication, editing, serialization and generally moving data
around.
A Variant can:
- Store almost any datatype
- Perform operations between many variants (GDScript uses Variant as
it's atomic/native datatype).
- Be hashed, so it can be compared quickly to over variants
- Be used to convert safely between datatypes
- Be used to abstract calling methods and their arguments (Godot
exports all it's functions through variants)
- Be used to defer calls or move data between threads.
- Be serialized as binary and stored to disk, or transfered via
network.
- Be serialized to text and use it for printing values and editable
settings.
- Work as an exported property, so the editor can edit it universally.
- Be used for dictionaries, arrays, parsers, etc.
Basically, thanks to the Variant class, writing Godot itself was a much,
much easier task, as it allows for highly dynamic constructs not common
of c++ with little effort. Become a friend of Variant today.
References:
~~~~~~~~~~~
- \\\ `core/variant.h\\ <https://github.com/okamstudio/godot/blob/master/core/variant.h>`__
Dictionary and Array
--------------------
Both are implemented using variants. A Dictionary can match any datatype
used as key to any other datatype. An Array just holds an array of
Variants. Of course, a Variant can also hold a Dictionary and an Array
inside, making it even more flexible.
Both have a shared mode and a COW mode. Scripts often use them in shared
mode (meaning modifications to a container will modify all references to
it), or COW mode (modifications will always alter the local copy, making
a copy of the internal data if necessary, but will not affect the other
copies). In COW mode, Both Dictionary and Array are thread-safe,
otherwise a Nutex should be created to lock if multi thread access is
desired.
References:
~~~~~~~~~~~
- \\\ `core/dictionary.h\\ <https://github.com/okamstudio/godot/blob/master/core/dictionary.h>`__
- \\\ `core/array.h\\ <https://github.com/okamstudio/godot/blob/master/core/array.h>`__

View File

@@ -0,0 +1,8 @@
General
=======
.. toctree::
:maxdepth: 1
:name: general
managing_image_files

8
asset_pipeline/index.rst Normal file
View File

@@ -0,0 +1,8 @@
Asset pipeline
==============
.. toctree::
:maxdepth: 2
:name: asset-pipeline
general

View File

@@ -0,0 +1,113 @@
Managing image files
====================
If you have read the previous tutorials on [[Resources]] and [[File
System]], at this point you know that regular image files (.png, .jpg,
etc) are treated as regular resources in Godot.
Unlike texture resources (.tex files), image files contain no extra
information on tiling (texture repeat), mipamps or filtering. Editing
this information and saving the texture back will have not any effect,
since such formats can't contain that information.
Image loader
------------
Loading of images is done by the image loader. The behavior of the
loader for all image files can be changed in the Project Settings dialog
(Scene -> Project Settings). There is a section with values that
correspond to the every image file when loaded:
.. image:: /img/imgloader.png
Image loader options
--------------------
Filter
~~~~~~
Filter is used when the image is stretched more than it's original size,
so a texel in the image is bigger than a pixel on the screen. Turning
off the fiter produces a retro-like look:
.. image:: /img/imagefilter.png
Repeat
~~~~~~
Repeat is mainly used for 3D textures, so it's off by default (textures
are imported with the scenes and usually are not in the project as image
files). When using UV coordinates (something not as common in 2D), and
the UV value goes beyond the 0,0,1,1 rect, the texture repeats instead
of clamping to the edge.
Mipmaps
~~~~~~~
When the mipmaps option is enabled, Godot will generate mip-maps.
Mipmaps are versions of the image shrunk by half in both axis,
recursively, until the image is 1 pixel of size. When the 3D hardware
needs to shrink the image, it finds the largest mipmap it can scale
from, and scales from there. This improves performance and image
quality.
.. image:: /img/mipmaps.png
When Mip-Maps are disabled, images start distorting badly when shrunk
excessively:
.. image:: /img/imagemipmap.png
Alpha blending
~~~~~~~~~~~~~~
The \\\ `blending
equation\\ <http://en.wikipedia.org/wiki/Alpha_compositing>`__ used by
applications like Photoshop is too complex for real-time. There are
better approximations such as \\\ `pre-multiplied
alpha\\ <http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx?Redirected=true>`__,
but they impose more stress in the asset pipeline. In the end, we are
left with textures that have artifacts in the edges, because apps such
as Photoshop store white pixels in completely transparent areas. Such
white pixels end up showing thanks to the texture filter (when active).
Godot has an option to fix the edges of the image (by painting invisible
pixels the same color as the visible neighbours):
.. image:: /img/fixedborder.png
To do this, open the image from the resources tab, or edit it from the
property editor from another node or resource, then go to the object
options and select \\"Fix Border Alpha\\", then save it.
.. image:: /img/imagefixalpha.png
Since fixing this in so many images can be a little annoying, both
Texture Import and Image Export can also perform this operation.
Texture import
~~~~~~~~~~~~~~
Sometimes, it might be desired to change the above settings per image.
Unfortunately, the image loader settings are global. Texture flags also
can't be saved in a regular .png or .jpg file.
For such cases, the image can be imported as a texture (.tex), where the
individual flags can be changed. Godot also keeps track of the original
file and will re-import if it changes.
Importing also allows conversion to other formats (WebP, or RAM
compression) which might be of use in some cases. . More information on
the [[Importing textures]] page.
Image export
~~~~~~~~~~~~
It is also possible to convert images to other formats (WebP or RAM
compression) on export, as well as instructing the exporter to create an
Atlas for a set of images. It is also possible to ask the exporter to
scale all images (or selected groups).
More information on the [[Exporting images]] page.

View File

@@ -0,0 +1,82 @@
Dictionary
==========
**Category:** Built-In Types
----------------------------
Brief Description
-----------------
Dictionary type.
Member Functions
----------------
- void **`clear <#clear>`__** **(** **)**
- `bool <class_bool>`__ **`empty <#empty>`__** **(** **)**
- void **`erase <#erase>`__** **(** var value **)**
- `bool <class_bool>`__ **`has <#has>`__** **(** var value **)**
- `int <class_int>`__ **`hash <#hash>`__** **(** **)**
- `Array <class_array>`__ **`keys <#keys>`__** **(** **)**
- `int <class_int>`__ **`parse\_json <#parse_json>`__** **(**
`String <class_string>`__ json **)**
- `int <class_int>`__ **`size <#size>`__** **(** **)**
- `String <class_string>`__ **`to\_json <#to_json>`__** **(** **)**
Description
-----------
Dictionary type. Associative container which contains values referenced
by unique keys. Dictionaries are always passed by reference.
Member Function Description
---------------------------
clear
~~~~~
- void **clear** **(** **)**
Clear the dictionary, removing all key/value pairs.
empty
~~~~~
- `bool <class_bool>`__ **empty** **(** **)**
Return true if the dictionary is empty.
erase
~~~~~
- void **erase** **(** var value **)**
Erase a dictionary key/value pair by key.
has
~~~
- `bool <class_bool>`__ **has** **(** var value **)**
Return true if the dictionary has a given key.
hash
~~~~
- `int <class_int>`__ **hash** **(** **)**
Return a hashed integer value representing the dictionary contents.
keys
~~~~
- `Array <class_array>`__ **keys** **(** **)**
Return the list of keys in the dictionary.
size
~~~~
- `int <class_int>`__ **size** **(** **)**
Return the size of the dictionary (in pairs).

251
conf.py
View File

@@ -1,258 +1,67 @@
# -*- coding: utf-8 -*-
#
# Godot Engine documentation build configuration file, created by
# sphinx-quickstart on Sat Dec 12 16:57:47 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# Godot Engine documentation build configuration file
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
needs_sphinx = '1.3'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
# Sphinx extension module names and templates location
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
# You can specify multiple suffix as a list of string: ['.rst', '.md']
source_suffix = '.rst'
source_encoding = 'utf-8-sig'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
# The master toctree document
master_doc = 'index'
# General information about the project.
project = u'Godot Engine'
copyright = u'2015, Juan Linietsky, Ariel Manzur and the Godot community'
# General information about the project
project = 'Godot Engine'
copyright = '2014-2016, Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0)'
author = 'Juan Linietsky, Ariel Manzur and the Godot community'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '2.0'
# The full version, including alpha/beta/rc tags.
release = '2.0'
# Version info for the project, acts as replacement for |version| and |release|
# The short X.Y version
version = 'latest'
# The full version, including alpha/beta/rc tags
release = 'latest'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
language = 'en'
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
# Pygments (syntax highlighting) style to use
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
if not on_rtd: # only import and set the theme if we're building docs locally
import sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
# Output file base name for HTML help builder
htmlhelp_basename = 'GodotEnginedoc'
# -- Options for reStructuredText parser ----------------------------------
# Enable directives that insert the contents of external files
file_insertion_enabled = False
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'GodotEngine.tex', u'Godot Engine Documentation',
u'Juan Linietsky, Ariel Manzur and the Godot community', 'manual'),
(master_doc, 'GodotEngine.tex', 'Godot Engine Documentation',
'Juan Linietsky, Ariel Manzur and the Godot community', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'godotengine', u'Godot Engine Documentation',
[u'Juan Linietsky, Ariel Manzur and the Godot community'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'GodotEngine', u'Godot Engine Documentation',
u'Juan Linietsky, Ariel Manzur and the Godot community', 'GodotEngine', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False

BIN
img/andtemplates.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
img/fixedborder.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
img/imagefilter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
img/imagefixalpha.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
img/imagemipmap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
img/imgloader.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
img/lintemplates.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
img/mipmaps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
img/wintemplates.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -6,17 +6,22 @@
Welcome to Godot Engine's documentation!
========================================
Contents:
The main documentation for the site is organized into a couple sections:
* :ref:`user-doc`
.. toctree::
:maxdepth: 2
:maxdepth: 3
:caption: User documentation
:name: user-doc
asset_pipeline/index
advanced_topics/index
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
.. Indices and tables
.. ------------------
..
.. * :ref:`genindex`
.. * :ref:`modindex`
.. * :ref:`search`