乐于分享
好东西不私藏

【源码】顶级赛博朋克 Three.js 沉浸式作品

【源码】顶级赛博朋克 Three.js 沉浸式作品

打开页面,你会瞬间被带入一个未来高科技“电视跑步舱”(TV Run Chamber)。主角 Sparky —— 一个基于 Three.js 官方 RobotExpressive 模型的机器人,正在发光跑道上全力奔跑

整个场景充满浓郁的赛博朋克氛围:

  • 霓虹蓝、紫、品红、琥珀交织的光效
  • 动态发光机械环、悬浮全息面板
  • 大型电视墙实时播放低多边形乐队演出
  • 体积光、扫描线、辉光、粒子般的电路纹理
  • 强大的 Unreal Bloom 后期辉光
支持鼠标拖拽旋转、滚轮缩放、双击重置视角,还能通过下方赛博风格按钮在奔跑模式和站立模式之间无缝切换。
实现代码
<metacharset="UTF-8" /><metaname="viewport"content="width=device-width, initial-scale=1.0" /><title>Sparky TV Run Chamber</title><style>  :root {    --cyan#00f0ff;    --violet#a600ff;    --magenta#ff007c;    --amber#ff7c00;    --textrgba(2262482550.9);    --panelrgba(26150.7);    --borderrgba(02402550.25);  }  html,  body {    width100%;    height100%;    margin0;    overflow: hidden;    background#010206;    color: white;    font-family'Inter', ui-sans-serif, system-ui, sans-serif;  }  #container {    position: fixed;    inset0;    width100vw;    height100vh;    cursor: grab;    background:      radial-gradient(circle at 50% 40%rgba(1030600.35), transparent 45%),      radial-gradient(circle at 50% 110%rgba(16602550.15), transparent 50%),      #010206;  }  #container:active {    cursor: grabbing;  }  canvas {    display: block;  }  #loading {    position: fixed;    inset0;    z-index20;    display: grid;    place-items: center;    background:      radial-gradient(circle at 50% 50%rgba(515350.95), #010206 70%),      #010206;    transition: opacity 800ms cubic-bezier(0.1610.31), visibility 800ms;    pointer-events: none;  }  #loading.hidden {    opacity0;    visibility: hidden;  }  .loader-card {    min-width320px;    padding30px 32px;    border1px solid var(--border);    border-radius16px;    backgroundrgba(14120.85);    box-shadow:      0 0 50px rgba(02402550.15),      inset 0 1px 1px rgba(2552552550.05);    backdrop-filterblur(24px);    text-align: center;  }  .loader-title {    margin0 0 16px;    font-size12px;    font-weight800;    line-height1;    letter-spacing0.35em;    color#00f0ff;    text-transform: uppercase;    text-shadow0 0 10px rgba(02402550.5);  }  .loader-line {    position: relative;    overflow: hidden;    height3px;    border-radius999px;    backgroundrgba(02402550.08);    margin-bottom16px;  }  .loader-line span {    position: absolute;    inset0 auto 0 0;    width15%;    border-radius: inherit;    backgroundlinear-gradient(90deg, transparent, #00f0ff, transparent);    box-shadow0 0 12px #00f0ff;    animation: loaderSweep 1.5s ease-in-out infinite;  }  #loading-progress {    font-size11px;    font-family: monospace;    letter-spacing0.18em;    colorrgba(02402550.75);  }  .action-container {    position: fixed;    bottom35px;    left50%;    transformtranslateX(-50%);    z-index10;    pointer-events: auto;  }  .cyber-btn {    position: relative;    backgroundrgba(14150.8);    border1px solid rgba(02402550.3);    padding14px 32px;    border-radius40px;    color#00f0ff;    font-weight800;    font-family: monospace;    letter-spacing0.25em;    font-size11px;    text-transform: uppercase;    cursor: pointer;    backdrop-filterblur(16px);    transition: all 400ms cubic-bezier(0.1610.31);    box-shadow:      0 10px 30px rgba(0000.5),      inset 0 1px 0 rgba(2552552550.05);    display: flex;    align-items: center;    gap12px;  }  .cyber-btn:hover {    backgroundrgba(02402550.12);    border-color#00f0ff;    color#ffffff;    box-shadow:      0 0 30px rgba(02402550.25),      inset 0 0 10px rgba(02402550.2);    transformtranslateY(-2px);  }  .cyber-btn:active {    transformtranslateY(1px);  }  .status-pulse {    width8px;    height8px;    border-radius50%;    background#00f0ff;    box-shadow0 0 10px #00f0ff;    animation: modeIndicatorPulse 1s ease-in-out infinite alternate;  }  .status-pulse.standing {    background#ff007c;    box-shadow0 0 10px #ff007c;  }  @keyframes loaderSweep {    0% {      transformtranslateX(-100%);      width10%;    }    50% {      width60%;    }    100% {      transformtranslateX(300%);      width10%;    }  }  @keyframes modeIndicatorPulse {    from {      transformscale(0.85);      opacity0.6;    }    to {      transformscale(1.15);      opacity1;    }  }</style><scripttype="importmap">  {    "imports": {      "three""https://cdn.jsdelivr.net/npm/three@0.174.0/build/three.module.js",      "three/addons/""https://cdn.jsdelivr.net/npm/three@0.174.0/examples/jsm/"    }  }</script><divid="container"></div><divid="loading">  <divclass="loader-card">    <pclass="loader-title">Link Established</p>    <divclass="loader-line"><span></span></div>    <divid="loading-progress">INITIALIZING QUANTUM ENGINES...</div>  </div></div><divclass="action-container">  <buttonid="toggle-animation-btn"class="cyber-btn">    <spanid="btn-indicator"class="status-pulse"></span>    <spanid="btn-label">MODE: RUN ACTIVE</span>  </button></div><scripttype="module">  import * as THREE from "three";  import {    OrbitControls  } from "three/addons/controls/OrbitControls.js";  import {    GLTFLoader  } from "three/addons/loaders/GLTFLoader.js";  import {    RoomEnvironment  } from "three/addons/environments/RoomEnvironment.js";  import {    EffectComposer  } from "three/addons/postprocessing/EffectComposer.js";  import {    RenderPass  } from "three/addons/postprocessing/RenderPass.js";  import {    UnrealBloomPass  } from "three/addons/postprocessing/UnrealBloomPass.js";  import {    ShaderPass  } from "three/addons/postprocessing/ShaderPass.js";  import {    OutputPass  } from "three/addons/postprocessing/OutputPass.js";  function fract(x) {    return x - Math.floor(x);  }  function vec2(x, y) {    return {      x,      y    };  }  function dot2(a, b) {    return a.x * b.x + a.y * b.y;  }  function hashCoords(x, y) {    return fract(Math.sin(dot2(vec2(x, y), vec2(12.989878.233))) * 43758.5453);  }  const container = document.getElementById("container");  const loadingScreen = document.getElementById("loading");  const loadingProgress = document.getElementById("loading-progress");  const toggleBtn = document.getElementById("toggle-animation-btn");  const btnIndicator = document.getElementById("btn-indicator");  const btnLabel = document.getElementById("btn-label");  const PALETTE = {    background0x010206,    obsidian0x03050c,    deepIndigo0x080a1c,    cyan0x00f0ff,    violet0xa600ff,    magenta0xff007c,    amber0xff7c00,    silver0xd2e1ec  };  const DEFAULT_CAMERA = new THREE.Vector3(03.514.2);  const DEFAULT_TARGET = new THREE.Vector3(01.2, -0.2);  let scene, camera, renderer, controls, composer, bloomPass, finishingPass, clock, mixer;  let robot, runningAction, standingAction, activeAction;  let platformGroup, chamberGroup;  let tvCanvas, tvContext, tvTexture, tvScreen, tvLight, tvGlowFrame;  let techNormalMap, techRoughnessMap;  const holoPanels = [];  const mechanicalRings = [];  const traceUniforms = [];  const glowUniforms = [];  const screenUniforms = [];  const runwayUniforms = [];  const disposableTextures = [];  const sharedTimeUniform = {    value0  };  const sharedPulseUniform = {    value0  };  const tempColor = new THREE.Color();  let targetSpeedScale = 1.0;  let currentSpeedScale = 1.0;  init();  async function init() {    clock = new THREE.Clock();    createScene();    createRenderer();    createCamera();    createControls();    createEnvironment();    techNormalMap = generateProceduralTechNormalMap();    techRoughnessMap = generateProceduralTechRoughnessMap();    createLighting();    createBackgroundDome();    createChamberArchitecture();    createLayeredPlatform();    createVolumetricAccents();    createSmallSidePanels();    await loadRobot();    createPostProcessing();    window.addEventListener("resize", handleResize, {      passivetrue    });    window.addEventListener("beforeunload", disposeScene);    container.addEventListener("dblclick", resetView);    toggleBtn.addEventListener("click", toggleRobotAnimation);    setTimeout(() => {      loadingScreen.classList.add("hidden");    }, 500);    animate();  }  function createScene() {    scene = new THREE.Scene();    scene.background = new THREE.Color(PALETTE.background);    scene.fog = new THREE.FogExp2(PALETTE.background0.04);  }  function createRenderer() {    renderer = new THREE.WebGLRenderer({      antialiastrue,      alphafalse,      powerPreference"high-performance"    });    renderer.setSize(window.innerWidthwindow.innerHeight);    renderer.setPixelRatio(Math.min(window.devicePixelRatio2.0));    renderer.outputColorSpace = THREE.SRGBColorSpace;    renderer.toneMapping = THREE.ACESFilmicToneMapping;    renderer.toneMappingExposure = 1.05;    renderer.shadowMap.enabled = true;    renderer.shadowMap.type = THREE.PCFSoftShadowMap;    container.appendChild(renderer.domElement);  }  function createCamera() {    camera = new THREE.PerspectiveCamera(38window.innerWidth / window.innerHeight0.1150);    camera.position.copy(DEFAULT_CAMERA);  }  function createControls() {    controls = new OrbitControls(camera, renderer.domElement);    controls.enableDamping = true;    controls.dampingFactor = 0.04;    controls.autoRotate = true;    controls.autoRotateSpeed = 0.25;    controls.target.copy(DEFAULT_TARGET);    controls.minDistance = 4.0;    controls.maxDistance = 25.0;    controls.maxPolarAngle = Math.PI * 0.55;    controls.minPolarAngle = Math.PI * 0.15;    controls.enablePan = false;    controls.update();  }  function createEnvironment() {    const pmremGenerator = new THREE.PMREMGenerator(renderer);    const environment = pmremGenerator.fromScene(new RoomEnvironment(), 0.03).texture;    scene.environment = environment;    disposableTextures.push(environment);    pmremGenerator.dispose();  }  function createLighting() {    const ambient = new THREE.HemisphereLight(0x1a213a0x0102060.45);    scene.add(ambient);    const keyLight = new THREE.SpotLight(0xffffff4025Math.PI * 0.160.51.2);    keyLight.position.set(-4.07.54.5);    keyLight.target.position.set(01.00);    keyLight.castShadow = true;    keyLight.shadow.mapSize.set(20482048);    keyLight.shadow.bias = -0.0001;    scene.add(keyLight, keyLight.target);    const rimLight1 = new THREE.SpotLight(PALETTE.cyan2518Math.PI * 0.180.81.0);    rimLight1.position.set(4.54.0, -4.5);    rimLight1.target.position.set(01.00);    scene.add(rimLight1, rimLight1.target);    const rimLight2 = new THREE.SpotLight(PALETTE.magenta2218Math.PI * 0.180.81.0);    rimLight2.position.set(-4.54.0, -4.5);    rimLight2.target.position.set(01.00);    scene.add(rimLight2, rimLight2.target);    const warmFloorLight = new THREE.PointLight(PALETTE.amber2.08.01.8);    warmFloorLight.position.set(0, -0.22.5);    scene.add(warmFloorLight);    const reactorLight = new THREE.PointLight(PALETTE.cyan3.511.02.0);    reactorLight.position.set(0, -0.10);    reactorLight.userData.isReactorLight = true;    scene.add(reactorLight);  }  function createBackgroundDome() {    const geometry = new THREE.SphereGeometry(756432);    const material = new THREE.ShaderMaterial({      sideTHREE.BackSide,      depthWritefalse,      uniforms: {        uTime: sharedTimeUniform,        uTop: {          valuenew THREE.Color(0x040615)        },        uBottom: {          valuenew THREE.Color(PALETTE.background)        },        uGlow: {          valuenew THREE.Color(0x0e0624)        }      },      vertexShader`        varying vec3 vWorldPosition;        void main() {          vec4 wp = modelMatrix * vec4(position, 1.0);          vWorldPosition = wp.xyz;          gl_Position = projectionMatrix * viewMatrix * wp;        }      `,      fragmentShader`        uniform float uTime;        uniform vec3 uTop;        uniform vec3 uBottom;        uniform vec3 uGlow;        varying vec3 vWorldPosition;        float hash(vec2 p) {          return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);        }        void main() {          vec3 d = normalize(vWorldPosition);          float horizon = smoothstep(-0.4, 0.7, d.y);          float center = pow(max(0.0, 1.0 - length(d.xz * 1.5)), 3.0);          float grain = hash(gl_FragCoord.xy + uTime * 4.0) * 0.012;          vec3 col = mix(uBottom, uTop, horizon);          col += uGlow * center * 0.45;          col += vec3(grain);          gl_FragColor = vec4(col, 1.0);        }      `    });    scene.add(new THREE.Mesh(geometry, material));  }  function generateProceduralTechNormalMap() {    const canvas = document.createElement("canvas");    canvas.width = 1024;    canvas.height = 1024;    const ctx = canvas.getContext("2d");    ctx.fillStyle = "#8080ff";    ctx.fillRect(0010241024);    ctx.lineWidth = 1.5;    const size = 64;    for (let x = 0; x < 1024; x += size) {      for (let y = 0; y < 1024; y += size) {        ctx.strokeStyle = "rgba(100, 100, 255, 0.2)";        ctx.beginPath();        ctx.moveTo(x, y + size);        ctx.lineTo(x, y);        ctx.lineTo(x + size, y);        ctx.stroke();        ctx.strokeStyle = "rgba(140, 140, 255, 0.4)";        ctx.beginPath();        ctx.moveTo(x + size, y);        ctx.lineTo(x + size, y + size);        ctx.lineTo(x, y + size);        ctx.stroke();        if (hashCoords(x, y) > 0.6) {          ctx.fillStyle = "#8080bf";          ctx.fillRect(x + 8, y + 844);          ctx.fillRect(x + size - 12, y + size - 1244);        }      }    }    const texture = new THREE.CanvasTexture(canvas);    texture.wrapS = THREE.RepeatWrapping;    texture.wrapT = THREE.RepeatWrapping;    texture.repeat.set(33);    texture.anisotropy = 4;    disposableTextures.push(texture);    return texture;  }  function generateProceduralTechRoughnessMap() {    const canvas = document.createElement("canvas");    canvas.width = 1024;    canvas.height = 1024;    const ctx = canvas.getContext("2d");    ctx.fillStyle = "#4a4a4a";    ctx.fillRect(0010241024);    ctx.strokeStyle = "#8f8f8f";    ctx.lineWidth = 2;    for (let i = 0; i < 30; i++) {      const x = Math.floor(hashCoords(i, 1) * 1024);      ctx.strokeRect(x, 0241024);    }    const size = 128;    for (let x = 0; x < 1024; x += size) {      for (let y = 0; y < 1024; y += size) {        if (hashCoords(x, y) > 0.5) {          ctx.fillStyle = "#1e1e1e";          ctx.fillRect(x + 4, y + 4, size - 8, size - 8);        }      }    }    const texture = new THREE.CanvasTexture(canvas);    texture.wrapS = THREE.RepeatWrapping;    texture.wrapT = THREE.RepeatWrapping;    texture.repeat.set(33);    disposableTextures.push(texture);    return texture;  }  function createChamberArchitecture() {    chamberGroup = new THREE.Group();    scene.add(chamberGroup);    const floorMaterial = new THREE.MeshPhysicalMaterial({      color0x030510,      metalness0.9,      roughness0.45,      clearcoat0.8,      clearcoatRoughness0.3,      envMapIntensity0.8,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.40.4),      roughnessMap: techRoughnessMap    });    const floor = new THREE.Mesh(new THREE.CylinderGeometry(13.013.00.2120), floorMaterial);    floor.position.y = -0.85;    floor.receiveShadow = true;    chamberGroup.add(floor);    const wallMaterial = new THREE.MeshPhysicalMaterial({      color0x050812,      metalness0.85,      roughness0.3,      clearcoat0.4,      clearcoatRoughness0.25,      envMapIntensity0.9,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.50.5),      roughnessMap: techRoughnessMap    });    const backWall = new THREE.Mesh(new THREE.BoxGeometry(11.85.20.4), wallMaterial);    backWall.position.set(01.8, -7.8);    backWall.receiveShadow = true;    chamberGroup.add(backWall);    const panelMat = new THREE.MeshPhysicalMaterial({      color0x080c18,      metalness0.95,      roughness0.15,      clearcoat0.8,      clearcoatRoughness0.1,      envMapIntensity1.2,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.30.3)    });    for (let i = 0; i < 9; i++) {      const x = -5.25 + i * 1.31;      const panel = new THREE.Mesh(new THREE.BoxGeometry(0.044.80.12), panelMat);      panel.position.set(x, 1.8, -7.6);      panel.receiveShadow = true;      chamberGroup.add(panel);    }    for (let i = 0; i < 2; i++) {      const strip = new THREE.Mesh(        new THREE.PlaneGeometry(10.20.04),        createGlowMaterial(i === 0 ? PALETTE.cyan : PALETTE.magenta0.4, i * 0.3)      );      strip.position.set(0, i === 0 ? 4.3 : -0.4, -7.4);      chamberGroup.add(strip);      glowUniforms.push(strip.material.uniforms);    }    createTvWall();    createSideShelves();    createPylons();    createRunwayLines();  }  function createTvWall() {    const tvGroup = new THREE.Group();    tvGroup.position.set(02.15, -7.3);    chamberGroup.add(tvGroup);    tvCanvas = document.createElement("canvas");    tvCanvas.width = 1280;    tvCanvas.height = 560;    tvContext = tvCanvas.getContext("2d");    tvTexture = new THREE.CanvasTexture(tvCanvas);    tvTexture.colorSpace = THREE.SRGBColorSpace;    tvTexture.anisotropy = 8;    disposableTextures.push(tvTexture);    drawLowPolyShow(00);    tvTexture.needsUpdate = true;    const frameMaterial = new THREE.MeshPhysicalMaterial({      color0x03060c,      metalness0.95,      roughness0.15,      clearcoat1.0,      clearcoatRoughness0.05,      envMapIntensity1.5,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.30.3)    });    const recess = new THREE.Mesh(new THREE.BoxGeometry(7.93.70.2), new THREE.MeshStandardMaterial({      color0x010206    }));    recess.position.z = -0.15;    recess.receiveShadow = true;    tvGroup.add(recess);    const top = new THREE.Mesh(new THREE.BoxGeometry(7.40.20.25), frameMaterial);    top.position.set(01.550.05);    tvGroup.add(top);    const bottom = top.clone();    bottom.position.y = -1.55;    tvGroup.add(bottom);    const sideA = new THREE.Mesh(new THREE.BoxGeometry(0.23.10.25), frameMaterial);    sideA.position.set(-3.700.05);    tvGroup.add(sideA);    const sideB = sideA.clone();    sideB.position.x = 3.7;    tvGroup.add(sideB);    tvScreen = new THREE.Mesh(      new THREE.PlaneGeometry(7.02.8),      new THREE.MeshBasicMaterial({        map: tvTexture,        toneMappedfalse      })    );    tvScreen.position.z = 0.15;    tvGroup.add(tvScreen);    const screenGlass = new THREE.Mesh(      new THREE.PlaneGeometry(7.02.8),      new THREE.ShaderMaterial({        transparenttrue,        depthWritefalse,        sideTHREE.DoubleSide,        blendingTHREE.AdditiveBlending,        uniforms: {          uTime: sharedTimeUniform,          uPulse: sharedPulseUniform,          uColorA: {            valuenew THREE.Color(PALETTE.cyan)          },          uColorB: {            valuenew THREE.Color(PALETTE.magenta)          }        },        vertexShader`          varying vec2 vUv;          void main() {            vUv = uv;            gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);          }        `,        fragmentShader`          uniform float uTime;          uniform float uPulse;          uniform vec3 uColorA;          uniform vec3 uColorB;          varying vec2 vUv;          void main() {            vec2 p = vUv - 0.5;            float scan = smoothstep(0.96, 1.0, sin((vUv.y * 180.0 - uTime * 8.0) * 3.14159) * 0.5 + 0.5);            float shine = smoothstep(0.015, 0.0, abs(vUv.y - (0.8 - vUv.x * 0.15))) * smoothstep(0.05, 0.5, vUv.x) * 0.3;            float edge = 1.0 - smoothstep(0.44, 0.5, max(abs(p.x), abs(p.y)));            float alpha = scan * 0.04 + shine + edge * 0.03 + uPulse * 0.035;            vec3 col = mix(uColorA, uColorB, vUv.x * 0.6 + scan * 0.15);            gl_FragColor = vec4(col, alpha);          }        `      })    );    screenGlass.position.z = 0.155;    tvGroup.add(screenGlass);    screenUniforms.push(screenGlass.material.uniforms);    tvGlowFrame = new THREE.Mesh(      new THREE.PlaneGeometry(7.453.25),      new THREE.ShaderMaterial({        transparenttrue,        depthWritefalse,        sideTHREE.DoubleSide,        blendingTHREE.AdditiveBlending,        uniforms: {          uTime: sharedTimeUniform,          uPulse: sharedPulseUniform,          uColor: {            valuenew THREE.Color(PALETTE.cyan)          }        },        vertexShader`          varying vec2 vUv;          void main() {            vUv = uv;            gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);          }        `,        fragmentShader`          uniform float uTime;          uniform float uPulse;          uniform vec3 uColor;          varying vec2 vUv;          void main() {            vec2 p = abs(vUv - 0.5);            float border = smoothstep(0.015, 0.0, min(0.5 - p.x, 0.5 - p.y));            float cycle = smoothstep(0.04, 0.0, abs(fract(vUv.x + vUv.y - uTime * 0.15) - 0.5));            float alpha = border * (0.35 + cycle * 0.4 + uPulse * 0.45);            gl_FragColor = vec4(uColor * (0.7 + cycle * 0.5), alpha);          }        `      })    );    tvGlowFrame.position.z = 0.16;    tvGroup.add(tvGlowFrame);    screenUniforms.push(tvGlowFrame.material.uniforms);    const soundBar = new THREE.Mesh(new THREE.BoxGeometry(5.20.120.15), frameMaterial);    soundBar.position.set(0, -1.80.1);    soundBar.castShadow = true;    tvGroup.add(soundBar);    tvLight = new THREE.PointLight(PALETTE.violet2.59.01.8);    tvLight.position.set(001.2);    tvGroup.add(tvLight);  }  function createSideShelves() {    const shelfMat = new THREE.MeshPhysicalMaterial({      color0x040812,      metalness0.9,      roughness0.25,      clearcoat0.5,      clearcoatRoughness0.2,      envMapIntensity1.0,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.40.4)    });    const decorMat = new THREE.MeshPhysicalMaterial({      color0x16243a,      metalness0.8,      roughness0.2,      clearcoat0.8,      envMapIntensity1.1    });    [-11].forEach((side) => {      const unit = new THREE.Group();      unit.position.set(side * 5.151.45, -7.3);      chamberGroup.add(unit);      const wall = new THREE.Mesh(new THREE.BoxGeometry(1.33.30.2), shelfMat);      wall.position.z = -0.15;      wall.shadowBias = -0.001;      wall.receiveShadow = true;      unit.add(wall);      for (let i = 0; i < 4; i++) {        const shelf = new THREE.Mesh(new THREE.BoxGeometry(1.10.060.45), shelfMat);        shelf.position.set(0, -1.1 + i * 0.750.08);        shelf.castShadow = true;        shelf.receiveShadow = true;        unit.add(shelf);        const strip = new THREE.Mesh(          new THREE.PlaneGeometry(0.950.02),          createGlowMaterial(i % 2 === 0 ? PALETTE.amber : PALETTE.cyan0.35, i * 0.25)        );        strip.position.set(0, -1.04 + i * 0.750.31);        unit.add(strip);        glowUniforms.push(strip.material.uniforms);      }      for (let i = 0; i < 6; i++) {        const item = new THREE.Mesh(          i % 3 === 0 ? new THREE.IcosahedronGeometry(0.131) : new THREE.BoxGeometry(0.120.30.12),          decorMat.clone()        );        item.position.set(          -0.34 + (i % 3) * 0.34,          -0.85 + Math.floor(i / 3) * 1.5,          0.28        );        item.rotation.set(i * 0.45, i * 0.25, i * 0.15);        item.castShadow = true;        unit.add(item);      }    });  }  function createPylons() {    const pylonMaterial = new THREE.MeshPhysicalMaterial({      color0x060c16,      metalness0.95,      roughness0.2,      clearcoat0.7,      clearcoatRoughness0.2,      envMapIntensity1.1,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.30.3),      roughnessMap: techRoughnessMap    });    for (let i = 0; i < 8; i++) {      if (i === 6continue;      const angle = (i / 8) * Math.PI * 2;      const radius = 7.15;      const pylon = new THREE.Group();      pylon.position.set(Math.cos(angle) * radius, 0Math.sin(angle) * radius);      pylon.rotation.y = -angle + Math.PI * 0.5;      chamberGroup.add(pylon);      const shaft = new THREE.Mesh(new THREE.BoxGeometry(0.363.40.36), pylonMaterial);      shaft.position.y = 0.85;      shaft.castShadow = true;      shaft.receiveShadow = true;      pylon.add(shaft);      const base = new THREE.Mesh(new THREE.CylinderGeometry(0.480.60.524), pylonMaterial);      base.position.y = -0.78;      base.castShadow = true;      pylon.add(base);      const cap = new THREE.Mesh(new THREE.CylinderGeometry(0.440.360.4524), pylonMaterial);      cap.position.y = 2.65;      cap.castShadow = true;      pylon.add(cap);      const stripMaterial = createGlowMaterial(i % 2 === 0 ? PALETTE.cyan : PALETTE.violet0.45, i * 0.2);      const strip = new THREE.Mesh(new THREE.PlaneGeometry(0.082.2), stripMaterial);      strip.position.set(00.950.182);      pylon.add(strip);      glowUniforms.push(stripMaterial.uniforms);    }  }  function createRunwayLines() {    const runwayShaderMaterial = new THREE.ShaderMaterial({      transparenttrue,      depthWritefalse,      blendingTHREE.AdditiveBlending,      uniforms: {        uTime: sharedTimeUniform,        uPulse: sharedPulseUniform,        uSpeedScale: {          value1.0        },        uColor: {          valuenew THREE.Color(PALETTE.cyan)        }      },      vertexShader`        varying vec2 vUv;        void main() {          vUv = uv;          gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);        }      `,      fragmentShader`        uniform float uTime;        uniform float uPulse;        uniform float uSpeedScale;        uniform vec3 uColor;        varying vec2 vUv;        void main() {          float speed = 2.4 * uSpeedScale;          float flow = fract(vUv.y * 3.5 - uTime * speed);          float pulseWave = smoothstep(0.12, 0.0, abs(flow - 0.5));          float edgeFade = smoothstep(0.0, 0.15, vUv.y) * (1.0 - smoothstep(0.85, 1.0, vUv.y));          float alpha = (0.2 + pulseWave * 0.8) * edgeFade * (0.35 + uPulse * 0.65);          gl_FragColor = vec4(uColor * (0.75 + pulseWave * 0.5), alpha);        }      `    });    for (let i = 0; i < 5; i++) {      const mat = runwayShaderMaterial.clone();      runwayUniforms.push(mat.uniforms);      const lane = new THREE.Mesh(new THREE.PlaneGeometry(i === 2 ? 0.22 : 0.069.2), mat);      lane.rotation.x = -Math.PI / 2;      lane.position.set((i - 2) * 0.45, -0.745, -3.2);      chamberGroup.add(lane);    }  }  function createLayeredPlatform() {    platformGroup = new THREE.Group();    platformGroup.position.y = -0.58;    scene.add(platformGroup);    const darkMetal = new THREE.MeshPhysicalMaterial({      color0x050811,      metalness0.95,      roughness0.18,      clearcoat0.8,      clearcoatRoughness0.3,      envMapIntensity1.2,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.40.4),      roughnessMap: techRoughnessMap    });    const midMetal = new THREE.MeshPhysicalMaterial({      color0x0d1424,      metalness0.9,      roughness0.22,      clearcoat0.6,      clearcoatRoughness0.25,      envMapIntensity1.1,      normalMap: techNormalMap,      normalScalenew THREE.Vector2(0.30.3)    });    const base = new THREE.Mesh(new THREE.CylinderGeometry(5.25.50.3120), darkMetal);    base.position.y = -0.15;    base.receiveShadow = true;    platformGroup.add(base);    const topPlate = new THREE.Mesh(new THREE.CylinderGeometry(4.74.90.08120), midMetal);    topPlate.position.y = 0.04;    topPlate.receiveShadow = true;    platformGroup.add(topPlate);    const innerPlate = new THREE.Mesh(new THREE.CylinderGeometry(3.553.750.0796), darkMetal);    innerPlate.position.y = 0.11;    innerPlate.receiveShadow = true;    platformGroup.add(innerPlate);    const glassCore = new THREE.Mesh(      new THREE.CylinderGeometry(1.281.280.0696),      new THREE.MeshPhysicalMaterial({        colorPALETTE.cyan,        metalness0.05,        roughness0.02,        transmission0.85,        thickness0.25,        transparenttrue,        opacity0.4,        clearcoat1.0,        clearcoatRoughness0.02,        emissivenew THREE.Color(PALETTE.cyan),        emissiveIntensity0.15,        envMapIntensity1.5      })    );    glassCore.position.y = 0.22;    platformGroup.add(glassCore);    const ringConfigs = [{        r5.0,        tube0.035,        y0.08,        speed0.05,        color0x060c16      },      {        r4.25,        tube0.024,        y0.17,        speed: -0.04,        color0x111b2d      },      {        r3.3,        tube0.026,        y0.21,        speed0.07,        color0x060c15      },      {        r2.1,        tube0.018,        y0.25,        speed: -0.09,        color0x101e33      },      {        r1.55,        tube0.015,        y0.29,        speed0.12,        color0x082235      }    ];    ringConfigs.forEach((config, index) => {      const ring = new THREE.Mesh(        new THREE.TorusGeometry(config.r, config.tube12120),        new THREE.MeshPhysicalMaterial({          color: config.color,          metalness0.95,          roughness0.15,          clearcoat0.8,          clearcoatRoughness0.1,          envMapIntensity1.1,          normalMap: techNormalMap,          normalScalenew THREE.Vector2(0.20.2)        })      );      ring.rotation.x = Math.PI / 2;      ring.position.y = config.y;      ring.userData.rotationSpeed = config.speed;      ring.userData.phase = index * 0.72;      ring.receiveShadow = true;      mechanicalRings.push(ring);      platformGroup.add(ring);    });    createCircuitTraces();  }  function createCircuitTraces() {    const traceMaterialA = createTraceMaterial(PALETTE.cyan0.40.0);    const traceMaterialB = createTraceMaterial(PALETTE.magenta0.280.4);    for (let i = 0; i < 32; i++) {      const angle = (i / 32) * Math.PI * 2;      const startRadius = i % 4 === 0 ? 1.55 : 2.0 + (i % 3) * 0.3;      const endRadius = 4.2 - (i % 5) * 0.15;      const material = (i % 5 === 0 ? traceMaterialB : traceMaterialA).clone();      material.uniforms.uOffset.value = Math.random();      traceUniforms.push(material.uniforms);      platformGroup.add(createRadialTube(startRadius, endRadius, angle, 0.295, i % 4 === 0 ? 0.009 : 0.006, material));    }    for (let i = 0; i < 18; i++) {      const radius = THREE.MathUtils.randFloat(1.84.6);      const start = Math.random() * Math.PI * 2;      const length = THREE.MathUtils.randFloat(0.30.9);      const material = (i % 4 === 0 ? traceMaterialB : traceMaterialA).clone();      material.uniforms.uOffset.value = Math.random();      traceUniforms.push(material.uniforms);      platformGroup.add(createArcTube(radius, 0.308 + i * 0.001, start, length, 0.007, material));    }  }  function createRadialTube(startRadius, endRadius, angle, y, tubeRadius, material) {    const points = [];    const tangent = angle + Math.PI * 0.5;    const bend = THREE.MathUtils.randFloatSpread(0.15);    for (let i = 0; i <= 8; i++) {      const t = i / 8;      const radius = THREE.MathUtils.lerp(startRadius, endRadius, t);      const side = Math.sin(t * Math.PI) * bend;      const a = angle + side * 0.1;      points.push(new THREE.Vector3(        Math.cos(a) * radius + Math.cos(tangent) * side,        y,        Math.sin(a) * radius + Math.sin(tangent) * side      ));    }    const curve = new THREE.CatmullRomCurve3(points);    const geometry = new THREE.TubeGeometry(curve, 24, tubeRadius, 6false);    return new THREE.Mesh(geometry, material);  }  function createArcTube(radius, y, startAngle, arcLength, tubeRadius, material) {    const points = [];    const segments = Math.max(12Math.ceil(arcLength * 32));    for (let i = 0; i <= segments; i++) {      const t = i / segments;      const angle = startAngle + arcLength * t;      points.push(new THREE.Vector3(Math.cos(angle) * radius, y, Math.sin(angle) * radius));    }    const curve = new THREE.CatmullRomCurve3(points);    const geometry = new THREE.TubeGeometry(curve, segments, tubeRadius, 6, arcLength >= Math.PI * 1.99);    return new THREE.Mesh(geometry, material);  }  function createGlowMaterial(color, opacity, offset) {    return new THREE.ShaderMaterial({      transparenttrue,      depthWritefalse,      sideTHREE.DoubleSide,      blendingTHREE.AdditiveBlending,      uniforms: {        uTime: sharedTimeUniform,        uPulse: sharedPulseUniform,        uColor: {          valuenew THREE.Color(color)        },        uOpacity: {          value: opacity        },        uOffset: {          value: offset        }      },      vertexShader`        varying vec2 vUv;        void main() {          vUv = uv;          gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);        }      `,      fragmentShader`        uniform float uTime;        uniform float uPulse;        uniform float uOpacity;        uniform float uOffset;        uniform vec3 uColor;        varying vec2 vUv;        void main() {          float beam = smoothstep(0.48, 0.0, abs(vUv.x - 0.5));          float scan = smoothstep(0.92, 1.0, sin((vUv.y * 6.0 - uTime * 1.2 + uOffset * 4.0) * 3.14159) * 0.5 + 0.5);          float alpha = beam * (uOpacity + scan * 0.2) * (1.0 + uPulse * 0.85);          gl_FragColor = vec4(uColor * (0.8 + scan * 0.25 + uPulse * 0.3), alpha);        }      `    });  }  function createTraceMaterial(color, opacity, offset) {    const material = new THREE.ShaderMaterial({      transparenttrue,      depthWritefalse,      blendingTHREE.AdditiveBlending,      uniforms: {        uTime: sharedTimeUniform,        uPulse: sharedPulseUniform,        uSpeedScale: {          value1.0        },        uColor: {          valuenew THREE.Color(color)        },        uOpacity: {          value: opacity        },        uOffset: {          value: offset        }      },      vertexShader`        varying vec2 vUv;        void main() {          vUv = uv;          gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);        }      `,      fragmentShader`        uniform float uTime;        uniform float uPulse;        uniform float uSpeedScale;        uniform float uOpacity;        uniform float uOffset;        uniform vec3 uColor;        varying vec2 vUv;        void main() {          float head = fract(uTime * 0.12 * uSpeedScale + uOffset);          float d = abs(fract(vUv.x - head + 0.5) - 0.5);          float sweep = smoothstep(0.2, 0.0, d);          float micro = smoothstep(0.7, 1.0, sin(vUv.x * 35.0 + uTime * (3.5 * uSpeedScale) + uOffset * 6.28) * 0.5 + 0.5);          float alpha = uOpacity * (0.3 + sweep * 0.88 + micro * 0.15) * (1.0 + uPulse * 1.6);          vec3 col = uColor * (0.75 + sweep * 0.95 + uPulse * 0.5);          gl_FragColor = vec4(col, alpha);        }      `    });    traceUniforms.push(material.uniforms);    return material;  }  function createVolumetricAccents() {    const floorMist = new THREE.Mesh(      new THREE.CircleGeometry(7.5120),      new THREE.ShaderMaterial({        transparenttrue,        depthWritefalse,        blendingTHREE.AdditiveBlending,        uniforms: {          uTime: sharedTimeUniform,          uPulse: sharedPulseUniform,          uColorA: {            valuenew THREE.Color(0x0e1c3a)          },          uColorB: {            valuenew THREE.Color(0x3a064a)          }        },        vertexShader`          varying vec2 vUv;          void main() {            vUv = uv;            gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);          }        `,        fragmentShader`          uniform float uTime;          uniform float uPulse;          uniform vec3 uColorA;          uniform vec3 uColorB;          varying vec2 vUv;          float hash(vec2 p) {            p = fract(p * vec2(123.34, 456.21));            p += dot(p, p + 45.32);            return fract(p.x * p.y);          }          float noise(vec2 p) {            vec2 i = floor(p);            vec2 f = fract(p);            float a = hash(i);            float b = hash(i + vec2(1.0, 0.0));            float c = hash(i + vec2(0.0, 1.0));            float d = hash(i + vec2(1.0, 1.0));            vec2 u = f * f * (3.0 - 2.0 * f);            return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;          }          void main() {            vec2 centered = vUv - 0.5;            float r = length(centered) * 2.0;            float n1 = noise(vUv * 6.0 + vec2(uTime * 0.02, -uTime * 0.015));            float n2 = noise(vUv * 12.0 - vec2(uTime * 0.018, uTime * 0.01));            float ring = smoothstep(0.85, 0.15, r);            float hollow = smoothstep(0.05, 0.6, r);            float alpha = ring * hollow * (0.025 + n1 * 0.03 + n2 * 0.015) * (1.0 + uPulse * 0.5);            vec3 col = mix(uColorA, uColorB, n2 * 0.35 + uPulse * 0.1);            gl_FragColor = vec4(col, alpha);          }        `      })    );    floorMist.rotation.x = -Math.PI / 2;    floorMist.position.y = -0.34;    scene.add(floorMist);    const centralBeam = new THREE.Mesh(      new THREE.CylinderGeometry(0.71.94.1961true),      createBeamMaterial(PALETTE.cyan0.090)    );    centralBeam.position.y = 1.5;    scene.add(centralBeam);    glowUniforms.push(centralBeam.material.uniforms);  }  function createBeamMaterial(color, opacity, offset) {    return new THREE.ShaderMaterial({      transparenttrue,      depthWritefalse,      sideTHREE.DoubleSide,      blendingTHREE.AdditiveBlending,      uniforms: {        uTime: sharedTimeUniform,        uPulse: sharedPulseUniform,        uColor: {          valuenew THREE.Color(color)        },        uOpacity: {          value: opacity        },        uOffset: {          value: offset        }      },      vertexShader`        varying vec2 vUv;        varying vec3 vPosition;        void main() {          vUv = uv;          vPosition = position;          gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);        }      `,      fragmentShader`        uniform float uTime;        uniform float uPulse;        uniform float uOpacity;        uniform float uOffset;        uniform vec3 uColor;        varying vec2 vUv;        varying vec3 vPosition;        float hash(vec2 p) {          return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);        }        float noise(vec2 p) {          vec2 i = floor(p);          vec2 f = fract(p);          float a = hash(i);          float b = hash(i + vec2(1.0, 0.0));          float c = hash(i + vec2(0.0, 1.0));          float d = hash(i + vec2(1.0, 1.0));          vec2 u = f*f*(3.0-2.0*f);          return mix(a, b, u.x) + (c - a)*u.y*(1.0-u.x) + (d - b)*u.x*u.y;        }        void main() {          float safeY = clamp(vUv.y, 0.0001, 1.0);          float twistAngle = safeY * 12.5663 - uTime * 3.5 + uOffset * 6.28;          float twistOffset = sin(twistAngle) * 0.16 * (1.0 - safeY);          float thread1 = smoothstep(0.09, 0.001, abs(vUv.x - 0.5 - twistOffset + sin(vUv.y * 12.0 + uTime * 6.0) * 0.06));          float thread2 = smoothstep(0.07, 0.001, abs(vUv.x - 0.5 + twistOffset - cos(vUv.y * 18.0 - uTime * 4.5) * 0.05));          float thread3 = smoothstep(0.05, 0.001, abs(vUv.x - 0.5 + sin(vUv.y * 24.0 + uTime * 9.0) * 0.09));          float cylindricalGlow = smoothstep(1.0, 0.0, abs(vUv.x - 0.5) * 2.0);          float n = noise(vUv * vec2(12.0, 24.0) + vec2(0.0, -uTime * 4.5));          float fadeFactor = smoothstep(0.0, 0.18, safeY) * (1.0 - smoothstep(0.82, 1.0, safeY));          float intensity = (thread1 * 0.85 + thread2 * 0.75 + thread3 * 0.9 + cylindricalGlow * 0.3) * (0.55 + n * 0.45);          intensity *= (1.0 + uPulse * 1.6);          vec3 dynamicColor = mix(uColor, vec3(0.65, 0.25, 0.95), n * 0.55);          float finalAlpha = fadeFactor * intensity * uOpacity;          gl_FragColor = vec4(dynamicColor, finalAlpha);        }      `    });  }  function createSmallSidePanels() {    const radius = 5.5;    const height = 2.2;    const panelData = [{        title"SYSTEMS",        type"bars",        angleMath.PI * 0.25,        tintPALETTE.cyan      },      {        title"TELEMETRY",        type"wave",        angleMath.PI * 0.75,        tintPALETTE.violet      },      {        title"SIGNAL",        type"audio",        angleMath.PI * 1.25,        tintPALETTE.amber      },      {        title"NETWORK",        type"graph",        angleMath.PI * 1.75,        tintPALETTE.magenta      }    ];    panelData.forEach((data, index) => {      const group = new THREE.Group();      const x = Math.cos(data.angle) * radius;      const z = Math.sin(data.angle) * radius;      group.position.set(x, height, z);      group.lookAt(0, height, 0);      group.userData.isHoloPanel = true;      group.userData.floatPhase = index * 1.6;      group.userData.baseY = height;      const glassGeom = new THREE.PlaneGeometry(1.80.95);      const glassMat = new THREE.MeshPhysicalMaterial({        color: data.tint,        metalness0.1,        roughness0.15,        transmission0.95,        thickness0.25,        ior1.5,        clearcoat1.0,        clearcoatRoughness0.05,        envMapIntensity2.2,        sideTHREE.DoubleSide,        transparenttrue      });      const glassMesh = new THREE.Mesh(glassGeom, glassMat);      group.add(glassMesh);      const canvas = document.createElement("canvas");      canvas.width = 512;      canvas.height = 270;      const ctx = canvas.getContext("2d");      const texture = new THREE.CanvasTexture(canvas);      texture.colorSpace = THREE.SRGBColorSpace;      texture.anisotropy = 4;      disposableTextures.push(texture);      const textMat = new THREE.MeshBasicMaterial({        map: texture,        transparenttrue,        opacity0.95,        sideTHREE.DoubleSide,        depthWritefalse,        blendingTHREE.AdditiveBlending      });      const textMeshFront = new THREE.Mesh(glassGeom, textMat);      textMeshFront.position.z = 0.015;      group.add(textMeshFront);      const textMeshBack = new THREE.Mesh(glassGeom, textMat);      textMeshBack.position.z = -0.015;      group.add(textMeshBack);      scene.add(group);      holoPanels.push({        ctx,        canvas,        texture,        title: data.title,        type: data.type,        tint: data.tint,        historyArray(40).fill(0),        lastUpdate0      });    });  }  async function loadRobot() {    const loader = new GLTFLoader();    loadingProgress.textContent = "BOOTING INTELLECTUAL MATRIX 0%";    try {      const gltf = await loader.loadAsync(        "https://threejs.org/examples/models/gltf/RobotExpressive/RobotExpressive.glb",        (xhr) => {          const progress = xhr.total ?            Math.min(100Math.round((xhr.loaded / xhr.total) * 100)) :            Math.min(98Math.round(xhr.loaded / 42000));          loadingProgress.textContent = `LOADING QUANTUM MATRIX ${progress}%`;        }      );      robot = gltf.scene;      robot.name = "Sparky";      robot.scale.setScalar(0.9);      robot.position.set(0, -0.540);      robot.rotation.y = -0.08;      robot.traverse((child) => {        if (!child.isMeshreturn;        child.castShadow = true;        child.receiveShadow = true;        if (child.material) child.material = createRobotMaterial(child.material);      });      scene.add(robot);      mixer = new THREE.AnimationMixer(robot);      const runningClip = gltf.animations.find((clip) => clip.name === "Running" || /run/i.test(clip.name));      const standingClip = gltf.animations.find((clip) => clip.name === "Standing" || clip.name === "Idle" || /stand/i.test(clip.name));      if (runningClip) {        runningAction = mixer.clipAction(runningClip);        runningAction.setLoop(THREE.LoopRepeat);        runningAction.setEffectiveTimeScale(0.95);        runningAction.setEffectiveWeight(1.0);      }      if (standingClip) {        standingAction = mixer.clipAction(standingClip);        standingAction.setLoop(THREE.LoopRepeat);        standingAction.setEffectiveTimeScale(1.0);        standingAction.setEffectiveWeight(0.0);      }      if (runningAction) {        runningAction.play();        activeAction = runningAction;      } else if (standingAction) {        standingAction.play();        activeAction = standingAction;        targetSpeedScale = 0.15;      }    } catch (err) {      console.error("Failed to load Sparky Expressive Mesh:", err);      loadingProgress.textContent = "MATRIX ENGINE STALLED. RUNNING BACKUPS...";    }  }  function toggleRobotAnimation() {    if (!runningAction || !standingAction) return;    if (activeAction === runningAction) {      fadeToAction(standingAction, 0.4);      targetSpeedScale = 0.15;      btnIndicator.classList.add("standing");      btnLabel.textContent = "MODE: STAND ACTIVE";    } else {      fadeToAction(runningAction, 0.4);      targetSpeedScale = 1.0;      btnIndicator.classList.remove("standing");      btnLabel.textContent = "MODE: RUN ACTIVE";    }  }  function fadeToAction(nextAction, duration) {    const currentAction = activeAction;    activeAction = nextAction;    if (currentAction) {      currentAction.fadeOut(duration);    }    nextAction      .reset()      .setEffectiveTimeScale(nextAction === runningAction ? 0.95 : 1.0)      .setEffectiveWeight(1.0)      .fadeIn(duration)      .play();  }  function createRobotMaterial(sourceMaterial) {    const material = sourceMaterial.clone();    if (material.color) {      material.color.lerp(tempColor.setHex(PALETTE.silver), 0.32);      material.color.multiplyScalar(0.9);    }    if ("metalness" in material) material.metalness = Math.max(material.metalness || 00.65);    if ("roughness" in material) material.roughness = 0.28;    if ("envMapIntensity" in material) material.envMapIntensity = 1.2;    if (material.emissive) {      material.emissive = new THREE.Color(0x0a223a);      material.emissiveIntensity = 0.08;    }    material.onBeforeCompile = (shader) => {      shader.uniforms.uTime = sharedTimeUniform;      shader.uniforms.uActivationPulse = sharedPulseUniform;      shader.uniforms.uRimColor = {        valuenew THREE.Color(PALETTE.cyan)      };      shader.vertexShader = shader.vertexShader        .replace(          "#include <common>",          `            #include <common>            varying vec3 vRobotWorldPosition;            varying vec3 vRobotWorldNormal;          `        )        .replace(          "#include <worldpos_vertex>",          `            #include <worldpos_vertex>            vRobotWorldPosition = worldPosition.xyz;            vRobotWorldNormal = normalize(mat3(modelMatrix) * objectNormal);          `        );      shader.fragmentShader = shader.fragmentShader        .replace(          "#include <common>",          `            #include <common>            uniform float uTime;            uniform float uActivationPulse;            uniform vec3 uRimColor;            varying vec3 vRobotWorldPosition;            varying vec3 vRobotWorldNormal;          `        )        .replace(          "#include <emissivemap_fragment>",          `            #include <emissivemap_fragment>            vec3 viewDir = normalize(cameraPosition - vRobotWorldPosition);            float fresnel = pow(1.0 - clamp(dot(normalize(vRobotWorldNormal), viewDir), 0.0001, 1.0), 3.0);            float scan = smoothstep(0.98, 1.0, sin((vRobotWorldPosition.y * 14.0 - uTime * 0.9) * 3.1415) * 0.5 + 0.5);            totalEmissiveRadiance += uRimColor * (fresnel * (0.12 + uActivationPulse * 0.55) + scan * 0.022);          `        );    };    material.customProgramCacheKey = () => "sparky-enhanced-rim-material";    material.needsUpdate = true;    return material;  }  function drawLowPolyShow(time, pulse) {    if (!tvContext || !tvCanvas) return;    const ctx = tvContext;    const w = tvCanvas.width;    const h = tvCanvas.height;    const beat = Math.sin(time * 2.5) * 0.5 + 0.5;    const intenseFactor = 0.7 + beat * 0.3 + pulse * 0.25;    ctx.clearRect(00, w, h);    const bg = ctx.createLinearGradient(00, w, h);    bg.addColorStop(0"#060920");    bg.addColorStop(0.4"#241042");    bg.addColorStop(0.75"#80054c");    bg.addColorStop(1"#d64e11");    ctx.fillStyle = bg;    ctx.fillRect(00, w, h);    drawLowPolyMountains(ctx, w, h, time, 0.45"#180c40""#331665"858);    drawLowPolyMountains(ctx, w, h, time + 3.00.58"#0d133a""#4a1c6a"11511);    const gridY = h * 0.62;    ctx.fillStyle = "rgba(10, 5, 25, 0.95)";    ctx.fillRect(0, gridY, w, h - gridY);    ctx.strokeStyle = "rgba(0, 240, 255, 0.15)";    ctx.lineWidth = 1;    for (let i = -12; i <= 24; i++) {      ctx.beginPath();      ctx.moveTo(w * 0.5, gridY);      ctx.lineTo(w * 0.5 + (i - 6) * 110, h);      ctx.stroke();    }    const scroll = (time * 110) % 50;    for (let i = 0; i < 12; i++) {      const py = gridY + Math.pow(i / 121.8) * (h - gridY) + scroll * (i / 12);      if (py < h) {        ctx.strokeStyle = `rgba(255, 0, 124, ${0.08 + (i / 12) * 0.35})`;        ctx.lineWidth = 1.0 + (i / 12) * 2;        ctx.beginPath();        ctx.moveTo(0, py);        ctx.lineTo(w, py);        ctx.stroke();      }    }    drawStageLaser(ctx, w * 0.15, h * 0.05, w * (0.35 + Math.sin(time * 0.8) * 0.15), h * 0.8"rgba(0, 240, 255, 0.28)", time);    drawStageLaser(ctx, w * 0.85, h * 0.05, w * (0.65 - Math.cos(time * 0.7) * 0.15), h * 0.8"rgba(255, 0, 124, 0.25)", time);    drawStageLaser(ctx, w * 0.50, w * (0.5 + Math.sin(time * 1.5) * 0.2), h * 0.75"rgba(255, 215, 0, 0.2)", time);    drawLowPolyDrummer(ctx, w * 0.5, h * 0.650.8 + Math.sin(time * 2.8) * 0.02, time);    drawLowPolyGuitarist(ctx, w * 0.23, h * 0.741.02 + Math.sin(time * 2.4) * 0.02, time);    drawLowPolyKeyboardist(ctx, w * 0.77, h * 0.720.98 + Math.cos(time * 2.0) * 0.015, time);    drawLowPolySinger(ctx, w * 0.48, h * 0.761.12 + Math.sin(time * 2.2) * 0.02, time);    const scanY = (time * 65) % h;    const scanGradi = ctx.createLinearGradient(0, scanY - 300, scanY + 30);    scanGradi.addColorStop(0"rgba(0,240,255,0)");    scanGradi.addColorStop(0.5`rgba(0,240,255,${0.07 * intenseFactor})`);    scanGradi.addColorStop(1"rgba(0,240,255,0)");    ctx.fillStyle = scanGradi;    ctx.fillRect(0, scanY - 30, w, 60);    ctx.fillStyle = `rgba(255,255,255,${0.02 + pulse * 0.01})`;    for (let y = 0; y < h; y += 6) ctx.fillRect(0, y, w, 1);    if (pulse > 0.65 && Math.random() > 0.8) {      const sy = Math.random() * h;      const sh = 25 + Math.random() * 45;      const offset = (Math.random() - 0.5) * 35;      ctx.drawImage(tvCanvas, 0, sy, w, sh, offset, sy, w, sh);    }    const edge = ctx.createRadialGradient(w * 0.5, h * 0.5, h * 0.25, w * 0.5, h * 0.5, w * 0.65);    edge.addColorStop(0"rgba(0,0,0,0)");    edge.addColorStop(1"rgba(0,0,0,0.5)");    ctx.fillStyle = edge;    ctx.fillRect(00, w, h);    ctx.fillStyle = `rgba(0, 240, 255, ${0.45 + pulse * 0.25})`;    ctx.font = "800 16px monospace";    ctx.fillText("LOW-POLY TRANSMISSION //"4042);    ctx.fillStyle = "rgba(255, 0, 124, 0.6)";    ctx.fillText("BROADCAST: LIVE"4062);  }  function drawLowPolyMountains(ctx, w, h, time, yRatio, col1, col2, amp, count) {    const baseY = h * yRatio;    const step = w / count;    for (let i = -1; i <= count; i++) {      const x = i * step;      const peak = baseY - amp * (0.6 + ((i + count) % 5) * 0.15);      const dynamicSway = Math.sin(time * 0.5 + i) * 6;      poly(ctx, [        [x, baseY],        [x + step * 0.5, peak + dynamicSway],        [x + step * 0.5, baseY]      ], col1);      poly(ctx, [        [x + step * 0.5, peak + dynamicSway],        [x + step, baseY],        [x + step * 0.5, baseY]      ], col2);    }  }  function drawStageLaser(ctx, sx, sy, tx, ty, color, time) {    const width = 140 + Math.sin(time * 3.0) * 30;    const gradient = ctx.createLinearGradient(sx, sy, tx, ty);    gradient.addColorStop(0, color);    gradient.addColorStop(0.8"rgba(0, 0, 0, 0)");    ctx.fillStyle = gradient;    ctx.beginPath();    ctx.moveTo(sx - 12, sy);    ctx.lineTo(tx - width, ty);    ctx.lineTo(tx + width, ty);    ctx.lineTo(sx + 12, sy);    ctx.closePath();    ctx.fill();  }  function poly(ctx, points, color) {    ctx.fillStyle = color;    ctx.beginPath();    ctx.moveTo(points[0][0], points[0][1]);    for (let i = 1; i < points.length; i++) {      ctx.lineTo(points[i][0], points[i][1]);    }    ctx.closePath();    ctx.fill();  }  function shadedPoly(ctx, points, colorHex, normX, normY, lightX, lightY) {    const dot = normX * lightX + normY * lightY;    const shade = 0.5 + 0.5 * dot;    const color = new THREE.Color(colorHex);    color.multiplyScalar(0.45 + shade * 0.55);    ctx.fillStyle = `#${color.getHexString()}`;    ctx.beginPath();    ctx.moveTo(points[0][0], points[0][1]);    for (let i = 1; i < points.length; i++) ctx.lineTo(points[i][0], points[i][1]);    ctx.closePath();    ctx.fill();  }  function drawLowPolySinger(ctx, x, y, s, time) {    const t = time * 2.2;    const bob = Math.sin(t) * 6 * s;    const hand = Math.sin(t * 1.5) * 12 * s;    const head = {      x: x,      y: y - 120 * s + bob    };    const chest = {      x: x,      y: y - 85 * s + bob * 0.8    };    const lSh = {      x: x - 26 * s,      y: y - 80 * s + bob    };    const rSh = {      x: x + 26 * s,      y: y - 80 * s + bob    };    const pelvis = {      x: x,      y: y - 35 * s    };    const lx = 0,      ly = -1;    shadedPoly(ctx, [      [lSh.x, lSh.y],      [chest.x, chest.y],      [pelvis.x, pelvis.y]    ], "#1c2242", -0.7, -0.3, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [chest.x, chest.y],      [pelvis.x, pelvis.y]    ], "#2c3463"0.7, -0.3, lx, ly);    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x - 30 * s, y - 35 * s],      [pelvis.x, pelvis.y]    ], "#11142c", -0.90.1, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x + 30 * s, y - 35 * s],      [pelvis.x, pelvis.y]    ], "#1f254a"0.90.1, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 14 * s],      [head.x - 12 * s, head.y],      [head.x, head.y + 14 * s]    ], "#e09a75", -0.5, -0.5, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 14 * s],      [head.x + 12 * s, head.y],      [head.x, head.y + 14 * s]    ], "#f4b18c"0.5, -0.5, lx, ly);    shadedPoly(ctx, [      [head.x - 12 * s, head.y],      [head.x, head.y + 14 * s],      [head.x - 6 * s, head.y + 18 * s]    ], "#bd7b56", -0.60.6, lx, ly);    shadedPoly(ctx, [      [head.x + 12 * s, head.y],      [head.x, head.y + 14 * s],      [head.x + 6 * s, head.y + 18 * s]    ], "#cf8960"0.60.6, lx, ly);    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x - 55 * s, y - 40 * s + hand],      [x - 50 * s, y - 35 * s]    ], "#1c2242", -0.5, -0.5, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x + 45 * s, y - 90 * s],      [x + 50 * s, y - 85 * s]    ], "#2c3463"0.5, -0.5, lx, ly);    ctx.strokeStyle = "#ffffff";    ctx.lineWidth = 4 * s;    ctx.beginPath();    ctx.moveTo(x + 50 * s, y - 110 * s);    ctx.lineTo(x + 50 * s, y);    ctx.stroke();    poly(ctx, [      [x + 44 * s, y - 114 * s],      [x + 56 * s, y - 114 * s],      [x + 50 * s, y - 104 * s]    ], "#ff7c00");  }  function drawLowPolyGuitarist(ctx, x, y, s, time) {    const t = time * 2.6;    const bob = Math.sin(t) * 4 * s;    const strum = Math.sin(time * 11) * 8 * s;    const head = {      x: x,      y: y - 105 * s + bob    };    const lSh = {      x: x - 22 * s,      y: y - 72 * s + bob    };    const rSh = {      x: x + 22 * s,      y: y - 72 * s + bob    };    const pelvis = {      x: x,      y: y - 28 * s    };    const lx = 0,      ly = -1;    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x, y - 70 * s],      [pelvis.x, pelvis.y]    ], "#6a084c", -0.8, -0.3, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x, y - 70 * s],      [pelvis.x, pelvis.y]    ], "#9e1c73"0.8, -0.3, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 12 * s],      [head.x - 10 * s, head.y],      [head.x, head.y + 12 * s]    ], "#d68e65", -0.7, -0.7, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 12 * s],      [head.x + 10 * s, head.y],      [head.x, head.y + 12 * s]    ], "#ebb28c"0.7, -0.7, lx, ly);    ctx.save();    ctx.translate(x - 5 * s, y - 25 * s);    ctx.rotate(-0.25 + Math.sin(t) * 0.05);    shadedPoly(ctx, [      [-50 * s, -12 * s],      [30 * s, -24 * s],      [20 * s, 15 * s],      [-45 * s, 20 * s]    ], "#ff007c", -0.2, -0.9, lx, ly);    shadedPoly(ctx, [      [-45 * s, 20 * s],      [20 * s, 15 * s],      [028 * s]    ], "#a600ff"0.20.9, lx, ly);    ctx.strokeStyle = "#ffffff";    ctx.lineWidth = 4 * s;    ctx.beginPath();    ctx.moveTo(-10 * s, -5 * s);    ctx.lineTo(95 * s, -24 * s);    ctx.stroke();    ctx.restore();    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x - 52 * s, y - 40 * s],      [x - 44 * s, y - 35 * s]    ], "#6a084c", -0.7, -0.7, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x + 35 * s, y - 25 * s + strum],      [x + 42 * s, y - 20 * s]    ], "#9e1c73"0.70.7, lx, ly);  }  function drawLowPolyKeyboardist(ctx, x, y, s, time) {    const t = time * 2.0;    const bob = Math.sin(t) * 3 * s;    const head = {      x: x,      y: y - 108 * s + bob    };    const lSh = {      x: x - 24 * s,      y: y - 75 * s + bob    };    const rSh = {      x: x + 24 * s,      y: y - 75 * s + bob    };    const pelvis = {      x: x,      y: y - 30 * s    };    const lx = 0,      ly = -1;    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x, y - 73 * s],      [pelvis.x, pelvis.y]    ], "#04566c", -0.8, -0.2, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x, y - 73 * s],      [pelvis.x, pelvis.y]    ], "#0ba8bd"0.8, -0.2, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 12 * s],      [head.x - 10 * s, head.y],      [head.x, head.y + 12 * s]    ], "#bd8856", -0.7, -0.7, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 12 * s],      [head.x + 10 * s, head.y],      [head.x, head.y + 12 * s]    ], "#d69c65"0.7, -0.7, lx, ly);    const synthY = y - 15 * s;    poly(ctx, [      [x - 75 * s, synthY - 8 * s],      [x + 75 * s, synthY - 12 * s],      [x + 60 * s, synthY + 16 * s],      [x - 60 * s, synthY + 18 * s]    ], "rgba(0, 240, 255, 0.45)");    poly(ctx, [      [x - 60 * s, synthY + 18 * s],      [x + 60 * s, synthY + 16 * s],      [x + 45 * s, synthY + 28 * s],      [x - 45 * s, synthY + 30 * s]    ], "rgba(166, 0, 255, 0.55)");    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x - 45 * s, y - 10 * s],      [x - 38 * s, y - 5 * s]    ], "#04566c", -0.70.7, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x + 45 * s, y - 10 * s],      [x + 38 * s, y - 5 * s]    ], "#0ba8bd"0.70.7, lx, ly);  }  function drawLowPolyDrummer(ctx, x, y, s, time) {    const t = time * 2.8;    const beatLeft = Math.abs(Math.sin(t * 1.5)) * 35 * s;    const beatRight = Math.abs(Math.cos(t * 1.5)) * 35 * s;    const head = {      x: x,      y: y - 82 * s    };    const lSh = {      x: x - 20 * s,      y: y - 50 * s    };    const rSh = {      x: x + 20 * s,      y: y - 50 * s    };    const lx = 0,      ly = -1;    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x, y - 48 * s],      [x - 18 * s, y - 15 * s]    ], "#243a4e", -0.8, -0.2, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x, y - 48 * s],      [x + 18 * s, y - 15 * s]    ], "#365775"0.8, -0.2, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 10 * s],      [head.x - 9 * s, head.y],      [head.x, head.y + 10 * s]    ], "#c78660", -0.7, -0.7, lx, ly);    shadedPoly(ctx, [      [head.x, head.y - 10 * s],      [head.x + 9 * s, head.y],      [head.x, head.y + 10 * s]    ], "#d6956f"0.7, -0.7, lx, ly);    const bY = y + 10 * s;    poly(ctx, [      [x - 32 * s, bY - 18 * s],      [x + 32 * s, bY - 18 * s],      [x + 38 * s, bY + 18 * s],      [x - 38 * s, bY + 18 * s]    ], "#0d112d");    poly(ctx, [      [x - 38 * s, bY + 18 * s],      [x + 38 * s, bY + 18 * s],      [x, bY + 32 * s]    ], "#1a1f4a");    shadedPoly(ctx, [      [lSh.x, lSh.y],      [x - 55 * s, y - 35 * s - beatLeft],      [x - 48 * s, y - 30 * s - beatLeft]    ], "#243a4e", -0.70.7, lx, ly);    shadedPoly(ctx, [      [rSh.x, rSh.y],      [x + 55 * s, y - 35 * s - beatRight],      [x + 48 * s, y - 30 * s - beatRight]    ], "#365775"0.70.7, lx, ly);    ctx.strokeStyle = "#ffffff";    ctx.lineWidth = 2.5 * s;    ctx.beginPath();    ctx.moveTo(x - 55 * s, y - 35 * s - beatLeft);    ctx.lineTo(x - 85 * s, y - 50 * s - beatLeft);    ctx.moveTo(x + 55 * s, y - 35 * s - beatRight);    ctx.lineTo(x + 85 * s, y - 50 * s - beatRight);    ctx.stroke();  }  function createPostProcessing() {    composer = new EffectComposer(renderer);    composer.addPass(new RenderPass(scene, camera));    bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidthwindow.innerHeight), 0.320.450.8);    composer.addPass(bloomPass);    finishingPass = new ShaderPass({      uniforms: {        tDiffuse: {          valuenull        },        uTime: sharedTimeUniform,        uVignette: {          value0.42        },        uGrain: {          value0.012        }      },      vertexShader`        varying vec2 vUv;        void main() {          vUv = uv;          gl_Position = vec4(position.xy, 0.0, 1.0);        }      `,      fragmentShader`        uniform sampler2D tDiffuse;        uniform float uTime;        uniform float uVignette;        uniform float uGrain;        varying vec2 vUv;        float random(vec2 p) {          return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453123);        }        void main() {          vec4 base = texture2D(tDiffuse, vUv);          float dist = distance(vUv, vec2(0.5));          float vig = smoothstep(0.85, 0.2, dist);          float grain = random(vUv * vec2(1920.0, 1080.0) + uTime * 12.0) - 0.5;          vec3 col = base.rgb;          col *= mix(1.0 - uVignette, 1.0, vig);          col += grain * uGrain;          gl_FragColor = vec4(col, base.a);        }      `    });    composer.addPass(finishingPass);    composer.addPass(new OutputPass());  }  function animate() {    requestAnimationFrame(animate);    const delta = Math.min(clock.getDelta(), 0.03);    const time = clock.getElapsedTime();    const pulse = getActivationPulse(time);    sharedTimeUniform.value = time;    sharedPulseUniform.value = pulse;    currentSpeedScale = THREE.MathUtils.lerp(currentSpeedScale, targetSpeedScale, 0.05);    if (mixer) mixer.update(delta);    animatePlatform(delta, pulse);    animateChamber(delta, pulse);    animateRobot(time, pulse);    animateTv(time, pulse);    animateLighting(time, pulse);    animateCamera(time, pulse);    animatePanels(time, pulse);    if (bloomPass) {      bloomPass.strength = 0.3 + pulse * 0.12;      bloomPass.radius = 0.4 + pulse * 0.04;    }    controls.update();    composer.render();  }  function getActivationPulse(time) {    const period = 9.8;    const phase = (time % period) / period;    const primary = Math.exp(-Math.pow(phase / 0.052.0));    const secondary = Math.exp(-Math.pow((phase - 0.2) / 0.072.0)) * 0.35;    const tertiary = Math.exp(-Math.pow((phase - 0.35) / 0.092.0)) * 0.15;    return Math.min(1.0, primary + secondary + tertiary);  }  function animatePlatform(delta, pulse) {    mechanicalRings.forEach((ring) => {      ring.rotation.z += delta * ring.userData.rotationSpeed * (1.0 + pulse * 1.8) * currentSpeedScale;    });    traceUniforms.forEach((u) => {      if (u.uPulse) u.uPulse.value = pulse;      if (u.uSpeedScale) u.uSpeedScale.value = currentSpeedScale;    });    if (platformGroup) platformGroup.rotation.y += delta * 0.005 * currentSpeedScale;  }  function animateChamber(delta, pulse) {    glowUniforms.forEach((u) => {      if (u.uPulse) u.uPulse.value = pulse;    });    runwayUniforms.forEach((u) => {      if (u.uPulse) u.uPulse.value = pulse;      if (u.uSpeedScale) u.uSpeedScale.value = currentSpeedScale;    });    if (chamberGroup) chamberGroup.rotation.y += delta * 0.0005;  }  function animateRobot(time, pulse) {    if (!robot) return;    robot.position.y = -0.54 + Math.sin(time * 0.6) * 0.015 + pulse * 0.02;    robot.rotation.y = -0.08 + Math.sin(time * 0.2) * 0.03;  }  function animateTv(time, pulse) {    if (!tvTexture || !tvScreen) return;    drawLowPolyShow(time, pulse);    tvTexture.needsUpdate = true;    tvScreen.scale.set(1 + Math.sin(time * 0.6) * 0.002 + pulse * 0.0031 + Math.cos(time * 0.5) * 0.0015 + pulse * 0.0021);    if (tvLight) tvLight.intensity = 1.3 + Math.sin(time * 1.5) * 0.15 + pulse * 0.8;    screenUniforms.forEach((u) => {      if (u.uPulse) u.uPulse.value = pulse;    });  }  function animateLighting(time, pulse) {    scene.traverse((object) => {      if (object.userData.isReactorLight) {        object.intensity = (3.5 + Math.sin(time * 1.1) * 0.2 + pulse * 2.2) * (0.6 + 0.4 * currentSpeedScale);      }    });  }  function animateCamera(time, pulse) {    controls.autoRotateSpeed = (0.25 + pulse * 0.15) * (0.3 + 0.7 * currentSpeedScale);    const breathe = Math.sin(time * 0.15) * 0.05;    controls.target.y = THREE.MathUtils.lerp(controls.target.y1.2 + breathe + pulse * 0.030.02);  }  function animatePanels(time, pulse) {    scene.traverse((object) => {      if (object.userData && object.userData.isHoloPanel) {        object.position.y = object.userData.baseY + Math.sin(time * 1.4 + object.userData.floatPhase) * 0.14;        object.scale.setScalar(1.0 + pulse * 0.04);      }    });    holoPanels.forEach((panel, index) => {      const {        ctx,        canvas,        texture,        title,        type,        tint,        history      } = panel;      const color = new THREE.Color(tint);      const hex = `#${color.getHexString()}`;      const rgba = (a) => `rgba(${Math.round(color.r * 255)}${Math.round(color.g * 255)}${Math.round(color.b * 255)}${a})`;      ctx.clearRect(00, canvas.width, canvas.height);      ctx.strokeStyle = rgba(0.04);      ctx.lineWidth = 1;      for (let x = 0; x < canvas.width; x += 16) {        ctx.beginPath();        ctx.moveTo(x, 0);        ctx.lineTo(x, canvas.height);        ctx.stroke();      }      for (let y = 0; y < canvas.height; y += 16) {        ctx.beginPath();        ctx.moveTo(0, y);        ctx.lineTo(canvas.width, y);        ctx.stroke();      }      ctx.shadowColor = hex;      ctx.shadowBlur = 18;      ctx.strokeStyle = rgba(0.8);      ctx.lineWidth = 4;      roundRect(ctx, 88, canvas.width - 16, canvas.height - 1616);      ctx.stroke();      ctx.shadowBlur = 0;      ctx.strokeStyle = "rgba(255,255,255,0.15)";      ctx.lineWidth = 1;      roundRect(ctx, 1414, canvas.width - 28, canvas.height - 2812);      ctx.stroke();      ctx.fillStyle = hex;      ctx.fillRect(66142);      ctx.fillRect(66214);      ctx.fillRect(canvas.width - 206142);      ctx.fillRect(canvas.width - 86214);      ctx.fillStyle = "#ffffff";      ctx.font = "800 24px 'Courier New', monospace";      ctx.fillText(`[ ${title} ]`3648);      ctx.strokeStyle = rgba(0.4);      ctx.lineWidth = 2;      ctx.beginPath();      ctx.moveTo(3658);      ctx.lineTo(19058);      ctx.stroke();      ctx.fillStyle = rgba(0.65);      ctx.font = "600 12px monospace";      if (type === "bars") {        ctx.fillText(`THERMAL STABILITY: 98.42%`3685);        ctx.fillText(`SYS VOLTAGE: ${(340 + Math.sin(time) * 12).toFixed(2)}v`36105);        ctx.fillText(`PLASMA EFFICIENCY: 88.92%`36125);        ctx.fillText(`EMISSION POWER`36155);        for (let i = 0; i < 12; i++) {          const hVal = (Math.sin(time * 5 + i * 0.9) * 0.5 + 0.5) * 75 + 10;          ctx.fillStyle = i % 3 === 0 ? "#ff7c00" : rgba(0.85);          ctx.fillRect(240 + i * 18175 - hVal, 11, hVal);        }      } else if (type === "wave") {        ctx.fillText(`MODULATION: AUTO`3685);        ctx.fillText(`FREQUENCY: ${(125.4 + Math.cos(time * 1.5) * 1.2).toFixed(2)}MHz`36105);        ctx.fillText(`FLUX RANGE: ${(pulse).toFixed(4)}`36125);        ctx.beginPath();        ctx.strokeStyle = rgba(0.9);        ctx.lineWidth = 3;        for (let i = 0; i < 220; i++) {          const wx = 240 + i;          const wy = 120 + Math.sin(i * 0.08 - time * 6.0) * 45 * (Math.sin(time * 2.0) * 0.4 + 0.6);          if (i === 0) ctx.moveTo(wx, wy);          else ctx.lineTo(wx, wy);        }        ctx.stroke();      } else if (type === "audio") {        ctx.fillText(`CH: SUB-LINK_4`3685);        ctx.fillText(`NOISE RATIO: 1.04dB`36105);        ctx.fillText(`BANDWIDTH: EXCEL`36125);        ctx.fillText(`STATION FREQ`36155);        for (let i = 0; i < 15; i++) {          const hVal = Math.abs(Math.sin(time * 10 + i * 1.4)) * 70 + 5 + pulse * 15;          ctx.fillStyle = rgba(0.8);          ctx.fillRect(240 + i * 14175 - hVal, 8, hVal);        }      } else if (type === "graph") {        ctx.fillText(`SECURE LAYER: LEVEL_5`3685);        ctx.fillText(`CORE PING: ${Math.floor(14 + Math.random() * 5)}ms`36105);        ctx.fillText(`INTERFERENCE: STABLE`36125);        if (time - panel.lastUpdate > 0.08) {          panel.lastUpdate = time;          panel.history.shift();          panel.history.push(Math.random() * 80 + 10);        }        ctx.beginPath();        ctx.strokeStyle = rgba(0.95);        ctx.lineWidth = 2.5;        for (let i = 0; i < panel.history.length; i++) {          const gx = 240 + i * 5.8;          const gy = 175 - panel.history[i];          if (i === 0) ctx.moveTo(gx, gy);          else ctx.lineTo(gx, gy);        }        ctx.stroke();        ctx.lineTo(240 + (panel.history.length - 1) * 5.8175);        ctx.lineTo(240175);        ctx.fillStyle = rgba(0.12);        ctx.fill();      }      ctx.fillStyle = "rgba(255, 255, 255, 0.25)";      ctx.font = "800 9px monospace";      ctx.fillText(`LOC: [CH_SYS_${index}] // RX_OK // T_MOD: ${time.toFixed(1)}s`36245);      texture.needsUpdate = true;    });  }  function roundRect(ctx, x, y, width, height, radius) {    ctx.beginPath();    ctx.moveTo(x + radius, y);    ctx.lineTo(x + width - radius, y);    ctx.quadraticCurveTo(x + width, y, x + width, y + radius);    ctx.lineTo(x + width, y + height - radius);    ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);    ctx.lineTo(x + radius, y + height);    ctx.quadraticCurveTo(x, y + height, x, y + height - radius);    ctx.lineTo(x, y + radius);    ctx.quadraticCurveTo(x, y, x + radius, y);    ctx.closePath();  }  function handleResize() {    const w = window.innerWidth;    const h = window.innerHeight;    camera.aspect = w / h;    camera.updateProjectionMatrix();    renderer.setPixelRatio(Math.min(window.devicePixelRatio2.0));    renderer.setSize(w, h);    if (composer) composer.setSize(w, h);    if (bloomPass) bloomPass.setSize(w, h);  }  function resetView() {    camera.position.copy(DEFAULT_CAMERA);    controls.target.copy(DEFAULT_TARGET);    controls.autoRotate = true;    controls.update();  }  function disposeScene() {    window.removeEventListener("resize", handleResize);    container.removeEventListener("dblclick", resetView);    toggleBtn.removeEventListener("click", toggleRobotAnimation);    scene.traverse((object) => {      if (object.geometry) object.geometry.dispose();      if (object.material) {        const materials = Array.isArray(object.material) ? object.material : [object.material];        materials.forEach((material) => {          Object.keys(material).forEach((key) => {            const value = material[key];            if (value && value.isTexture) value.dispose();          });          material.dispose();        });      }    });    disposableTextures.forEach((t) => t.dispose());    if (composer) composer.dispose();    if (renderer) renderer.dispose();  }</script>

体验:

https://codepen.io/VoXelo/full/myOBjxJ

初识 Three.js 的奇妙世界
走进三维空间,与小编一起拥抱前端技术

--------------------------------

感谢您的阅读      

在看点赞 好文不断

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-27 17:41:59 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/673713.html
  2. 运行时间 : 0.114014s [ 吞吐率:8.77req/s ] 内存消耗:5,113.38kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=7d68a5aa0c05155209ac39a1736ada41
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000898s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001517s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000610s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000610s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001187s ]
  6. SELECT * FROM `set` [ RunTime:0.000570s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001256s ]
  8. SELECT * FROM `article` WHERE `id` = 673713 LIMIT 1 [ RunTime:0.001413s ]
  9. UPDATE `article` SET `lasttime` = 1779874919 WHERE `id` = 673713 [ RunTime:0.001703s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000601s ]
  11. SELECT * FROM `article` WHERE `id` < 673713 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001080s ]
  12. SELECT * FROM `article` WHERE `id` > 673713 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000905s ]
  13. SELECT * FROM `article` WHERE `id` < 673713 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001679s ]
  14. SELECT * FROM `article` WHERE `id` < 673713 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001913s ]
  15. SELECT * FROM `article` WHERE `id` < 673713 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001731s ]
0.117385s