Текстуры
Каждый файл с автором, источником и лицензией или запросом, по которому он создан
Batch 1, 2026-10-25, made by the j12-artist agent in Textures mode, following openspec/ART.md.
- Format: every texture is
public/textures/<name>/albedo.png, 1024x1024 PNG. Tiling textures are RGB. Alpha cards are RGBA, with colour bled into the transparent pixels so mipmaps don't fringe. - Tools: ChatGPT returns 1254x1254 and Gemini returns 1024x1024. No texture was enlarged beyond the tool's output, except where a whole-pattern crop (
wicker,rope,limestone_blocks) was resized back to 1024. Those crops were 892–1125 px, so they were scaled by 0.9–1.15. - Seam fix (scratchpad
tile.py, Pillow + numpy):- Optional "flatten" divides out large-scale lighting so repeats are less obvious.
- A min-error-boundary cut (image-quilting style), 6–24 px feather, is applied over a 10–12% overlap, first left/right and then top/bottom.
- Regular patterns are cropped to a whole number of repeats first:
--periodfor weaves and--vperiodfor brick courses and planks. Rope uses whole rows with a left/right-only fix.
- Seam check: each result was offset by half its width and height and inspected by eye (the files are in the scratchpad under
checks/<name>_offset.png). The table also gives a numeric seam ratio, |wrap-edge difference| / mean neighbouring-pixel difference, where about 1.0 means invisible. - Grading: some textures were nudged toward the ART.md palette anchors by a per-channel gain on the mean colour (scratchpad
grade.py). The amount is noted per texture. - Contact sheet:
public/textures/_contact.pngshows every texture tiled 2x2. Alpha cards are shown on a slate backdrop. - Variants: alternates that were not chosen are in
public/textures/_variants/.
Summary
| name | tiles | seam h/v | source | grade |
|---|---|---|---|---|
| sand | yes | 1.06 / 1.05 | ChatGPT | toward #e2c48e, 0.6 |
| wet_sand | yes | 1.00 / 0.93 | ChatGPT | toward #b0946a, 0.5 |
| grass_lush | yes | 0.96 / 1.11 | ChatGPT | toward #7d9a4a, 0.5 |
| grass_dry | yes | 1.00 / 1.00 | ChatGPT | toward #b9b25e, 0.6 |
| dirt_path | yes | 1.01 / 0.92 | ChatGPT | toward #a87a4a, 0.5 |
| rock | yes | 1.24 / 0.96 | ChatGPT | none |
| basalt_wall | yes | 1.04 / 0.74 | ChatGPT | toward #5a524c, 0.8 |
| limestone_blocks | yes (whole courses) | 0.92 / 0.86 | ChatGPT | toward #efe4cc, 0.6 |
| mud_roof | yes | 0.94 / 0.94 | ChatGPT | toward #a8835a, 0.5 |
| wood_planks | yes (whole planks) | 1.33 / 0.50 | ChatGPT | toward #8a5a34, 0.5 |
| wood_beam | yes | 1.09 / 0.86 | ChatGPT | none |
| plaster | yes | 1.21 / 1.46 | Gemini | none |
| cobbles | yes | 1.13 / 1.13 | ChatGPT (Gemini variant kept) | toward #6a5a48, 0.4 |
| terracotta | yes | 1.00 / 1.01 | ChatGPT (Gemini variant kept) | toward #c4704a, 0.5 |
| wicker | yes (whole weave) | 1.23 / 0.44 | Gemini | none |
| rope | yes (whole rows) | 1.01 / 4.52* | Gemini | none |
| linen | yes | 1.07 / 0.96 | ChatGPT (Gemini variant kept) | toward #efe4cc, 0.6 |
| wool | yes | 0.88 / 0.93 | ChatGPT | none |
| olive_leaves | card (no tiling) | n/a | Gemini, magenta key | none |
| palm_frond | card | n/a | Gemini, magenta key | none |
| reeds | card, base on bottom edge | n/a | Gemini, magenta key | none |
| grass_tuft | card, base on bottom edge | n/a | Gemini, magenta key | none |
| fishing_net | yes, alpha | 1.28 / 2.82* | ChatGPT, native transparency | none |
* The high numbers come from the metric, not a visible seam. For rope, the top and bottom edges both fall in the dark gap between rope rows. For the net, thin cords over transparency inflate the ratio. Both look clean in the half-offset check.
Foliage cards were keyed on magenta, not green: a green key would eat the green and sage leaves. The net (brown) was first tried on green from Gemini, but that mesh was irregular and wouldn't tile, so the ChatGPT version with real transparency was used.
ChatGPT prompts (one conversation, in this order)
The first prompt set the style. Each later prompt starts with "Same style and same rules (square 1:1, seamless tileable, flat top-down [or front-on] view, even lighting, edge to edge, painted light and AO baked in, broad brush strokes, no text, no border, no vignette). Next texture: ..." and then the material text below.
-
sand (full prompt):
Create an image: a square 1:1 seamless tileable hand-painted stylized game texture of warm golden beach sand, World of Warcraft style. Flat top-down orthographic view filling the entire square edge to edge, even lighting across the whole tile, soft painted top-down light and gentle ambient occlusion baked in, broad confident brush strokes, readable shapes, soft wind ripples and a few tiny scattered pebbles and shell fragments, subtle colour variation from pale cream to ochre around #e2c48e. No high-frequency photographic noise, no text, no border, no frame, no vignette, no perspective, no shadows from off-tile objects. The left and right edges and the top and bottom edges must continue seamlessly so the tile repeats without visible seams.
-
wet_sand: wet beach sand at the waterline of a lake, darker damp ochre-brown sand with a slightly cooler tone, smooth glossy patches with soft painted highlights, a few small dark wet pebbles and faint shallow water-trickle marks.
-
grass_lush: lush green meadow grass seen from directly above, dense clumps of painted grass blades in olive and sage greens around #7d9a4a and #9db07a, darker green shadows between clumps, warm yellow-green highlights on blade tips, a very few tiny white and yellow wildflowers. Stylized clumpy grass like World of Warcraft Elwynn Forest ground, not photographic.
-
grass_dry: dry summer grass of the Galilean hills seen from directly above, sparse straw-yellow and khaki grass clumps around #b9b25e with olive undertones, patches of pale dusty earth showing between clumps, a few small stones and dry seed heads. Stylized and painterly, not photographic.
-
dirt_path: a packed dirt footpath seen from directly above, warm ochre-brown compacted earth, faint scuffs and sandal-worn smooth areas, small embedded pebbles and a few flat stones, tiny dry grass bits at random, darker damp cracks. The path material fills the whole tile (no grass edges), stylized and painterly.
-
rock: large rough rock surface for big boulders and cliffs, a mix of warm grey limestone and dark charcoal basalt, chunky faceted planes painted with broad strokes, crisp warm highlights on upper edges, dark cracks and crevices with soft ambient occlusion, a few small patches of olive lichen. Stylized World of Warcraft rock, chunky readable shapes, not photographic.
-
basalt_wall (front-on view of a wall): a rough dry-stone house wall of black basalt blocks as in 1st-century Capernaum, irregular roughly squared chunky basalt stones of varied sizes laid in uneven courses, warm charcoal colours (lit #5a524c, shadow #2e2a28) never pure black, subtle pitted volcanic surface painted with broad strokes, warm highlights on the top edges of each stone, deep soft shadows and packed mud mortar with small chinking stones in the joints.
-
limestone_blocks (front-on view of a wall): a wall of large dressed white limestone ashlar blocks for a 1st-century synagogue, rectangular blocks in regular staggered courses, warm creamy limestone around #efe4cc with soft ochre and pale grey variation, slightly worn rounded edges with warm highlights, thin shadowed joints, a few small chips and faint weathering stains.
-
mud_roof: a flat village roof of packed mud over reeds as in 1st-century Galilee, seen from directly above: smoothed and cracked brown clay-mud surface around #a8835a with straw and reed stalks poking through in places, some areas where the mud has worn away to show bundled reeds laid in parallel, small dry cracks, a few pebbles, dusty sun-bleached highlights.
-
wood_planks: rustic wooden floor and deck planks, long horizontal planks of equal width running left to right across the whole tile, warm brown wood around #8a5a34 with varied plank tones, chunky painted wood grain, a few knots, slightly worn rounded plank edges with warm highlights and dark gaps between planks, a few iron-free wooden pegs. Stylized World of Warcraft wood.
-
wood_beam: the side of one old weathered roof beam, a single rough-hewn timber surface filling the whole tile, long wood grain running horizontally left to right, sun-bleached grey-brown weathered wood with warmer brown beneath, deep painted grain cracks and checks, adze marks, a couple of knots, warm highlights on raised grain. Stylized World of Warcraft wood.
-
wool: coarse hand-woven sheep's wool cloth as used for a 1st-century tunic or mantle, seen as a flat fabric surface: a fine dense weave where the threads are only just visible (not a basket, not big woven strips), soft slightly fuzzy fibres, warm undyed earthy brown with subtle lighter and darker heathered flecks, one or two faint narrow darker woven stripes running vertically, very soft broad fold shading only.
-
fishing_net:
Very nice. Now a different asset in the same hand-painted World of Warcraft style: a seamless tileable texture of a traditional hand-knotted fishing net, square 1:1, on a fully TRANSPARENT background (PNG with alpha). A perfectly regular square-diamond mesh of thick twisted tan-brown hemp cord, exactly 8 identical diamonds across and 8 down, all diamonds the same size, with a small knot at every crossing, knots placed exactly on the four edges and corners of the image so the mesh continues seamlessly when tiled. No broken strands, no background colour, no shadow, no text, no border.
The result has 6 diamonds per side, with a period of exactly 1254/6 = 209 px, so it tiles natively. It was downscaled to 1024.
-
cobbles: an ancient village street of chunky rounded cobbles and irregular flat fieldstones, mostly warm charcoal basalt stones (#5a524c) mixed with a few pale limestone ones, packed ochre earth and dust in the joints with a few tiny weeds, each stone with warm highlights on top and soft dark AO in the gaps. Stylized World of Warcraft cobblestones.
-
terracotta (rules plus "even lighting across the whole tile with no large light or dark patches"): the surface of a large unglazed terracotta storage jar, warm orange-red fired clay around #c4704a, evenly distributed small-scale variation: faint horizontal throwing-wheel ridges, soft mottled lighter and darker clay tones, tiny pale grit specks and a few small chips, evenly spread so no single feature stands out when tiled.
-
linen: undyed natural linen cloth for a tunic, a fine plain weave where the threads are only just visible, soft cream and off-white around #efe4cc with faint warm beige mottling and a few irregular slub threads, completely flat fabric with no folds or wrinkles, evenly spread detail so it repeats invisibly. Painterly stylized, not photographic.
Gemini prompts (one conversation, in this order)
-
terracotta (now
_variants/terracotta_gemini.png):Generate an image: a square 1:1 seamless tileable hand-painted stylized game texture of a terracotta clay pot surface, World of Warcraft style. Flat front-on orthographic view filling the entire square edge to edge, warm orange-red fired clay around #c4704a with subtle variation, faint horizontal throwing-wheel grooves, a few soft chips and pale dusty patches, soft painted top-down light and gentle ambient occlusion baked in, broad confident brush strokes, readable shapes. No photographic noise, no text, no border, no frame, no vignette, no perspective, no object outline, even lighting across the whole tile. The left and right edges and the top and bottom edges must continue seamlessly so the tile repeats without visible seams.
-
wicker (kept): woven wicker basketry, a regular over-under weave of thick flat palm-leaf and reed strips in warm straw and honey tones, darker gaps between strands, soft painted highlights on each strand. (Prefixed with "Same style and same rules (...)".)
-
rope (kept, after reworking): thick twisted hemp and palm-fibre rope, several parallel strands of rope lying side by side horizontally filling the whole square, each rope showing a clear spiral twist, warm tan and straw-brown tones with darker grooves, a few loose fibres.
The bottom ~10% contained an unrelated woven strip, so the image was cropped between the rope-row gaps at y = 63 and y = 955 (7 whole rows, period about 127 px), and only the left/right seam was fixed.
-
linen, first attempt: rejected. Gemini painted a giant basket weave.
-
wool: rejected for the same reason.
-
linen, second attempt (now
_variants/linen_gemini.png): fine plain weave, but it has soft folds, which were flattened out. The ChatGPT linen was preferred because it has no fold residue when tiled. -
plaster (kept): rough lime plaster wall render on a village house, warm off-white and pale ochre lime wash, uneven hand-trowelled surface with soft bumps, a few hairline cracks, patches where the plaster has flaked showing slightly darker earth beneath, faint dirt staining. Stylized World of Warcraft painted wall, not photographic.
It has two flaked patches that show mudbrick, and these repeat visibly at tile scale. A later "no flakes" retry came out as flat yellow paint swatches and was discarded.
-
cobbles (now
_variants/cobbles_gemini.png): ancient village street of rounded cobbles and irregular flat fieldstones, mostly dark charcoal basalt mixed with a few pale limestone ones, packed ochre earth in the joints. One odd cracked stone with a brick-like interior repeats, so the ChatGPT version replaced it. -
olive_leaves (kept): alpha card, square, a dense clump of olive sprigs with narrow lance-shaped leaves, dusty sage green on top with silvery undersides, a few small dark olives, on a completely flat pure magenta #FF00FF background.
-
palm_frond (kept): a single date palm frond seen flat from above, curved central rib from the bottom-left corner toward the top-right, long narrow leaflets, olive and sage green with yellowish tips and a dry brown base, on magenta.
-
reeds (kept): a clump of tall lakeside reeds and rushes seen from the side, slender stalks and blade leaves, a few cattail seed heads and feathery plumes, sage and olive fading to straw tips, on magenta. Shifted down 26 px so the base sits on the bottom edge.
-
grass_tuft (kept): a single chunky clump of meadow grass from the side, blades fanning from one base point at bottom centre, olive and sage with yellow-green tips, two or three small white and yellow flowers, on magenta. Shifted down 22 px.
-
fishing net on #00FF00: the first send returned "I don't seem to have access to that content", and a resend worked. The mesh is irregular (the horizontal period drifts and there are two broken strands), so the cut-and-blend fix and a mirror-tile both showed misaligned diamonds. It was replaced by the ChatGPT net.
CC0 cross-check sources (not downloaded; recorded for reference)
| Set | Author | Licence | Notes |
|---|---|---|---|
| 8 handpainted style textures | rubberduck | CC0 | 1024x1024 with normal, height, spec and roughness maps. Cobblestone, earth, fabric, floor tiles, cracked ground, rock, wood. GMIC-filtered from photos, so less painterly than ours. |
| Ancient Civ. in the Jungle, 269 seamless textures | DevEarley | CC0 | Hand-painted but mostly 128x128: too small for terrain at our scale, though usable for distant LODs or as a palette reference. |
| 4 hand painted ground textures | drummyfish | CC0 | 512x512: grass, dirt, sand, pavement. |
| Tileable bricks ground textures set 1 | Cethiel | CC0 | 512x512 with normals. |
| Stylized Texture Pack | Lynocs | CC0 1.0 (as listed) | Large stylized set: grass, mud, stone walls and more. The author asks that it not be resold. |
Licences for rubberduck and DevEarley were confirmed on their pages. The other three come from search listings only, so check them before use.
ambientCG and Poly Haven (both CC0) are photographic, so they're only useful as a base. The generated set above is more consistent with the WoW painted look and with each other, so no CC0 texture was substituted.
Batch 2: tree bark, palm trunk, boulders, leaf cards (j12-artist, 2026-10-27)
Asked for because rocks and trees looked like plain flat-shaded polygons ("rocks and trees need texture and form"). All of it came from ChatGPT only (one conversation, "Create Bark Texture Image"), 1254x1254 output (the concept is 1536x1024). Nothing was enlarged.
- Pipeline: the same as batch 1, rebuilt in the scratchpad (
tex.py, Pillow + numpy + scipy in a venv). A min-error-boundary cut over an 11% overlap (12–14 px feather), first left/right and then top/bottom. A wrap-mode large-scale "flatten" (sigma 10–15% of width) divides out broad lighting. Then a Lanczos resize to 1024, a per-channel gain toward the target mean (grade), and a half-offset check by eye. - New outputs: each opaque texture ships
albedo.png,albedo.jpg(q88) andnormal.jpg. - Normal maps: tangent space, OpenGL convention (green = +Y up). Height is the albedo luminance, blurred with wrap-around sampling: 65% broad (sigma 6–8 px) and 35% fine (sigma 1.5 px). Wrapped central differences then give a map that tiles exactly as the albedo does. Strength was tuned so the mean normal z is about 0.89–0.95 (moderate: broad forms, not noise).
- Saved as JPEG q92 with 4:4:4 chroma (no subsampling). With default 4:2:0 subsampling, the wrap edge measured 1.8–2.0, against 1.05–1.15 for the lossless map, because normal maps carry their signal in chroma. Keep 4:4:4 for any future normal JPEGs.
- Leaf cards: generated on flat magenta and keyed with alpha = 1 − smoothstep(min(R,B) − G, 15..70). Then:
- Magenta spill is pulled out of R and B.
- Specks under 60 px are dropped.
- Defringe: alpha is shrunk by 1 px, and the 2 px edge band takes its colour from the nearest interior pixel. This removed a thin orange-pink rim that showed over light backgrounds.
- Colour and alpha are resized separately. Resizing RGBA in Pillow premultiplies, which zeroes the bled colour.
- Colour is bled into every transparent pixel (nearest opaque, softly blurred).
| name | files | tiles | seam h/v (png) | normal seam h/v | mean | grade |
|---|---|---|---|---|---|---|
| bark_rough | albedo.png/.jpg, normal.jpg | yes | 1.17 / 0.88 | 1.15 / 1.20 | #867662 | from #725d49 toward #8a7a66, 0.85 |
| bark_smooth | albedo.png/.jpg, normal.jpg | yes (see note) | 1.27 / 1.30 | 1.39 / 1.37 | #a29886 | from #9e8b73 toward #a39a8a, 0.85; then column/row brightness flatten |
| palm_trunk | albedo.png/.jpg, normal.jpg | yes (whole periods) | 1.07 / 0.81 | 1.10 / 1.02 | #977a47 | from #8d6945 toward #9a8048, 0.75 |
| boulder_limestone | albedo.png/.jpg, normal.jpg | yes | 1.09 / 0.92 | 1.27 / 1.06 | #b8a990 | from #b99c75 toward #b8ab95, 0.85 |
| boulder_basalt | albedo.png/.jpg, normal.jpg | yes | 1.10 / 1.06 | 1.23 / 1.26 | #5c524b | from #665344 toward #5a524c, 0.85 |
| rock | normal.jpg only (albedo unchanged) | yes | (albedo 1.39 / 1.09) | 1.20 / 1.17 | #73624b | none |
| broad_leaves | albedo.png (RGBA) | card | n/a | n/a | #666e43 | from #6c6b3c toward #627048, 0.6; coverage 61% |
| cypress_sprays | albedo.png (RGBA) | card | n/a | n/a | #4e5738 | from #505534 toward #4c5a3e, 0.4; coverage 56% |
Notes:
- bark_rough: grain runs vertically (V along the trunk). The four small knots per tile are visible as a repeat at 2x2. Fine on a trunk, but don't tile it more than 2–3 times around the girth.
- bark_smooth: this is the softest, lowest-contrast texture, so its seam ratio is the highest of the batch. In the 1:1 half-offset check there's no hard seam, only one slightly kinked fold near the top of the vertical cut. As generated it had a lighter vertical band that repeated visibly at 2x2. Dividing out the column and row brightness profiles (sigma 12 px, wrap) fixed that. Horizontal folds and lenticels run around the trunk.
- palm_trunk: a regular lattice. Autocorrelation gave a period of 380 px horizontally and 285 px vertically, so 3 × 380 = 4 × 285 = 1140. A 1240 px square was cropped (100 px overlap, one whole period apart), so the min-cut lands on matching content, and then it was resized 1140 → 1024. Rows run horizontally, and V runs along the trunk.
- boulder_limestone and boulder_basalt: these are prompted for triplanar use (no directional light, isotropic). The basalt "lichen" spots are drawn as tiny rosettes and read a little like small flowers up close. At boulder scale they read as lichen.
- rock normal: derived from the existing batch 1
rock/albedo.jpg. Its baked top-light means lit facet tops read as raised, which agrees with the painted lighting.
Prompts (ChatGPT, one conversation, in this order)
- bark_rough (full prompt):
Create an image: a square 1:1 seamless tileable hand-painted stylized game texture of deeply furrowed old tree bark (ancient olive, oak and terebinth bark), World of Warcraft style. Flat front-on orthographic view of the bark surface filling the entire square edge to edge, as if the trunk were unrolled flat. The grain runs strictly VERTICALLY, top to bottom: thick chunky vertical ridges of bark that twist and braid slightly, separated by deep dark furrows, with two or three small knots and gnarled burls. Neutral grey-brown colour with a mid value (overall average around #8a7a66), warm lighter highlights on the ridge tops, soft dark ambient occlusion in the furrows, subtle hints of warm umber and cool grey. Broad confident painted brush strokes, chunky readable value shapes, clear painted form, not photographic and not flat colour. Even lighting across the whole tile with no large light or dark patches, no strong directional shadow. No text, no border, no frame, no vignette, no perspective, no trunk edges or background. The left and right edges and the top and bottom edges must continue seamlessly so the tile repeats without visible seams.
- bark_smooth:
Good. Same style and same rules (square 1:1, seamless tileable, flat front-on view, even lighting across the whole tile, edge to edge, painted light and AO baked in, broad brush strokes, chunky readable value shapes, no text, no border, no vignette). Next texture: smooth pale bark of a fig, sycomore, almond or walnut tree, unrolled flat: smooth neutral light grey bark (overall average around #a39a8a) with faint short horizontal lenticel marks in loose rows, a few fine shallow cracks, two or three soft horizontal wrinkle folds like elephant skin, very subtle warm beige and cool grey mottling. The trunk axis runs vertically, top to bottom. Hand-painted World of Warcraft style, soft painted form, not photographic, not flat colour, no knots that stand out strongly.
- palm_trunk:
Same style and same rules. Next texture: the trunk surface of a date palm, unrolled flat: overlapping diamond-shaped leaf-base scars (old frond stubs) arranged in neat staggered rows that run HORIZONTALLY across the tile, like a woven lattice of chunky diamond scales, each scale with a slightly raised lower lip and a darker recess above it, coarse brown fibre showing in the gaps between the scales. Warm tan-brown colour (overall average around #9a8048) with lighter sun-bleached straw highlights on the scale edges and darker umber in the recesses. The trunk axis runs vertically, top to bottom. Make the pattern repeat evenly with a whole number of rows from top to bottom and a whole number of diamonds from left to right, so it tiles seamlessly. Hand-painted World of Warcraft style, not photographic.
- boulder_limestone:
Same style and same rules. Next texture, for the surface of big rounded boulders (it will be projected from all directions, so it must look the same in every orientation): weathered pale Galilean limestone rock surface filling the whole tile, warm pale cream-grey stone (overall average around #b8ab95) broken into soft chunky painted planes and shallow rounded solution hollows and pits, a few meandering cracks, faint ochre and rust staining in streaks and patches, and a few small grey-green and pale sage lichen patches. Even lighting with NO directional light and NO cast shadows: only soft ambient occlusion inside the pits and cracks and gentle lighter tops on the raised areas. Isotropic, no dominant direction, evenly spread detail with no single feature standing out when tiled. Hand-painted World of Warcraft stylized rock, chunky readable value shapes, not photographic, not flat colour.
- boulder_basalt:
Same style and same rules, same boulder use (projected from all directions, so no directional light, no cast shadows, isotropic, evenly spread detail). Next texture: dark vesicular Galilean basalt boulder surface filling the whole tile, warm charcoal stone (overall average around #5a524c, never pure black) with many small round gas-bubble pits and pores of varied sizes, chunky softly faceted painted planes, a few fine cracks, slightly rusty reddish-brown weathering patches, and a few small pale grey-white and pale sage lichen spots. Soft ambient occlusion inside the pits, gentle lighter warm-grey tops on raised areas. Hand-painted World of Warcraft stylized rock, chunky readable value shapes, not photographic, not flat colour.
- broad_leaves:
Now a different kind of asset in the same hand-painted World of Warcraft style: a foliage alpha card for game trees. Square 1:1 image of a dense clump of broad leaves on short twigs, generic Mediterranean broadleaf foliage (oak, terebinth, carob, fig): many overlapping broad oval and softly lobed leaves of different sizes, painted as chunky readable leaf shapes with clear form, light from the top-left so upper-left leaves are bright yellow-green and lower-right leaves fall into darker cool green shadow, a few thin brown twigs visible between leaves. Mid green, fairly neutral and not too saturated so it can be tinted. The clump fills most of the square (about 85 to 90 percent) with a ragged organic outline of leaf tips, not a circle. Background: a completely flat solid pure magenta #FF00FF everywhere outside the leaves, no gradient, no shadow on the background, no magenta tint on the leaves, no text, no border.
- cypress_sprays:
Same style and same rules for a second foliage alpha card. Square 1:1 image of a dense upright clump of Mediterranean cypress foliage: many overlapping sprays of tiny scale-like conifer leaves, packed tightly into flame-shaped upward-pointing tufts, dark green with slightly blue-grey and olive undertones, brighter yellow-green on the tufts facing the top-left light and deep dark green in the lower-right shadows, painted as chunky readable tuft shapes with clear form, not fine noise. The clump fills most of the square (about 85 to 90 percent) with a ragged organic outline of upward-pointing tuft tips, taller than wide but still filling the width. Background: a completely flat solid pure magenta #FF00FF everywhere outside the foliage, no gradient, no shadow on the background, no magenta tint on the leaves, no trunk, no text, no border.
- The rocks concept sheet (
public/images/generated/concepts/rocks.png) came next in the same conversation. It is logged inpublic/images/generated/PROMPTS.md.
Every texture is the first and only variant. The contact sheet _contact.png was regenerated: all 35 folders, 2x2 each, with alpha cards on slate, and "+N" marks folders that have a normal map.
Animal coats (2026-10-27)
Painted coats for the animals, laid on in resources/js/game/wildlife/coats.js (triplanar in the mesh's bind pose, divided by the texture's own mean so species tints keep their colour, plus a small bump from brightness). All are ChatGPT, 1254×1254, made seamless with tile.py --flatten 0.5 --feather 12 and saved at 1024 (PNG master, JPEG for the game).
| name | used by | seam h/v after | source |
|---|---|---|---|
| feathers | hen, partridge, quail, rock dove | 1.13 / 0.89 | ChatGPT |
| boar_bristle | wild boar | 0.98 / 0.97 | ChatGPT |
| short_fur | wolf, jackal, fox, dog, gazelle, roe deer, ibex, hare, hyrax | 0.99 / 0.98 | ChatGPT |
| coarse_hide | ox, donkey, wild ass, camel | 0.99 / 0.78 | ChatGPT |
| goat_hair | goat | 0.97 / 1.04 | ChatGPT |
| fleece | sheep | 1.00 / 0.92 | ChatGPT |
Prompts (feathers, short_fur and goat_hair in one conversation; boar_bristle, coarse_hide and fleece in the "Generate Animal Reference Sheet" conversation, after the reference sheets in public/images/generated/concepts/animals_*.png, so they match them):
- feathers: Create an image: a square 1:1 seamless tileable hand-painted game texture of small overlapping chicken body feathers, realistic-leaning painterly style (World of Warcraft quality but believable, not cartoon). Flat orthographic view straight onto the plumage, the feathers all pointing the same direction (downward), filling the entire square edge to edge. Warm cream and pale buff feathers with soft light-brown speckles and slightly darker feather edges, visible central quill shafts and soft barbs, gentle painted ambient occlusion between feather rows. Even lighting across the whole tile, no highlights from one side, no text, no border, no frame, no vignette, no perspective. The left/right and top/bottom edges must continue seamlessly so the tile repeats without visible seams.
- short_fur: Same style and same rules (square 1:1, seamless tileable, flat orthographic view, even lighting, edge to edge, no text, no border, no vignette). Next texture: short dense animal fur for wild mammals (jackal, fox, gazelle, deer), fine short hairs all lying in the same direction (downward) in soft flowing clumps, neutral warm light grey-beige colour with subtle darker and lighter hair strands so it can be tinted to any coat colour, gentle painted ambient occlusion between hair clumps. Realistic-leaning painterly, not cartoon, not photographic noise.
- goat_hair: Same style and same rules. Next texture: the long shaggy coat of a black Syrian goat, long coarse wavy hair locks hanging downward and overlapping in layers, dark charcoal-brown with lighter brownish sheen on the hair strands, soft painted ambient occlusion between the locks. Realistic-leaning painterly, not cartoon, not photographic noise.
- boar_bristle: Great. Now create a separate image: a square 1:1 seamless tileable texture of that wild boar's coat, in the same realistic-leaning painterly style. Flat orthographic view straight onto the hide, coarse stiff bristles all running the same direction (downward), dense dark grey-brown and charcoal bristles with some tawny-grey tips and a little greyish skin showing between tufts, gentle painted ambient occlusion. Fills the entire square edge to edge, even lighting, no text, no border, no vignette, no perspective. Left/right and top/bottom edges must continue seamlessly so it tiles without visible seams.
- coarse_hide: Same style and same rules (...). Next texture: the short coarse hide of a working ox or donkey, very short sleek hair lying flat in one direction (downward) with subtle hair-whorl flow, faint skin wrinkles and a few small dusty scuffs, neutral warm mid beige-tan colour so it can be tinted to any coat colour, soft painted ambient occlusion. Realistic-leaning painterly, not cartoon, not photographic noise.
- fleece: Create a separate image: a square 1:1 seamless tileable texture of that Awassi sheep's fleece, in the same realistic-leaning painterly style. Flat orthographic view straight onto the body, dense crimped cream wool gathered in small rounded staples and curly locks that hang slightly downward, warm cream and pale tan with soft shadowed gaps between the locks, gentle painted ambient occlusion. Fills the entire square edge to edge, even lighting, no text, no border, no vignette, no perspective. Left/right and top/bottom edges must continue seamlessly so it tiles without visible seams.
The older wool texture is woven yarn (for cloth), which showed as stripes on a sheep, so the sheep wears fleece.
roof_tile (j12-modeler, 2026-10-28)
Roman tegula-and-imbrex roofing for the Tiberias kit (props/tiberias/common.js, kind roofTile, 2.2 m per tile: 4 tile rows across, 5 courses down; UV v runs up the slope). ChatGPT in Chrome, in the Tiberias concept conversation, so it matches concepts/tiberias/*. The 1254 px original was captured from the viewer (1094 px), cropped to exactly 4 × 5 periods (912 × 980 px, offset 144, 100, found by autocorrelation), so it wraps, then resized to 1024 × 1024. The raw capture is _variants/roof_tile_raw.png.
Perfect. Now a TEXTURE, not a concept: generate a square 1024x1024 seamless tileable hand-painted game texture in the same World of Warcraft painted style, viewed straight down, orthographic, filling the whole image edge to edge: a Roman terracotta tile roof. Rows of flat tegulae run from the top of the image to the bottom, with rounded half-cylinder imbrex cover tiles running vertically over the joints between them: exactly 6 imbrex rows across the image and 5 overlapping courses from top to bottom, each course overlapping the one below with a soft dark shadow line at its lower edge. Warm red-orange terracotta (around #c4643f) with gentle tile-to-tile variation (some more orange, some browner, one or two darker), a soft painted highlight along the top of each rounded imbrex, darker cavities beside them, a light dusting of ochre dust. Even flat light, no perspective, no vignette, no sky, no ground, no text. The left edge must continue seamlessly into the right edge and the top into the bottom.
caesarea_mosaic (2026-10-28)
caesarea_mosaic/albedo.jpg, 1024 × 1024, generated with the built-in ChatGPT image tool. A single floor panel, deliberately not tiled, used in Caesarea's water court. Kept the first variant; resized from the generated original and saved as JPEG.
Use case: historical-scene. Asset type: square floor texture for an actual 3D historical RPG in first-century Caesarea Maritima. Generate a square, perfectly flat orthographic top-down scan of an intact Roman mosaic panel, tesserae in warm ivory limestone, muted ochre, dusty terracotta and dark blue-green. A central circular medallion with two small fish and gentle wave motifs, surrounded by a restrained geometric Greek-key border. Hand-painted stylized game material, tactile small stone tesserae, slightly worn but clean, broad readable forms. Entire square filled by the mosaic; all four sides straight. Even diffuse illumination, no directional shadows, no perspective, no surroundings, no text, no lettering, no figures, no gods, no statues, no watermarks. This will be mapped directly onto a square horizontal floor plane.
Batch: fields and crops (2026-10-29)
For the shared crop system: (a) painted soil under each field (terrain shader) and (b) instanced crossed alpha cards that sway in the wind. All of it came from ChatGPT only, in one conversation ("Create Seamless Farm Texture"), at 1254x1254. Nothing was enlarged. The j12-artist agent made it.
- Ground (
field_tilled,field_stubble): RGBalbedo.jpg(q88), 1024x1024, with 8 whole furrow or row periods from top to bottom. The pipeline is the scratchpadrowtile.py(now also in~/Sites/_tools/j12-3d/rowtile.py):- Autocorrelating the row-brightness profile gives the period (157.0 px for tilled, 155.6 px for stubble).
- The image is rescaled vertically by under 0.3% so the period is a whole number of pixels. It is then cropped to exactly 8 periods (1256 and 1248 px), and that square is resized to 1024, so a period is 128 px.
- The size never shrinks during the seam fix. Instead, a shifted copy of the tile is spliced across each wrap with two min-error cuts (48 px bands, 10 px feather): half the width for the left/right seam, and 4 whole periods for the top/bottom seam. The furrows line up in the copy, so the cuts don't show.
- The half-offset check was clean by eye.
- Crop cards (
crop_*): RGBAalbedo.png, 1024x1024, the plant seen from the side with its base on the bottom edge. They were generated on flat magenta and keyed with the scratchpadcard.py(now~/Sites/_tools/j12-3d/card_key.py). The batch 2 smoothstep key left pink fringes on the gold straw, because ChatGPT paints magenta into the edges of the plant. So:- Foreground "core" pixels are chosen with a spill score,
(B−G) + 0.75(R−G) < 5. Natural golds, browns and greens score below 0, and colours mixed with magenta score above. Dark pixels, neutral whites and blues with G ≥ R also count as core, which keeps the flax flowers and the white bean and onion flowers. - Every other pixel is unmixed against its nearest core colour F, from C = t·M + (1−t)·F with M = #FF00FF. Then alpha = 1 − t, also capped by a magenta-hue smoothstep. The colour is (C − t·M)/(1 − t), moving toward F as t grows.
- Specks under 60 px are dropped.
- The base is snapped to the bottom edge. It is the lowest row whose coverage is at least 60% of the stem density just above it, plus 2 px, so a few stray tips are pushed off the bottom.
- Colour and alpha are resized separately, then colour is bled into every transparent pixel (nearest opaque colour, softly blurred).
- Each card was checked over light parchment and dark slate.
- Foreground "core" pixels are chosen with a spill score,
- Contact sheet:
_contact.pngwas regenerated with all 49 folders, 2x2 each, and alpha cards on slate.
| name | tiles | seam h/v (before → after) | source | grade | plant top / 98% mass (fraction of height from bottom) |
|---|---|---|---|---|---|
| field_tilled | yes, 8 whole furrows (128 px period) | 3.68/2.84 → 0.94/1.58* | ChatGPT | from #6a4121 toward #8a6a45, 0.85 (mean #84623d) | n/a |
| field_stubble | yes, 8 whole rows (128 px period) | 1.56/1.35 → 0.93/0.79 | ChatGPT (second try) | toward #ab8c55, 0.5 (mean #a68046) | n/a |
| crop_barley | card, base on bottom edge | n/a | ChatGPT (first try) | none (mean #be843b), coverage 57% | 0.91 / 0.81 |
| crop_wheat | card | n/a | ChatGPT | none (#be8035), coverage 69% | 0.97 / 0.86 |
| crop_wheat_green | card | n/a | ChatGPT | none (#728c46), coverage 72% | 0.96 / 0.87 |
| crop_flax | card | n/a | ChatGPT | none (#818358), coverage 60% | 0.95 / 0.88 |
| crop_lentils | card | n/a | ChatGPT | none (#788642), coverage 38% | 0.57 / 0.51 |
| crop_beans | card | n/a | ChatGPT | none (#768652), coverage 74% | 0.95 / 0.87 |
| crop_mustard | card | n/a | ChatGPT | none (#978d2f), coverage 59% | 0.96 / 0.91 |
| crop_cucumber | card | n/a | ChatGPT | none (#798932), coverage 35% | 0.48 / 0.42 |
| crop_onion | card | n/a | ChatGPT | none (#778d5f), coverage 55% | 0.78 / 0.69 |
* The tilled field's vertical ratio is inflated by the metric. Its top and bottom rows both fall in the same dark trough, and the half-offset view shows no seam.
Variants (in _variants/):
field_stubble_v1.jpg: first try, made seamless the same way. Its stubble reads as pointed yellow "crystals" seen from the side, so it was replaced by the second try, which shows hollow cut stalk ends and flat fallen straw.crop_barley_v2.png, keyed: botanically more clearly barley, with flat two-row heads and very long awns, but the plants repeat as near-identical columns, are cut off at both side edges and cover 76% of the card. Over crossed quads it would read as a wall, so v1 was kept. v1 has a better silhouette and natural tips at the sides, though its heads are plumper, more like wheat.
Prompts (ChatGPT, one conversation, in this order)
- field_tilled (full prompt):
Create an image: a square 1:1 seamless tileable hand-painted stylized game texture of a freshly ploughed 1st-century farm field in Galilee, World of Warcraft style. Flat top-down orthographic view straight down onto the soil, filling the entire square edge to edge. EXACTLY 8 parallel plough furrows running strictly HORIZONTALLY from the left edge to the right edge, all evenly spaced with the same width, so the tile repeats vertically with whole furrows (each furrow is exactly 1/8 of the image height, the top edge and the bottom edge both cut through the same point of a furrow). Warm brown earth (overall around #8a6a45): ochre-lit rounded crests on the ridges, darker damp brown troughs with soft painted ambient occlusion, small chunky earth clods along the ridges, a few small dark charcoal basalt pebbles and a few dry pale straw bits scattered evenly. Soft painted top-down light baked in, broad confident brush strokes, chunky readable shapes, painterly not photographic, no photo noise. Even lighting across the whole tile with no large light or dark patches. No plants, no grass edges, no text, no border, no frame, no vignette, no perspective. The left and right edges and the top and bottom edges must continue seamlessly so the tile repeats without visible seams.
- field_stubble, first try (now
_variants/field_stubble_v1.jpg):Good. Same style and same rules (square 1:1, seamless tileable, flat top-down orthographic view, even lighting across the whole tile, edge to edge, painted light and AO baked in, broad brush strokes, chunky readable shapes, no text, no border, no vignette, no perspective). Next texture: a reaped grain field after harvest, seen straight down: the same EXACTLY 8 evenly spaced horizontal rows running left to right (each row exactly 1/8 of the image height so it repeats vertically with whole rows), short pale cut straw stubble standing in tight lines along each row (stiff short hollow stalks seen from above as small pale golden tufts and dots with tiny shadows), loose fallen straw stalks lying across the ground and a few dropped grain ears scattered evenly, dry light-brown earth showing between the rows. Gold-straw palette: stubble and straw around #c9b26a over earth around #9a7a50, warm highlights, soft painted shadows. Painterly World of Warcraft style, not photographic.
- crop_barley (kept; this prompt set the card rules):
Now a different kind of asset in the same hand-painted World of Warcraft style: a crop alpha card for a game field (it will be placed as crossed vertical quads, so it is seen from the SIDE). Square 1:1 image of a single dense strip of ripe two-row barley seen from the side, filling most of the width: many golden straw stems rising straight up from the very BOTTOM EDGE of the image, the stem bases touching the bottom edge, plants about the height of the image minus a little headroom, ripe golden-straw heads nodding and drooping over, each head with very long bristly fine awns fanning out, a few narrow dry leaves on the stems. Soft painted top light: warm bright gold highlights on the heads and upper stems, stems getting darker and more olive-brown toward the bottom. Chunky readable painted shapes, broad brush strokes, not photographic. The left and right edges of the strip end in natural plant tips and leaning stems (no plants cut off by a straight edge), so several cards can overlap. NO ground, NO soil, NO shadow blob, NO pot, nothing below the stems. Background: a completely flat solid pure magenta #FF00FF everywhere outside the plants, no gradient, no shadow on the background, no magenta tint on the plants, no text, no border.
The later card prompts begin with "Same style and same rules for the next crop card (square 1:1, side view, stems rising from the very bottom edge, natural plant tips at the left and right sides, no ground, no soil, no shadow, flat pure magenta #FF00FF background, no text, no pink or purple tones [anywhere] in the plants). Next: …", followed by:
- crop_wheat (the "no pink" clause was not yet in the prefix): ripe emmer and durum wheat, a dense strip slightly TALLER than the barley (plants nearly the full image height), warm amber-gold straw, heavier thick UPRIGHT wheat heads (only slightly leaning, not drooping) with SHORT awns, plump grains visible on the heads, a few narrow dry leaves on the stems, darker warm brown-olive stems toward the bottom.
- crop_wheat_green: the same wheat but still GREEN, in ear before ripening: a dense strip nearly the full image height, fresh blue-green and sage-green leaves (some curling and twisting), green upright wheat heads with short awns, lighter yellow-green highlights at the top, deeper cool green toward the bottom of the stems.
- crop_flax: a dense strip of flax in flower, about the full image height: very slender straight upright pale green stems, many fine short needle-like leaves along the stems, branching only at the top into thin flower stalks with many small sky-blue five-petal flowers (clear light blue, slightly cool, with a tiny yellow-white centre) and a few round green seed bolls. Airy and delicate but still painted with readable shapes, warm light on the flowers, slightly darker green at the bottom of the stems.
- crop_lentils: a row of low bushy lentil plants, only about 40 percent of the image height, so the plant mass sits in the LOWER HALF of the image and the upper half is empty magenta: many thin wiry branching stems, fine feathery pinnate leaves with many small oval leaflets in fresh sage and olive green, small WHITE pea-like flowers with faint pale blue veins, and many small flat oval green seed pods hanging in pairs. Bushy and dense at the bottom, soft painted top light, darker green inside the bush. (White flowers were asked for instead of pale violet so the magenta key cannot eat them.)
- crop_beans: a row of broad bean (fava bean) plants about 80 percent of the image height: thick upright SQUARE green stems, thick fleshy grey-green oval leaflets in pairs (bluish sage green, matte), clusters of WHITE flowers each with a distinct black blotch on the wing petals tucked against the stems, and a few fat long green bean pods hanging lower down. Soft painted top light, lighter grey-green on the upper leaves, darker green lower down.
- crop_mustard: black mustard in full bloom, nearly the full image height: tall slender branching green stems that fork and spread toward the top, a few sparse lobed leaves low down and small narrow leaves higher up, and masses of small bright yellow four-petal flowers in loose clusters at the tips of all the branches, with a few thin green seed pods held close to the stems below the flowers. Warm sunlit yellow on top, olive-green stems getting darker toward the bottom.
- crop_cucumber ("plants rising from the very bottom edge"): a low sprawling cucumber and melon vine, a mound only about 35 percent of the image height, so the plant mass sits in the BOTTOM THIRD of the image and everything above is empty magenta: large rough lobed heart-shaped leaves in mid green with pale veins overlapping in a dense mound, a few curling tendrils, several yellow five-petal flowers, two small green striped cucumbers and one pale yellow-green round melon peeking out from under the leaves near the bottom. Soft painted top light, lighter warm green on the top leaves, deep green shadow under the mound.
- crop_onion: a garden row of onions and leeks, about 60 percent of the image height: many hollow tubular upright blue-green leaves fanning out from each plant, a few leaves bending over at the tips, several white round onion bulbs showing at the very bottom of the plants (sitting on the bottom edge), the paler flat-leaved leeks mixed in, and one or two tall stalks topped with papery white round globe flower heads. Soft painted top light, lighter blue-green highlights on the leaves, white bulbs with soft warm shading.
- field_stubble, second try (kept):
Back to the tiling ground textures (same rules as the first two: square 1:1, seamless tileable, flat top-down orthographic view straight down, even lighting, edge to edge, no text, no border, no vignette, no perspective). Please redo the reaped stubble field so it reads as seen from DIRECTLY ABOVE, not from the side: EXACTLY 8 evenly spaced horizontal rows left to right (each row exactly 1/8 of the image height), each row a band of short cut straw stubble seen from above as many small pale golden hollow stalk ends (small rings and dots) and short broken stalks leaning in different directions, with soft little shadows, NOT tall pointed spikes or crystals. Plenty of loose fallen straw lying flat across the rows and between them, a few dropped grain ears, dry pale light-brown earth between the rows. Stubble and straw around #c9b26a over earth around #9a7a50. Painterly World of Warcraft style, broad brush strokes, not photographic.
- crop_barley, second try (now
_variants/crop_barley_v2.png):Thank you. One more variant of the ripe barley crop card, same style and same card rules (…). This time make it clearly BARLEY and not wheat: slimmer flat two-row barley heads with two neat rows of grains, every head bent over and hanging down in a deep curve from the top of its stem, and VERY long straight bristly awns (longer than the head itself) streaming down and outward like a fringe. Pale golden straw colour, a little paler and more silvery-gold than the wheat, plants about 85 percent of the image height, a dense strip across the whole width.
Notes for later batches:
- ChatGPT leaves about 22 px of empty magenta under the stems. The keyer snaps the base down, so don't worry about it in the prompt.
- For pale violet or pink flowers, ask for white or blue instead, or the magenta key will eat them. Blue works because the keyer keeps pixels where G ≥ R.
- Both ground textures are painted at a slight angle (the stubble stalks and the clods on the ridges have small cast shadows to the lower side). They read well top-down at field scale.
Second set: ground variety and undergrowth (2026-10-29)
These came from the same ChatGPT conversation, at 1254x1254. Each was the first and only try.
- Soils were made seamless with
rowtile.py, the same way asfield_tilled: 8 whole furrows 128 px apart, so they swap in at the same scale. - Undergrowth cards were keyed with
card_key.py.field_weedswas generated on a pure blue #0000FF key, because its red anemones, red poppies and purple thistle would have been eaten by a magenta key. The keyer gained a--key bluemode for it: blueness = B − max(R,G), core < 50, unmixed against M = #0000FF. Using 50 instead of 25 keeps the purple thistle head opaque.field_grassused magenta as before.
| name | tiles | seam h/v (before → after) | source | grade | plant top / 98% mass (fraction of height from bottom) |
|---|---|---|---|---|---|
| field_tilled_dry | yes, 8 whole furrows | 2.29/2.21 → 1.09/1.37 | ChatGPT | from orange ochre toward #a88a62, 0.8 (mean #a78559) | n/a |
| field_tilled_dark | yes, 8 whole furrows | 3.01/2.96 → 0.95/1.02 | ChatGPT | from #59371c toward #5e4a36, 0.85 (mean #5c4630) | n/a |
| field_stony | yes, 8 whole furrows | 2.12/2.28 → 0.92/1.03 | ChatGPT | from #7c5938 toward #8f7556, 0.75 (mean #896c4c) | n/a |
| field_weeds | card, base on bottom edge | n/a | ChatGPT, blue key | none (mean #8b6f38), coverage 34% | 0.54 / 0.49 |
| field_grass | card, base on bottom edge | n/a | ChatGPT, magenta key | none (mean #7c8233), coverage 32% | 0.54 / 0.47 |
Notes:
field_tilled_darkwas painted with about 7.9 furrows (period 158.9 px). It was stretched vertically by 1.4% to make exactly 8 before cropping.- Both undergrowth cards came out taller than asked (0.54 of the card, against a third and 40%). Their plants also run off the left and right edges (11–22% of the edge column is opaque), so a straight cut can show where cards end. Use them as overlapping strips, or regenerate with more side margin if that shows.
Prompts, in this order:
- field_tilled_dry:
Back to the tiling ground textures, exactly the same rules and the same layout as the very first ploughed field (square 1:1, seamless tileable, flat top-down orthographic view straight down, EXACTLY 8 parallel plough furrows running strictly HORIZONTALLY from the left edge to the right edge, evenly spaced, each furrow exactly 1/8 of the image height, top and bottom edges cutting through the same point of a furrow, even lighting across the whole tile, painted light and AO baked in, broad confident brush strokes, chunky readable shapes, no plants other than what is described, no text, no border, no vignette, no perspective, seamless on all four edges). Next texture: a sun-baked DRY ploughed field at the end of summer: pale ochre-tan earth (overall around #a88a62), hard dry clods with fine cracks across them, pale dusty sun-bleached crests on the ridges, slightly darker but still dry troughs, a few small pale stones and a little scattered dead grey-gold straw. Painterly World of Warcraft style, not photographic.
- field_tilled_dark:
Good. Same ground rules and the same layout (square 1:1, seamless tileable, flat top-down view straight down, EXACTLY 8 evenly spaced horizontal plough furrows, each exactly 1/8 of the image height, even lighting, painted light and AO baked in, broad brush strokes, no text, no border, no vignette, no perspective, seamless on all four edges). Next texture: DARK, rich, damp alluvial soil of the fertile Gennesaret plain by the Sea of Galilee, freshly ploughed: deep chocolate-brown crumbly earth (overall around #5e4a36), soft moist crumbs and small clods on the ridges with warm brown highlights, darker damp troughs with soft painted ambient occlusion, and a few small fresh green weed seedlings (two or three leaves each) sprouting in the furrows, spread evenly. Painterly World of Warcraft style, not photographic.
- field_stony (same opening as 2, without "Good."): Next texture: thin STONY upland soil of the Galilean hills, ploughed: shallow mid brown-tan earth (overall around #8f7556) where the 8 furrows are broken up and interrupted by many small stones: rounded and angular pale grey limestone stones and dark charcoal basalt stones of mixed small sizes, lots of pebbles and grit along the ridges and in the troughs, a few patches of bare pale bedrock showing through, and sparse small dry grey-green and straw-coloured weeds. Stones spread evenly so no single big stone stands out when tiled. Painterly World of Warcraft style, not photographic.
- field_weeds:
Now another side-view alpha card in the same style as the crop cards (square 1:1, side view, plants rising from the very bottom edge, natural plant tips at the left and right sides, no ground, no soil, no shadow), but this time on a completely flat solid pure BLUE #0000FF background (because it has red and purple flowers), no gradient, no blue tint on the plants, no text, no border. Subject: a low mixed strip of field weeds and wild flowers that grow among the grain in Galilee in spring, only about ONE THIRD of the image height, so the plants sit in the BOTTOM THIRD and everything above is empty blue: bright red crown anemones and red poppies on thin stems, yellow crown daisies, small white chamomile daisies, one purple thistle head on a spiny stem, round clover leaves and a few grass blades, all mixed together and spread across the whole width. Soft painted top light, olive and sage greens, darker green at the bottom.
- field_grass:
Same style and same card rules, back on the flat pure magenta #FF00FF background (no pink or purple tones anywhere in the plants, no text, no border, no ground, no soil, no shadow, plants rising from the very bottom edge, natural plant tips at the left and right sides). Next: a low strip of wild grasses and green weeds that grow along and among field crops, only about 40 percent of the image height, so the plants sit in the lower part and everything above is empty magenta: many slender grass blades in olive and sage greens with yellow-green tips, a few wild oat and brome seed heads nodding on thin stems, some broad-leaved green weeds low down, and one or two small white or yellow flowers. Spread across the whole width, soft painted top light, darker green at the bottom.
_contact.png was regenerated again and now has 54 folders.
Cloth detail textures for people (2026-10-30)
Neutral weave-detail maps for garments. The garment colour comes from the dye in resources/js/game/garments.js; these textures only add the weave, so they are fully greyscale and carry no large-scale light. The older linen and wool folders are untouched. ChatGPT only, one conversation ("Create Linen Texture"), 1254x1254, each the first and only try.
Post-processing (scratchpad cloth.py, also saved as ~/Sites/_tools/j12-3d/cloth_detail.py; Pillow, numpy, scipy):
- Luminance only (Rec. 709 weights), so the result is fully grey.
- High-pass "flatten": divide by a Gaussian blur with sigma = width/8 (reflect padding), times the mean, so no large-scale light, shading or blotches remain.
- Seam fix: the same min-error-boundary cut as
tile.py, 12% overlap, 8 px feather, left/right then top/bottom (1254 → 1104 px). - Lanczos resize to 1024, then normalise to mean 128 and standard deviation 20, clipped to 60–200 (under 0.1% of pixels clipped).
- Saved as
albedo.png(8-bit, grey stored as RGB) andalbedo.jpg(q90). The half-offset check was clean by eye for all three.
| name | for | tiles | seam h/v (raw → after) | source |
|---|---|---|---|---|
| cloth_linen | tunics, veils, headcloths | yes | 2.03/1.35 → 1.22/1.14 | ChatGPT |
| cloth_wool | mantles, cloaks, sashes | yes | 1.72/1.78 → 1.03/1.09 | ChatGPT |
| cloth_coarse | the fisher's work coat | yes | 3.36/3.04 → 1.15/0.99 | ChatGPT |
Notes:
cloth_linen: a fine even plain weave with scattered horizontal slub threads. It reads a little photographic up close, but at garment scale it is just a soft linen grain.cloth_wool: a fine pebbly weave under faint, lighter diagonal fibre streaks (the heathering). No basket weave or strips.cloth_coarse: thick uneven hand-spun threads, slubs and a few stray hairs. Its threads pair up in places like a hopsack, but at about 80 threads per tile it stays fine.
Prompts, in this order:
- cloth_linen (full prompt):
Create an image: a square 1:1 seamless tileable hand-painted stylized game texture of fine plain-weave linen cloth (for 1st-century tunics, veils and headcloths), World of Warcraft style but subtle. It is a DETAIL texture that will be tinted in a shader, so make it completely NEUTRAL GREY and desaturated (no colour at all, mid grey around #808080), with only small-scale weave detail. Flat orthographic view straight onto a perfectly flat stretched piece of fabric, filling the entire square edge to edge: a fine even plain weave where the individual threads are just visible (roughly 120 threads across the image), a few irregular thicker slub threads, soft and even, gentle painterly brush texture, not photographic. Even lighting across the whole tile: NO folds, NO wrinkles, NO creases, NO shading gradients, NO large light or dark patches, NO vignette, no perspective, no text, no border, no frame. The left and right edges and the top and bottom edges must continue seamlessly so the tile repeats without visible seams.
- cloth_wool:
Good. Same style and same rules (square 1:1, seamless tileable, completely NEUTRAL GREY and desaturated detail texture around #808080 with no colour, flat orthographic view straight onto perfectly flat stretched fabric, edge to edge, even lighting, NO folds, NO wrinkles, NO shading gradients, NO large light or dark patches, no vignette, no text, no border, seamless on all four edges). Next texture: hand-woven sheep's-wool cloth for mantles, cloaks and sashes: a dense, slightly fuzzy woollen fabric with a fine plain weave or a simple fine diagonal twill, the individual threads ONLY JUST visible (roughly 150 threads across the image, very small scale), soft fibre fuzz over the weave, faint heathering of slightly lighter and darker grey fibres spread evenly. NOT a basket weave, NOT big woven strips, NOT large checks or stripes. Painterly stylized, soft brush texture, not photographic.
- cloth_coarse (same opening as 2): Next texture: coarse heavy goat-hair and wool cloth for a fisherman's work coat: a rougher, sturdier plain weave with irregular, thicker, slightly uneven hand-spun threads (some thicker, some thinner, a few knots and slubs), a few stray coarse hairs lying across the surface, but still a FINE overall scale (roughly 80 threads across the image), evenly spread so no single feature stands out when tiled. NOT a basket weave, NOT big woven strips, NOT checks or stripes. Painterly stylized, soft brush texture, not photographic.
_contact.png was regenerated and now has 57 folders.