Skip to content

Art Pipeline

denfry edited this page Oct 13, 2026 · 1 revision

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.

Core models

What exists

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.

Previews

  • 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); plus items.png, armor.png, fluids.png.

Turbine models

Enrichment models

Plant textures

Item icons

Fluids

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.

Blockbench formats by asset type

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

Technical constraints for modellers

  • 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 with glow_ 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.

Texture style

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

Repository layout and naming

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.

Generator scripts (art/tools)

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.

Rebuilding assets and previews

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.json

Validation only:

python art/tools/build.py . <tmp>/spec.json --only-check

Regenerate 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.

Art registry format

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.

Backlog

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).

See also

Clone this wiki locally