Download Latest Version Surface Explorer v1.5 source code.zip (259.2 MB)
Home / v1.4
Name Modified Size InfoDownloads / Week
Parent folder
SurfaceExplorer-v1.4-macos.dmg 2026-10-31 82.8 MB
SurfaceExplorer-1.4-windows-x64.zip 2026-10-19 70.5 MB
install-linux.sh 2026-10-19 7.6 kB
SurfaceExplorer-v1.4-linux-x86_64.AppImage 2026-10-19 86.5 MB
README.md 2026-10-18 18.6 kB
Surface Explorer v1.4 source code.tar.gz 2026-10-18 258.4 MB
Surface Explorer v1.4 source code.zip 2026-10-18 259.1 MB
Totals: 7 Items   757.3 MB 1

Which file do I need?

  • macOS 27 or later (arm64) — SurfaceExplorer-v1.4-macos.dmg
  • Windows 10/11, 64-bit — SurfaceExplorer-1.4-windows-x64.zip
  • Linux, any x86_64 distribution — SurfaceExplorer-v1.4-linux-x86_64.AppImage
  • Linux, optional — install-linux.sh, adds the AppImage to your applications menu

An iOS build is available on the App Store.

macOS

Open the .dmg and drag the app to your Applications folder. It is signed with an Apple Developer ID and notarized, so it opens normally on first launch — no Gatekeeper workaround needed.

Windows

Extract the zip into a folder of its own and run SurfaceExplorer.exe. The archive has no top-level folder: it holds the executable together with the Qt libraries and the plugin folders it loads at startup, so they all have to stay side by side.

The build is not code-signed, so Windows shows a “Windows protected your PC” notice the first time you run it. Choose More info, then Run anyway.

Linux

Download both SurfaceExplorer-v1.4-linux-x86_64.AppImage and install-linux.sh into the same folder, then run:

:::bash
bash install-linux.sh

It copies the AppImage to ~/Applications, makes it executable and adds it to your applications menu with its icon, so from then on you launch it like any other app. Re-run it to update, bash install-linux.sh --uninstall to remove. No root needed.

To run the AppImage directly instead, make it executable first. A downloaded file carries no permissions, and without this your desktop may hand it to a disk-image tool instead of launching it:

:::bash
chmod +x SurfaceExplorer-v1.4-linux-x86_64.AppImage
./SurfaceExplorer-v1.4-linux-x86_64.AppImage

Requirements

  • GPU with Vulkan 1.0+, Metal, Direct3D 11+ or OpenGL 3.3+
  • Built with Qt 6.10.2

Known issues

Windows / Direct3D. Some computationally heavy presets may fail to render correctly on the Direct3D backend: the application can stop responding and be closed by the system. This happens only on Windows; the same presets work as expected on the other platforms.

Source and bug reports

What's new since v1.3

  • Ray marching: with the Precise marcher, Ray Steps and Step Relax are active again — they still shape the ray's approach and can close holes the precise search would miss. Ambient occlusion no longer depends on the scale factor written in front of the equation, so the 0.1 multiplier no longer darkens the shadows. The x/y/z limits accept the constants A–F and S, like the u/v/w limits, and are saved as written.
  • Fixes: restarting a 4D camera path after Stop no longer makes the slice jump, and switching Shell → Solid → Shell restores the shell thickness instead of dropping it to the minimum.
  • Renderer dock: with Background selected, the shape controls (Base/Phong/Wireframe, wireframe density, Transparency, Light, Headlight, FOV) are greyed out until you select Shape again.
  • Meshes: the Multi Mesh panel of the Renderer dock has a Meshes field with its slider: how many copies of the surface, or of the curve in Solid Curve, to draw. The equations tell the copies apart with mesh (0, 1, 2…), and each copy is a mesh with its own appearance. The field also takes an expression with the constants, such as A*A, so a constant's slider adds and removes copies. The library presets that used a constant to show only some of their meshes (Calabi-Yau, Brieskorn-Pham, Hopf tori, Clifford labyrinths) now use it, and no longer compute the hidden meshes. A script that declares several //MESH_BEGIN sections sets the count itself: the field shows it and is locked, and its tooltip says why.
  • Multi-mesh images: each strip can have its own image. With a strip selected, an image picked in the Library goes onto that strip only, motionless (before it always covered the whole surface), and different strips can show different images. An Animated Images script applied to a strip animates that strip's image; an ordinary procedural texture replaces it. In All the surface image is shown, as before.
  • Multi-mesh textures: with the scope on All, a texture or an image is laid over the whole figure at once (triplanar projection), continuous from one mesh to the next, instead of repeating on every mesh. In Mesh each mesh keeps its own.
  • Library: files and folders can be renamed from the context menu. The Surfaces tab is now called Shapes, since it also holds solid curves and implicit shapes; its folder on disk is still surfaces. Likewise the Surface target of the Renderer dock is now Shape, and the Library commands and save dialogs of that branch say Shape (Save Shape As…, Copy Shape…).
  • Shapes keep their background color: saving a Shape now stores the background color, and opening it brings that color back (before, a Shape always opened on the default dark gray). The background texture is still saved only in Records.
  • Hints: each slider legend says what it acts on — Shape sliders, Texture sliders, Border sliders, Background sliders.
  • Master START/STOP: it reads STOP only when every animated module is running. START turns on whatever is off without touching what already runs, so switching everything on takes one press instead of STOP then START; each module keeps its own button.
  • Solid Curve: the Parametric tab has two sub-tabs, Surface and Solid Curve. In Solid Curve you write a curve X(u), Y(u), Z(u), adding P(u) for a curve in 4D, and the tube around it is drawn; empty fields count as 0. Thickness sets its width: the slider goes up to 3, and a larger value typed in the field widens it, as for the constants. The curve can use the constants and the time t. Tube scenes are saved and reopened like any surface. Several tubes come from a script: on the Solid Curve sub-tab the Script dock describes the curve, returning the point vec4(x, y, z, p) at u; each //MESH_BEGIN section is one tube, with its own u range and an optional thickness:, and mesh tells the tubes apart. Each tube is a mesh of its own, styled from the Renderer dock like those of the other multi-mesh surfaces.
  • Equations dock: the sub-tab buttons fill the dock width; the constant fields are narrower, leaving the sliders more room.
  • Steps above 1000: the Steps slider stops at 1000; a larger value typed in the field widens it, as for the constants (up to about 2000 on desktop and 1500 on mobile devices, fewer on multi-mesh surfaces). Ray Steps in ray marching likewise, up to 5000 on desktop and 2000 on mobile devices.
  • RESET: it brings the scene back to how it opened. When something is moving it asks what to reset: the View (camera, zoom and field of view), the Motions (rotations, camera paths and everything animated by t), or both; while a camera path is running only the motions can be reset, since the view follows the path. Before, it only cleared the view and set the rotations to zero: animations in t went on from where they were, and the zoom (Forward/Backward) stayed.
  • Border: a parametric surface can have a border, a tube along the edges of its domain. In the Renderer dock, Shape and Border choose what the controls act on: with Border selected, the color sliders, Base/Phong/Wireframe, the wireframe densities and the Texture checkbox act on the border alone, and textures picked in the Library go onto the border. Border Thickness sets its width (0 = no border; selecting Border turns on a thin one). Edges that close up (the seam of a torus, the twisted seam of a Möbius strip, the poles of a sphere) get no border. The border is saved with the scene; it is not available in ray marching.
  • Renderer dock layout: the Surface/Background row at the top is gone: Shape and Border head the shape controls, Background heads the background controls. The background shape (Fixed, Sphere, Cylinder, Cube) is enabled only while the background texture is on, and disabled sliders turn grey.

Main fixes

  • Renderer dock after loading an animated surface: a surface whose equations use t (e.g. Warping Torus saved as a surface) no longer leaves Steps, Base/Phong/Wireframe, Light and FOV greyed out until Stop; likewise when a metric script is run after NEW.
  • Border Thickness: a click on the slider track moves it by 0.1 and the arrow keys by 0.01, as for the constants (near the end of the track a click jumped by almost 2).
  • Video recording: the video runs at the same speed as the screen, with no jump when recording starts or stops, or after Stop/Start.
  • Background image lost from records: a saved record could reopen with the default background. Turning the background off now clears it completely.
  • Presets no longer depend on the one opened before: Cross Section equation, background framing, composition fields, transparency and lighting no longer carry over.
  • Records without a setting use its default: camera, motion, 4D observer and background are no longer inherited from the previous record.
  • Transparency: records save the transparency on screen and restore it on load.
  • Discrete constants: Save Shape now keeps them.
  • Multi-mesh records: saving no longer writes an old texture zoom onto the first mesh.
  • Texture on/off: saving in Wireframe keeps the texture; the Texture checkbox shows the selected strip's state.
  • Texture colors: on a strip without its own colors, Color 1/2 show the inherited colors, not those of the previous strip.
  • Relief (displacement) and ray-marching texture: no longer linger after opening a parametric record following a ray-marching one.
  • Hand-written sounds: a mainSound typed in the Sound dock without markers is saved in its own block; before it ended up inside the texture code and the record's texture no longer compiled.
  • Texture scripts not yet run, or that do not compile: Save, Run, Run Sound or picking a sound no longer treat them as applied, and picking a sound no longer wipes them from the editor.
  • Save Texture on Background: saves the background's code and image (in ray marching it saved the surface texture).
  • Surface image: choosing the same procedural background twice in a row (e.g. after switching the background off) no longer drops the surface image from the saved record.
  • Multi-mesh, Run with a strip selected: the strip's texture script is no longer applied to the whole surface.
  • Color 1/2: after running a strip's texture script, the pickers of the default checkerboard stay enabled in All.
  • Constants while editing: a constant (A–F) keeps its value while you rewrite an equation without it; it goes back to 1 only after Run, if the new equation no longer uses it.
  • Constants of a background texture: choosing a background that uses a constant now enables its slider right away.
  • Constants of a texture switched off: the slider is disabled instead of staying on with nothing to move.
  • Constants defined from another: with B = A/10 and equations that use only B, A no longer goes back to 1 at Run (which changed B and the surface).
  • Minimum of a constant: a script's A := min(…) no longer applies to the surface loaded after it.
  • Cross Section: a ray-marching script preset opened after a Cross Section no longer keeps its sub-tab and slicing rotation.
  • Enter on a constant: after opening a record and then a surface, it no longer brings back the record's equations; and it no longer undoes an equation edited on the fly while the animation was running.
  • Composition and constraints not yet run: Enter on a constant no longer applies them halfway (new composition on the previous equations); they wait for Run.
  • Sound between spaced markers: a record whose texture carries its sound between // SOUND_BEGIN and // SOUND_END (with a space) now shows its texture; the sound code stayed inside it and the texture did not compile (e.g. Kerr Spin Animated).
  • Sound saved twice: a record carrying the same sound in both its texture and its background (written by older versions) is now saved with a single copy.
  • Paths after NEW or a new surface: a path written from scratch no longer starts with the view (Center) and speed of the record opened before.
  • Master Start: also starts a path written with a single coordinate other than X, as DEPARTURE does.
  • Reset view: the FOV slider follows the projection back to the scene's field of view (it stayed on the old value).
  • "Unsaved work" prompt: it now compares the scene with the one loaded or last saved. Putting a control back where it was no longer asks to save, and controls that were not tracked (projection, path view, starting a rotation) are now protected.
  • Equations typed but never run: on a preset just opened, text that was never run (or gives an error) no longer triggers the prompt.
  • Texture and background framing after NEW: NEW or a mode switch no longer keeps the zoom, pan and rotation of the previous record's texture and background (the default checkerboard came back zoomed, and saving wrote them into the new scene).
  • Texture checkbox in ray marching: after NEW or a mode switch with Background selected, it no longer stays ticked and labelled "Background Texture".
  • Geodesic flow, conformal factor: a factor using a constant finer than 0.01 (e.g. 200*A with A = 0.005) is no longer read as zero.
  • Script dock, Run button: it stays enabled until what is written has actually been run. Cycling Surface / Texture / Sound, or switching Shape / Background, no longer turns it off on a script that was never run.
  • Surface script typed but never run: after cycling the Script dock it no longer disables the Run buttons of the Equations dock.
  • Enter on a constant while editing a surface script: re-applies the script on screen, not the one still being edited (as it already did for equations).
  • Master Start with an edited surface script: the saved record now carries the script that was run.
  • Ray-marching texture with Background selected: switching the background off no longer stops the surface texture, and Master Start and the texture Run restart it (they looked at the Texture checkbox, which shows the background there).
  • Texture checkbox after a load: loading a surface while Background was selected no longer leaves the Texture checkbox ticked on a scene without texture.
  • Limits written with a constant: a limit such as u max = A or 6.28/C follows the constant's slider; before it kept the value it had when confirmed.
  • Library focus: opening or closing a folder (tap, or double-click on desktop) no longer moves the highlight off the loaded preset, and clicking a folder no longer clears the highlight in the other branches. Right-clicking (long press on mobile) another preset or an empty area no longer moves or clears it either: while the menu is open the clicked item is highlighted and the preset on screen stays grey. A single click on a folder no longer takes the highlight at all, and after dragging a folder (even back to where it was) the highlight returns to the preset on screen, following it if it moved with the folder.
  • Copy and paste of a folder: pasting a folder next to the original now creates the copy with all its content (before nothing was pasted), and a folder can be pasted or dragged into one whose name begins the same (e.g. Paths into Paths2).
  • Multi-mesh record opened after a ray-marching one: the first strip no longer gets a transparency of its own (it stayed opaque when the Transparency slider was lowered, and saving wrote it into the record).
  • Script presets reopened: a constant or a u/v limit changed after Run and saved is kept when the preset is opened again (the script's A := … / u_max := … overwrote it). Script records opened after a metric one no longer lose their u/v limits.
  • Steps after NEW or a tab re-click: restarting in one mode no longer changes the Steps (or Ray Steps) the other mode gets back when you switch to it.
  • Texture of the other mode: a ray-marching texture picked on a parametric surface, strip, border or background (or a parametric texture in ray marching) is refused with a warning, and the scene stays as it is. Before, on the surface it switched mode and replaced the surface with the default one, and on the background it covered the surface image with the checkerboard.

  • Strip image not found: opening a record whose strip image is missing now warns, as for the surface and background images (the strip silently showed the surface image).

  • Ray-marching texture from the Library that does not compile: after the error, the color sliders and switching the Texture checkbox back on work again (they did nothing until the next load or NEW).

  • Constant sliders while editing: typing a constant's letter in an equation no longer unlocks its slider before Run (it moved nothing).
  • u/v/w limits: leaving a limit field while its pair is still incomplete, or clicking NEW, no longer shows an error; Run stays off until both limits are written.
  • Solid Curve, tight bends: where the curve almost turns back (e.g. Lissajous Layers Wave while it animates) the tube no longer ends flat with a notch: the rings gather around the bend and close it with a rounded tip.
  • Meshes slider on an animated scene: moving it no longer stops a surface or curve animated by t (e.g. Lissajous Layers Wave).
  • Hints when picking a texture: a texture taken from the Library shows only its own message; the surface's message no longer comes back at every texture change.
  • Saving into subfolders named like a branch: a record saved in a folder such as Records › Rotations › Surfaces is no longer refused as if it were outside Records (the same for surfaces and textures).
  • Border on and off: faster. Turning the border on no longer recompiles code it does not need, and shaders are compiled only for the graphics system in use, so shapes also load a little faster.
Source: README.md, updated 2026-10-18