The same evening as 0.9.5, the next batch from your reports and from askNK's review: Extract and Mirror And Weld, a flat background, a Flatpak, strokes that keep their shape on dense meshes (built on a patch by @bribblej-web), and a fix for Divide crashing on models from Blender, with a log file so a crash is never silent again.
Added
- Extract (Tool > SubTool > Extract), as in ZBrush: the masked, visible part of a SubTool becomes a shell with Thick (a share of the SubTool's size; negative grows inward, 0 makes a single-sided surface), E Smt (smooths the stepped edge) and Double (both ways). Extract shows a preview below the source that follows the settings; Accept keeps it as a new SubTool with outer, inner and rim polygroups and the source's polypaint, as one undo step (undo removes the SubTool, redo puts it back). TCorne and TBorder make the rim triangles instead of quads at sharp corners or all along it. An unaccepted preview goes when the source changes and is never saved. Commands: extract, extract_accept, extract_cancel.
- Mirror And Weld (Tool > Geometry > Modify Topology, X / Y / Z): keeps the + side of the plane through the origin, cuts polygons crossing it, mirrors the half and welds the seam into one watertight mesh, keeping polygroups, polypaint, mask, UVs, quads and sculpt layers (
mirror_and_weld, withside=negativefor the other half). Undoable. - A flat viewport background (#21): Preferences > Display > Background (also in the Render palette) switches between the gradient (the default) and Flat Colour with a colour picker. Store Config keeps it, projects keep their own, and
set_background(mode, color) scripts it. - Mirror (Tool > Deformation, X / Y / Z): flips the SubTool across the plane through the origin, or in place with
pivot=center(mirror). Undoable. - A log file,
sculptforge.login the user data folder (%APPDATA%\SculptForge\SculptForgeon Windows,~/Library/Application Support/SculptForge/SculptForgeon macOS,~/.local/share/SculptForge/SculptForgeon Linux), so a crash is never silent: it holds the version, system and GPU, everything SDL_Log reports (the Windows build has no console), each command run (written before it runs), and on a crash a note with the cause, the last command and, on Linux and macOS, a stack trace. Each start keeps the previous session's log assculptforge-previous.logand notes when that session didn't close normally; the restore dialog after a crash points to it. Help > Open log folder opens the folder;--log-dirwrites the log elsewhere, and--crash-test segv|abort|throwcrashes on purpose to test the note (ctestcrash_log). - A Flatpak (#18):
SculptForge-<version>-x86_64.flatpakand-aarch64.flatpakon every release (with version-less copies,SculptForge-linux-x86_64.flatpakandSculptForge-linux-arm64.flatpak), built from source on the freedesktop 26.08 runtime bypackaging/flatpak/org.sculptforge.SculptForge.yml(packaging/flatpak/build.shbuilds it locally). Sandbox: Wayland or X11, OpenGL, devices (for the SpaceMouse), network and the home folder. In a Flatpak the Blender bridge uses the host's folder and tells the add-on to start the app through Flatpak's launcher; the add-on also looks for that launcher. A package for the FlatPark repository, wrapping the release tarballs, is ready inpackaging/flatpak/flatpark/.
Fixed
- Strokes on dense meshes keep their shape (#19). When one dab cost more than a frame, the app placed every dab
of a long pointer movement before reading the pointer again, so the next movement was longer still and a fast
curve came out as a straight line. Dabs now wait in a queue that the app works through for 10 ms a frame,
between reading the pointer and drawing; a long gap between pointer samples is drawn as a curve through the
last samples, not a chord; and when the queue holds more than 24 dabs (or more than 0.05 s of work, whichever
is larger) every second waiting dab is dropped, so the brush stays near the pointer. Measured with the new
--measure-stroke 3,200(a fast two-turn circle, 200 px brush) on a 21M-triangle sphere: dabs were up to 69 px off the circle before and are within 4 px now, at 82 ms frames instead of 143 ms. Light meshes place the same dabs as before. Based on a patch by @bribblej-web in [#19].SF_STROKE_IMMEDIATE=1places every dab at once as before;SF_STROKE_BACKLOG=Nsets the queue limit in dabs (0: never drop). - The AppImage's root icon and
.DirIconare 512 px PNG files, not links to the SVG (#17), so AppImage managers such as AppManager and Gear Lever show the icon when they integrate it, and the current appimagetool accepts the AppDir. The AppImage is now built with appimagetool directly (packaging/linux/build-appimage.sh), which checks the AppDir before packing it. - Divide crashed on models with a vertex shared by 22 or more triangles (#16), such as a cylinder sent from Blender with Triangle Fan caps of 22 sides or more (21 worked) or Blender's UV sphere. The first subdivision level works out each vertex's neighbours from the base mesh; around a high-valence base vertex the list was gathered with every polygon twice before removing the repeats, which overran its 64 slots (3 x valence) and corrupted the stack when the viewport shaded the new level. The repeats are now removed before the list is joined, so it never holds more than 2 x valence (implicit adjacency is only used up to valence 32; above that the stored adjacency has no limit). Unit tests divide fan cylinders of 3 to 300 sides and UV spheres up to 200 segments, through OBJ and through the Blender Bridge, and compare every level's adjacency with a plain rebuild; a UI test receives the issue's meshes from the bridge and divides them in the app.
- Generating with a ComfyUI workflow and a seed read freed memory, which could crash at random or set the wrong
seed: while setting a node's seeds, the node was replaced after its first seed but its inputs were still read
for the second (a sampler with both
seedandnoise_seed). Found with AddressSanitizer; the keys are now chosen before any is set. The unit test now has a node with both seeds.
Downloads
New here? install/ explains
which file to pick, or install with one command:
curl -fsSL https://raw.githubusercontent.com/islandmed/SculptForge/main/install/install.sh | sh (macOS / Linux),
irm https://raw.githubusercontent.com/islandmed/SculptForge/main/install/install.ps1 | iex (Windows PowerShell).
Each file is also attached without its version number (e.g. SculptForge-macos.dmg) so links to
releases/latest/download/... always get the newest build.
| Platform | File |
|---|---|
| Windows 10/11 (x64) | SculptForge-…-windows-x86_64.exe (installer) or .zip (portable) |
| macOS 11+ (Apple Silicon and Intel) | SculptForge-…-darwin-universal.dmg |
| Ubuntu / Debian / Mint / Pop!_OS | sculptforge_…_amd64.deb or …_arm64.deb |
| Fedora / RHEL / Rocky / Alma 8+ | sculptforge-…x86_64.rpm or …aarch64.rpm |
| Studio pipelines (VFX Reference Platform) | SculptForge-…-linux-…-vfx2026.tar.gz (GCC 14.2, glibc 2.28) or …-vfx2027.tar.gz (glibc 2.34), with the Python 3.13 module |
| Any Linux | SculptForge-…-x86_64.AppImage or …-aarch64.AppImage (they update themselves with AppImageUpdate) |
| Arch Linux | yay -S sculptforge (AUR) |
The builds are not code-signed yet. macOS: right-click the app → Open the first time.
Windows: if SmartScreen appears, choose More info → Run anyway. Checksums are in SHA256SUMS.txt.