Releases: alfu32/k3d
Release list
5.3.2: feat(UI/UX): README
README.md now:
- keeps img_12.png
- replaces the other screenshot references with newer captures from docs-site/static/images/generated/
- removes the old release notes section
- replaces the documentation section with direct GitHub Pages links:
- main docs
- tutorials
- guide
- reference
- automation
- specification
I kept the local source docs and docs-site/ links, but removed the stale release-note list entirely.
feat(objects): explode operation button
- core/src/main/kotlin/com/github/alfu32/sketch/ui/SketchUiOverlay.kt:80
- added a new constructor callback for object explosion / ungroup
- added an Explode Object action button in the Actions toolbar
- wired it to ungroupSelectionAction()
- exposed tutorial action id ui.action.explode_selected_object- core/src/main/kotlin/com/github/alfu32/sketch/Main.kt:981
- passed ::ungroupSelection into the UI overlay
- docs-site/src/routes/guide/objects/+page.md:1
- updated the object actions description to include Explode Object
- docs-site/src/routes/tutorials/objects-and-instances/+page.md:1
- added the new button to the lesson’s button sheet
- core/src/main/kotlin/com/github/alfu32/sketch/Main.kt:981
5.3.1: feat(UI/UX): single click/touch interface improvement
added button for exiting object edit alongside object create and object edit buttons
Added a dedicated Close Object button to the native Actions toolbar and wired it to the existing object-edit exit path.
What changed:
- core/src/main/kotlin/com/github/alfu32/sketch/ui/SketchUiOverlay.kt
- added a Close Object action button in the Actions toolbar
- wired it to groupCloseEditModeAction()
- registered tutorial action id ui.action.close_selected_object
- core/src/main/kotlin/com/github/alfu32/sketch/Main.kt
- passed ::exitGroupEditMode into the UI overlay
- docs-site/src/routes/tutorials/objects-and-instances/+page.md
- added the new button to the lesson’s button sheet
- docs-site/src/routes/guide/objects/+page.md
- documented the Actions toolbar as a single-click path for Create Object, Edit Selected Object, and Close Object
README.md now uses the same content family as docs/index.md, but I cleaned out the stale version-specific release links and added the current docs-site/ pointer.
What changed:
- Kept the Octodraw overview, highlights, workflow, console, build, and docs sections from the index page
- Removed the hardcoded 4.4.1 release URLs
- Added a link to the new docs site
5.2.1: feat(tools): modify 2 toolbar layout
Added a separate equalized pair of array tools without changing the existing rotational tools.

The new tools are Rotational Array Even and Helical Array Even in core/src/main/kotlin/com/github/alfu32/sketch/tools/MultipleCopyTools.kt. In full-circle mode they keep the picked center and
radius fixed, measure the selected geometry’s tangential span at the chosen radius, resolve an integer position count, and redistribute the copies with exact equal angular spacing. The existing
Rotational Array and Helical Array tools are untouched. For partial sweeps, the new tools behave normally.
I wired the new ids in core/src/main/kotlin/com/github/alfu32/sketch/ui/ToolId.kt, registered them in core/src/main/kotlin/com/github/alfu32/sketch/Main.kt, added them to the Modification 2
toolbar and icon/color mapping in core/src/main/kotlin/com/github/alfu32/sketch/ui/SketchUiOverlay.kt, and included them in the M cycle in core/src/main/kotlin/com/github/alfu32/sketch/ui/
ToolInputProcessor.kt.
5.2.0: feat(tools): rotational tools ux optimisation
• new rotation-tool set and wired it into the app.

The tool logic lives in core/src/main/kotlin/com/github/alfu32/sketch/tools/MultipleCopyTools.kt. Rotate 2 now uses c -> a -> b, derives the axis from plane acb, supports normal rotate plus copy mode, and
shows a live ghost while picking b. Rotational Array uses c -> a -> b -> d on the same axis logic and previews the generated copies while picking d. Helical Array uses c -> a -> b -> d, keeps the axis
vertical, derives angle and lift from b, resolves multi-turn copy counts from d, and previews the result while picking the final point.
I also added the new tool ids in core/src/main/kotlin/com/github/alfu32/sketch/ui/ToolId.kt, registered the tools and command-palette entries in core/src/main/kotlin/com/github/alfu32/sketch/Main.kt,
added a separate Modification 2 toolbar plus icon/color mappings in core/src/main/kotlin/com/github/alfu32/sketch/ui/SketchUiOverlay.kt, and included them in the M tool cycle in core/src/main/kotlin/com/
github/alfu32/sketch/ui/ToolInputProcessor.kt.
What still needs real app validation is behavior, not build health: especially the exact feel of Rotational Array full-circle handling and the helical copy-count interpretation against your intended
cylindrical workflow.
5.1.9: feat(model): optimize updateFaceMesh
Changed core/src/main/kotlin/com/github/alfu32/sketch/Main.kt again in the face-mesh rebuild path.
What changed:
- updateFaceMesh() no longer does a full pre-count scan of visible root triangles.
- It now uses an upper-bound vertex capacity for the root mesh and lets the fill pass determine the actual written vertex count.
- Prototype guide faces are no longer collected through scene.collectActivePrototypeWorldTriangles(...), which was allocating temporary world-space vectors. The rebuild now writes those triangles directly
with writeTriangleVerticesTransformed(...) using the active group matrix.
That targets the remaining stable cost in main.updateFaceMesh without changing model semantics.
5.1.1: feat(ui): exports
Highlights
- Added selection-aware model export.
- Added unit-scaled exports with suffix-based unit metadata.
- Added .octd voxel import with staged placement and wireframe preview.
- Added xref/external-object storage support.
- Improved object placement preview.
- Improved in-tool operator/context menu behavior.
- Fixed polyline arc/circle segment input behavior.
Export Improvements
- Model export now exports the full model only when nothing is selected.
- When there is any selection, export is restricted to selected elements.
- Line-only selections no longer accidentally trigger full-model export.
- Exported coordinates are multiplied by the configured model unit size.
- Unit-aware formats now infer units from filename suffixes when possible:
- Examples: model_mm.3mf, model_cm.dae, model_m.dxf.
- If no known unit suffix is detected, exports use unitless units.
- DXF export now includes unit metadata through $INSUNITS.
- Collada/DAE, 3MF, AMF, and IFC unit handling was improved where supported.
- IFC export now handles selected line geometry as well as mesh geometry.
.octd Import
- .octd files can now be imported through the import flow.
- Imported voxel cubes are converted into a voxel object prototype.
- After import, the user is prompted to place the object interactively.
- Placement shows a wireframe preview before the insertion point is picked.
XRef / External Objects
- Object prototypes can now be stored externally as xrefs.
- Objects panel now includes:
- Store externally
- Pick XRef File
- Internal/external status in the object list
- Xref objects remain normal editable object prototypes in memory.
- Actionable hotspots remain visible/actionable through the existing object/hotspot system.
- Saves write external object data to its .octd xref file.
- Main model saves keep xref metadata and avoid embedding external object geometry.
- Desktop xrefs use normal filesystem .octd files.
- Android xrefs use SAF document URIs.
- Web runtime reports xrefs unavailable.
Object Placement
- Object placement now renders the selected prototype as a wireframe at the cursor.
- Double-clicking an object prototype in the object list stages it for placement as before, now with visible preview support.
Contextual Tool Operators
- The in-tool operators panel now exposes common contextual operations:
- Esc/cancel/return to select where relevant.
- Close Object while editing an object.
- Polyline-style segment buttons for line, arc, and circle segments.
- Polyline-style tools now expose clearer segment actions:
- Line Seg
- Arc Seg
- Circle Seg
Polyline Fixes
- Arc segment input behavior was corrected:
- Previous endpoint is point 1.
- Next click is point 2 on the arc.
- Next click is point 3/end of the arc.
- Circle segment input behavior was corrected:
- Previous endpoint is the arc start.
- Next click is the circle center.
- Next click is the arc end.
Assets / Examples
- App icons were refreshed.
- New export/example assets were added, including carcass exports and xref example .octd files.
external refs/ impoert-export improvements
- Export now uses selection when anything is selected, otherwise full model export. Line-only selections no longer accidentally export the full model for mesh-only formats.
- Export coordinates are scaled by modelUnit.size, and unit suffixes like model_mm.3mf, model_cm.dae, model_m.dxf, etc. now drive unit metadata where supported.
- .octd import is available through the import flow and imports voxel cubes into a new voxel prototype, then switches to object placement with a wireframe preview before insertion.
- Object placement now renders the selected prototype wireframe at the cursor.
- Objects can now be marked as xrefs via the Objects panel: Store externally, Pick XRef File, and the object list shows internal / external.
- Xref object geometry/hotspots remain normal object prototype data in memory, so editing and actionable hotspots continue through the existing object path. Saves write external xref .octd data and strip
that geometry from the main model snapshot when external storage is enabled. - Xref picking supports desktop files and Android SAF document URIs. Web reports xrefs unavailable.
4.9.8: feat(ui): grid toggle, thin line setting fix
UI improvements:
- thin and thick line width settings
- base grid can be turned off
- base grid can be rotated to xoz,yoz or back to xoy planes
-
the grid should always be thin ... should sit on its own batch together with all the helpers.
- the meaning behind swapping the grid normal was to swap also the snap plane, if the grid normal is pointing left then we should provide snap points in that vertical plane ....
- it would be great that every 5th grid line to be green and every 10th to be red coloured. the grid lines that pass through 0,0,0 should be black the rest should be gray
Applied the three corrections. The permanent grid now renders in the thin helper-line batch instead of the normal-width line batch, while selection/draft/dimension lines stay on the configurable batch in
core/src/main/kotlin/com/github/alfu32/sketch/Main.kt:2861 and core/src/main/kotlin/com/github/alfu32/sketch/Main.kt:2889. The grid itself is now basis-driven from the selected normal, with coloring rules
in core/src/main/kotlin/com/github/alfu32/sketch/Main.kt:3076: origin lines are black, every 10th line red, every 5th green, all others gray.The snap fallback plane now uses that same permanent-grid basis instead of a hardcoded y=0 plane, so switching the grid normal also switches empty-space grid snapping onto the corresponding vertical or
horizontal plane in core/src/main/kotlin/com/github/alfu32/sketch/input/Snapper.kt:15, core/src/main/kotlin/com/github/alfu32/sketch/input/Snapper.kt:128, and core/src/main/kotlin/com/github/alfu32/
sketch/input/Snapper.kt:170. I also updated the adaptive helper cloud so its “base grid” logic follows the selected permanent grid plane in core/src/main/kotlin/com/github/alfu32/sketch/Main.kt:3295.
4.9.6: feat(dist): snap
fix snap
promoted to stable strict
4.9.4: feat(dist): snap
-
fix snap build crashing
-
The AppImage wrapper ends up running octodraw-jre from the mounted AppImage payload.
-
That launcher defaulted PLUGINS_DIR to "$INSTALL_PATH/plugins".
-
In an AppImage that path is read-only, so plugins.json creation failed.
I fixed the Unix launchers in lwjgl3/build.gradle.
What changed
- octodraw-editor and octodraw-jre now compute a writable app home:
- OCTODRAW_HOME
- fallback K3D_HOME
- fallback XDG_DATA_HOME/octodraw
- fallback ~/.local/share/octodraw
- They export that as OCTODRAW_HOME
- Plugin dir now falls back to:
- "$APP_HOME/plugins"
- whenever the packaged plugins dir is not writable
- They also mkdir -p the chosen plugin dir before launch
Effect
- AppImage now writes plugin state to a writable user location
- extracted Linux bundles still use packaged plugins/ when that directory is writable
- if a portable bundle is installed read-only, it also falls back cleanly to user data