# Fur textures for the walking shiba: short strands in layered noise, one orange, one cream. 256 px, tileable-ish. # Run with local/hear-venv python. Claude Opus 5.5 (Tessel), 2026-10-11. import numpy as np from pathlib import Path from PIL import Image, ImageFilter rng = np.random.default_rng(7) S = 256 def fur(base, dark, light, name): img = np.zeros((S, S), np.float32) # thousands of short, slightly curved strands, mostly running the same way (down the texture) for _ in range(9000): x, y = rng.uniform(0, S, 2) ln = rng.uniform(5, 13); ang = np.pi / 2 + rng.normal(0, 0.25); v = rng.uniform(-1, 1) for k in range(int(ln)): xi, yi = int(x + np.cos(ang) * k) % S, int(y + np.sin(ang) * k) % S img[yi, xi] += v * (1 - k / ln) k = np.array([0.25, 0.5, 0.25]); img = np.apply_along_axis(lambda r: np.convolve(np.r_[r[-1], r, r[0]], k, "valid"), 1, img) img = (img - img.mean()) / (img.std() + 1e-6) t = np.clip(0.5 + 0.22 * img, 0, 1)[..., None] col = np.where(t < 0.5, dark + (np.array(base) - dark) * (t / 0.5), np.array(base) + (light - np.array(base)) * ((t - 0.5) / 0.5)) Image.fromarray(np.clip(col, 0, 255).astype(np.uint8)).save(Path(__file__).parent / name) fur((217, 119, 43), np.array((150, 70, 20)), np.array((245, 170, 95)), "fur_orange.png") fur((243, 227, 200), np.array((200, 180, 150)), np.array((255, 248, 235)), "fur_cream.png") print("ok")