Skip to content

Releases: islandmed/SculptForge

SculptForge 0.9.2

Choose a tag to compare

@github-actions github-actions released this 28 Oct 08:39

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 (or 2 for 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

Choose a tag to compare

@github-actions github-actions released this 27 Oct 08:24

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

Choose a tag to compare

@github-actions github-actions released this 27 Oct 07:01

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_mesh now 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, ...; resolution still 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_landmark verb,
    hover scrolls a panel to the item as click does.

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 .shapes file beside each
    .GoZ, which now holds the base shape when the mesh has layers).
  • UI tests: zoom and look steps; run expands $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 in capture.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. Commands splat_train and
    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 a capture.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, for face_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=OFF builds 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 at link.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

Choose a tag to compare

@github-actions github-actions released this 26 Oct 04:55

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_uv command 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>.GoZ next 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 .ZTL is newer than the conversion; without one the
    message points to the plug-in. A folder of numbered .GoZ files (<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

Choose a tag to compare

@github-actions github-actions released this 25 Oct 23:53

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.
  • dyntopo command (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 .sfbrush files, 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
    stroke command 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_guides per 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; qremesh gains guides and curves_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 PITCH step; 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

Choose a tag to compare

@github-actions github-actions released this 25 Oct 16:48

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 .GoZ files
      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
      against sculptforge-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).
  • Commands blender_send and blender_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.py writes the extension zip and a legacy add-on zip (cmake --build build --target blender_addon); releases attach sculptforge_bridge.zip. Guide chapter Working with Blender.
  • UI tests: copy SRC DST stages 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

Choose a tag to compare

@github-actions github-actions released this 24 Oct 21:41

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=OFF at 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%).
  • 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 TEXT runs 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 --bench reports GPU memory, triangles drawn after culling, the motion proxy, and orbiting with and
    without antialiasing; --bench-view runs 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_stl takes height_mm= to scale to a print height,
    plus scale= and z_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

Choose a tag to compare

@github-actions github-actions released this 24 Oct 00:41

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_info lists the levels; subdiv_export writes 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 (gizmo key,
    no format bump).
  • Gizmo 3D panel: pivot, options and numeric Move / Rotate / Scale with Apply; All SubTools (Transpose All, one
    undo step per SubTool).
  • transform command (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 bake command) 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 / .exr and 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 single source; 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 tests tests/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) and sculptforge-cli --bench build 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_info and set_multithreading commands.

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=false for the old behaviour). 1.05M triangles, 4K texture with a layer: 0.2-0.3 s.
  • Keep Texture (Tool > Remesh, Tool > Geometry > QRemesh; keep_texture on remesh and qremesh, default on):
    the rebuilt surface gets Auto UVs...
Read more

SculptForge 0.4.2

Choose a tag to compare

@github-actions github-actions released this 23 Oct 18:19

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

Choose a tag to compare

@github-actions github-actions released this 23 Oct 16:14

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.