Repository navigation
Releases: islandmed/SculptForge
Release list
SculptForge 0.9.2
View in AR on Android works again, through the website instead of Google's viewer being handed a home-network
address.
Fixed
- Android View in AR: it handed Google's Scene Viewer the model's address on your computer, which Scene Viewer
can't load (it only takes public HTTPS addresses), so the phone just downloaded the file. It now opens an AR page
on sculptforge.app in Chrome. The model goes there encrypted through SculptForge's relay (link.sculptforge.app;
the key is only in the link, the copy is deleted after 10 minutes), so it also works on phones whose Chrome can't
reach the home network at all; without internet it comes straight over the Wi-Fi link instead. Show it with
Chrome's AR, or with Google's AR viewer, which needs a readable copy on the relay (only when you choose it, also
deleted after 10 minutes). It updates by itself as you sculpt. From Firefox, the page offers Open in Chrome
(Firefox has no AR). - Phone link (face capture, AR): one network port for everything (the page's port, now for UDP too), so a firewall
needs one rule: allow the port for TCP and UDP from your home network (the window and the guide say how).
SCULPTFORGE_RTC_LOG=1(or2for every packet) logs the connection for troubleshooting.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.9.1
Help for phone capture when the phone can't open the page, and bigger text in the guide and the update banner.
Changed
- Easier reading: the User Guide (and its What's New chapter) and the update banner use 17 px text instead of
the 15 px interface font, with larger headings.
Fixed
- Capture from phone tells you what to do when the phone can't open the page: Android Chrome can refuse every
home-network address ("This site can't be reached", ERR_TOO_MANY_RETRIES), so use Firefox on the phone; and Linux
firewalls (ufw, firewalld) need the port allowed. In the window and in the guide's Phone capture chapter. - Baking: Cancel is honoured on small bakes too.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.9.0
Maquette to performance: scan with your phone, make the scan sculptable, give a head its facial shapes and
drive them with your own face.
Make sculptable (splat capture -> sculptable, animation-ready mesh)
- Splats palette > From scan > Make sculptable: one click turns the capture into a new SubTool next to the
splats (which are hidden, not deleted): a watertight, manifold surface (opacity-weighted Gaussian density on a
voxel grid, built in parallel z slabs with the same result on any thread count; gaps closed; floater shells
dropped; space boxed in on 5 of 6 sides filled, which seals open bottoms; largest piece kept), QRemesh quads at
a Game (4,000), Film (12,000) or Sculpt (2,000 + 2 subdivision levels with the scan projected onto
the top) budget, and the capture's colours as polypaint or an Auto UV texture (splats inside the subject are
faded out). A hidden " Scan" SubTool keeps the dense surface for ProjectAll. - Face loops: a face is looked for on the scan from the current view (depth and colour, no ML model, no
download): eye corners, nose tip, mouth corners and chin become QRemesh Guides (rings round the eyes and the
orbits, the lips, the nasolabial loop), mirrored, with QRemesh symmetry. Review stops after the scan to
drag the landmarks (the mirror follows) or Place by hand, then Finish. - Crop Box with draggable face handles in the viewport; options for Detail, Min Opacity, Close Gaps, Fill
holes, All pieces, Keep scan. Progress bar and Cancel; Ctrl-hover help; F3 entries. - Commands:
splat_to_meshnow runs the whole pipeline (detail,preset,target,levels,face_guides,
landmarks,front,up,color,texture_size,crop,fill_holes,keep_parts,keep_scan,stage
scan/finish, ...;resolutionstill works) and adds SubTools instead of replacing the sculpt;face_guides;
splat_test_capture(a built-in test head or mug capture, no download). - 5 million splats to Film quads with face loops in about 9 s, 0.9 GB (M1 Pro).
- Guide chapter "From scan to sculptable mesh"; UI test
make_sculptable.sfui; UI tests:drag_landmarkverb,
hoverscrolls a panel to the item asclickdoes.
Added
- Facial shapes (Tool > Facial Shapes,
face_shapes_generate): the 52 Apple ARKit blend shapes, exactly named, as
sculpt layers on the active SubTool, from a built-in template head (ICT-FaceKit's ICT Face Model Light, MIT):
automatic or landmark-guided fit (similarity + non-rigid ICP), deformation transfer (Sumner and Popovic 2004) so
the shapes follow the sculpt's proportions, mirrored Left/Right on symmetric sculpts, made on a low subdivision
level and carried up with the detail. Eye SubTools get eyeLook rotations, teeth and tongue the lower jaw's motion,
brows and lashes follow the skin. Face test presets and a slider per shape;face_landmarks_detect,
face_preset. - Live face:
face_weights json={...}sets ARKit-named shape weights on every SubTool, re-evaluating only the
vertices they move (no undo step, partial GPU upload; about 9 ms for all 52 on a 700k-vertex head on an M1 Pro). - Face takes: play recorded face feeds (JSON frames,
face_take_play), bake them (face_take_bake) into a glTF
animation of the morph target weights (GLB) and USD blend shape weight time samples; saved with the project. new_head: a new scene with a life-size human head (with mouth and eye sockets) and its eyes.- Blender bridge: sculpt layers arrive as shape keys with their names and weights (a
.shapesfile beside each
.GoZ, which now holds the base shape when the mesh has layers). - UI tests:
zoomandlooksteps;runexpands$SCRIPT_DIR. - Splat training from captures (Splats > Train from capture): a phone video, a folder of photos, a phone-link
capture or a COLMAP / nerfstudio dataset becomes a Gaussian splat that appears in the viewport after the first
checkpoint and sharpens while it trains (worker thread; orbit freely). Progress over the canvas: step, PSNR,
elapsed and remaining time, Good enough - stop, Cancel. Presets Fast preview and Quality. Uses Brush 0.3.0
(Apache-2.0, WebGPU: NVIDIA, AMD, Intel, Apple), downloaded on request from its GitHub release with a pinned
SHA-256, or a path /SCULPTFORGE_BRUSH; COLMAP (BSD; downloaded on request on Windows) for camera positions,
skipped for captures with AR poses incapture.json; ffmpeg for video, keeping the sharpest frame of each
stretch. The result is centred and levelled from the camera positions, saved next to the capture and copied to
the LightBox Splats tab. Dropping a video onto the window trains it. Commandssplat_trainand
splat_train_cancel(blocking in sculptforge-cli, Python and MCP). Guide chapter "Scan an object into a splat";
a generated CC0 test capture (tools/splat/make_test_capture.py, tests/data/splat_capture). - Capture from phone (File > Capture from phone, or the phone button in the LightBox; guide chapter "Phone capture
and AR", design in docs/phone-link.md): scan the QR code and the phone's browser becomes SculptForge's camera,
with no app and no account. Send a scan video or a photo burst (with coaching; for splat training), one photo
(to Image to 3D), or a splat .ply from Scaniverse, Polycam or Luma; uploads are chunked and resume after Wi-Fi
drops, and land in<library>/Captures/<date_time>-<kind>/with acapture.json. View in AR shows the
active SubTool or the scene on your desk (USDZ for iPhone AR Quick Look, GLB for Android Scene Viewer; reduced to
80k triangles, polypaint and textures baked, re-exported after strokes). Face capture tracks 52 ARKit
expressions and the head on the phone (MediaPipe Face Landmarker) and streams them to SculptForge at about 30 fps
over a WebRTC data channel, forface_weights; Record face take saves them as JSON Lines. LAN only, a new
token per session, size limits, safe file names; nothing listens while the window is closed. - Build: WebRTC through libdatachannel (MPL-2.0) and Mbed TLS (Apache-2.0), fetched and linked statically;
-DSCULPTFORGE_WEBRTC=OFFbuilds without the live face feed. - Website: the face capture page (
website/link/), which needs HTTPS for the phone's camera. - Services:
services/link-worker, a Cloudflare Worker (free plan) that relays the face page's one encrypted
connection message to the desktop atlink.sculptforge.app; ntfy.sh stays as the fallback. Not deployed yet. - "Fixes & suggestions" in the LightBox header (shown at startup) and the Help menu: opens the bug report and
feature request forms on GitHub.
Changed
- The website moved to https://sculptforge.app (old islandmed.github.io/SculptForge links redirect). The
app, update check, user guide, packages and Blender add-on link there. - Website: the tagline now reads "the free, open-source alternative to ZBrush and Mudbox".
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.8.1
Fixes from a ZBrush artist's testing, and ZTools from ZBrush.
ZBrush feel (tester feedback on 0.7)
- ZBrush input style: every zoom drag (Ctrl+right-drag, Alt-drag then release Alt,
Ctrl+middle-drag) zooms out when dragged up, as in ZBrush; the SculptForge style keeps zooming in.
Rotation and panning were checked and already follow the cursor as in ZBrush. - Ctrl brushes, as in ZBrush: while Ctrl is held the left shelf shows the mask brush (MaskPen,
MaskLasso, MaskRect) and its stroke (Dots, Lasso, Rect); the Brush picker (Ctrl+B or a
Ctrl+click on the brush tile) and the Stroke picker opened with Ctrl held pick among them.
Ctrl+Shift does the same for SelectRect and SelectLasso. Tool > Masking and Tool >
Visibility keep their buttons. - Polygroups > Group by UVs (ZBrush UV Groups): one polygroup per UV island of the visible mesh, undoable;
polygroup_uvcommand for the console, CLI, MCP and Python.
Texture painting (ZBrush tester feedback)
- New Texture on the top shelf and in the Color palette whenever the Paint brush (or Rgb) is on and the
SubTool has no texture: one click starts texture painting, running Auto UV first (with its progress in the
status bar) when there are no UVs. Ctrl-hover help; also in F3 search. - Faster texture strokes: a dab paints its texels in parallel over 16-row bands with the same result on any
number of threads, and the view uploads only the 64x64 tiles that changed. A big-brush dab on a 4K texture
went from 29 to 6 ms (1.3K triangles) and from 47 to 11 ms (328K triangles) on an M1 Pro
(docs/performance.md). - Checked that texture paint doesn't depend on the mesh density: a hard stamp gives the same texels on a
2-triangle plane as on an 8K-triangle one (new unit test). Paint that looks as coarse as the mesh is polypaint:
the Vertex target, or polypaint shown multiplied over the texture.
ZTools from ZBrush
- SculptForge ZTool Export, a ZBrush plug-in (
integrations/zbrush, ZScript, GPL-3.0-or-later, attached to
releases): ZPlugin > SculptForge > Convert ZTL / Save for SculptForge writes every SubTool of a ZTool at
its highest subdivision level as<name>.sf<NNN>_<SubTool>.GoZnext to the.ZTL. - Opening a
.ZTL(File > Open, drag and drop,open) opens that conversion as SubTools in order, with names,
polygroups, polypaint, mask and UVs, and warns when the.ZTLis newer than the conversion; without one the
message points to the plug-in. A folder of numbered.GoZfiles (<name>.sculptforge) opens the same way.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.8.0
Dynamic topology (Sculptris Pro), vector displacement brushes, QRemesh Guides, sculpt layers on every
subdivision level, and ZBrush-style keys in Blender's Sculpt Mode.
Dynamic topology (ZBrush's Sculptris Pro)
Guide chapter docs/guide/dynamic-topology.md.
- Dynamic on the top shelf (and in the Draw palette): every brush except Move, masking and painting remeshes
the surface under it each dab: splits long edges (on the curve the normals describe), collapses short ones,
flips for even valences and relaxes the new vertices, only inside the brush. - Detail slider (0-100): the target edge length relative to the brush radius (Sculptris Pro), or with the
Constant detail preference one size for the whole mesh. Smooth remeshes towards twice the size, so it
simplifies. - Keeps the mesh manifold with no degenerate or flipped triangles; boundaries, polygroup borders and the
symmetry plane only slide along themselves; fully masked and hidden parts are left alone. X/Y/Z symmetry
remeshes mirror images together, so the topology is mirrored too. - Carries mask, polypaint, paint layers, polygroups and sculpt layer offsets; quads under the brush become
triangles; UVs are dropped (Undo restores them). Meshes with subdivision levels are refused, as in ZBrush. - Undo keeps only the vertex and triangle slots the stroke touched. The BVH (incremental inserts, removals,
leaf splits), the adjacency (editable per vertex during a stroke) and the GPU (per-cluster patches instead
of a full upload) follow each dab. dyntopocommand (enabled, detail, constant) for the console, CLI, MCP and Python; Dynamic and Detail are
saved with project settings; stored UI layouts get the new top-shelf items on load.- Benchmark:
--bench-dyntopo(docs/performance.md). On an M1 Pro, a medium dab on a 1M-triangle sphere takes
9-13 ms including the GPU update.
Vector displacement brushes
Guide: docs/guide/sculpting.md, "Vector displacement brushes".
- VDM brush (new brush type): one DragRect stamps a whole 3D shape with overhangs. Each point under the
stamp moves by its texel's vector in the brush's tangent frame (Z = the surface's area normal, Y = the drag
direction, X = right), scaled by the radius and Z Intensity (50 = the map's own size, 100 = twice). Alt digs
in (X, Y kept, Z flipped, as Blender). Symmetry mirrors the stamp exactly (the mirrored pass flips the frame's
handedness); mask, Front faces only, sculpt layers and undo as every brush. Works with subdivision levels. - DragDot stroke: one stamp of the Draw Size that slides under the cursor until release (any brush).
- Built-in maps (procedural, CC0): Horn, Ear Curl, Scales, Nostril.
- Brush > Vector Displacement: the maps with thumbnails, Load VDM (OpenEXR 16/32-bit, any compression, or
.sfvdm; dropping an .exr loads it too) with Swap Y/Z, Flip X/Y/Z and Scale for maps from other apps, New VDM
Plane, Create VDM, Export EXR. While the VDM brush is the brush, the Alpha tile and picker show the maps, and
the stroke switches to DragRect (the previous stroke comes back with the next brush). - Create VDM from a plane (ZBrush's VDM plane, Blender's VDM Brush Baker): a 2 x 2 VDM plane with UVs and
a masked border as a new SubTool (the others hidden, top view); Create VDM rasterizes each point's offset
through the UVs into a map saved in the brush library (Divide keeps the UVs). - Blender's convention, checked against the VDM Brush Baker's source and in Blender 4.2 and 5.2: RGB = XYZ in
brush radii over the brush's square, first scanline = top. Exported EXRs read in Blender with the same vectors
the same way up; Blender's 32-bit ZIP/PIZ and 16-bit EXRs load unchanged. - Library: VDMs live as
.sfvdm(header, name, float32 XYZ) next to the.sfbrushfiles, user over studio
over built-in by name; project settings remember the brush's map by name. - Commands:
vdm_set,vdm_list,vdm_export,vdm_new_plane,vdm_capture,vdm_stamp,vdm_delete; the
strokecommand and Python/MCP stamp the brush's map too. OpenEXR via vendored tinyexr 1.0.13 (BSD-3), built on
stb's zlib (no new dependency).
Blender add-on: ZBrush-style keys in Sculpt Mode
Guide: docs/guide/blender.md, "ZBrush-style keys in Sculpt Mode".
- Add-on preference ZBrush-style keys in Sculpt Mode (off by default): S / U / O radial Draw Size,
Strength and Hardness (Focal Shift); Space the Sculpt context menu; B a brush list by ZBrush name (type to
filter; Blender 4.3+ brush assets, 4.2 brush tools); Alt+drag Zsub; Ctrl(+Alt)+drag mask / unmask lasso;
Ctrl+Shift(+Alt)+drag show only / hide inside; Ctrl+W group masked and clear the mask (else group visible);
Ctrl+D Divide (Multires), D / Shift+D SDiv up / down; X symmetry; Shift+F wireframe; F frame; P perspective;
L Stabilize Stroke; W / E / R move / scale / rotate. Turning it off (or disabling the add-on) removes them.
The preferences and the guide list the ZBrush keys Blender has no equivalent for. - tests/blender/test_in_blender.py checks every key's operator and settings, the data paths (Blender 4.2's
unified paint settings vs 5's per-mode ones), the brush picks, SDiv and Divide, on/off, and the VDM EXR
round trips; run in real Blender 4.2.23 and 5.2.3.
QRemesh Guides (ZBrush's ZRemesher Guides)
- QRemesh Guides brush (Tool > Geometry > QRemesh > Guides, the brush picker, F3): drag on the model to draw
curves for QRemesh's edge loops to follow, around the eyes, the mouth, a joint. Curves are snapped to the
surface, closed into a loop when they end where they started, mirrored with symmetry (a curve that is its own
mirror image is kept once), shown over the model (faint where the model hides them), Alt+click deletes one;
Delete Last and Clear. Ctrl still masks and Shift still smooths while the brush is picked. - QRemesh puts an edge loop on every curve (a lattice line along it; along a closed curve the corners are placed
at an even number of even steps, so the loop closes without a kink) and turns the edge flow around it to
follow; Curves Strength (0-100, default 50) sets how far. With symmetry, a curve on either side guides
both, and a loop across the middle (the mouth) meets its mirror image at a corner on the seam. A result with a
broken loop or a fan by a guide is tried again with another start for the field. On a sphere with a circular
guide round an "eye", the edges near it are within 2-8 degrees of its direction (about 22 without), and the
loop closes (6 of 6 test eyes, 4 of 4 mouths across the middle, 507 of 512 in random sweeps with and without
FMA; the misses are loops about 20 quads round). - Guides belong to each SubTool, are saved in projects (
qremesh_guidesper SubTool in the manifest, no format
change: older projects open, older versions ignore them) and copied to the kept original. Guides left far from
the surface (the SubTool moved) are ignored with a note. - Scripting:
qremesh_guide(points, view, symmetry),qremesh_guide_delete_last,qremesh_guides_clear,
qremesh_guides_info;qremeshgainsguidesandcurves_strength. - Keep Groups (loops along polygroup borders) and Use Polypaint (density) were already there.
Sculpt layers on subdivision levels
- Checked against ZBrush's 3D Layers and covered by tests: a layer recorded at the top survives Lower / Higher Res
bit for bit, shows at lower levels as the same strokes in the base would, keeps one weight for every level, and
survives Divide, Reconstruct Subdiv, Del Lower / Del Higher, undo, saving and loading at any level, and blend
shape export from any level (subdiv_export). Layers added or sculpted at a low level show above. Nothing needed
fixing; the Layers panel got Ctrl-hover help and the guide a "Layers and subdivision levels" section.
Other
- UI tests:
camera YAW PITCHstep; the guide's screenshot script turns the mesh back on after the splats shot
(the subdivision-level shots after it showed only splats). sculptforge_tests NAME...runs only the tests whose names contain one of the arguments.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.7.0
ZBrush's keys and gestures by default, and a bridge to Blender.
ZBrush feel: ZBrush's keys and gestures by default
Audit in docs/zbrush-parity.md (sources: Maxon's ZBrush shortcut sheet and documentation); guide chapter
docs/guide/coming-from-zbrush.md.
- U / I / O: Z Intensity, RGB Intensity and Focal Shift sliders at the cursor, as in ZBrush (S stays Draw
Size). Values show 0-100 (Focal Shift -100..100); the top shelf and Draw palette say Z Intensity instead of
Strength. - RGB Intensity: painting has its own strength (default 100), separate from Z Intensity.
- Focal Shift: the brush falloff, for every built-in brush, Move, SnakeHook, masking and painting (Brush Lab
recipes keep their own tip). At 0 the maths is unchanged. The cursor's inner ring now shows Focal Shift
(where the brush works at half strength) instead of the strength. - Smooth keeps its own Z Intensity (default 50): Shift-smoothing no longer follows the active brush's
strength. Holding Shift (or picking Smooth) shows and sets it. - Space: the QuickMenu under the cursor (brush, stroke, alpha, material, Draw Size, Focal Shift, the
intensities, Zadd/Zsub, Sculpt/Paint, Rgb, X). Hold and let go to close, or tap to keep it open. - Brush letters: B C B ClayBuildup, B D S DamStandard, B M V Move, B I N Inflate, B P I Pinch, B S H
SnakeHook (ZBrush's), instead of the first free letter. - Mask keys: Ctrl+A Mask All, Ctrl+Shift+A Clear Mask, Ctrl+I Invert, Ctrl+H View Mask; Ctrl+W Group
Masked (and clear the mask; with nothing masked, Group Visible). - Ctrl+click on the model blurs the mask, Ctrl+Alt+click sharpens it (a Ctrl+drag still paints).
- Shift pressed after a stroke starts draws a straight line, snapped to 45 degree steps.
- Shift+click the background, let go of Shift, drag rolls the view about its axis.
- Shift+Alt+click a SubTool selects and frames it.
- Ctrl+Shift+click a polygroup on a partly hidden mesh hides it (it used to isolate it); a Ctrl+Shift
rectangle around nothing reverses the visibility. - L toggles LazyMouse, V swaps the main and secondary colour, Ctrl+Shift+Alt+I is Save UI.
- Preferences > Input: Style ZBrush (default) or SculptForge, which keeps 0.6's keys: 1-9 and 0 pick
brushes (ZBrush style: free, 9 = QuickSave), I = Z Intensity, Ctrl+drag on the background zooms when nothing
is masked (ZBrush style: nothing). Rotation (free / turntable) is also here. - Projects store Smooth's Z Intensity, RGB Intensity and Focal Shift.
Blender bridge
- SculptForge Bridge, an add-on for Blender 4.2+ (
addons/blender, GPL-3.0-or-later): select objects, click
Send to SculptForge (the 3D View's SculptForge tab, the Object menu or File > Export), sculpt, then
File > Blender > Send to Blender in SculptForge. The objects update in place in Blender, keeping their
transform, materials and modifiers; new SubTools become new objects. Works on Linux, Windows and macOS.- The two sides share a per-user folder (
<user data>/SculptForge/SculptForge/blender) and exchange.GoZfiles
plus a JSON manifest per direction (object names,matrix_world, a revision); each side checks the other's
manifest once a second. No network. SculptForge records where it is installed and writes a heartbeat there, so
the add-on starts it (--blender) only when it isn't running. - Identity: Blender object name <-> SubTool (its GoZ name). Positions travel in object space with the matrix;
Z-up <-> Y-up, metres both; mirrored objects keep their faces pointing out. A round trip is the identity
(positions, faces and winding, UVs, polypaint, mask, polygroups): tested in C++, from the add-on's side
againstsculptforge-cli, and in a real Blender in CI. - Unchanged topology updates only positions and attributes, so Blender keeps n-gons, edges, seams and other
data; changed topology rebuilds the mesh. Active UV map <-> UVs, active colour attribute <-> polypaint, sculpt
mask <-> mask, face sets <-> polygroups. Modifiers can be kept live or applied (then turned off on return).
- The two sides share a per-user folder (
- Commands
blender_sendandblender_receive(CLI, MCP, Python), File > Blender (Send, Receive, Receive
automatically), F3 entries and Ctrl-hover help. GoZ receive and the bridge share the code that matches objects
to SubTools. - Packaging:
build_addon.pywrites the extension zip and a legacy add-on zip (cmake --build build --target blender_addon); releases attachsculptforge_bridge.zip. Guide chapter Working with Blender. - UI tests:
copy SRC DSTstages files another program would write.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.6.0
Performance release. Figures for a 33 million triangle model with 7 subdivision levels on an M1 Pro laptop,
measured on the merged release against 0.5 with the same benchmark (docs/performance.md): memory for the mesh,
BVH and levels 156 -> 83 bytes per triangle (whole process 5.6 -> 3.4 GB); GPU memory 46 -> 15 bytes per
triangle; orbit 20.6 -> 9.2 ms with 4x antialiasing, 14.8 -> 3.7 ms with Fast Navigation; a medium dab 11.9 ->
7.5 ms and a large one 78.5 -> 45 ms with the GPU upload; Mask / Paint dabs 5.6 / 7.0 -> 2.5 / 3.5 ms; opening
the project 4.7 -> 2.1 s. The sections below were measured on each part's own branch; the merged figures differ
a little (dabs on divided meshes are about 15% slower than on the brush branch alone, from the implicit
adjacency that saves the memory).
Update check
- Once a day the app reads https://islandmed.github.io/SculptForge/latest.json (nothing about the user is sent)
and, when a newer version is out, shows a banner: What's new, Download, Later, Skip this version.
Help > Check for updates asks right away; Preferences > Updates turns it off.SF_NO_UPDATE_CHECK=1
turns it off for a run,-DSCULPTFORGE_UPDATE_CHECK=OFFat build time (the AUR package uses it).
Memory: sculpts with subdivision levels take half as much
- A divided sculpt takes about 90 bytes per triangle in memory instead of 160: a 33 million triangle model with
its levels needs 3.0 GB instead of 5.3 GB, and a 100 million triangle one fits in 9 GB.- Levels made by Divide store no triangles, quad pairs or vertex maps: they follow from the level below, and are
generated when a level is entered. A level also no longer keeps its detail next to its positions (the detail
is fitted to the positions when a lower level changes). The level stack went from 75 to 29 bytes per triangle. - The mesh of such a level works out which vertices and triangles surround each vertex from the level's
topology instead of storing those lists (62 -> 39 bytes per triangle for the sculpting mesh). Brushes, normals,
undo and the renderer get exactly the same lists, so sculpting gives bit-identical results; working them out
costs some speed: dabs on divided meshes are up to about 15% slower (large brushes at 33M: 3%).
- Levels made by Divide store no triangles, quad pairs or vertex maps: they follow from the level below, and are
- Divide goes to 100 million triangles and beyond: the limit follows the computer's memory (about 160 million
on 32 GB) instead of a fixed 50 million. - Opening a project no longer needs twice the scene's memory (the file is read straight into the meshes) and
is about twice as fast (33M: 4.7 -> 2.1 s; the BVH is built while the levels load). Saving no longer copies the
meshes first, and project files of divided sculpts are about 30% smaller. - Lower Res after sculpting at the top level is faster (33M: 1.5 -> 0.9 s), and so is Divide (2.4 -> 1.4 s).
- Project format 6. Projects from 0.5 and earlier open as before (and get the savings); 0.5 can't open format 6
projects.
Fixed
- New Cube at some resolutions (13, 26 and others) left a few vertices along the cube's edges unwelded, so the
mesh had small cracks there (the 33 million triangle benchmark sphere among them).
Performance
- Brushes on huge meshes are 2 to 3 times faster on the CPU: a radius 0.4 dab (a million vertices with X
symmetry) on a 33M triangle sphere takes about 21 ms instead of 49 (39 instead of 63 with the GPU upload),
Smooth and Move at that size 10 and 5 ms; a medium dab about 3.6 ms instead of 9 (6.5 instead of 11 with the
upload), and undo of a big stroke about twice as fast. Results are still exactly the same
with multithreading on or off; compared with 0.5 they differ only by rounding (a brush's area normal is summed
over its vertices in index order) and where the two halves of a symmetric dab overlap (both now see the
normals from before the dab). - How: the BVH vertex query, the normal update and the refit keep their vertex and leaf sets as bitmaps listed
in index order (the mesh's arrays are then read front to back), each thread marks a bitmap of its own, a dab
refits the BVH leaves its query already found, normal updates prefetch the faces ahead, the undo record of a
stroke is written in parallel, the Move brush runs each mirror in parallel, symmetric dabs update normals once
where the mirrors overlap, and undo swaps positions in parallel. Small dabs stay on one thread. - Less memory while sculpting: the per-vertex stamps of the BVH, the normal update and the stroke recorder
(20 bytes per vertex, about 330 MB at 33M triangles) are bits now. --bench-brushes TEXTruns only some benchmark rows; the benchmark measures Smooth and Move at a large radius.
Faster viewport
- Meshes are drawn in clusters of up to 4096 triangles (64-triangle runs sorted along a Morton curve). Each
frame skips the clusters outside the view and, on closed meshes seen from outside, the clusters facing away
(the GPU also skips the back faces left in the others); the rest go in one multi-draw with 16-bit indices.
Orbiting a 33M triangle sphere with 4x antialiasing: 20.6 -> 8.7 ms; 104M: 19.6 ms. - Vertices take 12 bytes on the GPU (28 before): positions on a 21-bit grid over the mesh, octahedral normals,
square-root companded curvature. Polypaint is 8-bit (gamma encoded), the mask 8-bit, polygroups 16-bit. With
the index and wireframe savings a mesh needs about 15 bytes per triangle on the GPU (46 before on meshes with
quads, whose wireframe edges were always kept). - Fast Navigation also draws big meshes as a motion proxy while the view moves: per cluster, the vertices
snapped to a grid a few edges wide (seam vertices kept, so the proxy of a closed mesh is closed too), about a
fifth of the triangles. 104M triangles orbit at about 100 fps. Built only for clusters that changed, when the
view starts moving. - The wireframe's edges are built when the wireframe is turned on, each edge once (they were always kept,
every edge twice). - First upload of a 33M mesh 701 -> 422 ms (indices and vertices written straight into mapped buffers while
the layout is built); paint and mask dabs no longer re-send positions and normals. sculptforge --benchreports GPU memory, triangles drawn after culling, the motion proxy, and orbiting with and
without antialiasing;--bench-viewruns only the viewport's part.
Changed
- STL export is now in millimetres with Z up, as slicers expect: models used to arrive 1000 times too small
(0.44 mm instead of 44 cm) and lying on their back.export_stltakesheight_mm=to scale to a print height,
plusscale=andz_up=, and the status line gives the printed size. Opening an STL converts back, so
downloaded print models come in upright and at their real size; STL files from 0.5 and earlier still open as
saved.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.5.0
Subdivision levels (multiresolution)
- Divide (Tool > Geometry, Ctrl+D,
subdiv_divide) adds a subdivision level per SubTool and keeps the lower
ones: Catmull-Clark on meshes with quads (quads stay quads), Loop on triangle meshes, flat with Smt off. - Lower Res / Higher Res (Shift+D / D,
subdiv_lower,subdiv_higher) and the SDiv slider (subdiv_level)
step between levels. Detail is stored per level as a displacement in the local frame of the smoothed level
below, so reshaping a low level carries it along; edits at a high level are restricted (full weighting) to
the lower ones. Round trips without edits are bit-for-bit. - Mask, polypaint, paint layers, polygroups, hidden faces and UVs follow the levels (copied down, interpolated or
inherited up where they changed); sculpt layers have their own detail per level; the texture is shared. - Del Lower, Del Higher (
subdiv_delete_lower,subdiv_delete_higher) and Reconstruct Subdiv
(subdiv_reconstruct: finds the lower level of a regular Catmull-Clark or Loop subdivision, keeping the mesh
and its vertex order).subdiv_infolists the levels;subdiv_exportwrites the visible SubTools at another
level (e.g. the base cage) in any export format. - Each level change is one undo step, as is each stroke at any level; level edits share unchanged levels
copy-on-write. The two levels left last keep their topology and BVH, so stepping back and forth is instant
(1-45 ms at 6.5M triangles). - Projects save every level (project format 4). The SubTool list shows "SDiv n/m".
- Ctrl+D now runs Divide; the one-way Subdivide stays in Tool > Geometry and as
subdivide.
Gizmo 3D (moving, scaling, rotating and posing)
- Gizmo 3D modes, as in ZBrush: W Move, E Scale, R Rotate, Q back to Draw (top shelf, Transform palette, F3).
Move has axis arrows, plane squares and a view-plane centre; Rotate has axis rings and a view ring; Scale has
axis boxes and a uniform centre. Shift snaps (15 degrees, a round grid step, 10%). The amount shows beside the
gizmo while dragging. Dragging off the handles still navigates; Ctrl still masks. - Transforms move the active SubTool, or only its unmasked part: partly masked vertices move partly, hidden ones
never. Falloff eases the movement in over a distance from the mask's edge (measured along the surface, as a
share of the size) for soft joints when posing. With symmetry on, a masked transform is mirrored across the
symmetry plane. - Pivot: follows the centre of what moves; Alt+drag the gizmo to move it (or turn its axes) without the model,
Alt+click the model or To Surface to put it on the surface, Reset; World or Surface axes (Y along the normal,
turning with rotations). The gizmo follows undo / redo of its own steps and is saved in projects (gizmokey,
no format bump). - Gizmo 3D panel: pivot, options and numeric Move / Rotate / Scale with Apply; All SubTools (Transpose All, one
undo step per SubTool). transformcommand (translate, rotate, scale, pivot, orient, masked, falloff, symmetry, all); each gizmo drag
is echoed to the console as the command that repeats it.- One undo step per drag that restores positions bit for bit. Sculpt layers move with the surface (the base and
every layer's offsets). Topology, quads, UVs, textures, polypaint and polygroups are untouched. - Fast on big meshes: a drag recomputes from the drag's start (no drift), transforms only the moving vertices
through a per-weight lookup table on several threads, turns normals of rigid parts and recomputes only where
the movement varies, uploads only the changed vertex range and refits the BVH once on release. On 1.3M
triangles: about 2 ms to transform and 7 ms to upload per drag frame, 20-40 ms on release.
Normal, displacement and AO map baking
- Tool > Bake (and the
bakecommand) bakes a high-poly source (one SubTool, or every visible one but the
active) onto the active SubTool's UVs: tangent-space normal, object-space normal, displacement, ambient
occlusion, cavity and colour (polypaint or painted texture) maps, 1K to 8K. - Tangent-space maps use MikkTSpace tangents (vendored, zlib), as Blender, Unreal, Unity and Godot compute them;
OpenGL or DirectX green convention. Unit-tested to decode to the high-poly's normals within 0.2 degrees on
average. - Rays along the low-poly's smoothed normals through a front / rear cage, measured automatically by default or
set by hand, keeping the high-poly hit nearest the low-poly; 1-16 rays per texel of anti-aliasing; padding
around UV islands; tile-parallel on every core over a dedicated thread-safe BVH, in the background with
progress and Cancel. - Displacement as a 16-bit PNG (mid-grey = 0, scale reported) and a 32-bit float OpenEXR in world units.
- The baked normal map shows on the low-poly in the viewport (new normal-map shader with per-corner MikkTSpace
tangents), with a Preview Normal Map toggle. - Send to Unreal imports the baked normal map too (
T_<Name>_N, normal-map compression, green flipped for
OpenGL maps) when the editor runs on the same computer. - Maps are written as
<SubTool>_normal.png,_ao.png,_displacement.png/.exrand so on, beside the
last export by default.
Quad retopology and detail projection
- QRemesh (Tool > Geometry > QRemesh,
qremesh): automatic quad retopology like ZBrush's ZRemesher. A
field-aligned method after Instant Meshes (Jakob et al. 2015; field formulas follow its BSD-3 reference code,
credited in THIRD_PARTY_NOTICES.md): a multi-resolution 4-RoSy orientation field and position field, polygon
extraction, then every polygon split into quads and relaxed onto the sculpt. The result is 100% quads,
2-manifold and closed where the sculpt is, within about 5% of the target count. - Options: Target Polygons with Half / Same / Double, Adaptive Size (curvature-driven quad size), Keep Groups
(edge loops along polygroup borders, groups kept), Detect Edges (loops on hard edges over 50 degrees),
Use Polypaint (red = up to 4x the density, blue = down to a quarter), Symmetry (one half remeshed and mirrored,
welded on the seam), Keep Original (the old SubTool kept hidden below, for ProjectAll). - Runs in the background in the app with a progress bar and Cancel; one undo step. Mask and polypaint are
interpolated onto the new mesh; sculpt layers are baked. - ProjectAll (Tool > SubTool > Project,
project_all): moves the active SubTool onto the other visible
SubTools (rays both ways along the normal, nearest hit within Dist, else the closest point) and takes their
polypaint. Dist, Mean, PA Blur, Geometry / Polypaint toggles, an optional singlesource; respects the mask
and hidden faces; shape goes into the active sculpt layer, colour into the active paint layer; one undo step. - Fast on dense meshes (all threads, a read-only BVH): 1.3M triangles to 5,000 quads in 1.7 s, to 100,000 in
6 s; ProjectAll onto 1.25M vertices in 0.6 s (10-core desktop). - New guide chapter "Quad retopology and detail projection", glossary entries; UI test
tests/ui/retopo.sfui,
unit teststests/test_retopo.cpp(manifold, quad %, target count, Hausdorff distance, projection error).
Performance at tens of millions of polygons
- Benchmark:
sculptforge --bench(with GPU upload and orbit timings) andsculptforge-cli --benchbuild a
sphere divided to 4M / 16M / 32M triangles and measure every brush per dab (kernel, normals, BVH refit, upload),
undo, level stepping, project save / open and orbit. Numbers before and after in docs/performance.md. - A persistent thread pool (core/ThreadPool) runs every brush kernel (all brush types, recipes, mask and paint),
normal updates, BVH queries, refits and builds, and project CRCs. Work is split into fixed blocks with partial
sums added in order, so results are identical to one thread (set_multithreading). - Partial GPU updates: meshes track dirty vertices (a bit each, plus 2048-vertex blocks), and the renderer keeps
vertices in first-use order of the triangle list (core/UploadOrder), so a dab uploads a few short ranges of
what it changed instead of most of a subdivided mesh. A medium dab at 33M triangles: 398 ms -> 10 ms. - Memory: the per-triangle face normal cache and its stamps are gone (normals are summed per vertex, same
result), the adjacency list has no spare capacity, the renderer keeps no CPU copy of the curvature: 90 -> 62
bytes per triangle for a sculpting mesh. - The first polypaint stroke on an unpainted mesh keeps the (empty) paint stack for undo instead of a copy of
the whole mesh. - Projects: archives stream to disk (no in-memory copy), entries are read in place, CRCs are computed in
parallel, arrays are copied rather than converted byte by byte; ZIP64 past 4 GB (smaller archives are
byte-identical to before). - The window has no multisampling; the 3D view antialiases in its own target (Renderer::drawView), so it can
use fewer samples when the GPU has no room, and Fast Navigation draws scenes of 10M+ triangles without
antialiasing while the view moves. A SubTool that runs the GPU out of memory is not drawn (status message). - Preferences > Performance: Antialiasing (Off / 2x / 4x / 8x), Fast Navigation, Multithreading, the last
stroke's cost per dab and memory;perf_infoandset_multithreadingcommands.
Polish of the v0.5 features (known issues fixed)
- Auto UV on a SubTool with a painted texture now moves the paint and every texture layer onto the new UVs
instead of scrambling it (each texel of a new UV triangle samples the old texture at the same point of the same
triangle, islands padded 8 texels); one undo step restores the old UVs and texture (uv_auto keep_texture=falsefor the old behaviour). 1.05M triangles, 4K texture with a layer: 0.2-0.3 s. - Keep Texture (Tool > Remesh, Tool > Geometry > QRemesh;
keep_textureonremeshandqremesh, default on):
the rebuilt surface gets Auto UVs...
SculptForge 0.4.2
Texture painting on UV maps
- Paint into a texture on the model's UVs instead of its vertices, so the colour detail comes from the texture
(1K, 2K, 4K or 8K), not from the mesh density (Tool > Texture Map > New Texture,texture_create). The Paint
brush, Rgb sculpting, fills, cavity paint, colour picking (C), mask, hidden faces, symmetry and pen pressure
work as for polypaint; texture strokes never paint through to the far side. A few texels of padding around
every UV island keep seams invisible. - Vertex / Texture toggle on the top shelf (and in the Color, Paint Layers and Texture Map palettes) chooses
where paint goes per SubTool (paint_target). The viewport multiplies the texture with the polypaint over
the material; Show texture hides it. - The Paint Layers palette works on the texture's own layer stack: blend modes, opacity, visibility, lock,
duplicate, merge down, flatten, clear and fill, composited only where something changed. - One undo step per stroke, storing just the 64x64 tiles it touched (counted in the undo memory budget). Layer
edits (add, duplicate, clear, fill, merge, flatten, delete, settings) store only the tiles they changed, and a
tile of one colour costs 4 bytes: a stroke on a new 4K layer takes under a kilobyte of undo, not 64 MB. - Interactive at 4K on a 1.3M-triangle mesh: a dab visits only the triangles under the brush and uploads only
the changed rectangle of the texture. - Auto UV (Tool > Texture Map,
uv_auto): automatic UV unwrapping with xatlas (MIT, vendored in
third_party/xatlas), running in the background with progress. Show UVs draws the texture with the UV layout. - Polypaint > Texture and Texture > Polypaint (
texture_from_polypaint,polypaint_from_texture), Import and
Export Texture (PNG;texture_import,texture_export), Delete Texture (texture_delete). - Projects save textures and their layers (project format 3; version 1 and 2 projects still open, and older
SculptForge versions refuse format 3 files instead of dropping the paint). - Exports write the texture next to the model: OBJ with a
.mtl(map_Kd), glTF/GLB with an embedded base
colour texture, USD with a preview material, FBX and GoZ with the PNG beside the file. - Subdivide, decimate, split and duplicate keep the texture with the UVs.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.
SculptForge 0.4.1
Fixed
- Graphics tablets: the brush ring no longer flickers between two places, which looked like a second brush
blinking on the model (most noticeable while masking with Ctrl or smoothing with Shift). Windows Ink and some
tablet drivers send mouse events of their own beside the pen's, often at an old position; while the pen is
in range only the pen now moves the cursor, and the mouse takes over again once the pen goes quiet.
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-…-linux-x86_64.AppImage or …-arm64.AppImage |
| 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.