diff --git a/bun.lock b/bun.lock index 91afa2d..d087932 100644 --- a/bun.lock +++ b/bun.lock @@ -18,7 +18,6 @@ "react-dom": "19.2.7", "tempus": "1.0.0-dev.17", "three": "0.184.0", - "tunnel-rat": "^0.1.2", "zod": "^4.4.3", "zustand": "^5.0.14", }, diff --git a/lib/webgl/components/canvas/index.tsx b/lib/webgl/components/canvas/index.tsx index 5b9e419..c365c6c 100644 --- a/lib/webgl/components/canvas/index.tsx +++ b/lib/webgl/components/canvas/index.tsx @@ -1,23 +1,13 @@ 'use client' import dynamic from 'next/dynamic' -import { type ReactNode, useState } from 'react' -import tunnel from 'tunnel-rat' -import { CanvasContext } from '@/webgl/hooks/use-canvas' +// R3F is client-only; ssr:false keeps it out of the server render. const WebGLCanvas = dynamic( () => import('./webgl').then((m) => m.WebGLCanvas), { ssr: false } ) -export function Canvas({ children }: { children?: ReactNode }) { - const [WebGLTunnel] = useState(() => tunnel()) - const [DOMTunnel] = useState(() => tunnel()) - - return ( - - {children} - - - ) +export function Canvas() { + return } diff --git a/lib/webgl/components/canvas/webgl.tsx b/lib/webgl/components/canvas/webgl.tsx index ddeff50..1b8eaa1 100644 --- a/lib/webgl/components/canvas/webgl.tsx +++ b/lib/webgl/components/canvas/webgl.tsx @@ -3,15 +3,12 @@ import { OrthographicCamera } from '@react-three/drei' import { Canvas } from '@react-three/fiber' import { Suspense } from 'react' -import { useCanvas } from '@/webgl/hooks/use-canvas' import { Content } from '../content' import { PostProcessing } from '../postprocessing' import { RAF } from '../raf' import s from './webgl.module.css' export function WebGLCanvas() { - const { WebGLTunnel, DOMTunnel } = useCanvas() - return (
- -
) } diff --git a/lib/webgl/components/raf.tsx b/lib/webgl/components/raf.tsx index fe095a8..9cdcedd 100644 --- a/lib/webgl/components/raf.tsx +++ b/lib/webgl/components/raf.tsx @@ -4,12 +4,10 @@ import { useThree } from '@react-three/fiber' import { useFrame } from '@/hooks' /** Drives the manual render loop: tempus tick → R3F advance (frameloop="never"). */ -export function RAF({ render = true }: { render?: boolean }) { +export function RAF() { const advance = useThree((state) => state.advance) - useFrame((time) => { - if (render) advance(time / 1000) - }, 1) + useFrame((time) => advance(time / 1000), 1) return null } diff --git a/lib/webgl/hooks/use-canvas.ts b/lib/webgl/hooks/use-canvas.ts deleted file mode 100644 index bd73fa2..0000000 --- a/lib/webgl/hooks/use-canvas.ts +++ /dev/null @@ -1,21 +0,0 @@ -'use client' - -import { createContext, useContext } from 'react' -import type tunnel from 'tunnel-rat' - -type TunnelInstance = ReturnType - -export interface CanvasContextValue { - WebGLTunnel: TunnelInstance - DOMTunnel: TunnelInstance -} - -export const CanvasContext = createContext(null) - -export function useCanvas(): CanvasContextValue { - const context = useContext(CanvasContext) - if (!context) { - throw new Error('useCanvas must be used within a provider') - } - return context -} diff --git a/lib/webgl/utils/blend.ts b/lib/webgl/utils/blend.ts index ddd3292..9222e0e 100644 --- a/lib/webgl/utils/blend.ts +++ b/lib/webgl/utils/blend.ts @@ -1,15 +1,4 @@ export const BLEND = { - SOFT_LIGHT: `float blendSoftLight(float base, float blend) { - return (blend<0.5)?(2.0*base*blend+base*base*(1.0-2.0*blend)):(sqrt(base)*(2.0*blend-1.0)+2.0*base*(1.0-blend)); - } - - vec3 blendSoftLight(vec3 base, vec3 blend) { - return vec3(blendSoftLight(base.r,blend.r),blendSoftLight(base.g,blend.g),blendSoftLight(base.b,blend.b)); - } - - vec3 blendSoftLight(vec3 base, vec3 blend, float opacity) { - return (blendSoftLight(base, blend) * opacity + base * (1.0 - opacity)); - }`, NORMAL: `vec3 blendNormal(vec3 base, vec3 blend) { return blend; } diff --git a/lib/webgl/utils/glsl.ts b/lib/webgl/utils/glsl.ts deleted file mode 100644 index 4247a54..0000000 --- a/lib/webgl/utils/glsl.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const MAP_RANGE = ` -float mapRange(float min1, float max1,float value, float min2, float max2) { - return min2 + (value - min1) * (max2 - min2) / (max1 - min1); -} -` diff --git a/lib/webgl/utils/noise.ts b/lib/webgl/utils/noise.ts deleted file mode 100644 index 3ca4652..0000000 --- a/lib/webgl/utils/noise.ts +++ /dev/null @@ -1,153 +0,0 @@ -// https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83 - -export const NOISE = { - SIMPLEX_2D: ` - // Simplex 2D noise - // - vec3 permute(vec3 x) { return mod(((x*34.0)+1.0)*x, 289.0); } - - float snoise(vec2 v){ - const vec4 C = vec4(0.211324865405187, 0.366025403784439, - -0.577350269189626, 0.024390243902439); - vec2 i = floor(v + dot(v, C.yy) ); - vec2 x0 = v - i + dot(i, C.xx); - vec2 i1; - i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); - vec4 x12 = x0.xyxy + C.xxzz; - x12.xy -= i1; - i = mod(i, 289.0); - vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) - + i.x + vec3(0.0, i1.x, 1.0 )); - vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), - dot(x12.zw,x12.zw)), 0.0); - m = m*m ; - m = m*m ; - vec3 x = 2.0 * fract(p * C.www) - 1.0; - vec3 h = abs(x) - 0.5; - vec3 ox = floor(x + 0.5); - vec3 a0 = x - ox; - m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); - vec3 g; - g.x = a0.x * x0.x + h.x * x0.y; - g.yz = a0.yz * x12.xz + h.yz * x12.yw; - return 130.0 * dot(m, g); - } - `, - PERLIN_2D: ` - // Classic Perlin 2D Noise - // by Stefan Gustavson - // - vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} - vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} - vec2 fade(vec2 t) {return t*t*t*(t*(t*6.0-15.0)+10.0);} - - float cnoise(vec2 P){ - vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0); - vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0); - Pi = mod(Pi, 289.0); // To avoid truncation effects in permutation - vec4 ix = Pi.xzxz; - vec4 iy = Pi.yyww; - vec4 fx = Pf.xzxz; - vec4 fy = Pf.yyww; - vec4 i = permute(permute(ix) + iy); - vec4 gx = 2.0 * fract(i * 0.0243902439) - 1.0; // 1/41 = 0.024... - vec4 gy = abs(gx) - 0.5; - vec4 tx = floor(gx + 0.5); - gx = gx - tx; - vec2 g00 = vec2(gx.x,gy.x); - vec2 g10 = vec2(gx.y,gy.y); - vec2 g01 = vec2(gx.z,gy.z); - vec2 g11 = vec2(gx.w,gy.w); - vec4 norm = 1.79284291400159 - 0.85373472095314 * - vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)); - g00 *= norm.x; - g01 *= norm.y; - g10 *= norm.z; - g11 *= norm.w; - float n00 = dot(g00, vec2(fx.x, fy.x)); - float n10 = dot(g10, vec2(fx.y, fy.y)); - float n01 = dot(g01, vec2(fx.z, fy.z)); - float n11 = dot(g11, vec2(fx.w, fy.w)); - vec2 fade_xy = fade(Pf.xy); - vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x); - float n_xy = mix(n_x.x, n_x.y, fade_xy.y); - return 2.3 * n_xy; - } - `, - PERLIN_3D: ` - // Classic Perlin 3D Noise - // by Stefan Gustavson - // - vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} - vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} - vec3 fade(vec3 t) {return t*t*t*(t*(t*6.0-15.0)+10.0);} - - float cnoise(vec3 P){ - vec3 Pi0 = floor(P); // Integer part for indexing - vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1 - Pi0 = mod(Pi0, 289.0); - Pi1 = mod(Pi1, 289.0); - vec3 Pf0 = fract(P); // Fractional part for interpolation - vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0 - vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x); - vec4 iy = vec4(Pi0.yy, Pi1.yy); - vec4 iz0 = Pi0.zzzz; - vec4 iz1 = Pi1.zzzz; - - vec4 ixy = permute(permute(ix) + iy); - vec4 ixy0 = permute(ixy + iz0); - vec4 ixy1 = permute(ixy + iz1); - - vec4 gx0 = ixy0 / 7.0; - vec4 gy0 = fract(floor(gx0) / 7.0) - 0.5; - gx0 = fract(gx0); - vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0); - vec4 sz0 = step(gz0, vec4(0.0)); - gx0 -= sz0 * (step(0.0, gx0) - 0.5); - gy0 -= sz0 * (step(0.0, gy0) - 0.5); - - vec4 gx1 = ixy1 / 7.0; - vec4 gy1 = fract(floor(gx1) / 7.0) - 0.5; - gx1 = fract(gx1); - vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1); - vec4 sz1 = step(gz1, vec4(0.0)); - gx1 -= sz1 * (step(0.0, gx1) - 0.5); - gy1 -= sz1 * (step(0.0, gy1) - 0.5); - - vec3 g000 = vec3(gx0.x,gy0.x,gz0.x); - vec3 g100 = vec3(gx0.y,gy0.y,gz0.y); - vec3 g010 = vec3(gx0.z,gy0.z,gz0.z); - vec3 g110 = vec3(gx0.w,gy0.w,gz0.w); - vec3 g001 = vec3(gx1.x,gy1.x,gz1.x); - vec3 g101 = vec3(gx1.y,gy1.y,gz1.y); - vec3 g011 = vec3(gx1.z,gy1.z,gz1.z); - vec3 g111 = vec3(gx1.w,gy1.w,gz1.w); - - vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); - g000 *= norm0.x; - g010 *= norm0.y; - g100 *= norm0.z; - g110 *= norm0.w; - vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); - g001 *= norm1.x; - g011 *= norm1.y; - g101 *= norm1.z; - g111 *= norm1.w; - - float n000 = dot(g000, Pf0); - float n100 = dot(g100, vec3(Pf1.x, Pf0.yz)); - float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)); - float n110 = dot(g110, vec3(Pf1.xy, Pf0.z)); - float n001 = dot(g001, vec3(Pf0.xy, Pf1.z)); - float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)); - float n011 = dot(g011, vec3(Pf0.x, Pf1.yz)); - float n111 = dot(g111, Pf1); - - vec3 fade_xyz = fade(Pf0); - vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); - vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y); - float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); - return 2.2 * n_xyz; - } - `, -} diff --git a/package.json b/package.json index 973e599..f69c63b 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "react-dom": "19.2.7", "tempus": "1.0.0-dev.17", "three": "0.184.0", - "tunnel-rat": "^0.1.2", "zod": "^4.4.3", "zustand": "^5.0.14" },