0.6: README and site for sculpting, materials, scripts and the Mac app (a macOS download); features regrouped; nothing wider than a phone on a phone

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nexoniarz 2026-10-20 17:38:04 +02:00
commit e18c7f6bce
4 changed files with 45 additions and 14 deletions

View file

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
project(Fry3DX VERSION 0.5.0 LANGUAGES C CXX) project(Fry3DX VERSION 0.6.0 LANGUAGES C CXX)
set(CMAKE_CXX_SCAN_FOR_MODULES OFF) # (no C++ modules; the scan can pick up a different clang than the NDK's) set(CMAKE_CXX_SCAN_FOR_MODULES OFF) # (no C++ modules; the scan can pick up a different clang than the NDK's)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
add_link_options(-rdynamic) # function names in crash reports add_link_options(-rdynamic) # function names in crash reports

View file

@ -2,7 +2,7 @@
<h1 align="center">Fry3DX</h1> <h1 align="center">Fry3DX</h1>
<p align="center"><b>Frying 3D Extreme — a 3D modeller that does what you'd expect.</b><br> <p align="center"><b>Frying 3D Extreme — a 3D modeller that does what you'd expect.</b><br>
Pick a tool, click, drag. On Windows, Linux and your phone.</p> Pick a tool, click, drag. On Windows, macOS, Linux and your phone.</p>
<p align="center"> <p align="center">
<a href="https://nexoniarz.github.io/Fry3DX/">Website</a> · <a href="https://nexoniarz.github.io/Fry3DX/">Website</a> ·
<a href="https://github.com/Nexoniarz/Fry3DX/releases">Download</a> · <a href="https://github.com/Nexoniarz/Fry3DX/releases">Download</a> ·
@ -28,10 +28,12 @@ From [Releases](https://github.com/Nexoniarz/Fry3DX/releases):
| | | | | |
|---|---| |---|---|
| **Windows** (10 and 11, x64) | `Fry3DX-…-windows-x64.zip`: unpack, run `fry3dx.exe` | | **Windows** (10 and 11, x64) | `Fry3DX-…-windows-x64.zip`: unpack, run `fry3dx.exe` |
| **macOS** (13.3 and newer, Apple silicon and Intel) | `Fry3DX-…-macos.zip`: unzip, open `Fry3DX.app` (the first time: right-click it, Open) |
| **Linux** (any distro from 2022 on, x64) | `Fry3DX-…-linux-x64.AppImage`: make it executable, run it. Or the `.tar.gz` | | **Linux** (any distro from 2022 on, x64) | `Fry3DX-…-linux-x64.AppImage`: make it executable, run it. Or the `.tar.gz` |
| **Android** (8.0 and newer, 64-bit, Vulkan) | `Fry3DX-…-android-arm64.apk`: open it on the phone to install | | **Android** (8.0 and newer, 64-bit, Vulkan) | `Fry3DX-…-android-arm64.apk`: open it on the phone to install |
Needs a graphics card (or phone) with Vulkan; on a PC, OpenGL 4.6 works too. Needs a graphics card (or phone) with Vulkan; on a PC, OpenGL 4.6 works too. On a Mac, Vulkan
comes inside the app (MoltenVK, on Metal), and OpenGL 4.1 is the fallback.
## What it does ## What it does
@ -46,6 +48,8 @@ Five tabs along the top: **Model**, **Paint**, **Layout**, **Render**, **Print**
- **Move, turn, scale** (W, E, R): the arrows turn with the object. Scale keeps the other side - **Move, turn, scale** (W, E, R): the arrows turn with the object. Scale keeps the other side
where it is; Shift scales both sides at once. Ctrl snaps. where it is; Shift scales both sides at once. Ctrl snaps.
- **Round, smooth, mirror** any object, changeable any time, baked in when you like. - **Round, smooth, mirror** any object, changeable any time, baked in when you like.
- **Materials**: gold, chrome, steel, wood, ceramic, rubber and more, or how metal and rough it
is; shown in the view (Solid too), exported with it.
**Editing the shape** (Tab, or double-click) **Editing the shape** (Tab, or double-click)
- Points, edges, faces (1, 2, 3). Extrude (X), inset (I), round edges (B), loop cut (C), knife (K), - Points, edges, faces (1, 2, 3). Extrude (X), inset (I), round edges (B), loop cut (C), knife (K),
@ -63,6 +67,11 @@ Five tabs along the top: **Model**, **Paint**, **Layout**, **Render**, **Print**
- **Layers** with folders inside folders, drag and drop, hide and lock whole groups, and a button - **Layers** with folders inside folders, drag and drop, hide and lock whole groups, and a button
on every row that brings the camera to it. on every row that brings the camera to it.
**Sculpting** (the Paint tab's other side: Tab)
- Raise, puff out, smooth, flatten, pinch and grab the surface (1 to 6); Ctrl goes the other way,
Shift smooths, X does the same on both sides. A shape with too few points is made finer first,
keeping its shape.
**Painting** **Painting**
- Paint on the model or on its flat picture. **Paste any picture** (Ctrl+V): it goes on like a - Paint on the model or on its flat picture. **Paste any picture** (Ctrl+V): it goes on like a
sticker that bends over edges and corners; Enter locks it as a layer, clicking it in the sticker that bends over edges and corners; Enter locks it as a layer, clicking it in the
@ -79,9 +88,19 @@ Five tabs along the top: **Model**, **Paint**, **Layout**, **Render**, **Print**
sizes in millimetres, checks for holes and flipped faces with buttons that fix them, overhangs sizes in millimetres, checks for holes and flipped faces with buttons that fix them, overhangs
in red, weight and filament, measuring, lay flat on a face, save 3MF or STL. in red, weight and filament, measuring, lay flat on a face, save 3MF or STL.
**Scripts** (the Script panel, F5)
- Lua with a `fry` library: add shapes and change their settings, combine them, move points by a
formula, sculpt, set the materials and the sun. One Ctrl+Z takes back all a script did; an error
takes it back itself. Examples in Script > Examples; the **?** button lists every function.
It can't reach anything outside the scene (no files, no programs).
**The look**: light or dark, or following the desktop (View > Appearance), in
[Niveus](https://github.com/Nexoniarz/niveus): keys that look like keys, fields set into the panel.
**Files** **Files**
- `.fry`: Fry3DX's own file, everything in one, packed small. **Autosave** in the background, - `.fry`: Fry3DX's own file, everything in one, packed small. **Autosave** in the background,
offered back after a crash; Save / Don't save / Cancel when closing. offered back after a crash; Save / Don't save / Cancel when closing. Drop a `.fry`, a script or
a picture on the window to open it.
- **Export**: GLB, glTF, FBX (Blender, Unity, Unreal, Maya), OBJ, 3MF, STL, PLY. - **Export**: GLB, glTF, FBX (Blender, Unity, Unreal, Maya), OBJ, 3MF, STL, PLY.
**On a phone or tablet**: everything bigger, the side panels when you want them, a bar of big **On a phone or tablet**: everything bigger, the side panels when you want them, a bar of big
@ -94,8 +113,8 @@ F1 in the app lists every key.
## Build it yourself ## Build it yourself
Everything it uses is downloaded while building; you need CMake 3.25+, Ninja, a C++20 compiler Everything it uses is downloaded while building; you need CMake 3.25+, Ninja, a C++20 compiler
(GCC 13+, Clang 17+ or clang-cl) and glslc (from shaderc or the Vulkan SDK). On NixOS, (GCC 13+, Clang 17+, Xcode 15+ or clang-cl) and glslc (from shaderc or the Vulkan SDK). On NixOS,
`shell.nix` has it all. `shell.nix` has it all; on a Mac, `brew install cmake ninja shaderc molten-vk`.
```sh ```sh
git clone https://github.com/Nexoniarz/Fry3DX.git && cd Fry3DX git clone https://github.com/Nexoniarz/Fry3DX.git && cd Fry3DX
@ -109,9 +128,10 @@ cmake --build build/debug --target check # the tests (after
| `debug`, `release` | for working on it | | `debug`, `release` | for working on it |
| `portable` | a Linux build to hand out: SDL and the C++ library inside the program | | `portable` | a Linux build to hand out: SDL and the C++ library inside the program |
| `windows` | Windows, cross-built from Linux with clang-cl ([how](cmake/toolchains/windows-msvc.cmake)) | | `windows` | Windows, cross-built from Linux with clang-cl ([how](cmake/toolchains/windows-msvc.cmake)) |
| `macos-arm64`, `macos-x64` | `Fry3DX.app` for Apple silicon / Intel (both build on either Mac); `tools/package.py macos` joins them into one app |
| `android` | the Android library; `android/build_apk.py` makes the APK ([how](android/build_apk.py)) | | `android` | the Android library; `android/build_apk.py` makes the APK ([how](android/build_apk.py)) |
`tools/package.py` packs builds into the downloads (zip, tar.gz, AppImage). Pushing a tag `tools/package.py` packs builds into the downloads (zip, tar.gz, AppImage, the Mac app). Pushing a tag
`v*` makes GitHub build all of them and put them in a release (`.github/workflows/build.yml`). `v*` makes GitHub build all of them and put them in a release (`.github/workflows/build.yml`).
## What's where ## What's where
@ -122,19 +142,22 @@ cmake --build build/debug --target check # the tests (after
| `src/mesh.*`, `tools.cpp`, `cut.cpp` | polygon meshes and the edits on them (tested without a window) | | `src/mesh.*`, `tools.cpp`, `cut.cpp` | polygon meshes and the edits on them (tested without a window) |
| `src/boolean.cpp`, `modify.cpp` | combining shapes, thickness, joining flat faces | | `src/boolean.cpp`, `modify.cpp` | combining shapes, thickness, joining flat faces |
| `src/shapes.*` | the shape library and starter models | | `src/shapes.*` | the shape library and starter models |
| `src/scene.*`, `package.cpp` | objects, folders, the `.fry` file | | `src/scene.*`, `package.cpp` | objects, folders, materials, the `.fry` file |
| `src/sculpt.*` | the sculpting brushes |
| `src/script.*` | scripts: Lua and the `fry` library; examples in `content/Fry3DX/scripts/` |
| `src/export.cpp`, `print.cpp` | GLB/glTF/FBX/OBJ/3MF/STL/PLY, checks for printing | | `src/export.cpp`, `print.cpp` | GLB/glTF/FBX/OBJ/3MF/STL/PLY, checks for printing |
| `src/uv.cpp`, `sticker.cpp`, `image.cpp` | flat layouts, stickers, pictures | | `src/uv.cpp`, `sticker.cpp`, `image.cpp` | flat layouts, stickers, pictures |
| `engine/` | window, Vulkan/OpenGL renderer, UI, files | | `engine/` | window, Vulkan/OpenGL renderer, UI, files |
| `android/`, `tools/`, `.github/` | builds and packages | | `android/`, `tools/`, `.github/` | builds and packages |
| `docs/` | the website (GitHub Pages); its words are all in `docs/content.js` | | `docs/` | the website (GitHub Pages); its words are all in `docs/content.js` |
| `tests/` | `mesh_test` | | `tests/` | `mesh_test`, `script_test` (every example script runs) |
## Coming ## Coming
Sculpting, materials shown in the view, scripting; animation later. Animation; textures for materials (wood grain, brushed metal); dynamic detail while sculpting.
## Licence ## Licence
[Apache License 2.0](LICENSE). Copyright 2026 Nexoniarz. [Apache License 2.0](LICENSE). Copyright 2026 Nexoniarz.
Sky pictures: Poly Haven, CC0. DejaVu fonts: their own free licence (`engine/fonts/LICENSE` in builds). Sky pictures: Poly Haven, CC0. Fonts: Instrument Sans and JetBrains Mono (SIL Open Font
License), DejaVu (its own free licence). Lua: MIT. MoltenVK (in the Mac app): Apache 2.0.

View file

@ -7,7 +7,7 @@ window.FRY = {
authorUrl: "https://github.com/Nexoniarz", authorUrl: "https://github.com/Nexoniarz",
repo: "https://github.com/Nexoniarz/Fry3DX", repo: "https://github.com/Nexoniarz/Fry3DX",
tagline: "A 3D modeller that does what you'd expect.", tagline: "A 3D modeller that does what you'd expect.",
intro: "Pick a tool, click, drag. Plain words instead of jargon, a toolbox like GIMP's, and the useful stuff from the big modellers without the hundred menus around it. On Windows, Linux and your phone.", intro: "Pick a tool, click, drag. Plain words instead of jargon, a toolbox like GIMP's, and the useful stuff from the big modellers without the hundred menus around it. On Windows, macOS, Linux and your phone.",
releases: "https://github.com/Nexoniarz/Fry3DX/releases/latest", releases: "https://github.com/Nexoniarz/Fry3DX/releases/latest",
why: { why: {
@ -21,7 +21,7 @@ window.FRY = {
// The feature tabs, in order (each feature names its group). // The feature tabs, in order (each feature names its group).
featureGroups: [ featureGroups: [
{ id: "make", title: "Make" }, { id: "make", title: "Make" },
{ id: "paint", title: "Paint" }, { id: "paint", title: "Paint & sculpt" },
{ id: "print", title: "Render & print" }, { id: "print", title: "Render & print" },
{ id: "work", title: "Work" }, { id: "work", title: "Work" },
], ],
@ -33,6 +33,8 @@ window.FRY = {
{ group: "make", icon: "points", title: "Real shape editing", text: "Points, edges and faces. Extrude, inset, round edges, loop cut, knife, merge. Shift+click picks a whole loop, Shift+Ctrl+click a ring." }, { group: "make", icon: "points", title: "Real shape editing", text: "Points, edges and faces. Extrude, inset, round edges, loop cut, knife, merge. Shift+click picks a whole loop, Shift+Ctrl+click a ring." },
{ group: "make", icon: "hole", title: "Holes for screws and nuts", text: "Round, rectangle, triangle or hexagon. M2 to M8 screw and nut sizes ready, with a little room added so the print actually fits." }, { group: "make", icon: "hole", title: "Holes for screws and nuts", text: "Round, rectangle, triangle or hexagon. M2 to M8 screw and nut sizes ready, with a little room added so the print actually fits." },
{ group: "make", icon: "copies", title: "Copies and thickness", text: "Copies in a row or round in a circle. Make a surface thick, or a solid hollow with walls exactly as thick as you need." }, { group: "make", icon: "copies", title: "Copies and thickness", text: "Copies in a row or round in a circle. Make a surface thick, or a solid hollow with walls exactly as thick as you need." },
{ group: "paint", icon: "sculpt", title: "Sculpt it like clay", text: "Raise, puff out, smooth, flatten, pinch and grab the surface with a brush, the same on both sides if you like. A shape with too few points is made finer first, keeping its shape." },
{ group: "print", icon: "sphere", title: "Materials you can see", text: "Gold, chrome, brushed steel, wood, ceramic, rubber and more, or set how metal and rough it is yourself. Shown in the view, not only in the render, and exported with it." },
{ group: "paint", icon: "brush", title: "Paint and stickers", text: "Paint on the model or on its flat picture. Paste any picture (Ctrl+V) and it goes on like a sticker that bends over edges and corners." }, { group: "paint", icon: "brush", title: "Paint and stickers", text: "Paint on the model or on its flat picture. Paste any picture (Ctrl+V) and it goes on like a sticker that bends over edges and corners." },
{ group: "paint", icon: "layout", title: "Layout tab", text: "Move, turn and size the flat frames of the surface by hand. The paint follows, so the model looks the same." }, { group: "paint", icon: "layout", title: "Layout tab", text: "Move, turn and size the flat frames of the surface by hand. The paint follows, so the model looks the same." },
{ group: "print", icon: "print", title: "Made for 3D printing", text: "Your printer's plate in the view, sizes in millimetres, checks for holes and flipped faces with fix buttons, overhangs shown red, weight and filament." }, { group: "print", icon: "print", title: "Made for 3D printing", text: "Your printer's plate in the view, sizes in millimetres, checks for holes and flipped faces with fix buttons, overhangs shown red, weight and filament." },
@ -96,6 +98,7 @@ fry.frame()`,
downloads: [ downloads: [
{ os: "Windows", what: "10 and 11, 64-bit", file: "windows-x64.zip", how: "Unpack it, run fry3dx.exe." }, { os: "Windows", what: "10 and 11, 64-bit", file: "windows-x64.zip", how: "Unpack it, run fry3dx.exe." },
{ os: "macOS", what: "13.3 and newer, Apple silicon and Intel", file: "macos.zip", how: "Unzip it, open Fry3DX.app. The first time: right-click it and choose Open." },
{ os: "Linux", what: "any distro from 2022 on, 64-bit", file: "linux-x64.AppImage", how: "Make it executable, run it. A .tar.gz is there too." }, { os: "Linux", what: "any distro from 2022 on, 64-bit", file: "linux-x64.AppImage", how: "Make it executable, run it. A .tar.gz is there too." },
{ os: "Android", what: "8.0 and newer, 64-bit, Vulkan", file: "android-arm64.apk", how: "Open it on the phone to install (allow installing from your browser or files app)." }, { os: "Android", what: "8.0 and newer, 64-bit, Vulkan", file: "android-arm64.apk", how: "Open it on the phone to install (allow installing from your browser or files app)." },
], ],
@ -108,10 +111,11 @@ fry.frame()`,
"cmake --preset release && cmake --build build/release", "cmake --preset release && cmake --build build/release",
"build/release/bin/fry3dx", "build/release/bin/fry3dx",
], ],
needs: "Needs: CMake 3.25+, Ninja, a C++20 compiler (GCC 13+, Clang 17+) and glslc. Presets for Windows (cross-built) and Android are in the README.", needs: "Needs: CMake 3.25+, Ninja, a C++20 compiler (GCC 13+, Clang 17+, Xcode 15+) and glslc. Presets for macOS, Windows (cross-built) and Android are in the README.",
}, },
versions: [ versions: [
{ v: "0.6", date: "2026-10-20", items: ["Sculpting, scripts and a Mac app", "Sculpting: raise, puff out, smooth, flatten, pinch and grab", "Materials shown in the view, sixteen to start from", "Scripts: Lua and a Script panel, with examples", "macOS: one app for Apple silicon and Intel", "A new look (Niveus): light and dark, following the desktop", "A new logo", "Drop a file on the window to open it"] },
{ v: "0.5", date: "2026-10-19", items: ["Builds for Windows, Linux (AppImage) and Android", "A phone layout: big buttons, finger gestures, the phone's file picker", "Apache License 2.0"] }, { v: "0.5", date: "2026-10-19", items: ["Builds for Windows, Linux (AppImage) and Android", "A phone layout: big buttons, finger gestures, the phone's file picker", "Apache License 2.0"] },
{ v: "0.4", date: "2026-10-19", items: ["Combine objects: add, subtract, overlap", "Draw shapes onto other objects", "Copies in a row or circle, thicken and hollow", "FBX export", "Folders and groups in Layers, go-to buttons", "Shift scales both sides, Shift+click loops and rings", "A crash screen of its own"] }, { v: "0.4", date: "2026-10-19", items: ["Combine objects: add, subtract, overlap", "Draw shapes onto other objects", "Copies in a row or circle, thicken and hollow", "FBX export", "Folders and groups in Layers, go-to buttons", "Shift scales both sides, Shift+click loops and rings", "A crash screen of its own"] },
{ v: "0.3", date: "2026-10-19", items: ["Stickers that bend over edges, picture layers", "Packed .fry files, autosave and recovery", "Layout tab, Print tab, 3MF / STL / OBJ / PLY / GLB export", "Hole tool: hexagon nut pockets, rectangles, outlines"] }, { v: "0.3", date: "2026-10-19", items: ["Stickers that bend over edges, picture layers", "Packed .fry files, autosave and recovery", "Layout tab, Print tab, 3MF / STL / OBJ / PLY / GLB export", "Hole tool: hexagon nut pockets, rectangles, outlines"] },

View file

@ -33,12 +33,16 @@ body { background: var(--nv-color-background); }
@media (min-width: 64rem) { @media (min-width: 64rem) {
.hero { grid-template-columns: 5fr 7fr; gap: var(--nv-space-12); } .hero { grid-template-columns: 5fr 7fr; gap: var(--nv-space-12); }
} }
.hero > * { min-inline-size: 0; } /* (a grid's items may shrink below their content) */
.hero__copy { .hero__copy {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: var(--nv-space-5); gap: var(--nv-space-5);
align-items: flex-start; align-items: flex-start;
} }
.hero__copy > .nv-badge { white-space: normal; max-inline-size: 100%; } /* (the newest version's line wraps on a phone) */
/* Tab rows wider than a phone scroll sideways instead of widening the page. */
.nv-nav-tabs { max-inline-size: 100%; overflow-x: auto; scrollbar-width: none; }
.hero__title { font-size: clamp(var(--nv-font-size-4xl), 5.5vw, var(--nv-font-size-5xl)); } .hero__title { font-size: clamp(var(--nv-font-size-4xl), 5.5vw, var(--nv-font-size-5xl)); }
.hero__bed { padding: var(--nv-space-6); min-inline-size: 0; } .hero__bed { padding: var(--nv-space-6); min-inline-size: 0; }
.app-window { max-inline-size: 100%; } .app-window { max-inline-size: 100%; }