Repository navigation
Art Pipeline
Note
Current state: placeholder art. A generated placeholder set exists for every block, item and fluid in the registries of design sections 00–05: 269 block models, 46 moving partial models, 94 item icons, 35 fluids and 9 armor layers. None of it is final art, and the blocks are not yet registered in code. A further 267 assets from the later design sections are in the backlog. See Roadmap.
All models and textures for Prompt Critical are made in Blockbench. No other model editor is used, and code does not generate geometry. The exceptions are dynamic elements drawn by block entity renderers (BER): gauge needles, chart recorder paper and liquid levels.
The placeholder set is produced by Python scripts that paint textures procedurally and describe models as data, plus a Blockbench script that turns those descriptions into .bbmodel files, Java model JSON and preview renders.

From art/README.md:
| Asset | Count |
|---|---|
| Block models (including states) | 269 |
| Partial models (moved by code via Create/Flywheel) | 46 |
3D item model (fuel_assembly) |
1 |
| Flat item icons | 94 |
| Fluids and gases (still + flow, animated) | 35 |
| Armor layers for protective equipment (64×32) | 9 |
| Textures total | 498 + 70 fluid textures |
The 316 Blockbench sources live in 22 categories under art/blockbench/: control, conversion, core, enrichment, exploration, fuel_fabrication, fuel_handling, hydrometallurgy, instruments, items, mechanics, ore_processing, ores, piping, radiation, radiochemistry, reagents, safety, spent_fuel, turbine, ventilation, waste.
-
art/preview/models/<category>/<id>.png— a Blockbench render of every model (transparent background). -
art/preview/sheets/models_<category>.png— contact sheets of models per category. -
art/preview/sheets/textures_<area>.png— block textures (base,fuelcycle,mining,plant); plusitems.png,armor.png,fluids.png.





All sheets: control, conversion, core, enrichment, exploration, fuel_fabrication, fuel_handling, hydrometallurgy, instruments, items, mechanics, ore_processing, ores, piping, radiation, radiochemistry, reagents, safety, spent_fuel, turbine, ventilation, waste; textures base, fuelcycle, mining, plant; items, armor, fluids.
| Asset | Blockbench format | Export | In-game rendering |
|---|---|---|---|
| Static blocks (walls, pipes, valves, cabinets) | Java Block/Item | models/block/*.json |
Baked model |
| Block states (valve open/closed, lamp on/off) | Java Block/Item, one file per state | models/block/<id>_<state>.json |
Blockstate variants |
| Rotating and moving parts (centrifuge and turbine rotors, pump impellers, flywheel, rod drive winch drum, control rod) | Java Block/Item, one file per part | models/block/<id>/partial/<part>.json |
Partial models moved by code (Create/Flywheel) |
| Large multiblocks (turbine, steam generator, cascade) | Java Block/Item, split into 1×1×1 … 3×3×3 segments | Segments + partials | Baked segments per block; moving parts via BER/Flywheel |
| Items (fuel assemblies, pellets, dosimeters, protective gear) | Java Block/Item | models/item/*.json |
Item model |
| Armor / protective suits on the player | Modded Entity → HumanoidModel layer |
Java layer class + texture |
ArmorItem + custom layer; GeckoLib is not used |
- Java model elements must stay within −16…32 (at most 3×3×3 blocks) and rotate only in 22.5° steps around one axis. Anything larger or at another angle is split into segments or partials.
- The pivot of a rotating part must lie on the Create shaft axis (block center, X/Y/Z axis per blockstate), otherwise the part wobbles when instanced. Partials use the pivot
[8, 8, 8]. - Glowing elements (annunciator lamps, indicators, Cherenkov glow) use the NeoForge per-element extension
neoforge_data: { block_light: 15, sky_light: 15 }; no separate emissive layer. In the generated set, every element whose name starts withglow_gets it. - Animated textures (boiling water, spent fuel pool glow, lamp flicker) use
.png.mcmeta. Blockbench keyframe animations are not exported for blocks; code does the motion. - Gauge faces, chart recorder paper and sight-glass levels are only a flat backing texture. The needle, pen and level are drawn by a BER from instrument subscription data. Scale divisions and numbers are also generated client-side into a dynamic texture, because the player configures the range.
| Rule | Value |
|---|---|
| Base resolution | 16×16 per block face (32×32 only for instrument faces that need a readable scale) |
| Palette | Compatible with Create (brass, andesite, copper) plus an "atomic" palette: painted steel, concrete, lead, yellow-black hazard marking, radiation trefoil |
| UV | Per-face UV, no box UV for blocks |
| Marking | Pipe and medium colours by purpose (primary circuit, steam, feedwater, chemical reagents) following GOST 14202, so the flowsheet reads in the world without tooltips |
art/blockbench/<category>/<id>.bbmodel Blockbench sources (committed)
art/blockbench/<category>/<id>/<part>.bbmodel partial parts
art/preview/models/<category>/<id>.png renders
art/preview/sheets/*.png contact sheets
art/tools/ generator scripts
pc-mod/src/main/resources/assets/promptcritical/
models/block/<id>.json
models/block/<id>/partial/<part>.json
models/item/<id>.json item/generated for flat icons
textures/block/..., textures/item/..., textures/models/armor/...
textures/block/fluid/<id>_still.png(.mcmeta), <id>_flow.png(.mcmeta)
The .bbmodel name matches the block ID from the registry. Partial models will be registered in a client class PcPartialModels. Blockstate files and default item models are meant to come from datagen; exported Blockbench models are only referenced by path. The exported JSON is committed together with its .bbmodel. CI is planned to check that every registered block has a model and a texture.
| Script | Purpose |
|---|---|
pclib.py |
Shared helpers and registries: TEXTURES["block/<path>.png"] = fn, model(id, category, textures, elements, java_path, kind), item(id, texture), fluid(id, base_hex, kind="liquid"|"gas")
|
tex_base.py, tex_mining.py, tex_fuelcycle.py, tex_plant.py
|
Procedural textures per area (common materials, ores and hydrometallurgy, fuel cycle, plant and control room, armor layers) |
spec_base.py, spec_mining.py, spec_fuelcycle.py, spec_plant.py
|
Model descriptions (elements, texture keys) per area |
build.py |
Writes all textures, item models and animated fluid textures, plus spec.json and registry.json. --only-check validates Java model limits (−16…32, ±22.5/±45° angles, single axis), duplicate IDs and texture references without writing |
blockbench_build.js |
Runs inside Blockbench desktop: spec.json → .bbmodel + Java JSON + preview PNG, in batches |
make_previews.py |
Builds the contact sheets in art/preview/sheets/ from renders and textures |
collect_backlog.py |
Builds the consolidated art backlog from the "Art registry" subsections of the design document (needs the private docs/gdd) |
Python requirements: NumPy and Pillow.
The commands from art/README.md:
# 1. Textures, item models, fluids, spec.json + registry.json
python art/tools/build.py . <tmp>/spec.json
# 2. In Blockbench (desktop), via the console or MCP:
# eval(require('fs').readFileSync('<repo>/art/tools/blockbench_build.js', 'utf8'))
# pcRun('<repo>', '<tmp>/spec.json', {from: 0, count: 30}); pcFlush()
# Repeat in batches (from: 30, 60, ...) to keep the editor responsive.
# 3. Contact sheets
python art/tools/make_previews.py . <tmp>/registry.jsonValidation only:
python art/tools/build.py . <tmp>/spec.json --only-checkRegenerate the backlog:
python art/tools/collect_backlog.py .Warning
The scripts still assume the pre-split layout, with assets in <root>/src/main/resources/assets/promptcritical. The assets now live in pc-mod/src/main/resources/..., while art/ stays at the repository root. build.py only uses the root for assets, so you can run it as python art/tools/build.py pc-mod <tmp>/spec.json. make_previews.py and blockbench_build.js read assets and write to art/ from the same root, so their paths need adjusting before a full rebuild.
Important
Once a model has been refined by hand in Blockbench, its .bbmodel becomes the source of truth. Re-running the generator overwrites both the model and its PNGs. Mark hand-made assets as MODELED (see below) and exclude them from regeneration.
Every design section that introduces a new block, item, fluid or armor layer must end with an Art registry table. The art pipeline builds placeholders from it without reading the rest of the section.
| Field | Meaning |
|---|---|
id |
Registry ID (equals the .bbmodel name) |
category |
Folder art/blockbench/<category>/
|
kind |
block | block_states | multiblock_segment | partial | item_3d | item_flat | fluid | armor_layer
|
size |
In blocks, W×H×D (for multiblocks: full size and segment grid) |
states |
Blockstate variants (open/closed, on/off, lit, levels) |
partial |
Moving parts: name: axis, pivot, motion
|
textures |
Material and palette, GOST 14202 colour for pipes and fluids, .mcmeta animation, glow_ elements |
reference |
Real-world prototype for the modeller |
priority |
★ (release 1.0) | B (backlog) |
milestone |
Milestone from the Roadmap |
Status lifecycle: TODO (nothing yet) → PLACEHOLDER (generated by spec_*.py) → MODELED (refined by hand in Blockbench) → DONE (checked in game). Manual statuses go into art/backlog_status.json as {"<id>": "MODELED"} or "DONE"; PLACEHOLDER is detected from the existence of art/blockbench/**/<id>.bbmodel.
The art backlog is generated by collect_backlog.py and must not be edited by hand. The existing 269 placeholders of sections 00–05 are described in art/README.md and are not listed there unless a section has its own art registry.
| Status | Rows |
|---|---|
| TODO | 265 |
| PLACEHOLDER | 2 |
| MODELED | 0 |
| DONE | 0 |
| Total | 267 |
By design section:
| Section | Rows | Examples |
|---|---|---|
| Energy-Grid (07) | 105 |
electric_generator, hv_circuit_breaker, power_transformer, transmission_tower, water_tube_boiler
|
| Operations-and-Safety (13) | 52 |
lockout_padlock, work_permit, gas_mask, flare_stack, flame_detector, sprinkler_head
|
| Automation-Platform (03d) | 50 |
relay, time_relay, stepping_switch, cam_controller, analog_integrator, PLC modules |
| Isotopes-and-RTG (12) | 31 |
irradiation_channel, gamma_irradiator_pool, rtg_thermoelectric, radiography_camera
|
| Player-Content (11) | 28 |
training_simulator, czochralski_puller, engineering_handbook, electronics components, decor families |
| SCADA-and-HMI (03c) | 1 | core_cartogram |
246 rows are priority ★ (release 1.0) and 21 are B (backlog). Automation assets are split between M3 (22 rows: relays and analog blocks) and M6 (25 rows: PLC and SIS hardware).
- Building-from-Source — where assets end up in the jar
- Architecture — client rendering and BER plans
- Create-Integration — which parts rotate and why pivots matter
- Roadmap — art by milestone
Prompt Critical · © 2026 denfry · Repository · Report an issue
Start here
Design
Nuclear
Industries
Control and automation
World and server
Development