Procedural pixel art — load one tab at a time. Use the hash for deep links (e.g. #world).
checkerboard(), dilate(), erode() — pure-function building blocks for backgrounds and procedural post-processing.
Drag the bottom-right corner of the preview box to resize its container and watch callback updates.
This preview uses a non-zero transparent index while keeping index 0 visible in composition.
Source/quantised comparison strip for none/ordered/Floyd–Steinberg. Upload an image to replace the deterministic fixture source.
Import benchmark matrix (synthetic RGBA: 128²/256²/384², median-cut, no dither).
—
Complementary, analogous, and triadic ramps from one base colour (HSV anchors + saturation/value steps). Named presets are curated for contrast and hue separation.
Theme-coloured 12×12 templates (×2 scale). Open Web Theme Demo for all 28 + symmetric fallback.
Canvas heading (bitmap font + shadow). Full specimen + body CSS on Web Theme Demo.
Humanoid base, weapons, armour, accessories, markings, procedural walk/idle strips, creatures, 8×8 loot icons · palette character-fantasy
Template silhouette comparison using one seed across all body archetypes.
Extended HairStyle catalogue: bald, short, medium, long, ponytail, mohawk, spiky, bob, braids, hood.
Extended MarkingsStyle: scar_cheek, tattoo_torso, warpaint, facial_hair, freckles, wrinkles, eye_patch, birthmark.
Procedural pixel art: sword, dagger, axe, spear, bow, staff, shield, mace — south & east facings
Weapons · rarity (same seed)
generateCharacter() — equip() / unequip(), then render() composites equipment onto the body
16×24 layers: helm, chest, greaves, gauntlets, boots, cape, amulet, belt — south / east
buildCharacterAnimations — walk cycle frames + full supported animation set preview (`idle` through `pickup`, including `emote_wave` / `emote_nod` / `emote_shrug`).
generateCreature — south facing preview; creature.animations — idle + walk per direction (see walk strip below).
Wolf walk · south — four frames from generateCreature (same motion as buildCreatureAnimations).
Direct creature renderers — every render*Creature() function called explicitly (south facing), bypassing the generateCreature template dispatch.
8×8 icons + sample generateLoot summary
Loot v2 — generateLootDrops({ context: 'dungeon' }) with rarity tints & generated names
Aseprite: 2 frames (south / east). Phaser/CSS: four facings as atlas (exportPhaser / exportCSSSprite). Bundle ZIP: four-facing sheet + meta via exportCharacterBundle. Equipment variants emit a bounded additive per-slot loadout progression (south + east) — 2k PNGs for k equipped slots, walked in canonical EquipmentSlot order.
9 sprites bouncing with different easings — all driven by one render loop
Terrain layers scroll at depth-based speeds, driven by the render loop
Layered silhouettes composed from 1D Perlin noise, using landscape palettes
Sky gradient, stacked silhouettes, and stamps — six terrain presets (uses master seed)
Thumbnails for specs/pxlgen-s1.md scene APIs: every sky() mode, all six terrainStyles, landscape water/veg/tile/landscapeResult, overworld flags + biomes volcanic/alien (uses master seed; stamp gallery + overworld row cover the rest)
All S1 stamp variants: trees, rocks, flora, buildings, clouds (landscape-warm)
Top-down height field, river carve, and POI markers — four biome presets
Sky + silhouette terrain + placeStamps along the foremost ridge
Phase-based gradient, sun/moon disc, stars, cloud stamps
One live canvas loop at a time — pick a demo below (avoids several requestAnimationFrame drivers competing per frame).
Palette remapped through 6 time-of-day phases — brightness, saturation and hue all shift
Particle-based rain, snow and fog rendered as layers over a procedural scene
Static stamp generators wrapped with idle animations: sway, bob, flicker, grow
Viewport panning over a wide world with smooth easing and screen shake
createParallax({ layers, baseSpeed, depthFactor }) — three silhouette layers scroll at depth-scaled speeds; compose() stacks them each frame.
createWind({ strength, direction, gusting, targets }) — bottom-anchored sway across tree and flora stamps.
createParticleSystem(...) with particlePresets.{campfire, dust, leaves, sparkle, fire, explosion, smoke, rainSplash} — eight pooled emitters in one frame.
createAnimatedScene() + landscapeResult() — parallax, day/night, water, wind & weather in one surface.
While running, the demo advances the scene clock and redraws the full frame each tick (compositing the whole landscape); optional layers add work on top of that baseline.
dungeon() — BSP / drunkard walk. Theme auto-selects its interior palette via THEME_TO_INTERIOR_PALETTE (palette left unset). Difficulty scales locked doors + trap density; water features flood a room. Uses master seed above.
exportTiled().toBundle() de-duplicates tiles by rendered appearance (DRIFT-EXPORT-03): the .tsx / .png strip holds one column per distinct appearance and TMX layer GIDs remap through the dedup table. Click Tiled ZIP to see the deduped count.
Build profiler — warm-up runs, sample distribution, min/mean/max/stdev, pass rate vs DUNGEON_PERF_TARGET_MS (over-target bars marked red).
—
cave(), buildingInterior({ showExterior }), animated strip with shadowcast, applyFogTileOverlay, applyLightFlicker / updateAnimatedLightmap. Cave style auto-selects its interior palette via CAVE_STYLE_TO_INTERIOR_PALETTE (theme/palette left unset).
cave({ waterLevel }) + createDungeonWaterAnimation() — top-down animated water shimmer on Tile.Water cells.
renderRoom() seven-layer side-view + buildingInterior({ buildingType }) per-floor cutaways. Pattern dropdowns force-override the resolved theme's wallPattern / floorPattern so all four styles can be compared at the same seed.
Every theme in WALL_TEXTURES rendered as a side-view room — all nine back walls resolve a distinct texture via getWallTexture(). Captions show each theme's overlay, including ancient → runes and arcane → sigil.
createWFCSolver() — constraint-based tilemap generation with socket matching, backtracking, and animated step-through.
createOverworldTileset(), createDungeonTileset(), createPlatformerTileset() — built-in tilesets solved with WFC.
extractTiles() — toggle rotation/reflection expansion, optionally upload an image, and solve a preview map from extracted tiles.
renderTilemap
generateAutoTile() builds bitmask-matched terrain tiles; renderTilemap() rasterises a solved WFC TilemapResult to a single PixelGrid (the live WFC blocks above call result.render(), which uses the same path).
generateWorld() — procedural world with biomes, rivers, roads, settlements, and landmarks.
createChunkManager() + createWorldCamera() — pan around a chunked world and track viewport on minimap.
Panoramas, depth layers, ground detail, and large structures.
generatePanorama() — wide multi-section landscape with crossfade stitching.
generatePanorama({ width, terrainSequence?, timeOfDay?, animated? }) returns
PanoramaResult { grid, layers, sections, ridgelines, toAnimatedScene, metadata }.
Composite + ridgeline overlay + per-section metadata. Click Play animated to start a parallax loop wired from the rich layers.
generateDepthLayers() — background, midground, and foreground at varying detail.
DepthLayerResult { layers: Array<{ grid, depth, parallaxFactor, name }> } ordered far-to-near, with caller-controlled backgroundLayers / midgroundLayers / foreground, plus terrainStyle and timeOfDay driven fills, edge highlights, and immersive foreground stamps at detailLevel: 'high'.
generateLargeStructure() — procedural buildings with optional decay,
material-aware fills, and animated windmill sails / waterfall streams.
generateGroundDetail() — tileable ground patches per terrain type, with per-element details toggles and palette-aware colour mapping. Row 1: legacy defaults (incl. new swamp). Row 2: each detail kind isolated on a grass base. Row 3: same toggles + seed across three palettes.
stitchScenes() — blend adjacent scenes with crossfade, dither, and noise-mask transitions.
stitchScenes({ palette, unifiedSky }) — LAB-interpolated crossfade and reconciled sky bands.