A GPU powered Terrain editor and renderer for Godot Engine

Cartographer

Cartographer is a GPU powered terrain editor for Godot 3.

Features

  • GPU Clipmap LOD terrain mesh
    • Terrain sizes from 32 to 1024 units
  • Layered Terrain Material
    • 16 layer Weightmap with GPU painting
    • Triplanar texture mapping
    • Full PBR material support
    • Masked weight blending (Experimental)
    • GPU Heightmap sculpting
      • 16bit Heightmaps
      • Terrain holes (for caves etc.)
  • Physics
    • Heightmap physics collision shape generator
    • Terrain ray picking for painting and sculpting
      • GPU ray picking
    • Friction map?
  • Dynamic lighting
    • Lightmap baking
  • Audio map?
  • Customizable terrain visual shader
    • Custom visual shader nodes
  • Undo / redo
  • TextureArray editing
    • Custome TextureArray ResourceSaver (save as .texarr)
    • Custom TextureArray importer/builder
  • Brushes panel
  • Custom Brushes
    • Brush strength
    • Brush scale
    • Brush rotation
    • Brush spacing
    • Brush strength jitter
    • Brush scale jitter
    • Brush rotation jitter
    • Brush spacing jitter
  • Editing tools
    • Raise
    • Lower
    • Paint
    • Erase
    • Fill
    • Smooth
    • Sharpen
    • Level
    • Select
  • Advanced editing with:
    • Anchors
    • Shapes

Guide

Terrain Editing

  1. Install the addon into your project.
    1. Remember to enable the cartographer singleton.
  2. In a spatial scene click add and type "cartoterrain".
  3. Add a CartoTerrain node.
  4. Inspect the terrain node, set the height, width, depth to desired size.
  5. In the inspector select and expand the Material property.
    1. Under the Albedo, Normal or Ao, Roughness, Metallic group find the textures field.
    2. Click New CartoMultiTexture to create a new texture array, (or Load to load an existing array).
    3. Click the Create button to initialize the new texture array, choose the size and format from the dialog.
    4. You will now have an empty texture array, click the folder icon on a layer to load an image for that layer.
    5. Click the down arrow to edit the layer's image channels directly.
    6. Click on a layer to select it for paiting, it will highlight when selected.
    7. To enjoy PBR rendering you need to add matching textures to each group. So if you add an Albedo texture at index 2 then you should add its NormalMap texture to index 2 of the Normal array. For AO, Roughness, and Mettalic textures add the AO texture to index 2 channel 0 (Red), the Roughness texture to index 2 channel 1 (Green), the Mettalic texture to index 2 channel 2 (Blue).
    8. If you add a NormalMap to a layer, don't forget to enable that layer for NormalMapping.
    9. ATTENTION! Godot's texture arrays are quite buggy. Cartographer comes with tools to help work around this. You should save your texture array to an external file for perfomance, but saving the texture array in the scene or as a standard Godot resource (.tres or .res) causes errors. Cartographer has a custom texture array resource saver, click the Save option and choose to save the texture array as a .texarr file type. Even better, use the custom TextureArray Importer that builds TextureArrays from JSON files. More info below.
  6. Click on the Brushes tab on the right side of the editor, you must have a brush selected to do any editing.
  7. Choose a brush or add a new brush
    1. If adding a brush make sure to set the channel for the brush mask.
    2. 16bit .exr brushes are best.
  8. Make sure the terrain node is selected, and choose your terrain editing tool from the icons above the main view.
    1. You can choose to raise or lower terrain, or paint or fill a texture.
    2. Hold alt while using a tool to do the opposite, ie. while raising hold alt to lower.
  9. Sculpt and paint your terrain.
  10. Remember to save with ctrl-s while working.
  11. IMPORTANT! To improve editing and runtime performance, under the Material property find the heightmap and weightmap textures and save them to external files (as .res).

Physics

  1. To add collision physics to your terrain add a StaticBody to your terrain node.
  2. Add a CollisionCartoTerrain node to the StaticBody.
  3. Select the CollisionCartoTerrain node and in the inspector choose the Terrain Path, (select your terrain node).
  4. The HeightmapShape will be auto generated and updated when the terrain changes.
  5. IMPORTANT! Do not add the physics while sculpting your terrain, it will be very slow as the HeightMapShape will be forced to update as you make changes.
    1. Either only add the physics nodes once you are done editing.
    2. Or only add the Terrain Path to the CollisionCartoTerrain once you are done editing.

Custom TextureArray Importer

Cartographer now comes with a custom TextureArray Importer, this is the most stable and performant way to generate TextureArrays for your terrain material. Godot comes with a built-in TextureArray importer, but it works by requiring you to merge all your textures into one large image in a grid pattern, then importing that image and telling the importer how many rows and columns it should split the image by.

Cartographer's TextureArray Importer builds the TextureArray from a simple JSON file. In the JSON build file you can set the texture width and height, list the images you'd like to use for each layer, and even build a layer channel by channel. The format is simple:

{
  // Set the width and height for each layer
  "size": [1024, 1024],
  // Set each layer in the array
  "layers": [
    // A layer in the array can be a resource path
    "res://assets/textures/rock_albedo.jpg",
    // or a file system path
    "file://home/user/project/assets/textures/rock_albedo.jpg",
    // or simply a hex color
    "#FFFFFF",
    // Layers can also be created by mixing channels directly, using an object like this
    {
      // The key selects the destination channels, the value is an array,
      // with the first item being the image (or color hex #FFFFFF) source,
      // the second item are the source channels, here they are being read in reverse,
      // mapping blue to red, green to green, and red to blue
      "rgb": ["res://assets/textures/rock_albedo.jpg", "bgr"],
      // Here the alpha channel is set to the red channel from the rock_mask image
      "a": ["res://assets/textures/rock_mask.jpg", "r"],
    },
  ],
}

Save the file with a .tabld file extension, select the file in the editor and go to the import tab to choose your build import options.

Experimental Masked Weight Blending

There is experimental support for masked weight blending in Cartographer. Masked weight blending uses a mask added to the alpha channel on an Albedo layer to boost or reduce the weight of a layer where it blends into another layer. This breaks up smooth gradient blends from the brush used to paint the layer, and makes the blending look more natural for the texture. For example; a brick layer with a mask blending into a sand layer will have the sand seem to fill the gaps between bricks more than the surface of the bricks. An example below:

Comparison of the same weight blend with and without masked blending

Comments
  • Unable to load or use

    Unable to load or use

    My expectations were to copy to addons folder, and get an editable node, it appears you need to open as a project to be able to use, so proceeding from there -- so its not strictly an addon you can put into and use from any project. I used the project, but I'm still getting an error, in plugin.gd something is not in scope.

    Yes, the addon is copied to the addons directory Yes, the addon is enabled Yes, autoload is enabled

    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The class "TexturePainter" couldn't be fully loaded (script error or cyclic dependency).
       At: res://addons/cartographer/terrain/carto_terrain_material.gd:13.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The class "TexturePainter" couldn't be fully loaded (script error or cyclic dependency).
       At: res://addons/cartographer/terrain/carto_terrain_material.gd:13.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The class "CartoTerrainMaterial" couldn't be fully loaded (script error or cyclic dependency).
       At: res://addons/cartographer/terrain/carto_terrain.gd:144.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/terrain/carto_terrain_material_editor/layers_editor.gd:26.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: Couldn't fully preload the script, possible cyclic reference or compilation error. Use "load()" instead if a cyclic reference is intended.
       At: res://addons/cartographer/terrain/carto_terrain_inspector.gd:4.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The class "TexturePainter" couldn't be fully loaded (script error or cyclic dependency).
       At: res://addons/cartographer/terrain/carto_terrain_material.gd:13.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The class "TexturePainter" couldn't be fully loaded (script error or cyclic dependency).
       At: res://addons/cartographer/terrain/carto_terrain_material2.gd:13.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The class "CartoTerrain" couldn't be fully loaded (script error or cyclic dependency).
       At: res://addons/cartographer/terrain/collision_carto_terrain.gd:6.
    ERROR: reload: Method failed. Returning: ERR_PARSE_ERROR
       At: modules/gdscript/gdscript.cpp:599.
    SCRIPT ERROR: GDScript::reload: Parse Error: The identifier "Cartographer" isn't declared in the current scope.
       At: res://addons/cartographer/texture_painter/texture_painter.gd:69.
    

    The problem appears to begin at line 4 in plugin.gd

    const Action = Cartographer.Action
    

    where 'Cartographer' is just dropped there out of scope without import or reference

  • SIGSEGV signal for Godot during terrain editing.

    SIGSEGV signal for Godot during terrain editing.

    I I encountered a strange problem while editing the example terrain. Immediately after using the "Raise" tool, I switched to "Lower" mode and each time the effect is the same. I can edit the terrain for few seconds than it crashes. I uploaded video of the problem: https://streamable.com/5aa7ix Here is a console output:

    OpenGL ES 3.0 Renderer: GeForce GTX 1660 Ti/PCIe/SSE2
     
    Mono: Logfile is: /home/wojtekpil/.local/share/godot/mono/mono_logs/2020_07_15 18.19.36 (14305).txt
    
    =================================================================
    	Native Crash Reporting
    =================================================================
    Got a SIGSEGV while executing native code. This usually indicates
    a fatal error in the mono runtime or one of the native libraries 
    used by your application.
    =================================================================
    
    =================================================================
    	Native stacktrace:
    =================================================================
    	0xd20004 - /home/wojtekpil/Programs/Godot_3.2.2/Godot_v3.2.2-stable_mono_x11.64 : (null)
    	0xd2037c - /home/wojtekpil/Programs/Godot_3.2.2/Godot_v3.2.2-stable_mono_x11.64 : (null)
    	0xd12e28 - /home/wojtekpil/Programs/Godot_3.2.2/Godot_v3.2.2-stable_mono_x11.64 : (null)
    	0xc8b691 - /home/wojtekpil/Programs/Godot_3.2.2/Godot_v3.2.2-stable_mono_x11.64 : (null)
    	0x31e5d7c - /home/wojtekpil/Programs/Godot_3.2.2/Godot_v3.2.2-stable_mono_x11.64 : (null)
    	0xaeedaf8 - Unknown
    
    =================================================================
    	Telemetry Dumper:
    =================================================================
    Pkilling 0x7f040d9fe700 from 0x7f04399acf80
    Pkilling 0x7f0428817700 from 0x7f04399acf80
    * Assertion: should not be reached at threads.c:6258
    Entering thread summarizer pause from 0x7f04399acf80
    Finished thread summarizer pause from 0x7f04399acf80.
    
    Waiting for dumping threads to resume
    
    =================================================================
    	External Debugger Dump:
    =================================================================
    [New LWP 14306]
    [New LWP 14316]
    [New LWP 14317]
    [New LWP 14318]
    [New LWP 14319]
    [New LWP 14320]
    [New LWP 14321]
    [New LWP 14323]
    [New LWP 14325]
    [New LWP 14326]
    [New LWP 14328]
    [New LWP 14329]
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    0x00007f04395b024a in __waitpid (pid=pid@entry=14350, stat_loc=stat_loc@entry=0x7fff0092dd44, options=options@entry=0) at ../sysdeps/unix/sysv/linux/waitpid.c:30
    30	../sysdeps/unix/sysv/linux/waitpid.c: No such file or directory.
      Id   Target Id         Frame 
    * 1    Thread 0x7f04399acf80 (LWP 14305) "Godot_v3.2.2-st" 0x00007f04395b024a in __waitpid (pid=pid@entry=14350, stat_loc=stat_loc@entry=0x7fff0092dd44, options=options@entry=0) at ../sysdeps/unix/sysv/linux/waitpid.c:30
      2    Thread 0x7f04399ab700 (LWP 14306) "Godot_v3.2.2-st" 0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x5a60938) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
      3    Thread 0x7f043077d700 (LWP 14316) "Godot_v3.2.2-st" 0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x5e0ca98) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
      4    Thread 0x7f042897a700 (LWP 14317) "Godot_v3.2.2-st" 0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f0428979d50, remaining=0x7f0428979d50) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
      5    Thread 0x7f0428939700 (LWP 14318) "Godot_v3.2.2-st" 0x00007f0438ae7a30 in __GI___nanosleep (requested_time=requested_time@entry=0x7f0428938d20, remaining=remaining@entry=0x0) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
      6    Thread 0x7f040f7ff700 (LWP 14319) "SGen worker" 0x00007f04395ab9f3 in futex_wait_cancelable (private=<optimized out>, expected=0, futex_word=0x4c8af88 <work_cond+40>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
      7    Thread 0x7f0428817700 (LWP 14320) "Finalizer" 0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x4c78720 <finalizer_sem>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
      8    Thread 0x7f0431467700 (LWP 14321) "Godot_v3.2.2-st" 0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f0431466b90, remaining=0x7f0431466b90) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
      9    Thread 0x7f0431426700 (LWP 14323) "Godot_v3.2.2-st" 0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f0431425d80, remaining=0x7f0431425d80) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
      10   Thread 0x7f04313e5700 (LWP 14325) "Godot_v3.2.2-st" 0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f04313e4d40, remaining=0x7f04313e4d40) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
      11   Thread 0x7f040d9fe700 (LWP 14326) "Thread Pool I/O" 0x00007f0438b17cf9 in __GI___poll (fds=0xb6ca590, nfds=2, timeout=timeout@entry=-1) at ../sysdeps/unix/sysv/linux/poll.c:29
      12   Thread 0x7f04300ba700 (LWP 14328) "Godot_v3.2.2-st" 0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xd052e08) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
      13   Thread 0x7f0430079700 (LWP 14329) "worker" 0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x24797a48) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
    
    Thread 13 (Thread 0x7f0430079700 (LWP 14329)):
    #0  0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x24797a48) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
    #1  do_futex_wait (sem=sem@entry=0x24797a48, abstime=0x0) at sem_waitcommon.c:111
    #2  0x00007f04395ae7d8 in __new_sem_wait_slow (sem=0x24797a48, abstime=0x0) at sem_waitcommon.c:181
    #3  0x000000000299d42d in SemaphorePosix::wait() [clone .part.0] ()
    #4  0x00007f04300781f0 in ?? ()
    #5  0x0000000003102d61 in MethodBind0R<Error>::call(Object*, Variant const**, int, Variant::CallError&) ()
    #6  0x00000000012ce88a in ClassDB::get_method(StringName, StringName) ()
    #7  0x000000000aeed950 in ?? ()
    #8  0x3b90932b41686600 in ?? ()
    #9  0x00000000247701c0 in ?? ()
    #10 0x00007f04300781f0 in ?? ()
    #11 0x00000000247701c0 in ?? ()
    #12 0x0000000001252793 in Object::call(StringName const&, Variant const**, int, Variant::CallError&) ()
    #13 0x00007f0430078200 in ?? ()
    #14 0x00007f0430078348 in ?? ()
    #15 0x00007f04300781c0 in ?? ()
    #16 0x00007f04300781f0 in ?? ()
    #17 0x0000000000000000 in ?? ()
    
    Thread 12 (Thread 0x7f04300ba700 (LWP 14328)):
    #0  0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0xd052e08) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
    #1  do_futex_wait (sem=sem@entry=0xd052e08, abstime=0x0) at sem_waitcommon.c:111
    #2  0x00007f04395ae7d8 in __new_sem_wait_slow (sem=0xd052e08, abstime=0x0) at sem_waitcommon.c:181
    #3  0x000000000299d42d in SemaphorePosix::wait() [clone .part.0] ()
    #4  0x000000000d0307e0 in ?? ()
    #5  0x0000000002705323 in EditorResourcePreview::_thread() ()
    #6  0x0000000002a86da5 in ThreadPosix::thread_callback(void*) ()
    #7  0x0000000000000000 in ?? ()
    
    Thread 11 (Thread 0x7f040d9fe700 (LWP 14326)):
    #0  0x00007f0438b17cf9 in __GI___poll (fds=0xb6ca590, nfds=2, timeout=timeout@entry=-1) at ../sysdeps/unix/sysv/linux/poll.c:29
    #1  0x0000000000f2db57 in poll (__timeout=__timeout@entry=-1, __nfds=<optimized out>, __fds=<optimized out>) at /usr/include/x86_64-linux-gnu/bits/poll2.h:46
    #2  mono_poll (ufds=<optimized out>, nfds=<optimized out>, timeout=timeout@entry=-1) at mono-poll.c:45
    #3  0x0000000000e9cbd7 in poll_event_wait (callback=0xe9d430 <wait_callback>, user_data=0x7f03e4002480) at threadpool-io-poll.c:153
    #4  0x0000000000e9dffa in selector_thread (data=data@entry=0x0) at threadpool-io.c:457
    #5  0x0000000000eb0ed5 in start_wrapper_internal (stack_ptr=0x7f040d9ff000, start_info=0x0) at threads.c:1226
    #6  start_wrapper (data=0xb6d0bf0) at threads.c:1299
    #7  0x00007f04395a56db in start_thread (arg=0x7f040d9fe700) at pthread_create.c:463
    #8  0x00007f0438b24a3f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
    
    Thread 10 (Thread 0x7f04313e5700 (LWP 14325)):
    #0  0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f04313e4d40, remaining=0x7f04313e4d40) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
    #1  0x0000000000f8350b in OS_Unix::delay_usec(unsigned int) const [clone .constprop.12990] ()
    #2  0x0000000000000000 in ?? ()
    
    Thread 9 (Thread 0x7f0431426700 (LWP 14323)):
    #0  0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f0431425d80, remaining=0x7f0431425d80) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
    #1  0x0000000000f8350b in OS_Unix::delay_usec(unsigned int) const [clone .constprop.12990] ()
    #2  0x0000000000000000 in ?? ()
    
    Thread 8 (Thread 0x7f0431467700 (LWP 14321)):
    #0  0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f0431466b90, remaining=0x7f0431466b90) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
    #1  0x0000000000f8350b in OS_Unix::delay_usec(unsigned int) const [clone .constprop.12990] ()
    #2  0x0000000000000000 in ?? ()
    
    Thread 7 (Thread 0x7f0428817700 (LWP 14320)):
    #0  0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x4c78720 <finalizer_sem>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
    #1  do_futex_wait (sem=sem@entry=0x4c78720 <finalizer_sem>, abstime=0x0) at sem_waitcommon.c:111
    #2  0x00007f04395ae7d8 in __new_sem_wait_slow (sem=sem@entry=0x4c78720 <finalizer_sem>, abstime=0x0) at sem_waitcommon.c:181
    #3  0x00007f04395ae849 in __new_sem_wait (sem=sem@entry=0x4c78720 <finalizer_sem>) at sem_wait.c:42
    #4  0x0000000000ddd1f8 in mono_os_sem_wait (flags=MONO_SEM_FLAGS_ALERTABLE, sem=0x4c78720 <finalizer_sem>) at ../../mono/utils/mono-os-semaphore.h:203
    #5  mono_coop_sem_wait (flags=MONO_SEM_FLAGS_ALERTABLE, sem=0x4c78720 <finalizer_sem>) at ../../mono/utils/mono-coop-semaphore.h:41
    #6  finalizer_thread (unused=unused@entry=0x0) at gc.c:967
    #7  0x0000000000eb0ed5 in start_wrapper_internal (stack_ptr=0x7f0428818000, start_info=0x0) at threads.c:1226
    #8  start_wrapper (data=0x7146870) at threads.c:1299
    #9  0x00007f04395a56db in start_thread (arg=0x7f0428817700) at pthread_create.c:463
    #10 0x00007f0438b24a3f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
    
    Thread 6 (Thread 0x7f040f7ff700 (LWP 14319)):
    #0  0x00007f04395ab9f3 in futex_wait_cancelable (private=<optimized out>, expected=0, futex_word=0x4c8af88 <work_cond+40>) at ../sysdeps/unix/sysv/linux/futex-internal.h:88
    #1  __pthread_cond_wait_common (abstime=0x0, mutex=0x4c8afa0 <lock>, cond=0x4c8af60 <work_cond>) at pthread_cond_wait.c:502
    #2  __pthread_cond_wait (cond=cond@entry=0x4c8af60 <work_cond>, mutex=mutex@entry=0x4c8afa0 <lock>) at pthread_cond_wait.c:655
    #3  0x0000000000f1b9d6 in mono_os_cond_wait (mutex=0x4c8afa0 <lock>, cond=0x4c8af60 <work_cond>) at ../../mono/utils/mono-os-mutex.h:177
    #4  get_work (job=<synthetic pointer>, do_idle=<synthetic pointer>, work_context=<synthetic pointer>, worker_index=0) at sgen-thread-pool.c:165
    #5  thread_func (data=<optimized out>) at sgen-thread-pool.c:196
    #6  0x00007f04395a56db in start_thread (arg=0x7f040f7ff700) at pthread_create.c:463
    #7  0x00007f0438b24a3f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
    
    Thread 5 (Thread 0x7f0428939700 (LWP 14318)):
    #0  0x00007f0438ae7a30 in __GI___nanosleep (requested_time=requested_time@entry=0x7f0428938d20, remaining=remaining@entry=0x0) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
    #1  0x00007f0438b1a977 in usleep (useconds=<optimized out>) at ../sysdeps/posix/usleep.c:32
    #2  0x000000000323ec02 in JoypadLinux::monitor_joypads() ()
    #3  0x0000005b0000006e in ?? ()
    #4  0x0000000006932680 in ?? ()
    #5  0xffffffffffffff48 in ?? ()
    #6  0x00007f0400000b50 in ?? ()
    #7  0x706e692f7665642f in ?? ()
    #8  0x746e6576652f7475 in ?? ()
    #9  0x0000000000003133 in ?? ()
    #10 0x000000000692aea0 in ?? ()
    #11 0x000000000692aeb0 in ?? ()
    #12 0x00007f0438a9a35d in __GI___libc_malloc (bytes=32) at malloc.c:3065
    #13 0x00007f0428938ec0 in ?? ()
    #14 0x0000000000000000 in ?? ()
    
    Thread 4 (Thread 0x7f042897a700 (LWP 14317)):
    #0  0x00007f04395afc70 in __GI___nanosleep (requested_time=0x7f0428979d50, remaining=0x7f0428979d50) at ../sysdeps/unix/sysv/linux/nanosleep.c:28
    #1  0x0000000000f8350b in OS_Unix::delay_usec(unsigned int) const [clone .constprop.12990] ()
    #2  0x0000000000000000 in ?? ()
    
    Thread 3 (Thread 0x7f043077d700 (LWP 14316)):
    #0  0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x5e0ca98) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
    #1  do_futex_wait (sem=sem@entry=0x5e0ca98, abstime=0x0) at sem_waitcommon.c:111
    #2  0x00007f04395ae7d8 in __new_sem_wait_slow (sem=0x5e0ca98, abstime=0x0) at sem_waitcommon.c:181
    #3  0x000000000299d42d in SemaphorePosix::wait() [clone .part.0] ()
    #4  0x00007f043077e020 in ?? ()
    #5  0x000000000160ff23 in VisualServerScene::_gi_probe_bake_thread() ()
    #6  0x0000000000000000 in ?? ()
    
    Thread 2 (Thread 0x7f04399ab700 (LWP 14306)):
    #0  0x00007f04395ae6e6 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=0, futex_word=0x5a60938) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
    #1  do_futex_wait (sem=sem@entry=0x5a60938, abstime=0x0) at sem_waitcommon.c:111
    #2  0x00007f04395ae7d8 in __new_sem_wait_slow (sem=0x5a60938, abstime=0x0) at sem_waitcommon.c:181
    #3  0x000000000299d42d in SemaphorePosix::wait() [clone .part.0] ()
    #4  0x0000000005a60970 in ?? ()
    #5  0x00000000010e1ec4 in _IP_ResolverPrivate::_thread_function(void*) ()
    #6  0x0000000005a60980 in ?? ()
    #7  0x00007f0438a9a35d in __GI___libc_malloc (bytes=94767416) at malloc.c:3065
    #8  0x00007f04399aaec0 in ?? ()
    #9  0x0000000000000000 in ?? ()
    
    Thread 1 (Thread 0x7f04399acf80 (LWP 14305)):
    #0  0x00007f04395b024a in __waitpid (pid=pid@entry=14350, stat_loc=stat_loc@entry=0x7fff0092dd44, options=options@entry=0) at ../sysdeps/unix/sysv/linux/waitpid.c:30
    #1  0x0000000000d201f1 in dump_native_stacktrace (mctx=mctx@entry=0x7fff0092e880, signal=0x33dc227 "SIGSEGV") at mini-posix.c:1089
    #2  0x0000000000d2037c in mono_dump_native_crash_info (signal=signal@entry=0x33dc227 "SIGSEGV", mctx=mctx@entry=0x7fff0092e880, info=info@entry=0x0) at mini-posix.c:1135
    #3  0x0000000000d12e28 in mono_handle_native_crash (signal=signal@entry=0x33dc227 "SIGSEGV", mctx=mctx@entry=0x7fff0092e880, info=info@entry=0x0) at mini-exceptions.c:3423
    #4  0x0000000000c8b691 in altstack_handle_and_restore () at exceptions-amd64.c:875
    #5  0x00000000031e5d7c in PoolVector<unsigned char>::_copy_on_write() ()
    #6  0x0000000000000000 in ?? ()
    
    =================================================================
    	Basic Fault Address Reporting
    =================================================================
    Memory around native instruction pointer (0x31e5d7c):0x31e5d6c  1f 44 00 00 f0 41 83 06 01 48 8b 03 49 8b 75 08  .D...A...H..I.u.
    0x31e5d7c  48 8b 40 18 89 c1 85 c0 0f 8e 65 01 00 00 31 ff  [email protected].
    0x31e5d8c  e9 30 ff ff ff 66 66 66 66 66 66 2e 0f 1f 84 00  .0...ffffff.....
    0x31e5d9c  00 00 00 00 ff d0 e9 d6 fe ff ff 66 0f 1f 84 00  ...........f....
    
    =================================================================
    	Managed Stacktrace:
    =================================================================
    =================================================================
    
  • Can't open example project

    Can't open example project

    Can't get the example project to work in Godot 3.2.4 RC4. It complains about missing dependencies (e.g. no res://example/textures folder).

    To Reproduce Steps to reproduce the behavior:

    1. Download zip of the repo
    2. Import project.godot into godot
    3. Open project and try to open any of the scenes

    Expected behavior Project should open correctly and show the addon in action.

    Screenshots image

    Desktop (please complete the following information):

    • OS: Windows 10
    • Godot Version 3.2.4 RC4
    • Cartographer Version 0.9.0
  • GPU clipmap: does it make a difference in Godot 3?

    GPU clipmap: does it make a difference in Godot 3?

    Knowing Godot 3 doesn't expose any form of tessellation, geometry shaders or index buffer tricks, I discarded doing clipmaps on the GPU in my plugin. I was surprised to see that your plugin apparently does something like that, however... is it really making a difference? From what i see in the shader, you only displace vertices. So they always get processed, wether or not you change their position to visually merge them. I know you can discard a vertex and all triangles using it by outputting a NaN though, which I use for grass, just never considered for LOD (I use a CPU-side quad tree instead so geometry doesnt even get to the shader). If you use that, do you have some profiling results showing how much it improves framerate?

  • Unable to load addon script from path: 'res://addons/cartographer/plugin.gd'

    Unable to load addon script from path: 'res://addons/cartographer/plugin.gd'

    Unable to load addon script from path: 'res://addons/cartographer/plugin.gd' There seems to be an error in the code, please check the syntax.

    error(4,1) Expected a constant expression

    const Action = Cartographer.action

  • Procedural generation (ingame)

    Procedural generation (ingame)

    Is your feature request related to a problem? Please describe. I don't know how i can make 3d procedural terrain (and cave) generation. I found your addon and it looks really great, so this generation would be really helpful for big games.

    Describe the solution you'd like A procedural terrain (later also cave) generation ingame.

    Describe alternatives you've considered No alternatives for this request.

    Additional context This is a really big feature request and I don't know much about terrain generation, but I will try to help.

  • Plugin fails to load due to syntax error.

    Plugin fails to load due to syntax error.

    OS: Linux Mint 20 x86_64 Plugin version: 0.7.0 Godot version: 3.2.2.stable

    Whenever I try to enable Cartographer in the plugins menu, Godot displays the following pop-up error message: image

    And the following console output: image

    Thanks in advance, this plugin looks great!

  • Tile Breaker Plugin

    Tile Breaker Plugin

    There was recently created a very cool plugin for a Godot: https://github.com/SIsilicon/Tile-Breaker-Plugin I think, that its integration would dramatically improve a texturing quality. I don't know anything about the performance impact, but it's worth a try.

  • Lack of license makes this incompatible with many projects

    Lack of license makes this incompatible with many projects

    Would you mind adding a license file so that we know what the code is licensed under? Without an explicit declaration, code isn't allowed to be copied by anyone other than the author, legally speaking that is.

  • Vertex morphing

    Vertex morphing

    Hey @arccoza, I've managed to make a nice looking terrain in Godot 4.0 based on your original clipmap shader and its looking really cool! I'm struggling to work out how to stop the noticeable popping between LOD levels though...

    I think we need to morph the vertex heights at the edges of the grid towards the position they would be at the next LOD to make a smooth transition, but in practice I've not been able to work out what that position should be.

    I don't suppose you've had any thoughts on how to do that?

  • Plugin class_name type hints and singleton dependency loop

    Plugin class_name type hints and singleton dependency loop

    Describe the bug When you have a class in a plugin that depends on a Singleton loaded by that plugin (with add_autoload_singleton) you can end up in a dependency loop very easily. See: https://github.com/godotengine/godot/issues/42651

    To Reproduce Steps to reproduce the behavior:

    1. Create a plugin.
    2. Use add_autoload_singleton in the class to load a singleton.
    3. Create a class that depends on the singleton.
    4. Use that class as a type hint in the plugin script.

    Minimal reproduction project: plugin_class_singleton_dep_loop.zip

Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.
Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.

Powered by Matterbridge, MatterAMXX is a plugin for AMXX that allows simple bridging between your game servers, Mattermost, IRC, XMPP, Gitter, Slack, Discord, Telegram, and more.

Dec 27, 2022
Nuke-Net is a VERY VERY over powered and ridiculous web crawler that is well- very very noisy XD read more here
Nuke-Net is a VERY VERY over powered and ridiculous web crawler that is well- very very noisy XD read more here

Nuke-Net is a VERY VERY over powered and ridiculous web crawler that is well- very very noisy XD read more here

Dec 20, 2021
SailFirewall - Linux firewall powered by eBPF and XDP

SailFirewall Linux firewall powered by eBPF and XDP Requirements Go 1.16+ Linux

May 4, 2022
gqlgenc is a fully featured go gql client, powered by codegen

gqlgenc Note: ⚠️ This is a WIP, backward-compatibility cannot be guaranteed yet, use at your own risk gqlgenc is a fully featured go gql client, power

Sep 17, 2022
An userspace SORACOM Arc client powered by wireguard-go

soratun An easy-to-use, userspace SORACOM Arc client powered by wireguard-go. For deploying and scaling Linux servers/Raspberry Pi devices working wit

Jun 2, 2022
GraphQL API server for galaxy powered blockchain network

ICICB GraphQL API Server GraphQL API server for galaxy powered blockchain network. Releases Please check the release tags to get more details and to d

Jan 5, 2022
Implementing SPEEDEX price computation engine in Golang as a standalone binary that exchanges can call

speedex-standalone Implementing SPEEDEX price computation engine in Golang as a standalone binary that exchanges can call. Notes from Geoff About Tato

Dec 1, 2021
Simple Nginx Load Balancing Use Docker Engine
Simple Nginx Load Balancing Use Docker Engine

Load Balancing Menggunakan Nginx Load Balancing adalah sebuah mekanisme untuk membagi atau mendistribusikan trafik ke beberapa server. Nginx selain be

Dec 14, 2021
Core is the next-generation digital data engine.
Core is the next-generation digital data engine.

tKeel-Core The digital engine of world ?? Core is the data centre of the tKeel IoT Open Platform, a high-performance, scalable and lightweight next-ge

Mar 28, 2022
An implementation of the Information Concealment Engine cipher in Go
An implementation of the Information Concealment Engine cipher in Go

An implementation of the Information Concealment Engine cipher in Go

Jan 26, 2022
Grcon - Lib for Source Engine's RCON protocol in Go

grcon A basic Golang library for the RCON Protocol. Features Max control over th

Mar 5, 2022
A golang library about socks5, supports all socks5 commands. That Provides server and client and easy to use. Compatible with socks4 and socks4a.

socks5 This is a Golang implementation of the Socks5 protocol library. To see in this SOCKS Protocol Version 5. This library is also compatible with S

Nov 22, 2022
Transparent TLS and HTTP proxy serve and operate on all 65535 ports, with domain regex whitelist and rest api control

goshkan Transparent TLS and HTTP proxy serve & operating on all 65535 ports, with domain regex whitelist and rest api control tls and http on same por

Nov 5, 2022
Tapestry is an underlying distributed object location and retrieval system (DOLR) which can be used to store and locate objects. This distributed system provides an interface for storing and retrieving key-value pairs.

Tapestry This project implements Tapestry, an underlying distributed object location and retrieval system (DOLR) which can be used to store and locate

Mar 16, 2022
A Go package for sending and receiving ethernet frames. Currently supporting Linux, Freebsd, and OS X.

ether ether is a go package for sending and receiving ethernet frames. Currently supported platform: BPF based OS X FreeBSD AF_PACKET based Linux Docu

Sep 27, 2022
Package ethernet implements marshaling and unmarshaling of IEEE 802.3 Ethernet II frames and IEEE 802.1Q VLAN tags. MIT Licensed.

ethernet Package ethernet implements marshaling and unmarshaling of IEEE 802.3 Ethernet II frames and IEEE 802.1Q VLAN tags. MIT Licensed. For more in

Dec 29, 2022
A Stable & Secure Tunnel based on KCP with N:M multiplexing and FEC. Available for ARM, MIPS, 386 and AMD64。KCPプロトコルに基づく安全なトンネル。KCP 프로토콜을 기반으로 하는 보안 터널입니다。
A Stable & Secure Tunnel based on KCP with N:M multiplexing and FEC. Available for ARM, MIPS, 386 and AMD64。KCPプロトコルに基づく安全なトンネル。KCP 프로토콜을 기반으로 하는 보안 터널입니다。

Disclaimer: kcptun maintains a single website — github.com/xtaci/kcptun. Any websites other than github.com/xtaci/kcptun are not endorsed by xtaci. Re

Jan 9, 2023
httpstream provides HTTP handlers for simultaneous streaming uploads and downloads of objects, as well as persistence and a standalone server.

httpfstream httpfstream provides HTTP handlers for simultaneous streaming uploads and downloads of files, as well as persistence and a standalone serv

May 1, 2021
:alarm_clock: :fire: A TCP proxy to simulate network and system conditions for chaos and resiliency testing
:alarm_clock: :fire: A TCP proxy to simulate network and system conditions for chaos and resiliency testing

Toxiproxy Toxiproxy is a framework for simulating network conditions. It's made specifically to work in testing, CI and development environments, supp

Jan 7, 2023