AssetForge hero
In development Started 2026

AssetForge

A Blender and Python pipeline that turns a markdown brief into a game-ready asset: generated mesh, procedural finishing, baked PBR textures, glTF plus sprite sheets, and a wall of QA gates. Built to feed my own engines, with nothing external in anything that ships.

  • Python
  • Blender
  • Cycles
  • bmesh
  • glTF 2.0
  • Godot
  • Git LFS
  • Pillow
Started
2026
Status
in development
Platforms
CLI · Blender 5.1 · Godot 4.7

AssetForge is a standalone 3D asset pipeline. You write a short markdown brief (family, footprint, scale reference, tri budget, materials, camera profile), and one command runs it through Blender headless: a family generator builds the mesh from a seed, a finishing pass adds bevels, weighted normals, edge wear and crevice dirt, Cycles bakes albedo, normal and packed ORM, and the export step writes a glTF binary plus sprite renders from a per-game camera profile. Then the gates run. The games consume the export folder and never need Blender installed.

Why it exists

Two of my games, the Rust RTS and Small Riches, are benched for the same reason: they need hundreds of consistent environment, building and unit assets, and I am not a modeller. Two earlier per-game Blender pipelines had already started to duplicate each other, and both plateaued at “competent but toy-grade”. When I read the reviewers’ actual defect lists, though, they were not about sculpting: missing bevels, no edge wear, flat materials, floating parts, wrong texel scale. That is a procedural finishing layer, and it is the core bet of this repo. The rule that followed is that nothing external ships, not even CC0 scans or texture sets: the point is my own engine making my own assets on demand, so every material, bark, leaf atlas and trim sheet is generated here.

Highlights

  • Eleven families from one brief format. Trees, rocks, foliage, buildings, RTS units, factory machines (inserters, belts, assemblers), props, creatures, scans, authored .blend imports and primitives, with 114 presets between them. Each generator is a bmesh part grammar driven by a seeded RNG, so a species or a building type is a preset, not a new model.
  • Every build is deterministic and signed. The manifest records the pipeline git SHA, render device, seed, profile and every material hash, and verify re-checks an export’s integrity and whether it is current against the code tree. Rebuild the roster when the pipeline improves; never re-author.
  • Twenty-seven gates, red fails the build. glTF validation, triangle budget, texel density, footprint and ground contact, silhouette read at 48 and 96 px, sheet frame registration within a pixel, named pivots present, animation clips, emissive and light declarations honoured, damage states, team-mask coverage, and a headless Godot import that renders the asset in a reference scene with terrain, sun and SSAO. Judging happens there, never on grey.
  • Sprite consumers get the whole contract. Eight-direction sheets with a packed JSON index, team-colour mask sheets, construction and damage states, wrecks, rotation-only states that reuse one bake, and a raw-RGBA format for a consumer whose house rules forbid a PNG decoder. The first shipped asset was a mill sprite into Rise of Automation.
  • Quality is measured blind. Ninety-two blind reviews so far under a forced-choice protocol with randomised labels, an identical A-versus-A control and three or more reviewer agents. The protocol caught its own noise floor early (pixel-identical images scored differently), which is why layout and silhouette changes, not surface polish, are what moved the scores.
  • A portfolio that teaches the next agent. A static site generated entirely from repo data: one card per asset with its gates and provenance, every review report, and an agent guide where every claim cites the file it comes from.

Technical approach

The code runs in two Python runtimes with a package boundary between them: the host side (CLI, brief parsing, materials, QA, sheet packing with Pillow) and the Blender side (bpy generators, finishing, bake, export), launched with --factory-startup so a run on another machine is the same run. Host-side tests run without Blender or Godot; in-Blender tests run through a small discover-and-call runner because Blender ships no pytest. Currently 1,440 test functions across both, and assetforge ship refuses any export that records an external source.

It was built in ten days with coding agents, at a pace the git history could not survive: 3,765 commits were folded to about 75 a day in a one-time rewrite, keeping every merge, every cited revision and every build hash the manifests point at. Every milestone ends with a render in the proofs folder, because proof is an image, not a green test.