From 57bd304096e4b4521ee3148bd0b538cbfb5fb616 Mon Sep 17 00:00:00 2001 From: Cory Petkovsek <632766+TokisanGames@users.noreply.github.com> Date: Sat, 7 Sep 2024 22:36:59 +0700 Subject: [PATCH] Update docs --- Terrain3D.vcxproj | 7 +- Terrain3D.vcxproj.filters | 141 ++- ...e_process.txt => _new_release_process.txt} | 0 doc/api/class_terrain3d.rst | 223 +++- doc/api/class_terrain3dassets.rst | 102 +- doc/api/class_terrain3ddata.rst | 1057 +++++++++++++++++ doc/api/class_terrain3deditor.rst | 28 +- doc/api/class_terrain3dinstancer.rst | 108 +- doc/api/class_terrain3dmaterial.rst | 4 +- doc/api/class_terrain3dmeshasset.rst | 10 +- doc/api/class_terrain3dregion.rst | 533 +++++++++ doc/api/class_terrain3dstorage.rst | 757 +----------- doc/api/class_terrain3dtexture.rst | 4 +- doc/api/class_terrain3dtextureasset.rst | 4 +- doc/api/class_terrain3dtexturelist.rst | 4 +- doc/api/class_terrain3dutil.rst | 130 +- doc/api/index.rst | 4 +- doc/build_docs.sh | 4 +- doc/classes/Terrain3D.xml | 41 +- doc/classes/Terrain3DAssets.xml | 42 + doc/classes/Terrain3DData.xml | 490 ++++++++ doc/classes/Terrain3DEditor.xml | 15 +- doc/classes/Terrain3DInstancer.xml | 53 +- doc/classes/Terrain3DMeshAsset.xml | 6 +- doc/classes/Terrain3DRegion.xml | 169 +++ doc/classes/Terrain3DStorage.xml | 361 +----- doc/classes/Terrain3DUtil.xml | 14 + .../{storage_format.md => data_format.md} | 7 +- doc/docs/games.md | 10 +- doc/docs/images/mesh_lods_flat.jpg | Bin 0 -> 157203 bytes doc/docs/images/mesh_lods_height.jpg | Bin 0 -> 174832 bytes doc/docs/installation.md | 23 +- doc/docs/introduction.md | 64 + doc/docs/programming_languages.md | 4 +- doc/docs/project_status.md | 4 +- doc/docs/troubleshooting.md | 7 +- doc/docs/tutorial_videos.md | 2 + doc/index.rst | 5 +- 38 files changed, 3082 insertions(+), 1355 deletions(-) rename doc/{new_release_process.txt => _new_release_process.txt} (100%) create mode 100644 doc/api/class_terrain3ddata.rst create mode 100644 doc/api/class_terrain3dregion.rst create mode 100644 doc/classes/Terrain3DData.xml create mode 100644 doc/classes/Terrain3DRegion.xml rename doc/docs/{storage_format.md => data_format.md} (53%) create mode 100644 doc/docs/images/mesh_lods_flat.jpg create mode 100644 doc/docs/images/mesh_lods_height.jpg create mode 100644 doc/docs/introduction.md diff --git a/Terrain3D.vcxproj b/Terrain3D.vcxproj index 6699b89d..da03c654 100644 --- a/Terrain3D.vcxproj +++ b/Terrain3D.vcxproj @@ -191,6 +191,7 @@ + @@ -198,7 +199,7 @@ - + @@ -230,7 +231,7 @@ - + @@ -238,10 +239,12 @@ + + diff --git a/Terrain3D.vcxproj.filters b/Terrain3D.vcxproj.filters index 95927250..88c479c1 100644 --- a/Terrain3D.vcxproj.filters +++ b/Terrain3D.vcxproj.filters @@ -8,110 +8,116 @@ {cddadac5-d2a5-45b0-947d-d3e2b055c87c} - - {fa4f3a1c-e2a4-4421-9b19-e15c14fce184} + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - + {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + {fa4f3a1c-e2a4-4421-9b19-e15c14fce184} - + {0d771ba6-8e4a-4985-895c-d9b8eec8b3fd} - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers - 4. Headers + 5. Headers + + + 5. Headers - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ - 5. C++ + 6. C++ + + + 6. C++ @@ -146,13 +152,13 @@ 1. Project Files - 3. Shaders + 4. Shaders - 3. Shaders + 4. Shaders - 3. Shaders + 4. Shaders 1. Project Files @@ -173,16 +179,16 @@ 2. Docs - 3. Shaders + 4. Shaders - 3. Shaders + 4. Shaders - 3. Shaders + 4. Shaders - 3. Shaders + 4. Shaders 2. Docs @@ -208,9 +214,6 @@ 2. Docs - - 2. Docs - 2. Docs @@ -229,7 +232,15 @@ 1. Project Files - + + 2. Docs + + + 2. Docs + + + 2. Docs + @@ -283,49 +294,55 @@ 2. Docs - - 2. Docs - 2. Docs - 3. Shaders + 4. Shaders + + + 2. Docs - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML - 2. Docs\XML + 3. XML + + + 3. XML + + + 3. XML \ No newline at end of file diff --git a/doc/new_release_process.txt b/doc/_new_release_process.txt similarity index 100% rename from doc/new_release_process.txt rename to doc/_new_release_process.txt diff --git a/doc/api/class_terrain3d.rst b/doc/api/class_terrain3d.rst index 7fcba481..0f60501e 100644 --- a/doc/api/class_terrain3d.rst +++ b/doc/api/class_terrain3d.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3D.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3D.xml. .. _class_Terrain3D: @@ -29,45 +29,55 @@ Properties .. table:: :widths: auto - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`Terrain3DAssets` | :ref:`assets` | | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`bool` | :ref:`collision_enabled` | ``true`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`int` | :ref:`collision_layer` | ``1`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`int` | :ref:`collision_mask` | ``1`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`float` | :ref:`collision_priority` | ``1.0`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`int` | :ref:`debug_level` | ``0`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`bool` | :ref:`debug_show_collision` | ``false`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`Terrain3DInstancer` | :ref:`instancer` | | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`Terrain3DMaterial` | :ref:`material` | | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`int` | :ref:`mesh_lods` | ``7`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`int` | :ref:`mesh_size` | ``48`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`float` | :ref:`mesh_vertex_spacing` | ``1.0`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`ShadowCastingSetting` | :ref:`render_cast_shadows` | ``1`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`float` | :ref:`render_cull_margin` | ``0.0`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`int` | :ref:`render_layers` | ``2147483649`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`int` | :ref:`render_mouse_layer` | ``32`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`Terrain3DStorage` | :ref:`storage` | | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`Terrain3DTextureList` | :ref:`texture_list` | | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ - | :ref:`String` | :ref:`version` | ``"0.9.3-dev"`` | - +---------------------------------------------------------------------------+----------------------------------------------------------------------------+-----------------+ + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`Terrain3DAssets` | :ref:`assets` | | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`bool` | :ref:`collision_enabled` | ``true`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`int` | :ref:`collision_layer` | ``1`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`int` | :ref:`collision_mask` | ``1`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`float` | :ref:`collision_priority` | ``1.0`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`Terrain3DData` | :ref:`data` | | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`String` | :ref:`data_directory` | ``""`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`int` | :ref:`debug_level` | ``0`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`bool` | :ref:`debug_show_collision` | ``false`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`bool` | :ref:`debug_show_region_labels` | ``false`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`Terrain3DInstancer` | :ref:`instancer` | | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`Terrain3DMaterial` | :ref:`material` | | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`int` | :ref:`mesh_lods` | ``7`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`int` | :ref:`mesh_size` | ``48`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`float` | :ref:`mesh_vertex_spacing` | ``1.0`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`RegionSize` | :ref:`region_size` | ``1024`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`ShadowCastingSetting` | :ref:`render_cast_shadows` | ``1`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`float` | :ref:`render_cull_margin` | ``0.0`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`int` | :ref:`render_layers` | ``2147483649`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`int` | :ref:`render_mouse_layer` | ``32`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`bool` | :ref:`save_16_bit` | ``false`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`Terrain3DStorage` | :ref:`storage` | | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`Terrain3DTextureList` | :ref:`texture_list` | | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ + | :ref:`String` | :ref:`version` | ``"0.9.3-dev"`` | + +---------------------------------------------------------------------------+------------------------------------------------------------------------------------+-----------------+ .. rst-class:: classref-reftable-group @@ -78,7 +88,7 @@ Methods :widths: auto +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Mesh` | :ref:`bake_mesh`\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`\ ) |const| | + | :ref:`Mesh` | :ref:`bake_mesh`\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`\ ) |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PackedVector3Array` | :ref:`generate_nav_mesh_source_geometry`\ (\ global_aabb\: :ref:`AABB`, require_nav\: :ref:`bool` = true\ ) |const| | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -98,6 +108,8 @@ Methods +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |void| | :ref:`set_plugin`\ (\ plugin\: :ref:`EditorPlugin`\ ) | +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`split_storage`\ (\ ) | + +-----------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -128,17 +140,28 @@ Emitted when :ref:`assets` is changed. Emitted when :ref:`material` is changed. -.. rst-class:: classref-item-separator +.. rst-class:: classref-section-separator ---- -.. _class_Terrain3D_signal_storage_changed: +.. rst-class:: classref-descriptions-group -.. rst-class:: classref-signal +Enumerations +------------ + +.. _enum_Terrain3D_RegionSize: + +.. rst-class:: classref-enumeration + +enum **RegionSize**: :ref:`🔗` + +.. _class_Terrain3D_constant_SIZE_1024: + +.. rst-class:: classref-enumeration-constant -**storage_changed**\ (\ ) :ref:`🔗` +:ref:`RegionSize` **SIZE_1024** = ``1024`` -Emitted when :ref:`storage` is changed. +Region size is 1024 x 1024 vertices and pixels on maps. .. rst-class:: classref-section-separator @@ -234,6 +257,39 @@ The priority used to solve collisions. The higher priority, the lower the penetr ---- +.. _class_Terrain3D_property_data: + +.. rst-class:: classref-property + +:ref:`Terrain3DData` **data** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- :ref:`Terrain3DData` **get_data**\ (\ ) + +This class manages loading, saving, adding, and removing of Terrain3DRegions and access to their content. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3D_property_data_directory: + +.. rst-class:: classref-property + +:ref:`String` **data_directory** = ``""`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_data_directory**\ (\ value\: :ref:`String`\ ) +- :ref:`String` **get_data_directory**\ (\ ) + +The directory where terrain data will be saved to and loaded from. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3D_property_debug_level: .. rst-class:: classref-property @@ -268,6 +324,23 @@ If collision is enabled, this generates collision in the editor and in game. It ---- +.. _class_Terrain3D_property_debug_show_region_labels: + +.. rst-class:: classref-property + +:ref:`bool` **debug_show_region_labels** = ``false`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_show_region_labels**\ (\ value\: :ref:`bool`\ ) +- :ref:`bool` **get_show_region_labels**\ (\ ) + +Display an overlay that shows region locations in the viewport. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3D_property_instancer: .. rst-class:: classref-property @@ -350,7 +423,7 @@ The distance between vertices. Godot units are typically considered to be meters This variable changes the global position of landscape features. A mountain peak might be at (512, 512), but with a vertex spacing of 2.0 it is now located at (1024, 1024). -All Terrain3D functions with a global_position expect an absolute global value. If you would normally use :ref:`Terrain3DStorage.import_images` to import an image in the region at (-1024, -1024), with a mesh_vertex_spacing of 2, you'll need to import that image at (-2048, -2048) to place it in the same region. +All Terrain3D functions with a global_position expect an absolute global value. If you would normally use :ref:`Terrain3DData.import_images` to import an image in the region at (-1024, -1024), with a mesh_vertex_spacing of 2, you'll need to import that image at (-2048, -2048) to place it in the same region. To scale heights, export the height map and reimport it with a new height scale. @@ -358,6 +431,23 @@ To scale heights, export the height map and reimport it with a new height scale. ---- +.. _class_Terrain3D_property_region_size: + +.. rst-class:: classref-property + +:ref:`RegionSize` **region_size** = ``1024`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_region_size**\ (\ value\: :ref:`RegionSize`\ ) +- :ref:`RegionSize` **get_region_size**\ (\ ) + +The number of vertices in each region, and the number of pixels for each map in Terrain3DRegion. 1 pixel corresponds to 1 vertex. :ref:`mesh_vertex_spacing` scales regions, but does not change the number of vertices or pixels. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3D_property_render_cast_shadows: .. rst-class:: classref-property @@ -386,7 +476,7 @@ Tells the renderer how to cast shadows from the terrain onto other objects. This - |void| **set_cull_margin**\ (\ value\: :ref:`float`\ ) - :ref:`float` **get_cull_margin**\ (\ ) -This margin is added to the vertical component of the terrain bounding box (AABB). The terrain already sets its AABB from :ref:`Terrain3DStorage.height_range`, which is calculated while sculpting. This setting only needs to be used if the shader has expanded the terrain beyond the AABB and the terrain meshes are being culled at certain viewing angles. This might happen from using :ref:`Terrain3DMaterial.world_background` with NOISE and a height value larger than the terrain heights. This setting is similar to ``GeometryInstance3D.extra_cull_margin``, but it only affects the Y axis. +This margin is added to the vertical component of the terrain bounding box (AABB). The terrain already sets its AABB from :ref:`Terrain3DData.get_height_range`, which is calculated while sculpting. This setting only needs to be used if the shader has expanded the terrain beyond the AABB and the terrain meshes are being culled at certain viewing angles. This might happen from using :ref:`Terrain3DMaterial.world_background` with NOISE and a height value larger than the terrain heights. This setting is similar to ``GeometryInstance3D.extra_cull_margin``, but it only affects the Y axis. .. rst-class:: classref-item-separator @@ -432,6 +522,23 @@ See :ref:`get_intersection`. ---- +.. _class_Terrain3D_property_save_16_bit: + +.. rst-class:: classref-property + +:ref:`bool` **save_16_bit** = ``false`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_save_16_bit**\ (\ value\: :ref:`bool`\ ) +- :ref:`bool` **get_save_16_bit**\ (\ ) + +Heightmaps are always loaded and edited in 32-bit. This option saves heightmaps as 16-bit half precision to reduce file size. This process is lossy, but does not change what is currently in memory. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3D_property_storage: .. rst-class:: classref-property @@ -443,7 +550,7 @@ See :ref:`get_intersection`. - |void| **set_storage**\ (\ value\: :ref:`Terrain3DStorage`\ ) - :ref:`Terrain3DStorage` **get_storage**\ (\ ) -The object that houses all Terrain3D region, height, control, and color maps. Make sure to save this as an external ``.res`` binary file. +This object is deprecated and only used for upgrading. Don't use. .. rst-class:: classref-item-separator @@ -491,13 +598,13 @@ Method Descriptions .. rst-class:: classref-method -:ref:`Mesh` **bake_mesh**\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`\ ) |const| :ref:`🔗` +:ref:`Mesh` **bake_mesh**\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`\ ) |const| :ref:`🔗` Generates a static ArrayMesh for the terrain. \ ``lod`` - Determines the granularity of the generated mesh. The range is 0-8. 4 is recommended. -\ ``filter`` - Controls how vertex Y coordinates are generated from the height map. See :ref:`HeightFilter`. +\ ``filter`` - Controls how vertex Y coordinates are generated from the height map. See :ref:`HeightFilter`. .. rst-class:: classref-item-separator @@ -625,6 +732,18 @@ Sets the current Terrain3DEditor instance. Sets the EditorPlugin connected to Terrain3D. +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3D_method_split_storage: + +.. rst-class:: classref-method + +|void| **split_storage**\ (\ ) :ref:`🔗` + +This function is deprecated. It facilitates upgrading the previous storage version to the new format. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/doc/api/class_terrain3dassets.rst b/doc/api/class_terrain3dassets.rst index a2993447..777e7ff9 100644 --- a/doc/api/class_terrain3dassets.rst +++ b/doc/api/class_terrain3dassets.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DAssets.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DAssets.xml. .. _class_Terrain3DAssets: @@ -44,20 +44,34 @@ Methods +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |void| | :ref:`create_mesh_thumbnails`\ (\ id\: :ref:`int` = -1, size\: :ref:`Vector2i` = Vector2i(128, 128)\ ) | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_albedo_array_rid`\ (\ ) |const| | + +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Terrain3DMeshAsset` | :ref:`get_mesh_asset`\ (\ id\: :ref:`int`\ ) |const| | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_mesh_count`\ (\ ) |const| | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_normal_array_rid`\ (\ ) |const| | + +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Terrain3DTextureAsset` | :ref:`get_texture`\ (\ id\: :ref:`int`\ ) |const| | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedColorArray` | :ref:`get_texture_colors`\ (\ ) |const| | + +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_texture_count`\ (\ ) |const| | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedFloat32Array` | :ref:`get_texture_detiles`\ (\ ) |const| | + +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedFloat32Array` | :ref:`get_texture_uv_scales`\ (\ ) |const| | + +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |void| | :ref:`save`\ (\ ) | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |void| | :ref:`set_mesh_asset`\ (\ id\: :ref:`int`, mesh\: :ref:`Terrain3DMeshAsset`\ ) | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |void| | :ref:`set_texture`\ (\ id\: :ref:`int`, texture\: :ref:`Terrain3DTextureAsset`\ ) | +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`update_mesh_list`\ (\ ) | + +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`update_texture_list`\ (\ ) | + +-----------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -204,6 +218,18 @@ Generates mesh asset preview thumbnails for the asset dock, stored within each m ---- +.. _class_Terrain3DAssets_method_get_albedo_array_rid: + +.. rst-class:: classref-method + +:ref:`RID` **get_albedo_array_rid**\ (\ ) |const| :ref:`🔗` + +Returns the resource ID of the TextureArray generated from combining all albedo and height textures. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3DAssets_method_get_mesh_asset: .. rst-class:: classref-method @@ -228,6 +254,18 @@ Returns the number of mesh assets in the list. ---- +.. _class_Terrain3DAssets_method_get_normal_array_rid: + +.. rst-class:: classref-method + +:ref:`RID` **get_normal_array_rid**\ (\ ) |const| :ref:`🔗` + +Returns the resource ID of the TextureArray generated from combining all normal and roughness textures. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3DAssets_method_get_texture: .. rst-class:: classref-method @@ -240,6 +278,18 @@ Returns the Terrain3DTextureAsset with the requested ID. ---- +.. _class_Terrain3DAssets_method_get_texture_colors: + +.. rst-class:: classref-method + +:ref:`PackedColorArray` **get_texture_colors**\ (\ ) |const| :ref:`🔗` + +Returns the array of all albedo colors used in the texture assets, indexed by asset id. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3DAssets_method_get_texture_count: .. rst-class:: classref-method @@ -252,6 +302,30 @@ Returns the number of texture slots used. ---- +.. _class_Terrain3DAssets_method_get_texture_detiles: + +.. rst-class:: classref-method + +:ref:`PackedFloat32Array` **get_texture_detiles**\ (\ ) |const| :ref:`🔗` + +Returns the array of all detiling values used in the texture assets, indexed by asset id. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DAssets_method_get_texture_uv_scales: + +.. rst-class:: classref-method + +:ref:`PackedFloat32Array` **get_texture_uv_scales**\ (\ ) |const| :ref:`🔗` + +Returns the array of all uv scale values used in the texture assets, indexed by asset id. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3DAssets_method_save: .. rst-class:: classref-method @@ -284,6 +358,30 @@ Assigns the Terrain3DMeshAsset to the specified ID slot. It can be null to clear Adds a Terrain3DTextureAsset at the specified ID slot. The texture can be null to clear the slot, or remove it if its the last in the list. If the specified slot is full, it will be swapped with the source texture ID, or will find the next available ID. +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DAssets_method_update_mesh_list: + +.. rst-class:: classref-method + +|void| **update_mesh_list**\ (\ ) :ref:`🔗` + +Updates the internal list of meshes used by the instancer. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DAssets_method_update_texture_list: + +.. rst-class:: classref-method + +|void| **update_texture_list**\ (\ ) :ref:`🔗` + +Regenerates the texture arrays from the list of texture assets, which is sent to the shader. + .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` .. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` diff --git a/doc/api/class_terrain3ddata.rst b/doc/api/class_terrain3ddata.rst new file mode 100644 index 00000000..00631b10 --- /dev/null +++ b/doc/api/class_terrain3ddata.rst @@ -0,0 +1,1057 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DData.xml. + +.. _class_Terrain3DData: + +Terrain3DData +============= + +**Inherits:** :ref:`Object` + +.. rst-class:: classref-introduction-group + +Description +----------- + +Terrain3D divides all data into regions which fit on a grid in the world. These coordinates are called region locations. The map data are stored in instances of :ref:`Terrain3DRegion`, which are saved to individual files. This class manages region loading, unloading, data retreival and manipulation. + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +--------------------------------------------------------------+------------------------------------------------------------------------+--------+ + | :ref:`Array`\[:ref:`Image`\] | :ref:`color_maps` | ``[]`` | + +--------------------------------------------------------------+------------------------------------------------------------------------+--------+ + | :ref:`Array`\[:ref:`Image`\] | :ref:`control_maps` | ``[]`` | + +--------------------------------------------------------------+------------------------------------------------------------------------+--------+ + | :ref:`Array`\[:ref:`Image`\] | :ref:`height_maps` | ``[]`` | + +--------------------------------------------------------------+------------------------------------------------------------------------+--------+ + | :ref:`Array`\[:ref:`Vector2i`\] | :ref:`region_locations` | ``[]`` | + +--------------------------------------------------------------+------------------------------------------------------------------------+--------+ + +.. rst-class:: classref-reftable-group + +Methods +------- + +.. table:: + :widths: auto + + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`add_region`\ (\ region\: :ref:`Terrain3DRegion`, update\: :ref:`bool` = true\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Terrain3DRegion` | :ref:`add_region_blank`\ (\ region_location\: :ref:`Vector2i`, update\: :ref:`bool` = true\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Terrain3DRegion` | :ref:`add_region_blankp`\ (\ global_position\: :ref:`Vector3`, update\: :ref:`bool` = true\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`calc_height_range`\ (\ recursive\: :ref:`bool` = false\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`export_image`\ (\ file_name\: :ref:`String`, map_type\: :ref:`MapType`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`force_update_maps`\ (\ map_type\: :ref:`MapType` = 3, generate_mipmaps\: :ref:`bool` = false\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_angle`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`get_color`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_color_maps_rid`\ (\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_control`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_control_maps_rid`\ (\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_height`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`RID` | :ref:`get_height_maps_rid`\ (\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_height_range`\ (\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array`\[:ref:`Image`\] | :ref:`get_maps`\ (\ map_type\: :ref:`MapType`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`get_mesh_vertex`\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`, global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`get_normal`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Color` | :ref:`get_pixel`\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Terrain3DRegion` | :ref:`get_region`\ (\ region_location\: :ref:`Vector2i`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_region_count`\ (\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_region_id`\ (\ region_location\: :ref:`Vector2i`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_region_idp`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2i` | :ref:`get_region_location`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`PackedInt32Array` | :ref:`get_region_map`\ (\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_region_map_index`\ (\ region_location\: :ref:`Vector2i`\ ) |static| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Terrain3DRegion` | :ref:`get_regionp`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array`\[:ref:`Terrain3DRegion`\] | :ref:`get_regions_active`\ (\ copy\: :ref:`bool` = false, deep\: :ref:`bool` = false\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_regions_all`\ (\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_roughness`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`get_scale`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector3` | :ref:`get_texture_id`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_region`\ (\ region_location\: :ref:`Vector2i`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`has_regionp`\ (\ global_position\: :ref:`Vector3`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`import_images`\ (\ images\: :ref:`Array`\[:ref:`Image`\], global_position\: :ref:`Vector3` = Vector3(0, 0, 0), offset\: :ref:`float` = 0.0, scale\: :ref:`float` = 1.0\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_region_deleted`\ (\ region_location\: :ref:`Vector2i`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_region_modified`\ (\ region_location\: :ref:`Vector2i`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`layered_to_image`\ (\ map_type\: :ref:`MapType`\ ) |const| | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`load_directory`\ (\ directory\: :ref:`String`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`load_region`\ (\ directory\: :ref:`Vector2i`, region_location\: :ref:`String`, update\: :ref:`bool` = true\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`remove_region`\ (\ region\: :ref:`Terrain3DRegion`, update\: :ref:`bool` = true\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`remove_regionl`\ (\ region_location\: :ref:`Vector2i`, update\: :ref:`bool` = true\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`remove_regionp`\ (\ global_position\: :ref:`Vector3`, update\: :ref:`bool` = true\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`save_directory`\ (\ directory\: :ref:`String`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`save_region`\ (\ directory\: :ref:`Vector2i`, region_location\: :ref:`String`, 16_bit\: :ref:`bool` = false\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_color`\ (\ global_position\: :ref:`Vector3`, color\: :ref:`Color`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_control`\ (\ global_position\: :ref:`Vector3`, control\: :ref:`int`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_height`\ (\ global_position\: :ref:`Vector3`, height\: :ref:`float`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_pixel`\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`, pixel\: :ref:`Color`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_region_deleted`\ (\ region_location\: :ref:`Vector2i`, deleted\: :ref:`bool`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_region_modified`\ (\ region_location\: :ref:`Vector2i`, modified\: :ref:`bool`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_roughness`\ (\ global_position\: :ref:`Vector3`, roughness\: :ref:`float`\ ) | + +----------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Signals +------- + +.. _class_Terrain3DData_signal_color_maps_changed: + +.. rst-class:: classref-signal + +**color_maps_changed**\ (\ ) :ref:`🔗` + +Emitted when the color maps array is regenerated. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_signal_control_maps_changed: + +.. rst-class:: classref-signal + +**control_maps_changed**\ (\ ) :ref:`🔗` + +Emitted when the control maps array is regenerated. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_signal_height_maps_changed: + +.. rst-class:: classref-signal + +**height_maps_changed**\ (\ ) :ref:`🔗` + +Emitted when the height maps array is regenerated. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_signal_maps_changed: + +.. rst-class:: classref-signal + +**maps_changed**\ (\ ) :ref:`🔗` + +Emitted when the region map or any map array has been regenerated. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_signal_maps_edited: + +.. rst-class:: classref-signal + +**maps_edited**\ (\ edited_area\: :ref:`AABB`\ ) :ref:`🔗` + +This signal is emitted whenever the editor is used to: + +- add or remove a region + +- alter a region map with a brush tool + +- undo or redo any of the above operations + +The parameter contains the axis-aligned bounding box of the area edited. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_signal_region_map_changed: + +.. rst-class:: classref-signal + +**region_map_changed**\ (\ ) :ref:`🔗` + +Emitted when the region map is regenerated. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Enumerations +------------ + +.. _enum_Terrain3DData_HeightFilter: + +.. rst-class:: classref-enumeration + +enum **HeightFilter**: :ref:`🔗` + +.. _class_Terrain3DData_constant_HEIGHT_FILTER_NEAREST: + +.. rst-class:: classref-enumeration-constant + +:ref:`HeightFilter` **HEIGHT_FILTER_NEAREST** = ``0`` + +Samples the height map at the exact coordinates given. + +.. _class_Terrain3DData_constant_HEIGHT_FILTER_MINIMUM: + +.. rst-class:: classref-enumeration-constant + +:ref:`HeightFilter` **HEIGHT_FILTER_MINIMUM** = ``1`` + +Samples (1 << lod) \* 2 heights around the given coordinates and returns the lowest. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Constants +--------- + +.. _class_Terrain3DData_constant_REGION_MAP_SIZE: + +.. rst-class:: classref-constant + +**REGION_MAP_SIZE** = ``16`` :ref:`🔗` + +Hard coded number of regions on a side. The total number of regions is this squared. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_Terrain3DData_property_color_maps: + +.. rst-class:: classref-property + +:ref:`Array`\[:ref:`Image`\] **color_maps** = ``[]`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- :ref:`Array`\[:ref:`Image`\] **get_color_maps**\ (\ ) + +An Array\ :ref:`Image` containing references to all of the color maps in all regions. See :ref:`Terrain3DRegion.color_map`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_property_control_maps: + +.. rst-class:: classref-property + +:ref:`Array`\[:ref:`Image`\] **control_maps** = ``[]`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- :ref:`Array`\[:ref:`Image`\] **get_control_maps**\ (\ ) + +An Array\ :ref:`Image` containing references to all of the control maps in all regions. See :ref:`Terrain3DRegion.control_map`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_property_height_maps: + +.. rst-class:: classref-property + +:ref:`Array`\[:ref:`Image`\] **height_maps** = ``[]`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- :ref:`Array`\[:ref:`Image`\] **get_height_maps**\ (\ ) + +An Array\ :ref:`Image` containing references to all of the height maps in all regions. See :ref:`Terrain3DRegion.height_map`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_property_region_locations: + +.. rst-class:: classref-property + +:ref:`Array`\[:ref:`Vector2i`\] **region_locations** = ``[]`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_region_locations**\ (\ value\: :ref:`Array`\[:ref:`Vector2i`\]\ ) +- :ref:`Array`\[:ref:`Vector2i`\] **get_region_locations**\ (\ ) + +The array of all active region locations; those not marked for deletion. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Method Descriptions +------------------- + +.. _class_Terrain3DData_method_add_region: + +.. rst-class:: classref-method + +:ref:`Error` **add_region**\ (\ region\: :ref:`Terrain3DRegion`, update\: :ref:`bool` = true\ ) :ref:`🔗` + +Adds a region for sculpting and painting. + +The region should already be configured with the desired location and maps before sending to this function. + +Upon saving, this region will be written to a data file stored in :ref:`Terrain3D.data_directory`. + +- update - regenerates the texture arrays if true. Set to false if bulk adding many regions, then true on the last one or use :ref:`force_update_maps`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_add_region_blank: + +.. rst-class:: classref-method + +:ref:`Terrain3DRegion` **add_region_blank**\ (\ region_location\: :ref:`Vector2i`, update\: :ref:`bool` = true\ ) :ref:`🔗` + +Creates and adds a blank region at the specified location. See :ref:`add_region`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_add_region_blankp: + +.. rst-class:: classref-method + +:ref:`Terrain3DRegion` **add_region_blankp**\ (\ global_position\: :ref:`Vector3`, update\: :ref:`bool` = true\ ) :ref:`🔗` + +Creates and adds a blank region at a region location encompassing the specified global position. See :ref:`add_region`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_calc_height_range: + +.. rst-class:: classref-method + +|void| **calc_height_range**\ (\ recursive\: :ref:`bool` = false\ ) :ref:`🔗` + +Recalculates the master height range for the whole terrain by summing the height ranges of all active regions. + +Recursive mode does the same, but has each region recalculate heights from each heightmap pixel. See :ref:`Terrain3DRegion.calc_height_range`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_export_image: + +.. rst-class:: classref-method + +:ref:`Error` **export_image**\ (\ file_name\: :ref:`String`, map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` + +Exports the specified map type as one of r16/raw, exr, jpg, png, webp, res, tres. + +R16 or exr are recommended for roundtrip external editing. + +R16 can be edited by Krita, however you must know the dimensions and min/max before reimporting. This information is printed to the console. + +Res/tres allow storage in any of Godot's native Image formats. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_force_update_maps: + +.. rst-class:: classref-method + +|void| **force_update_maps**\ (\ map_type\: :ref:`MapType` = 3, generate_mipmaps\: :ref:`bool` = false\ ) :ref:`🔗` + +Regenerates the region map and TextureArrays that house the requested map types. Using the default :ref:`MapType` TYPE_MAX(3) will regenerate all map types. + +This function needs to be called after editing any of the maps. + +- generate_mipmaps - Generates mipmaps for the color maps. This can also be done on individual regions with ``region.get_color_map().generate_mipmaps()``. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_angle: + +.. rst-class:: classref-method + +:ref:`float` **get_angle**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the angle, aka uv rotation, painted on the control map at the requested position. Values are fixed to 22.5 degree intervals, for a maximum of 16 angles. 360 / 16 = 22.5. + +Returns ``NAN`` if the position is outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_color: + +.. rst-class:: classref-method + +:ref:`Color` **get_color**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the associated pixel on the color map at the requested position. + +Returns ``Color(NAN, NAN, NAN, NAN)`` if the position is outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_color_maps_rid: + +.. rst-class:: classref-method + +:ref:`RID` **get_color_maps_rid**\ (\ ) |const| :ref:`🔗` + +Returns the resource ID of the generated height map Texture Array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See `Tips <../docs/tips.html#using-the-generated-height-map-in-other-shaders>`__ for an example. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_control: + +.. rst-class:: classref-method + +:ref:`int` **get_control**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the associated pixel on the control map at the requested position. + +Returns ``4,294,967,295`` aka ``UINT32_MAX`` if the position is outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_control_maps_rid: + +.. rst-class:: classref-method + +:ref:`RID` **get_control_maps_rid**\ (\ ) |const| :ref:`🔗` + +Returns the resource ID of the generated control map Texture Array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See `Tips <../docs/tips.html#using-the-generated-height-map-in-other-shaders>`__ for an example. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_height: + +.. rst-class:: classref-method + +:ref:`float` **get_height**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the height at the requested position. If the position is close to a vertex, the pixel height on the heightmap is returned. Otherwise the value is interpolated from the 4 vertices surrounding the position. + +Returns ``NAN`` if the requested position is a hole or outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_height_maps_rid: + +.. rst-class:: classref-method + +:ref:`RID` **get_height_maps_rid**\ (\ ) |const| :ref:`🔗` + +Returns the resource ID of the generated height map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See `Tips <../docs/tips.html#using-the-generated-height-map-in-other-shaders>`__ for an example. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_height_range: + +.. rst-class:: classref-method + +:ref:`Vector2` **get_height_range**\ (\ ) |const| :ref:`🔗` + +Returns the highest and lowest heights for the sculpted terrain used to set the world AABB. See :ref:`calc_height_range`. + +Any :ref:`Terrain3DMaterial.world_background` used that extends the mesh outside of this range will not change this variable. You need to set :ref:`Terrain3D.render_cull_margin` or the renderer will clip meshes. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_maps: + +.. rst-class:: classref-method + +:ref:`Array`\[:ref:`Image`\] **get_maps**\ (\ map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` + +Returns an Array of Images from all regions of the specified map type. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_mesh_vertex: + +.. rst-class:: classref-method + +:ref:`Vector3` **get_mesh_vertex**\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`, global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the position of a terrain vertex at a certain LOD. If the position is outside of defined regions or there is a hole, it returns ``NAN`` in the vector's Y coordinate. + +\ ``lod`` - Determines how many heights around the given global position will be sampled. Range 0 - 8. + +\ ``filter`` - Specifies how samples are filtered. See :ref:`HeightFilter`. + +\ ``global_position`` - X and Z coordinates of the vertex. Heights will be sampled around these coordinates. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_normal: + +.. rst-class:: classref-method + +:ref:`Vector3` **get_normal**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the terrain normal at the specified position. This function uses :ref:`get_height`. + +Returns ``Vector3(NAN, NAN, NAN)`` if the requested position is a hole or outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_pixel: + +.. rst-class:: classref-method + +:ref:`Color` **get_pixel**\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the pixel for the map type associated with the specified position. + +Returns ``Color(NAN, NAN, NAN, NAN)`` if the position is outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_region: + +.. rst-class:: classref-method + +:ref:`Terrain3DRegion` **get_region**\ (\ region_location\: :ref:`Vector2i`\ ) |const| :ref:`🔗` + +Return the :ref:`Terrain3DRegion` at the specified location. This will return inactive regions marked for deletion. Check with :ref:`Terrain3DRegion.deleted`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_region_count: + +.. rst-class:: classref-method + +:ref:`int` **get_region_count**\ (\ ) |const| :ref:`🔗` + +Returns the number of active regions; those not marked for deletion. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_region_id: + +.. rst-class:: classref-method + +:ref:`int` **get_region_id**\ (\ region_location\: :ref:`Vector2i`\ ) |const| :ref:`🔗` + +Returns -1 if no region or out of bounds at the given location, otherwise returns the current region id. + +The region_id is the index into the TextureArrays sent to the shader, and can change at any time. Gamedevs should generally index regions by location. However, this function is useful to determine if the location is a valid region. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_region_idp: + +.. rst-class:: classref-method + +:ref:`int` **get_region_idp**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the region id at a global position. See :ref:`get_region_id`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_region_location: + +.. rst-class:: classref-method + +:ref:`Vector2i` **get_region_location**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the calculated region location for the given global position. This is just a calculation and does no bounds checking or verification that a region exists. See :ref:`get_region_map_index` for bounds checking, or :ref:`has_region` for checking existance. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_region_map: + +.. rst-class:: classref-method + +:ref:`PackedInt32Array` **get_region_map**\ (\ ) |const| :ref:`🔗` + +Returns a fully populated 16 x 16 array. The array location contains the region id + 1, or 0, which means no region. + +See :ref:`get_region_map_index`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_region_map_index: + +.. rst-class:: classref-method + +:ref:`int` **get_region_map_index**\ (\ region_location\: :ref:`Vector2i`\ ) |static| :ref:`🔗` + +Given a region location, returns the index into the region map array. See :ref:`get_region_map`. + +You can use this function to quickly determine if a location is within the greater world bounds (-8,-8) to (7, 7). It returns -1 if not. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_regionp: + +.. rst-class:: classref-method + +:ref:`Terrain3DRegion` **get_regionp**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the region at the specified global position. This will return inactive regions marked for deletion. Check with :ref:`Terrain3DRegion.deleted`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_regions_active: + +.. rst-class:: classref-method + +:ref:`Array`\[:ref:`Terrain3DRegion`\] **get_regions_active**\ (\ copy\: :ref:`bool` = false, deep\: :ref:`bool` = false\ ) |const| :ref:`🔗` + +Returns an array of active regions not marked for deletion. Each region knows its own location. See :ref:`Terrain3DRegion.location`. + +- copy - returns a shallow copy of the regions; region map references are copied. + +- deep - returns a deep copy of the regions; region maps are full duplicates. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_regions_all: + +.. rst-class:: classref-method + +:ref:`Dictionary` **get_regions_all**\ (\ ) |const| :ref:`🔗` + +Returns all regions in a dictionary indexed by region location. Some regions may be marked for deletion. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_roughness: + +.. rst-class:: classref-method + +:ref:`float` **get_roughness**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the roughness modifier (wetness) on the color map alpha channel associated with the specified position. + +Returns ``Color(NAN, NAN, NAN, NAN)`` if the position is outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_scale: + +.. rst-class:: classref-method + +:ref:`float` **get_scale**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns the uv scale painted on the control map at the requested position. The value is a percentage difference from 100% scale. Eg. +20% or -40%. + +Returns ``NAN`` if the position is outside of defined regions. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_get_texture_id: + +.. rst-class:: classref-method + +:ref:`Vector3` **get_texture_id**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns ``Vector3(base texture id, overlay id, blend value)``. + +Returns ``Vector3(NAN, NAN, NAN)`` if the position is a hole or outside of defined regions. + +This is often used for playing footstep sounds. It's up to the gamedev to determine which is visually apparent based on shader settings. + +Due to blending, it won't be pixel perfect. Try having your player controller print this value while walking around to see how the blending values look. Perhaps you'll find that the overlay texture is visible starting at a blend value of .3 to .5, otherwise the base is visible. You can also observe the control blend debug view with :ref:`Terrain3DMaterial.show_control_blend`. + +Observing how this is done in The Witcher 3, there are only about 6 sounds used (snow, foliage, dirt, gravel, rock, wood), and except for wood, they are not pixel perfect. Wood is easy to do by detecting if the player is walking on wood meshes. The other 5 sounds are played when the player is in an area where the textures are blending. So it might play rock while over a dirt area. This shows pixel perfect accuracy is not important. It will still provide a seamless audio visual experience. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_has_region: + +.. rst-class:: classref-method + +:ref:`bool` **has_region**\ (\ region_location\: :ref:`Vector2i`\ ) |const| :ref:`🔗` + +Returns true if the specified region location has an active region. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_has_regionp: + +.. rst-class:: classref-method + +:ref:`bool` **has_regionp**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` + +Returns true if the specified global position has an active region. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_import_images: + +.. rst-class:: classref-method + +|void| **import_images**\ (\ images\: :ref:`Array`\[:ref:`Image`\], global_position\: :ref:`Vector3` = Vector3(0, 0, 0), offset\: :ref:`float` = 0.0, scale\: :ref:`float` = 1.0\ ) :ref:`🔗` + +Imports an Image set (Height, Control, Color) into this resource. It does NOT normalize values to 0-1. You must do that using get_min_max() and adjusting scale and offset. + +\ ``images`` - MapType.TYPE_MAX sized array of Images for Height, Control, Color. Images can be blank or null. + +\ ``global_position`` - X,0,Z position on the region map. Valid range is :ref:`Terrain3D.mesh_vertex_spacing` \* (+/-8192, +/-8192). + +\ ``offset`` - Add this factor to all height values, can be negative. + +\ ``scale`` - Scale all height values by this factor (applied after offset). + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_is_region_deleted: + +.. rst-class:: classref-method + +:ref:`bool` **is_region_deleted**\ (\ region_location\: :ref:`Vector2i`\ ) |const| :ref:`🔗` + +Returns true if the region at the location exists and is marked as deleted. Syntactic sugar for :ref:`Terrain3DRegion.deleted`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_is_region_modified: + +.. rst-class:: classref-method + +:ref:`bool` **is_region_modified**\ (\ region_location\: :ref:`Vector2i`\ ) |const| :ref:`🔗` + +Returns true if the region at the location exists and is marked as modified. Syntactic sugar for :ref:`Terrain3DRegion.modified`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_layered_to_image: + +.. rst-class:: classref-method + +:ref:`Image` **layered_to_image**\ (\ map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` + +Returns an Image of the given map type that contains all regions in one large image. If the world has multiple islands, this function will return an image large enough to encompass all used regions, with black areas in between the islands. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_load_directory: + +.. rst-class:: classref-method + +|void| **load_directory**\ (\ directory\: :ref:`String`\ ) :ref:`🔗` + +Loads all of the Terrain3DRegion files found in the specified directory. Then it rebuilds all map arrays. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_load_region: + +.. rst-class:: classref-method + +|void| **load_region**\ (\ directory\: :ref:`Vector2i`, region_location\: :ref:`String`, update\: :ref:`bool` = true\ ) :ref:`🔗` + +Loads the specified region location file. + +- update - rebuild maps if true. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_remove_region: + +.. rst-class:: classref-method + +|void| **remove_region**\ (\ region\: :ref:`Terrain3DRegion`, update\: :ref:`bool` = true\ ) :ref:`🔗` + +Marks the specified region as deleted. This deactivates it so it won't render it on screen once maps are updated, unless marked not deleted. The file will be deleted from disk upon saving. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_remove_regionl: + +.. rst-class:: classref-method + +|void| **remove_regionl**\ (\ region_location\: :ref:`Vector2i`, update\: :ref:`bool` = true\ ) :ref:`🔗` + +Removes the region at the specified location. See :ref:`remove_region`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_remove_regionp: + +.. rst-class:: classref-method + +|void| **remove_regionp**\ (\ global_position\: :ref:`Vector3`, update\: :ref:`bool` = true\ ) :ref:`🔗` + +Removes the region at the specified global_position. See :ref:`remove_region`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_save_directory: + +.. rst-class:: classref-method + +|void| **save_directory**\ (\ directory\: :ref:`String`\ ) :ref:`🔗` + +This saves all active regions into the specified directory. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_save_region: + +.. rst-class:: classref-method + +|void| **save_region**\ (\ directory\: :ref:`Vector2i`, region_location\: :ref:`String`, 16_bit\: :ref:`bool` = false\ ) :ref:`🔗` + +Saves the specified active region to the directory. See :ref:`Terrain3DRegion.save`. + +- region_location - the region to save. + +- 16_bit - converts the edited 32-bit heightmap to 16-bit. This is a lossy operation. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_set_color: + +.. rst-class:: classref-method + +|void| **set_color**\ (\ global_position\: :ref:`Vector3`, color\: :ref:`Color`\ ) :ref:`🔗` + +Sets the color on the color map pixel associated with the specified position. See :ref:`set_pixel` for important information. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_set_control: + +.. rst-class:: classref-method + +|void| **set_control**\ (\ global_position\: :ref:`Vector3`, control\: :ref:`int`\ ) :ref:`🔗` + +Sets the value on the control map pixel associated with the specified position. See :ref:`set_pixel` for important information. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_set_height: + +.. rst-class:: classref-method + +|void| **set_height**\ (\ global_position\: :ref:`Vector3`, height\: :ref:`float`\ ) :ref:`🔗` + +Sets the height value on the heightmap pixel associated with the specified position. See :ref:`set_pixel` for important information. + +Unlike :ref:`get_height`, which interpolates between vertices, this function does not and will set the pixel at floored coordinates. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_set_pixel: + +.. rst-class:: classref-method + +|void| **set_pixel**\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`, pixel\: :ref:`Color`\ ) :ref:`🔗` + +Sets the pixel for the map type associated with the specified position. This method is fine for setting a few pixels, but if you wish to modify thousands of pixels quickly, you should get the region and :ref:`Terrain3DRegion.get_map` to edit the images directly. + +After setting pixels you need to call :ref:`force_update_maps`. You may also need to regenerate collision if you don't have dynamic collision enabled. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_set_region_deleted: + +.. rst-class:: classref-method + +|void| **set_region_deleted**\ (\ region_location\: :ref:`Vector2i`, deleted\: :ref:`bool`\ ) :ref:`🔗` + +Marks a region as deleted. It will stop displaying when maps are updated. The file will be removed on save. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_set_region_modified: + +.. rst-class:: classref-method + +|void| **set_region_modified**\ (\ region_location\: :ref:`Vector2i`, modified\: :ref:`bool`\ ) :ref:`🔗` + +Sets the region as modified. It will be written to disk when saved. Syntactic sugar for :ref:`Terrain3DRegion.modified`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DData_method_set_roughness: + +.. rst-class:: classref-method + +|void| **set_roughness**\ (\ global_position\: :ref:`Vector3`, roughness\: :ref:`float`\ ) :ref:`🔗` + +Sets the roughness modifier (wetness) on the color map alpha channel associated with the specified position. See :ref:`set_pixel` for important information. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` +.. |bitfield| replace:: :abbr:`BitField (This value is an integer composed as a bitmask of the following flags.)` +.. |void| replace:: :abbr:`void (No return value.)` diff --git a/doc/api/class_terrain3deditor.rst b/doc/api/class_terrain3deditor.rst index b5a9bfb6..4feeb047 100644 --- a/doc/api/class_terrain3deditor.rst +++ b/doc/api/class_terrain3deditor.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DEditor.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DEditor.xml. .. _class_Terrain3DEditor: @@ -28,7 +28,9 @@ Methods :widths: auto +--------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`apply_undo`\ (\ maps\: :ref:`Dictionary`\ ) | + | |void| | :ref:`apply_undo`\ (\ data\: :ref:`Dictionary`\ ) | + +--------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`backup_region`\ (\ region\: :ref:`Terrain3DRegion`\ ) | +--------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Operation` | :ref:`get_operation`\ (\ ) |const| | +--------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -235,9 +237,21 @@ Method Descriptions .. rst-class:: classref-method -|void| **apply_undo**\ (\ maps\: :ref:`Dictionary`\ ) :ref:`🔗` +|void| **apply_undo**\ (\ data\: :ref:`Dictionary`\ ) :ref:`🔗` + +Undo the previous changes, with the provided data. Used by Godot, not gamedevs. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DEditor_method_backup_region: + +.. rst-class:: classref-method + +|void| **backup_region**\ (\ region\: :ref:`Terrain3DRegion`\ ) :ref:`🔗` -Undo the previous changes, with the reverted images in the array. Used by Godot, not users. +Adds a region to the currently pending operation undo snapshot. :ref:`is_operating` must be true. .. rst-class:: classref-item-separator @@ -249,7 +263,7 @@ Undo the previous changes, with the reverted images in the array. Used by Godot, :ref:`Operation` **get_operation**\ (\ ) |const| :ref:`🔗` -Returns the current operation. +Returns the current selected tool operation (eg. add, subtract). .. rst-class:: classref-item-separator @@ -285,7 +299,7 @@ Returns the current tool selected in the editor plugin. :ref:`bool` **is_operating**\ (\ ) |const| :ref:`🔗` -Returns true if currently brushing. +Returns true if currently in the middle of a brushing operation. .. rst-class:: classref-item-separator diff --git a/doc/api/class_terrain3dinstancer.rst b/doc/api/class_terrain3dinstancer.rst index 091e7b68..0eac23d6 100644 --- a/doc/api/class_terrain3dinstancer.rst +++ b/doc/api/class_terrain3dinstancer.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DInstancer.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DInstancer.xml. .. _class_Terrain3DInstancer: @@ -17,29 +17,27 @@ Terrain3DInstancer Description ----------- -This class places mesh instances into MultiMeshInstance3Ds. When providing a scene file, currently only the first mesh found is used. LODs will be supported later. Multimeshes only support one mesh object, so complex objects like tree trunks and leaves, or a door frame and door either need to be combined into one object with multiple materials, or placed by another method. Read the `Godot MultiMesh docs `__ for more information. +This class places mesh instances into MultiMeshInstance3Ds defined in the Terrain3D asset dock. -Data is currently stored in MultiMeshes within a Dictionary :ref:`Terrain3DStorage.multimeshes`, per region offset, per mesh type. These MultiMeshes are loaded into MultiMeshInstances, which are attached to the scene tree and managed by this class. +Data is currently stored in MultiMeshes within a Dictionary :ref:`Terrain3DRegion.multimeshes`, per region, per mesh type. These MultiMeshes are loaded into MultiMeshInstances, which are attached to the scene tree and managed by this class. \ **The methods available for adding instances are:**\ -\* :ref:`add_instances` - A feature rich function designed for hand editing via Terrain3DEditor. +- :ref:`add_instances` - A feature rich function designed for hand editing via Terrain3DEditor. -\* :ref:`add_multimesh` - Pulls the transforms out of your MultiMesh and calls add_transforms. +- :ref:`add_multimesh` - Pulls the transforms out of your MultiMesh and calls add_transforms. -\* :ref:`add_transforms` - Accepts your list of transforms and parses them into our storage system. +- :ref:`add_transforms` - Accepts your list of transforms and parses them into our data storage. -\* Creating your own MultiMesh resources and inserting them directly into the :ref:`Terrain3DStorage.multimeshes` dictionary. It's not difficult to do this in GDScript, but a thorough understanding of the C++ code in this class is recommended. Specifically look at `update_multimesh()`. +- Creating your own MultiMesh resources and inserting them directly into the :ref:`Terrain3DRegion.multimeshes` dictionary. It's not difficult to do this in GDScript, but a thorough understanding of the C++ code in this class is recommended. Specifically look at `update_multimesh()`. \ **The methods available for removing instances are:**\ -\* :ref:`remove_instances` - Like add_instances, this is can be used procedurally but is designed for hand editing. +- :ref:`remove_instances` - Like add_instances, this is can be used procedurally but is designed for hand editing. -\* :ref:`clear_by_mesh`, :ref:`clear_by_region_id`, :ref:`clear_by_offset` - To erase large sections of instances +- :ref:`clear_by_mesh`, :ref:`clear_by_location` - To erase large sections of instances -\* ``storage.set_multimeshes(Dictionary())`` - This will erase all instancer data and destroy all MultiMeshInstances. Run it in a @tool script to clear the data within the editor. - -\ **Note:** one caveat about creating your own MultiMeshes is the instance count cannot be changed after creation. Should you wish to remove 50% of the transforms, you would need to make a new MultiMesh, copy over the mesh and settings, copy the 50% of the transforms you wish to keep, and assign it to the MultiMeshInstance3D. That is how the instancer updates the MMIs in C++. +\ **Note:** one caveat about creating your own MultiMeshes is the instance count cannot be changed after creation. Should you wish to remove 50% of the transforms, you would need to make a new MultiMesh, copy over the mesh and settings, copy the 50% of the transforms you wish to keep, and assign it to the MultiMeshInstance3D. That is how the instancer updates the MMIs. .. rst-class:: classref-reftable-group @@ -49,29 +47,31 @@ Methods .. table:: :widths: auto - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`add_instances`\ (\ global_position\: :ref:`Vector3`, params\: :ref:`Dictionary`\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`add_multimesh`\ (\ mesh_id\: :ref:`int`, multimesh\: :ref:`MultiMesh`, transform\: :ref:`Transform3D` = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`add_transforms`\ (\ mesh_id\: :ref:`int`, transforms\: :ref:`Array`\[:ref:`Transform3D`\], colors\: :ref:`Array`\[:ref:`Color`\] = []\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`append_multimesh`\ (\ region_offset\: :ref:`Vector2i`, mesh_id\: :ref:`int`, transforms\: :ref:`Array`\[:ref:`Transform3D`\], colors\: :ref:`Array`\[:ref:`Color`\], clear\: :ref:`bool` = false\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`clear_by_mesh`\ (\ mesh_id\: :ref:`int`\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`clear_by_offset`\ (\ region_offset\: :ref:`Vector2i`, mesh_id\: :ref:`int`\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`clear_by_region_id`\ (\ region_id\: :ref:`int`, mesh_id\: :ref:`int`\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Dictionary` | :ref:`get_mmis`\ (\ ) |const| | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`remove_instances`\ (\ global_position\: :ref:`Vector3`, params\: :ref:`Dictionary`\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_cast_shadows`\ (\ mesh_id\: :ref:`int`, mode\: :ref:`ShadowCastingSetting`\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`update_transforms`\ (\ aabb\: :ref:`AABB`\ ) | - +-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`add_instances`\ (\ global_position\: :ref:`Vector3`, params\: :ref:`Dictionary`\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`add_multimesh`\ (\ mesh_id\: :ref:`int`, multimesh\: :ref:`MultiMesh`, transform\: :ref:`Transform3D` = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`add_transforms`\ (\ mesh_id\: :ref:`int`, transforms\: :ref:`Array`\[:ref:`Transform3D`\], colors\: :ref:`Array`\[:ref:`Color`\] = []\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`append_multimesh`\ (\ region_location\: :ref:`Vector2i`, mesh_id\: :ref:`int`, transforms\: :ref:`Array`\[:ref:`Transform3D`\], colors\: :ref:`Array`\[:ref:`Color`\], clear\: :ref:`bool` = false\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`clear_by_location`\ (\ region_location\: :ref:`Vector2i`, mesh_id\: :ref:`int`\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`clear_by_mesh`\ (\ mesh_id\: :ref:`int`\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`force_update_mmis`\ (\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_mmis`\ (\ ) |const| | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`remove_instances`\ (\ global_position\: :ref:`Vector3`, params\: :ref:`Dictionary`\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_cast_shadows`\ (\ mesh_id\: :ref:`int`, mode\: :ref:`ShadowCastingSetting`\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`swap_ids`\ (\ src_id\: :ref:`int`, dest_id\: :ref:`int`\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`update_transforms`\ (\ aabb\: :ref:`AABB`\ ) | + +-------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -112,7 +112,7 @@ Allows procedural placement of meshes. The :ref:`Terrain3DMeshAsset`, transforms\: :ref:`Array`\[:ref:`Transform3D`\], colors\: :ref:`Array`\[:ref:`Color`\] = []\ ) :ref:`🔗` -Allows procedural placement of meshes. The :ref:`Terrain3DMeshAsset` mesh_id should already be setup. Then you provide the array of Transform3Ds and optional Colors, which will be parsed into our region based storage system and fed directly into the appropriate MultiMeshInstances. +Allows procedural placement of meshes. The :ref:`Terrain3DMeshAsset` mesh_id should already be setup. Then you provide the array of Transform3Ds and optional Colors, which will be parsed into our region based data storage and fed directly into the appropriate MultiMeshInstances. This function adds the :ref:`Terrain3DMeshAsset.height_offset` to the transform along its local Y axis. @@ -124,7 +124,7 @@ This function adds the :ref:`Terrain3DMeshAsset.height_offset`, mesh_id\: :ref:`int`, transforms\: :ref:`Array`\[:ref:`Transform3D`\], colors\: :ref:`Array`\[:ref:`Color`\], clear\: :ref:`bool` = false\ ) :ref:`🔗` +|void| **append_multimesh**\ (\ region_location\: :ref:`Vector2i`, mesh_id\: :ref:`int`, transforms\: :ref:`Array`\[:ref:`Transform3D`\], colors\: :ref:`Array`\[:ref:`Color`\], clear\: :ref:`bool` = false\ ) :ref:`🔗` Appends new transforms to existing multimeshes. Multimesh transform arrays cannot be modified and must be rebuilt. This will make a new array with both old and new transforms. `Clear` will skip the old array. @@ -132,37 +132,37 @@ Appends new transforms to existing multimeshes. Multimesh transform arrays canno ---- -.. _class_Terrain3DInstancer_method_clear_by_mesh: +.. _class_Terrain3DInstancer_method_clear_by_location: .. rst-class:: classref-method -|void| **clear_by_mesh**\ (\ mesh_id\: :ref:`int`\ ) :ref:`🔗` +|void| **clear_by_location**\ (\ region_location\: :ref:`Vector2i`, mesh_id\: :ref:`int`\ ) :ref:`🔗` -Removes both MultiMeshInstance nodes attached to the tree, and MultiMeshes in Storage for all regions that match mesh id. +Removes MultiMeshInstance nodes attached to the tree, and MultiMeshes in Terrain3DRegions that match both the region location and the mesh id. .. rst-class:: classref-item-separator ---- -.. _class_Terrain3DInstancer_method_clear_by_offset: +.. _class_Terrain3DInstancer_method_clear_by_mesh: .. rst-class:: classref-method -|void| **clear_by_offset**\ (\ region_offset\: :ref:`Vector2i`, mesh_id\: :ref:`int`\ ) :ref:`🔗` +|void| **clear_by_mesh**\ (\ mesh_id\: :ref:`int`\ ) :ref:`🔗` -Removes both MultiMeshInstance nodes attached to the tree, and MultiMeshes in Storage for the specified region offset and mesh id. +Removes MultiMeshInstance nodes attached to the tree, and MultiMeshes in Terrain3DRegions that match the mesh id. .. rst-class:: classref-item-separator ---- -.. _class_Terrain3DInstancer_method_clear_by_region_id: +.. _class_Terrain3DInstancer_method_force_update_mmis: .. rst-class:: classref-method -|void| **clear_by_region_id**\ (\ region_id\: :ref:`int`, mesh_id\: :ref:`int`\ ) :ref:`🔗` +|void| **force_update_mmis**\ (\ ) :ref:`🔗` -Removes both MultiMeshInstance nodes attached to the tree, and MultiMeshes in Storage for the specified region id and mesh id. +Removes and rebuilds all MultiMeshInstances. .. rst-class:: classref-item-separator @@ -174,7 +174,7 @@ Removes both MultiMeshInstance nodes attached to the tree, and MultiMeshes in St :ref:`Dictionary` **get_mmis**\ (\ ) |const| :ref:`🔗` -Returns the dictionary containing the MultiMeshInstance3D nodes, which are hidden children of Terrain3D. The dictionary is keyed by Vector3i(region_offset.x, region_offset.y, mesh_id). +Returns the dictionary containing the MultiMeshInstance3D nodes, which are hidden children of Terrain3D. The dictionary is keyed by Vector3i(region_location.x, region_location.y, mesh_id). .. rst-class:: classref-item-separator @@ -204,6 +204,18 @@ Tells the renderer how to cast shadows from this mesh asset onto the terrain and ---- +.. _class_Terrain3DInstancer_method_swap_ids: + +.. rst-class:: classref-method + +|void| **swap_ids**\ (\ src_id\: :ref:`int`, dest_id\: :ref:`int`\ ) :ref:`🔗` + +Swaps the ID of two meshes, without changing the mesh instances on the ground. Updates Multimesh and MMI dictionary keys. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3DInstancer_method_update_transforms: .. rst-class:: classref-method diff --git a/doc/api/class_terrain3dmaterial.rst b/doc/api/class_terrain3dmaterial.rst index e7bceaf5..59f50048 100644 --- a/doc/api/class_terrain3dmaterial.rst +++ b/doc/api/class_terrain3dmaterial.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DMaterial.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DMaterial.xml. .. _class_Terrain3DMaterial: diff --git a/doc/api/class_terrain3dmeshasset.rst b/doc/api/class_terrain3dmeshasset.rst index 0d4ddf2c..15ac13d9 100644 --- a/doc/api/class_terrain3dmeshasset.rst +++ b/doc/api/class_terrain3dmeshasset.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DMeshAsset.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DMeshAsset.xml. .. _class_Terrain3DMeshAsset: @@ -17,13 +17,13 @@ Terrain3DMeshAsset Description ----------- -This class provides one of two mesh types for instancing. +This class provides one of two mesh types for instancing. First, this class will generate a texture card, using a QuadMesh. The typical use for a texture card is to place a flat grass texture in the `albedo texture` slot in the override material, and enable alpha scissor. This will generate low poly grass. -Second, you can link this resource to a mesh scene file, which is specifically a PackedScene (.tscn, .scn, .glb, .fbx, etc). You can override the material if desired. +Second, you can link this resource to a mesh scene file, which is specifically a PackedScene (.tscn, .scn, .glb, .fbx, etc). You can override the material if desired. Multimeshes only support one mesh object, so complex objects like tree trunks and leaves, or a door frame and door either need to be combined into one object with multiple materials, or placed by another method. Read the `Godot MultiMesh docs `__ for more information. -Currently, the system will use only the first MeshInstance3D it finds in the file. It doesn't apply any transforms nor collision found in the file. Auto generated lods are used by the engine. +Currently, the system will use only the first MeshInstance3D it finds in the file. It doesn't apply any transforms nor collision found in the file. Auto generated LODs are used by the engine. Manual LODs will be supported later. .. rst-class:: classref-reftable-group diff --git a/doc/api/class_terrain3dregion.rst b/doc/api/class_terrain3dregion.rst new file mode 100644 index 00000000..f1247f36 --- /dev/null +++ b/doc/api/class_terrain3dregion.rst @@ -0,0 +1,533 @@ +:github_url: hide + +.. DO NOT EDIT THIS FILE!!! +.. Generated automatically from Godot engine sources. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DRegion.xml. + +.. _class_Terrain3DRegion: + +Terrain3DRegion +=============== + +**Inherits:** :ref:`Resource` **<** :ref:`RefCounted` **<** :ref:`Object` + +.. rst-class:: classref-introduction-group + +Description +----------- + +This resource stores all map data for Terrain3D. See `Controlmap Format <../docs/controlmap_format.html>`__ and `Storage Format Changelog <../docs/storage_format.html>`__. + +.. rst-class:: classref-reftable-group + +Properties +---------- + +.. table:: + :widths: auto + + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`Image` | :ref:`color_map` | | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`Image` | :ref:`control_map` | | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`bool` | :ref:`deleted` | | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`bool` | :ref:`edited` | | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`Image` | :ref:`height_map` | | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`Vector2` | :ref:`height_range` | ``Vector2(0, 0)`` | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`Vector2i` | :ref:`location` | | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`bool` | :ref:`modified` | | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`Dictionary` | :ref:`multimeshes` | ``{}`` | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`int` | :ref:`region_size` | ``0`` | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + | :ref:`float` | :ref:`version` | ``0.8`` | + +-------------------------------------+------------------------------------------------------------------+-------------------+ + +.. rst-class:: classref-reftable-group + +Methods +------- + +.. table:: + :widths: auto + + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`calc_height_range`\ (\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Terrain3DRegion` | :ref:`duplicate`\ (\ deep\: :ref:`bool` = false\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Dictionary` | :ref:`get_data`\ (\ ) |const| | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`get_map`\ (\ map_type\: :ref:`MapType`\ ) |const| | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array`\[:ref:`Image`\] | :ref:`get_maps`\ (\ ) |const| | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`sanitize_map`\ (\ map_type\: :ref:`MapType`, map\: :ref:`Image`\ ) |const| | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`sanitize_maps`\ (\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Error` | :ref:`save`\ (\ path\: :ref:`String` = "", 16-bit\: :ref:`bool` = false\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_data`\ (\ data\: :ref:`Dictionary`\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_map`\ (\ map_type\: :ref:`MapType`, map\: :ref:`Image`\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_maps`\ (\ maps\: :ref:`Array`\[:ref:`Image`\]\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`update_height`\ (\ height\: :ref:`float`\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`update_heights`\ (\ low_high\: :ref:`Vector2`\ ) | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`validate_map_size`\ (\ map\: :ref:`Image`\ ) |const| | + +--------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Enumerations +------------ + +.. _enum_Terrain3DRegion_MapType: + +.. rst-class:: classref-enumeration + +enum **MapType**: :ref:`🔗` + +.. _class_Terrain3DRegion_constant_TYPE_HEIGHT: + +.. rst-class:: classref-enumeration-constant + +:ref:`MapType` **TYPE_HEIGHT** = ``0`` + +Height map - real values, eg. 10m, 44.5m. + +.. _class_Terrain3DRegion_constant_TYPE_CONTROL: + +.. rst-class:: classref-enumeration-constant + +:ref:`MapType` **TYPE_CONTROL** = ``1`` + +Control map - defines where textures and holes are placed. + +.. _class_Terrain3DRegion_constant_TYPE_COLOR: + +.. rst-class:: classref-enumeration-constant + +:ref:`MapType` **TYPE_COLOR** = ``2`` + +Color map - paints color on the terrain + +.. _class_Terrain3DRegion_constant_TYPE_MAX: + +.. rst-class:: classref-enumeration-constant + +:ref:`MapType` **TYPE_MAX** = ``3`` + +The number of elements in this enum. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Property Descriptions +--------------------- + +.. _class_Terrain3DRegion_property_color_map: + +.. rst-class:: classref-property + +:ref:`Image` **color_map** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_color_map**\ (\ value\: :ref:`Image`\ ) +- :ref:`Image` **get_color_map**\ (\ ) + +This map is used to paint color that blends in to the terrain textures. + +Image format: FORMAT_RGBA8, 32-bits per pixel as four 8-bit components. + +\ **RGB** is used for color, which is multiplied by albedo in the shader. Multiply is a blend mode that only darkens. + +\ **A** is used for a roughness modifier. A value of 0.5 means no change to the existing texture roughness. Higher than this value increases roughness, lower decreases it. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_control_map: + +.. rst-class:: classref-property + +:ref:`Image` **control_map** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_control_map**\ (\ value\: :ref:`Image`\ ) +- :ref:`Image` **get_control_map**\ (\ ) + +This map tells the shader which textures to use where, how to blend, where to place holes, etc. + +Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. + +However, we interpret these images as format: `RenderingDevice.DATA_FORMAT_R32_UINT `__ aka OpenGL RG32UI 32-bit per pixel as unsigned integer. See `Control map format <../docs/controlmap_format.html>`__. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_deleted: + +.. rst-class:: classref-property + +:ref:`bool` **deleted** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_deleted**\ (\ value\: :ref:`bool`\ ) +- :ref:`bool` **is_deleted**\ (\ ) + +This region is marked for deletion. It won't be rendered once :ref:`Terrain3DData.force_update_maps` rebuilds the map index. The file will be deleted from disk on :ref:`save`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_edited: + +.. rst-class:: classref-property + +:ref:`bool` **edited** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_edited**\ (\ value\: :ref:`bool`\ ) +- :ref:`bool` **is_edited**\ (\ ) + +This region is marked for saving in the undo/redo system by :ref:`Terrain3DEditor` during an operation. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_height_map: + +.. rst-class:: classref-property + +:ref:`Image` **height_map** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_height_map**\ (\ value\: :ref:`Image`\ ) +- :ref:`Image` **get_height_map**\ (\ ) + +This map contains the real value heights for the terrain. + +Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. + +Heights sent to the vertex shader on the GPU which modifies the mesh in real-time. + +Editing is always done in 32-bit. We do provide an option to save as 16-bit, see :ref:`Terrain3D.save_16_bit`, which converts to 32-bit on load and back to 16-bit on save. This process is lossy as 16-bit precision gets increasingly worse with every power of 2. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_height_range: + +.. rst-class:: classref-property + +:ref:`Vector2` **height_range** = ``Vector2(0, 0)`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_height_range**\ (\ value\: :ref:`Vector2`\ ) +- :ref:`Vector2` **get_height_range**\ (\ ) + +The current minimum and maximum height range for this region, used to calculate the AABB of the terrain. Update it with :ref:`update_height`, and recalculate it with :ref:`calc_height_range`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_location: + +.. rst-class:: classref-property + +:ref:`Vector2i` **location** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_location**\ (\ value\: :ref:`Vector2i`\ ) +- :ref:`Vector2i` **get_location**\ (\ ) + +The region location, or region grid coordinates in the world space where this region lives. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_modified: + +.. rst-class:: classref-property + +:ref:`bool` **modified** :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_modified**\ (\ value\: :ref:`bool`\ ) +- :ref:`bool` **is_modified**\ (\ ) + +This region has been modified and will be saved. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_multimeshes: + +.. rst-class:: classref-property + +:ref:`Dictionary` **multimeshes** = ``{}`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_multimeshes**\ (\ value\: :ref:`Dictionary`\ ) +- :ref:`Dictionary` **get_multimeshes**\ (\ ) + +A Dictionary indexed by mesh_id that provides the MultiMeshes for this region. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_region_size: + +.. rst-class:: classref-property + +:ref:`int` **region_size** = ``0`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_region_size**\ (\ value\: :ref:`int`\ ) +- :ref:`int` **get_region_size**\ (\ ) + +The current region size for this region, calculated from the dimensions of the first loaded map. It should match :ref:`Terrain3D.region_size`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_property_version: + +.. rst-class:: classref-property + +:ref:`float` **version** = ``0.8`` :ref:`🔗` + +.. rst-class:: classref-property-setget + +- |void| **set_version**\ (\ value\: :ref:`float`\ ) +- :ref:`float` **get_version**\ (\ ) + +The data file version. This is independent of the Terrain3D version, though they often align. + +.. rst-class:: classref-section-separator + +---- + +.. rst-class:: classref-descriptions-group + +Method Descriptions +------------------- + +.. _class_Terrain3DRegion_method_calc_height_range: + +.. rst-class:: classref-method + +|void| **calc_height_range**\ (\ ) :ref:`🔗` + +Recalculates the height range for this region by looking at every pixel in the heightmap. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_duplicate: + +.. rst-class:: classref-method + +:ref:`Terrain3DRegion` **duplicate**\ (\ deep\: :ref:`bool` = false\ ) :ref:`🔗` + +Returns a duplicate copy of this node, with references to the same image maps and multimeshes. + +- deep - Also make complete duplicates of the maps and multimeshes. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_get_data: + +.. rst-class:: classref-method + +:ref:`Dictionary` **get_data**\ (\ ) |const| :ref:`🔗` + +Returns all data in this region in a dictionary. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_get_map: + +.. rst-class:: classref-method + +:ref:`Image` **get_map**\ (\ map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` + +Returns the specified image map. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_get_maps: + +.. rst-class:: classref-method + +:ref:`Array`\[:ref:`Image`\] **get_maps**\ (\ ) |const| :ref:`🔗` + +Returns an Array\ :ref:`Image` with height, control, and color maps. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_sanitize_map: + +.. rst-class:: classref-method + +:ref:`Image` **sanitize_map**\ (\ map_type\: :ref:`MapType`, map\: :ref:`Image`\ ) |const| :ref:`🔗` + +Validates and adjusts the map size and format if possible, or creates a usable blank image in the right size and format. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_sanitize_maps: + +.. rst-class:: classref-method + +|void| **sanitize_maps**\ (\ ) :ref:`🔗` + +Sanitizes all map types. See :ref:`sanitize_map`. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_save: + +.. rst-class:: classref-method + +:ref:`Error` **save**\ (\ path\: :ref:`String` = "", 16-bit\: :ref:`bool` = false\ ) :ref:`🔗` + +Saves this region to the current file name. + +- path - specifies a directory and file name to use from now on. + +- 16-bit - save this region with 16-bit height map instead of 32-bit. This process is lossy. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_set_data: + +.. rst-class:: classref-method + +|void| **set_data**\ (\ data\: :ref:`Dictionary`\ ) :ref:`🔗` + +Overwrites all local variables with values in the dictionary. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_set_map: + +.. rst-class:: classref-method + +|void| **set_map**\ (\ map_type\: :ref:`MapType`, map\: :ref:`Image`\ ) :ref:`🔗` + +Assigns the provided map to the desired map type. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_set_maps: + +.. rst-class:: classref-method + +|void| **set_maps**\ (\ maps\: :ref:`Array`\[:ref:`Image`\]\ ) :ref:`🔗` + +Expects an array with three images in it, and assigns them to the height, control, and color maps. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_update_height: + +.. rst-class:: classref-method + +|void| **update_height**\ (\ height\: :ref:`float`\ ) :ref:`🔗` + +When sculpting, this is called to provide the current height. It may expand the vertical bounds, which is used to calculate the terrain AABB. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_update_heights: + +.. rst-class:: classref-method + +|void| **update_heights**\ (\ low_high\: :ref:`Vector2`\ ) :ref:`🔗` + +When sculpting the terrain, this is called to provide both a low and high height. It may expand the vertical bounds, which is used to calculate the terrain AABB. + +.. rst-class:: classref-item-separator + +---- + +.. _class_Terrain3DRegion_method_validate_map_size: + +.. rst-class:: classref-method + +:ref:`bool` **validate_map_size**\ (\ map\: :ref:`Image`\ ) |const| :ref:`🔗` + +This validates the map size according to previously loaded maps. + +.. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` +.. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` +.. |vararg| replace:: :abbr:`vararg (This method accepts any number of arguments after the ones described here.)` +.. |constructor| replace:: :abbr:`constructor (This method is used to construct a type.)` +.. |static| replace:: :abbr:`static (This method doesn't need an instance to be called, so it can be called directly using the class name.)` +.. |operator| replace:: :abbr:`operator (This method describes a valid operator to use with this type as left-hand operand.)` +.. |bitfield| replace:: :abbr:`BitField (This value is an integer composed as a bitmask of the following flags.)` +.. |void| replace:: :abbr:`void (No return value.)` diff --git a/doc/api/class_terrain3dstorage.rst b/doc/api/class_terrain3dstorage.rst index e9d83797..23113959 100644 --- a/doc/api/class_terrain3dstorage.rst +++ b/doc/api/class_terrain3dstorage.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DStorage.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DStorage.xml. .. _class_Terrain3DStorage: @@ -17,7 +17,7 @@ Terrain3DStorage Description ----------- -This resource stores all map data for Terrain3D. See `Controlmap Format <../docs/controlmap_format.html>`__ and `Storage Format Changelog <../docs/storage_format.html>`__. +This class is deprecated and has been replaced by :ref:`Terrain3DData`. .. rst-class:: classref-reftable-group @@ -55,154 +55,11 @@ Methods .. table:: :widths: auto - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`add_region`\ (\ global_position\: :ref:`Vector3`, images\: :ref:`Array`\[:ref:`Image`\] = [], update\: :ref:`bool` = true\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Error` | :ref:`export_image`\ (\ file_name\: :ref:`String`, map_type\: :ref:`MapType`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`force_update_maps`\ (\ map_type\: :ref:`MapType` = 3\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_angle`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Color` | :ref:`get_color`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_color_maps_rid`\ (\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_control`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_control_maps_rid`\ (\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_height`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`RID` | :ref:`get_height_maps_rid`\ (\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`get_map_region`\ (\ map_type\: :ref:`MapType`, region_index\: :ref:`int`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Array`\[:ref:`Image`\] | :ref:`get_maps`\ (\ map_type\: :ref:`MapType`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Array`\[:ref:`Image`\] | :ref:`get_maps_copy`\ (\ map_type\: :ref:`MapType`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`get_mesh_vertex`\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`, global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`get_normal`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Color` | :ref:`get_pixel`\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_region_count`\ (\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_region_index`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_region_index_from_offset`\ (\ region_offset\: :ref:`Vector2i`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2i` | :ref:`get_region_offset`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2i` | :ref:`get_region_offset_from_index`\ (\ region_index\: :ref:`int`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_roughness`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`get_scale`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector3` | :ref:`get_texture_id`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`has_region`\ (\ global_position\: :ref:`Vector3`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`import_images`\ (\ images\: :ref:`Array`\[:ref:`Image`\], global_position\: :ref:`Vector3` = Vector3(0, 0, 0), offset\: :ref:`float` = 0.0, scale\: :ref:`float` = 1.0\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`layered_to_image`\ (\ map_type\: :ref:`MapType`\ ) |const| | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`remove_region`\ (\ global_position\: :ref:`Vector3`, update\: :ref:`bool` = true\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`save`\ (\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_color`\ (\ global_position\: :ref:`Vector3`, color\: :ref:`Color`\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_control`\ (\ global_position\: :ref:`Vector3`, control\: :ref:`int`\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_height`\ (\ global_position\: :ref:`Vector3`, height\: :ref:`float`\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_map_region`\ (\ map_type\: :ref:`MapType`, region_index\: :ref:`int`, image\: :ref:`Image`\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_maps`\ (\ map_type\: :ref:`MapType`, maps\: :ref:`Array`\[:ref:`Image`\]\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_pixel`\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`, pixel\: :ref:`Color`\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`set_roughness`\ (\ global_position\: :ref:`Vector3`, roughness\: :ref:`float`\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | |void| | :ref:`update_height_range`\ (\ ) | - +--------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - -.. rst-class:: classref-section-separator - ----- - -.. rst-class:: classref-descriptions-group - -Signals -------- - -.. _class_Terrain3DStorage_signal_height_maps_changed: - -.. rst-class:: classref-signal - -**height_maps_changed**\ (\ ) :ref:`🔗` - -Emitted when the height maps have changed and been regenerated. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_signal_maps_edited: - -.. rst-class:: classref-signal - -**maps_edited**\ (\ edited_area\: :ref:`AABB`\ ) :ref:`🔗` - -This signal is emitted whenever the editor is used to: - -- add or remove a region, - -- alter a region map with a brush tool, - -- undo or redo any of the above operations. - -The parameter contains the axis-aligned bounding box of the area edited. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_signal_multimeshes_changed: - -.. rst-class:: classref-signal - -**multimeshes_changed**\ (\ ) :ref:`🔗` - -Emitted when the :ref:`multimeshes` object is changed (ie loaded), not when the content is changed. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_signal_region_size_changed: - -.. rst-class:: classref-signal - -**region_size_changed**\ (\ ) :ref:`🔗` - -Emitted when :ref:`region_size` is changed. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_signal_regions_changed: - -.. rst-class:: classref-signal - -**regions_changed**\ (\ ) :ref:`🔗` - -Emitted when any of the maps or regions are modified and regenerated. + +--------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Array`\[:ref:`Image`\] | :ref:`get_maps`\ (\ map_type\: :ref:`MapType`\ ) |const| | + +--------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | |void| | :ref:`set_maps`\ (\ map_type\: :ref:`MapType`, maps\: :ref:`Array`\[:ref:`Image`\]\ ) | + +--------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -225,7 +82,11 @@ enum **MapType**: :ref:`🔗` :ref:`MapType` **TYPE_HEIGHT** = ``0`` -Height map. +.. container:: contribute + + There is currently no description for this enum. Please help us by :ref:`contributing one `! + + .. _class_Terrain3DStorage_constant_TYPE_CONTROL: @@ -233,7 +94,11 @@ Height map. :ref:`MapType` **TYPE_CONTROL** = ``1`` -Control map. +.. container:: contribute + + There is currently no description for this enum. Please help us by :ref:`contributing one `! + + .. _class_Terrain3DStorage_constant_TYPE_COLOR: @@ -241,7 +106,11 @@ Control map. :ref:`MapType` **TYPE_COLOR** = ``2`` -Color map. +.. container:: contribute + + There is currently no description for this enum. Please help us by :ref:`contributing one `! + + .. _class_Terrain3DStorage_constant_TYPE_MAX: @@ -249,7 +118,11 @@ Color map. :ref:`MapType` **TYPE_MAX** = ``3`` -The number of elements in this enum. +.. container:: contribute + + There is currently no description for this enum. Please help us by :ref:`contributing one `! + + .. rst-class:: classref-item-separator @@ -267,33 +140,11 @@ enum **RegionSize**: :ref:`🔗` :ref:`RegionSize` **SIZE_1024** = ``1024`` -Region size is 1024 x 1024 vertices or pixels on maps. - -.. rst-class:: classref-item-separator - ----- - -.. _enum_Terrain3DStorage_HeightFilter: +.. container:: contribute -.. rst-class:: classref-enumeration + There is currently no description for this enum. Please help us by :ref:`contributing one `! -enum **HeightFilter**: :ref:`🔗` - -.. _class_Terrain3DStorage_constant_HEIGHT_FILTER_NEAREST: - -.. rst-class:: classref-enumeration-constant -:ref:`HeightFilter` **HEIGHT_FILTER_NEAREST** = ``0`` - -Samples the height map at the exact coordinates given. - -.. _class_Terrain3DStorage_constant_HEIGHT_FILTER_MINIMUM: - -.. rst-class:: classref-enumeration-constant - -:ref:`HeightFilter` **HEIGHT_FILTER_MINIMUM** = ``1`` - -Samples (1 << lod) \* 2 heights around the given coordinates and returns the lowest. .. rst-class:: classref-section-separator @@ -310,7 +161,11 @@ Constants **REGION_MAP_SIZE** = ``16`` :ref:`🔗` -Hard coded number of regions on a side. The total number of regions is this squared. +.. container:: contribute + + There is currently no description for this constant. Please help us by :ref:`contributing one `! + + .. rst-class:: classref-section-separator @@ -332,15 +187,9 @@ Property Descriptions - |void| **set_color_maps**\ (\ value\: :ref:`Array`\[:ref:`Image`\]\ ) - :ref:`Array`\[:ref:`Image`\] **get_color_maps**\ (\ ) -The Array of Images containing all the color maps for all regions. - -Image format: FORMAT_RGBA8, 32-bits per pixel as four 8-bit components. +.. container:: contribute -\ **RGB** is used for color, which is multiplied by albedo in the shader. Multiply is a blend mode that only darkens. - -\ **A** is used for a roughness modifier. A value of 0.5 means no change to the existing texture roughness. Higher than this value increases roughness, lower decreases it. - -The setter calls :ref:`set_maps`. + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -357,13 +206,9 @@ The setter calls :ref:`set_maps`. - |void| **set_control_maps**\ (\ value\: :ref:`Array`\[:ref:`Image`\]\ ) - :ref:`Array`\[:ref:`Image`\] **get_control_maps**\ (\ ) -The Array of Images containing all the control maps for all regions. - -Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. +.. container:: contribute -However we interpret these images as format: `RenderingDevice.DATA_FORMAT_R32_UINT `__ aka OpenGL RG32UI 32-bit per pixel as unsigned integer. See `Control map format <../docs/controlmap_format.html>`__. - -The setter calls :ref:`set_maps`. + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -380,15 +225,9 @@ The setter calls :ref:`set_maps`. - |void| **set_height_maps**\ (\ value\: :ref:`Array`\[:ref:`Image`\]\ ) - :ref:`Array`\[:ref:`Image`\] **get_height_maps**\ (\ ) -The Array of Images containing all the heightmaps for all regions. - -Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. - -Defines the height value of the terrain at a given pixel. This is sent to the vertex shader on the GPU which modifies the mesh in real-time. - -Editing is always done in 32-bit. We do provide an option to save as 16-bit, see :ref:`save_16_bit`, which converts to 32-bit on load and back to 16-bit on save. +.. container:: contribute -The setter calls :ref:`set_maps`. + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -405,7 +244,9 @@ The setter calls :ref:`set_maps`. - |void| **set_height_range**\ (\ value\: :ref:`Vector2`\ ) - :ref:`Vector2` **get_height_range**\ (\ ) -The highest and lowest heights for the sculpted terrain. Any :ref:`Terrain3DMaterial.world_background` used that extends the mesh height outside of this range will not change this variable. See :ref:`Terrain3D.render_cull_margin`. +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -422,13 +263,9 @@ The highest and lowest heights for the sculpted terrain. Any :ref:`Terrain3DMate - |void| **set_multimeshes**\ (\ value\: :ref:`Dictionary`\ ) - :ref:`Dictionary` **get_multimeshes**\ (\ ) -The storage for :ref:`Terrain3DInstancer`. Data is stored as a dictionary of dictionaries of MultiMeshes. - -First instances are separated by region offsets, which is the first key. - -Second, instances are separated by mesh id, which then gives the MultiMesh itself. +.. container:: contribute -`Dictionary{region_offset:Vector2i}` -> `Dictionary{mesh_id:int}` -> `MultiMesh`. + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -445,11 +282,9 @@ Second, instances are separated by mesh id, which then gives the MultiMesh itsel - |void| **set_region_offsets**\ (\ value\: :ref:`Array`\[:ref:`Vector2i`\]\ ) - :ref:`Array`\[:ref:`Vector2i`\] **get_region_offsets**\ (\ ) -An array of the active regions in region grid coordinates (+/-8, +/-8). e.g. { (0, 0), (-1, 3), (1, 1) }. It is ordered by the sequence in which regions were created, not by location. +.. container:: contribute -See :ref:`get_region_index` which returns the index into this array based on position. - -And :ref:`get_region_offset` which converts a position in world space to a region space, which is what is stored in this array. Eg. ``get_region_offset(Vector3(1500, 0, 1500))`` would return (1, 1). + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -466,7 +301,9 @@ And :ref:`get_region_offset` wh - |void| **set_region_size**\ (\ value\: :ref:`RegionSize`\ ) - :ref:`RegionSize` **get_region_size**\ (\ ) -The number of vertices in each sculptable region, and the number of pixels for each layer in the TextureArrays that store the height, control, and color maps. Limited to 1024 for now. This does not factor in :ref:`Terrain3D.mesh_vertex_spacing`. +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -483,7 +320,9 @@ The number of vertices in each sculptable region, and the number of pixels for e - |void| **set_save_16_bit**\ (\ value\: :ref:`bool`\ ) - :ref:`bool` **get_save_16_bit**\ (\ ) -Heightmaps are loaded and edited in 32-bit. This option converts the file to 16-bit upon saving to reduce file size. This process is lossy. +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -500,7 +339,9 @@ Heightmaps are loaded and edited in 32-bit. This option converts the file to 16- - |void| **set_version**\ (\ value\: :ref:`float`\ ) - :ref:`float` **get_version**\ (\ ) -Current version of this storage resource. This is used for upgrading data files and is independent of :ref:`Terrain3D.version`. The file and this variable are updated to the latest version upon saving this resource. +.. container:: contribute + + There is currently no description for this property. Please help us by :ref:`contributing one `! .. rst-class:: classref-section-separator @@ -511,455 +352,15 @@ Current version of this storage resource. This is used for upgrading data files Method Descriptions ------------------- -.. _class_Terrain3DStorage_method_add_region: - -.. rst-class:: classref-method - -:ref:`Error` **add_region**\ (\ global_position\: :ref:`Vector3`, images\: :ref:`Array`\[:ref:`Image`\] = [], update\: :ref:`bool` = true\ ) :ref:`🔗` - -Adds a region for sculpting and painting. This allocates new set of :ref:`region_size` sized image maps in memory and on disk to store sculpting and texture painting data. - -If the region already exists and image maps are included, the current maps will be overwritten. This means that if some maps are null, existing maps will be removed. - -Parameters: - -- p_global_position - the world position to place the region, which gets rounded down to the nearest region_size multiple. That means adding a region at (1500, 0, 1500) is the same as adding it at (1024, 0, 1024) when region_size is 1024. - -- p_images - Optional array of { Height, Control, Color } with region_sized images. See :ref:`MapType`. - -- p_update - rebuild the maps if true. Set to false if bulk adding many regions, then true on the last one or use :ref:`force_update_maps`. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_export_image: - -.. rst-class:: classref-method - -:ref:`Error` **export_image**\ (\ file_name\: :ref:`String`, map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` - -Exports the specified map type as one of r16/raw, exr, jpg, png, webp, res, tres. - -R16 or exr are recommended for roundtrip external editing. - -R16 can be edited by Krita, however you must know the dimensions and min/max before reimporting. This information is printed to the console. - -Res/tres allow storage in any of Godot's native Image formats. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_force_update_maps: - -.. rst-class:: classref-method - -|void| **force_update_maps**\ (\ map_type\: :ref:`MapType` = 3\ ) :ref:`🔗` - -Regenerates the TextureArrays that house the requested map types. Using the default :ref:`MapType` TYPE_MAX(3) will regenerate all map types. - -This function needs to be called after editing any of the maps. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_angle: - -.. rst-class:: classref-method - -:ref:`float` **get_angle**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the angle, aka uv rotation, painted on the control map at the requested position. Values are fixed to 22.5 degree intervals, for a maximum of 16 angles. 360 / 16 = 22.5. - -Returns ``NAN`` if the position is outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_color: - -.. rst-class:: classref-method - -:ref:`Color` **get_color**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the associated pixel on the color map at the requested position. - -Returns ``Color(NAN, NAN, NAN, NAN)`` if the position is outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_color_maps_rid: - -.. rst-class:: classref-method - -:ref:`RID` **get_color_maps_rid**\ (\ ) |const| :ref:`🔗` - -Provides access to the resource ID of the generated height map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See `Tips <../docs/tips.html#using-the-generated-height-map-in-other-shaders>`__ for an example. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_control: - -.. rst-class:: classref-method - -:ref:`int` **get_control**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the associated pixel on the control map at the requested position. - -Returns ``4,294,967,295`` aka ``UINT32_MAX`` if the position is outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_control_maps_rid: - -.. rst-class:: classref-method - -:ref:`RID` **get_control_maps_rid**\ (\ ) |const| :ref:`🔗` - -Provides access to the resource ID of the generated control map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See `Tips <../docs/tips.html#using-the-generated-height-map-in-other-shaders>`__ for an example. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_height: - -.. rst-class:: classref-method - -:ref:`float` **get_height**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the height at the requested position. If the position is close to a vertex, the pixel height on the heightmap is returned. Otherwise the value is interpolated from the 4 vertices surrounding the position. - -Returns ``NAN`` if the requested position is a hole or outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_height_maps_rid: - -.. rst-class:: classref-method - -:ref:`RID` **get_height_maps_rid**\ (\ ) |const| :ref:`🔗` - -Provides access to the resource ID of the generated height map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See `Tips <../docs/tips.html#using-the-generated-height-map-in-other-shaders>`__ for an example. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_map_region: - -.. rst-class:: classref-method - -:ref:`Image` **get_map_region**\ (\ map_type\: :ref:`MapType`, region_index\: :ref:`int`\ ) |const| :ref:`🔗` - -Returns the Image for the specified map type and region. E.g. Returns the region_size height map Image at the first defined region 0. - -.. rst-class:: classref-item-separator - ----- - .. _class_Terrain3DStorage_method_get_maps: .. rst-class:: classref-method :ref:`Array`\[:ref:`Image`\] **get_maps**\ (\ map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` -Returns an Array of Images containing all of the regions for the specified map type. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_maps_copy: - -.. rst-class:: classref-method - -:ref:`Array`\[:ref:`Image`\] **get_maps_copy**\ (\ map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` - -Returns a copy of the Array of Images containing all of the regions for the specified map type. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_mesh_vertex: - -.. rst-class:: classref-method - -:ref:`Vector3` **get_mesh_vertex**\ (\ lod\: :ref:`int`, filter\: :ref:`HeightFilter`, global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the position of a terrain vertex at a certain LOD. If the position is outside of defined regions or there is a hole, it returns ``NAN`` in the vector's Y coordinate. - -\ ``lod`` - Determines how many heights around the given global position will be sampled. Range 0 - 8. - -\ ``filter`` - Specifies how samples are filtered. See :ref:`HeightFilter`. - -\ ``global_position`` - X and Z coordinates of the vertex. Heights will be sampled around these coordinates. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_normal: - -.. rst-class:: classref-method - -:ref:`Vector3` **get_normal**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the terrain normal at the specified position. This function uses :ref:`get_height`. - -Returns ``Vector3(NAN, NAN, NAN)`` if the requested position is a hole or outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_pixel: - -.. rst-class:: classref-method - -:ref:`Color` **get_pixel**\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the pixel for the map type associated with the specified position. - -Returns ``Color(NAN, NAN, NAN, NAN)`` if the position is outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_region_count: - -.. rst-class:: classref-method - -:ref:`int` **get_region_count**\ (\ ) |const| :ref:`🔗` - -Returns the number of allocated regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_region_index: - -.. rst-class:: classref-method - -:ref:`int` **get_region_index**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the index into the :ref:`region_offsets` array for the region associated with the specified position. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_region_index_from_offset: - -.. rst-class:: classref-method - -:ref:`int` **get_region_index_from_offset**\ (\ region_offset\: :ref:`Vector2i`\ ) |const| :ref:`🔗` - -Returns the current region ID based on a Vector2i region offset. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_region_offset: - -.. rst-class:: classref-method - -:ref:`Vector2i` **get_region_offset**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Converts a world space position to region space. For a region_size of 1024 this basically means ``global_position/1024.0``. See :ref:`region_offsets`. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_region_offset_from_index: - -.. rst-class:: classref-method - -:ref:`Vector2i` **get_region_offset_from_index**\ (\ region_index\: :ref:`int`\ ) |const| :ref:`🔗` - -Returns a Vector2i region offset based on the current region ID. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_roughness: - -.. rst-class:: classref-method - -:ref:`float` **get_roughness**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the roughness modifier (wetness) on the color map alpha channel associated with the specified position. - -Returns ``Color(NAN, NAN, NAN, NAN)`` if the position is outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_scale: - -.. rst-class:: classref-method - -:ref:`float` **get_scale**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns the uv scale painted on the control map at the requested position. The value is a percentage difference from 100% scale. Eg. +20% or -40%. - -Returns ``NAN`` if the position is outside of defined regions. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_get_texture_id: - -.. rst-class:: classref-method - -:ref:`Vector3` **get_texture_id**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns ``Vector3(base texture id, overlay id, blend value)``. - -Returns ``Vector3(NAN, NAN, NAN)`` if the position is a hole or outside of defined regions. - -This is often used for playing footstep sounds. It's up to the gamedev to determine which is visually apparent based on shader settings. - -Due to blending, it won't be pixel perfect. Try having your player controller print this value while walking around to see how the blending values look. Perhaps you'll find that the overlay texture is visible starting at a blend value of .3 to .5, otherwise the base is visible. You can also observe the control blend debug view with :ref:`Terrain3DMaterial.show_control_blend`. - -Observing how this is done in The Witcher 3, there are only about 6 sounds used (snow, foliage, dirt, gravel, rock, wood), and except for wood, they are not pixel perfect. Wood is easy to do by detecting if the player is walking on wood meshes. The other 5 sounds are played when the player is in an area where the textures are blending. So it might play rock while over a dirt area. This shows pixel perfect accuracy is not important. It will still provide a seamless audio visual experience. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_has_region: - -.. rst-class:: classref-method - -:ref:`bool` **has_region**\ (\ global_position\: :ref:`Vector3`\ ) |const| :ref:`🔗` - -Returns true if the specified position has a region allocated. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_import_images: - -.. rst-class:: classref-method - -|void| **import_images**\ (\ images\: :ref:`Array`\[:ref:`Image`\], global_position\: :ref:`Vector3` = Vector3(0, 0, 0), offset\: :ref:`float` = 0.0, scale\: :ref:`float` = 1.0\ ) :ref:`🔗` +.. container:: contribute -Imports an Image set (Height, Control, Color) into this resource. It does NOT normalize values to 0-1. You must do that using get_min_max() and adjusting scale and offset. - -\ ``images`` - MapType.TYPE_MAX sized array of Images for Height, Control, Color. Images can be blank or null. - -\ ``global_position`` - X,0,Z position on the region map. Valid range is :ref:`Terrain3D.mesh_vertex_spacing` \* (+/-8192, +/-8192). - -\ ``offset`` - Add this factor to all height values, can be negative. - -\ ``scale`` - Scale all height values by this factor (applied after offset). - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_layered_to_image: - -.. rst-class:: classref-method - -:ref:`Image` **layered_to_image**\ (\ map_type\: :ref:`MapType`\ ) |const| :ref:`🔗` - -Returns an Image of the given map type that contains all regions in one large image. If the world has multiple islands, this function will return an image large enough to encompass all used regions, with black areas in between the islands. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_remove_region: - -.. rst-class:: classref-method - -|void| **remove_region**\ (\ global_position\: :ref:`Vector3`, update\: :ref:`bool` = true\ ) :ref:`🔗` - -Removes the region at the specified position from the :ref:`region_offsets` and the height, control, and color map arrays. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_save: - -.. rst-class:: classref-method - -|void| **save**\ (\ ) :ref:`🔗` - -Saves this storage resource to disk, if saved as an external ``.res`` file, which is the recommended practice. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_set_color: - -.. rst-class:: classref-method - -|void| **set_color**\ (\ global_position\: :ref:`Vector3`, color\: :ref:`Color`\ ) :ref:`🔗` - -Sets the color on the color map pixel associated with the specified position. See :ref:`set_pixel` for important information. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_set_control: - -.. rst-class:: classref-method - -|void| **set_control**\ (\ global_position\: :ref:`Vector3`, control\: :ref:`int`\ ) :ref:`🔗` - -Sets the value on the control map pixel associated with the specified position. See :ref:`set_pixel` for important information. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_set_height: - -.. rst-class:: classref-method - -|void| **set_height**\ (\ global_position\: :ref:`Vector3`, height\: :ref:`float`\ ) :ref:`🔗` - -Sets the height value on the heightmap pixel associated with the specified position. See :ref:`set_pixel` for important information. - -Unlike :ref:`get_height`, which interpolates between vertices, this function does not and will set the pixel at floored coordinates. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_set_map_region: - -.. rst-class:: classref-method - -|void| **set_map_region**\ (\ map_type\: :ref:`MapType`, region_index\: :ref:`int`, image\: :ref:`Image`\ ) :ref:`🔗` - -Sets the Image for the specified map type and region. This method calls :ref:`force_update_maps`. + There is currently no description for this method. Please help us by :ref:`contributing one `! .. rst-class:: classref-item-separator @@ -971,45 +372,9 @@ Sets the Image for the specified map type and region. This method calls :ref:`fo |void| **set_maps**\ (\ map_type\: :ref:`MapType`, maps\: :ref:`Array`\[:ref:`Image`\]\ ) :ref:`🔗` -Sets the Array of Images for the specified map type. This method calls :ref:`force_update_maps`. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_set_pixel: - -.. rst-class:: classref-method - -|void| **set_pixel**\ (\ map_type\: :ref:`MapType`, global_position\: :ref:`Vector3`, pixel\: :ref:`Color`\ ) :ref:`🔗` - -Sets the pixel for the map type associated with the specified position. This method is fine for setting a few pixels, but if you wish to modify thousands of pixels quickly, you should use :ref:`get_maps` or :ref:`get_map_region` and edit the images directly. - -After setting pixels you need to call :ref:`force_update_maps`. You may also need to regenerate collision if you don't have dynamic collision enabled. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_set_roughness: - -.. rst-class:: classref-method - -|void| **set_roughness**\ (\ global_position\: :ref:`Vector3`, roughness\: :ref:`float`\ ) :ref:`🔗` - -Sets the roughness modifier (wetness) on the color map alpha channel associated with the specified position. See :ref:`set_pixel` for important information. - -.. rst-class:: classref-item-separator - ----- - -.. _class_Terrain3DStorage_method_update_height_range: - -.. rst-class:: classref-method - -|void| **update_height_range**\ (\ ) :ref:`🔗` +.. container:: contribute -Evaluates every height map pixel for every region and updates :ref:`height_range`. + There is currently no description for this method. Please help us by :ref:`contributing one `! .. |virtual| replace:: :abbr:`virtual (This method should typically be overridden by the user to have any effect.)` .. |const| replace:: :abbr:`const (This method has no side effects. It doesn't modify any of the instance's member variables.)` diff --git a/doc/api/class_terrain3dtexture.rst b/doc/api/class_terrain3dtexture.rst index ac831da7..3f55f1af 100644 --- a/doc/api/class_terrain3dtexture.rst +++ b/doc/api/class_terrain3dtexture.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DTexture.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DTexture.xml. .. _class_Terrain3DTexture: diff --git a/doc/api/class_terrain3dtextureasset.rst b/doc/api/class_terrain3dtextureasset.rst index ecd1ef99..152c8481 100644 --- a/doc/api/class_terrain3dtextureasset.rst +++ b/doc/api/class_terrain3dtextureasset.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DTextureAsset.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DTextureAsset.xml. .. _class_Terrain3DTextureAsset: diff --git a/doc/api/class_terrain3dtexturelist.rst b/doc/api/class_terrain3dtexturelist.rst index d66e59e0..932d4d83 100644 --- a/doc/api/class_terrain3dtexturelist.rst +++ b/doc/api/class_terrain3dtexturelist.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DTextureList.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DTextureList.xml. .. _class_Terrain3DTextureList: diff --git a/doc/api/class_terrain3dutil.rst b/doc/api/class_terrain3dutil.rst index ff1843b2..fd82cf8e 100644 --- a/doc/api/class_terrain3dutil.rst +++ b/doc/api/class_terrain3dutil.rst @@ -2,8 +2,8 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. -.. XML source: https://github.com/godotengine/godot/tree/master/../_plugins/Terrain3D/doc/classes/Terrain3DUtil.xml. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. +.. XML source: https://github.com/godotengine/godot/tree/4.3/../_plugins/Terrain3D/doc/classes/Terrain3DUtil.xml. .. _class_Terrain3DUtil: @@ -47,55 +47,59 @@ Methods .. table:: :widths: auto - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`float` | :ref:`as_float`\ (\ value\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`as_uint`\ (\ value\: :ref:`float`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`black_to_alpha`\ (\ image\: :ref:`Image`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_auto`\ (\ pixel\: :ref:`bool`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_base`\ (\ base\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_blend`\ (\ blend\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_hole`\ (\ pixel\: :ref:`bool`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_nav`\ (\ pixel\: :ref:`bool`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_overlay`\ (\ overlay\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_uv_rotation`\ (\ rotation\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`enc_uv_scale`\ (\ scale\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_base`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_blend`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`get_filled_image`\ (\ size\: :ref:`Vector2i`, color\: :ref:`Color`, create_mipmaps\: :ref:`bool`, format\: :ref:`Format`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Vector2` | :ref:`get_min_max`\ (\ image\: :ref:`Image`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_overlay`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`get_thumbnail`\ (\ image\: :ref:`Image`, size\: :ref:`Vector2i` = Vector2i(256, 256)\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_uv_rotation`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`int` | :ref:`get_uv_scale`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_auto`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_hole`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`bool` | :ref:`is_nav`\ (\ pixel\: :ref:`int`\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`load_image`\ (\ file_name\: :ref:`String`, cache_mode\: :ref:`int` = 0, r16_height_range\: :ref:`Vector2` = Vector2(0, 255), r16_size\: :ref:`Vector2i` = Vector2i(0, 0)\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - | :ref:`Image` | :ref:`pack_image`\ (\ src_rgb\: :ref:`Image`, src_r\: :ref:`Image`, invert_green_channel\: :ref:`bool` = false\ ) |static| | - +-------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`float` | :ref:`as_float`\ (\ value\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`as_uint`\ (\ value\: :ref:`float`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`black_to_alpha`\ (\ image\: :ref:`Image`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_auto`\ (\ pixel\: :ref:`bool`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_base`\ (\ base\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_blend`\ (\ blend\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_hole`\ (\ pixel\: :ref:`bool`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_nav`\ (\ pixel\: :ref:`bool`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_overlay`\ (\ overlay\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_uv_rotation`\ (\ rotation\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`enc_uv_scale`\ (\ scale\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2i` | :ref:`filename_to_location`\ (\ filename\: :ref:`String`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_base`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_blend`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`get_filled_image`\ (\ size\: :ref:`Vector2i`, color\: :ref:`Color`, create_mipmaps\: :ref:`bool`, format\: :ref:`Format`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Vector2` | :ref:`get_min_max`\ (\ image\: :ref:`Image`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_overlay`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`get_thumbnail`\ (\ image\: :ref:`Image`, size\: :ref:`Vector2i` = Vector2i(256, 256)\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_uv_rotation`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`int` | :ref:`get_uv_scale`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_auto`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_hole`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`bool` | :ref:`is_nav`\ (\ pixel\: :ref:`int`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`load_image`\ (\ file_name\: :ref:`String`, cache_mode\: :ref:`int` = 0, r16_height_range\: :ref:`Vector2` = Vector2(0, 255), r16_size\: :ref:`Vector2i` = Vector2i(0, 0)\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`String` | :ref:`location_to_filename`\ (\ region_location\: :ref:`Vector2i`\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | :ref:`Image` | :ref:`pack_image`\ (\ src_rgb\: :ref:`Image`, src_r\: :ref:`Image`, invert_green_channel\: :ref:`bool` = false\ ) |static| | + +---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator @@ -250,6 +254,18 @@ Returns a control map uint with the texture scale encoded. See the top descripti ---- +.. _class_Terrain3DUtil_method_filename_to_location: + +.. rst-class:: classref-method + +:ref:`Vector2i` **filename_to_location**\ (\ filename\: :ref:`String`\ ) |static| :ref:`🔗` + +Converts a file name string like ``terrain3d-01_02.res`` to a region location like ``(-1, 2)``. - is negative, \_ is positive. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3DUtil_method_get_base: .. rst-class:: classref-method @@ -412,6 +428,18 @@ Loads a file from disk and returns an Image. ---- +.. _class_Terrain3DUtil_method_location_to_filename: + +.. rst-class:: classref-method + +:ref:`String` **location_to_filename**\ (\ region_location\: :ref:`Vector2i`\ ) |static| :ref:`🔗` + +Converts a region location like ``(-1, 2)`` to a file name string like ``terrain3d-01_02.res``. - is negative, \_ is positive. + +.. rst-class:: classref-item-separator + +---- + .. _class_Terrain3DUtil_method_pack_image: .. rst-class:: classref-method diff --git a/doc/api/index.rst b/doc/api/index.rst index 12409160..62c5043c 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -3,7 +3,7 @@ .. DO NOT EDIT THIS FILE!!! .. Generated automatically from Godot engine sources. -.. Generator: https://github.com/godotengine/godot/tree/master/doc/tools/make_rst.py. +.. Generator: https://github.com/godotengine/godot/tree/4.3/doc/tools/make_rst.py. .. _doc_class_reference: @@ -31,6 +31,7 @@ Resources class_terrain3dassets class_terrain3dmaterial class_terrain3dmeshasset + class_terrain3dregion class_terrain3dstorage class_terrain3dtexture class_terrain3dtextureasset @@ -44,6 +45,7 @@ Other objects :name: toc-class-ref-objects class_object + class_terrain3ddata class_terrain3deditor class_terrain3dinstancer class_terrain3dutil diff --git a/doc/build_docs.sh b/doc/build_docs.sh index aa7c7154..402ca3fe 100644 --- a/doc/build_docs.sh +++ b/doc/build_docs.sh @@ -7,7 +7,7 @@ pushd $REPO echo Running Godot to dump XML files cd $REPO/project -$GODOT --doctool ../ +$GODOT --doctool ../ | egrep 'Godot Engine' rm -rf ../{modules,platform} cd $REPO/doc @@ -18,7 +18,7 @@ $MAKERST --verbose --filter Terrain3D --output api classes/ find classes -type f ! -name 'Terrain3D*' -delete make clean -make html +make html 2>&1 | grep -Pv 'WARNING: undefined label: (?!'\''class_terrain3d)' | egrep -v '(copying images|writing output|reading sources)...' start _build/html/index.html popd diff --git a/doc/classes/Terrain3D.xml b/doc/classes/Terrain3D.xml index 509ac084..62d0e4f3 100644 --- a/doc/classes/Terrain3D.xml +++ b/doc/classes/Terrain3D.xml @@ -12,11 +12,11 @@ - + Generates a static ArrayMesh for the terrain. [code skip-lint]lod[/code] - Determines the granularity of the generated mesh. The range is 0-8. 4 is recommended. - [code skip-lint]filter[/code] - Controls how vertex Y coordinates are generated from the height map. See [enum Terrain3DStorage.HeightFilter]. + [code skip-lint]filter[/code] - Controls how vertex Y coordinates are generated from the height map. See [enum Terrain3DData.HeightFilter]. @@ -89,6 +89,12 @@ Sets the EditorPlugin connected to Terrain3D. + + + + This function is deprecated. It facilitates upgrading the previous storage version to the new format. + + @@ -106,12 +112,21 @@ The priority used to solve collisions. The higher priority, the lower the penetration of a colliding object. + + This class manages loading, saving, adding, and removing of Terrain3DRegions and access to their content. + + + The directory where terrain data will be saved to and loaded from. + The verbosity of debug messages printed to the console. Errors and warnings are always printed. This can also be set via command line using [code skip-lint]--terrain3d-debug=LEVEL[/code] where [code skip-lint]LEVEL[/code] is one of [code skip-lint]ERROR, INFO, DEBUG, DEBUG_CONT[/code]. The last is for continuously recurring messages like position updates for the mesh as the camera moves around. If collision is enabled, this generates collision in the editor and in game. It can be visible in the editor by enabling [code skip-lint]View Gizmos[/code] in the viewport menu. + + Display an overlay that shows region locations in the viewport. + The active [Terrain3DInstancer] object. @@ -127,14 +142,17 @@ The distance between vertices. Godot units are typically considered to be meters. This scales the terrain on X and Z axes. This variable changes the global position of landscape features. A mountain peak might be at (512, 512), but with a vertex spacing of 2.0 it is now located at (1024, 1024). - All Terrain3D functions with a global_position expect an absolute global value. If you would normally use [method Terrain3DStorage.import_images] to import an image in the region at (-1024, -1024), with a mesh_vertex_spacing of 2, you'll need to import that image at (-2048, -2048) to place it in the same region. + All Terrain3D functions with a global_position expect an absolute global value. If you would normally use [method Terrain3DData.import_images] to import an image in the region at (-1024, -1024), with a mesh_vertex_spacing of 2, you'll need to import that image at (-2048, -2048) to place it in the same region. To scale heights, export the height map and reimport it with a new height scale. + + The number of vertices in each region, and the number of pixels for each map in Terrain3DRegion. 1 pixel corresponds to 1 vertex. [member Terrain3D.mesh_vertex_spacing] scales regions, but does not change the number of vertices or pixels. + Tells the renderer how to cast shadows from the terrain onto other objects. This sets [code skip-lint]GeometryInstance3D.ShadowCastingSetting[/code] in the engine. - This margin is added to the vertical component of the terrain bounding box (AABB). The terrain already sets its AABB from [member Terrain3DStorage.height_range], which is calculated while sculpting. This setting only needs to be used if the shader has expanded the terrain beyond the AABB and the terrain meshes are being culled at certain viewing angles. This might happen from using [member Terrain3DMaterial.world_background] with NOISE and a height value larger than the terrain heights. This setting is similar to [code skip-lint]GeometryInstance3D.extra_cull_margin[/code], but it only affects the Y axis. + This margin is added to the vertical component of the terrain bounding box (AABB). The terrain already sets its AABB from [method Terrain3DData.get_height_range], which is calculated while sculpting. This setting only needs to be used if the shader has expanded the terrain beyond the AABB and the terrain meshes are being culled at certain viewing angles. This might happen from using [member Terrain3DMaterial.world_background] with NOISE and a height value larger than the terrain heights. This setting is similar to [code skip-lint]GeometryInstance3D.extra_cull_margin[/code], but it only affects the Y axis. The render layers the terrain is drawn on. This sets [code skip-lint]VisualInstance3D.layers[/code] in the engine. The defaults is layer 1 and 32 (for the mouse cursor). When you set this, make sure the layer for [member render_mouse_layer] is included, or set that variable again after this so that the mouse cursor works. @@ -145,8 +163,11 @@ You may place other objects on this layer, however [code skip-lint]get_intersection[/code] will report intersections with them. So either dedicate this layer to Terrain3D, or if you must use all 32 layers, dedicate this one during editing or when using [code skip-lint]get_intersection[/code], and then you can use it during game play. See [method get_intersection]. + + Heightmaps are always loaded and edited in 32-bit. This option saves heightmaps as 16-bit half precision to reduce file size. This process is lossy, but does not change what is currently in memory. + - The object that houses all Terrain3D region, height, control, and color maps. Make sure to save this as an external [code skip-lint].res[/code] binary file. + This object is deprecated and only used for upgrading. Don't use. Deprecated. See [member assets]. @@ -166,10 +187,10 @@ Emitted when [member material] is changed. - - - Emitted when [member storage] is changed. - - + + + Region size is 1024 x 1024 vertices and pixels on maps. + + diff --git a/doc/classes/Terrain3DAssets.xml b/doc/classes/Terrain3DAssets.xml index f49d7ba8..6c7c6604 100644 --- a/doc/classes/Terrain3DAssets.xml +++ b/doc/classes/Terrain3DAssets.xml @@ -16,6 +16,12 @@ Generates mesh asset preview thumbnails for the asset dock, stored within each mesh asset. Specify id -1 to generate all. + + + + Returns the resource ID of the TextureArray generated from combining all albedo and height textures. + + @@ -29,6 +35,12 @@ Returns the number of mesh assets in the list. + + + + Returns the resource ID of the TextureArray generated from combining all normal and roughness textures. + + @@ -36,12 +48,30 @@ Returns the Terrain3DTextureAsset with the requested ID. + + + + Returns the array of all albedo colors used in the texture assets, indexed by asset id. + + Returns the number of texture slots used. + + + + Returns the array of all detiling values used in the texture assets, indexed by asset id. + + + + + + Returns the array of all uv scale values used in the texture assets, indexed by asset id. + + @@ -64,6 +94,18 @@ Adds a Terrain3DTextureAsset at the specified ID slot. The texture can be null to clear the slot, or remove it if its the last in the list. If the specified slot is full, it will be swapped with the source texture ID, or will find the next available ID. + + + + Updates the internal list of meshes used by the instancer. + + + + + + Regenerates the texture arrays from the list of texture assets, which is sent to the shader. + + diff --git a/doc/classes/Terrain3DData.xml b/doc/classes/Terrain3DData.xml new file mode 100644 index 00000000..4294d548 --- /dev/null +++ b/doc/classes/Terrain3DData.xml @@ -0,0 +1,490 @@ + + + + + + Terrain3D divides all data into regions which fit on a grid in the world. These coordinates are called region locations. The map data are stored in instances of [Terrain3DRegion], which are saved to individual files. This class manages region loading, unloading, data retreival and manipulation. + + + + + + + + + + Adds a region for sculpting and painting. + The region should already be configured with the desired location and maps before sending to this function. + Upon saving, this region will be written to a data file stored in [member Terrain3D.data_directory]. + - update - regenerates the texture arrays if true. Set to false if bulk adding many regions, then true on the last one or use [method force_update_maps]. + + + + + + + + Creates and adds a blank region at the specified location. See [method add_region]. + + + + + + + + Creates and adds a blank region at a region location encompassing the specified global position. See [method add_region]. + + + + + + + Recalculates the master height range for the whole terrain by summing the height ranges of all active regions. + Recursive mode does the same, but has each region recalculate heights from each heightmap pixel. See [method Terrain3DRegion.calc_height_range]. + + + + + + + + Exports the specified map type as one of r16/raw, exr, jpg, png, webp, res, tres. + R16 or exr are recommended for roundtrip external editing. + R16 can be edited by Krita, however you must know the dimensions and min/max before reimporting. This information is printed to the console. + Res/tres allow storage in any of Godot's native Image formats. + + + + + + + + Regenerates the region map and TextureArrays that house the requested map types. Using the default [enum Terrain3DRegion.MapType] TYPE_MAX(3) will regenerate all map types. + This function needs to be called after editing any of the maps. + - generate_mipmaps - Generates mipmaps for the color maps. This can also be done on individual regions with [code skip-lint]region.get_color_map().generate_mipmaps()[/code]. + + + + + + + Returns the angle, aka uv rotation, painted on the control map at the requested position. Values are fixed to 22.5 degree intervals, for a maximum of 16 angles. 360 / 16 = 22.5. + Returns [code skip-lint]NAN[/code] if the position is outside of defined regions. + + + + + + + Returns the associated pixel on the color map at the requested position. + Returns [code skip-lint]Color(NAN, NAN, NAN, NAN)[/code] if the position is outside of defined regions. + + + + + + Returns the resource ID of the generated height map Texture Array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See [url=../docs/tips.html#using-the-generated-height-map-in-other-shaders]Tips[/url] for an example. + + + + + + + Returns the associated pixel on the control map at the requested position. + Returns [code skip-lint]4,294,967,295[/code] aka [code skip-lint]UINT32_MAX[/code] if the position is outside of defined regions. + + + + + + Returns the resource ID of the generated control map Texture Array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See [url=../docs/tips.html#using-the-generated-height-map-in-other-shaders]Tips[/url] for an example. + + + + + + + Returns the height at the requested position. If the position is close to a vertex, the pixel height on the heightmap is returned. Otherwise the value is interpolated from the 4 vertices surrounding the position. + Returns [code skip-lint]NAN[/code] if the requested position is a hole or outside of defined regions. + + + + + + Returns the resource ID of the generated height map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See [url=../docs/tips.html#using-the-generated-height-map-in-other-shaders]Tips[/url] for an example. + + + + + + Returns the highest and lowest heights for the sculpted terrain used to set the world AABB. See [method calc_height_range]. + Any [member Terrain3DMaterial.world_background] used that extends the mesh outside of this range will not change this variable. You need to set [member Terrain3D.render_cull_margin] or the renderer will clip meshes. + + + + + + + Returns an Array of Images from all regions of the specified map type. + + + + + + + + + Returns the position of a terrain vertex at a certain LOD. If the position is outside of defined regions or there is a hole, it returns [code skip-lint]NAN[/code] in the vector's Y coordinate. + [code skip-lint]lod[/code] - Determines how many heights around the given global position will be sampled. Range 0 - 8. + [code skip-lint]filter[/code] - Specifies how samples are filtered. See [enum HeightFilter]. + [code skip-lint]global_position[/code] - X and Z coordinates of the vertex. Heights will be sampled around these coordinates. + + + + + + + Returns the terrain normal at the specified position. This function uses [method get_height]. + Returns [code skip-lint]Vector3(NAN, NAN, NAN)[/code] if the requested position is a hole or outside of defined regions. + + + + + + + + Returns the pixel for the map type associated with the specified position. + Returns [code skip-lint]Color(NAN, NAN, NAN, NAN)[/code] if the position is outside of defined regions. + + + + + + + Return the [Terrain3DRegion] at the specified location. This will return inactive regions marked for deletion. Check with [member Terrain3DRegion.deleted]. + + + + + + Returns the number of active regions; those not marked for deletion. + + + + + + + Returns -1 if no region or out of bounds at the given location, otherwise returns the current region id. + The region_id is the index into the TextureArrays sent to the shader, and can change at any time. Gamedevs should generally index regions by location. However, this function is useful to determine if the location is a valid region. + + + + + + + Returns the region id at a global position. See [method get_region_id]. + + + + + + + Returns the calculated region location for the given global position. This is just a calculation and does no bounds checking or verification that a region exists. See [method get_region_map_index] for bounds checking, or [method has_region] for checking existance. + + + + + + Returns a fully populated 16 x 16 array. The array location contains the region id + 1, or 0, which means no region. + See [method get_region_map_index]. + + + + + + + Given a region location, returns the index into the region map array. See [method get_region_map]. + You can use this function to quickly determine if a location is within the greater world bounds (-8,-8) to (7, 7). It returns -1 if not. + + + + + + + Returns the region at the specified global position. This will return inactive regions marked for deletion. Check with [member Terrain3DRegion.deleted]. + + + + + + + + Returns an array of active regions not marked for deletion. Each region knows its own location. See [member Terrain3DRegion.location]. + - copy - returns a shallow copy of the regions; region map references are copied. + - deep - returns a deep copy of the regions; region maps are full duplicates. + + + + + + Returns all regions in a dictionary indexed by region location. Some regions may be marked for deletion. + + + + + + + Returns the roughness modifier (wetness) on the color map alpha channel associated with the specified position. + Returns [code skip-lint]Color(NAN, NAN, NAN, NAN)[/code] if the position is outside of defined regions. + + + + + + + Returns the uv scale painted on the control map at the requested position. The value is a percentage difference from 100% scale. Eg. +20% or -40%. + Returns [code skip-lint]NAN[/code] if the position is outside of defined regions. + + + + + + + Returns [code skip-lint]Vector3(base texture id, overlay id, blend value)[/code]. + Returns [code skip-lint]Vector3(NAN, NAN, NAN)[/code] if the position is a hole or outside of defined regions. + This is often used for playing footstep sounds. It's up to the gamedev to determine which is visually apparent based on shader settings. + Due to blending, it won't be pixel perfect. Try having your player controller print this value while walking around to see how the blending values look. Perhaps you'll find that the overlay texture is visible starting at a blend value of .3 to .5, otherwise the base is visible. You can also observe the control blend debug view with [member Terrain3DMaterial.show_control_blend]. + Observing how this is done in The Witcher 3, there are only about 6 sounds used (snow, foliage, dirt, gravel, rock, wood), and except for wood, they are not pixel perfect. Wood is easy to do by detecting if the player is walking on wood meshes. The other 5 sounds are played when the player is in an area where the textures are blending. So it might play rock while over a dirt area. This shows pixel perfect accuracy is not important. It will still provide a seamless audio visual experience. + + + + + + + Returns true if the specified region location has an active region. + + + + + + + Returns true if the specified global position has an active region. + + + + + + + + + + Imports an Image set (Height, Control, Color) into this resource. It does NOT normalize values to 0-1. You must do that using get_min_max() and adjusting scale and offset. + [code skip-lint]images[/code] - MapType.TYPE_MAX sized array of Images for Height, Control, Color. Images can be blank or null. + [code skip-lint]global_position[/code] - X,0,Z position on the region map. Valid range is [member Terrain3D.mesh_vertex_spacing] * (+/-8192, +/-8192). + [code skip-lint]offset[/code] - Add this factor to all height values, can be negative. + [code skip-lint]scale[/code] - Scale all height values by this factor (applied after offset). + + + + + + + Returns true if the region at the location exists and is marked as deleted. Syntactic sugar for [member Terrain3DRegion.deleted]. + + + + + + + Returns true if the region at the location exists and is marked as modified. Syntactic sugar for [member Terrain3DRegion.modified]. + + + + + + + Returns an Image of the given map type that contains all regions in one large image. If the world has multiple islands, this function will return an image large enough to encompass all used regions, with black areas in between the islands. + + + + + + + Loads all of the Terrain3DRegion files found in the specified directory. Then it rebuilds all map arrays. + + + + + + + + + Loads the specified region location file. + - update - rebuild maps if true. + + + + + + + + Marks the specified region as deleted. This deactivates it so it won't render it on screen once maps are updated, unless marked not deleted. The file will be deleted from disk upon saving. + + + + + + + + Removes the region at the specified location. See [method remove_region]. + + + + + + + + Removes the region at the specified global_position. See [method remove_region]. + + + + + + + This saves all active regions into the specified directory. + + + + + + + + + Saves the specified active region to the directory. See [method Terrain3DRegion.save]. + - region_location - the region to save. + - 16_bit - converts the edited 32-bit heightmap to 16-bit. This is a lossy operation. + + + + + + + + Sets the color on the color map pixel associated with the specified position. See [method set_pixel] for important information. + + + + + + + + Sets the value on the control map pixel associated with the specified position. See [method set_pixel] for important information. + + + + + + + + Sets the height value on the heightmap pixel associated with the specified position. See [method set_pixel] for important information. + Unlike [method get_height], which interpolates between vertices, this function does not and will set the pixel at floored coordinates. + + + + + + + + + Sets the pixel for the map type associated with the specified position. This method is fine for setting a few pixels, but if you wish to modify thousands of pixels quickly, you should get the region and [method Terrain3DRegion.get_map] to edit the images directly. + After setting pixels you need to call [method force_update_maps]. You may also need to regenerate collision if you don't have dynamic collision enabled. + + + + + + + + Marks a region as deleted. It will stop displaying when maps are updated. The file will be removed on save. + + + + + + + + Sets the region as modified. It will be written to disk when saved. Syntactic sugar for [member Terrain3DRegion.modified]. + + + + + + + + Sets the roughness modifier (wetness) on the color map alpha channel associated with the specified position. See [method set_pixel] for important information. + + + + + + An Array[Image] containing references to all of the color maps in all regions. See [member Terrain3DRegion.color_map]. + + + An Array[Image] containing references to all of the control maps in all regions. See [member Terrain3DRegion.control_map]. + + + An Array[Image] containing references to all of the height maps in all regions. See [member Terrain3DRegion.height_map]. + + + The array of all active region locations; those not marked for deletion. + + + + + + Emitted when the color maps array is regenerated. + + + + + Emitted when the control maps array is regenerated. + + + + + Emitted when the height maps array is regenerated. + + + + + Emitted when the region map or any map array has been regenerated. + + + + + + This signal is emitted whenever the editor is used to: + - add or remove a region + - alter a region map with a brush tool + - undo or redo any of the above operations + The parameter contains the axis-aligned bounding box of the area edited. + + + + + Emitted when the region map is regenerated. + + + + + + Samples the height map at the exact coordinates given. + + + Samples (1 << lod) * 2 heights around the given coordinates and returns the lowest. + + + Hard coded number of regions on a side. The total number of regions is this squared. + + + diff --git a/doc/classes/Terrain3DEditor.xml b/doc/classes/Terrain3DEditor.xml index 201b503c..e5e020db 100644 --- a/doc/classes/Terrain3DEditor.xml +++ b/doc/classes/Terrain3DEditor.xml @@ -10,15 +10,22 @@ - + + + Undo the previous changes, with the provided data. Used by Godot, not gamedevs. + + + + + - Undo the previous changes, with the reverted images in the array. Used by Godot, not users. + Adds a region to the currently pending operation undo snapshot. [method is_operating] must be true. - Returns the current operation. + Returns the current selected tool operation (eg. add, subtract). @@ -36,7 +43,7 @@ - Returns true if currently brushing. + Returns true if currently in the middle of a brushing operation. diff --git a/doc/classes/Terrain3DInstancer.xml b/doc/classes/Terrain3DInstancer.xml index 7234cdcb..b8e3fbc5 100644 --- a/doc/classes/Terrain3DInstancer.xml +++ b/doc/classes/Terrain3DInstancer.xml @@ -3,18 +3,17 @@ - This class places mesh instances into MultiMeshInstance3Ds. When providing a scene file, currently only the first mesh found is used. LODs will be supported later. Multimeshes only support one mesh object, so complex objects like tree trunks and leaves, or a door frame and door either need to be combined into one object with multiple materials, or placed by another method. Read the [url=https://docs.godotengine.org/en/stable/classes/class_multimesh.html]Godot MultiMesh docs[/url] for more information. - Data is currently stored in MultiMeshes within a Dictionary [member Terrain3DStorage.multimeshes], per region offset, per mesh type. These MultiMeshes are loaded into MultiMeshInstances, which are attached to the scene tree and managed by this class. + This class places mesh instances into MultiMeshInstance3Ds defined in the Terrain3D asset dock. + Data is currently stored in MultiMeshes within a Dictionary [member Terrain3DRegion.multimeshes], per region, per mesh type. These MultiMeshes are loaded into MultiMeshInstances, which are attached to the scene tree and managed by this class. [b]The methods available for adding instances are:[/b] - * [method add_instances] - A feature rich function designed for hand editing via Terrain3DEditor. - * [method add_multimesh] - Pulls the transforms out of your MultiMesh and calls add_transforms. - * [method add_transforms] - Accepts your list of transforms and parses them into our storage system. - * Creating your own MultiMesh resources and inserting them directly into the [member Terrain3DStorage.multimeshes] dictionary. It's not difficult to do this in GDScript, but a thorough understanding of the C++ code in this class is recommended. Specifically look at `update_multimesh()`. + - [method add_instances] - A feature rich function designed for hand editing via Terrain3DEditor. + - [method add_multimesh] - Pulls the transforms out of your MultiMesh and calls add_transforms. + - [method add_transforms] - Accepts your list of transforms and parses them into our data storage. + - Creating your own MultiMesh resources and inserting them directly into the [member Terrain3DRegion.multimeshes] dictionary. It's not difficult to do this in GDScript, but a thorough understanding of the C++ code in this class is recommended. Specifically look at `update_multimesh()`. [b]The methods available for removing instances are:[/b] - * [method remove_instances] - Like add_instances, this is can be used procedurally but is designed for hand editing. - * [method clear_by_mesh], [method clear_by_region_id], [method clear_by_offset] - To erase large sections of instances - * [code skip-lint]storage.set_multimeshes(Dictionary())[/code] - This will erase all instancer data and destroy all MultiMeshInstances. Run it in a @tool script to clear the data within the editor. - [b]Note:[/b] one caveat about creating your own MultiMeshes is the instance count cannot be changed after creation. Should you wish to remove 50% of the transforms, you would need to make a new MultiMesh, copy over the mesh and settings, copy the 50% of the transforms you wish to keep, and assign it to the MultiMeshInstance3D. That is how the instancer updates the MMIs in C++. + - [method remove_instances] - Like add_instances, this is can be used procedurally but is designed for hand editing. + - [method clear_by_mesh], [method clear_by_location] - To erase large sections of instances + [b]Note:[/b] one caveat about creating your own MultiMeshes is the instance count cannot be changed after creation. Should you wish to remove 50% of the transforms, you would need to make a new MultiMesh, copy over the mesh and settings, copy the 50% of the transforms you wish to keep, and assign it to the MultiMeshInstance3D. That is how the instancer updates the MMIs. @@ -42,13 +41,13 @@ - Allows procedural placement of meshes. The [Terrain3DMeshAsset] mesh_id should already be setup. Then you provide the array of Transform3Ds and optional Colors, which will be parsed into our region based storage system and fed directly into the appropriate MultiMeshInstances. + Allows procedural placement of meshes. The [Terrain3DMeshAsset] mesh_id should already be setup. Then you provide the array of Transform3Ds and optional Colors, which will be parsed into our region based data storage and fed directly into the appropriate MultiMeshInstances. This function adds the [member Terrain3DMeshAsset.height_offset] to the transform along its local Y axis. - + @@ -57,33 +56,31 @@ Appends new transforms to existing multimeshes. Multimesh transform arrays cannot be modified and must be rebuilt. This will make a new array with both old and new transforms. `Clear` will skip the old array. - + - + + - Removes both MultiMeshInstance nodes attached to the tree, and MultiMeshes in Storage for all regions that match mesh id. + Removes MultiMeshInstance nodes attached to the tree, and MultiMeshes in Terrain3DRegions that match both the region location and the mesh id. - + - - + - Removes both MultiMeshInstance nodes attached to the tree, and MultiMeshes in Storage for the specified region offset and mesh id. + Removes MultiMeshInstance nodes attached to the tree, and MultiMeshes in Terrain3DRegions that match the mesh id. - + - - - Removes both MultiMeshInstance nodes attached to the tree, and MultiMeshes in Storage for the specified region id and mesh id. + Removes and rebuilds all MultiMeshInstances. - Returns the dictionary containing the MultiMeshInstance3D nodes, which are hidden children of Terrain3D. The dictionary is keyed by Vector3i(region_offset.x, region_offset.y, mesh_id). + Returns the dictionary containing the MultiMeshInstance3D nodes, which are hidden children of Terrain3D. The dictionary is keyed by Vector3i(region_location.x, region_location.y, mesh_id). @@ -102,6 +99,14 @@ Tells the renderer how to cast shadows from this mesh asset onto the terrain and other objects. This sets [code skip-lint]GeometryInstance3D.ShadowCastingSetting[/code] on all MultiMeshInstances for the specified mesh. This function is called by [member Terrain3DMeshAsset.cast_shadows], but you can also call it manually. + + + + + + Swaps the ID of two meshes, without changing the mesh instances on the ground. Updates Multimesh and MMI dictionary keys. + + diff --git a/doc/classes/Terrain3DMeshAsset.xml b/doc/classes/Terrain3DMeshAsset.xml index c848aab7..78180d68 100644 --- a/doc/classes/Terrain3DMeshAsset.xml +++ b/doc/classes/Terrain3DMeshAsset.xml @@ -3,10 +3,10 @@ - This class provides one of two mesh types for instancing. + This class provides one of two mesh types for instancing. First, this class will generate a texture card, using a QuadMesh. The typical use for a texture card is to place a flat grass texture in the `albedo texture` slot in the override material, and enable alpha scissor. This will generate low poly grass. - Second, you can link this resource to a mesh scene file, which is specifically a PackedScene (.tscn, .scn, .glb, .fbx, etc). You can override the material if desired. - Currently, the system will use only the first MeshInstance3D it finds in the file. It doesn't apply any transforms nor collision found in the file. Auto generated lods are used by the engine. + Second, you can link this resource to a mesh scene file, which is specifically a PackedScene (.tscn, .scn, .glb, .fbx, etc). You can override the material if desired. Multimeshes only support one mesh object, so complex objects like tree trunks and leaves, or a door frame and door either need to be combined into one object with multiple materials, or placed by another method. Read the [url=https://docs.godotengine.org/en/stable/classes/class_multimesh.html]Godot MultiMesh docs[/url] for more information. + Currently, the system will use only the first MeshInstance3D it finds in the file. It doesn't apply any transforms nor collision found in the file. Auto generated LODs are used by the engine. Manual LODs will be supported later. diff --git a/doc/classes/Terrain3DRegion.xml b/doc/classes/Terrain3DRegion.xml new file mode 100644 index 00000000..b09669fa --- /dev/null +++ b/doc/classes/Terrain3DRegion.xml @@ -0,0 +1,169 @@ + + + + + + This resource stores all map data for Terrain3D. See [url=../docs/controlmap_format.html]Controlmap Format[/url] and [url=../docs/storage_format.html]Storage Format Changelog[/url]. + + + + + + + + Recalculates the height range for this region by looking at every pixel in the heightmap. + + + + + + + Returns a duplicate copy of this node, with references to the same image maps and multimeshes. + - deep - Also make complete duplicates of the maps and multimeshes. + + + + + + Returns all data in this region in a dictionary. + + + + + + + Returns the specified image map. + + + + + + Returns an Array[Image] with height, control, and color maps. + + + + + + + + Validates and adjusts the map size and format if possible, or creates a usable blank image in the right size and format. + + + + + + Sanitizes all map types. See [method sanitize_map]. + + + + + + + + Saves this region to the current file name. + - path - specifies a directory and file name to use from now on. + - 16-bit - save this region with 16-bit height map instead of 32-bit. This process is lossy. + + + + + + + Overwrites all local variables with values in the dictionary. + + + + + + + + Assigns the provided map to the desired map type. + + + + + + + Expects an array with three images in it, and assigns them to the height, control, and color maps. + + + + + + + When sculpting, this is called to provide the current height. It may expand the vertical bounds, which is used to calculate the terrain AABB. + + + + + + + When sculpting the terrain, this is called to provide both a low and high height. It may expand the vertical bounds, which is used to calculate the terrain AABB. + + + + + + + This validates the map size according to previously loaded maps. + + + + + + This map is used to paint color that blends in to the terrain textures. + Image format: FORMAT_RGBA8, 32-bits per pixel as four 8-bit components. + [b]RGB[/b] is used for color, which is multiplied by albedo in the shader. Multiply is a blend mode that only darkens. + [b]A[/b] is used for a roughness modifier. A value of 0.5 means no change to the existing texture roughness. Higher than this value increases roughness, lower decreases it. + + + This map tells the shader which textures to use where, how to blend, where to place holes, etc. + Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. + However, we interpret these images as format: [url=https://docs.godotengine.org/en/stable/classes/class_renderingdevice.html#class-renderingdevice-constant-data-format-r32-uint]RenderingDevice.DATA_FORMAT_R32_UINT[/url] aka OpenGL RG32UI 32-bit per pixel as unsigned integer. See [url=../docs/controlmap_format.html]Control map format[/url]. + + + This region is marked for deletion. It won't be rendered once [method Terrain3DData.force_update_maps] rebuilds the map index. The file will be deleted from disk on [method save]. + + + This region is marked for saving in the undo/redo system by [Terrain3DEditor] during an operation. + + + This map contains the real value heights for the terrain. + Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. + Heights sent to the vertex shader on the GPU which modifies the mesh in real-time. + Editing is always done in 32-bit. We do provide an option to save as 16-bit, see [member Terrain3D.save_16_bit], which converts to 32-bit on load and back to 16-bit on save. This process is lossy as 16-bit precision gets increasingly worse with every power of 2. + + + The current minimum and maximum height range for this region, used to calculate the AABB of the terrain. Update it with [method update_height], and recalculate it with [method calc_height_range]. + + + The region location, or region grid coordinates in the world space where this region lives. + + + This region has been modified and will be saved. + + + A Dictionary indexed by mesh_id that provides the MultiMeshes for this region. + + + The current region size for this region, calculated from the dimensions of the first loaded map. It should match [member Terrain3D.region_size]. + + + The data file version. This is independent of the Terrain3D version, though they often align. + + + + + Height map - real values, eg. 10m, 44.5m. + + + Control map - defines where textures and holes are placed. + + + Color map - paints color on the terrain + + + The number of elements in this enum. + + + diff --git a/doc/classes/Terrain3DStorage.xml b/doc/classes/Terrain3DStorage.xml index cc0e1ef9..ecb24e53 100644 --- a/doc/classes/Terrain3DStorage.xml +++ b/doc/classes/Terrain3DStorage.xml @@ -3,280 +3,15 @@ - This resource stores all map data for Terrain3D. See [url=../docs/controlmap_format.html]Controlmap Format[/url] and [url=../docs/storage_format.html]Storage Format Changelog[/url]. + This class is deprecated and has been replaced by [Terrain3DData]. - - - - - - - Adds a region for sculpting and painting. This allocates new set of [member region_size] sized image maps in memory and on disk to store sculpting and texture painting data. - If the region already exists and image maps are included, the current maps will be overwritten. This means that if some maps are null, existing maps will be removed. - Parameters: - - p_global_position - the world position to place the region, which gets rounded down to the nearest region_size multiple. That means adding a region at (1500, 0, 1500) is the same as adding it at (1024, 0, 1024) when region_size is 1024. - - p_images - Optional array of { Height, Control, Color } with region_sized images. See [enum MapType]. - - p_update - rebuild the maps if true. Set to false if bulk adding many regions, then true on the last one or use [method force_update_maps]. - - - - - - - - Exports the specified map type as one of r16/raw, exr, jpg, png, webp, res, tres. - R16 or exr are recommended for roundtrip external editing. - R16 can be edited by Krita, however you must know the dimensions and min/max before reimporting. This information is printed to the console. - Res/tres allow storage in any of Godot's native Image formats. - - - - - - - Regenerates the TextureArrays that house the requested map types. Using the default [enum MapType] TYPE_MAX(3) will regenerate all map types. - This function needs to be called after editing any of the maps. - - - - - - - Returns the angle, aka uv rotation, painted on the control map at the requested position. Values are fixed to 22.5 degree intervals, for a maximum of 16 angles. 360 / 16 = 22.5. - Returns [code skip-lint]NAN[/code] if the position is outside of defined regions. - - - - - - - Returns the associated pixel on the color map at the requested position. - Returns [code skip-lint]Color(NAN, NAN, NAN, NAN)[/code] if the position is outside of defined regions. - - - - - - Provides access to the resource ID of the generated height map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See [url=../docs/tips.html#using-the-generated-height-map-in-other-shaders]Tips[/url] for an example. - - - - - - - Returns the associated pixel on the control map at the requested position. - Returns [code skip-lint]4,294,967,295[/code] aka [code skip-lint]UINT32_MAX[/code] if the position is outside of defined regions. - - - - - - Provides access to the resource ID of the generated control map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See [url=../docs/tips.html#using-the-generated-height-map-in-other-shaders]Tips[/url] for an example. - - - - - - - Returns the height at the requested position. If the position is close to a vertex, the pixel height on the heightmap is returned. Otherwise the value is interpolated from the 4 vertices surrounding the position. - Returns [code skip-lint]NAN[/code] if the requested position is a hole or outside of defined regions. - - - - - - Provides access to the resource ID of the generated height map texture array sent to the shader. You can use this RID with the RenderingServer to set it as a shader parameter for a sampler2DArray uniform in your own shader. See [url=../docs/tips.html#using-the-generated-height-map-in-other-shaders]Tips[/url] for an example. - - - - - - - - Returns the Image for the specified map type and region. E.g. Returns the region_size height map Image at the first defined region 0. - - - Returns an Array of Images containing all of the regions for the specified map type. - - - - - - - Returns a copy of the Array of Images containing all of the regions for the specified map type. - - - - - - - - - Returns the position of a terrain vertex at a certain LOD. If the position is outside of defined regions or there is a hole, it returns [code skip-lint]NAN[/code] in the vector's Y coordinate. - [code skip-lint]lod[/code] - Determines how many heights around the given global position will be sampled. Range 0 - 8. - [code skip-lint]filter[/code] - Specifies how samples are filtered. See [enum HeightFilter]. - [code skip-lint]global_position[/code] - X and Z coordinates of the vertex. Heights will be sampled around these coordinates. - - - - - - - Returns the terrain normal at the specified position. This function uses [method get_height]. - Returns [code skip-lint]Vector3(NAN, NAN, NAN)[/code] if the requested position is a hole or outside of defined regions. - - - - - - - - Returns the pixel for the map type associated with the specified position. - Returns [code skip-lint]Color(NAN, NAN, NAN, NAN)[/code] if the position is outside of defined regions. - - - - - - Returns the number of allocated regions. - - - - - - - Returns the index into the [member region_offsets] array for the region associated with the specified position. - - - - - - - Returns the current region ID based on a Vector2i region offset. - - - - - - - Converts a world space position to region space. For a region_size of 1024 this basically means [code skip-lint]global_position/1024.0[/code]. See [member region_offsets]. - - - - - - - Returns a Vector2i region offset based on the current region ID. - - - - - - - Returns the roughness modifier (wetness) on the color map alpha channel associated with the specified position. - Returns [code skip-lint]Color(NAN, NAN, NAN, NAN)[/code] if the position is outside of defined regions. - - - - - - - Returns the uv scale painted on the control map at the requested position. The value is a percentage difference from 100% scale. Eg. +20% or -40%. - Returns [code skip-lint]NAN[/code] if the position is outside of defined regions. - - - - - - - Returns [code skip-lint]Vector3(base texture id, overlay id, blend value)[/code]. - Returns [code skip-lint]Vector3(NAN, NAN, NAN)[/code] if the position is a hole or outside of defined regions. - This is often used for playing footstep sounds. It's up to the gamedev to determine which is visually apparent based on shader settings. - Due to blending, it won't be pixel perfect. Try having your player controller print this value while walking around to see how the blending values look. Perhaps you'll find that the overlay texture is visible starting at a blend value of .3 to .5, otherwise the base is visible. You can also observe the control blend debug view with [member Terrain3DMaterial.show_control_blend]. - Observing how this is done in The Witcher 3, there are only about 6 sounds used (snow, foliage, dirt, gravel, rock, wood), and except for wood, they are not pixel perfect. Wood is easy to do by detecting if the player is walking on wood meshes. The other 5 sounds are played when the player is in an area where the textures are blending. So it might play rock while over a dirt area. This shows pixel perfect accuracy is not important. It will still provide a seamless audio visual experience. - - - - - - - Returns true if the specified position has a region allocated. - - - - - - - - - - Imports an Image set (Height, Control, Color) into this resource. It does NOT normalize values to 0-1. You must do that using get_min_max() and adjusting scale and offset. - [code skip-lint]images[/code] - MapType.TYPE_MAX sized array of Images for Height, Control, Color. Images can be blank or null. - [code skip-lint]global_position[/code] - X,0,Z position on the region map. Valid range is [member Terrain3D.mesh_vertex_spacing] * (+/-8192, +/-8192). - [code skip-lint]offset[/code] - Add this factor to all height values, can be negative. - [code skip-lint]scale[/code] - Scale all height values by this factor (applied after offset). - - - - - - - Returns an Image of the given map type that contains all regions in one large image. If the world has multiple islands, this function will return an image large enough to encompass all used regions, with black areas in between the islands. - - - - - - - - Removes the region at the specified position from the [member region_offsets] and the height, control, and color map arrays. - - - - - - Saves this storage resource to disk, if saved as an external [code skip-lint].res[/code] file, which is the recommended practice. - - - - - - - - Sets the color on the color map pixel associated with the specified position. See [method set_pixel] for important information. - - - - - - - - Sets the value on the control map pixel associated with the specified position. See [method set_pixel] for important information. - - - - - - - - Sets the height value on the heightmap pixel associated with the specified position. See [method set_pixel] for important information. - Unlike [method get_height], which interpolates between vertices, this function does not and will set the pixel at floored coordinates. - - - - - - - - - Sets the Image for the specified map type and region. This method calls [method force_update_maps]. @@ -284,135 +19,41 @@ - Sets the Array of Images for the specified map type. This method calls [method force_update_maps]. - - - - - - - - - Sets the pixel for the map type associated with the specified position. This method is fine for setting a few pixels, but if you wish to modify thousands of pixels quickly, you should use [method get_maps] or [method get_map_region] and edit the images directly. - After setting pixels you need to call [method force_update_maps]. You may also need to regenerate collision if you don't have dynamic collision enabled. - - - - - - - - Sets the roughness modifier (wetness) on the color map alpha channel associated with the specified position. See [method set_pixel] for important information. - - - - - - Evaluates every height map pixel for every region and updates [member height_range]. - The Array of Images containing all the color maps for all regions. - Image format: FORMAT_RGBA8, 32-bits per pixel as four 8-bit components. - [b]RGB[/b] is used for color, which is multiplied by albedo in the shader. Multiply is a blend mode that only darkens. - [b]A[/b] is used for a roughness modifier. A value of 0.5 means no change to the existing texture roughness. Higher than this value increases roughness, lower decreases it. - The setter calls [method set_maps]. - The Array of Images containing all the control maps for all regions. - Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. - However we interpret these images as format: [url=https://docs.godotengine.org/en/stable/classes/class_renderingdevice.html#class-renderingdevice-constant-data-format-r32-uint]RenderingDevice.DATA_FORMAT_R32_UINT[/url] aka OpenGL RG32UI 32-bit per pixel as unsigned integer. See [url=../docs/controlmap_format.html]Control map format[/url]. - The setter calls [method set_maps]. - The Array of Images containing all the heightmaps for all regions. - Image format: FORMAT_RF, 32-bit per pixel as full-precision floating-point. - Defines the height value of the terrain at a given pixel. This is sent to the vertex shader on the GPU which modifies the mesh in real-time. - Editing is always done in 32-bit. We do provide an option to save as 16-bit, see [member save_16_bit], which converts to 32-bit on load and back to 16-bit on save. - The setter calls [method set_maps]. - The highest and lowest heights for the sculpted terrain. Any [member Terrain3DMaterial.world_background] used that extends the mesh height outside of this range will not change this variable. See [member Terrain3D.render_cull_margin]. - The storage for [Terrain3DInstancer]. Data is stored as a dictionary of dictionaries of MultiMeshes. - First instances are separated by region offsets, which is the first key. - Second, instances are separated by mesh id, which then gives the MultiMesh itself. - `Dictionary{region_offset:Vector2i}` -> `Dictionary{mesh_id:int}` -> `MultiMesh`. - An array of the active regions in region grid coordinates (+/-8, +/-8). e.g. { (0, 0), (-1, 3), (1, 1) }. It is ordered by the sequence in which regions were created, not by location. - See [method get_region_index] which returns the index into this array based on position. - And [method get_region_offset] which converts a position in world space to a region space, which is what is stored in this array. Eg. [code skip-lint]get_region_offset(Vector3(1500, 0, 1500))[/code] would return (1, 1). - The number of vertices in each sculptable region, and the number of pixels for each layer in the TextureArrays that store the height, control, and color maps. Limited to 1024 for now. This does not factor in [member Terrain3D.mesh_vertex_spacing]. - Heightmaps are loaded and edited in 32-bit. This option converts the file to 16-bit upon saving to reduce file size. This process is lossy. - Current version of this storage resource. This is used for upgrading data files and is independent of [member Terrain3D.version]. The file and this variable are updated to the latest version upon saving this resource. - - - - Emitted when the height maps have changed and been regenerated. - - - - - - This signal is emitted whenever the editor is used to: - - add or remove a region, - - alter a region map with a brush tool, - - undo or redo any of the above operations. - The parameter contains the axis-aligned bounding box of the area edited. - - - - - Emitted when the [member multimeshes] object is changed (ie loaded), not when the content is changed. - - - - - Emitted when [member region_size] is changed. - - - - - Emitted when any of the maps or regions are modified and regenerated. - - - - Height map. - Control map. - Color map. - The number of elements in this enum. - Region size is 1024 x 1024 vertices or pixels on maps. - - - Samples the height map at the exact coordinates given. - - - Samples (1 << lod) * 2 heights around the given coordinates and returns the lowest. - Hard coded number of regions on a side. The total number of regions is this squared. diff --git a/doc/classes/Terrain3DUtil.xml b/doc/classes/Terrain3DUtil.xml index 94827d6d..ff357788 100644 --- a/doc/classes/Terrain3DUtil.xml +++ b/doc/classes/Terrain3DUtil.xml @@ -106,6 +106,13 @@ Returns a control map uint with the texture scale encoded. See the top description for usage. See [method get_uv_scale] for values. + + + + + Converts a file name string like [code skip-lint]terrain3d-01_02.res[/code] to a region location like [code skip-lint](-1, 2)[/code]. - is negative, _ is positive. + + @@ -206,6 +213,13 @@ [code skip-lint]size[/code] - Image dimensions for R16 format. Default (0,0) auto detects size, assuming square images. Required for non-square R16. + + + + + Converts a region location like [code skip-lint](-1, 2)[/code] to a file name string like [code skip-lint]terrain3d-01_02.res[/code]. - is negative, _ is positive. + + diff --git a/doc/docs/storage_format.md b/doc/docs/data_format.md similarity index 53% rename from doc/docs/storage_format.md rename to doc/docs/data_format.md index 05b3720c..6df19f38 100644 --- a/doc/docs/storage_format.md +++ b/doc/docs/data_format.md @@ -1,11 +1,12 @@ -Storage Format Changelog +Data Format Changelog ========================== -The storage resource file has it's own version, independent of the version of Terrain3D, shown at the top of the inspector. Generally this is updated to the latest format upon saving. This information is more relevant for developers, while the [upgrade path](installation.md#upgrade-path) is relevant for all users. +The Terrain3DRegion resource files have their own version, independent of the version of Terrain3D, shown at the top of the inspector. Generally this is updated to the latest format upon saving. This information is more relevant for developers, while the [upgrade path](installation.md#upgrade-path) is relevant for all users. -The storage format version is found as [Terrain3DStorage.version](../api/class_terrain3dstorage.rst#class-terrain3dstorage-property-version) and visible in the inspector under `Storage/Version`. +The data format version is found as [Terrain3DData.version](../api/class_terrain3ddata.rst#class-terrain3ddata-property-version) and is visible in the inspector under `Version` after double clicking a data file. | Version | Description | |---------|-------------------| +| 0.93 | The monolithic storage file has been split into one file per region [#374](https://github.com/TokisanGames/Terrain3D/pull/374), [#476](https://github.com/TokisanGames/Terrain3D/pull/476) | 0.92 | Add `Terrain3DInstancer` data [#340](https://github.com/TokisanGames/Terrain3D/pull/340) | 0.842 | Control map changed from FORMAT_RGB to 32-bit packed integer (encoded in FORMAT_RF) [#234](https://github.com/TokisanGames/Terrain3D/pull/234/) | 0.841 | Colormap painted/stored as srgb and converted to linear in the shader (prev painted/stored as linear). [64dc3e4](https://github.com/TokisanGames/Terrain3D/commit/64dc3e4b5e71c11ac3f2cd4fedf9aeb7d235f45c) diff --git a/doc/docs/games.md b/doc/docs/games.md index cb096893..d34ba821 100644 --- a/doc/docs/games.md +++ b/doc/docs/games.md @@ -1,4 +1,5 @@ -# Games Using Terrain3D +Games Using Terrain3D +======================= Terrain3D is being used in the following games. To add yours, submit it to the #game-dev channel on [our discord server](https://tokisan.com/discord). @@ -8,4 +9,11 @@ Terrain3D is being used in the following games. To add yours, submit it to the # | [Memora Wanderer](https://twitter.com/Maytch) | Maytch | Cute nostalgic RPG | [No Gasoline](https://store.steampowered.com/app/2835350/No_Gasoline/) | [Mount Retro](https://twitter.com/mountretro) | Co-Op/Solo, Adventure-Simulation-Puzzle | [RotorSim](https://immaculate-lift-studio.itch.io/godot-flight-simulator-alpha) | [Immaculate Lift](https://www.youtube.com/channel/UC-9JixNs1FFE6T5DGwZ6O5Q) | Retro helicopter simulation +| [B&E Ski](https://www.youtube.com/watch?v=pD8Ea3utz9o) | [Penguin Milk](https://bande.ski/) | Skiing game + + +## Tech Demos + +| Game | Studio | Description | +|------|--------|-------------| | [Jungle Demo](https://wrobot.itch.io/jungledemo) | [WrobotGames](https://x.com/wrobot123) | Godot rendering demo in a jungle diff --git a/doc/docs/images/mesh_lods_flat.jpg b/doc/docs/images/mesh_lods_flat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee88dac2380926842395bf9de4d9a4ae3eb3cdd8 GIT binary patch literal 157203 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�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 V2{UqLH|JlijX666@ literal 0 HcmV?d00001 diff --git a/doc/docs/images/mesh_lods_height.jpg b/doc/docs/images/mesh_lods_height.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d2bdaa20d1e09352f6a64185fa0e18f5a49dd437 GIT binary patch literal 174832 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

?x}-4Tf_B0p~WE7BxY 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 z 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ʮ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 U!5{GO?e~oci0l3>oJ!yS+3;c2%m4rY literal 0 HcmV?d00001 diff --git a/doc/docs/installation.md b/doc/docs/installation.md index 426e9aa5..2bd4fd95 100644 --- a/doc/docs/installation.md +++ b/doc/docs/installation.md @@ -7,7 +7,7 @@ Installation & Upgrades * [Upgrading Terrain3D](#upgrading-terrain3d) ## Requirements -* Supports Godot 4.2+. +* Supports Godot 4.2 & 4.3 * Supports Windows, Linux, and macOS. * macOS users should [build from source](building_from_source.md) or [adjust security settings](https://github.com/TokisanGames/Terrain3D/issues/227) to use the binary release. * Mobile, Web, SteamDeck, & Compatibility renderer are [experimental or pending](mobile_web.md). @@ -26,6 +26,8 @@ Terrain3D is listed in the Asset Library [here](https://godotengine.org/asset-li 8. Select `Project / Reload Current Project` to restart once more. 9. Open `demo/Demo.tscn`. You should see a terrain. Run the scene by pressing `F6`. +**Updated 0.9.3-dev:** When using Terrain3D in your own scene, select the Terrain3D node in the Scene panel. In the Inspector, click the folder icon to the right of `data directory`, and specify a directory to store your data. This directory can be used shared with other scenes. + If it isn't working for you, watch the [tutorial videos](tutorial_videos.md) and read [Troubleshooting](troubleshooting.md) and [Getting Help](getting_help.md). ### Manually Running The Demo @@ -38,14 +40,14 @@ If it isn't working for you, watch the [tutorial videos](tutorial_videos.md) and If it isn't working for you, watch the [tutorial videos](tutorial_videos.md) and read [Troubleshooting](troubleshooting.md) and [Getting Help](getting_help.md). -### Manually Into Your Project +### Manually Into Your Project (v0.9.3-dev running a nightly build) 1. Download the [latest binary release](https://github.com/TokisanGames/Terrain3D/releases) and extract the files, or [build the plugin from source](building_from_source.md). 2. Copy `addons/terrain_3d` to your project folder as `addons/terrain_3d`. 3. Run Godot using the console executable so you can see error messages. Restart when it prompts. 4. In `Project Settings / Plugins`, ensure that Terrain3D is enabled. 5. Select `Project / Reload Current Project` to restart once more. 6. Create or open a 3D scene and add a new Terrain3D node. -7. Select Terrain3D in the Scene panel. In the Inspector, click the down arrow to the right of the `storage` resource and save it as a binary `.res` file. The other resources can be left as is, or saved as text `.tres`. These external files can be shared with other scenes. +7. **Updated 0.9.3-dev:** Select Terrain3D in the Scene panel. In the Inspector, click the folder icon to the right of `data directory` and specify a directory to store your data. This directory can be used shared with other scenes. If it isn't working for you, watch the [tutorial videos](tutorial_videos.md) and read [Troubleshooting](troubleshooting.md) and [Getting Help](getting_help.md). @@ -62,10 +64,17 @@ Don't just copy the new folder over the old, as this won't remove any files that While later versions of Terrain3D can generally open previous versions, not all data will be loaded unless the supported upgrade path is followed. We occasionally deprecate or rename classes and provide upgrade paths to convert data for a limited time. -Given the table below, to upgrade 0.8 to the latest version you would need to open your files in 0.8.4 or 0.9 and save them, then open in the latest version and save again. +Given the table below, to upgrade 0.8 to the latest version you would need to open your files in 0.9.0, save, then open in 0.9.3, and save again. | Starting Version | Can Upgrade w/ Data Conversion | |------------------|-------------------| -| 0.8.4 - 0.9.0 | Latest | -| 0.8.0 - 0.8.3 | 0.8.4 - 0.9.0 | - +| 0.9.2 | 0.9.3* | +| 0.9.1 | 0.9.2 - 0.9.3* | +| 0.9.0 | 0.9.2 - 0.9.3* | +| 0.8.4 | 0.9.2 - 0.9.3* | +| 0.8.3 | 0.8.4 - 0.9.0 | +| 0.8.2 | 0.8.4 - 0.9.0 | +| 0.8.1 | 0.8.4 - 0.9.0 | +| 0.8.0 | 0.8.4 - 0.9.0 | + +* 0.9.3 - Data storage changed from a single .res file to one file per region saved in a directory. diff --git a/doc/docs/introduction.md b/doc/docs/introduction.md new file mode 100644 index 00000000..156101aa --- /dev/null +++ b/doc/docs/introduction.md @@ -0,0 +1,64 @@ +Introduction +===================== + +Terrain3D is an editable **clipmap terrain** system divided into **regions**. It can be hand edited or manipulated through the **API**. This page is a quick summary of the whole system. + +## Clipmap Terrain + +A terrain made of several flat meshes. The density of the vertices is higher in the center, sparser farther away. By continually centering these meshes on the camera position, they provide a flat terrain with built in Levels of Detail (LODs). + +```{image} images/mesh_lods_flat.jpg +:target: ../_images/mesh_lods_flat.jpg +``` + +The flat meshes and heightmap data are sent to the GPU, which adjusts the vertices of the clipmap, potentially every frame. Even though the mesh vertices are constantly moving, the terrain appears stable because the height data remains fixed in place. + +```{image} images/mesh_lods_height.jpg +:target: ../_images/mesh_lods_height.jpg +``` + + +## Regions + +The terrain is divided into regions, which represent both physical space, and containers for terrain data. + +By default, regions are 1024m x 1024m, which will be adjustable in the near future. This describes a physical grid in the world with borders at -1024, 0, 1024, 2048, etc. This also corresponds to the 1024x1024 pixels size of the images and textures used to store terrain data. + +A 16km x 16km terrain might be broken up into 16 x 16 (256) regions, each sized 1024m x 1024m. However one need not fill out the entire world space. A game could have 3 islands with 10 regions a piece within a larger 16km world. Rather than consuming the memory for 16k x 16k maps (256 regions, 268M pixels), it would only consume 30 x 1k maps (30 regions, 31M pixels). + + +## Region Location + +Region locations are the grid coordinates that regions fit into. Represented as a Vector2i, eg (-1, 0), this is the primary key used for identifying regions in the API. + +Converting a global position to a region location is calculated by `floor(global position / region size)`, or by calling the function [Terrain3DData.get_region_location()](../api/class_terrain3ddata.rst#class-terrain3ddata-method-get-region-location). e.g. If region size is 1024, a global position of (2500, 0, 3700) would convert to (2, 3). It gets more complicated as region sizes change. + +Enable `Terrain3D / Debug / Show Region Labels` to view locations in the world. + + +## Global Position + +Global position is the absolute X, Y, Z coordinates of a node in the 3D world. *(Non-global)* position means the X, Y, Z coordinates are relative to its parent's global position. + + +## Active Regions + +Active regions are those rendered on screen. This means they're loaded in the list of Terrain3DData.region_locations, and are not marked for deletion. + + +## Vertex Painting + +This system is a vertex painter, not a pixel painter. In order to make a high performance terrain, we are spreading out say a 1024 x 1024 map over 1024m^2. Each square meter is influenced by only 4 pixels in the corners. + +We use sophisticated algorithms that allow natural blending of *quality* textures between the vertices. However, it is not magic. Pixel perfect painting is not practical. Texture artists place 4k or 8k textures on a boulder to acheive adequate texel density. How much larger is even a 1024m x 1024m terrain, let alone 16km x 16km? Achieving the same texel density where pixel painting is practical would consume far more VRAM than you have. + +The system we have works well for producing natural environments and is modeled off of the Witcher 3 terrain system. It will most likely work for your game as well. You'll read more about selecting and preparing good textures in [Texture Prep](texture_prep.md) and [Texture Painting](texture_painting.md). + + +## API + +Aplication Programming Interface. This is the [list of variables and functions](../api/index.rst) available to you via code. + +Like Godot, this documentation is separated into two parts. The first are various free form tutorial pages describing each aspect of the terrain system, such as what you are reading now. + +The second is the API. You can find it at the very bottom left of the document titles. You should be familiar with both documentation types so you can make full use of Terrain3D. diff --git a/doc/docs/programming_languages.md b/doc/docs/programming_languages.md index 00a30dcc..c22183fa 100644 --- a/doc/docs/programming_languages.md +++ b/doc/docs/programming_languages.md @@ -89,7 +89,7 @@ For more information on C# and other languages, read [Cross-language scripting]( These options are for programming scenarios where a user action is intented to provide your code with the Terrain3D instance. -* If collision is enabled in game (default) or in the editor (debug only), you can run a raycast and if it hits, it will return a `Terrain3D` object. See more below in the [raycasting](#raycasting-with-physics) section. +* If collision is enabled in game (default) or in the editor (debug only), you can run a raycast and if it hits, it will return a `Terrain3D` object. See more in the [raycasting](collision.md#physics-based-collision-raycasting) section. * Your script can provide a NodePath and allow the user to select their Terrain3D node as was done in [the script](https://github.com/TokisanGames/Terrain3D/blob/v0.9.1-beta/project/addons/terrain_3d/extras/project_on_terrain3d.gd#L14) provided for use with Scatter. @@ -116,6 +116,6 @@ See [Collision](collision.md) for several methods. ## Getting Updates on Terrain Changes -`Terrain3DStorage` has [signals](../api/class_terrain3dstorage.rst#signals) that fire when updates occur. You can connect to them to receive updates. +`Terrain3DData` has [signals](../api/class_terrain3ddata.rst#signals) that fire when updates occur. You can connect to them to receive updates. diff --git a/doc/docs/project_status.md b/doc/docs/project_status.md index ab2e3f23..ae274647 100644 --- a/doc/docs/project_status.md +++ b/doc/docs/project_status.md @@ -9,7 +9,7 @@ See the [Roadmap](https://github.com/users/TokisanGames/projects/3/views/1) for | Feature | Status | | ------------- | ------------- | | **Platforms** | Terrain editing and exported games work on Windows, Linux, macOS. [Mobile and web platforms](mobile_web.md) are experimental. -| **Languages** | GDScript, C++, C# all work, as should any language Godot supports. See [Integrating With Terrain3D](integrating.md) +| **Languages** | GDScript, C++, C# all work, as should any language Godot supports. See [Programming Languages](programming_languages.md) | **Editing** | | Sculpting Operations | Raise, Lower, Slope, Smooth. | Painting Operations | Texture, Color, Wetness with Height blending. @@ -27,7 +27,7 @@ See the [Roadmap](https://github.com/users/TokisanGames/projects/3/views/1) for | Jolt | [Godot-Jolt](https://github.com/godot-jolt/godot-jolt) v0.6+ works as a drop-in replacement for Godot Physics. The above restriction applies. | **Navigation Server** | Supported. See [Navigation](navigation.md) | **Data** | -| Large terrains | 8k^2 works, maybe a little more, though [collision will take up ~3GB RAM](https://github.com/TokisanGames/Terrain3D/issues/161). 16k x 8k up to 16k^2 works in memory, but cannot be saved due to an [engine bug](https://github.com/TokisanGames/Terrain3D/issues/159). +| Large terrains | Supports terrains up to 16km^2. [Collision will take up ~4-6GB RAM](https://github.com/TokisanGames/Terrain3D/issues/161), but that will be [improved](https://github.com/TokisanGames/Terrain3D/pull/278). | Importing / Exporting | Works. See [Importing data](import_export.md) | Double precision floats | [Supported](double_precision.md). | **Rendering** | diff --git a/doc/docs/troubleshooting.md b/doc/docs/troubleshooting.md index da218758..f3ae0255 100644 --- a/doc/docs/troubleshooting.md +++ b/doc/docs/troubleshooting.md @@ -83,6 +83,11 @@ Make sure you have both the debug and release binaries on your system, or have b ## Usage +### Collision offset, or it's showing lower LODs near the camera + +If you've done weird things with your camera like using multiple, or viewports, you need to tell Terrain3D which camera you want to use with `Terrain3D.set_camera()`. + + ### Camera flickering When another mesh intersects with Terrain3D far away from the camera, such as in the case of water on a beach, the two meshes can flicker as the renderer can't decide which mesh should be displayed in front. This is also called Z-fighting. You can greatly reduce it by increasing `Camera3D.near` to 0.25. You can also set it for the editor camera in the main viewport by adjusting `View/Settings/View Z-Near`. @@ -115,7 +120,7 @@ Godot also has an `Output` panel at the bottom of the screen, but it is slow, wi ## Debug Logs -Terrain3D has debug logs for everything, which it can dump to the [console](#use-the-console). These logs *may* also be saved to Godot's log files on disk. +Terrain3D has debug logs for everything, which it can dump to the [console](#using-the-console). These logs *may* also be saved to Godot's log files on disk. Set `Terrain3D.debug_level` to `Info` or `Debug` and you'll get copious activity logs that will help troubleshoot problems. diff --git a/doc/docs/tutorial_videos.md b/doc/docs/tutorial_videos.md index 9b6e9fee..67123e2f 100644 --- a/doc/docs/tutorial_videos.md +++ b/doc/docs/tutorial_videos.md @@ -1,6 +1,8 @@ Tutorial Videos ================== +*Note: Some instructions in the videos may be out of date. Be sure to review this documentation for the latest. And even this documentation has a **stable** and **latest** version, available in the menu.* + **Using Terrain3D Part 1: Installation, Setup, Basic Usage** [![Using Terrain3D - Part 1](https://i.ytimg.com/vi/oV8c9alXVwU/hqdefault.jpg)](https://youtu.be/oV8c9alXVwU) diff --git a/doc/index.rst b/doc/index.rst index 16a7e157..b1f8b85d 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -18,7 +18,7 @@ See :doc:`Project Status ` for development progress. Usage -------- -Read the documentation in the Getting Started section, beginning with :doc:`Installation & Upgrades `. +Read the documentation in the Getting Started section in the left sidebar. Credit ------------- @@ -86,6 +86,7 @@ Geometry clipmap mesh code created by `Mike J. Savage