Repository navigation
Updates to FORM scripting and interpreting, styling and layout updates to FORM EDITOR, and a loading screen for web deployments. - #94
Merged
Conversation
…orkflow (hot reload - Added FORM parameter metadata and shared controls for integers, toggles, options, and seeds across FORM LAB and Joy Editor. - Added FORM variants, procedural object placements, and shared level preparation and presentation for editor and game consumers. - Introduced embedded assets with native development hot reload, consolidated development editors, and shared render-test utilities. - Added native Play/Stop controls to Joy Editor and expanded project, document, and tab shortcuts across the authoring tools. - Unified styling and layout components around shared design tokens and Archivo fonts \(getting slowly back to the web-based designs\) and fixed the first-frame font registration crash.
…dded theme support via JSON configs, and continuing to consolidate where layout and elements exist.
…e intentional geometry creation/management, removed `userData` data in favor of typed attributes, and added language support for functions, modules, boolean evaluations, and more and more. - Replaced immediate-mode drawing with explicit geometry, typed attributes, named outputs, and native geometry storage. - Added functions, modules, enums, structured control flow, and richer parameter types, with matching script completion and editor controls. - Introduced `.forminst` assets with referenced or packed scripts, overrides, materials, and variants, and integrated dependency loading and saving across the engine and Joy Editor \(similar to Material Instances with respect to Materials in Unreal\). - Renamed FORM LAB and PARTICLE LAB to FORM EDITOR and JOYFX EDITOR and updated tests/workflows to support.
…still in a work-in-progress state. - Added `const` keyword for read-only properties and expanded `copy` function for duplicating a copy in a mutable state. - Replaced `repeat` with index-based iteration over `for` ranges \(Rust-style\) and added `foreach` iteration of arrays with bounded execution. - Updated editor completion, highlighting, recipes, examples, and language references for the new syntax and enum conventions.
…ors to be shared across editors, and iteration on layout/styling for FORM EDITOR. - Changed geometry and instance constants to preserve frozen snapshots while leaving their source variables editable. - Added line editing shortcuts and automatic indentation, improved trackpad scrolling, and fixed browser shortcut and clipboard handling. - Streamlined FORM EDITOR's document naming, status display, recipes, reference pages, output inspection, and dialog dismissal. - Removed workspace maximization from FORM EDITOR and JOYFX EDITOR, kept their headers visible, and standardized camera shortcut buttons across the editors. - Exposed the FORM language catalog and keyword documentation for external tooling. - Miscellaneous editor layout and styling improvements.
This was referenced Oct 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
FORM Language (v2)
constread from a geometry or instance variable now holds a frozen snapshot instead of freezing the variable it came from, solet shape = box(1, 1, 1)stays editable afterconst finished = shape. Fresh values (const shape = box(1, 1, 1)) still freeze in place, and aliases of a constant still cannot edit it.scripts/form-reference.mjs, exported asjoy-engine/form/catalog) also returns each keyword's hover documentation, so tools outside the engine can present the same completion and hover text as FORM EDITOR.constvalues, including geometry and instance aliases, with editable explicit copies. Replacedrepeatwith exclusive integerfor index in start..endloops and added orderedforeach item in collectioniteration. Migrated engine assets, packed instances, editor recipes, completion, highlighting, and references; authored enums use multiline PascalCase entries.output(name, geometry)adds to the result. The pen built-ins (color(r, g, b), one-argumentmaterial,uv,normal,point,triangle,surface,instance, positionalbox/sphere,userData,with userData, andsetUserData) fail with migration messages. Addedmerge,append,place,realize,color(geometry, rgba),material(geometry, material | "PaletteName" | null),addPointattribute records,hasAttribute, andremoveAttribute.true/false/null,AND/OR/NOT(conditions require booleans;number(flag)converts),if/else if/else,match/case, block-scopedletwith=,+=,-=,*=, and/=assignment,enumdeclarations, text comparison, records and lists with indexing anditemCount,fnfunctions whose arguments are copies unless declaredref, anduse "path.form" as aliasmodules.param kind = Kind.tower), and the evaluator reports wrong-typed values by kind ("Expected a number; found text.").GeometryData::vertex_attributesandtriangle_attributes(AttributeColumn,vertex_record, andtriangle_record), replacingGeometryData::user_data. Named outputs are typedNamedOutputvalues whose snapshot converts to JSON on demand (OutputValue::json); serialized results keep the same shape.form_document_symbols, theBUILTINScatalog, andScriptEditor::with_document_symbols).scaleis FORM's standard XYZ vector.Script Editing
#comments, Enter keeps indentation (deeper after an opening bracket), and}lines up with its block. Trackpad scrolling locks to the predominant axis, and hover popups wait until scrolling stops.z,s, ora), and copy, cut, and paste reach text fields: winit cancelled those key presses, which suppressed the browser's clipboard events.FORM EDITOR
wave-study.form · FORM SCRIPT) with an unsaved-edits dot, replacing the field that edited the script's project name. Save and Export suggest the file's name.MaximizeMode::Workspaceis replaced byMaximizeMode::None, which FORM EDITOR and JOYFX EDITOR use (JOYFX EDITOR's header and project bar also stay visible).output/inspectsnapshot), with a note on how the choice relates to Export instead of "Full build · export source".components::shortcut_button, which shows a key in an outlined keycap; FrameFand Reset0in FORM EDITOR and JOYFX EDITOR and Joy Editor's level FRAMEFuse it.FORM Instances
.formlabdocuments to.forminstFORM instances (FormInstance, version 2) that reference a.formscript by relative path ("form") or pack one ("source"), with overrides, materials, and variants. FORM EDITOR opens version 1.formlabfiles as packed instances. The engine structures and form-building presets now share onebuilding.form.FormAssetLibrary::resolveandresolve_assettake a reader for referenced scripts and modules, and their cache keys include those files. Hosted tools receive a project file reader (ToolFileReader,AuthoringTool::set_file_reader), documents carry their project path (ToolDocument::path), and Joy Editor saves an instance's script with it (save_dependencies).rendercomponent's asset kinds areformandforminst(component_asset_kind::FORM_INSTANCE).Tool Names
tools/form-editor, packageform-editor) and PARTICLE LAB is now JOYFX EDITOR (tools/joyfx-editor, packagejoyfx-editor), across packages, UI, and docs.Browser Loading Screen
scripts/rust/web-status.css, whichbuild-web.mjsinlines into every page alongside copies of the Archivo fonts, and which hosting development servers can serve for matching building and update screens. Titles such as"LUNA · The Hollow Observatory"split into a heading and subtitle.data-state="failed"and wait for it to clear before capturing.Authoring UI
assets/ui/theme-default.json, with shared dimensions inassets/ui/layout.json. Cargo generates native/browser constants directly from those files and rejects invalid values. Removed the duplicated Rust definitions and comparison test; migrated editor, lab, and development widgets to separatetheme::colorsandtheme::layoutvalues and renamedapply_authoringtoapply_editor.joy-displaystartup panic in Joy Editor and the labs while preserving games' default body font.FORM Assets in Levels
meta(...):label,group,info,kind(int,bool,seed, orenum), andoptions. Whole-number kinds round overrides, booleans accept JSON flags, andjoy_engine::form::parameter_controland friends read the descriptors.toggle_control,choice_control, andseed_controlin the authoring kit).FormAssetLibrary::resolve_assetreturns aFormAssetwith the mesh and its placements: the points a script tags with user data. Placements naming anobjecttemplate spawn level entities (<parent>/<index>, one level deep, at most 4,096 per asset), which Joy Editor shows and games simulate.rendercomponents take an optional FORM LABvariant;AssetScene::prepare_levelbuilds a run-ready level from authored documents andAssetScene::followpresents runtime entities with the prepared assets.Hot Reload and Development
GameAssetswithgame_assets!andsource_root!: games embed text assets and, in native development builds, read them from the project folder and poll for edits (seedocs/hot-reload.md).DevEditors,DevEditorsOptions,TuningPanel, anddevelopment_file, the standard post-processing and TUNE editors games attach, plusConfigField::new.HeadlessShell::new_or_skip,HeadlessShell::save_capture, andregion_mean_colorreplace the helpers every game's render tests carried.Joy Editor
npm run dev) in its own window, with Stop, and ends it when the editor closes; saved assets reach games that useGameAssetslive.Authoring Look
display,title,caption, andstatus); buttons and headings use the semibold face.assets/theme/joy-tokens.json, verified against the Rust constants by a test, and gained the workspace surfaces and development overlay fills. Joy Editor's private palette and the development dock's own colors now read the shared tokens, and the editor's literal type sizes follow the token scale.app_title,header_rule,project_marker,status_bar,list_row,caption, and letter-spacedspacedtext); Joy Editor, FORM LAB, and PARTICLE LAB draw their titles with it, PARTICLE LAB's footer is the shared status bar, andpanel_headinguses the real fonts.