@genex-ai/cli-demo 1.13.1-dev.558 → 1.14.0-dev.560
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{blender-mcp-LLN4FPA4.js → blender-mcp-3U5AG7WS.js} +3 -3
- package/dist/{chunk-WXHTNSFB.js → chunk-2UJK5OCB.js} +17 -9
- package/dist/index.js +327 -155
- package/package.json +1 -1
- package/templates/skills/genex-ai-model/SKILL.md +11 -7
- package/templates/skills/genex-blender-scene/SKILL.md +222 -0
- package/templates/skills/genex-game-director/SKILL.md +81 -38
- package/templates/skills/genex-game-director/references/design-contract.md +13 -5
- package/templates/skills/genex-game-director/references/routing-map.md +16 -45
- package/templates/skills/genex-threejs-procedural-assets/SKILL.md +17 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genex-ai/cli-demo",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0-dev.560",
|
|
4
4
|
"description": "Set up your project's agent workspace (.claude/.codex/.cursor in the game folder), authorize, create a game project, generate AI assets, and publish (genex CLI).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -9,13 +9,17 @@ Turn a text prompt into a real, game-ready **GLB** and drop it into the project.
|
|
|
9
9
|
|
|
10
10
|
## When to use this vs. procedural geometry
|
|
11
11
|
|
|
12
|
-
- **Use `npx genex model`** for a specific, recognizable object
|
|
13
|
-
sword, a spaceship, an animal
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
- **Use `npx genex model`** for a specific, recognizable object the player will
|
|
13
|
+
look at — a barrel, a chair, a sword, a spaceship, an animal, a named
|
|
14
|
+
building, the thing the request asked for. You get a real textured mesh, and
|
|
15
|
+
this is the default route whenever code would not honestly make the object
|
|
16
|
+
read as itself.
|
|
17
|
+
- **Use `$genex-threejs-procedural-assets`** for what is structural, repeated,
|
|
18
|
+
distant, or parametric — modular kits, fences, walls, paving, terrain,
|
|
19
|
+
anything placed many times with variation (editable, seeded, no GLB file) —
|
|
20
|
+
and for a close-up object only when the code result meets the same bar and
|
|
21
|
+
you have checked it in a capture. Mixing both in one scene is the normal way
|
|
22
|
+
to build a detailed world.
|
|
19
23
|
|
|
20
24
|
**The output is a STATIC, unrigged mesh by default — no skeleton, no animation
|
|
21
25
|
clips.** A "wolf" or "guard" from this command can be posed and moved as one
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: genex-blender-scene
|
|
3
|
+
description: Compose a level, arena, interior, building or map — a SPACE of rooms, lanes, walls and sites that must relate — in a live Blender with `npx genex blender`, then export one GLB the game walks through. Use when the request is a place to move through (from a description or a floor plan), not a single prop; probe the lane first and build the same space in code if it is off.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Genex Blender · Scene
|
|
7
|
+
|
|
8
|
+
Build the game's SPACE in a real Blender that answers over HTTP: write a Python
|
|
9
|
+
script, run it, read the numbers, look at the four-view sheet, repeat — then
|
|
10
|
+
export one GLB and load it like any model. The scene persists between steps, so a
|
|
11
|
+
level grows the way a level is actually built: shell, then zones, then dressing.
|
|
12
|
+
|
|
13
|
+
## When this lane owns the work
|
|
14
|
+
|
|
15
|
+
- A **space**: a level, arena, interior, building, map, dungeon, station — several
|
|
16
|
+
rooms, lanes, walls or sites that must relate to each other, and a player who
|
|
17
|
+
moves through them.
|
|
18
|
+
- A **floor plan or reference** to trace (a sketch, an ASCII plan, a photo of a room).
|
|
19
|
+
- A **blockout**: the playable shape first, dressing later.
|
|
20
|
+
|
|
21
|
+
Not this lane:
|
|
22
|
+
|
|
23
|
+
- One recognisable object (a barrel, a cart, a statue) → `$genex-ai-model`.
|
|
24
|
+
- One parameterized object placed many times with variation, or a stylized shader
|
|
25
|
+
material → `$genex-threejs-procedural-assets`.
|
|
26
|
+
- The player's body, creatures, animation → `$genex-ai-character`,
|
|
27
|
+
`$genex-threejs-creatures`. Terrain from a heightmap → code.
|
|
28
|
+
|
|
29
|
+
Mixing all three in one scene is normal: the Blender level is the architecture, a
|
|
30
|
+
generated GLB is the hero piece, code is the repeated dressing.
|
|
31
|
+
|
|
32
|
+
## Is the lane on? Probe by doing
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx genex blender scene
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Read the answer literally — there are three:
|
|
39
|
+
|
|
40
|
+
1. **A scene JSON prints** → the lane is on. Continue.
|
|
41
|
+
2. `Warming up a Blender seat…` and then `The Blender seat is still warming up. Run
|
|
42
|
+
the same command again in a minute.` → **not done yet**, even though the command
|
|
43
|
+
exited cleanly. A GPU is booting for you (about 20 s on a warm pod, a few
|
|
44
|
+
minutes on a cold one). Write your first script meanwhile, then run the command
|
|
45
|
+
again. Never read this line as success, and never read it as failure.
|
|
46
|
+
3. `The Blender lane is off on this stand` or `No Blender seat: fleet_full` → build
|
|
47
|
+
the same space **in code** with `$genex-threejs-procedural-assets`, say so in one
|
|
48
|
+
plain line to the player, and keep going. Do not wait, do not ask.
|
|
49
|
+
|
|
50
|
+
The seat, once granted, is remembered in `.genex/blender-seat.json` — later
|
|
51
|
+
commands are silent about it.
|
|
52
|
+
|
|
53
|
+
## The loop
|
|
54
|
+
|
|
55
|
+
Scripts are the level's source. Keep them in the project, one per zone:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
blender/01-shell.py walls, floor, towers
|
|
59
|
+
blender/02-gatehouse.py
|
|
60
|
+
blender/03-courtyard.py
|
|
61
|
+
…
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Run one:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx genex blender exec --in blender/01-shell.py
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Every run prints two things and writes one file:
|
|
71
|
+
|
|
72
|
+
- **The numbers** — `objects N meshes N tris N materials N radius N`. This is
|
|
73
|
+
the gate. Before you run, know what the script should produce (twelve objects,
|
|
74
|
+
about 4k tris, radius ≈ 40); after, compare. A render judge is unreliable for
|
|
75
|
+
pass/fail; the numbers are not.
|
|
76
|
+
- **The sheet** — `assets/blender/contact-sheet.webp`, four fixed views (front,
|
|
77
|
+
side, TOP, hero) from cameras derived from the scene bounds, so two steps compare
|
|
78
|
+
pixel for pixel. **Open it with your file-reading tool after every step.** The
|
|
79
|
+
TOP view is the floor-plan check; the hero view is the mood check. Nothing shows
|
|
80
|
+
it to you unless you look.
|
|
81
|
+
- Script `print()` output comes back as stdout; a raised exception comes back with
|
|
82
|
+
its traceback AND the sheet of the half-built scene, which is usually where the
|
|
83
|
+
bug is visible.
|
|
84
|
+
|
|
85
|
+
The Python namespace **persists between runs** (`bpy`, `bmesh`, `mathutils`,
|
|
86
|
+
`math`, `random` are preloaded): define `mat()` and `box()` helpers once in the
|
|
87
|
+
first script and use them in every later one. If a run says the service restarted
|
|
88
|
+
and the scene was restored from a checkpoint, re-read the numbers — your last step
|
|
89
|
+
may be missing; re-run that one script.
|
|
90
|
+
|
|
91
|
+
Other verbs:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
npx genex blender snap --mode wireframe # topology; also normals | solid | lit
|
|
95
|
+
npx genex blender scene # the full graph as JSON, when a number surprises you
|
|
96
|
+
npx genex blender reset # empty scene (the namespace resets too)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Keep each step under about 90 seconds of Blender time: a script that loops
|
|
100
|
+
hundreds of boolean cuts is killed at the deadline and the scene comes back from
|
|
101
|
+
the last checkpoint. Split heavy work across scripts. A level is 8–15 steps, not 50.
|
|
102
|
+
|
|
103
|
+
## Craft rules that decide whether the export works
|
|
104
|
+
|
|
105
|
+
- **Metres.** Floor at `z = 0`, the map's centre at the origin. Blender is Z-up;
|
|
106
|
+
the export converts to Y-up, so the floor is the XZ plane in Three.js and a
|
|
107
|
+
Blender `(x, y, z)` lands at `(x, z, -y)`.
|
|
108
|
+
- **Name everything** `<zone>_<thing>` (`gate_portcullis`, `hall_table_1`). Names
|
|
109
|
+
survive the export and are how the game finds parts.
|
|
110
|
+
- **Materials: few and flat.** Six to eight for a whole level, one per surface
|
|
111
|
+
family (stone, dark stone, wood, roof, iron, glow). Set the Principled BSDF base
|
|
112
|
+
colour **and** `material.diffuse_color` — the sheet's fallback renderer reads the
|
|
113
|
+
second, and a scene that sets only the first exports with correct colours and
|
|
114
|
+
renders entirely grey. No image textures: they do not fit the export ceiling, and
|
|
115
|
+
an asset URL does not export.
|
|
116
|
+
- **Repetition by loop, never by an unapplied modifier.** Crenellations, columns,
|
|
117
|
+
pews: a Python `for`. An Array modifier that is not applied is not in the GLB.
|
|
118
|
+
- **Tri budget.** Keep the whole level under ~150k triangles and use 12–16 segments
|
|
119
|
+
on cylinders — phones load this file too. The export refuses above 6 MB; treat
|
|
120
|
+
that as "no longer a game asset", not as a limit to work around.
|
|
121
|
+
- **Markers.** Empties export as named nodes: `bpy.data.objects.new("spawn", None)`
|
|
122
|
+
placed and linked into the scene collection, likewise `key_1`, `door_crypt`,
|
|
123
|
+
`patrol_1`. The level tells the game where things go; the game reads them with
|
|
124
|
+
`scene.getObjectByName("spawn")`.
|
|
125
|
+
- **Lights stay in the game.** Blender lights do not export usefully; light the
|
|
126
|
+
level in Three.js (a hemisphere + a sun, point lights at torches and hearths).
|
|
127
|
+
- **Collision is the game's.** Static level geometry gets Rapier trimesh colliders
|
|
128
|
+
per mesh — `$genex-threejs-physics-rapier`. If a mesh is too dense to collide
|
|
129
|
+
against, add a simplified `col_<zone>` box in Blender and keep the visual one out
|
|
130
|
+
of physics.
|
|
131
|
+
|
|
132
|
+
A minimal first script, the shape every later one follows:
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
import bpy
|
|
136
|
+
bpy.ops.wm.read_factory_settings(use_empty=True)
|
|
137
|
+
|
|
138
|
+
def mat(name, rgb, rough=0.85):
|
|
139
|
+
m = bpy.data.materials.new(name)
|
|
140
|
+
m.use_nodes = True
|
|
141
|
+
b = m.node_tree.nodes["Principled BSDF"]
|
|
142
|
+
b.inputs["Base Color"].default_value = (*rgb, 1.0)
|
|
143
|
+
b.inputs["Roughness"].default_value = rough
|
|
144
|
+
m.diffuse_color = (*rgb, 1.0) # BOTH, or the sheet renders grey
|
|
145
|
+
return m
|
|
146
|
+
|
|
147
|
+
def box(name, loc, half, m):
|
|
148
|
+
bpy.ops.mesh.primitive_cube_add(size=2.0, location=loc)
|
|
149
|
+
o = bpy.context.active_object
|
|
150
|
+
o.name, o.scale = name, half
|
|
151
|
+
o.data.materials.append(m)
|
|
152
|
+
return o
|
|
153
|
+
|
|
154
|
+
STONE = mat("Stone", (0.46, 0.44, 0.41))
|
|
155
|
+
box("yard_floor", (0, 0, -0.25), (35, 35, 0.25), mat("Ground", (0.30, 0.28, 0.24)))
|
|
156
|
+
for sx, sy in ((1, 1), (1, -1), (-1, 1), (-1, -1)):
|
|
157
|
+
bpy.ops.mesh.primitive_cylinder_add(radius=3, depth=14, vertices=16,
|
|
158
|
+
location=(sx * 35, sy * 35, 7))
|
|
159
|
+
t = bpy.context.active_object
|
|
160
|
+
t.name = f"tower_{sx}_{sy}"
|
|
161
|
+
t.data.materials.append(STONE)
|
|
162
|
+
print("shell:", len(bpy.context.scene.objects), "objects")
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Hero pieces from `genex model`
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npx genex model "weathered stone knight effigy on a tomb, medieval" # prints a URL
|
|
169
|
+
npx genex blender import https://assets.genex.technology/generations/<id>/model-glb
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`import` prints the object names it added and renders a fresh sheet; place and
|
|
173
|
+
scale them in the next `exec` (`bpy.data.objects["…"].location = (…)`). Import
|
|
174
|
+
when the piece must be composed WITH the architecture (a gate in a wall, a statue
|
|
175
|
+
in a niche). When it is dressing, skip the import: drop a marker in Blender and
|
|
176
|
+
load the GLB in Three.js at that marker — it keeps the level file small.
|
|
177
|
+
|
|
178
|
+
## Export and load
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
npx genex blender export --out public/assets/level.glb
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Load it like any GLB. The quality kit's rung ladder applies only to generated
|
|
185
|
+
`/generations/` URLs, so this file loads as-is — the tri and material budgets
|
|
186
|
+
above are what keep it phone-safe.
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
import { createGltfLoader } from "./controllers/quality/gltf-loader.ts";
|
|
190
|
+
|
|
191
|
+
const gltfLoader = createGltfLoader(renderer);
|
|
192
|
+
const level = await gltfLoader.loader.loadAsync("/assets/level.glb");
|
|
193
|
+
level.scene.traverse((o) => {
|
|
194
|
+
if ((o as THREE.Mesh).isMesh) { o.castShadow = true; o.receiveShadow = true; }
|
|
195
|
+
});
|
|
196
|
+
scene.add(level.scene);
|
|
197
|
+
const spawn = level.scene.getObjectByName("spawn");
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Then colliders (`$genex-threejs-physics-rapier`), the player
|
|
201
|
+
(`$genex-threejs-character-controller`), lights, and a real screenshot check
|
|
202
|
+
(`$genex-threejs-visual-validation`). Record the level in `DESIGN.md`'s Assets as
|
|
203
|
+
`local Blender build — scripts under blender/`, never a provider generation id.
|
|
204
|
+
|
|
205
|
+
## Money
|
|
206
|
+
|
|
207
|
+
The seat bills a few credits **per minute while it is held, idle or not**, and it
|
|
208
|
+
ends with the session — there is no close command. So build the level in one
|
|
209
|
+
sitting: shell → zones → hero pieces → export, then move on to the game. Batch
|
|
210
|
+
changes into fewer, larger scripts; every step renders one sheet.
|
|
211
|
+
|
|
212
|
+
## Troubleshooting
|
|
213
|
+
|
|
214
|
+
- `payload_too_large` on export → fewer cylinder segments, delete faces the player
|
|
215
|
+
never sees, or export two GLBs (`--out public/assets/level-a.glb`).
|
|
216
|
+
- The sheet is grey → `material.diffuse_color` was not set (see above).
|
|
217
|
+
- `refused the seat token (401)` → the seat was closed (the session rested, or the
|
|
218
|
+
pod was replaced); run the same command again — it re-acquires, and a replaced
|
|
219
|
+
pod restores your scene from its checkpoint.
|
|
220
|
+
- `seat_not_ready` → the pod is still booting; run again shortly.
|
|
221
|
+
- The numbers are right but the top view is wrong → coordinates: `y` in Blender is
|
|
222
|
+
depth, and `scale` on a 2-unit cube is the half-size.
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: genex-game-director
|
|
3
|
-
description: The
|
|
3
|
+
description: The Genex request router. Read the latest game, tool, component, or focused-change request; ask only genuinely unresolved build forks; keep DESIGN.md current; and load each owning lane BEFORE the first file of the subsystem it owns — only the lanes the work touches, never the whole pack, and never fewer than the work needs. Use first for new work, resumed work, or whenever ownership is unclear.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Genex Game Director
|
|
7
7
|
|
|
8
8
|
The player chooses what to build and in what order. You route that request;
|
|
9
|
-
the owning Genex skills control how their lanes run.
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
the owning Genex skills control how their lanes run.
|
|
10
|
+
|
|
11
|
+
Routing binds in BOTH directions: load only the lanes the requested work
|
|
12
|
+
touches — never the whole pack by default, and never unrelated work because an
|
|
13
|
+
old workflow listed it — and load a lane BEFORE the first file of the subsystem
|
|
14
|
+
it owns. A matching row in the routing map is not a suggestion: each lane
|
|
15
|
+
exists because writing that subsystem without it ships a known defect.
|
|
16
|
+
Loading one lane never commissions another.
|
|
12
17
|
|
|
13
18
|
**After any context compaction or session resume**, re-read the project's
|
|
14
19
|
`AGENTS.md`, `DESIGN.md` when present, and the skill for the work you are
|
|
@@ -103,40 +108,67 @@ Never invent a provider generation ID for local code. Sections for gameplay,
|
|
|
103
108
|
content, UI, world, assets, multiplayer, character/animation, tools, or
|
|
104
109
|
modules are conditional on the request and existing project.
|
|
105
110
|
|
|
106
|
-
## 4.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
- `
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
-
|
|
118
|
-
|
|
119
|
-
-
|
|
120
|
-
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
111
|
+
## 4. Routing map — load the owning lane before the first file
|
|
112
|
+
|
|
113
|
+
For every subsystem the current milestone touches, find its row below, load
|
|
114
|
+
that skill, and write the lane beside the work in `DESIGN.md` — a `Lane` cell
|
|
115
|
+
on the module's row in the Modules table, or a `Lane:` line under `Now:` in
|
|
116
|
+
focused or step-by-step work. `Lane: none — <why>` is the only way to write a
|
|
117
|
+
subsystem with no lane. Then write the code. Never reconstruct a lane's API or
|
|
118
|
+
vendored code from memory of another engine.
|
|
119
|
+
|
|
120
|
+
| Work needed | Load |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| shot composition, chase/side/orbit rigs, camera handoffs, projection ownership, pointer look, mouse-aimed action, mouse-look, the screen-direction contract for hand-rolled steering/pan/look input signs, floating origins | `$genex-threejs-camera-direction` |
|
|
123
|
+
| on-foot player movement: walk/run/jump/crouch, third-person character, slopes, stairs, moving platforms, the player's body loader, directional locomotion, transitions, action motion | `$genex-threejs-character-controller` |
|
|
124
|
+
| **attacking, casting, aiming or reloading WHILE moving** — any action the legs must keep running under; a weapon carry stance over stock locomotion; a wind-up the character holds while walking | `$genex-threejs-character-controller` (`references/animations.md`, upper-body layering) |
|
|
125
|
+
| dash, dodge, roll, blink, backstep, a lunging attack — any burst that moves the character itself | `$genex-threejs-character-controller` (`references/tuning-and-presets.md`, dash recipe) |
|
|
126
|
+
| the game's own generated character—the player's body wherever a human body appears—or Meshy animation coverage beyond the stock pack: reference-informed A-pose concepts, exact action IDs, same-rig adapter | `$genex-ai-character` + `$genex-threejs-character-controller` |
|
|
127
|
+
| a character/enemy needs motion the catalog lacks—a signature move, boss telegraph, death, full 8-way set, or the player's footage; free plan before spend | `$genex-ai-character` motion section + `references/motion-generation.md` |
|
|
128
|
+
| remote player bodies in multiplayer—never hand-built primitives: the game's generated character when it has one, otherwise the player's `p.avatarUrl` VRM | `$genex-threejs-multiplayer` + `$genex-threejs-character-controller` |
|
|
129
|
+
| enemies, NPCs, or creatures: rigged bipeds via `npx genex creature`; non-biped body plans (quadruped, flier, serpent, aquatic, multi-leg) via `npx genex model rig` + `model animate`; static plus procedural motion only for shapes with no body plan; collider, facing, hit reaction, death | `$genex-threejs-creatures` |
|
|
130
|
+
| cars, drones, vehicle physics, gearbox, character↔vehicle enter/exit | `$genex-threejs-vehicle-controllers` |
|
|
131
|
+
| playable on phones: joystick, virtual buttons, drag zones, genre touch recipes, rotate-device overlay | `$genex-threejs-touch-controls` |
|
|
132
|
+
| phone-survivable rendering: device tiers, DPR/shadow/post budgets, runtime governor, generated-asset rungs, Quality picker, dispose-on-swap | `$genex-threejs-adaptive-quality` |
|
|
133
|
+
| anything falls, collides, gets pushed, or needs colliders/events | `$genex-threejs-physics-rapier` |
|
|
134
|
+
| launch/docking timelines, authored transform phases, springs, convergence, deterministic prop/debris motion | `$genex-threejs-procedural-animation` |
|
|
135
|
+
| a level, arena, interior, building or map to walk through — a composed space of rooms, lanes, walls and sites, from a description or a floor plan; a blockout | `$genex-blender-scene` — probe the lane first (`npx genex blender scene`); when it is off, the same space is built as code via `$genex-threejs-procedural-assets` |
|
|
136
|
+
| rebuild a reference prop, hard-surface object, modular decoration, or structural environment piece (kits, fences, walls, paving) as editable parameterized Three.js code — held to the asset bar at the end of this section | `$genex-threejs-procedural-assets` |
|
|
137
|
+
| stylized/abstract shader-authored materials, the procedural/PBR material boundary | `$genex-threejs-procedural-assets` |
|
|
138
|
+
| particles, trails, plasma, shockwaves, pooled bursts, and event effects | `$genex-threejs-procedural-vfx` |
|
|
139
|
+
| stable large-world shadows, cascades, clipmaps, cached updates | `$genex-threejs-shadow-systems` |
|
|
140
|
+
| eye adaptation, tone mapping, output color, LUT grading, and proven static grain | `$genex-threejs-exposure-color-grading` |
|
|
141
|
+
| fixed-view screenshots, input direction, facing, temporal and budget evidence | `$genex-threejs-visual-validation` |
|
|
142
|
+
| the default for a concrete object the player looks at up close: a generated GLB for a prop, vehicle, building, or object — from text or a reference image (`--image`); split into named parts (`model segment`); rig + animate any mesh (`model rig` / `model animate`) | `$genex-ai-model` |
|
|
143
|
+
| generated surface or terrain texture with real-world UV scale | `$genex-ai-texture` |
|
|
144
|
+
| sky, skybox, horizon, time of day, weather mood, night or space backdrop | build it in code in the scene—there is no sky command and no owning skill, so pick the technique this game needs |
|
|
145
|
+
| poster, sign, sprite, decal, reference sheet, or other 2D art | `$genex-ai-image` |
|
|
146
|
+
| in-world motion art or another requested video | `$genex-ai-video` |
|
|
147
|
+
| sound effect, one looping music bed, or a short spoken line | `$genex-ai-sfx`, `$genex-ai-music`, or `$genex-ai-voice` |
|
|
148
|
+
| requested UI/HUD/menu/interface work, a visible UI problem, or an interface you decided this game wants built with generated art | `$genex-threejs-game-ui` |
|
|
149
|
+
| selling anything for platform coin: a shop, an item catalog, boosts, cosmetics, "make it earn"; also any request for a loot box, gacha, wager, casino mechanic or donation prompt, which that skill refuses and replaces | `$genex-monetization` |
|
|
150
|
+
| cinematic menu/title/pause/victory/defeat/lobby/credits video treatment | `$genex-ai-menu` |
|
|
151
|
+
| drawn HUD chrome the game's style wants—one element or a matched set of frames, masks, and icons | `$genex-ai-hud` |
|
|
152
|
+
| the game works but feels flat, floaty, or unresponsive: input response, camera, impacts, cooldowns, difficulty, fail/retry | `$genex-threejs-game-feel` |
|
|
153
|
+
| realtime multiplayer: movement sync, shared ball/NPC, host-run scores/enemies, shots/emotes, persistence | `$genex-threejs-multiplayer` |
|
|
154
|
+
| players talking to each other by TEXT — chat, room chat, "let them type to each other" (`room.chat` + `npx genex controller chat`) | `$genex-threejs-multiplayer` |
|
|
155
|
+
| players TALKING — voice chat, mic, "hear each other", proximity/positional voice (`room.voice` + `npx genex controller voice`; party-sized, max 6 per room — say that number out loud before building the feature) | `$genex-threejs-multiplayer` |
|
|
156
|
+
| player identity, sign-in, guests, saves/progress, per-player state, shared persistent world, leaderboards—mandatory for every game | `$genex-threejs-embed-auth` |
|
|
157
|
+
| the player EXPLICITLY asks to make an asset or publish something from their game as an asset for the free library | `$genex-asset-author` (`genex asset new`) — never offer this unprompted; no game duty routes here |
|
|
158
|
+
|
|
159
|
+
Request-shape rules, working modes and the protected-lane handoffs stay in the
|
|
160
|
+
[routing map](references/routing-map.md); read it when the request shape, not
|
|
161
|
+
the subsystem, is what is unclear.
|
|
132
162
|
|
|
133
163
|
For “make this image 3D,” ask **one** route question only when both results
|
|
134
164
|
honestly fit: a generated GLB built from the picture itself
|
|
135
165
|
(`npx genex model --image <path>`), or editable parameterized Three.js code.
|
|
136
166
|
If the request says procedural, parametric, code-built, reusable variations,
|
|
137
167
|
or names a GLB, start the corresponding route directly. An image alone never
|
|
138
|
-
auto-triggers the procedural lane.
|
|
139
|
-
|
|
168
|
+
auto-triggers the procedural lane. A floor plan, a room photo or a map sketch
|
|
169
|
+
is a SPACE, not an object: it goes to `$genex-blender-scene` with no route
|
|
170
|
+
question. Player bodies, rigged characters/creatures, and animation stay with
|
|
171
|
+
their protected owners.
|
|
140
172
|
|
|
141
173
|
If a procedural request has a private reference, use it locally and do not
|
|
142
174
|
upload, publish, or commit it without explicit permission. If no reference was
|
|
@@ -145,12 +177,23 @@ supplied and creating one is part of the requested work, use the existing
|
|
|
145
177
|
Assets row.
|
|
146
178
|
|
|
147
179
|
The request sets the floor for the asset plan, never the ceiling: a world
|
|
148
|
-
should feel dressed and alive, so plan the detail its genre implies — and
|
|
149
|
-
the
|
|
150
|
-
player
|
|
151
|
-
|
|
152
|
-
or
|
|
153
|
-
|
|
180
|
+
should feel dressed and alive, so plan the detail its genre implies — and
|
|
181
|
+
choose the engine per object, never per category. The bar is the same for both
|
|
182
|
+
engines: whatever the player looks at must read as the thing it is, in this
|
|
183
|
+
game's own style — a building as that building, a person as a person, a prop as
|
|
184
|
+
that prop. A coloured box, a capsule or a flat grey block is not a finished
|
|
185
|
+
version of any of them. Generation is the default route to that bar wherever
|
|
186
|
+
code will not honestly reach it: the player's character, anything the request
|
|
187
|
+
names, anything the player walks up to, enters, or interacts with, and the
|
|
188
|
+
music and sound under it. Procedural code (`$genex-threejs-procedural-assets`)
|
|
189
|
+
is a first-class engine for what is structural, repeated, distant, or
|
|
190
|
+
parametric — terrain, sky (never generated), fences, paving, modular kits,
|
|
191
|
+
filler — and for anything else only when the result meets the same bar and you
|
|
192
|
+
have checked it in a capture before its row says `landed`. Write the route on
|
|
193
|
+
each Assets row: the paid flow for generated pieces, the procedural flow with
|
|
194
|
+
its local path for code-built ones — the table is where the per-object decision
|
|
195
|
+
lives, and a table with no generated row records
|
|
196
|
+
`Generation: none — <why code alone reaches the bar here>` beside it. Mixing
|
|
154
197
|
both in one scene is the normal way to build, never a fallback. In focused
|
|
155
198
|
work, stay inside the touched scope. Run independent planned generations with
|
|
156
199
|
`--no-wait`, scaffold while they land, and preserve their IDs, URLs, and
|
|
@@ -37,11 +37,15 @@ so it survives a long pause, context compaction, handoff, and remix.
|
|
|
37
37
|
status flow `proposed → planned → generating (id) → landed (URL) → wired`.
|
|
38
38
|
A landed asset is unfinished until wired or visibly cancelled. Preserve
|
|
39
39
|
generation IDs, permanent URLs, local outputs, and wiring state across
|
|
40
|
-
compaction.
|
|
40
|
+
compaction. Every row shows its route: generated rows carry the paid flow;
|
|
41
|
+
code-built rows carry the procedural flow and a local path. A table with no
|
|
42
|
+
generated row at all carries `Generation: none — <why code alone reaches the
|
|
43
|
+
bar here>` beside it (build contract, law 22).
|
|
41
44
|
- **Code-built procedural assets use their own truthful status flow:**
|
|
42
45
|
`proposed → planned → building (blockout | detail | material | runtime) →
|
|
43
46
|
landed (<local TypeScript path>) → wired`. They never invent a provider
|
|
44
|
-
generation ID.
|
|
47
|
+
generation ID. `landed` on a code-built row means a capture at gameplay
|
|
48
|
+
distance showed it reads as the thing it is. A generated reference image is a separate normal Assets row.
|
|
45
49
|
- Sections are request-driven. Gameplay, content, UI, assets, world,
|
|
46
50
|
multiplayer, character/animation, tools, modules, and procedural assets
|
|
47
51
|
appear only when the request or existing project uses them.
|
|
@@ -73,6 +77,7 @@ or explicitly re-scope it.>
|
|
|
73
77
|
Working mode: <whole coordinated build | step by step | focused change>
|
|
74
78
|
Now: ▶ <number/name of the current milestone or focused task>
|
|
75
79
|
Done when: <one plain, observable condition for the current work>
|
|
80
|
+
Lane: <$genex-… owning the current subsystem | none — why no row matches>
|
|
76
81
|
1. <milestone> — ✅ → previewed
|
|
77
82
|
2. <milestone> — ▶ in progress (<main agent | sub-agent>)
|
|
78
83
|
3. <milestone> — ⏸ paused (<reason>)
|
|
@@ -121,7 +126,10 @@ Menu video: <generation id/URL, or the still standing in while it renders>
|
|
|
121
126
|
| <asset> | <model/image/texture/…> | planned | — |
|
|
122
127
|
| <asset> | <kind> | generating (<id>) | — |
|
|
123
128
|
| <asset> | <kind> | landed → <URL> | yes/no |
|
|
129
|
+
| <asset> | procedural-code | building (blockout) | — |
|
|
124
130
|
Status flow: proposed → planned → generating (id) → landed (URL) → wired.
|
|
131
|
+
Code-built rows: proposed → planned → building (…) → landed (<local path>) → wired.
|
|
132
|
+
Generation: none — <why code alone reaches the bar in this game> (only when no row is generated)
|
|
125
133
|
|
|
126
134
|
**HUD pipeline state (only while the sprites lane is running) — keep this
|
|
127
135
|
current; it is how that pipeline survives a context compaction.**
|
|
@@ -152,9 +160,9 @@ Play-button rule: nothing connects before the click when a Play screen exists.
|
|
|
152
160
|
Verification still open: <two-identity/netcode evidence>
|
|
153
161
|
|
|
154
162
|
## Modules (whole coordinated mode or another useful split only)
|
|
155
|
-
| Module | Owns files | Built by | Done when |
|
|
156
|
-
|
|
157
|
-
| <request-derived stream> | <disjoint paths> | <parallel/serial + reason> | <observable result> |
|
|
163
|
+
| Module | Lane | Owns files | Built by | Done when |
|
|
164
|
+
|---|---|---|---|---|
|
|
165
|
+
| <request-derived stream> | <$genex-… or none — why> | <disjoint paths> | <parallel/serial + reason> | <observable result> |
|
|
158
166
|
|
|
159
167
|
## Verification evidence
|
|
160
168
|
- <preview URL/date and what it proves>
|
|
@@ -34,49 +34,17 @@ copy demo architecture.
|
|
|
34
34
|
|
|
35
35
|
## Route by system
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
| **attacking, casting, aiming or reloading WHILE moving** — any action the legs must keep running under; a weapon carry stance over stock locomotion; a wind-up the character holds while walking | `$genex-threejs-character-controller` (`references/animations.md`, upper-body layering) |
|
|
42
|
-
| dash, dodge, roll, blink, backstep, a lunging attack — any burst that moves the character itself | `$genex-threejs-character-controller` (`references/tuning-and-presets.md`, dash recipe) |
|
|
43
|
-
| the game's own generated character—the player's body wherever a human body appears—or Meshy animation coverage beyond the stock pack: reference-informed A-pose concepts, exact action IDs, same-rig adapter | `$genex-ai-character` + `$genex-threejs-character-controller` |
|
|
44
|
-
| a character/enemy needs motion the catalog lacks—a signature move, boss telegraph, death, full 8-way set, or the player's footage; free plan before spend | `$genex-ai-character` motion section + `references/motion-generation.md` |
|
|
45
|
-
| remote player bodies in multiplayer—never hand-built primitives: the game's generated character when it has one, otherwise the player's `p.avatarUrl` VRM | `$genex-threejs-multiplayer` + `$genex-threejs-character-controller` |
|
|
46
|
-
| enemies, NPCs, or creatures: rigged bipeds via `npx genex creature`; non-biped body plans (quadruped, flier, serpent, aquatic, multi-leg) via `npx genex model rig` + `model animate`; static plus procedural motion only for shapes with no body plan; collider, facing, hit reaction, death | `$genex-threejs-creatures` |
|
|
47
|
-
| cars, drones, vehicle physics, gearbox, character↔vehicle enter/exit | `$genex-threejs-vehicle-controllers` |
|
|
48
|
-
| playable on phones: joystick, virtual buttons, drag zones, genre touch recipes, rotate-device overlay | `$genex-threejs-touch-controls` |
|
|
49
|
-
| phone-survivable rendering: device tiers, DPR/shadow/post budgets, runtime governor, generated-asset rungs, Quality picker, dispose-on-swap | `$genex-threejs-adaptive-quality` |
|
|
50
|
-
| anything falls, collides, gets pushed, or needs colliders/events | `$genex-threejs-physics-rapier` |
|
|
51
|
-
| launch/docking timelines, authored transform phases, springs, convergence, deterministic prop/debris motion | `$genex-threejs-procedural-animation` |
|
|
52
|
-
| rebuild a reference prop, hard-surface object, modular decoration, or simple environment piece as editable parameterized Three.js code | `$genex-threejs-procedural-assets` |
|
|
53
|
-
| stylized/abstract shader-authored materials, the procedural/PBR material boundary | `$genex-threejs-procedural-assets` |
|
|
54
|
-
| particles, trails, plasma, shockwaves, pooled bursts, and event effects | `$genex-threejs-procedural-vfx` |
|
|
55
|
-
| stable large-world shadows, cascades, clipmaps, cached updates | `$genex-threejs-shadow-systems` |
|
|
56
|
-
| eye adaptation, tone mapping, output color, LUT grading, and proven static grain | `$genex-threejs-exposure-color-grading` |
|
|
57
|
-
| fixed-view screenshots, input direction, facing, temporal and budget evidence | `$genex-threejs-visual-validation` |
|
|
58
|
-
| a generated GLB for a concrete prop, vehicle, building, or object — from text or a reference image (`--image`); split into named parts (`model segment`); rig + animate any mesh (`model rig` / `model animate`) | `$genex-ai-model` |
|
|
59
|
-
| generated surface or terrain texture with real-world UV scale | `$genex-ai-texture` |
|
|
60
|
-
| sky, skybox, horizon, time of day, weather mood, night or space backdrop | build it in code in the scene—there is no sky command and no owning skill, so pick the technique this game needs |
|
|
61
|
-
| poster, sign, sprite, decal, reference sheet, or other 2D art | `$genex-ai-image` |
|
|
62
|
-
| in-world motion art or another requested video | `$genex-ai-video` |
|
|
63
|
-
| sound effect, one looping music bed, or a short spoken line | `$genex-ai-sfx`, `$genex-ai-music`, or `$genex-ai-voice` |
|
|
64
|
-
| requested UI/HUD/menu/interface work, a visible UI problem, or an interface you decided this game wants built with generated art | `$genex-threejs-game-ui` |
|
|
65
|
-
| selling anything for platform coin: a shop, an item catalog, boosts, cosmetics, "make it earn"; also any request for a loot box, gacha, wager, casino mechanic or donation prompt, which that skill refuses and replaces | `$genex-monetization` |
|
|
66
|
-
| cinematic menu/title/pause/victory/defeat/lobby/credits video treatment | `$genex-ai-menu` |
|
|
67
|
-
| drawn HUD chrome the game's style wants—one element or a matched set of frames, masks, and icons | `$genex-ai-hud` |
|
|
68
|
-
| the game works but feels flat, floaty, or unresponsive: input response, camera, impacts, cooldowns, difficulty, fail/retry | `$genex-threejs-game-feel` |
|
|
69
|
-
| realtime multiplayer: movement sync, shared ball/NPC, host-run scores/enemies, shots/emotes, persistence | `$genex-threejs-multiplayer` |
|
|
70
|
-
| players talking to each other by TEXT — chat, room chat, "let them type to each other" (`room.chat` + `npx genex controller chat`) | `$genex-threejs-multiplayer` |
|
|
71
|
-
| players TALKING — voice chat, mic, "hear each other", proximity/positional voice (`room.voice` + `npx genex controller voice`; party-sized, max 6 per room — say that number out loud before building the feature) | `$genex-threejs-multiplayer` |
|
|
72
|
-
| player identity, sign-in, guests, saves/progress, per-player state, shared persistent world, leaderboards—mandatory for every game | `$genex-threejs-embed-auth` |
|
|
73
|
-
| the player EXPLICITLY asks to make an asset or publish something from their game as an asset for the free library | `$genex-asset-author` (`genex asset new`) — never offer this unprompted; no game duty routes here |
|
|
37
|
+
The ownership table lives in **SKILL.md §4** so it is in front of you the
|
|
38
|
+
moment the director loads, rather than behind a link you have to decide to
|
|
39
|
+
open. This file keeps the request-shape and working-mode rules; read it when
|
|
40
|
+
the shape of the request, not the owning subsystem, is what is unclear.
|
|
74
41
|
|
|
75
42
|
## Request-sized execution
|
|
76
43
|
|
|
77
44
|
### Focused work
|
|
78
45
|
|
|
79
|
-
Load
|
|
46
|
+
Load the owning row or rows — before the first file of each subsystem, and
|
|
47
|
+
none beyond the work — preserve the current architecture, implement
|
|
80
48
|
the requested result, and run its relevant check. UI work routes directly to
|
|
81
49
|
UI; movement routes directly to movement; publishing routes directly to the
|
|
82
50
|
existing publish flow. Do not add a concept, unrelated asset batch, full-game
|
|
@@ -132,14 +100,17 @@ flow and state what remains.
|
|
|
132
100
|
|
|
133
101
|
## Procedural assets (code-built)
|
|
134
102
|
|
|
135
|
-
Use `$genex-threejs-procedural-assets` whenever code
|
|
136
|
-
|
|
137
|
-
props, parameterized objects — or when the player asks for procedural,
|
|
138
|
-
parametric, or code-built work. It is a first-class lane, not a fallback,
|
|
139
|
-
|
|
140
|
-
detailed world. An image alone still doesn't decide the route (ask the one
|
|
103
|
+
Use `$genex-threejs-procedural-assets` whenever code will honestly make the
|
|
104
|
+
object read as the thing it is — structural pieces, modular kits, repeated or
|
|
105
|
+
varied props, parameterized objects — or when the player asks for procedural,
|
|
106
|
+
parametric, or code-built work. It is a first-class lane, not a fallback, held
|
|
107
|
+
to the same bar as a generated GLB, and mixing it with generated GLBs in one
|
|
108
|
+
scene is the normal way to build a detailed world. An image alone still doesn't decide the route (ask the one
|
|
141
109
|
route question when both honestly fit), and never use it for player bodies,
|
|
142
|
-
rigged characters/creatures, or animation.
|
|
110
|
+
rigged characters/creatures, or animation. An OBJECT is this lane's unit; a
|
|
111
|
+
SPACE the player moves through — a level, an interior, a whole building — is
|
|
112
|
+
`$genex-blender-scene`'s, which falls back to this lane when the Blender lane
|
|
113
|
+
is off on the stand.
|
|
143
114
|
|
|
144
115
|
- Prefer a supplied reference. A private attachment stays local unless the
|
|
145
116
|
player explicitly permits upload, publication, or commit.
|
|
@@ -1,30 +1,34 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: genex-threejs-procedural-assets
|
|
3
|
-
description: Build editable, parameterized Three.js objects in code —
|
|
3
|
+
description: Build editable, parameterized Three.js objects in code — modular kits, structural pieces, repeated or varied props, and any object code will honestly make read as the thing it is — or whenever the user asks for procedural/parametric work. A first-class lane alongside generated GLBs, held to the same bar; mix both freely.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Genex Three.js Procedural Assets
|
|
7
7
|
|
|
8
8
|
Build a recognizable asset as local, editable Three.js code. This lane is a
|
|
9
|
-
first-class engine, not a fallback
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
first-class engine, not a fallback — and it is held to the same bar as a
|
|
10
|
+
generated GLB: the result must read as the thing it is when the player looks at
|
|
11
|
+
it, in the game's own style. A coloured box or a flat grey block is a blockout,
|
|
12
|
+
never a landed asset. Mixing procedural pieces with generated pieces in the
|
|
13
|
+
same scene is the normal way to build a detailed, lively world.
|
|
13
14
|
|
|
14
15
|
## Choose the route
|
|
15
16
|
|
|
16
17
|
- Start directly when the user says procedural, parametric, code-built,
|
|
17
18
|
customizable, seeded, or asks for controlled variations.
|
|
18
|
-
- Also start directly
|
|
19
|
-
|
|
20
|
-
placed many times with variation.
|
|
19
|
+
- Also start directly for what is structural, repeated, distant, or
|
|
20
|
+
parametric: terrain, modular environment kits, fences, pipes, rails, walls,
|
|
21
|
+
paving, and anything placed many times with variation.
|
|
22
|
+
- For anything the player looks at up close, walks into, or interacts with — a
|
|
23
|
+
named building, a signature prop, a vehicle — code is a choice, not a
|
|
24
|
+
default: take it only when you will honestly reach the bar above, and confirm
|
|
25
|
+
it in a capture at gameplay distance before the row reads `landed`. Otherwise
|
|
26
|
+
`$genex-ai-model` owns it.
|
|
21
27
|
- An attached or available image does not activate this skill by itself.
|
|
22
28
|
- If “make this image 3D” could honestly mean either route, ask exactly one
|
|
23
29
|
question: **“Do you want a generated textured GLB, or editable procedural
|
|
24
30
|
Three.js code?”**
|
|
25
31
|
- Use `$genex-ai-model` when the user chooses a generated textured GLB.
|
|
26
|
-
- Use this skill for props, hard-surface objects, modular decorations, and
|
|
27
|
-
simple structures or environment pieces.
|
|
28
32
|
- Do not use it for characters, creatures, rigging, skeletal animation, or
|
|
29
33
|
character likeness. Keep those in their existing specialist lanes.
|
|
30
34
|
|
|
@@ -60,6 +64,9 @@ proposed → planned → building (blockout | detail | material | runtime)
|
|
|
60
64
|
→ landed (<local TypeScript path>) → wired
|
|
61
65
|
```
|
|
62
66
|
|
|
67
|
+
`landed` means a capture at gameplay distance showed it reads as the thing it
|
|
68
|
+
is — not that the file exists.
|
|
69
|
+
|
|
63
70
|
A Genex-generated reference keeps its separate image row and normal paid
|
|
64
71
|
generation status. Note that the procedural-code row is derived from that
|
|
65
72
|
image. A private user reference is not a paid generation row.
|