| |
| |
| |
| |
| 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 /> |
| </> |
| ); |
| } |
|
|