Editor Tool Utilities – Skeleton (Image Vectorisation)
Suite for converting PNG bitmap images to vectorised polylines. Pipeline: bitmap → binary mask → Guo-Hall skeletonisation → keypoint detection → path extraction → join/filter → width estimation → RDP
Suite for converting PNG bitmap images to vectorised polylines. Pipeline: bitmap → binary mask → Guo-Hall skeletonisation → keypoint detection → path extraction → join/filter → width estimation → RDP simplification.
Public API
| Function | Signature | Description |
|---|---|---|
M.skeletonise | (mask) → mask | Applies Guo-Hall thinning algorithm to reduce a binary mask to 1-pixel-wide skeleton (in-place) |
M.extractPaths | (mask) → table | Extracts paths from a skeletonised mask via DFS traversal from endpoints/junctions |
M.estimateWidths | (paths, mask) → table | Estimates widths at each path point by walking along binormals in the original mask |
M.getPathsFromPng | `(filepath) → table | nil` |
Code Examples
local skeleton = require('editor/toolUtilities/skeleton')
-- Full pipeline: PNG to vectorised polylines with widths
local paths = skeleton.getPathsFromPng('/art/masks/road_network.png')
if paths then
for i, path in ipairs(paths) do
local points = path.points -- array of vec3 (x, y pixel coords)
local widths = path.widths -- array of numbers (pixel widths)
log('I', 'skel', string.format('Path %d: %d points', i, #points))
-- Convert pixel coords to world space and create splines
end
end
-- Low-level: skeletonise a mask manually
local mask = {} -- 2D array of 0s and 1s, mask[y][x]
skeleton.skeletonise(mask) -- modifies in-place to 1-pixel skeleton
-- Extract paths from skeleton
local rawPaths = skeleton.extractPaths(mask)
-- Estimate widths from original (non-skeletonised) mask
local widths = skeleton.estimateWidths(rawPaths, originalMask)
-- The pipeline internally:
-- 1. Loads PNG via GBitmap, flips Y
-- 2. Converts to binary mask with dynamic normalisation
-- 3. Dilates mask by radius 3 to thicken thin features
-- 4. Guo-Hall iterative thinning (two-phase deletion)
-- 5. Detects endpoints (1 neighbour) and junctions (3+ transitions)
-- 6. Walks arms between keypoints to extract path segments
-- 7. Filters short paths (< 20 pixels), joins close endpoints (< 40 px)
-- 8. Estimates widths by walking binormals in the original mask
-- 9. Tapers/smooths/clamps widths to reduce artifacts
-- 10. RDP simplification with tolerance 6.0See Also
- Tool Utilities - Fit Polyline - Related reference
- Editor Tool Utilities – Geometry - Related reference
- Editor Tool Utilities – Gizmo - Related reference
- World Editor Guide - Guide
Editor Tool Utilities – Simplex Noise
2D Simplex noise implementation with a static permutation table. Provides smoother, less grid-aligned noise compared to Perlin noise, with O(n²) complexity for n dimensions.
Editor Tool Utilities – Spline Input
Central input handler for spline-editing tools. Manages mouse/keyboard events for adding, inserting, dragging, and deleting spline nodes. Supports rib (width) and bar (velocity/height) handle dragging