{"version":3,"file":"Particle_wave_surface.CxPyW8My.mjs","names":["React.useRef","THREE.Scene","THREE.PerspectiveCamera","THREE.WebGLRenderer","p","THREE.BufferGeometry","THREE.BufferAttribute","THREE.DynamicDrawUsage","THREE.PointsMaterial","THREE.Color","THREE.Points"],"sources":["https:/framerusercontent.com/modules/wIypkcp9d1y7kuUxyP1U/zGv9OeT6keRolpEbEFaf/Particle_wave_surface.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import*as React from\"react\";import*as THREE from\"three\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Three.js Waves — Framer Code Component (CPU-optimized)\n * - precompute x/y waves per frame (amountX + amountY wywołań sin zamiast 2*amountX*amountY)\n * - position attribute z DynamicDrawUsage\n * - renderer: low-power, depth/stencil off, ograniczony pixelRatio\n * - pauza przy niewidocznej karcie\n */export default function Waves(props){const{separation,amountX,amountY,particleColor,speed,fov,cameraZ,cameraY,tilt,density}=props;const mountRef=React.useRef(null);const rendererRef=React.useRef(null);const sceneRef=React.useRef(null);const cameraRef=React.useRef(null);const pointsRef=React.useRef(null);const positionAttrRef=React.useRef(null);const frameRef=React.useRef(0);const countRef=React.useRef(0);const resizeObserverRef=React.useRef(null);const runningRef=React.useRef(true);// Build/rebuild scene when structural props change\nReact.useEffect(()=>{const mount=mountRef.current;if(!mount)return;cleanup();// Scene\nconst scene=new THREE.Scene;scene.background=null;// Camera\nconst camera=new THREE.PerspectiveCamera(fov,mount.clientWidth/mount.clientHeight,1,1e4);camera.position.y=cameraY;camera.position.z=cameraZ;camera.rotation.x=tilt*(Math.PI/180);// Renderer (oszczędny)\nconst renderer=new THREE.WebGLRenderer({antialias:true,alpha:true,powerPreference:\"low-power\",depth:false,stencil:false,preserveDrawingBuffer:false});renderer.setPixelRatio(Math.min(window.devicePixelRatio||1,1.75));renderer.setSize(mount.clientWidth,mount.clientHeight);mount.appendChild(renderer.domElement);// Geometry (grid of points)\nconst total=amountX*amountY;const positions=new Float32Array(total*3);let p=0;for(let ix=0;ix<amountX;ix++){for(let iy=0;iy<amountY;iy++){const x=ix*separation-amountX*separation/2;const y=0;const z=iy*separation-amountY*separation+separation*.33;positions[p++]=x;positions[p++]=y;positions[p++]=z;}}const geometry=new THREE.BufferGeometry;const positionAttr=new THREE.BufferAttribute(positions,3);positionAttr.setUsage(THREE.DynamicDrawUsage)// hint dla drivera\n;geometry.setAttribute(\"position\",positionAttr);const material=new THREE.PointsMaterial({color:new THREE.Color(particleColor),size:density,sizeAttenuation:true});const points=new THREE.Points(geometry,material);scene.add(points);// Save refs\nrendererRef.current=renderer;sceneRef.current=scene;cameraRef.current=camera;pointsRef.current=points;positionAttrRef.current=positionAttr;runningRef.current=true;// Resize (ResizeObserver)\nconst ro=new ResizeObserver(()=>{if(!mount||!rendererRef.current||!cameraRef.current)return;const{clientWidth,clientHeight}=mount;rendererRef.current.setSize(clientWidth,clientHeight);cameraRef.current.aspect=clientWidth/clientHeight;cameraRef.current.updateProjectionMatrix();});ro.observe(mount);resizeObserverRef.current=ro;// Visibility — pauza, gdy karta ukryta\nconst onVisibility=()=>{const vis=document.visibilityState!==\"hidden\";runningRef.current=vis;if(vis){// wznowienie pętli\nframeRef.current=requestAnimationFrame(loop);}else if(frameRef.current){cancelAnimationFrame(frameRef.current);}};document.addEventListener(\"visibilitychange\",onVisibility);// Kick off loop\nframeRef.current=requestAnimationFrame(loop);return()=>{document.removeEventListener(\"visibilitychange\",onVisibility);cleanup();};// eslint-disable-next-line react-hooks/exhaustive-deps\n},[separation,amountX,amountY,particleColor,fov,cameraZ,cameraY,tilt,density]);// Render loop (z precomputem sinusa)\nconst loop=()=>{if(!runningRef.current)return;const renderer=rendererRef.current;const scene=sceneRef.current;const camera=cameraRef.current;const points=pointsRef.current;const positionAttr=positionAttrRef.current;if(!renderer||!scene||!camera||!points||!positionAttr)return;// Precompute sinusy tylko amountX + amountY razy\nconst xWave=new Float32Array(amountX);const yWave=new Float32Array(amountY);const t=countRef.current;// 0.5 i 20 — zachowuję Twoje stałe; możesz je też wystawić jako propsy\nfor(let ix=0;ix<amountX;ix++){xWave[ix]=Math.sin((ix+t)*.5)*20;}for(let iy=0;iy<amountY;iy++){yWave[iy]=Math.sin((iy+t)*.5)*20;}const pos=positionAttr.array;let i=0// offset co 3 wartości\n;for(let ix=0;ix<amountX;ix++){const xVal=xWave[ix];for(let iy=0;iy<amountY;iy++){pos[i+1]=xVal+yWave[iy]// Y komponent\n;i+=3;}}positionAttr.needsUpdate=true;renderer.render(scene,camera);countRef.current+=speed;frameRef.current=requestAnimationFrame(loop);};// Dispose everything on unmount/prop change\nfunction cleanup(){if(frameRef.current)cancelAnimationFrame(frameRef.current);if(resizeObserverRef.current&&mountRef.current){try{resizeObserverRef.current.disconnect();}catch{}resizeObserverRef.current=null;}if(pointsRef.current){const geom=pointsRef.current.geometry;const mat=pointsRef.current.material;if(geom)geom.dispose();if(mat&&typeof mat.dispose===\"function\")mat.dispose();if(sceneRef.current)sceneRef.current.remove(pointsRef.current);pointsRef.current=null;}positionAttrRef.current=null;if(rendererRef.current){const canvas=rendererRef.current.domElement;rendererRef.current.dispose();if(canvas&&canvas.parentNode)canvas.parentNode.removeChild(canvas);rendererRef.current=null;}sceneRef.current=null;cameraRef.current=null;}// Transparent background style\nreturn /*#__PURE__*/_jsx(\"div\",{ref:mountRef,style:{width:\"100%\",height:\"100%\",display:\"block\",background:\"transparent\"}});}// Framer property controls (bez zmian)\naddPropertyControls(Waves,{separation:{type:ControlType.Number,title:\"Separation\",min:5,max:200,step:1,defaultValue:30},amountX:{type:ControlType.Number,title:\"Amount X\",min:10,max:300,step:1,defaultValue:110},amountY:{type:ControlType.Number,title:\"Amount Y\",min:5,max:200,step:1,defaultValue:35},density:{type:ControlType.Number,title:\"Point Size\",min:.5,max:8,step:.5,defaultValue:2.5},speed:{type:ControlType.Number,title:\"Speed\",min:.005,max:.5,step:.005,defaultValue:.05},particleColor:{type:ControlType.Color,title:\"Color\",defaultValue:\"#ffffff\"},fov:{type:ControlType.Number,title:\"FOV\",min:10,max:170,step:1,defaultValue:120},cameraZ:{type:ControlType.Number,title:\"Camera Z\",min:50,max:2e3,step:1,defaultValue:300},cameraY:{type:ControlType.Number,title:\"Camera Y\",min:-500,max:500,step:1,defaultValue:150},tilt:{type:ControlType.Number,title:\"Tilt\\xb0\",min:-90,max:90,step:1,defaultValue:20}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Waves\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Particle_wave_surface.map"],"mappings":"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"}