More stuff + 3d

dependabot/npm_and_yarn/next-14.2.10
Elias Almqvist 11 months ago
parent 23d2289b64
commit 4206a2d417
No known key found for this signature in database
GPG Key ID: E31A99CE3E75A158
  1. 3
      package.json
  2. 172
      pnpm-lock.yaml
  3. 4
      src/app/[...dir]/layout.tsx
  4. 12
      src/app/page.tsx
  5. 82
      src/components/3d/curves/lorentz.ts
  6. 34
      src/components/3d/renderedsection.tsx
  7. 114
      src/components/3d/renderer.tsx
  8. 2
      src/components/layout/header.tsx
  9. 4
      src/components/layout/index.tsx

@ -18,8 +18,10 @@
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-separator": "^1.0.3",
"@radix-ui/react-slot": "^1.0.2",
"@react-three/fiber": "^8.16.1",
"@tailwindcss/typography": "^0.5.12",
"@types/mdx": "^2.0.12",
"@types/three": "^0.162.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.0",
"cmdk": "^1.0.0",
@ -32,6 +34,7 @@
"react-icons": "^5.0.1",
"tailwind-merge": "^2.2.2",
"tailwindcss-animate": "^1.0.7",
"three": "^0.163.0",
"zustand": "^4.5.2"
},
"devDependencies": {

@ -26,12 +26,18 @@ dependencies:
'@radix-ui/react-slot':
specifier: ^1.0.2
version: 1.0.2(@types/react@18.2.73)(react@18.2.0)
'@react-three/fiber':
specifier: ^8.16.1
version: 8.16.1(react-dom@18.2.0)(react@18.2.0)(three@0.163.0)
'@tailwindcss/typography':
specifier: ^0.5.12
version: 0.5.12(tailwindcss@3.4.3)
'@types/mdx':
specifier: ^2.0.12
version: 2.0.12
'@types/three':
specifier: ^0.162.0
version: 0.162.0
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
@ -68,6 +74,9 @@ dependencies:
tailwindcss-animate:
specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.3)
three:
specifier: ^0.163.0
version: 0.163.0
zustand:
specifier: ^4.5.2
version: 4.5.2(@types/react@18.2.73)(react@18.2.0)
@ -713,6 +722,47 @@ packages:
react: 18.2.0
dev: false
/@react-three/fiber@8.16.1(react-dom@18.2.0)(react@18.2.0)(three@0.163.0):
resolution: {integrity: sha512-Rgjn+xcR+6Do2Ic4b6RROIvCGs3RhoVJEamfmtMSfkgIRH3PeiPdqRxcfJlO9y6KDvYA5fIUGruz9h/sTeLlpw==}
peerDependencies:
expo: '>=43.0'
expo-asset: '>=8.4'
expo-file-system: '>=11.0'
expo-gl: '>=11.0'
react: '>=18.0'
react-dom: '>=18.0'
react-native: '>=0.64'
three: '>=0.133'
peerDependenciesMeta:
expo:
optional: true
expo-asset:
optional: true
expo-file-system:
optional: true
expo-gl:
optional: true
react-dom:
optional: true
react-native:
optional: true
dependencies:
'@babel/runtime': 7.24.1
'@types/react-reconciler': 0.26.7
'@types/webxr': 0.5.14
base64-js: 1.5.1
buffer: 6.0.3
its-fine: 1.1.3(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-reconciler: 0.27.0(react@18.2.0)
react-use-measure: 2.1.1(react-dom@18.2.0)(react@18.2.0)
scheduler: 0.21.0
suspend-react: 0.1.3(react@18.2.0)
three: 0.163.0
zustand: 3.7.2(react@18.2.0)
dev: false
/@rushstack/eslint-patch@1.10.1:
resolution: {integrity: sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==}
dev: true
@ -735,6 +785,10 @@ packages:
tailwindcss: 3.4.3
dev: false
/@tweenjs/tween.js@23.1.1:
resolution: {integrity: sha512-ZpboH7pCPPeyBWKf8c7TJswtCEQObFo3bOBYalm99NzZarATALYCo5OhbCa/n4RQyJyHfhkdx+hNrdL5ByFYDw==}
dev: false
/@types/acorn@4.0.6:
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
dependencies:
@ -812,12 +866,38 @@ packages:
dependencies:
'@types/react': 18.2.73
/@types/react-reconciler@0.26.7:
resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==}
dependencies:
'@types/react': 18.2.73
dev: false
/@types/react-reconciler@0.28.8:
resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==}
dependencies:
'@types/react': 18.2.73
dev: false
/@types/react@18.2.73:
resolution: {integrity: sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==}
dependencies:
'@types/prop-types': 15.7.12
csstype: 3.1.3
/@types/stats.js@0.17.3:
resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==}
dev: false
/@types/three@0.162.0:
resolution: {integrity: sha512-0j5yZcVukVIhrhSIC7+LmBPkkMoMuEJ1AfYBZfgNytdYqYREMuiyXWhYOMeZLBElTEAlJIZn7r2W3vqTIgjWlg==}
dependencies:
'@tweenjs/tween.js': 23.1.1
'@types/stats.js': 0.17.3
'@types/webxr': 0.5.14
fflate: 0.6.10
meshoptimizer: 0.18.1
dev: false
/@types/unist@2.0.10:
resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
dev: false
@ -826,6 +906,10 @@ packages:
resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
dev: false
/@types/webxr@0.5.14:
resolution: {integrity: sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==}
dev: false
/@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3):
resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
engines: {node: ^16.0.0 || >=18.0.0}
@ -1243,6 +1327,10 @@ packages:
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
/base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
dev: false
/binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
@ -1279,6 +1367,13 @@ packages:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
dev: false
/buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
dev: false
/busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
@ -1467,6 +1562,10 @@ packages:
is-data-view: 1.0.1
dev: true
/debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
dev: false
/debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
@ -2067,6 +2166,10 @@ packages:
dependencies:
reusify: 1.0.4
/fflate@0.6.10:
resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==}
dev: false
/file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
engines: {node: ^10.12.0 || >=12.0.0}
@ -2362,6 +2465,10 @@ packages:
'@types/hast': 3.0.4
dev: false
/ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: false
/ignore@5.3.1:
resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
engines: {node: '>= 4'}
@ -2633,6 +2740,15 @@ packages:
set-function-name: 2.0.2
dev: true
/its-fine@1.1.3(react@18.2.0):
resolution: {integrity: sha512-mncCA+yb6tuh5zK26cHqKlsSyxm4zdm4YgJpxycyx6p9fgxgK5PLu3iDVpKhzTn57Yrv3jk/r0aK0RFTT1OjFw==}
peerDependencies:
react: '>=18.0'
dependencies:
'@types/react-reconciler': 0.28.8
react: 18.2.0
dev: false
/jackspeak@2.3.6:
resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
engines: {node: '>=14'}
@ -2914,6 +3030,10 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
/meshoptimizer@0.18.1:
resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==}
dev: false
/micromark-core-commonmark@2.0.0:
resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==}
dependencies:
@ -3624,6 +3744,17 @@ packages:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
dev: true
/react-reconciler@0.27.0(react@18.2.0):
resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==}
engines: {node: '>=0.10.0'}
peerDependencies:
react: ^18.0.0
dependencies:
loose-envify: 1.4.0
react: 18.2.0
scheduler: 0.21.0
dev: false
/react-remove-scroll-bar@2.3.6(@types/react@18.2.73)(react@18.2.0):
resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
engines: {node: '>=10'}
@ -3676,6 +3807,17 @@ packages:
tslib: 2.6.2
dev: false
/react-use-measure@2.1.1(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==}
peerDependencies:
react: '>=16.13'
react-dom: '>=16.13'
dependencies:
debounce: 1.2.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/react@18.2.0:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'}
@ -3815,6 +3957,12 @@ packages:
is-regex: 1.1.4
dev: true
/scheduler@0.21.0:
resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==}
dependencies:
loose-envify: 1.4.0
dev: false
/scheduler@0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies:
@ -4080,6 +4228,14 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
/suspend-react@0.1.3(react@18.2.0):
resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==}
peerDependencies:
react: '>=17.0'
dependencies:
react: 18.2.0
dev: false
/tailwind-merge@2.2.2:
resolution: {integrity: sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==}
dependencies:
@ -4178,6 +4334,10 @@ packages:
dependencies:
any-promise: 1.3.0
/three@0.163.0:
resolution: {integrity: sha512-HlMgCb2TF/dTLRtknBnjUTsR8FsDqBY43itYop2+Zg822I+Kd0Ua2vs8CvfBVefXkBdNDrLMoRTGCIIpfCuDew==}
dev: false
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@ -4564,6 +4724,18 @@ packages:
engines: {node: '>=10'}
dev: true
/zustand@3.7.2(react@18.2.0):
resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==}
engines: {node: '>=12.7.0'}
peerDependencies:
react: '>=16.8'
peerDependenciesMeta:
react:
optional: true
dependencies:
react: 18.2.0
dev: false
/zustand@4.5.2(@types/react@18.2.73)(react@18.2.0):
resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==}
engines: {node: '>=12.7.0'}

@ -1,5 +1,7 @@
const Layout = ({ children }: { children: React.ReactNode }) => (
<div className="prose dark:prose-dark max-w-screen-lg">{children}</div>
<div className="prose dark:prose-dark max-w-screen-2xl w-full px-8">
{children}
</div>
);
export default Layout;

@ -1,9 +1,17 @@
import LorentzCurve from "@/components/3d/curves/lorentz";
import RenderedSection from "@/components/3d/renderedsection";
export default function Home() {
return (
<>
<section id="about" className="min-h-screen">
<RenderedSection
id="about"
curve={LorentzCurve}
className="relative h-full"
curveClassname="w-full h-full"
>
<h1 className="text-2xl">Hello, I am a </h1>
</section>
</RenderedSection>
</>
);
}

@ -0,0 +1,82 @@
"use client";
import * as THREE from "three";
import { CurveProps } from "../renderer";
const maxParticles = 10000;
const startScatter = 0.1;
const init = () => {
var arrayCurve = [];
var x = 0.01,
y = 0.01,
z = 0.01;
var a = 0.9;
var b = 3.4;
var f = 9.9;
var g = 1;
var t = 0.001;
for (var i = 0; i < maxParticles; i++) {
x = x - t * a * x + t * y * y - t * z * z + t * a * f;
y = y - t * y + t * x * y - t * b * x * z + t * g;
z = z - t * z + t * b * x * y + t * x * z;
arrayCurve.push(
new THREE.Vector3(x, y, z).multiplyScalar(
1 - startScatter / 2 + Math.random() * startScatter
)
);
}
return arrayCurve;
};
const update = (pc: THREE.Points<THREE.BufferGeometry>, group: THREE.Group) => {
//Varying the points on each frame
// step += 0.01;
var geometry = pc.geometry;
var a = 0.9 //+ Math.random() * .2;
var b = 3.4 //+ Math.random() * .1;
var f = 9.9 //+ Math.random() * .2;
var g = 1 //+ Math.random() * .1;
var t = 0.001;
var positions = geometry.attributes.position;
const numPoints = positions.array.length / 3;
for (let i = 0; i < numPoints; i++) {
let x = positions.getX(i),
y = positions.getY(i),
z = positions.getZ(i);
positions.setXYZ(
i,
x - t * a * x + t * y * y - t * z * z + t * a * f,
y - t * y + t * x * y - t * b * x * z + t * g,
z - t * z + t * b * x * y + t * x * z
);
}
positions.needsUpdate = true;
// TODO: remove
// group.rotation.x += 0.0005;
// group.rotation.y += 0.001;
// group.rotation.z -= 0.0005;
};
// INFO: Curve definition
const LorentzCurve: CurveProps = {
func: { init: init, update: update },
cam: {
pos: new THREE.Vector3(1, 0, 18).multiplyScalar(2),
rotation: new THREE.Vector3(0, 0, 180),
},
particles: {
max: maxParticles,
size: 0.1,
color: "#888",
darkcolor: "#444",
opacity: 0.4,
}, // 87a
};
export default LorentzCurve;

@ -0,0 +1,34 @@
"use client";
import React, { ReactNode, HTMLProps } from "react";
import Renderer, { CurveProps } from "@/components/3d/renderer";
import { cn } from "@/lib/utils";
const RenderedSection: React.FC<
HTMLProps<HTMLElement> & {
children?: ReactNode;
evenly?: boolean;
curve: CurveProps;
curveClassname?: string;
}
> = ({
children,
className,
curveClassname,
evenly = false,
curve,
...props
}) => {
return (
<div className="flex w-full flex-col items-center align-middle relative">
<div className={cn("absolute", curveClassname)}>
<Renderer {...curve} />
</div>
<section className={cn("relative", className)} {...props}>
{children}
</section>
</div>
);
};
export default RenderedSection;

@ -0,0 +1,114 @@
"use client";
import * as THREE from "three";
import React, { ComponentPropsWithRef, useEffect, useRef } from "react";
import { Canvas, useFrame, useThree } from "@react-three/fiber";
import { useTheme } from "next-themes";
export type FuncProps = {
init: () => THREE.Vector3[];
update: (pc: THREE.Points<THREE.BufferGeometry>, group: THREE.Group) => void;
};
export type ParticleProps = {
max?: number;
size?: number;
color?: string;
darkcolor?: string;
opacity?: number;
};
export type CameraProps = {
pos?: THREE.Vector3;
lookAt?: THREE.Vector3;
rotation?: THREE.Vector3;
};
export type CurveProps = {
func: FuncProps;
cam?: CameraProps;
particles?: ParticleProps;
};
export const FuncRenderer = ({
func,
cam = {
pos: new THREE.Vector3(0, 0, 0),
lookAt: new THREE.Vector3(0, 0, 0),
rotation: new THREE.Vector3(0, 0, 0),
},
particles = {
max: 10000,
size: 1,
color: "#000",
darkcolor: "#fff",
opacity: 1,
},
}: CurveProps) => {
const groupRef = useRef<THREE.Group>(null);
const { gl, camera } = useThree();
const { theme } = useTheme();
const isDarkMode = theme === "dark";
useEffect(() => {
if (cam.pos) camera.position.copy(cam.pos);
if (cam.lookAt) camera.lookAt(cam.lookAt);
if (cam.rotation) {
camera.rotateX(cam.rotation.x);
camera.rotateY(cam.rotation.y);
camera.rotateZ(cam.rotation.z);
}
// Initialize and set up the points on mount
if (groupRef.current) {
const arrayCurve = func.init();
const romCurve = new THREE.CatmullRomCurve3(arrayCurve);
const points = romCurve.getPoints(particles.max);
const geometry = new THREE.BufferGeometry().setFromPoints(points);
const pcMat = new THREE.PointsMaterial({
size: particles.size,
color: isDarkMode ? particles.darkcolor : particles.color,
opacity: particles.opacity,
transparent: true,
});
// pcMat.blending = THREE.AdditiveBlending;
const pc = new THREE.Points(geometry, pcMat);
groupRef.current.add(pc);
}
return () => {
// Clean up any resources if needed
};
}, [cam, func, particles, camera, isDarkMode]);
useFrame(() => {
gl.setPixelRatio(window.devicePixelRatio);
if (groupRef.current && groupRef.current.children.length > 0) {
const pc = groupRef.current.children[0] as THREE.Points;
if (pc.geometry) {
func.update(pc, groupRef.current);
}
}
});
return <group ref={groupRef} />;
};
const Renderer: React.FC<
ComponentPropsWithRef<typeof FuncRenderer> & {
cam?: CameraProps;
}
> = ({ cam = { pos: new THREE.Vector3(0, 0, 0) }, ...props }) => {
return (
<Canvas gl={{ alpha: true }} className="transform">
<pointLight position={[0, 0, 0]} color="#9BC995" />
<perspectiveCamera position={cam.pos} />
<FuncRenderer cam={cam} {...props} />
</Canvas>
);
};
export default Renderer;

@ -43,7 +43,7 @@ const Header = () => (
size="icon"
className="transition-opacity hover:bg-transparent hover:opacity-75"
>
<link.icon className="h-5 w-5" />
<link.icon className="h-4 w-4" />
</Button>
</Link>
</li>

@ -5,8 +5,8 @@ const Layout = ({ children }: { children: React.ReactNode }) => {
return (
<>
<Header />
<main className="w-full min-h-screen flex items-center justify-center">
<div className="max-w-screen-2xl w-full px-8">{children}</div>
<main className="w-full min-h-screen flex justify-center">
{children}
</main>
<NavBinds />
</>

Loading…
Cancel
Save