Construct render export

Image and video export from the Construct editor

Overview

Construct's render export feature renders the active scene to disk as still images, image sequences, or videos. Rendering happens in the background on a dedicated worker thread; the editor stays fully interactive while jobs run.

The whole UI lives in the Rendering window, opened from the toolbar's Rendering button. The window is one settings view:

  • The preset bar at the top applies a preset to the render job.
  • The render settings: the Output, Raymarch, Path tracing and Shading rows of the construct settings, at the Render job level, which the scene file keeps. The settings page shows the same rows, so a change in one place is the same change in the other.
  • The frame range and the frame rate of the scene's animation clock.
  • The plan line: the size, the frame count and the first file, or the reason the render cannot be queued.
  • Measure and Queue render, with the cost of a frame, and Recent renders.

The walkthrough is Export a rendered animation.

Render presets

A render preset is a named bundle of render settings. A preset writes only the settings it holds at the render-job level, so your frame range, your codec and your file names stay. Once saved, the same preset can be applied to any scene and rendered at any resolution.

  • Storage: JSON files at config/presets/construct/<name>.json on the sentient path, resolved by the libfs file-engine handler to the active sentient's hive. With no sentient mounted, the same path under the app data folder is used. Each file is a level file of the construct schema (schema, level, values), and the fields that are not settings ride under render. The store is config::ui::PresetStore, so these are also the presets of the settings page and of config.preset.*. Draft, Standard and Final are built-in presets of the construct schema: they set the path-tracing samples, the noise threshold and the bounces.
  • Per-job values: the size, the frame rate, the frame range, the output format and the file templates are rows of the render job, not of a built-in preset. They travel with the scene.

Filename template DSL

The file template rows accept a small token language so each frame in a sequence can have a unique path. Tokens:

Token Expands to
%f, %4f, %6f frame number (zero-padded; default 4 digits)
%Y %M %D year (4), month (2), day (2)
%h %m %s %z hour, minute, second, millisecond
%e the extension of the output format (png, mp4, mov), as %{format}
%{<expression>} any expression evaluated per frame
%% literal percent

Variables visible to %{...}: time (auto-set to frame / fps), frame, firstFrame, lastFrame, fps, width, height, format.

The datetime tokens are captured once at queue press, so every frame in a sequence shares the same folder timestamp.

Three template rows hold one template each:

  • Image file — an image format and one frame
  • Image series files — an image format and more than one frame
  • Video file — the media type Video

Switching the media type or the frame range uses the right row. Set the rows at the New scenes level on the settings page to change where every new scene renders to.

Output formats

The format lists come from what this computer can encode:

  • ImageFormatProbe::availableFormats() — filters QImageWriter::supportedImageFormats() down to {PNG, JPG, EXR, TIFF}.
  • The codec check of this computer, which runs at startup, gives the video containers and their codecs. While it runs, the Container and Codec lists are empty. construct.render.capabilities reports the same lists.

Formats the running build cannot encode never appear in the lists. If a plugin disappears between the plan and the job, the worker still fails cleanly through the libbatch error mechanism.

Background execution

Pressing Queue render snapshots the scene and its render settings into a ConstructSnapshot, stashes it under a fresh UUID in a BatchContextStore, and submits a construct/render_export BatchJob. The user can edit, save, or close the scene immediately — the render worker reads only the frozen snapshot.

The worker writes one image per frame (or feeds frames into QMediaRecorder for video) and reports progress through the queue. Output paths, libbatch error messages, and per-frame logs all surface in the Jobs panel (BatchActivity in the node window).

Existing-file policy

  • Overwrite (default) — replaces any pre-existing file.
  • Skip — for single files, the job no-ops; for sequences, only missing frames are rendered. Useful for resuming a canceled run.

Disk-space pre-flight

The plan estimates the size of the output. When the disk of the output folder has less free space than that, the plan line names both sizes and Queue render stays gray. A smaller size multiplier or a shorter range fixes it. Measure renders three frames to give the time of one frame and of the whole range.

Limitations

  • Audio: not supported in this phase — video output is silent.
  • Path-traced sample budget: the Path tracing rows and the built-in presets set the samples, the noise threshold and the bounces of each frame. There is no time-per-frame budget.
  • Keyframe animation: there is no keyframe timeline yet. Drive animation by binding an expression to a parameter and referencing time (or frame) — both advance per frame during a sequence render.
  • Distributed rendering: Render on the farm renders the frames on other machines that have a GPU, and this computer writes the files. See Render on other machines.

Files

The files are in three folders below libconstruct/construct/:

  • ui/: the window and its content.
  • batch/rendering/: the worker, the snapshot, the filename engine, the two encoders and the probes.
  • batch/: the generic store.
Layer File
Window RenderingOptionsWidget.{hpp,cpp}
Window content: settings view, plan, cost, Queue and Recent renders RenderExportTab.{hpp,cpp}
Job planner RenderJobBuilder.{hpp,cpp}
Worker ConstructRenderWorker.{hpp,cpp}
Snapshot ConstructSnapshot.{hpp,cpp}
Filename engine FilenameTemplate.{hpp,cpp}
Image encoder ConstructImageEncoder.{hpp,cpp}
Video encoder ConstructVideoEncoder.{hpp,cpp}
Image format probe ImageFormatProbe.{hpp,cpp}
Generic store BatchContextStore.hpp
Topics
reference construct render export video