Commit graph

901 commits

Author SHA1 Message Date
Kelsi
0075494109 refactor(editor): extract 12 composite mesh primitives into cli_gen_mesh.cpp
Moves the recently-added composite-prop mesh handlers (rock,
pillar, bridge, tower, house, fountain, statue, altar, portal,
archway, barrel, chest) into their own translation unit. These
12 handlers were the most contiguous block of similar-shaped
mesh code in main.cpp.

Other mesh handlers (--gen-mesh dispatcher, fence, tree, grid,
stairs, disc, tube, capsule, arch, pyramid, from-heightmap,
textured) still live in main.cpp and may be migrated in
subsequent batches.

main.cpp drops 24,270 → 22,681 lines (-1,589). Behavior
verified by re-running rock/chest/archway/fountain.
2026-05-08 22:19:41 -07:00
Kelsi
ec9c7898d2 feat(editor): add --gen-texture-tile square stone tile pattern
Per-cell pattern: each pixel falls into a tile cell with grout
on every grid edge. Tiles get a stable per-tile shade jitter
(via integer-cell hash) so adjacent tiles look distinct rather
than identical. Grout is the constant separator color.

First new texture added directly to cli_gen_texture.cpp instead
of main.cpp — proves the modular pattern works for new
additions, not just extractions.

Defaults: tilePx=32, groutPx=2. Useful for floors, plaza
paving, dungeon walls. Brings the procedural texture pattern
set to 23.
2026-05-08 22:01:31 -07:00
Kelsi
36cc2ee11d refactor(editor): extract remaining 12 texture generators into cli_gen_texture.cpp
Completes the texture-family extraction started in 6ea2dfcf.
Moves the 11 older simpler texture handlers (gradient, noise,
noise-color, radial, stripes, dots, rings, checker, brick, wood,
grass, fabric) into the existing cli_gen_texture.cpp module.
Each previously had its own ~30-line copy of parseHex; all now
use the shared helper at file scope.

Also fixed a pre-existing match-order issue: the dispatcher
checks --gen-texture-noise-color before --gen-texture-noise so
the prefix-match doesn't shadow the longer name.

main.cpp drops 25,494 → 24,270 lines (-1,224). All 19 texture
generators (12 just-extracted + 7 from the previous batch) now
live in their own translation unit. Behavior verified by
re-running gradient/noise/noise-color/checker/fabric.
2026-05-08 21:41:24 -07:00
Kelsi
58d1e40117 feat(editor): add --gen-mesh-chest treasure chest primitive
Composite procedural chest: rectangular body box + slightly
inset lid box on top + 3 thin iron bands wrapping around the
body (15% / 50% / 85% along width) + a small lock plate on
the front face. 6 boxes assembled into one batch.

Defaults: 1.4 × 0.9 × 0.9 body with 0.25-tall lid. Useful
for dungeon loot, room decoration, quest objectives. Brings
the procedural mesh primitive set to 27.
2026-05-08 21:19:51 -07:00
Kelsi
6ea2dfcf8c refactor(editor): extract 7 newer texture generators into cli_gen_texture.cpp
Moves the Worley/cellular-noise-based texture handlers
(--gen-texture-cobble, -marble, -metal, -leather, -sand,
-snow, -lava) into their own translation unit. Each handler
previously had its own ~33-line copy of the parseHex lambda;
all 7 copies are replaced with a single shared parseHex
helper at file scope.

Older simpler generators (gradient/noise/radial/stripes/dots/
rings/checker/brick/wood/grass/fabric) still live in main.cpp
and will be migrated in subsequent batches.

main.cpp drops 26,286 → 25,494 lines (-792). Behavior
unchanged across all 7 handlers (re-verified).
2026-05-08 20:59:02 -07:00
Kelsi
6272e58212 feat(editor): add --gen-texture-lava molten-rock pattern
Worley cellular noise where each cell is a chunk of cooled
crust and the inter-cell boundaries glow as bright cracks of
exposed magma. Each pixel finds its 2 nearest jittered cell
centers; pixels close to the boundary (small gap between
distances) become hot, with a soft penumbra falling off into
the dark crust interior.

Defaults: crackScale=32px, seed=1. Useful for volcanic zones,
elemental dungeons, lava lakes. Brings the procedural texture
pattern set to 22.
2026-05-08 20:33:45 -07:00
Kelsi
68bded4f20 refactor(editor): extract printUsage into cli_help.cpp
Pulls the 597-line block of printf calls that emits the --help
text out of main.cpp into its own translation unit. printUsage
is the longest single function in main.cpp by far and was pure
boilerplate (no logic, just a flat list of help lines).

Function moved verbatim to wowee::editor::cli::printUsage; all
6 in-tree callers (--list-commands, --info-cli-stats,
--info-cli-categories, --info-cli-help, --validate-cli-help,
and the bare --help/-h handler) updated to the namespaced name.
The CLI-meta commands continue to capture printUsage's stdout
the same way, so behavior is identical (verified by re-running
--validate-cli-help, --info-cli-stats, --list-commands).

main.cpp drops 26,650 → 26,286 lines (-364 net; -597 from the
removal, +233 from the include and namespace-prefixing the
six call sites... wait, no, +6). Actually main.cpp net delta
matches the body extraction.
2026-05-08 20:12:15 -07:00
Kelsi
637a5d1e74 feat(editor): add --gen-mesh-barrel cooper-style cask primitive
Cylindrical body with a smooth cosine-bulge radius profile
(topR at the rims, midR at the middle — the classic stave-
cooper barrel silhouette), plus 2 raised hoop bands at 25%
and 75% of the height for the iron straps that hold staves
together.

Defaults: rim=0.4, bulge=0.5, height=1, hoop=0.06. Useful
for tavern decoration, cargo, treasure containers, dungeon
clutter. Brings the procedural mesh primitive set to 26.
2026-05-08 19:49:19 -07:00
Kelsi
155bb1619c fix(editor): un-shadow zone mesh detail view as -detail variant
Mirrors the --list-project-meshes-detail rename from 976549fe.
After the c0f2ab75 inventory extraction, the older per-mesh
sorted-by-tris listing was shadowed by the per-zone aggregate
that now lives in cli_zone_inventory.cpp.

Renames the older handler to --list-zone-meshes-detail (and
updates its help text + kArgRequired entry) so both views
coexist:
  --list-zone-meshes        — per-zone aggregate (extracted)
  --list-zone-meshes-detail — sorted-by-tris listing

Removes the last duplicate-flag dead code from main.cpp.
2026-05-08 19:28:18 -07:00
Kelsi
bb8580068b feat(editor): add --gen-texture-snow with sparkle pass
Some checks are pending
Build / Build (arm64) (push) Waiting to run
Build / Build (x86-64) (push) Waiting to run
Build / Build (macOS arm64) (push) Waiting to run
Build / Build (windows-arm64) (push) Waiting to run
Build / Build (windows-x86-64) (push) Waiting to run
Security / CodeQL (C/C++) (push) Waiting to run
Security / Semgrep (push) Waiting to run
Security / Sanitizer Build (ASan/UBSan) (push) Waiting to run
Cool-white base with low-frequency cosine luminance variation
(soft uneven powdery look) plus per-pixel jitter, then a
sparkle pass scatters bright single-pixel highlights at the
configured density (the "ice crystals catching light" effect).

Defaults: density=0.005 (~0.5% of pixels sparkle), seed=1.
Useful for winter zones, snowy mountains, ice caves, frozen
wastes. Brings the procedural texture pattern set to 21.
2026-05-08 19:07:41 -07:00
Kelsi
a773654be5 refactor(editor): extract project inventory into cli_project_inventory.cpp
Pairs with the per-zone inventory module from c0f2ab75. Moves
the five project-wide inventory handlers into their own file:

  --list-project-meshes        (per-zone WOM aggregate)
  --list-project-meshes-detail (per-mesh sorted listing)
  --list-project-audio         (per-zone WAV aggregate)
  --list-project-textures      (per-zone + global texture refs)
  --info-project-summary       (BOOTSTRAPPED/PARTIAL/EMPTY rollup)

All five enumerate zones the same way; consolidated that into
a shared enumerateZones() helper at file scope.

main.cpp drops 27,200 → 26,650 lines (-550). Behavior unchanged
across all 5 commands (verified against /tmp/proj_starter).
2026-05-08 18:47:06 -07:00
Kelsi
c0f2ab7515 refactor(editor): extract per-zone inventory into cli_zone_inventory.cpp
Continues the modularization. Moves the four per-zone inventory
handlers into their own file:

  --list-zone-meshes    (WOM stats)
  --list-zone-audio     (WAV header parse)
  --list-zone-textures  (texture-ref histogram)
  --info-zone-summary   (BOOTSTRAPPED/PARTIAL/EMPTY status)

Each consumes a trailing --json flag the same way; consolidated
that check into a consumeJsonFlag helper at the top.

main.cpp drops 27,445 → 27,200 lines (-245). Per-zone inventory
behavior unchanged (re-verified all 4 commands).

A pre-existing duplicate --list-zone-meshes handler (the older
detailed per-mesh listing, similar to the --list-project-meshes
collision fixed in 976549fe) is now dead code in the in-line
chain since the extracted module dispatches first. Will rename
or remove that duplicate in a follow-up cleanup.
2026-05-08 18:24:01 -07:00
Kelsi
adc01ead1e feat(editor): add --gen-texture-sand desert/dune pattern
Per-pixel salt-and-pepper grain jitter (the individual sand
grains) overlaid with wide sinusoidal ripple bands aligned
along an offset that drifts smoothly across rows (the wind-
formed dune ridges). Result reads as windswept beach or
desert.

Defaults: rippleSpacing=24px, seed=1. Useful for desert
zones, beaches, oases, dungeon floors. Brings the procedural
texture pattern set to 20.
2026-05-08 17:59:55 -07:00
Kelsi
a39f4e9b43 refactor(editor): extract README generators into cli_readmes.cpp
Continues the modularization. Moves --gen-zone-readme and
--gen-project-readme into their own translation unit using the
established handle<Family> dispatch pattern. Consolidated the
trailing --out flag parser into a single parseOutFlag helper
(was duplicated between the two handlers).

main.cpp drops 27,736 → 27,445 lines (-291). Behavior unchanged
(verified by re-generating README and PROJECT.md, contents
identical to pre-refactor output).
2026-05-08 17:36:10 -07:00
Kelsi
ac17d04f8c refactor(editor): extract audit family into cli_audits.cpp
Continues the modularization. Moves the four audit handlers
(--validate-zone-pack, --validate-project-packs, --info-zone-deps,
--info-project-deps) into their own file using the same
handle<Family>(int& i, int argc, char** argv, int& outRc) pattern.

Side-cleanup: the two project-scope audits had identical
subprocess-fanout structure (enumerate zones → run per-zone
command → tally PASS/FAIL → print summary). Consolidated that
into a shared runPerZoneAudit helper. Saves ~80 lines of
duplicated dispatch code.

main.cpp drops 28,070 → 27,736 lines (-334). Audit family is
fully self-contained (~330 lines), behavior unchanged
(verified all 4 commands against existing test zones).
2026-05-08 17:12:10 -07:00
Kelsi
774dab9330 refactor(editor): extract zone-pack orchestrators into cli_zone_packs.cpp
Continues the modularization started in 6c9ab6fa. Moves the four
pack-orchestrator handlers (--gen-zone-texture-pack, -mesh-pack,
-starter-pack, --gen-project-starter-pack) into their own file
following the same handle<Family> pattern.

Side cleanup:
  - Consolidated the duplicated --seed flag parser into a single
    parseSeedFlag helper
  - Consolidated the std::system + > /dev/null wrap into runSilently

main.cpp drops 28,329 → 28,070 lines (-259). Pack family is fully
self-contained (~260 lines), behavior unchanged (verified by
re-running gen-zone-starter-pack and confirming 6 PNGs + 5 WOMs).
2026-05-08 16:46:14 -07:00
Kelsi
6c9ab6faed refactor(editor): extract gen-audio-* handlers into cli_gen_audio.cpp
main.cpp had grown past 28k lines, with each new procedural-
generation command adding 100-200 lines to the inline if/else
dispatch chain. This commit starts breaking that up by moving
the four audio-related handlers (--gen-audio-tone, -noise,
-sweep, --gen-zone-audio-pack) into their own translation unit.

Pattern established here for future family extractions:

- Family lives in cli_<family>.{hpp,cpp}
- Single dispatch entry point: bool handle<Family>(int& i, int argc,
  char** argv, int& outRc) — true if matched (writes outRc), false
  to fall through.
- main.cpp's argv loop calls each family's dispatcher first and
  returns its outRc on match, before the legacy in-line chain.

Side-benefit: consolidated the duplicated 25-line WAV header
writer + 5ms attack/release envelope into shared helpers
(writeWavMono16, applyEdgeEnvelope) at the top of the new file.

main.cpp drops from 28,943 → 28,329 lines (-614). Audio family
is fully self-contained (~440 lines), behavior unchanged
(verified by re-running tone/noise/sweep + zone-audio-pack).
2026-05-08 16:19:30 -07:00
Kelsi
9365792c57 feat(editor): add --gen-mesh-archway semicircular arched doorway
Two cylindrical pillars hold up a curved keystone vault: the
vault is a series of N angular wedge segments tracing a half-
circle from pillar-top to pillar-top. Each wedge has inner +
outer radial faces and front/back side caps.

Defaults: 3w × 3h pillars, thickness=0.4, 12 arch segments.
The fancier sibling of --gen-mesh-portal (flat lintel) — the
archway gives a temple/cathedral aesthetic. Brings the
procedural mesh primitive set to 25.
2026-05-08 15:49:05 -07:00
Kelsi
91b667991a feat(editor): add --info-project-deps project-wide ref audit
Project-wide companion to --info-zone-deps. Fans out the
per-zone broken-reference audit across every zone via
subprocess (defers to the canonical resolution logic so
behavior stays consistent) and reports per-zone PASS/FAIL
plus a project rollup. Exits non-zero if any zone has a
broken texture reference — designed as a CI gate.
2026-05-08 15:16:00 -07:00
Kelsi
28b02a31ac feat(editor): add --gen-mesh-portal doorway frame primitive
Procedural doorway: two vertical post boxes plus a horizontal
lintel box across the top. Posts run along the Z axis (so
width spans Z), the opening faces +X. Pass lintelHeight=0
to skip the lintel for two free-standing posts.

Defaults: 2.5w × 4h, post thickness 0.4, lintel 0.5. Useful
for entrances, gates, magical portals, ruins, walls. Brings
the procedural mesh primitive set to 24.
2026-05-08 14:42:56 -07:00
Kelsi
31fa590c9d feat(editor): add --info-zone-deps broken-reference audit
Walks every WOM in a zone, collects texture references from
each model's texturePaths, and checks whether each path
resolves to a real file. Tries 4 candidate paths per ref
(as-is, relative to zone, in textures/, alongside the WOM)
before flagging as missing.

Catches "WOM was added but its texture wasn't copied into
textures/" mistakes before runtime. Exits 1 if any reference
is unresolved — suitable for CI.
2026-05-08 14:10:12 -07:00
Kelsi
484ac06c85 feat(editor): add --gen-texture-leather pebbled grain pattern
Cellular Worley noise at small grain scale: each "pebble" cell
darkens at its boundary with neighbors (the irregular bump
shading characteristic of fine-grain leather), with per-cell
tint variation so the surface doesn't read as uniform.

Defaults: grainSize=4px, seed=1. Useful for armor, saddles,
chairs, book bindings, scabbards. Brings the procedural
texture pattern set to 19.
2026-05-08 13:38:00 -07:00
Kelsi
7e19178566 feat(editor): add --gen-mesh-altar stepped round altar primitive
Procedural altar: stack of N stepped cylindrical discs, each
one wider and shorter than the next so the silhouette descends
like a wedding cake. The top disc is the altar surface; base
discs widen out to anchor the structure visually.

Skips the bottom cap on every disc except the lowest (saves
~24 tris per disc since each is hidden by the next one below).

Defaults: topR=0.7, topH=0.3, 3 steps, stride=0.3. Pairs
naturally with --gen-texture-marble for a temple aesthetic.
Brings the procedural mesh primitive set to 23.
2026-05-08 13:06:22 -07:00
Kelsi
4acf4612af feat(editor): add --gen-texture-metal brushed-metal pattern
Per-pixel white noise heavily blurred along one axis (long
brush strokes) and lightly along the other (thin variation
across strokes), then contrast-stretched and applied as a
multiplicative tint on the base color. Result: long thin
streaks of varying brightness — the visual signature of
brushed steel/aluminum/iron.

Defaults: horizontal orientation, seed=1. Useful for armor,
weapons, machinery, sci-fi panels. Brings the procedural
texture pattern set to 18.
2026-05-08 12:31:54 -07:00
Kelsi
d9f16547ec feat(editor): add --gen-project-readme auto-doc PROJECT.md
Project-level companion to --gen-zone-readme. Writes PROJECT.md
with a per-zone status table (BOOTSTRAPPED/PARTIAL/EMPTY plus
biome and per-category counts) and a project-level rollup
(total zones, assets, bytes). Pairs naturally with the per-zone
README — running both gives self-documenting content at every
level.
2026-05-08 12:00:28 -07:00
Kelsi
925f064eb1 feat(editor): add --gen-mesh-statue humanoid placeholder
Procedural statue silhouette: square pedestal block + tall
narrow body cylinder + UV-sphere head. Reads as a statue
without needing limb geometry. The head sphere is 16×12 lat/lon
so silhouette stays smooth at distance.

Defaults: pedestal=1.0, bodyH=2.5, headR=0.4. Useful for
monuments, hero statues, plaza centerpieces, religious
shrines. Brings the procedural mesh primitive set to 22.
2026-05-08 11:29:26 -07:00
Kelsi
9b10440588 feat(editor): add --gen-zone-readme auto-generated manifest
Some checks are pending
Build / Build (arm64) (push) Waiting to run
Build / Build (x86-64) (push) Waiting to run
Build / Build (macOS arm64) (push) Waiting to run
Build / Build (windows-arm64) (push) Waiting to run
Build / Build (windows-x86-64) (push) Waiting to run
Security / CodeQL (C/C++) (push) Waiting to run
Security / Semgrep (push) Waiting to run
Security / Sanitizer Build (ASan/UBSan) (push) Waiting to run
Writes README.md to a zone (or to --out path) with a Markdown
asset table covering textures (PNG bytes), meshes (verts/tris/
bones/batches/bytes), and audio (sample rate + duration). Reads
zone.json for the friendly map name and biome.

Saves the manual README maintenance every time content changes.
2026-05-08 10:58:28 -07:00
Kelsi
1ea5b5946d feat(editor): add --gen-texture-marble veined stone pattern
Marble pattern via warped sinusoidal veining (the canonical
"marble shader"): take a sine wave, warp its input by smooth
multi-octave noise, raise |sin| to a high power so the bright
vein bands stay narrow. Result: irregular bright veins on a
base color with low-freq variation across the texture.

Defaults: sharpness=8, seed=1. Useful for floors, statues,
cathedral walls, ornate furniture. Brings the procedural
texture pattern set to 17.
2026-05-08 10:27:34 -07:00
Kelsi
688ef1c9fd feat(editor): add --info-project-summary status table per zone
Project-wide companion to --info-zone-summary. Walks every
zone in <projectDir>, classifies each as BOOTSTRAPPED (textures
+ meshes + audio all non-empty), PARTIAL (some categories), or
EMPTY (none), and shows per-category counts in a status table
with a project total at the bottom.

Quick "what shape is the whole project in" view that pairs
naturally with --validate-project-packs (which actually loads
and verifies every asset).
2026-05-08 09:58:29 -07:00
Kelsi
91b4a29ba9 feat(editor): add --gen-mesh-fountain basin + spout primitive
Procedural fountain: low cylindrical basin with a narrower
spout column rising from its center. Solid (not hollow) for
simplicity but still reads as a fountain because of the spout
silhouette. Cylinder helper builds side ring + top/bottom
caps so basin and spout share the same construction.

Defaults: basin r=1.5 h=0.5, spout r=0.2 h=1.5. Useful for
town squares, plazas, garden centerpieces. Brings the
procedural mesh primitive set to 21.
2026-05-08 09:29:02 -07:00
Kelsi
d62d748a96 feat(editor): add --info-zone-summary one-glance health digest
Compact per-zone status command. Reads zone.json for the
friendly map name, scans textures/, meshes/, audio/ for asset
counts and total bytes per category, and assigns a status:
BOOTSTRAPPED (all 3), PARTIAL (some), or EMPTY (none).

Lighter-weight than --validate-zone-pack (which loads + sanity-
checks every WOM/PNG/WAV) — useful for quick "what shape is
this zone in" checks during interactive editing.
2026-05-08 08:59:59 -07:00
Kelsi
731553dc25 feat(editor): add --gen-texture-cobble cobblestone street pattern
Worley-style cellular pattern: each pixel finds its nearest
"stone center" in a perturbed grid (3x3 neighborhood search).
Pixels with a small gap between closest and second-closest
center become mortar boundaries; everything else is the stone
face with per-stone tint variation and radial darkening for a
3D rounded-stone look.

Defaults: stone=24px, seed=1. Useful for streets, plazas, town
squares. Brings the procedural texture pattern set to 16.
2026-05-08 08:30:22 -07:00
Kelsi
976549fea7 fix(editor): un-shadow project mesh detail view as -detail variant
Batch 34's --list-project-meshes (per-zone aggregate) introduced
a flag collision with a pre-existing per-mesh sorted listing
that's been in the codebase. The dispatch chain ran the new
handler first, leaving the older detail view as dead code.

Resolves the duplicate by renaming the older handler to
--list-project-meshes-detail. Both views are now reachable:
the per-zone aggregate stays under the simpler name (covers
the common "how heavy is each zone" case), and the per-mesh
sorted-by-tris detail listing is back as -detail (used for
project-wide outlier detection and mesh-sharing audits).
2026-05-08 08:01:53 -07:00
Kelsi
e3ab0f8587 feat(editor): add --gen-mesh-house simple cube + pyramid roof
Procedural house: 4 outward-facing wall quads + a floor slab,
topped by a 4-triangle pyramid roof meeting at a central apex.
Eaves line up with the wall edges so the roof sits flush. Pass
roofHeight=0 for a flat-roof shed.

Defaults: 4×4×3 with 2m roof. Useful for villages, settlements,
quest hubs. Brings the procedural mesh primitive set to 20.
2026-05-08 07:33:28 -07:00
Kelsi
d89955a446 feat(editor): add --gen-project-starter-pack project bootstrap
Project-wide bootstrap orchestrator. For every zone in
<projectDir>, runs --gen-zone-starter-pack (textures + meshes)
and --gen-zone-audio-pack (audio). Each zone gets a unique
sub-seed offset from the base seed so per-zone content reads
as distinct (rocks differ, wood grain differs).

Pairs with --validate-project-packs as the inverse: bootstrap
the entire project in one call, audit, ship.
2026-05-08 07:05:17 -07:00
Kelsi
1d49aa3bc9 feat(editor): add --gen-audio-sweep frequency chirp synthesis
Sine wave whose frequency glides from startHz to endHz across
the duration. Two shape modes:
  linear: f(t) = f0 + (f1-f0)*t/T (integrated phase = quadratic)
  exp:    f(t) = f0 * (f1/f0)^(t/T) (logarithmic glide)

Same RIFF/PCM-16 mono envelope as gen-audio-tone with 5ms
attack/release. Useful for sci-fi door whoosh, alert ramps,
sliding pitch cues, and as a standard signal-engineering test
signal — all hand-synthesized open-format WAV.
2026-05-08 06:37:50 -07:00
Kelsi
9fc12bbbc2 feat(editor): add --list-project-audio inventory command
Project-wide companion to --list-zone-audio. Walks every
zone in <projectDir> and reports per-zone WAV count + bytes
+ total duration, plus a project grand total. Reuses the
RIFF/WAVE header parse from list-zone-audio.

Completes the project-scope inventory trio alongside
--list-project-meshes and --list-project-textures.
2026-05-08 06:10:18 -07:00
Kelsi
654436c7cf feat(editor): add --gen-mesh-tower castle tower primitive
Procedural round castle tower: solid cylindrical shaft with
crenellated battlements ringing the top — alternating raised
merlons and gaps. Each merlon is an extruded arc segment
sitting on the rim. Pass battlementH=0 for a smooth-topped
tower.

Defaults: radius=1.5, height=8, battlements=8, battlementH=0.5.
Useful for keeps, watchtowers, perimeter walls. Brings the
procedural mesh primitive set to 19.
2026-05-08 05:41:29 -07:00
Kelsi
0525c07e1a feat(editor): add --validate-project-packs project-wide audit
Fans out --validate-zone-pack across every zone in a project
and reports a single PASS/FAIL per zone plus a summary line.
Exits non-zero if any zone fails — designed as a CI gate
before shipping a project's content pack.

Pairs with the existing zone-pack orchestrator family for
end-to-end "bootstrap → audit at project scale" coverage.
2026-05-08 05:14:33 -07:00
Kelsi
83da3d4849 feat(editor): add --gen-texture-fabric woven warp/weft pattern
Procedural fabric: alternating warp (vertical) and weft
(horizontal) threads on a checkerboard cell grid, with each
thread shaded brighter at center and darker at edges so the
weave reads as 3D yarn rather than flat checker squares.

Defaults: thread=4px, W=H=256. Useful for banners, tapestries,
clothing, sails. Brings the procedural texture pattern set to 15.
2026-05-08 04:47:51 -07:00
Kelsi
1547140816 feat(editor): add --list-project-meshes inventory command
Project-wide companion to --list-zone-meshes. Walks every
zone in <projectDir> and reports per-zone WOM count + bytes/
verts/tris row, plus a project grand total. Both human-
readable table and --json supported.

Useful for "how heavy is the entire project mesh-wise"
budgeting before shipping a content pack.
2026-05-08 04:21:24 -07:00
Kelsi
3587a91df5 feat(editor): add --validate-zone-pack asset audit
Audits a zone's open-format asset pack: counts and total bytes
for textures (PNG signature check), meshes (WOM load + sanity
check), and audio (RIFF/WAVE header check). Reports any
malformed files by relative path and exits 1 if anything is
invalid or the pack is empty.

Ties together the zone-pack orchestrator family — a CI step
can now gate that gen-zone-starter-pack output is healthy
before downstream packaging.
2026-05-08 03:55:03 -07:00
Kelsi
265ae1c95c feat(editor): add --gen-mesh-bridge plank bridge primitive
Procedural plank bridge: deck of N axis-aligned planks running
along the length with small gaps between, optional side rails
(top rail + 3 posts each side). Length runs along +X, width
along Z. Pass railHeight=0 to skip rails for a simpler footbridge.

Defaults: length=6, width=2, planks=6, railHeight=1. Useful for
river crossings, dungeon catwalks, scenic overlooks. Brings the
procedural mesh primitive set to 18.
2026-05-08 03:29:03 -07:00
Kelsi
96c1aee38f feat(editor): add --gen-audio-noise procedural noise WAV synthesis
Three audio-engineering noise colors:
  white — equal energy per Hz (uniform random samples)
  pink  — equal energy per octave via Voss-McCartney 7-band
          cascade (1/f spectrum, sounds like rain or wind)
  brown — 1/f² spectrum via random walk (sounds like distant
          surf or rumbling weather)

All written as PCM-16 mono with same RIFF header + 5ms
attack/release envelope as gen-audio-tone. Replaces typical
proprietary nature-sound MP3 placeholders for ambient zone
audio with hand-synthesized seeded WAVs.
2026-05-08 03:04:01 -07:00
Kelsi
cc436724fd feat(editor): add --list-zone-audio inventory command
Some checks are pending
Build / Build (arm64) (push) Waiting to run
Build / Build (x86-64) (push) Waiting to run
Build / Build (macOS arm64) (push) Waiting to run
Build / Build (windows-arm64) (push) Waiting to run
Build / Build (windows-x86-64) (push) Waiting to run
Security / CodeQL (C/C++) (push) Waiting to run
Security / Semgrep (push) Waiting to run
Security / Sanitizer Build (ASan/UBSan) (push) Waiting to run
Inventories every WAV under <zoneDir>/audio/ with stats parsed
straight from the RIFF/WAVE header: sample rate, channel count,
bit depth, duration. Both human-readable table and --json
output supported.

Completes the per-zone asset accounting trio alongside
--list-zone-meshes and --list-zone-textures.
2026-05-08 02:38:55 -07:00
Kelsi
be42422495 feat(editor): add --gen-zone-audio-pack starter audio orchestrator
Drops a 6-WAV starter pack into <zoneDir>/audio/: ambient-low
+ ambient-mid (drone pair, fifth interval), music-stinger,
chime, alert, click. All hand-synthesized PCM-16 mono WAVs
via --gen-audio-tone — no MP3 patent or licensing baggage.

Closes the audio side of the open-format zone bootstrap. A
fresh zone now has full coverage across textures (PNG), meshes
(WOM), and audio (WAV) from procedural generators alone.
2026-05-08 02:14:08 -07:00
Kelsi
ddcd89bb4c feat(editor): add --gen-mesh-pillar fluted column primitive
Procedural classical column. Cylindrical shaft with N concave
flutes (radius modulated by cos² of angle×flute-count) capped
by wider disc bases above and below — basic capital + base
geometry. Defaults: radius=0.4, height=4, flutes=12, capScale=1.25.

Useful for ruins, temples, dungeons, plaza decoration. Brings
the procedural mesh primitive set to 17.
2026-05-08 01:49:32 -07:00
Kelsi
6b0b6f6652 feat(editor): add --gen-audio-tone procedural WAV synthesis
Hand-rolled RIFF/WAVE PCM-16 mono encoder — no library deps,
44-byte header written field-by-field. Supports four waveforms
(sine/square/triangle/saw), 5ms attack/release envelope to
prevent click on tone start/stop, freq 0..24kHz, duration
0..600s, sampleRate 8k..192k.

Opens a brand-new file family in the open-format ecosystem
alongside WOM/WOB/PNG/JSON. Proprietary MP3 placeholders for
zone audio can now be replaced by hand-synthesized WAVs with
no patent or licensing baggage.
2026-05-08 01:25:17 -07:00
Kelsi
410a0bf7d1 feat(editor): add --list-zone-meshes inventory command
Companion to --list-zone-textures. Walks every WOM under a
zone dir and reports per-mesh size, vertex/triangle counts,
bone/anim/batch counts, and texture-ref counts. Both human-
readable table and --json output supported.

Useful for "how heavy is this zone" budgeting and verifying
that bootstrapping orchestrators (gen-zone-mesh-pack, gen-zone-
starter-pack) produced what they claim.
2026-05-08 01:01:18 -07:00
Kelsi
6a9c1302e4 feat(editor): add --gen-zone-starter-pack unified bootstrap
Convenience entry point that runs --gen-zone-texture-pack and
--gen-zone-mesh-pack in sequence so a fresh zone gets a full
open-format asset bootstrap from one command. Seed propagates
to both children for reproducibility.

A new zone now goes from "just a zone.json" to "11 placeholder
assets across textures/ and meshes/" with one invocation —
zero proprietary M2/BLP imports required.
2026-05-08 00:40:56 -07:00