瀏覽代碼

Split C++ (godot-cpp) and GDExtension system info into separate categories, children of Scripting.

Lukas Tenbrink 5 月之前
父節點
當前提交
028abe15d1

+ 3 - 2
_tools/redirects/redirects.csv

@@ -399,8 +399,9 @@ source,destination
 /tutorials/plugins/gdnative/gdnative-c-example.html,/tutorials/scripting/gdnative/gdnative_c_example.html
 /tutorials/plugins/gdnative/gdnative-cpp-example.html,/tutorials/scripting/gdnative/gdnative_cpp_example.html
 /tutorials/plugins/gdnative/index.html,/tutorials/scripting/gdnative/index.html
-/tutorials/scripting/gdnative/gdnative_c_example.html,/tutorials/plugins/gdextension/gdextension_cpp_example.html
-/tutorials/scripting/gdnative/gdnative_cpp_example.html,/tutorials/plugins/gdextension/gdextension_cpp_example.html
+/tutorials/plugins/gdextension/gdextension_cpp_example.html,/tutorials/plugins/cpp/gdextension_cpp_example.html
+/tutorials/scripting/gdnative/gdnative_c_example.html,/tutorials/plugins/cpp/gdextension_cpp_example.html
+/tutorials/scripting/gdnative/gdnative_cpp_example.html,/tutorials/plugins/cpp/gdextension_cpp_example.html
 /tutorials/scripting/gdnative/index.html,/tutorials/scripting/gdextension/index.html
 /tutorials/scripting/gdnative/what_is_gdnative.html,/tutorials/scripting/gdnative/what_is_gdextension.html
 /tutorials/shading/advanced_postprocessing.html,/tutorials/shaders/advanced_postprocessing.html

+ 1 - 1
about/docs_changelog.rst

@@ -84,7 +84,7 @@ GDExtension
 ~~~~~~~~~~~
 
 - :ref:`doc_gdextension_file`
-- :ref:`doc_gdextension_docs_system`
+- :ref:`doc_godot_cpp_docs_system`
 
 Migrating
 ~~~~~~~~~

+ 1 - 1
classes/class_gdextension.rst

@@ -30,7 +30,7 @@ Tutorials
 
 - :doc:`GDExtension overview <../tutorials/scripting/gdextension/what_is_gdextension>`
 
-- :doc:`GDExtension example in C++ <../tutorials/scripting/gdextension/gdextension_cpp_example>`
+- :doc:`GDExtension example in C++ <../tutorials/scripting/cpp/gdextension_cpp_example>`
 
 .. rst-class:: classref-reftable-group
 

+ 1 - 1
classes/class_gdextensionmanager.rst

@@ -30,7 +30,7 @@ Tutorials
 
 - :doc:`GDExtension overview <../tutorials/scripting/gdextension/what_is_gdextension>`
 
-- :doc:`GDExtension example in C++ <../tutorials/scripting/gdextension/gdextension_cpp_example>`
+- :doc:`GDExtension example in C++ <../tutorials/scripting/cpp/gdextension_cpp_example>`
 
 .. rst-class:: classref-reftable-group
 

+ 1 - 1
tutorials/platform/android/android_plugin.rst

@@ -231,7 +231,7 @@ At build time, the contents of the ``export_scripts_template`` directory as well
 Packaging a v2 Android plugin with GDExtension capabilities
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-For GDExtension, we follow the same steps as for `Packaging a v2 Android plugin`_ and add the `GDExtension config file <https://docs.godotengine.org/en/stable/tutorials/scripting/gdextension/gdextension_cpp_example.html#using-the-gdextension-module>`_ in
+For GDExtension, we follow the same steps as for `Packaging a v2 Android plugin`_ and add the `GDExtension config file <https://docs.godotengine.org/en/stable/tutorials/scripting/cpp/gdextension_cpp_example.html#using-the-gdextension-module>`_ in
 the same location as ``plugin.cfg``.
 
 For reference, here is the `folder structure for the GDExtension Android plugin project template <https://github.com/m4gr3d/GDExtension-Android-Plugin-Template/tree/main/plugin/export_scripts_template>`_.

+ 96 - 0
tutorials/scripting/cpp/about_godot_cpp.rst

@@ -0,0 +1,96 @@
+.. _doc_about_godot_cpp:
+
+About godot-cpp
+===============
+
+`godot-cpp <https://github.com/godotengine/godot-cpp>`__ are the official C++ GDExtension bindings, maintained
+as part of the Godot project.
+
+godot-cpp is built with the :ref:`GDExtension system <doc_gdextension>`, which allows access to Godot in almost the
+same way as :ref:`modules <doc_custom_modules_in_cpp>`: A lot of `engine code <https://github.com/godotengine/godot>`__
+can be used in your godot-cpp project almost exactly as it is.
+
+In particular, godot-cpp has access to all functions that :ref:`GDScript <doc_gdscript>` and :ref:`C# <doc_c_sharp>`
+have, and additional access to a few more for fast low-level access of data, or deeper integration with Godot.
+
+Differences between godot-cpp and C++ modules
+---------------------------------------------
+
+You can use both `godot-cpp <https://github.com/godotengine/godot-cpp>`__
+and :ref:`C++ modules <doc_custom_modules_in_cpp>` to run C or C++ code in a Godot project.
+
+They also both allow you to integrate third-party libraries into Godot. The one
+you should choose depends on your needs.
+
+.. warning::
+
+    godot-cpp is currently *experimental*, which means that we may
+    break compatibility in order to fix major bugs or include critical features.
+
+
+Advantages of godot-cpp
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Unlike modules, godot-cpp (and GDExtensions, in general) don't require
+compiling the engine's source code, making it easier to distribute your work.
+It gives you access to most of the API available to GDScript and C#, allowing
+you to code game logic with full control regarding performance. It's ideal if
+you need high-performance code you'd like to distribute as an add-on in the
+:ref:`asset library <doc_what_is_assetlib>`.
+
+Also:
+
+- You can use the same compiled godot-cpp library in the editor and exported
+  project. With C++ modules, you have to recompile all the export templates you
+  plan to use if you require its functionality at runtime.
+- godot-cpp only requires you to compile your library, not the whole engine.
+  That's unlike C++ modules, which are statically compiled into the engine.
+  Every time you change a module, you need to recompile the engine. Even with
+  incremental builds, this process is slower than using godot-cpp.
+
+Advantages of C++ modules
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We recommend :ref:`C++ modules <doc_custom_modules_in_cpp>` in cases where
+godot-cpp (or another GDExtension system) isn't enough:
+
+- C++ modules provide deeper integration into the engine. GDExtension's access
+  is not as deep as static modules.
+- You can use C++ modules to provide additional features in a project without
+  carrying native library files around. This extends to exported projects.
+
+.. note::
+
+    If you notice that specific systems are not accessible via godot-cpp
+    but are via custom modules, feel free to open an issue on the
+    `godot-cpp repository <https://github.com/godotengine/godot-cpp>`__
+    to discuss implementation options for exposing the missing functionality.
+
+.. _doc_what_is_gdextension_version_compatibility:
+
+Version compatibility
+---------------------
+
+Usually, GDExtensions targeting an earlier version of Godot will work in later
+minor versions, but not vice-versa. For example, a GDExtension targeting Godot 4.2
+should work just fine in Godot 4.3, but one targeting Godot 4.3 won't work in Godot 4.2.
+
+For this reason, when creating GDExtensions, you may want to target the lowest version of
+Godot that has the features you need, *not* the most recent version of Godot. This can
+save you from needing to create multiple builds for different versions of Godot.
+
+However, GDExtension is currently *experimental*, which means that we may
+break compatibility in order to fix major bugs or include critical features.
+For example, GDExtensions created for Godot 4.0 aren't compatible with Godot
+4.1 (see :ref:`updating_your_gdextension_for_godot_4_1`).
+
+GDExtensions are also only compatible with engine builds that use the same
+level of floating-point precision the extension was compiled for. This means
+that if you use an engine build with double-precision floats, the extension must
+also be compiled for double-precision floats and use an ``extension_api.json``
+file generated by your custom engine build. See :ref:`doc_large_world_coordinates`
+for details.
+
+Generally speaking, if you build a custom version of Godot, you should generate an
+``extension_api.json`` from it for your GDExtensions, because it may have some differences
+from official Godot builds.

+ 0 - 0
tutorials/scripting/gdextension/files/cpp_example/SConstruct → tutorials/scripting/cpp/files/cpp_example/SConstruct


+ 31 - 19
tutorials/scripting/gdextension/gdextension_cpp_example.rst → tutorials/scripting/cpp/gdextension_cpp_example.rst

@@ -1,29 +1,38 @@
-.. _doc_gdextension_cpp_example:
+.. _doc_godot_cpp_getting_started:
 
-GDExtension C++ example
-=======================
+Getting started
+===============
 
-Introduction
-------------
+Workflow overview
+-----------------
+
+As a GDExtension, godot-cpp is more complicated to use than :ref:`GDScript <doc_gdscript>` and :ref:`C# <doc_c_sharp>`.
+If you decide to work with it, here's what to expect your workflow to look like:
 
-The C++ bindings for GDExtension are built on top of the C GDExtension API
-and provide a nicer way to "extend" nodes and other built-in classes in Godot using C++.
-This new system allows the extension of Godot to nearly the same
-level as statically linked C++ modules.
+* Create a new godot-cpp project (from the `template <https://github.com/godotengine/godot-cpp-template>`__, or from scratch, as explained below).
+* Develop your code with your :ref:`favorite IDE <toc-devel-configuring_an_ide>` locally.
+* Build and test your code with the earliest compatible Godot version.
+* Create builds for all platforms you want to support (e.g. using `GitHub Actions <https://github.com/godotengine/godot-cpp-template/blob/main/.github/workflows/builds.yml>`__).
+* Optional: Publish on the `Godot Asset Library <https://godotengine.org/asset-library/asset>`__.
 
-You can download the included example in the test folder of the godot-cpp
-repository `on GitHub <https://github.com/godotengine/godot-cpp>`__.
+Example project
+---------------
+
+For your first godot-cpp project, we recommend starting with this guide to understand the technology involved with
+godot-cpp. After you're done, you can use the `godot-cpp template <https://github.com/godotengine/godot-cpp-template>`__,
+which has better coverage of features, such as a GitHub action pipeline and useful ``SConstruct`` boilerplate code.
+However, the template does not explain itself to a high level of detail, which is why we recommend going through this
+guide first.
 
 Setting up the project
 ----------------------
 
 There are a few prerequisites you'll need:
 
-- a Godot 4 executable,
-- a C++ compiler,
-- SCons as a build tool,
-- a copy of the `godot-cpp
-  repository <https://github.com/godotengine/godot-cpp>`__.
+- A Godot 4 executable.
+- A C++ compiler.
+- SCons as a build tool.
+- A copy of the `godot-cpp repository <https://github.com/godotengine/godot-cpp>`__.
 
 See also :ref:`Configuring an IDE <toc-devel-configuring_an_ide>`
 and :ref:`Compiling <toc-devel-compiling>` as the build tools are identical
@@ -712,6 +721,9 @@ Every second, we output our position to the console.
 Next steps
 ----------
 
-We hope the above example showed you the basics. You can
-build upon this example to create full-fledged scripts to control nodes in Godot
-using C++.
+We hope the above example showed you the basics. You can build upon this example to create full-fledged scripts
+to control nodes in Godot using C++!
+
+Instead of basing your project off the above example setup, we recommend to restart now by cloning the
+`godot-cpp template <https://github.com/godotengine/godot-cpp-template>`__, and base your project off of that.
+It has better coverage of features, such as a GitHub build action and additional useful ``SConstruct`` boilerplate.

+ 4 - 4
tutorials/scripting/gdextension/gdextension_docs_system.rst → tutorials/scripting/cpp/gdextension_docs_system.rst

@@ -1,7 +1,7 @@
-.. _doc_gdextension_docs_system:
+.. _doc_godot_cpp_docs_system:
 
-GDExtension documentation system
-================================
+Adding documentation
+====================
 
 .. note::
 
@@ -15,7 +15,7 @@ XML files (one per class) to document the exposed constructors, properties, meth
 
 .. note::
 
-    We are assuming you are using the project files explained in the :ref:`GDExtension C++ Example <doc_gdextension_cpp_example>`
+    We are assuming you are using the project files explained in the :ref:`example project <doc_godot_cpp_getting_started>`
     with the following structure:
 
 .. code-block:: none

+ 0 - 0
tutorials/scripting/gdextension/img/gdextension_cpp_animated.webm → tutorials/scripting/cpp/img/gdextension_cpp_animated.webm


+ 0 - 0
tutorials/scripting/gdextension/img/gdextension_cpp_nodes.webp → tutorials/scripting/cpp/img/gdextension_cpp_nodes.webp


+ 0 - 0
tutorials/scripting/gdextension/img/gdextension_cpp_sprite.webp → tutorials/scripting/cpp/img/gdextension_cpp_sprite.webp


+ 0 - 0
tutorials/scripting/gdextension/img/gdextension_docs_generation.webp → tutorials/scripting/cpp/img/gdextension_docs_generation.webp


+ 17 - 0
tutorials/scripting/cpp/index.rst

@@ -0,0 +1,17 @@
+:allow_comments: False
+
+.. _doc_godot_cpp:
+
+C++ (godot-cpp)
+===============
+
+This section documents `godot-cpp <https://github.com/godotengine/godot-cpp>`__,
+the official C++ GDExtension bindings maintained as part of the Godot project.
+
+.. toctree::
+   :maxdepth: 1
+   :name: toc-tutorials-godot-cpp
+
+   about_godot_cpp
+   gdextension_cpp_example
+   gdextension_docs_system

+ 1 - 1
tutorials/scripting/gdextension/gdextension_c_example.rst

@@ -2148,5 +2148,5 @@ quite straightforward and not very verbose.
 
 If you want to create actual extensions, it is preferred to use the C++ bindings
 instead, as it takes away all of the boilerplate from your code. Check the
-:ref:`GDExtension C++ example <doc_gdextension_cpp_example>` to see how you can
+:ref:`godot-cpp documentation <doc_godot_cpp>` to see how you can
 do this.

+ 1 - 1
tutorials/scripting/gdextension/gdextension_file.rst

@@ -9,7 +9,7 @@ Introduction
 The ``.gdextension`` file in your project contains the instructions for how to load
 the GDExtension. The instructions are separated into specific sections. This page
 should give you a quick overview of the different options available to you. For an introduction
-how to get started with GDExtensions take a look at the :ref:`GDExtension C++ Example <doc_gdextension_cpp_example>`.
+how to get started with C++ (godot-cpp), take a look at the :ref:`GDExtension C++ Example <doc_godot_cpp_getting_started>`.
 
 Configuration section
 ---------------------

+ 18 - 6
tutorials/scripting/gdextension/index.rst

@@ -1,14 +1,26 @@
 :allow_comments: False
 
-GDExtension
-===========
+.. _doc_gdextension:
+
+The GDExtension system
+======================
+
+**GDExtension** is a Godot-specific technology that lets the engine interact with
+native `shared libraries <https://en.wikipedia.org/wiki/Library_(computing)#Shared_libraries>`__
+at runtime. You can use it to run native code without compiling it with the engine.
+
+.. note:: GDExtension is *not* a scripting language and has no relation to
+          :ref:`GDScript <doc_gdscript>`.
+
+This section describes how GDExtension works, and is generally aimed at people wanting to make a GDExtension from
+scratch, for example to create language bindings. If you want to use existing language bindings, please refer to other
+articles instead, such as the articles about :ref:`C++ (godot-cpp) <doc_godot_cpp>` or one of the
+:ref:`community-made ones <doc_what_is_gdnative_third_party_bindings>`.
 
 .. toctree::
    :maxdepth: 1
-   :name: toc-tutorials-gdnative
+   :name: toc-tutorials-gdextension
 
    what_is_gdextension
-   gdextension_cpp_example
-   gdextension_c_example
    gdextension_file
-   gdextension_docs_system
+   gdextension_c_example

+ 7 - 117
tutorials/scripting/gdextension/what_is_gdextension.rst

@@ -3,130 +3,20 @@
 What is GDExtension?
 ====================
 
-Introduction
-------------
-
 **GDExtension** is a Godot-specific technology that lets the engine interact with
 native `shared libraries <https://en.wikipedia.org/wiki/Library_(computing)#Shared_libraries>`__
 at runtime. You can use it to run native code without compiling it with the engine.
 
-.. note:: GDExtension is *not* a scripting language and has no relation to
-          :ref:`GDScript <doc_gdscript>`.
-
-Differences between GDExtension and C++ modules
------------------------------------------------
-
-You can use both GDExtension and :ref:`C++ modules <doc_custom_modules_in_cpp>` to
-run C or C++ code in a Godot project.
-
-They also both allow you to integrate third-party libraries into Godot. The one
-you should choose depends on your needs.
-
-.. warning::
-
-    GDExtension is currently *experimental*, which means that we may
-    break compatibility in order to fix major bugs or include critical features.
-
-Advantages of GDExtension
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Unlike modules, GDExtension doesn't require compiling the engine's source code,
-making it easier to distribute your work. It gives you access to most of the API
-available to GDScript and C#, allowing you to code game logic with full control
-regarding performance. It's ideal if you need high-performance code you'd like
-to distribute as an add-on in the :ref:`asset library <doc_what_is_assetlib>`.
-
-Also:
-
-- GDExtension is not limited to C and C++. Thanks to :ref:`third-party bindings
-  <doc_what_is_gdnative_third_party_bindings>`, you can use it with many other
-  languages.
-- You can use the same compiled GDExtension library in the editor and exported
-  project. With C++ modules, you have to recompile all the export templates you
-  plan to use if you require its functionality at runtime.
-- GDExtension only requires you to compile your library, not the whole engine.
-  That's unlike C++ modules, which are statically compiled into the engine.
-  Every time you change a module, you need to recompile the engine. Even with
-  incremental builds, this process is slower than using GDExtension.
-
-Advantages of C++ modules
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-We recommend :ref:`C++ modules <doc_custom_modules_in_cpp>` in cases where
-GDExtension isn't enough:
-
-- C++ modules provide deeper integration into the engine. GDExtension's access
-  is not as deep as static modules.
-- You can use C++ modules to provide additional features in a project without
-  carrying native library files around. This extends to exported projects.
-
-.. note::
-
-    If you notice that specific systems are not accessible via GDExtension
-    but are via custom modules, feel free to open an issue on the
-    `godot-cpp repository <https://github.com/godotengine/godot-cpp>`__
-    to discuss implementation options for exposing the missing functionality.
+There are three primary methods with which this is achieved:
 
-Supported languages
--------------------
+* ``gdextension_interface.h``: A set of C functions that Godot and a GDExtension can use to communicate.
+* ``extension_api.json``: A list of C functions that are exposed from Godot APIs (:ref:`Core Features <doc_scripting_core_features>`).
+* :ref:`*.gdextension <doc_gdextension_file>`: A file format read by Godot to load a GDExtension.
 
-The Godot developers officially support the following language bindings for
-GDExtension:
-
-- C++ :ref:`(tutorial) <doc_gdextension_cpp_example>`
-
-.. note::
-
-    There are no plans to support additional languages with GDExtension officially.
-    That said, the community offers several bindings for other languages (see
-    below).
-
-.. _doc_what_is_gdnative_third_party_bindings:
-
-The bindings below are developed and maintained by the community:
-
-.. Binding developers: Feel free to open a pull request to add your binding if it's well-developed enough to be used in a project.
-.. Please keep languages sorted in alphabetical order.
-
-- `D <https://github.com/godot-dlang/godot-dlang>`__
-- `Go <https://github.com/grow-graphics/gd>`__
-- `Nim <https://github.com/godot-nim/gdext-nim>`__
-- `Rust <https://github.com/godot-rust/gdext>`__
-- `Swift <https://github.com/migueldeicaza/SwiftGodot>`__
-- `Odin <https://github.com/dresswithpockets/odin-godot>`__
-
-.. note::
-
-    Not all bindings mentioned here may be production-ready. Make sure to
-    research options thoroughly before starting a project with one of those.
-    Also, double-check whether the binding is compatible with the Godot version
-    you're using.
-
-.. _doc_what_is_gdextension_version_compatibility:
+Most people create GDExtensions with some existing language binding, such as :ref:`godot-cpp (for C++) <doc_godot_cpp>`,
+or one of the :ref:`community-made ones <doc_what_is_gdnative_third_party_bindings>`.
 
 Version compatibility
 ---------------------
 
-Usually, GDExtensions targeting an earlier version of Godot will work in later
-minor versions, but not vice-versa. For example, a GDExtension targeting Godot 4.2
-should work just fine in Godot 4.3, but one targeting Godot 4.3 won't work in Godot 4.2.
-
-For this reason, when creating GDExtensions, you may want to target the lowest version of
-Godot that has the features you need, *not* the most recent version of Godot. This can
-save you from needing to create multiple builds for different versions of Godot.
-
-However, GDExtension is currently *experimental*, which means that we may
-break compatibility in order to fix major bugs or include critical features.
-For example, GDExtensions created for Godot 4.0 aren't compatible with Godot
-4.1 (see :ref:`updating_your_gdextension_for_godot_4_1`).
-
-GDExtensions are also only compatible with engine builds that use the same
-level of floating-point precision the extension was compiled for. This means
-that if you use an engine build with double-precision floats, the extension must
-also be compiled for double-precision floats and use an ``extension_api.json``
-file generated by your custom engine build. See :ref:`doc_large_world_coordinates`
-for details.
-
-Generally speaking, if you build a custom version of Godot, you should generate an
-``extension_api.json`` from it for your GDExtensions, because it may have some differences
-from official Godot builds.
+See :ref:`godot-cpp Version Compatibility <doc_what_is_gdextension_version_compatibility>`, which applies to all GDExtensions.

+ 4 - 0
tutorials/scripting/index.rst

@@ -21,8 +21,12 @@ The sections below each focus on a given programming language.
 
    gdscript/index
    c_sharp/index
+   cpp/index
+   other_languages
    gdextension/index
 
+.. _doc_scripting_core_features:
+
 Core features
 -------------
 

+ 36 - 0
tutorials/scripting/other_languages.rst

@@ -0,0 +1,36 @@
+.. _doc_scripting_languages:
+
+Other languages
+---------------
+
+The Godot developers officially support the following languages for Godot:
+
+- :ref:`GDScript (all versions)<doc_gdscript>`
+- :ref:`C# (.NET version)<doc_c_sharp>`
+- :ref:`C++ (via GDExtension) <doc_godot_cpp>`
+
+.. note::
+
+    There are no plans to support additional languages officially.
+    That said, the community offers several bindings for other languages (see below).
+
+.. _doc_what_is_gdnative_third_party_bindings:
+
+The bindings below are developed and maintained by the community:
+
+.. Binding developers: Feel free to open a pull request to add your binding if it's well-developed enough to be used in a project.
+.. Please keep languages sorted in alphabetical order.
+
+- `D <https://github.com/godot-dlang/godot-dlang>`__
+- `Go <https://github.com/grow-graphics/gd>`__
+- `Nim <https://github.com/godot-nim/gdext-nim>`__
+- `Rust <https://github.com/godot-rust/gdext>`__
+- `Swift <https://github.com/migueldeicaza/SwiftGodot>`__
+- `Odin <https://github.com/dresswithpockets/odin-godot>`__
+
+.. note::
+
+    Not all bindings mentioned here may be production-ready. Make sure to
+    research options thoroughly before starting a project with one of those.
+    Also, double-check whether the binding is compatible with the Godot version
+    you're using.