|
|
|
|
|
|
|
|
|
import {useEffect, useState} from 'react'; |
|
import {Object3DNode, extend} from '@react-three/fiber'; |
|
import ThreeMeshUI from 'three-mesh-ui'; |
|
|
|
import {} from '@react-three/xr'; |
|
import {Sparkles, Shadow} from '@react-three/drei'; |
|
|
|
|
|
import {FontLoader} from 'three/examples/jsm/loaders/FontLoader.js'; |
|
import {TextGeometry} from 'three/examples/jsm/geometries/TextGeometry.js'; |
|
import ThreeMeshUIText from './ThreeMeshUIText'; |
|
import {ContactShadows, BakeShadows} from '@react-three/drei'; |
|
|
|
extend({TextGeometry}); |
|
extend(ThreeMeshUI); |
|
|
|
declare module '@react-three/fiber' { |
|
interface ThreeElements { |
|
textGeometry: Object3DNode<TextGeometry, typeof TextGeometry>; |
|
} |
|
} |
|
|
|
|
|
export function TitleMesh() { |
|
const font = new FontLoader().parse(); |
|
console.log('font', font); |
|
const [text, setText] = useState('Text'); |
|
|
|
useEffect(() => { |
|
setTimeout(() => { |
|
setText(text + ' more '); |
|
console.log('adding more tex..', text); |
|
}, 1000); |
|
}, [text]); |
|
|
|
return ( |
|
<mesh> |
|
<textGeometry args={[text, {font, size: 5, height: 1}]} /> |
|
<meshPhysicalMaterial attach={'material'} color={'white'} /> |
|
</mesh> |
|
); |
|
} |
|
|
|
export function Sphere({ |
|
size = 1, |
|
amount = 50, |
|
color = 'white', |
|
emissive, |
|
...props |
|
}) { |
|
return ( |
|
<mesh {...props}> |
|
<sphereGeometry args={[size, 64, 64]} /> |
|
<meshPhysicalMaterial |
|
roughness={0} |
|
color={color} |
|
emissive={emissive || color} |
|
envMapIntensity={0.2} |
|
/> |
|
<Sparkles count={amount} scale={size * 2} size={6} speed={0.4} /> |
|
<Shadow |
|
rotation={[-Math.PI / 2, 0, 0]} |
|
scale={size} |
|
position={[0, -size, 0]} |
|
color={emissive} |
|
opacity={0.5} |
|
/> |
|
</mesh> |
|
); |
|
} |
|
|
|
export function Title({accentColor}) { |
|
return ( |
|
<block |
|
args={[ |
|
{ |
|
width: 1, |
|
height: 0.25, |
|
backgroundOpacity: 0, |
|
justifyContent: 'center', |
|
}, |
|
]}> |
|
<ThreeMeshUIText content={'Hello '} /> |
|
<ThreeMeshUIText content={'world!'} args={[{fontColor: accentColor}]} /> |
|
</block> |
|
); |
|
} |
|
|
|
export function RandomComponents() { |
|
return ( |
|
<> |
|
<color args={['#eee']} attach={'background'} /> |
|
<Sphere |
|
color="white" |
|
amount={50} |
|
emissive="green" |
|
glow="lightgreen" |
|
position={[1, 1, -1]} |
|
/> |
|
<Sphere |
|
color="white" |
|
amount={30} |
|
emissive="purple" |
|
glow="#ff90f0" |
|
size={0.5} |
|
position={[-1.5, 0.5, -2]} |
|
/> |
|
<Sphere |
|
color="lightpink" |
|
amount={20} |
|
emissive="orange" |
|
glow="#ff9f50" |
|
size={0.25} |
|
position={[-1, 0.25, 1]} |
|
/> |
|
<ContactShadows |
|
renderOrder={2} |
|
color="black" |
|
resolution={1024} |
|
frames={1} |
|
scale={10} |
|
blur={1.5} |
|
opacity={0.65} |
|
far={0.5} |
|
/> |
|
<BakeShadows /> |
|
</> |
|
); |
|
} |
|
|