{
  "streamed": true,
  "usage": {
    "prompt_tokens": 111,
    "completion_tokens": 8197,
    "total_tokens": 8308,
    "cost": 0.0308775,
    "is_byok": false,
    "prompt_tokens_details": {
      "cached_tokens": 0,
      "cache_write_tokens": 0,
      "audio_tokens": 0,
      "video_tokens": 0
    },
    "cost_details": {
      "upstream_inference_cost": 0.0308775,
      "upstream_inference_prompt_cost": 0.00013875,
      "upstream_inference_completions_cost": 0.03073875
    },
    "completion_tokens_details": {
      "reasoning_tokens": 212,
      "image_tokens": 0,
      "audio_tokens": 0
    }
  },
  "finishReason": "stop",
  "content": "```html\n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<title>Big Mac 3D</title>\n<style>\n* { margin: 0; padding: 0; overflow: hidden; }\nbody { background: #1a1a1a; }\ncanvas { display: block; width: 100vw; height: 100vh; }\n</style>\n</head>\n<body>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/three.js/r152/three.min.js\"></script>\n<script src=\"https://cdn.jsdelivr.net/npm/three@0.152.0/examples/js/controls/OrbitControls.js\"></script>\n<script>\n(function() {\n    // Scene setup\n    const scene = new THREE.Scene();\n    scene.background = new THREE.Color(0x1a1a1a);\n    \n    const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 100);\n    camera.position.set(4, 3, 5);\n    \n    const renderer = new THREE.WebGLRenderer({ antialias: true });\n    renderer.setSize(window.innerWidth, window.innerHeight);\n    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n    renderer.shadowMap.enabled = true;\n    renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n    renderer.toneMapping = THREE.ACESFilmicToneMapping;\n    renderer.toneMappingExposure = 1.2;\n    renderer.outputColorSpace = THREE.SRGBColorSpace;\n    document.body.appendChild(renderer.domElement);\n    \n    // Controls\n    const controls = new THREE.OrbitControls(camera, renderer.domElement);\n    controls.enableDamping = true;\n    controls.dampingFactor = 0.05;\n    controls.minDistance = 3;\n    controls.maxDistance = 12;\n    controls.target.set(0, 0.5, 0);\n    \n    // Lighting\n    const ambientLight = new THREE.AmbientLight(0xffffff, 0.3);\n    scene.add(ambientLight);\n    \n    const mainLight = new THREE.DirectionalLight(0xfff5e6, 2.5);\n    mainLight.position.set(5, 8, 4);\n    mainLight.castShadow = true;\n    mainLight.shadow.mapSize.set(2048, 2048);\n    mainLight.shadow.camera.near = 0.5;\n    mainLight.shadow.camera.far = 20;\n    mainLight.shadow.camera.left = -5;\n    mainLight.shadow.camera.right = 5;\n    mainLight.shadow.camera.top = 5;\n    mainLight.shadow.camera.bottom = -5;\n    mainLight.shadow.bias = -0.001;\n    scene.add(mainLight);\n    \n    const fillLight = new THREE.DirectionalLight(0xffe0b0, 0.8);\n    fillLight.position.set(-3, 4, -2);\n    scene.add(fillLight);\n    \n    const rimLight = new THREE.DirectionalLight(0xffffff, 0.6);\n    rimLight.position.set(0, 2, -5);\n    scene.add(rimLight);\n    \n    const bottomLight = new THREE.PointLight(0xff8844, 0.5, 10);\n    bottomLight.position.set(0, -2, 0);\n    scene.add(bottomLight);\n    \n    // Environment map (procedural)\n    const cubeRenderTarget = new THREE.WebGLCubeRenderTarget(256);\n    const cubeCamera = new THREE.CubeCamera(0.1, 100, cubeRenderTarget);\n    \n    // Create a gradient environment sphere\n    const envScene = new THREE.Scene();\n    const envGeo = new THREE.SphereGeometry(50, 32, 32);\n    const envCanvas = document.createElement('canvas');\n    envCanvas.width = 1024;\n    envCanvas.height = 512;\n    const envCtx = envCanvas.getContext('2d');\n    const gradient = envCtx.createLinearGradient(0, 0, 0, 512);\n    gradient.addColorStop(0, '#2a2a3a');\n    gradient.addColorStop(0.4, '#3a3a4a');\n    gradient.addColorStop(0.6, '#4a4a5a');\n    gradient.addColorStop(1, '#1a1a2a');\n    envCtx.fillStyle = gradient;\n    envCtx.fillRect(0, 0, 1024, 512);\n    // Add some bright spots for reflections\n    envCtx.fillStyle = 'rgba(255, 240, 200, 0.3)';\n    envCtx.beginPath();\n    envCtx.arc(300, 200, 80, 0, Math.PI * 2);\n    envCtx.fill();\n    envCtx.fillStyle = 'rgba(200, 220, 255, 0.2)';\n    envCtx.beginPath();\n    envCtx.arc(700, 250, 60, 0, Math.PI * 2);\n    envCtx.fill();\n    const envTexture = new THREE.CanvasTexture(envCanvas);\n    envTexture.mapping = THREE.EquirectangularReflectionMapping;\n    const envMat = new THREE.MeshBasicMaterial({ map: envTexture, side: THREE.BackSide });\n    const envMesh = new THREE.Mesh(envGeo, envMat);\n    envScene.add(envMesh);\n    cubeCamera.update(renderer, envScene);\n    scene.environment = cubeRenderTarget.texture;\n    \n    // Big Mac group\n    const burger = new THREE.Group();\n    \n    // Helper functions\n    function createCanvasTexture(width, height, drawFunc) {\n        const canvas = document.createElement('canvas');\n        canvas.width = width;\n        canvas.height = height;\n        const ctx = canvas.getContext('2d');\n        drawFunc(ctx, width, height);\n        const tex = new THREE.CanvasTexture(canvas);\n        tex.wrapS = THREE.RepeatWrapping;\n        tex.wrapT = THREE.RepeatWrapping;\n        return tex;\n    }\n    \n    // Bun material\n    const bunColorMap = createCanvasTexture(512, 512, (ctx, w, h) => {\n        const grad = ctx.createRadialGradient(w/2, h/2, 0, w/2, h/2, w/2);\n        grad.addColorStop(0, '#e8a840');\n        grad.addColorStop(0.5, '#d4922e');\n        grad.addColorStop(0.8, '#c07820');\n        grad.addColorStop(1, '#a86818');\n        ctx.fillStyle = grad;\n        ctx.fillRect(0, 0, w, h);\n        // Add subtle variation\n        for (let i = 0; i < 2000; i++) {\n            const x = Math.random() * w;\n            const y = Math.random() * h;\n            const r = Math.random() * 3 + 1;\n            ctx.fillStyle = `rgba(${160 + Math.random()*40}, ${100 + Math.random()*30}, ${20 + Math.random()*20}, 0.1)`;\n            ctx.beginPath();\n            ctx.arc(x, y, r, 0, Math.PI * 2);\n            ctx.fill();\n        }\n    });\n    \n    const bunNormalMap = createCanvasTexture(512, 512, (ctx, w, h) => {\n        ctx.fillStyle = '#8080ff';\n        ctx.fillRect(0, 0, w, h);\n        for (let i = 0; i < 1000; i++) {\n            const x = Math.random() * w;\n            const y = Math.random() * h;\n            const r = Math.random() * 4 + 1;\n            const color = Math.floor(128 + (Math.random() - 0.5) * 30);\n            ctx.fillStyle = `rgb(${color}, ${color}, 255)`;\n            ctx.beginPath();\n            ctx.arc(x, y, r, 0, Math.PI * 2);\n            ctx.fill();\n        }\n    });\n    \n    const bunRoughMap = createCanvasTexture(512, 512, (ctx, w, h) => {\n        ctx.fillStyle = '#999';\n        ctx.fillRect(0, 0, w, h);\n        for (let i = 0; i < 3000; i++) {\n            const x = Math.random() * w;\n            const y = Math.random() * h;\n            const r = Math.random() * 3;\n            const v = Math.floor(130 + Math.random() * 60);\n            ctx.fillStyle = `rgb(${v}, ${v}, ${v})`;\n            ctx.beginPath();\n            ctx.arc(x, y, r, 0, Math.PI * 2);\n            ctx.fill();\n        }\n    });\n    \n    // Top bun geometry (dome with base)\n    function createTopBun() {\n        const group = new THREE.Group();\n        \n        // Main dome\n        const segments = 64;\n        const geo = new THREE.SphereGeometry(1.4, segments, segments / 2, 0, Math.PI * 2, 0, Math.PI * 0.45);\n        \n        // Flatten and shape\n        const positions = geo.attributes.position;\n        for (let i = 0; i < positions.count; i++) {\n            let x = positions.getX(i);\n            let y = positions.getY(i);\n            let z = positions.getZ(i);\n            // Squish vertically\n            y *= 1.2;\n            // Slight bottom edge widening\n            const dist = Math.sqrt(x * x + z * z);\n            if (y < 0.3) {\n                const factor = 1 + (0.3 - y) * 0.3;\n                x *= factor;\n                z *= factor;\n            }\n            positions.setXYZ(i, x, y, z);\n        }\n        geo.computeVertexNormals();\n        \n        const bunMat = new THREE.MeshPhysicalMaterial({\n            map: bunColorMap,\n            normalMap: bunNormalMap,\n            normalScale: new THREE.Vector2(0.3, 0.3),\n            roughnessMap: bunRoughMap,\n            roughness: 0.7,\n            metalness: 0.0,\n            clearcoat: 0.1,\n            clearcoatRoughness: 0.8,\n            envMap: cubeRenderTarget.texture,\n            envMapIntensity: 0.3,\n        });\n        \n        const bunMesh = new THREE.Mesh(geo, bunMat);\n        bunMesh.castShadow = true;\n        bunMesh.receiveShadow = true;\n        group.add(bunMesh);\n        \n        // Bottom flat part of top bun\n        const bottomGeo = new THREE.CylinderGeometry(1.45, 1.42, 0.12, segments);\n        const bottomMesh = new THREE.Mesh(bottomGeo, bunMat);\n        bottomMesh.position.y = 0.02;\n        bottomMesh.castShadow = true;\n        group.add(bottomMesh);\n        \n        // Sesame seeds on top\n        const seedGeo = new THREE.CapsuleGeometry(0.025, 0.06, 4, 8);\n        const seedMat = new THREE.MeshPhysicalMaterial({\n            color: 0xf5e6c8,\n            roughness: 0.4,\n            metalness: 0.0,\n            clearcoat: 0.2,\n        });\n        \n        for (let i = 0; i < 120; i++) {\n            const theta = Math.random() * Math.PI * 2;\n            const phi = Math.random() * Math.PI * 0.35;\n            const r = 1.4;\n            \n            const x = r * Math.sin(phi) * Math.cos(theta);\n            const y = r * Math.cos(phi) * 1.2;\n            const z = r * Math.sin(phi) * Math.sin(theta);\n            \n            const seed = new THREE.Mesh(seedGeo, seedMat);\n            seed.position.set(x, y, z);\n            seed.lookAt(0, 0, 0);\n            seed.rotateX(Math.PI / 2 + (Math.random() - 0.5) * 0.3);\n            seed.rotateZ(Math.random() * Math.PI);\n            seed.position.y -= 0.01;\n            seed.castShadow = true;\n            group.add(seed);\n        }\n        \n        return group;\n    }\n    \n    // Bottom bun\n    function createBottomBun() {\n        const segments = 64;\n        const geo = new THREE.CylinderGeometry(1.5, 1.55, 0.45, segments);\n        \n        // Add slight dome to bottom\n        const positions = geo.attributes.position;\n        for (let i = 0; i < positions.count; i++) {\n            let x = positions.getX(i);\n            let y = positions.getY(i);\n            let z = positions.getZ(i);\n            const dist = Math.sqrt(x * x + z * z);\n            if (y < 0) {\n                const bump = (1 - (dist / 1.55) * (dist / 1.55)) * 0.1;\n                y += bump;\n            }\n            // Slight irregularity\n            const noise = Math.sin(x * 5 + z * 3) * 0.01 + Math.sin(x * 8 - z * 6) * 0.008;\n            y += noise;\n            positions.setXYZ(i, x, y, z);\n        }\n        geo.computeVertexNormals();\n        \n        const bunMat = new THREE.MeshPhysicalMaterial({\n            map: bunColorMap,\n            normalMap: bunNormalMap,\n            normalScale: new THREE.Vector2(0.2, 0.2),\n            roughness: 0.75,\n            metalness: 0.0,\n            envMap: cubeRenderTarget.texture,\n            envMapIntensity: 0.2,\n        });\n        \n        const mesh = new THREE.Mesh(geo, bunMat);\n        mesh.castShadow = true;\n        mesh.receiveShadow = true;\n        return mesh;\n    }\n    \n    // Middle bun (club)\n    function createMiddleBun() {\n        const segments = 64;\n        const geo = new THREE.CylinderGeometry(1.42, 1.42, 0.2, segments);\n        \n        const positions = geo.attributes.position;\n        for (let i = 0; i < positions.count; i++) {\n            let x = positions.getX(i);\n            let y = positions.getY(i);\n            let z = positions.getZ(i);\n            const dist = Math.sqrt(x * x + z * z);\n            const noise = Math.sin(x * 7 + z * 5) * 0.008;\n            y += noise;\n            positions.setXYZ(i, x, y, z);\n        }\n        geo.computeVertexNormals();\n        \n        const innerColor = new THREE.Color('#e8c878');\n        const mat = new THREE.MeshPhysicalMaterial({\n            map: bunColorMap,\n            roughness: 0.8,\n            metalness: 0.0,\n            color: innerColor,\n        });\n        \n        const mesh = new THREE.Mesh(geo, mat);\n        mesh.castShadow = true;\n        mesh.receiveShadow = true;\n        return mesh;\n    }\n    \n    // Beef patty\n    function createPatty() {\n        const segments = 64;\n        const geo = new THREE.CylinderGeometry(1.35, 1.4, 0.25, segments);\n        \n        const positions = geo.attributes.position;\n        for (let i = 0; i < positions.count; i++) {\n            let x = positions.getX(i);\n            let y = positions.getY(i);\n            let z = positions.getZ(i);\n            const dist = Math.sqrt(x * x + z * z);\n            // Irregular edges\n            const angle = Math.atan2(z, x);\n            const edgeNoise = Math.sin(angle * 12) * 0.03 + Math.sin(angle * 7) * 0.02 + Math.sin(angle * 23) * 0.01;\n            if (dist > 1.0) {\n                x *= (1 + edgeNoise);\n                z *= (1 + edgeNoise);\n            }\n            // Surface bumps\n            const bump = Math.sin(x * 15) * 0.01 + Math.sin(z * 12) * 0.01 + Math.sin(x * 8 + z * 11) * 0.008;\n            y += bump;\n            positions.setXYZ(i, x, y, z);\n        }\n        geo.computeVertexNormals();\n        \n        const pattyColorMap = createCanvasTexture(512, 512, (ctx, w, h) => {\n            ctx.fillStyle = '#3d2010';\n            ctx.fillRect(0, 0, w, h);\n            for (let i = 0; i < 5000; i++) {\n                const x = Math.random() * w;\n                const y = Math.random() * h;\n                const r = Math.random() * 4 + 1;\n                const brown = Math.floor(30 + Math.random() * 40);\n                ctx.fillStyle = `rgb(${brown + 10}, ${brown}, ${Math.floor(brown * 0.5)})`;\n                ctx.beginPath();\n                ctx.arc(x, y, r, 0, Math.PI * 2);\n                ctx.fill();\n            }\n            // Grill marks\n            ctx.strokeStyle = 'rgba(20, 10, 0, 0.3)';\n            ctx.lineWidth = 8;\n            for (let i = 0; i < 6; i++) {\n                ctx.beginPath();\n                ctx.moveTo(0, i * 90 + 30);\n                ctx.lineTo(w, i * 90 + 30);\n                ctx.stroke();\n            }\n        });\n        \n        const pattyNormalMap = createCanvasTexture(512, 512, (ctx, w, h) => {\n            ctx.fillStyle = '#8080ff';\n            ctx.fillRect(0, 0, w, h);\n            for (let i = 0; i < 3000; i++) {\n                const x = Math.random() * w;\n                const y = Math.random() * h;\n                const r = Math.random() * 5 + 2;\n                const nx = Math.floor(128 + (Math.random() - 0.5) * 60);\n                const ny = Math.floor(128 + (Math.random() - 0.5) * 60);\n                ctx.fillStyle = `rgb(${nx}, ${ny}, 220)`;\n                ctx.beginPath();\n                ctx.arc(x, y, r, 0, Math.PI * 2);\n                ctx.fill();\n            }\n        });\n        \n        const mat = new THREE.MeshPhysicalMaterial({\n            map: pattyColorMap,\n            normalMap: pattyNormalMap,\n            normalScale: new THREE.Vector2(0.8, 0.8),\n            roughness: 0.9,\n            metalness: 0.0,\n            color: 0x4a2810,\n        });\n        \n        const mesh = new THREE.Mesh(geo, mat);\n        mesh.castShadow = true;\n        mesh.receiveShadow = true;\n        return mesh;\n    }\n    \n    // Cheese slice\n    function createCheese() {\n        const group = new THREE.Group();\n        \n        // Base cheese shape - slightly larger than patty, with draping\n        const shape = new THREE.Shape();\n        const cheeseSize = 1.55;\n        shape.moveTo(-cheeseSize, -cheeseSize);\n        shape.lineTo(cheeseSize, -cheeseSize);\n        shape.lineTo(cheeseSize, cheeseSize);\n        shape.lineTo(-cheeseSize, cheeseSize);\n        shape.closePath();\n        \n        const extrudeSettings = { depth: 0.06, bevelEnabled: true, bevelThickness: 0.02, bevelSize: 0.02, bevelSegments: 3 };\n        const geo = new THREE.ExtrudeGeometry(shape, extrudeSettings);\n        geo.rotateX(-Math.PI / 2);\n        \n        // Add draping deformation\n        const positions = geo.attributes.position;\n        for (let i = 0; i < positions.count; i++) {\n            let x = positions.getX(i);\n            let y = positions.getY(i);\n            let z = positions.getZ(i);\n            const dist = Math.sqrt(x * x + z * z);\n            // Drape at edges\n            if (dist > 1.2) {\n                const drape = (dist - 1.2) * 0.3;\n                y -= drape;\n            }\n            // Wavy surface\n            const wave = Math.sin(x * 3 + z * 2) * 0.02;\n            y += wave;\n            positions.setXYZ(i, x, y, z);\n        }\n        geo.computeVertexNormals();\n        \n        const mat = new THREE.MeshPhysicalMaterial({\n            color: 0xffcc00,\n            roughness: 0.3,\n            metalness: 0.0,\n            clearcoat: 0.4,\n            clearcoatRoughness: 0.3,\n            transmission: 0.05,\n            thickness: 0.1,\n            envMap: cubeRenderTarget.texture,\n            envMapIntensity: 0.5,\n        });\n        \n        const mesh = new THREE.Mesh(geo, mat);\n        mesh.castShadow = true;\n        mesh.receiveShadow = true;\n        group.add(mesh);\n        return group;\n    }\n    \n    // Lettuce\n    function createLettuce() {\n        const group = new THREE.Group();\n        const segments = 128;\n        \n        // Create wavy lettuce using a deformed disc\n        const geo = new THREE.CircleGeometry(1.6, segments);\n        const positions = geo.attributes.position;\n        \n        // Create multiple layers for volume\n        for (let layer = 0; layer < 3; layer++) {\n            const layerGeo = new THREE.CircleGeometry(1.6, segments);\n            const layerPos = layerGeo.attributes.position;\n            const seed = layer * 100;\n            \n            for (let i = 0; i < layerPos.count; i++) {\n                let x = layerPos.getX(i);\n                let y = layerPos.getY(i);\n                let z = layerPos.getZ(i) || 0;\n                \n                const dist = Math.sqrt(x * x + y * y);\n                const angle = Math.atan2(y, x);\n                \n                // Wavy edges (frilly lettuce)\n                const edgeWave = Math.sin(angle * 12 + seed) * 0.15 + Math.sin(angle * 7 + seed * 0.5) * 0.1;\n                const radialWave = Math.sin(dist * 8 + angle * 5 + seed) * 0.05;\n                \n                // Convert to 3D with height variation\n                const heightVar = Math.sin(x * 4 + seed) * 0.04 + Math.cos(y * 5 + seed) * 0.04;\n                \n                z = heightVar + layer * 0.025;\n                \n                // Make edges more ruffled\n                if (dist > 1.3) {\n                    const excess = dist - 1.3;\n                    z += Math.sin(angle * 15 + seed) * excess * 0.3;\n                }\n                \n                layerPos.setX(i, x * (1 + edgeWave * 0.1));\n                layerPos.setY(i, y * (1 + edgeWave * 0.1));\n                layerPos.setZ(i, z);\n            }\n            layerGeo.computeVertexNormals();\n            layerGeo.rotateX(-Math.PI / 2);\n            \n            const lettuceColorMap = createCanvasTexture(256, 256, (ctx, w, h) => {\n                const grad = ctx.createLinearGradient(0, 0, w, h);\n                const green1 = 60 + layer * 15;\n                const green2 = 140 + layer * 10;\n                grad.addColorStop(0, `rgb(${green1}, ${green2}, ${green1 - 10})`);\n                grad.addColorStop(0.5, `rgb(${green1 + 20}, ${green2 + 20}, ${green1 + 10})`);\n                grad.addColorStop(1, `rgb(${green1 - 10}, ${green2 - 10}, ${green1 - 15})`);\n                ctx.fillStyle = grad;\n                ctx.fillRect(0, 0, w, h);\n                // Veins\n                ctx.strokeStyle = `rgba(${green1 + 40}, ${green2 + 30}, ${green1 + 20}, 0.3)`;\n                ctx.lineWidth = 2;\n                for (let v = 0; v < 10; v++) {\n                    ctx.beginPath();\n                    ctx.moveTo(w/2, h);\n                    ctx.quadraticCurveTo(\n                        w/2 + (Math.random() - 0.5) * w * 0.8,\n                        h * Math.random(),\n                        Math.random() * w,\n                        0\n                    );\n                    ctx.stroke();\n                }\n            });\n            \n            const mat = new THREE.MeshPhysicalMaterial({\n                map: lettuceColorMap,\n                roughness: 0.6,\n                metalness: 0.0,\n                side: THREE.DoubleSide,\n                color: new THREE.Color(0.3 + layer * 0.05, 0.7 + layer * 0.05, 0.2),\n            });\n            \n            const mesh = new THREE.Mesh(layerGeo, mat);\n            mesh.position.y = layer * 0.02;\n            mesh.castShadow = true;\n            group.add(mesh);\n        }\n        \n        return group;\n    }\n    \n    // Onion rings\n    function createOnions() {\n        const group = new THREE.Group();\n        \n        const onionMat = new THREE.MeshPhysicalMaterial({\n            color: 0xf0f0e8,\n            roughness: 0.4,\n            metalness: 0.0,\n            clearcoat: 0.3,\n            transmission: 0.1,\n        });\n        \n        for (let i = 0; i < 8; i++) {\n            const radius = 0.8 + Math.random() * 0.5;\n            const tubeRadius = 0.06 + Math.random() * 0.03;\n            const geo = new THREE.TorusGeometry(radius, tubeRadius, 8, 32, Math.PI * (1.2 + Math.random() * 0.8));\n            \n            const mesh = new THREE.Mesh(geo, onionMat);\n            mesh.position.x = (Math.random() - 0.5) * 0.5;\n            mesh.position.z = (Math.random() - 0.5) * 0.5;\n            mesh.rotation.x = Math.PI / 2 + (Math.random() - 0.5) * 0.3;\n            mesh.rotation.z = Math.random() * Math.PI * 2;\n            mesh.castShadow = true;\n            group.add(mesh);\n        }\n        \n        return group;\n    }\n    \n    // Pickles\n    function createPickles() {\n        const group = new THREE.Group();\n        \n        const pickleMat = new THREE.MeshPhysicalMaterial({\n            color: 0x4a7a2a,\n            roughness: 0.4,\n            metalness: 0.0,\n            clearcoat: 0.5,\n            clearcoatRoughness: 0.3,\n        });\n        \n        for (let i = 0; i < 8; i++) {\n            const geo = new THREE.CylinderGeometry(0.2, 0.2, 0.05, 16);\n            const mesh = new THREE.Mesh(geo, pickleMat);\n            const angle = (i / 8) * Math.PI * 2 + Math.random() * 0.3;\n            const r = 0.5 + Math.random() * 0.6;\n            mesh.position.x = Math.cos(angle) * r;\n            mesh.position.z = Math.sin(angle) * r;\n            mesh.rotation.x = (Math.random() - 0.5) * 0.2;\n            mesh.rotation.z = (Math.random() - 0.5) * 0.2;\n            mesh.castShadow = true;\n            group.add(mesh);\n        }\n        \n        return group;\n    }\n    \n    // Sauce\n    function createSauce() {\n        const group = new THREE.Group();\n        \n        const sauceMat = new THREE.MeshPhysicalMaterial({\n            color: 0xd4a050,\n            roughness: 0.2,\n            metalness: 0.0,\n            clearcoat: 0.8,\n            clearcoatRoughness: 0.1,\n        });\n        \n        // Sauce drips - multiple small blobs\n        for (let i = 0; i < 15; i++) {\n            const angle = Math.random() * Math.PI * 2;\n            const r = 1.0 + Math.random() * 0.4;\n            \n            const size = 0.05 + Math.random() * 0.1;\n            const geo = new THREE.SphereGeometry(size, 8, 8);\n            geo.scale(1, 0.3, 1);\n            \n            const mesh = new THREE.Mesh(geo, sauceMat);\n            mesh.position.x = Math.cos(angle) * r;\n            mesh.position.z = Math.sin(angle) * r;\n            mesh.position.y = (Math.random() - 0.5) * 0.02;\n            mesh.castShadow = true;\n            group.add(mesh);\n        }\n        \n        return group;\n    }\n    \n    // Assemble the Big Mac\n    const bunBottom = createBottomBun();\n    bunBottom.position.y = 0;\n    burger.add(bunBottom);\n    \n    // First patty\n    const patty1 = createPatty();\n    patty1.position.y = 0.35;\n    burger.add(patty1);\n    \n    // Sauce on first patty\n    const sauce1 = createSauce();\n    sauce1.position.y = 0.48;\n    burger.add(sauce1);\n    \n    // Pickles\n    const pickles = createPickles();\n    pickles.position.y = 0.5;\n    burger.add(pickles);\n    \n    // Onions\n    const onions = createOnions();\n    onions.position.y = 0.5;\n    burger.add(onions);\n    \n    // Lettuce\n    const lettuce = createLettuce();\n    lettuce.position.y = 0.55;\n    burger.add(lettuce);\n    \n    // Middle bun\n    const middleBun = createMiddleBun();\n    middleBun.position.y = 0.72;\n    burger.add(middleBun);\n    \n    // Second patty\n    const patty2 = createPatty();\n    patty2.position.y = 0.95;\n    burger.add(patty2);\n    \n    // Sauce on second patty\n    const sauce2 = createSauce();\n    sauce2.position.y = 1.08;\n    burger.add(sauce2);\n    \n    // Cheese (draped over second patty)\n    const cheese = createCheese();\n    cheese.position.y = 1.1;\n    burger.add(cheese);\n    \n    // More lettuce on top\n    const lettuce2 = createLettuce();\n    lettuce2.position.y = 1.15;\n    burger.add(lettuce2);\n    \n    // Top bun\n    const topBun = createTopBun();\n    topBun.position.y = 1.3;\n    burger.add(topBun);\n    \n    scene.add(burger);\n    \n    // Ground plane (dark reflective surface)\n    const groundGeo = new THREE.PlaneGeometry(20, 20);\n    const groundMat = new THREE.MeshPhysicalMaterial({\n        color: 0x222222,\n        roughness: 0.3,\n        metalness: 0.8,\n        envMap: cubeRenderTarget.texture,\n        envMapIntensity: 0.5,\n    });\n    const ground = new THREE.Mesh(groundGeo, groundMat);\n    ground.rotation.x = -Math.PI / 2;\n    ground.position.y = -0.25;\n    ground.receiveShadow = true;\n    scene.add(ground);\n    \n    // Platform/pedestal\n    const pedestalGeo = new THREE.CylinderGeometry(1.8, 2.0, 0.15, 64);\n    const pedestalMat = new THREE.MeshPhysicalMaterial({\n        color: 0x333333,\n        roughness: 0.2,\n        metalness: 0.9,\n        envMap: cubeRenderTarget.texture,\n        envMapIntensity: 0.8,\n    });\n    const pedestal = new THREE.Mesh(pedestalGeo, pedestalMat);\n    pedestal.position.y = -0.17;\n    pedestal.receiveShadow = true;\n    pedestal.castShadow = true;\n    scene.add(pedestal);\n    \n    // Animation\n    let time = 0;\n    function animate() {\n        requestAnimationFrame(animate);\n        time += 0.005;\n        \n        // Slow rotation\n        burger.rotation.y = time;\n        \n        // Gentle floating\n        burger.position.y = Math.sin(time * 2) * 0.02;\n        \n        controls.update();\n        renderer.render(scene, camera);\n    }\n    \n    // Resize handler\n    window.addEventListener('resize', () => {\n        camera.aspect = window.innerWidth / window.innerHeight;\n        camera.updateProjectionMatrix();\n        renderer.setSize(window.innerWidth, window.innerHeight);\n    });\n    \n    animate();\n})();\n</script>\n</body>\n</html>\n```"
}