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. Most blocks, items and crops use the mod's procedural textures; the curated seed models below intentionally reuse Minecraft's material textures on custom geometry.
Resource seed models
Minecraft 26.1.2 and newer select the seed model directly from the saved material component, so existing seeds retain their identity and genetics without conversion. These designs use separate geometry and familiar material textures:
| Resource | Model detail |
|---|---|
| Coal | Irregular dark shell |
| Iron | Metal casing with side plates |
| Copper | Copper shell with weathered accents |
| Gold | Filigree rails and crown |
| Redstone | Wide angular core |
| Diamond | Stepped crystal point |
| Nerosium | Pale metallic shell with asymmetric fins |
| Nerosteel | Dark casing with bright braces |
| Xertz Quartz | Violet crystal with side spurs |
| Cindrite | Warm fractured shell with a crest |
| Glacite | Broad icy base and pointed tip |
| Hematite | Rust-red layered casing with iron braces |
| Voidglass | Dark core with an asymmetric violet crystal crown |
The same materials have matching fragment models based on the seed's mineral shape. Other materials can
use the tintable metal, crystal or carbon item families through their datapack visual_family; generic
and unknown materials use the existing tinted seed and fragment models. Items made before this field
was added keep their saved appearance data until replaced, and older Minecraft versions retain the
generic item fallback. Planted crops use bounded metal, crystal,
carbon or generic model families across all eight growth stages; unknown materials use generic. Older
plants keep their saved material and history and adopt their family's shape when they next grow or are
harvested. Resource packs can extend the component selector in
assets/neroagriculture/items/resource_seed.json and add models under models/item/seed/; include a case
for each tier that should use the design, and retain the fallback for unrecognised materials.
Mars Hematite and Nyxara Voidglass use the metal and crystal planted-crop families respectively. Resource crop sprites use neutral shading so their catalog colours remain visible when tinted.
Texture pipeline
Most original textures and models were produced by a deterministic generator. The resource crop blockstate and curated resource models are hand-maintained and must not be overwritten by regeneration. Grow beds have tier marks as well as colour, a planted soil tray and a nutrient-window motif; machine faces have distinct functional glyphs and instrument panels.
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 --refresh-panelsto repaint only machine side and grow-bed side and top textures, without changing models or blockstates. The general generator also writes model and blockstate JSON, including hand-maintained files; review its effects before running it. - 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;
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.