executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
gamedev-2d-art-seamless-texturesSeamless / tileable textures for 2D: offset-and-paint trick, mirror techniques, repetition reduction (variant tiles + decoration overlays), transitional tiles (corner / edge / T-junction), normal map authoring for 2D lighting (Sprite Lamp / Sprite DLight / Materialize), procedural base + hand-pixel overlay, roof/floor/wall specializations. USE WHEN: painti…
Independent GitHub snapshot · Automated classification · Original documentation governs
name: gamedev-2d-art-seamless-textures description: | Seamless / tileable textures for 2D: offset-and-paint trick, mirror techniques, repetition reduction (variant tiles + decoration overlays), transitional tiles (corner / edge / T-junction), normal map authoring for 2D lighting (Sprite Lamp / Sprite DLight / Materialize), procedural base + hand-pixel overlay, roof/floor/wall specializations.
A "seamless" texture wraps without visible seam at the edges. Critical for any tile that fills regions (grass, dirt, stone, water).
Standard workflow to make any texture seamless:
1. Open your texture (e.g., 32×32 px) in Aseprite/PS/Krita.
2. Filter → Offset/Wrap by (16, 16) — the seam now runs through center.
3. Paint over the visible seam with clone-stamp / hand pixel.
4. (Optional) Offset back by (-16, -16) to verify no new seam.
5. Place 2×2 copies of your tile in a test area and inspect.
In Aseprite: Edit → Shift → Wrap (or simply Filters → Offset in
v1.3+). Krita: Filter → Other → Offset. Photoshop: Filter → Other → Offset.
Quick seamless without offset paint: mirror horizontally + vertically. Always seamless because edges are mirrored to themselves.
Trade-off: visible mirror symmetry at the seam line. Fine for organic materials (rocks, dirt) viewed at small scale, terrible for anything recognizable (bricks would mirror to fake structure).
A single seamless tile placed 100 times is visibly repetitive, even if seamless. Solutions:
Paint 3-5 variants of the "interior" tile. Random selection at runtime (weighted: 70% common, 25% mid, 5% rare). Breaks pattern.
LDtk handles natively via Auto-Layer rules with variant frequency. Unity Tilemap: custom Rule Tile with random tiles.
Sparse decorative sprites (a flower, a crack, a leaf) painted ON TOP of the seamless tile layer. ~5% coverage. Massive perceived variety from small art investment.
Tiles that look like the base interior but have a hand-painted detail (a vein in stone, a clump of grass). Insert occasionally. Same effect as decoration overlays but stays in the tilemap layer (cheaper for collision).
Where two terrains meet, paint:
47-tile RPGMaker schema covers all cases. 16-tile Wang skips diagonals (corner ambiguity).
For terrain hierarchy (grass < dirt < stone), one set of transitions between adjacent levels is enough; non-adjacent transitions (grass → stone) can compose grass→dirt + dirt→stone vertically.
Normal maps add dynamic lighting to 2D sprites. Each pixel encodes a 3D surface normal in RGB:
Authoring options:
Paint the normal map alongside the diffuse. Deep cyan = surface tilted left, deep magenta = right, green tints = up, purple = down. Time- consuming. Used in Owlboy, Dust: An Elysian Tail.
You provide 3-4 lighting passes (top, right, etc.), tool generates normal map. ~$15. Quality very good.
Just provide the diffuse. Tool generates a "good enough" normal from shape. Quick, less accurate.
Generate normal + height + AO from a diffuse. Less specialized for pixel art but free.
Quick browser-based gen.
For organic surfaces (rock, dirt, grass), efficient workflow:
Saves hours vs pure hand-paint. Looks more natural than pure procedural.
--extrude, Aseprite Sprite Sheet export
with padding).