{
  "schemaVersion": 1,
  "id": "blue-marble",
  "version": "1.0.0",
  "status": "published",
  "kind": "object",
  "title": "Blue Marble",
  "summary": "A turning blue planet with continents, swirling clouds, a glowing rim and the lights of night cities. Loops perfectly.",
  "description": "An Earth-like planet seen from space: invented continents and oceans drawn from seeded noise, with forests, deserts, mountains and ice caps coloured by height and latitude; a shell of swirling cloud that slides over the land; a blue haze of atmosphere along the rim; the sun low to one side so there is a day side, a terminator and a night side glittering with the lights of cities; and a field of stars. Choose an earthlike or a desert world, the seed, how much of it is ocean, the clouds, the atmosphere, where the sun is and whether the camera pushes in.",
  "role": "Object (3D, three.js): a cinematic space backdrop for science, tech, environment and sci-fi content.",
  "collections": [
    "backgrounds",
    "hypnotic-loops"
  ],
  "tags": [
    "planet",
    "earth",
    "space",
    "globe",
    "clouds",
    "atmosphere",
    "night lights",
    "stars",
    "blue marble",
    "loop",
    "3d"
  ],
  "synonyms": [
    "earth from space",
    "spinning planet",
    "earth globe",
    "world from orbit",
    "procedural planet",
    "blue planet"
  ],
  "useCases": [
    "A science, climate or environment title scene",
    "A sci-fi or space-tech backdrop",
    "A global-company or network opener"
  ],
  "featured": null,
  "publishedAt": "2026-10-06",
  "implementation": {
    "target": "three",
    "runtime": "browser",
    "language": "javascript",
    "module": "esm",
    "entry": "src/blue-marble.js",
    "exports": [
      {
        "name": "createBluePlanet",
        "signature": "createBluePlanet({ kind?, seed?, ocean?, clouds?, atmosphere?, sunAngle? }) => { group, sunDirection, setProgress(progress), dispose() }",
        "description": "The planet, its cloud shell, atmosphere and stars as a group (radius 2); no lights needed: the sun is in the shaders."
      }
    ],
    "reusable": [
      "src/blue-marble.js"
    ],
    "demo": "demo.js",
    "harness": "index.html"
  },
  "dependencies": [
    {
      "id": "three",
      "version": "0.185.1",
      "reason": "Renderer, geometry and shader materials."
    },
    {
      "id": "apw-runtime",
      "version": "1.0.0",
      "scope": "demo",
      "reason": "Demo harness."
    }
  ],
  "params": [
    {
      "key": "kind",
      "label": "World",
      "type": "select",
      "default": "earth",
      "options": [
        {
          "value": "earth",
          "label": "Earthlike"
        },
        {
          "value": "arid",
          "label": "Desert world"
        }
      ]
    },
    {
      "key": "seed",
      "label": "Seed",
      "type": "integer",
      "min": 1,
      "max": 999,
      "step": 1,
      "default": 5
    },
    {
      "key": "ocean",
      "label": "Ocean",
      "help": "How much of the surface is sea.",
      "type": "number",
      "min": 0.2,
      "max": 0.8,
      "step": 0.02,
      "default": 0.5
    },
    {
      "key": "clouds",
      "label": "Clouds",
      "type": "number",
      "min": 0,
      "max": 1.2,
      "step": 0.05,
      "default": 1
    },
    {
      "key": "atmosphere",
      "label": "Atmosphere",
      "type": "number",
      "min": 0,
      "max": 1.5,
      "step": 0.05,
      "default": 1
    },
    {
      "key": "sun",
      "label": "Sun angle",
      "help": "Degrees from the camera's side.",
      "type": "number",
      "min": 10,
      "max": 90,
      "step": 1,
      "default": 40
    },
    {
      "key": "zoom",
      "label": "Push in",
      "type": "boolean",
      "default": true
    }
  ],
  "presets": [
    {
      "id": "default",
      "label": "Earthlike, evening terminator",
      "params": {}
    },
    {
      "id": "arid",
      "label": "Desert world",
      "params": {
        "kind": "arid",
        "seed": 17,
        "ocean": 0.3,
        "atmosphere": 0.7
      }
    },
    {
      "id": "ocean",
      "label": "Water world, thick clouds",
      "params": {
        "seed": 2,
        "ocean": 0.76,
        "clouds": 1.2
      }
    },
    {
      "id": "quarter",
      "label": "Crescent, sun behind",
      "params": {
        "sun": 80,
        "seed": 9
      }
    }
  ],
  "output": {
    "width": 1080,
    "height": 1080,
    "fps": 30,
    "durationSeconds": 16,
    "posterSeconds": 4,
    "alpha": false,
    "motion": "procedural",
    "loop": {
      "seamless": true,
      "cycleSeconds": 16,
      "method": "The planet turns once and the cloud shell twice per loop, and the camera push-in is a cosine of the loop, so the last frame meets the first."
    },
    "seed": {
      "param": "seed",
      "behavior": "Seed draws the continents, deserts, clouds and the stars: same seed, same world."
    }
  },
  "composition": {
    "inputs": "Time within the loop; the kind of world, seed, ocean, clouds, atmosphere, sun angle and push-in.",
    "outputs": "A full frame rendered in 3D with shader-lit spheres.",
    "coordinates": "The planet (radius 2) is at the origin with the sun in direction (sin a, 0.18, cos a); the camera looks at it from z ≈ 9.5.",
    "lighting": "Self-lit by shaders: Lambert day side, an ocean sun glint, night-side city lights, a cloud shell lit by the same sun and an additive Fresnel atmosphere that is brighter on the sun side.",
    "timing": "setProgress(progress) sets the two spins; frames render in any order.",
    "compatibleWith": [
      "kinetic-title",
      "number-reveal"
    ],
    "notes": [
      "The colour map (1024 × 512) is drawn once from three octaves of seeded 3D noise sampled on the sphere, so it has no seam or pole pinch; the alpha channel marks where city lights glow; the cloud map is a domain-warped fractal."
    ]
  },
  "reuse": [
    "Climate or science title: Earthlike, evening terminator.",
    "Sci-fi opener: Desert world.",
    "Global network backdrop: Water world."
  ],
  "integration": {
    "newProject": "Create a WebGLRenderer with tone mapping, add createBluePlanet().group to a scene on a dark background and call planet.setProgress(progress) each frame.",
    "existingProject": "Copy src/blue-marble.js; add planet.group to your scene (no lights needed)."
  },
  "performance": {
    "notes": "Three spheres with small shaders, 1600 stars and two 1024 × 512 maps drawn once at start (about a second of CPU). A couple of milliseconds a frame on an integrated Intel GPU.",
    "limits": "Software WebGL renders in under a second a frame."
  },
  "limitations": [
    "The world is invented, not real geography; there is no relief shading or normal map, so mountains read by colour only.",
    "No moon and no city lights on the day side."
  ],
  "license": {
    "spdx": "MIT",
    "notice": "Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.",
    "thirdParty": []
  },
  "provenance": "Adapted from the owner's threejs-sketches/space-cosmic/blue-marble (MIT) and rebuilt for AI Pixel Wizard in October 2026 as an original object: seam-free seeded continents and swirled clouds baked from 3D noise, a day/terminator/night shader with ocean glint and city lights, a Fresnel atmosphere and whole-turn motion for an exact loop.",
  "changelog": [
    {
      "version": "1.0.0",
      "date": "2026-10-05",
      "notes": "Initial release."
    }
  ]
}
