Art and Visuals

NeroAgriculture ships a cohesive "hydroponics lab" look: bright white/light-grey composite housing with a bio-green accent (keyed to the mod logo), soil and foliage organics for beds and crops, and the five fragment tiers coloured from the material catalog. Every block, item and crop has a hand-tuned procedural texture — no vanilla placeholders remain.

Texture pipeline

All textures and their model/blockstate/item-model JSON are produced by a single deterministic generator, so the art and the models can never drift apart:

  • tools/gen_textures.py — 32×32 pixel-art painters in the shared Neroland family style (cf. ../nerotech/tools/gen_textures.py): a lab-white composite base with a 2px bevel and corner rivets, recessed screens, green status LEDs, and a per-name deterministic seed so a re-run is byte-stable.
  • Run python3 tools/gen_textures.py to fill in any missing assets, or --force to repaint the whole set. The tool is additive by default and never clobbers an existing PNG without --force.
  • It writes textures/block/*, textures/item/*, textures/gui/* and the matching models/block/*, models/item/*, blockstates/* under common/src/main/resources/assets/neroagriculture.

Fragment tier colours

The five fragment tiers (Territe, Forgite, Orbite, Colonite, Voidite) are coloured straight from catalog/BuiltinMaterials.java: each tier's colour is the mean of its materials' catalog colours, so changing a catalog colour and re-running the generator repaints the tier's fragment item, compacted block and grow bed to match. The current derived colours are:

TierColourSource materials (catalog)
Territe#343434coal
Forgite#AB897Ecopper, iron, gold, redstone, lapis, quartz, nero alloy
Orbite#53D6B8diamond, emerald, plasma glass
Colonite#DDEEFFnether star
Voidite#6D7394echo shard, void crystal, starsteel

Crop growth

Resource, engineered-food and alien crops each have eight distinct growth sprites (age 0–7) drawn as cross models, so growth reads at a glance: resource crops sprout crystalline nodes near maturity, food crops raise golden grain heads, and alien crops swell into glowing purple pods. The blockstate maps each age to its stage model.

Machine GUI

The four foundation machines (Fragment Extractor, Fragment Infuser, Seed Synthesizer, Seed Research Bench) share one container menu, and the screen renders a light lab hull entirely with fills (no GUI texture asset, matching NeroTech's screen recipe). It dispatches a bespoke per-machine layout from the synced machine kind — each gets its own accent colour, header rule and a small input → process → output diagram (extractor funnel, infuser rings, synthesizer capsule, research-bench magnifier). Slot wells are drawn from the live menu slot list, and the energy gauge, work-progress bar and blocked-state readout are shared. The Research Bench keeps its clickable "discover" action.

Block models — layered, occlusion-safe

Machines, grow beds and the pollination beacon use multi-element models (not flat cubes), in the same style as NeroTech/NeroSpace: a machine is a plinth + inset body + raised console + four corner posts; a grow bed is a plinth + four raised walls + a recessed soil tray; the beacon is a plinth + tapered column + glowing lens. These are regenerated by tools/gen_models_layered.py (textures are unchanged). Because they are not full cubes, the corresponding blocks are registered noOcclusion so they never cull neighbours as if solid. Fragment blocks, greenhouse/tower frames and decor stay full cube_all blocks.

Greenhouse glass is a dedicated GreenhouseGlassBlock that is noOcclusion and skips the shared faces between adjacent glass (like vanilla glass), fixing the "transparent model on a solid block" render artefact so a glazed wall reads as one clean surface.

Fluid rendering

Nutrient and Biofuel each ship an animated still and flowing sprite (block/<fluid>_still, block/<fluid>_flow). From 26.x a fluid is drawn from a fluid model rather than from a blockstate, and a fluid with no registered model falls back to the missing-texture checkerboard — so the model has to be registered on every loader, through a different entry point on each:

LoaderRegistration
NeoForgeRegisterFluidModelsEvent (unbaked model)
ForgeModelEvent.BakeFluidModels (baked with the event's material baker)
FabricFabric API FluidRenderingRegistry.register (unbaked model)

All three register the same still/flow pair with no overlay and no tint, and the still and flowing fluid share one model. The chunk render layer is chosen by vanilla from the sprite's transparency, so no per-block layer registration is needed. Each fluid is a distinct FluidKind with its own fluid type, bucket and liquid block; adding a fluid means adding a kind, its two sprites, and nothing else per loader.

Demonstration farm

/neroagriculture gallery builds a working farm: a 3×2 grid of tier grow beds, each powered (Creative Battery) and nutrient-filled, with a fully grown ore crop on top (Coal — a Territe crop — on a Forgite bed, because the Territe bed is deliberately a passive plain block with no seed/output slots; Iron, Copper, Gold on Forgite; Diamond, Emerald on Orbite), flanked by a Planter and Harvester. Every crop is at max age, so right-clicking a grown crop harvests its fragment and leaves the crop planted (age resets to 0). Higher-tier ores still need their Core progression gate open to harvest — intended behaviour. Note: a freshly placed crop block with no material variant (e.g. from the block-grid showcase) is not harvestable; plant a seed or use the farm. /neroagriculture gallery clear removes exactly what the gallery placed this session — never surrounding builds.

Regenerating art

The generator is safe to re-run at any time. To add art for a new block or item, add a painter and a catalogue entry in tools/gen_textures.py, then run it; the coverage summary at the end reports the block/item/GUI texture counts. Keep this page and the generator in step when the visual language changes.

Search across every Nero mod wiki.