---
title: "Concept → Game Asset — a described prop becomes a game-ready mesh in your engine"
tier: hero
format: 3d-asset
theme: game | 3d | asset-pipeline | indie
persona: game artist, indie dev, technical artist, 3D generalist
duration: "1 prompt → a game-ready GLB + engine handoff in ~3–8 min"
budget_usd: "$0.20–$1.20 per asset (concept image + tripo mesh + blender refine; convert/handoff are pennies)"
caps: ["create_media", "tripo-i3d", "blender-headless", "format-convert"]
verbs: ["create_media", "refine_3d", "convert", "handoff", "asset_lineage"]
skills: ["pro-pipeline-3d"]
showcases: ["/chapters/concept-to-game-asset-example.html"]
status: "pilot (2026-06-19) — flag-gated (PRO_PIPELINE_ENABLED). Verbs + caps land in the pro-tool spine pilot; blender-headless + format-convert containers deploy to tool-staging-1 before live render."
requires: "PRO_PIPELINE_ENABLED on the MCP server + blender-headless / format-convert caps registered on BYOC."
reliability: 4.0 # concept image −0.2, tripo mesh −0.3, decimate/uv deterministic −0.0, handoff deterministic −0.0; −0.5 until caps are deployed + the loop is rendered E2E
---

# Concept → Game Asset

Describe a prop. Get a **game-ready GLB** — decimated to a tri budget, clean
UVs — handed off to your engine via a public manifest a community bridge
imports. One conversation, no tool-switching, and every version is kept
(lineage) so you can always step back.

## What you'll get

> **A finished asset = a GLB at your tri budget + clean UVs + an engine handoff
> manifest.** Not a punch list of fal.media URLs — a mesh your engine imports.
> The source mesh and every intermediate version stay addressable; `asset_lineage`
> explains how it was made.

## The verb chain (the proven shape)

```
prompt ("a low-poly treasure chest, hand-painted, 3/4 view, neutral background")
  → create_media               # concept image (gpt-image / flux-dev)
  → tripo-i3d                  # raw high-poly mesh from the concept
  → refine_3d "game-ready, 5k tris, clean UVs"   # blender-headless → optimized GLB
  → handoff to="godot"         # public interop manifest (docs/interop-manifest-v1.md)
  → [community Godot bridge imports it]  (infra/bridges/godot/)
  → iterate: refine_3d "lower poly, 2k tris" → new version (lineage kept)
```

## How the agent should run this (interaction contract)

1. **CONFIRM (≤1 question):** restate in one line ("game-ready GLB of <prop>,
   ~5k tris for a hero / ~1.5k for a prop, handoff to <engine>, ~$0.20–1.20,
   ~3–8 min"). Ask the tri budget + engine only if not given; otherwise state
   the role-default budget you picked and start (decision #4).
2. **PREVIEW the concept image** (~$0.05) before generating the mesh — a wrong
   silhouette is cheap to fix at the image stage, expensive after meshing.
3. **NARRATE:** 1-liner + ETA per step ("concept ~30s", "tripo mesh ~60–120s",
   "blender refine ~30–60s"); poll `get_create_media` every 10–15s.
4. **REPORT the tri count** the refine actually hit (from the cap metadata) and
   surface any `lossy_warnings`.
5. **HAND OFF:** run `handoff`, give the user the manifest URL + one line on the
   bridge ("point infra/bridges/godot/ at this URL, File → Run in Godot").

## STOP gates

- **STOP 1 — concept:** show the concept image. "Good silhouette? (y / retry / tweak)"
- **STOP 2 — game-ready:** show the refined GLB url + tri count + UV note.
  "Drop to a lower budget, bake normals, or hand off? (lower / normals / handoff)"
- **STOP 3 — handoff:** give the manifest URL. "Import in <engine> with the bridge."

## Notes / honesty

- `refine_3d` is mesh-only; it rejects non-mesh inputs.
- Tri budget: explicit user number wins; else hero ~5k / prop ~1.5k.
- `bake_normals` / `preview_render` need the blender-headless **GPU profile**;
  decimate + UV are CPU-fine.
- Engines want GLB (canonical). Need FBX? `convert to="fbx"` (warns PBR may not
  round-trip). USD DCC? `convert to="usdz"`.
- This is the **Game** beachhead of the pro-tool spine. CAD parts → see
  `idea-to-printable-part`.
