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.pyto fill in any missing assets, or--forceto 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 matchingmodels/block/*,models/item/*,blockstates/*undercommon/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:
| Tier | Colour | Source materials (catalog) |
|---|---|---|
| Territe | #343434 | coal |
| Forgite | #AB897E | copper, iron, gold, redstone, lapis, quartz, nero alloy |
| Orbite | #53D6B8 | diamond, emerald, plasma glass |
| Colonite | #DDEEFF | nether star |
| Voidite | #6D7394 | echo 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:
| Loader | Registration |
|---|---|
| NeoForge | RegisterFluidModelsEvent (unbaked model) |
| Forge | ModelEvent.BakeFluidModels (baked with the event's material baker) |
| Fabric | Fabric 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.