← SplineCONTENT HISTORY
WHAT CHANGED
Update to Spline
Snapshot Oct 24, 2026 · 13:29 UTC · version 1.2.0
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Spline and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Buildings & man-made structures in the believable register: real-world proportions, crisp edges (cornerRadius 0), pitched roofs with overhangs, framed windows/doors, wall/roof textures, muted palettes, streets & neighborhoods at real scale. Load for prompts like \"house\", \"building\", \"cabin\", \"tower\", \"city\", \"skyline\", \"street\", \"town\", \"village\", \"neighborhood\", or any named real-world place.",
"included_files": [],
"name": "spline-3d-architecture",
"skill_md_contents": "---\nname: spline-3d-architecture\ndescription: \"Buildings & man-made structures in the believable register: real-world proportions, crisp edges (cornerRadius 0), pitched roofs with overhangs, framed windows/doors, wall/roof textures, muted palettes, streets & neighborhoods at real scale. Load for prompts like \\\"house\\\", \\\"building\\\", \\\"cabin\\\", \\\"tower\\\", \\\"city\\\", \\\"skyline\\\", \\\"street\\\", \\\"town\\\", \\\"village\\\", \\\"neighborhood\\\", or any named real-world place.\"\n---\n\n# Architecture (buildings & structures)\n\nBuildings are where the toy-house failure lives: a rounded cube + an oversized\npyramid + candy colors reads as a plush toy. A BELIEVABLE building (the\ndefault register when the user named no style — see # Style register) is made\nof the same primitives plus real proportions, crisp edges, overhangs, frames,\nand real material finishes. All of it is cheap with the recipes below. (For a\ndeliberately cute/toy house, invert these rules — rounding, saturation, and\nchunky proportions become correct.)\n\n## Proportions (copy reality's ratios)\n\nPick a storey unit S ≈ 150 world units and derive everything from it:\n\n- WALLS: one storey ≈ S tall; a 2-storey house ≈ 2S. Footprint beats height —\n a family house is wider and deeper than it is tall (≈ 3S × 2S × 4S w×h×d).\n Towers invert that.\n- ROOF: pitch 25–40° — the rise is ≈ 0.3× the span it covers, not a giant\n witch hat. It must OVERHANG the walls by 5–10% per side (eaves). A roof cut\n flush with the walls is the #1 toy-house tell.\n- DOOR: person-scale and small next to the facade — ≈ 0.7×S tall, 0.3×S wide.\n- WINDOWS: vertical rectangles ≈ 0.5×S tall, sills ≈ 0.3×S above each floor\n line, repeated in aligned columns/rows. Repetition reads real; one giant\n window reads dollhouse.\n- CHIMNEY: slim (≈ 0.3×S square) and rising past the ridge.\n\n## Crisp edges (kill the plush look)\n\n`Cube`/`Cylinder`/`Cone` SPAWN softly rounded (cornerRadius 8 by default) —\nthat alone reads toy. Pass `cornerRadius: 0` (or 1–2 for a worn edge) on\nevery structural box, and keep flatShading off in this register.\n\n## Walls, roof, chimney (the structure)\n\nBuild the parts UNROTATED at the build center and group at the end (the\ncompound-object rule — group + name in a later call).\n\n```\n// call 1 — structure (S = 150; a 460 × 300 × 640 two-storey house)\nmesh('Cube', { width: 460, height: 300, depth: 640, cornerRadius: 0 });\nposition({ y: 150 });\nrename('Walls');\n// gabled roof: an extruded Triangle prism, wider AND deeper than the walls\n// (eave + rake overhang), rise 160 over a 260 half-span ≈ 32° pitch. An\n// extruded flat shape grows FORWARD (+z) from its origin plane — unlike a\n// centered Cube — so pull it back by depth/2 to center it over the walls.\nmesh('Triangle', { width: 520, height: 160, depth: 700 });\nposition({ y: 380 });\ntranslate({ z: -350 });\nrename('Roof');\n// chimney: slim, offset from center, punching past the ridge\nmesh('Cube', { width: 45, height: 200, depth: 45, cornerRadius: 0 });\nposition({ y: 400 });\ntranslate({ x: 120, z: 140 });\nrename('Chimney');\n```\n\n- HIP ROOF variant: `mesh('Pyramid', { width: 520, height: 150, depth: 700,\n radialSegments: 4, cornerRadius: 0 })` — a 4-sided Pyramid is ALREADY\n axis-aligned with the walls (same Y rotation, NO habitual +45° \"fix\"), and\n never a 4-sided Cone (its base sits diagonal).\n- FLAT/MODERN roof: a thin slab (`height: 12`) overhanging 6–8%, plus a low\n parapet of four thin boxes.\n- Verify alignment with the `size`/position that `run_code`/`get_scene`\n report — eaves should overhang evenly on both sides.\n\n## Doors & windows (proud panels, framed)\n\nOpenings sit PROUD of the wall face by a few units — never coplanar\n(z-fighting) — as dark glazing panels with thin frame slats. Real cut\nopenings are the advanced path: load `boolean-operations` first if the user\nneeds to see through. Proud panels read right from normal viewing distances\nand stay cheap. Give every panel real `depth` (never a zero-depth\n`Rectangle` AT the wall plane), and derive its offset from the wall's\nhalf-depth, not by eye. If a run_code result reports a \"Z-FIGHTING RISK\"\nbetween a panel and its wall, the panel is sitting flush — push it out along\nthe facade normal and fix it before building further.\n\n```\n// call 2 — door + a 2×3 window grid on the front face (wall face at +320\n// from the build center, so panels at +322 sit proud, not coplanar)\nmesh('Cube', { width: 46, height: 105, depth: 4, cornerRadius: 0 });\nposition({ y: 53 });\ntranslate({ z: 322 });\ncolor('#6d5138');\nrename('Door');\nfor (let i = 0; i < 2; i++) {\n for (let j = 0; j < 3; j++) {\n if (i === 0 && j === 1) continue; // the door takes the middle ground bay\n mesh('Cube', { width: 55, height: 80, depth: 4, cornerRadius: 0 });\n position({ y: 90 + i * 150 });\n translate({ x: (j - 1) * 140, z: 322 });\n color('#20303d'); // dark glazing\n shading({ category: 'physical', roughness: 0.1, metalness: 0 });\n rename('Window');\n }\n}\n```\n\n- FRAMES sell the windows: four thin slats (e.g. 4×88×6 verticals, 63×4×6\n horizontals) in a trim color hugging each opening — loop them like the\n windows. Skip them for far-away buildings; add them for hero shots.\n- LIT-WINDOW option (dusk shots): `shading({ category: 'phong', emissive:\n '#ffd9a0' })` on a few panes, with a dimmer, cooler ambient.\n\n## Materials (half the realism — mapping and restraint are the craft)\n\nFlat lambert colors read as plastic, but a photographic texture slapped on at\ndefaults reads WORSE: the default `uv` projection STRETCHES on extruded\nshapes (the Triangle-prism roof) and elongated boxes (the chimney), and one\nun-tiled image makes stones the size of windows. Texture every big surface —\nbut always with the mapping set (full projection/tiling reference in\nmaterials-and-look):\n\n- PROJECTION: pass `projection: 'triplanar'` on EVERY architectural surface\n (walls, roof prisms, chimneys, slabs). It maps per world axis from the\n object's own space, so nothing smears along a slope or stretches on a tall\n box. Default `uv` is only safe on simple flat panels.\n- TILE DENSITY: `texture: { repeat: [n, n] }` sets how often the image tiles\n — pick n so features read at REAL size against the object's dimensions\n (stone courses ~30–60 world units, bricks ~15–25, shingle rows ~25–40).\n Without it one giant image spans the whole wall.\n- SUBTLETY: keep the layer's `alpha` at 0.6–0.8 over a `color()` base in the\n same family (the texture tints the base instead of shouting over it), ask\n for restraint IN THE PROMPT ('subtle', 'fine grain', 'low contrast', 'even\n tone'), and keep `bumpMapIntensity` at 1–2 — high bump plus a busy texture\n is the fastest way to make a wall look diseased. No texture on glazing.\n- SOURCE: crisp REPEATING patterns — brick/stone courses, roof tiles and\n shingle rows, plank siding and decks, pavement, checker floors — draw\n best with `generateTexture` (local canvas drawing, instant, seamless by\n construction; recipes in materials-and-look) applied via `image:`. Keep\n `style` generation for photographic irregular surfaces (weathered stucco,\n rough stone, rust). Same mapping rules apply to both.\n\n```\n// call 3 — finishes (selects work: the parts were created in earlier calls)\nselect(o => o.name === 'Walls');\ncolor('#e9e5dc');\nlayer('texture', { style: 'subtle white painted stucco, fine even grain, low contrast, seamless',\n projection: 'triplanar', alpha: 0.7, texture: { repeat: [3, 3] } });\nshading({ category: 'physical', roughness: 0.9, metalness: 0,\n bumpMap: 'texture', bumpMapIntensity: 1.5 });\nselect(o => o.name === 'Roof');\ncolor('#5c5f66');\nlayer('texture', { style: 'gray asphalt roof shingles, straight even rows, low contrast, seamless',\n projection: 'triplanar', alpha: 0.75, texture: { repeat: [4, 4] } });\nshading({ category: 'physical', roughness: 0.85, metalness: 0,\n bumpMap: 'texture', bumpMapIntensity: 2 });\nselect(o => o.name === 'Chimney');\ncolor('#9a5a44');\nlayer('texture', { style: 'red brick, small even courses, low contrast, seamless',\n projection: 'triplanar', alpha: 0.75, texture: { repeat: [2, 4] } });\n```\n\n- Wall prompts that work: 'weathered red brick wall', 'horizontal wood siding\n planks', 'raw board-marked concrete'; roofs: 'terracotta roof tiles', 'dark\n slate roof shingles' — always append ', low contrast, seamless'. Textures\n resolve ASYNC (checkerboard until then — re-screenshot on a later turn,\n don't retry); if the backend can't resolve them, fall back to muted flat\n colors + a subtle 'noise' layer.\n- JUDGE the texture pass in your screenshot: if a pattern looks smeared along\n the roof slope or stretched down the chimney, the projection is wrong\n (triplanar fixes it); if features look monumental, raise `repeat`; if the\n surface shouts, lower `alpha` toward 0.6 or drop the texture for a flat\n finish; if a wall or roof looks GLASSY or see-through (it mirrors the sky/\n ground), you passed `roughnessMap` on a dark texture — remove it and keep a\n flat `roughness` (roughnessMap multiplies by luminance; dark = mirror). A\n wall texture should be visible at hero distance and nearly disappear at\n establishing distance.\n- PALETTE: sample the real street — off-white/greige walls, gray-brown roof,\n wood-tone door, dark glazing. Muted and desaturated, 3–5 tones. Saturated\n primary red/green/blue surfaces are what scream toy.\n\n## Ground & dressing\n\n- Ground it: a path/driveway (flat `Rectangle`, `rotation({ x: -90 })`,\n `position({ y: 0.5 })` — proud of the ground, no z-fighting), low hedges\n (small boxes — hedges MAY keep a little cornerRadius, they're clipped\n plants), a tree or two (organic-scenes), a fence of thin slats.\n- `environment({ ao: true })` + one soft directional key (intensity ≤ 1,\n `shadowRadius` 2–4): AO in the eaves and window reveals is what makes a\n facade read dimensional.\n- Camera: a near-eye-level 3/4 (`lookFrom({ azimuth: -35, elevation: 8 })`)\n reads architectural; a high diorama angle reads toy.\n\n## Streets & neighborhoods (places at real scale)\n\nA street/town/village prompt is a PLACE — several buildings related by a\nroad — and it lives or dies on shared scale (# Real-world scale: 1 m ≈ 50\nunits). The classic toy tells are ratio errors, not object errors: a road\nnarrower than the houses are tall, shrub-sized \"trees\", knee-high fences,\none giant prop or person. Derive everything from the anchor table and the\nsame primitives read as a real place.\n\n- ROAD FIRST — it sets the axis and the scale. A flat `Rectangle`\n (`rotation({ x: -90 })`, `position({ y: 0.5 })`), asphalt gray\n `'#55585e'` (weathered, never pure black), LENGTH in the thousands of\n units, width from the table: one lane 150–165, a two-lane residential\n street ≈ 275–325, a main road with parking 450+. Optional subtle\n `noise` layer or low-alpha texture; skip shouting markings — center\n dashes only where a real road of that class has them (thin white boxes\n ≈ 5 × 120, gap ≈ 180, `y: 1`); many residential lanes have only edge\n lines or nothing. A crosswalk at a junction is 5–7 white strips\n (≈ 40 × 120, gap 40) and instantly reads urban.\n- CURBS + SIDEWALKS: raised strips along both edges (height ≈ 8, sidewalk\n width 75–125, light concrete `'#9b9992'`); everything built sits behind\n them, not on the asphalt.\n- LOTS, NOT A LINEUP: each house (recipes above, S = 150) sits on its own\n lot — setback varied 60–250 from the sidewalk, behind a low wall/fence\n (60–90 tall, 8–12 thick, muted render/stone tones) or hedge (50–75);\n vary footprint, storey count (1–2), roof type, and hue WITHIN one muted\n family per street; keep facades parallel to the road; leave ≥ 60 between\n lots. Identical spacing/height is what reads as a train set.\n- REGIONAL SIGNATURES: a NAMED style or region is a hard constraint —\n give every building that register's three signature elements, never a\n generic gable box with a label. Alpine chalet: deep eaves (15–20%\n overhang), dark timber beams/band over light stucco, balcony with\n slat railing, stone plinth. Japanese: low boundary wall, tiled\n hip/gable, deep entry canopy, window grids. Mediterranean: warm-white\n stucco, low-pitch terracotta, shuttered openings. SELF-CHECK the\n screenshot: if the houses would look the same with the region removed\n from the prompt, the register didn't land — add the signatures before\n finishing.\n- DETAIL BY DISTANCE: build for the person standing IN the scene, not\n just the overview. The two or three buildings nearest the final\n camera get the FULL treatment from the recipes above — framed\n windows, a real door with a canopy/porch, eaves, wall texture; the\n mid-ground keeps true window grids and doors; only fog-distance\n buildings may simplify to massing. At eye height every facade within\n ~1500 units must show openings and trim — a blank wall next to the\n viewer is the \"as soon as you get closer it falls apart\" failure.\n AT ARM'S LENGTH (the buildings a visitor can walk right up to), flat\n fills read as unpainted card: run their wall/roof texture layers\n STRONGER than the distance defaults (alpha 0.8–0.9, bumpMapIntensity\n ~2, repeat tuned so grain is visible at 5 m), and give the hero door\n hardware — an inset panel and a small knob/handle box at ~55 units\n height. Glazing gets a fresnel or slight tint variation so panes\n aren't one flat navy fill. EVERY face a visitor can reach gets this\n treatment, not just the street facade: a side or rear wall along a\n path, yard, or gap carries the same texture layer, one or two\n openings (window, vent, side door) or structural relief (timber\n band, downpipe, pilaster), and the plinth carried around the\n corner. NO LARGE PLANE SHIPS BARE — a dressed front with a blank\n flank is the miss every close inspection lands on.\n- VERTICALS SELL THE DEPTH: utility poles every 900–1200 along ONE side —\n `Cylinder` radius 6–8, height ≈ 500, weathered gray `'#8a8578'`,\n `cornerRadius: 0`, a short crossarm box near the top — with WIRE spans\n between consecutive poles: a wire is a thin box (width 1.5–2, height\n 1.5–2, depth = the span) hung just below the crossarms; build each span\n as two half-spans meeting ~10–15 units lower at mid-span (tilt each\n ±1–2°) so the wire SAGS — straight taut wires read CG, sagging wires\n read photographed. Add lamp posts (250–400), a road sign (pole ≈ 110),\n and one or two anchor props at true size (vending machine ≈ 90 × 60 ×\n 35, post box ≈ 60 tall, planters).\n- TREES AT TREE SCALE: `tree({ height: 350–600 })` (realistic default\n style), varied seeds and heights, in verges and yards — a street tree\n stands TALLER than the fences and reads against the houses' ridge\n lines. A 100–150-tall canopy blob is a bush; placing bushes where trees\n belong is one of the strongest toy cues. MIX `kind`s (oak/birch along\n the street, a pine or two in yards) — a row of identical spherical\n canopies reads as decoration, varied species read as planting.\n- PEOPLE / VEHICLES (only when asked): person ≈ 88 tall with head ≈ 12 —\n a bigger head is deliberately chibi; car ≈ 225 × 90 × 72, aligned to a\n lane with margin.\n- ATMOSPHERE: `sky({ timeOfDay, weather })` for real outdoor light, plus\n `fog({ useBackgroundColor: true, near: ~2500, far: ~9000 })` scaled to\n the street's length so the far end melts away; a wide, LOW `terrain()`\n band or two in the far background closes the horizon (distant hills);\n `environment({ ao: true })`. A NAMED time of day or mood (\"golden\n hour\", \"dusk\", \"sunset\", \"night\", \"overcast\") is a HARD constraint:\n set `sky({ timeOfDay })` to match (~17.5-18.5 golden hour, ~19 dusk,\n 12 noon) so the sun angle and color carry it, and check the\n screenshot actually reads warm/dark/gray as asked — a neutral\n white-daylight render of a golden-hour prompt fails review. FOG\n RESTRAINT: fog is for the FAR end only — if the mid-ground houses in\n the screenshot look pale or grayed, push `near`/`far` out (or thin\n the fog) until the hero block reads full-contrast; a scene-wide haze\n is the \"cheap miniature\" look, not atmosphere.\n- FINISH PASS (not optional — flat single-tone facades down a whole\n street read as a cardboard model): give the road a subtle `noise`\n layer over its asphalt gray; vary each house's wall hue AND value a\n step within one muted family; put a real wall texture (stucco /\n brick / siding, `projection: 'triplanar'`, alpha 0.6–0.8) on at\n least the two or three houses nearest the camera — ONE style string\n shared across them (identical styles reuse one generated image;\n vary `repeat`/alpha/base color per house), and a roof-tone\n variation or tile texture on their roofs; walk the ARM'S-LENGTH\n check above (doors with frame + inset + knob, no bare reachable\n wall); build reachable street furniture from its parts — a bench\n is slats on legs and a backrest, never one solid box; keep\n lawns/verges muted (`'#6a8f5a'`-family, never saturated toy green);\n `environment({ ao: true })` always.\n- CAMERA: a raised three-quarter looking DOWN the street axis (azimuth\n within ±30° of the road direction, elevation 10–18° — nearer eye\n level than drone, so facades face the camera — distance framing the\n whole block). Top-down diorama angles miniaturize the scene —\n they're for the stylized register. ENCLOSED places (a town square,\n plaza, courtyard) are framed from just INSIDE the enclosure — near\n one edge, looking across the fountain/space to the far facades\n (elevation 8–15°); from outside the building ring the render reads\n as a model on a table, not a place. Either way the GROUND runs to\n the frame edges: a wide muted surround plane (paving/grass) beyond\n the built block, so no raw background shows below the horizon.\n\n## Towers & city blocks\n\nA tower is storeys × S tall with a REPEATING window grid — loop it, never\nfreehand it. For a whole block/skyline, boxes with a `layer('texture',\n{ style: 'modern office building glass facade with lit windows, seamless' })`\nbeat hundreds of window meshes; vary heights and footprints per building\n(loops + `rand()`), keep every edge crisp, and light it with one key + fog\nfor depth.\n\nCITY COUNT: a \"city\" is a COUNT before it is anything else — it starts\nreading as one around ~40 distinct buildings and improves past 80. LOOP\na grid of blocks (vary footprint, height, setback, and a few degrees of\nyaw via seeded `rand()`), carve street gaps, and step heights toward a\ndowntown cluster; 10–15 hand-placed chunky boxes is a train-set, not a\ncity. This holds in EVERY register, including the white\nmuseum/architectural-model style: that look comes from the monochrome\npalette and crisp edges, NOT from fewer, simpler buildings. A model\ncity on TERRAIN (topographic style) pairs with mountains built at the\nprocedural-generation skill's MOUNTAIN settings (resolution 200+,\noctaves 5–6) — smooth default hills beside a detailed city read as\nunfinished dough. Waterfront cities: thin bridge/causeway decks between\nland masses, piers, and small hull-shaped boats at true relative scale\n— a dense city ringed by EMPTY flat water reads abandoned.\n\n## Order of work\n\nStructure (walls + roof + chimney) → openings (door/windows/frames) →\nmaterials/textures → ground & dressing → lights/AO/fog → group + name (a\nlater call than creation) → `set_view({ objects: [...] })` +\n`take_screenshot()` → judge against the quality bar (style fidelity first)\n→ final `lookFrom`.\n"
}SHA-256 of public snapshot: e15d31dfb5aad9014a7042453521f5a3ecfea46f8f0635c1c4db8a3956f736b0