DreamFXLang
Tooling

Editor integration

The Tools menu, the level toolbar, Content Browser actions, the Niagara editor toolbar, the toasts, the file watcher and the settings.

Every place DreamFX attaches itself to the Unreal editor UI.

Registered byDreamFXEditor at module startup, through UToolMenus::RegisterStartupCallback
ToolMenu ownerDreamFXEditor
Suppressed by-NoDreamFXEditor, and by every commandlet run
SettingsProject Settings ▸ Plugins ▸ DreamFX

Registration is idempotent — a second pass adds nothing — and is skipped while the editor is shutting down.

Every entry calls the same code the commandlet calls. A menu is an entry point, never a second implementation: if Rebuild DFX works, dfx build -All works, and vice versa.

Tools menu

Tools ▸ DreamFX, extending LevelEditor.MainMenu.Tools, section DreamFX.

LabelEffect
Rebuild DFXQueues every .dfs / .dfe / .dfm into the watcher's build queue, exactly as if each had been saved. One summary toast when the queue drains
Verify DFXVerifies every source against its generated asset. Writes nothing. One toast: clean, or a drift count pointing at the Output Log
Open DreamFX Workspace (VSCode)Rewrites DFX/DreamFX.code-workspace from the current source roots, then launches it

The Level Editor toolbar carries two of the same: DFX (= Rebuild) and the workspace button.

Content Browser context menus

Added into the stock GetAssetActions section of the per-class asset context menu.

Every DreamFX context-menu entry requires exactly one selected asset. With two or more selected the section is empty and nothing says why. Right-click a single asset.

Niagara System

The contents depend on whether the asset carries a DreamFX provenance stamp, because a generated asset and an imported one need opposite things.

Without provenance (an asset DreamFX did not make), the Decompiler section:

EntryEffect
Export .dfsDecompiles to <DecompiledOutputDirectory>/<package path>.dfs and opens it. The file rebuilds a mirror under Decompiled/; the asset is never modified
Adopt (take over as a DFX source)See Export vs Adopt

With provenance, the Source section:

EntryEffect
Open SourceOpens the .dfs named in the stamp
Rebuild from SourceQueues that one file
VerifyChecks this asset against its source

Niagara Emitter

One entry — Export .dfe — because a standalone emitter has no round trip: a .dfe generates no asset of its own, so there is nothing to stamp, rebuild or verify.

The export copies the emitter into a throwaway /Temp host system, reads it there, and writes the file. That detour is what makes it honest rather than a guess: every reader in the external edit API addresses through an owning system.

Niagara system editor toolbar

A DreamFX combo button on AssetEditor.Niagara.ToolBar, whose content is the same two-state System submenu.

AssetEditor.Niagara.ToolBar is shared. FNiagaraSystemToolkit, FNiagaraSimCacheToolkit, FNiagaraParameterDefinitionsToolkit, FNiagaraParameterCollectionToolkit and FNiagaraStatelessEmitterTemplateToolkit all return the toolkit name "Niagara". So the entry first looks for a UNiagaraSystem among the objects being edited and adds nothing when there is none — opening a Sim Cache shows no DreamFX button.

Toasts

ToastCondition
DreamFX: {Built} built, {Skipped} up to date.nothing failed
DreamFX build failed: {FirstError} + Open in VSCodeone or more failed; the link jumps to the first error's file, line and column
DreamFX found no .dfs/.dfe/.dfm sources to rebuild.no sources at all
DreamFX: {N} source(s) verified, all assets in step.verify clean
DreamFX: {Drifted} of {N} source(s) out of step ({Failed} failed).verify found drift

The diagnostic has carried a position all along; before this it only reached the log.

The file watcher

Every DFX/ root is watched. Save → queued → the debounce ticker builds modules, then emitters, then systems — the same order the commandlet uses, and load-bearing when a .dfm and the .dfs that calls it are queued together.

A batch over the Bulk Rebuild Threshold (default 8) is offered rather than built — the reasoning and the measurements are in the daily loop.

Settings

Project Settings ▸ Plugins ▸ DreamFX, stored in Config/DefaultEditor.ini.

SettingDefaultEffect
Open Workspace In New WindowtrueOnly the workspace launcher reads it
Decompiled Output DirectoryDFX/DecompiledWhere Export .dfs / Export .dfe write, relative to the project directory. Ordinary source: discovered, watched and built — but files here must name an asset in the Decompiled/ namespace (DFX8013)
Bulk Rebuild Threshold8A batch larger than this is offered rather than built

Turning the integration off

UnrealEditor.exe "<Project>.uproject" -NoDreamFXEditor
DisabledStill active
Every menu, toolbar and context-menu entry on this pageThe -run=DreamFX commandlet, which never uses any of it
The source watcher and save-to-rebuildThe parser, generator, decompiler and settings object
The generated-asset guardAssets already generated and saved on disk

A commandlet run reaches the same state by another route: IsRunningCommandlet() returns true and the module registers nothing.

On this page