L3DT documentation
Large 3D terrain generator

L3DT release v16.03

Released on the 28th of March, 2016 (see announcement)

Note many changes listed here were also included in release v15.11, which was only the (free) Standard Edition.

Major changes

System resource management

  • Modified mosaic caching to use memory less aggressively (target = 70, threshold = 75), to avoid memory allocation problems due to fragmentation.
  • Yield one core in threaded calculation manager when app is inactive.
    • Added checkbox option to thread settings dlg.
  • Suspend calculation threads when low memory (primary thread remains active, but as many threads are released as required to get below memory threshold).
  • Warn user when low memory.
  • Reduced fragmentation by ensuring mosaic memory table does not free a tile just before allocating another.
  • Modified submap to allocate RAM in non-contiguous scanlines (typically for tiles larger than 513×513, but size may vary without notice.)
    • Modified Zeolite accordingly.
    • Updated atConvertWaterToHeight, Sapphire, atCalc_AM_Image, atCalc_MaskOverlay and L3DTio_HFZ to support non-contiguous scanline-based map and tile allocation modes.


  • Fixed support for large heightfields (see bug report.)
    • Implemented dynamic loading / freeing of patches to support larger maps (see blog post.)
    • Moved locks to CsHeightfieldTile class.
  • New HF tool window:
    • Changed radius→width for Bulldozer, Leveller, and LevelAt
    • Added tools / settings tabs, with settings list control.
    • Added radius edit in tool window.
    • Update window brush radius when using scroll wheel (including inline edit)
    • Fix focus/foreground/etc to get correct click behaviour.
    • Range validation, and edit box colouring
  • Support modification of tool strength (see request, and here too.)
  • Added brute force rendering for 3×3 patch of terrain surrounding cursor when in heightifeld editing mode.
  • Added pgup/pgdn key mappings for zoom (see request).
  • Fixed sticky movement keys problem (see bug report.)
  • Changed window instance from static to dynamic (new/delete), to prevent errors when destructor is called after API pulldown.
  • When re-opening window, resume at previous camera position, unless map is different height/width/scale (see request.)
  • Fixed bug in 'LevelAt' tool (see bug report.)
  • Added ability to set walking, flying speeds, and turbo boost (see request).
  • Used CzPointList for storing camera paths and teleport points.
  • Added rendering of camera paths and teleport points.
  • Fixed misalignment of HF tool and mouse cursor.
  • Disabled texture rendering when TX tile size is not divisible by TX res ratio (i.e. tex tile doesn't contain integral number of heightfield pixels.) This change ensures there is no texture streaking.


  • Add support for detail textures.
  • Automatically resize texture DDSs to nearest power of two.
  • Add support for multiple terrain blocks.
    • Repack DDS's to remove texture seams (note texture wrapping bug in T3D is still present, apparently).
    • Document (here).
  • Add support for tiled TER files.
  • Fix 'CzVar::Delete' error in exporter.
  • Spawn on land if centre of map is under water.
    • Change materials.cs exporter to always modify existing materials.cs file, and only ask to update changed materials.
  • Change T3D material manager to include 'reset' and 'reset all' buttons, which when pressed restore settings directly from L3DT materials, not via alpha map list (this is so that we can change the detail map in an L3DT material and have it reflected in T3D materials without having to re-gen alphas.)
  • Added explicit splat settings to materials (and material editor), to more easily support export to T3D or other engines.

Edge blending

  • Created atEdgeBlender plugin.
  • Add zeofunc for custom blending.
  • Implemented WrapX, WrapY, and WrapXY menu options.
  • Implemented tile blending menu option.
  • Added linear regression mode to correct mismatches in tile vertical scaling (includes edge blending too).
  • Created box wrapping script (see request, see script).
  • Implemented asymptotic weighting of blend function.
  • Wrote tutorial.
  • Added support for single-axis tiling.

Selected area heightfield previews

  • Added 'selected area' support to DesignInflate16/32/64/128 menu options, if area is selected in DM (see request, and see documentation.).
  • Added nice 'generate area' menu option for HF.

Mask-based AM modification

  • Created plugin to apply a land type to the attributes map, masked by a mask map in the project or by an external PNG image file. Thresholding is settable (1→100%). Support area selection for partial overlay. See user guide and plugin page for 'atCalc_AM_MaskOverlay'.
  • Added ability to auto-calculate land type with defined climate.


  • Added 'Merge heightmaps' blending modes and mask controls (see thread, see docs.)
  • Removed requirement for AM and WM from mask generator (see request).
  • Added 'Operations→Heightfield→DesignInflate→DesignInflate64 step by step' option.
  • Added 'Heightfield.ConvertToU16' filter and 'calc.HF.ConvToU16' functions.
  • Added 'General.Branch' filter to ZeoGraph

Other changes

User interface

  • Modified progress display to not be topmost.
  • Modified atImportMap to support design map.
  • Modified atImportMap to peek at mosaic type to get name, type, &c.
  • Modified 'export selected area' option to use export wizard and 'nice' coordinate selection dialog box.
  • Export wizard was changed from threaded to inline.
  • Modified 'Import custom map layer' option to peek map name & type when loading mosaic maps.
  • Modified 'Operations→Heightfield→Resize heightfield' menu option to (optionally) re-calculate the horizontal scale to maintain the same physical map area (see forum post).
  • Modified atScriptEditor to allow non-modal script editing, which is now used for new/edit script menu options in L3DT. Also prevents z-fighting with function browser.
  • Modified HF size wizard to not use UpdateData function.
  • Added 'Image drape' to toolbar.
  • Added map long names to image drape window.
  • Moved 'Extensions→atCalc_AM_Image' menu option to 'Operations→Attributes map→Convert to RGB image'.
  • Move 'Extensions→atLightMapSequence' menu option to 'Operations→Light map→Generate sequence'.
  • Modified 'Select area' window to display sizes (in addition to coordinates), and allowed users to type plus sign before x2/y2 coordinates to enter the size (e.g. if x1 = 100, and x2 = ”+200”, then x2 is automatically recalculated as 300, and the size is then displayed as 301, since sizes are inclusive of start and end coordinates).


  • Implemented optimised tile edges (see blog post, request.)
  • Optimised vertex normals across tile edges.
  • Added 'Resize images to nearest power-of-two' option.

File I/O

  • Add greyscale range export options to bitmap export (see request, also here.)
  • Added material name to alpha map XML export (see request.)
  • Added G16 file format support for 8-bit images for Unreal alpha map support.
  • Added 'File→Export→Export to OpenSim' menu option, for saving r32 files with arbitrary sea levels.

Zeolite &c

  • Updated to Zeolite API v16.01
  • Re-engineered GetDirectInterface to use non-contiguous memory in CzMap
  • Re-engineered GetDirectInterface to use non-contiguous memory in CzMapTile
  • Added void* map_GetScanlinePtr(long j) and void* * map_GetScanlineArray() to core API, for use with non-contiguous submaps.
  • Added void* tile_GetScanlinePtr(long j) and void* * tile_GetScanlineArray() to core API, for use with non-contiguous tiles.
  • Added bool map_IsContiguous and bool map_MakeContiguous to core API.
  • Added bool tile_IsContiguous and bool tile_MakeContiguous to core API.
  • Modified map_GetDataPtr and tile_GetDataPtr to warn caller if map is non-contiguous, and automatically convert by calling MakeContiguous.
  • Added zmap_InitMap2 to core API.
  • Added bool CzMap::AsContiguous and bool CzMapTile::AsContiguous to get maps/tiles as contiguous maps, without converting original map/tile (as with MakeContiguous).
  • Added 'zeoUnloadAPI' to plugin API, called after shutdown to unload all function handles.
  • Added 'CzMaterial' wrapper class & functions.
  • Added map.Init2, map.GetAllocMode, map.GetTileSize, map.GetTileCountX, map.GetTileCountY, map.GetFormat, format.GetExt (via ZeoWrap).

Bug fixes

  • Fixed mosaic map memory allocation error for 2M x 2M pixel maps (see bug report).
  • Fixed coordinate mapping and optimised CMapWrap::ZeroMap.
  • Modified L3DTio_FI to load 32-bit heightfield PNGs as RGBA (see bug report.)
  • Fixed tile cache problem when generating 19-layer alpha maps on 41k x 41k pixel map (see bug report.)
  • Fixed deadlock problem when running multi-core calculations (e.g., large light map, seems to occur when compactor is in state 0.)
  • Fixed bug in L3DT, Sapphire and atAttribBrush, which crashed when sub-unity fractional TX_in_HF values were used (see bug report). Fixed in L3DT 12.12 build 0 (with new Sapphire & atAttribBrush. Uses new params for calc.TX.GenTile function).
  • Fixed bug in texture generator that produced undefined output colour when a land type had no assigned material (see bug report.)
  • Fixed 16 bit PNG tile export (see this thread.)
  • Made attributes map brush (and attributes map calc) mark alpha map settings as dirty after edits so that alpha map list can be re-calculated (see this thread.)
    • Added 'Operations→Alpha maps→Clear alpha maps' menu option to delete maps and settings.
  • Fix enable state of 'Operations→Design map→Generate from HF' (see this thread.)
  • Fix file extension doubling-up in climate editor (See bug report, and here.)
  • Fixed loss of water body list (see this thread.)
  • Fixed water body loading error (see this post.)
  • Fixed automatic refreshing of main window after Sapphire closes (see bug report).
  • Fixed crash in function browser when re-opening window.
  • Fixed cropping bug in DM→HF subsampling in SE (see bug report.)
  • Fixed atMergeMap plugin to support virtual mosaic maps (see bug report.)
  • Fixed offset in inflation algorithm that caused features in the HF to be shifted 1/2 a DM pixel to the southwest.
  • Fixed flickering redraw in main window when viewing single map (odd conditions required to trigger this one.)
  • Fixed CurvFilter and GradFilter to work with irregular sized maps (bug was introduced in v11.11)
  • Fixed lake flooding for small maps, which was looking for subsampled HF mipmaps that did not exist (now generates subsampled map if required mipmap not found).
  • Fixed 'mask.LoadMask' filter, which had syntax error in script.
  • Fixed app (and about box) to get copyright date from compiler build date.
  • Fixed app to get version number from EXE file info.
  • Fixed saving of water body list. Was saving with null file name. Is redundant anyhow, as WBL is saved in project, but kept for backwards compatibility.
  • Modified XML writer to replace non-print characters (<0x20) with '?'. Non-print chars were sometimes in Author field of climate XML files, which then became unreadable.
  • Fixed plugin error messages with zvar_Delete (was due to SetVarRef clearing parent handle of CVar)
  • Fixed fault with coordinate range validation in edit record of L3DTio_Backup.
  • Fixed various bugs in ZeoGraph
  • Fixed crashing bug in Save project.
  • Fixed crashing bug in Sapphire when viewing controls PDF.
  • Fixed parentage of progress box display, so pop-to-top behaviour is now normal.
  • Fixed 'IsAbsolutePath' function to recognise network drive paths beginning with '\\'.


l3dt/history/v16.03.txt · Last modified: 2017/08/31 07:04 (external edit)
Except where otherwise noted, content on this wiki is licensed under the following license:CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki