Unigine.Landscape Class
This class is used to manage landscape terrain rendering and modification.
Terrain modification is performed in asynchronous mode on GPU side by calling a corresponding method, that commences a drawing operation. When calling such a method you should specify the GUID of an .lmap file landscape layer map to be modified, the coordinates of the upper-left corner and the resolution of the segment of data to be modified, you should also define which data layers are to be affected (heights, albedo, masks) via a set of flags. The operation itself is to be implemented inside a callback handler.
GPU-Based Terrain Modification#
The workflow is as follows:
- Implement your GPU-based terrain modification logic in a function.
- Set this callback function to be fired when a Texture Draw (GPU-based terrain modification) operation is performed by calling the addTextureDrawCallback() method.
- Commence a GPU drawing operation by calling the asyncTextureDraw() method.
Here you should specify the GUID of an .lmap file landscape layer map to be modified, the coordinates of the upper-left corner and the resolution of the segment of data to be modified, you should also define which data layers are to be affected (heights, albedo, masks) via a set of flags
In case your modification requires additional data beyond the specified area as well as the data of other landscape layer maps (e.g. a copy brush) you can enable force loading of required data, in this case you should use this overload of the asyncTextureDraw() method.
// GPU-based modification
void my_texture_draw(UGUID guid, int id, LandscapeTexturesPtr buffer, ivec2 coord, int data_mask)
{
// getting a built-in "cirle_soft" Editor's brush
MaterialPtr mat = Materials::findMaterial("circle_soft");
if (mat) {
// setting necessary textures (e.g., albedo and heights)
mat->setTexture("terrain_albedo", buffer->getAlbedo());
mat->setTexture("terrain_height", buffer->getHeight());
// setting up brush material parameters (size, color, etc. and specifying masks to be affected by the brush)
mat->setParameterFloat("size", 100.0f);
mat->setParameterFloat("height", 10.0f);
mat->setParameterFloat4("color", vec4::RED);
mat->setParameterInt("data_mask", Landscape::FLAGS_DATA_ALBEDO | Landscape::FLAGS_DATA_HEIGHT);
// running material's "brush" expression
mat->runExpression("brush", buffer->getResolution().x, buffer->getResolution().y);
// resetting material textures
mat->setTexture("terrain_albedo", nullptr);
mat->setTexture("terrain_height", nullptr);
}
}
// ...
virtual int AppWorldLogic::init()
{
// adding a callback to be fired on a Texture Draw operation
Landscape::addTextureDrawCallback(MakeCallback(my_texture_draw));
// getting an existing landscape terrain object named "MyTerrain" from the world
ObjectLandscapeTerrainPtr terrain = checked_ptr_cast<ObjectLandscapeTerrain>(World::getNodeByName("MyTerrain"));
// getting the first layermap that we're going to modify
LandscapeLayerMapPtr lmap = checked_ptr_cast<LandscapeLayerMap>(terrain->getChild(0));
// generating a new ID for the draw operation
int id =Landscape::generateOperationID();
// user's code (bounding to ID)
// commencing a Texture Draw operation for the selected landscape map at (1, 1) with the size of [32 x 32]
Landscape::asyncTextureDraw(id, lmap->getGUID(), ivec2(1, 1), ivec2(32, 32), ~0);
return 1;
}
// ...
virtual int shutdown()
{
// clearing callbacks
Landscape::clearTextureDrawCallbacks();
return 1;
}
And the process:
- After commencing of a terrain modification operation with all necessary parameters specified, the Engine copies a fragment of terrain data from the specified landscape layer map file at the specified coordinates to a buffer (LandscapeTextures) of the specified resolution.
- Upon completion of the copying process a callback function set via the addTextureDrawCallback() method is called. This function modifies the buffer.
- After this selected data layers of the modified buffer are pasted back to the landscape layer map file.
Landscape Class
Enums
TYPE_DATA#
FLAGS_DATA#
TYPE_FILE_DATA#
File data types.FLAGS_FILE_DATA#
File data layer flags.Properties
bool IsFilesClosed#
Members
LandscapeTextures GetTemporaryTexture ( ivec2 resolution ) #
Returns a fragment of terrain data as a LandscapeTextures of the specified resolution.Arguments
- ivec2 resolution - Resolution of a temporary texture to be obtained.
Return value
LandscapeTextures instance containing a fragment of terrain data.void ReleaseTemporaryTexture ( LandscapeTextures texture ) #
Releases the specified temporary texture.Arguments
- LandscapeTextures texture - Temporary landscape texture to be released.
bool TerrainLoad ( WorldBoundBox bb ) #
Loads terrain data (tiles) for all landscape layer maps within the specified bounding box to cache.Arguments
- WorldBoundBox bb - Bounding box, defining landscape layer maps for which the data is to be loaded.
Return value
true if terrain data was successfully loaded for all landscape layer maps within the specified bounding box; otherwise, false.bool Render ( LandscapeTextures buffers, mat4 transform, Scalar texel_size ) #
Renders the area of the specified landscape layer maps defined by the specified transform and texel size, to the specified buffers.Arguments
- LandscapeTextures buffers - Target texture buffers to which the specified landscape layer maps are to be rendered.
- mat4 transform - Transformation of the landscape terrain area to be rendered (Z-coordinate is ignored).
- Scalar texel_size - Texel size to be used. Defines the size of the area depending on the buffers resolution.
Return value
true if the data of the landscape terrain area (all landscape layer maps) defined by the specified transformation and texel size, was successfully rendered to the specified buffers; otherwise, false.bool Render ( LandscapeTextures buffers, mat4 transform, Scalar texel_size, int padding ) #
Renders the area of the specified landscape layer maps defined by the specified transform and texel size, to the specified buffers. Use the padding parameter to set inner padding size for the area (when necessary).Arguments
- LandscapeTextures buffers - Target texture buffers to which the specified landscape layer maps are to be rendered.
- mat4 transform - Transformation of the landscape terrain area to be rendered (Z-coordinate is ignored).
- Scalar texel_size - Texel size to be used. Defines the size of the area depending on the buffers resolution.
- int padding - Inner padding size for the area to be rendered (if necessary).
Return value
true if the data of the landscape terrain area (all landscape layer maps) defined by the specified transformation and texel size, was successfully rendered to the specified buffers; otherwise, false.bool Render ( LandscapeLayerMap[] maps, LandscapeTextures buffers, mat4 transform, Scalar texel_size ) #
Renders the area of the specified landscape layer maps defined by the specified transform and texel size, to the specified buffers. Use the padding parameter to set inner padding size for the area (when necessary).Arguments
- LandscapeLayerMap[] maps - List of the landscape layer maps to be rendered.
- LandscapeTextures buffers - Target texture buffers to which the specified landscape layer maps are to be rendered.
- mat4 transform - Transformation of the landscape terrain area to be rendered (Z-coordinate is ignored).
- Scalar texel_size - Texel size to be used. Defines the size of the area depending on the buffers resolution.
Return value
true if the data of the landscape terrain area (specified landscape layer maps) defined by the specified transformation and texel size, was successfully rendered to the specified buffers; otherwise, false.bool Render ( LandscapeLayerMap[] maps, LandscapeTextures buffers, mat4 transform, Scalar texel_size, int padding ) #
Renders the area of the specified landscape layer maps defined by the specified transform and texel size, to the specified buffers. Use the padding parameter to set inner padding size for the area (when necessary).Arguments
- LandscapeLayerMap[] maps - List of the landscape layer maps to be rendered.
- LandscapeTextures buffers - Target texture buffers to which the specified landscape layer maps are to be rendered.
- mat4 transform - Transformation of the landscape terrain area to be rendered (Z-coordinate is ignored).
- Scalar texel_size - Texel size to be used. Defines the size of the area depending on the buffers resolution.
- int padding - Inner padding size for the area to be rendered.
Return value
true if the data of the landscape terrain area (specified landscape layer maps) defined by the specified transformation and texel size, was successfully rendered to the specified buffers; otherwise, false.void AsyncTextureDraw ( int operation_id, UGUID guid, ivec2 coord, ivec2 resolution, int flags_file_data, WorldBoundBox[] bounds_preload ) #
Commences an asynchronous GPU-based drawing operation with forced pre-loading of terrain data within the specified bounding box (all landscape layer maps). The drawing operation represents modification of the texture buffer of the specified size taken at specified coordinates and combining data layers defined by the specified flags. The operation itself is to be implemented in the TextureDrawCallback handler. This method can be used for implementing GPU-based terrain modification (e.g. brushes) that requires additional data beyond the area specified by coords and resolution parameters as well as the data of other landscape layer maps (e.g. a copy brush).Arguments
- int operation_id - Draw operation ID.
- UGUID guid - GUIGUID of the landscape layer map file to be modified.
- ivec2 coord - Coordinates of the upper left corner of the landscape layer map data segment to be modified along the X and Y axes.
- ivec2 resolution - Resolution of the landscape layer map data segment to be modified along the X and Y axes.
- int flags_file_data - Data layer mask. A combination of FLAGS_FILE_DATA_* flags indicating data layers to be affected (heights, albedo, certain masks).
- WorldBoundBox[] bounds_preload - Bounding box (world) specifying the area containing terrain tiles (all landscape layer maps) to be loaded to memory prior to making modifications.
void AsyncTextureDraw ( int operation_id, UGUID guid, ivec2 coord, ivec2 resolution, int flags_file_data ) #
Commences an asynchronous GPU-based drawing operation. The drawing operation represents modification of the texture buffer of the specified size taken at specified coordinates and combining data layers defined by the specified flags. The operation itself is to be implemented in the TextureDrawCallback handler. This method can be used for implementing GPU-based terrain modification (e.g. brushes).Arguments
- int operation_id - Draw operation ID.
- UGUID guid - GUID of the landscape layer map file to be modified.
- ivec2 coord - Coordinates of the upper left corner of the landscape layer map data segment to be modified along the X and Y axes.
- ivec2 resolution - Resolution of the landscape layer map data segment to be modified along the X and Y axes.
- int flags_file_data - Data layer mask. A combination of FLAGS_FILE_DATA_* flags indicating data layers to be affected (heights, albedo, certain masks).
void AsyncTextureDraw ( int operation_id, UGUID guid, ivec2 coord, ivec2 resolution ) #
Commences an asynchronous GPU-based drawing operation. The drawing operation represents modification of the texture buffer of the specified size taken at specified coordinates and combining all data layers. The operation itself is to be implemented in the TextureDrawCallback handler. This method can be used for implementing GPU-based terrain modification (e.g. brushes).Arguments
- int operation_id - Draw operation ID.
- UGUID guid - GUID of the landscape layer map file to be modified.
- ivec2 coord - Coordinates of the upper left corner of the landscape layer map data segment to be modified along the X and Y axes.
- ivec2 resolution - Resolution of the landscape layer map data segment to be modified along the X and Y axes.
void AsyncTextureDraw ( UGUID guid, ivec2 coord, ivec2 resolution, int flags_file_data, WorldBoundBox[] bounds_preload ) #
Commences an asynchronous GPU-based drawing operation with forced pre-loading of terrain data within the specified bounding box (all landscape layer maps). The drawing operation represents modification of the texture buffer of the specified size taken at specified coordinates and combining data layers defined by the specified flags. The operation itself is to be implemented in the TextureDrawCallback handler. This method can be used for implementing GPU-based terrain modification (e.g. brushes) that requires additional data beyond the area specified by coords and resolution parameters as well as the data of other landscape layer maps (e.g. a copy brush).Arguments
- UGUID guid - GUIGUID of the landscape layer map file to be modified.
- ivec2 coord - Coordinates of the upper left corner of the landscape layer map data segment to be modified along the X and Y axes.
- ivec2 resolution - Resolution of the landscape layer map data segment to be modified along the X and Y axes.
- int flags_file_data - Data layer mask. A combination of FLAGS_FILE_DATA_* flags indicating data layers to be affected (heights, albedo, certain masks).
- WorldBoundBox[] bounds_preload - Bounding box (world) specifying the area containing terrain tiles (all landscape layer maps) to be loaded to memory prior to making modifications.
void AsyncTextureDraw ( UGUID guid, ivec2 coord, ivec2 resolution, int flags_file_data ) #
Commences an asynchronous GPU-based drawing operation. The drawing operation represents modification of the texture buffer of the specified size taken at specified coordinates and combining data layers defined by the specified flags. The operation itself is to be implemented in the TextureDrawCallback handler. This method can be used for implementing GPU-based terrain modification (e.g. brushes).Arguments
- UGUID guid - GUID of the landscape layer map file to be modified.
- ivec2 coord - Coordinates of the upper left corner of the landscape layer map data segment to be modified along the X and Y axes.
- ivec2 resolution - Resolution of the landscape layer map data segment to be modified along the X and Y axes.
- int flags_file_data - Data layer mask. A combination of FLAGS_FILE_DATA_* flags indicating data layers to be affected (heights, albedo, certain masks).
void AsyncTextureDraw ( UGUID guid, ivec2 coord, ivec2 resolution ) #
Commences an asynchronous GPU-based drawing operation. The drawing operation represents modification of the texture buffer of the specified size taken at specified coordinates and combining all data layers. The operation itself is to be implemented in the TextureDrawCallback handler. This method can be used for implementing GPU-based terrain modification (e.g. brushes).Arguments
- UGUID guid - GUID of the landscape layer map file to be modified.
- ivec2 coord - Coordinates of the upper left corner of the landscape layer map data segment to be modified along the X and Y axes.
- ivec2 resolution - Resolution of the landscape layer map data segment to be modified along the X and Y axes.
void AsyncApplyDiff ( int operation_id, UGUID guid, string path ) #
Applies the state of the landscape layer map stored in the specified file to the landscape layer map file with the specified GUID.Arguments
- int operation_id - Operation ID.
- UGUID guid - GUID of the landscape layer map file to which a state stored at the specified path is to be applied.
- string path - Path to a file where the current landscape map modification state is stored.
void AsyncApplyDiff ( UGUID guid, string path ) #
Applies the state of the landscape layer map stored in the specified file to the landscape layer map file with the specified GUID.Arguments
- UGUID guid - GUID of the landscape layer map file to which a state stored at the specified path is to be applied.
- string path - Path to a file where the current landscape map modification state is stored.
void AsyncSaveFile ( int operation_id, UGUID file_guid ) #
Saves the landscape layer map file with the specified GUID.Arguments
- int operation_id - Operation ID.
- UGUID file_guid - GUID of the landscape layer map file.
void AsyncSaveFile ( UGUID file_guid ) #
Saves the landscape layer map file with the specified GUID.Arguments
- UGUID file_guid - GUID of the landscape layer map file.
void AsyncSaveFile ( int operation_id, UGUID guid, string path_new_state, string path_old_state ) #
Saves the specified landscape layer map file applying all changes along with saving old and new states (diff) to temporary files. These temporary files can be used to perform undo/redo operations via the applyDiff() method.Arguments
- int operation_id - Operation ID.
- UGUID guid - GUID of the landscape layer map file.
- string path_new_state - Path to a file to store the new landscape layer map state.
- string path_old_state - Path to a file to store the old landscape layer map state.
void AsyncSaveFile ( UGUID guid, string path_new_state, string path_old_state ) #
Saves the specified landscape layer map file applying all changes along with saving old and new states (diff) to temporary files. These temporary files can be used to perform undo/redo operations via the applyDiff() method.Arguments
- UGUID guid - GUID of the landscape layer map file.
- string path_new_state - Path to a file to store the new landscape layer map state.
- string path_old_state - Path to a file to store the old landscape layer map state.
void FilesClose ( UGUID[] reload_files ) #
Closes .lmap files for all landscape layer maps and reloads the ones with specified GUIDs. This method should be called before making any changes (modification, deletion, renaming) to .lmap files of the landscape terrain object to avoid conflicts, as these files are streamed continuosly by the Engine. Thus, by calling this method you inform the Engine that it should stop streaming terrain data. The list informs the Engine which files are no longer valid and should be reloaded or removed. As you're done with modification you should call the filesOpen() method to resume streaming operations.Arguments
- UGUID[] reload_files - List of GUIDs of .lmap files to be reloaded. This list should contain .lmap files, that were deleted or having their data changed (albedo, heights, masks). If there are no such files, you can simply call the filesClose() method.
void FilesClose ( ) #
Closes .lmap files for all landscape layer maps. This method should be called before making any changes (modification, deletion, renaming) to .lmap files of the landscape terrain object to avoid conflicts, as these files are streamed continuosly by the Engine. Thus, by calling this method you inform the Engine that it should stop streaming terrain data. As you're done with modification you should call the filesOpen() method to resume streaming operations.void FilesOpen ( ) #
Opens .lmap files for all landscape layer maps. This method should be called after making any changes (modification, deletion, renaming) to .lmap files of the landscape terrain object. Prior to making such modifications the filesClose() method should be called.ObjectLandscapeTerrain GetActiveTerrain ( ) #
Returns the current active Landscape Terrain object.Return value
Landscape Terrain object that is currently active.IntPtr AddTextureDrawCallback ( TextureDrawDelegate func ) #
Adds a callback function to be called when a Texture Draw (GPU-based terrain modification) operation is performed. The signature of the callback function must be as follows:void texture_draw_callback(UGUID guid, int id, LandscapeTextures buffer, ivec2 coord, int data_mask);
You can set a callback function as follows:
AddTextureDrawCallback((guid, id, buffer, coord, data_mask)
=> texture_draw_callback(guid, id, buffer, coord, data_mask));
Example: Setting a texture draw callback function:
class AppWorldLogic : WorldLogic
{
/*...*/
// callback function implementing modification of the buffer
private void TextureDraw(UGUID guid, int id, LandscapeTextures buffer, ivec2 coord, int data_mask)
{
// insert your buffer modification code here (the following lines can be used as an example)
// getting a brush material to be used (e.g., built-in "cirle_soft" Editor's brush)
Material mat = Materials.findMaterial("circle_soft");
if (mat) {
// setting necessary textures to be modified by the brush
mat.setTexture("terrain_albedo", buffer.getAlbedo());
mat.setTexture("terrain_height", buffer.getHeight());
// setting up brush material parameters
mat.setParameterFloat("size", 100.0f);
mat.setParameterFloat("height", 10.0f);
mat.setParameterFloat4("color", vec4.RED);
mat.setParameterInt("data_mask", Landscape.FLAGS_DATA_ALBEDO | Landscape.FLAGS_DATA_HEIGHT);
// running material's "brush" expression
mat.runExpression("brush", buffer.getResolution().x, buffer.getResolution().y);
// resetting material textures
mat.setTexture("terrain_albedo", null);
mat.setTexture("terrain_height", null);
}
}
/*...*/
public override bool Init()
{
// setting the TextureDraw() function to handle texture drawing
Landscape.AddTextureDrawCallback((guid, id, buffer, coord, data_mask)
=> TextureDraw(guid, id, buffer, coord, data_mask));
return true;
}
/*...*/
}
Arguments
- TextureDrawDelegate func - Callback function with the following signature:
void TextureDrawDelegate(UGUID guid, int id, LandscapeTextures buffer, ivec2 coord, int data_mask)
Return value
ID of the last added texture draw callback, if the callback was added successfully; otherwise, null. This ID can be used to remove this callback when necessary.bool RemoveTextureDrawCallback ( IntPtr id ) #
Removes the specified callback from the list of texture draw callbacks.Arguments
- IntPtr id - Texture draw callback ID obtained when adding it.
Return value
True if the texture draw callback with the given ID was removed successfully; otherwise false.void ClearTextureDrawCallback ( ) #
Clears all added texture draw callbacks.IntPtr AddApplyDiffCallback ( ApplyDiffDelegate func ) #
Adds a callback function to be called on applying a diff to the landscape layer map file. The signature of the callback function must be as follows:void apply_diff_callback(UGUID guid, int id, String path);
You can set a callback function as follows:
AddApplyDiffCallback((guid, id, path)
=> apply_diff_callback(guid, id, path));
Example: Setting an apply diff callback function:
class AppWorldLogic : WorldLogic
{
/*...*/
// callback function implementing certain actions to be performed on applying a diff
private void ApplyDiff(UGUID guid, int id, String path)
{
// insert your specific handling code here
}
/*...*/
public override bool Init()
{
// setting the ApplyDiff() function to handle an apply diff event
Landscape.AddApplyDiffCallback((guid, id, path)
=> ApplyDiff(guid, id, path));
return true;
}
/*...*/
}
Arguments
- ApplyDiffDelegate func - Callback function with the following signature:
void ApplyDiffDelegate(UGUID guid, int id, String path)
Return value
ID of the last added apply diff callback, if the callback was added successfully; otherwise, null. This ID can be used to remove this callback when necessary.bool RemoveApplyDiffCallback ( IntPtr id ) #
Removes the specified callback from the list of apply diff callbacks.Arguments
- IntPtr id - Apply diff callback ID obtained when adding it.
Return value
True if the apply diff callback with the given ID was removed successfully; otherwise false.void ClearApplyDiffCallback ( ) #
Clears all added apply diff callbacks.IntPtr AddSaveFileCallback ( SaveFileDelegate func ) #
Adds a callback function to be called on applying changes made to a landscape layer map file and saving old and new states to temporary files. The signature of the callback function must be as follows:void save_file_callback(UGUID guid, int id, String path_new_state, String path_old_state);
You can set a callback function as follows:
AddSaveFileCallback((guid, id, path_new_state, path_old_state)
=> save_file_callback(guid, id, path_new_state, path_old_state));
Example: Setting a save file callback function:
class AppWorldLogic : WorldLogic
{
/*...*/
// callback function
private void SaveFile(UGUID guid, int id, String path, String path_new_state, String path_old_state)
{
// insert your specific handling code here
}
/*...*/
public override bool Init()
{
// setting the SaveFile() function to handle file saving
Landscape.AddSaveFileCallback((guid, id, path_new_state, path_old_state)
=> SaveFile(guid, id, path_new_state, path_old_state));
return true;
}
/*...*/
}
Arguments
- SaveFileDelegate func - Callback function with the following signature:
void SaveFileDelegate(UGUID guid, int id, String path_new_state, String path_old_state)
Return value
ID of the last added save file callback, if the callback was added successfully; otherwise, null. This ID can be used to remove this callback when necessary.bool RemoveSaveFileCallback ( IntPtr id ) #
Removes the specified callback from the list of save file callbacks.Arguments
- IntPtr id - Save file callback ID obtained when adding it.
Return value
True if the save file callback with the given ID was removed successfully; otherwise false.void ClearSaveFileCallback ( ) #
Clears all added save file callbacks.int GenerateOperationID ( ) #
Generates a new ID for the operation. This ID is used to manage operations.int id = Landscape::generateOperationID();
// user's code (bounding to ID)
Landscape::asyncTextureDraw(id, file_guid, coord, resolution, flags_file_data);