From 20c572ad6395560cd7d0f4df1e32111190c8522e Mon Sep 17 00:00:00 2001 From: David Young Date: Mon, 19 Feb 2024 14:46:54 -0800 Subject: [PATCH] Adds Treadmill Visual (#33) * Adds WIP treadmill visual * Updates for speed fxn * Resolve errors * Bump action versions * Bugfix --- .github/workflows/pr_staging_deploy.yml | 4 +- .github/workflows/pr_staging_teardown.yml | 2 +- .github/workflows/publish.yml | 2 +- app/package.json | 1 + app/pnpm-lock.yaml | 3 + app/src/components/canvas/AutoOrbitCamera.tsx | 28 +++- app/src/components/controls/dock.tsx | 2 +- app/src/components/controls/main.tsx | 4 +- app/src/components/controls/mode/waveform.tsx | 1 + .../controls/visualSettingsSheet.tsx | 16 ++- app/src/components/controls/visualsDock.tsx | 21 +-- app/src/components/visualizers/common.ts | 26 ++-- app/src/components/visualizers/visual.tsx | 26 ++++ .../visualizers/visualizerAudio.tsx | 23 +-- .../visualizers/visualizerNoise.tsx | 20 +-- .../visualizers/visualizerWaveform.tsx | 18 +-- app/src/components/visualizers/walk/horse.png | Bin 0 -> 181808 bytes app/src/components/visualizers/walk/horse.tsx | 89 ++++++++++++ .../components/visualizers/walk/reactive.tsx | 15 ++ .../components/visualizers/walk/treadmill.tsx | 132 ++++++++++++++++++ app/src/context/visual.tsx | 3 +- app/src/hooks/useVisualComponent.ts | 14 ++ app/vite.config.ts | 1 + 23 files changed, 362 insertions(+), 89 deletions(-) create mode 100644 app/src/components/visualizers/visual.tsx create mode 100644 app/src/components/visualizers/walk/horse.png create mode 100644 app/src/components/visualizers/walk/horse.tsx create mode 100644 app/src/components/visualizers/walk/reactive.tsx create mode 100644 app/src/components/visualizers/walk/treadmill.tsx create mode 100644 app/src/hooks/useVisualComponent.ts diff --git a/.github/workflows/pr_staging_deploy.yml b/.github/workflows/pr_staging_deploy.yml index fa2a32c6..88934304 100644 --- a/.github/workflows/pr_staging_deploy.yml +++ b/.github/workflows/pr_staging_deploy.yml @@ -31,7 +31,7 @@ jobs: git config --global user.name github-actions git config --global user.email github-actions@github.com - name: Checkout Repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: path: "pr-build" - uses: pnpm/action-setup@v2 @@ -45,7 +45,7 @@ jobs: env: CI: "" - name: Checkout temporary deployment target repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: dcyoung/${{ env.PR_REPO_NAME }} fetch-depth: 0 diff --git a/.github/workflows/pr_staging_teardown.yml b/.github/workflows/pr_staging_teardown.yml index a68db189..30a71639 100644 --- a/.github/workflows/pr_staging_teardown.yml +++ b/.github/workflows/pr_staging_teardown.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Delete repository for temporary deployment uses: dcyoung/ga-delete-git-repo@v1.0.0 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 44bffe27..d007c414 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout 🛎️ - uses: actions/checkout@v3 + uses: actions/checkout@v4 - uses: pnpm/action-setup@v2 with: version: 8 diff --git a/app/package.json b/app/package.json index 7975bb92..854720d8 100644 --- a/app/package.json +++ b/app/package.json @@ -39,6 +39,7 @@ "tailwind-merge": "^1.14.0", "tailwindcss-animate": "^1.0.6", "three": "^0.161.0", + "three-stdlib": "^2.29.4", "zod": "^3.22.4", "zod-fetch": "^0.1.1", "zustand": "^4.5.0" diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index 4ba66b0c..0a99d966 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -80,6 +80,9 @@ dependencies: three: specifier: ^0.161.0 version: 0.161.0 + three-stdlib: + specifier: ^2.29.4 + version: 2.29.4(three@0.161.0) zod: specifier: ^3.22.4 version: 3.22.4 diff --git a/app/src/components/canvas/AutoOrbitCamera.tsx b/app/src/components/canvas/AutoOrbitCamera.tsx index de967c55..e5764327 100644 --- a/app/src/components/canvas/AutoOrbitCamera.tsx +++ b/app/src/components/canvas/AutoOrbitCamera.tsx @@ -2,6 +2,8 @@ import { useVisualContext } from "@/context/visual"; import { useFrame, useThree } from "@react-three/fiber"; import { Spherical, type Vector3 } from "three"; +import { VISUAL } from "../visualizers/common"; + const setFromSphericalZUp = (vec: Vector3, s: Spherical) => { const sinPhiRadius = Math.sin(s.phi) * s.radius; vec.x = sinPhiRadius * Math.sin(s.theta); @@ -16,7 +18,7 @@ const useSphericalLimits = () => { // theta is the equator angle // phi is the polar angle switch (visual) { - case "ribbons": + case VISUAL.RIBBONS: return { rMin: 10, rMax: 15, @@ -28,7 +30,7 @@ const useSphericalLimits = () => { phiMax: Math.PI / 2.1, phiSpeed: 0.25, }; - case "sphere": + case VISUAL.SPHERE: return { rMin: 10, rMax: 15, @@ -40,7 +42,7 @@ const useSphericalLimits = () => { phiMax: Math.PI / 2, phiSpeed: 0.25, }; - case "cube": + case VISUAL.CUBE: return { rMin: 12, rMax: 20, @@ -52,7 +54,7 @@ const useSphericalLimits = () => { phiMax: Math.PI / 2, phiSpeed: 0.25, }; - case "diffusedRing": + case VISUAL.DIFFUSED_RING: return { rMin: 10, rMax: 18, @@ -64,9 +66,21 @@ const useSphericalLimits = () => { phiMax: Math.PI / 2.25, phiSpeed: 0.25, }; - case "boxes": - case "dna": - case "grid": + case VISUAL.WALK: + return { + rMin: 15, + rMax: 22, + rSpeed: 0.1, + thetaMin: 0, + thetaMax: 2 * Math.PI, + thetaSpeed: 0.025, + phiMin: Math.PI / 3.5, + phiMax: Math.PI / 2.25, + phiSpeed: 0.25, + }; + case VISUAL.BOXES: + case VISUAL.DNA: + case VISUAL.GRID: return { rMin: 15, rMax: 22, diff --git a/app/src/components/controls/dock.tsx b/app/src/components/controls/dock.tsx index e9ebf9c4..ebdf6fd0 100644 --- a/app/src/components/controls/dock.tsx +++ b/app/src/components/controls/dock.tsx @@ -51,7 +51,7 @@ export const Dock = ({ return (
{
{showUI && (
- {mode !== APPLICATION_MODE.AUDIO_SCOPE && } + {mode !== APPLICATION_MODE.AUDIO_SCOPE && ( + + )}
{
1} defaultChecked={waveformFrequenciesHz.length > 1} onCheckedChange={(e) => { setWaveformFrequenciesHz(e ? [2.0, 10.0] : [2.0]); diff --git a/app/src/components/controls/visualSettingsSheet.tsx b/app/src/components/controls/visualSettingsSheet.tsx index 10769081..1306bcf8 100644 --- a/app/src/components/controls/visualSettingsSheet.tsx +++ b/app/src/components/controls/visualSettingsSheet.tsx @@ -19,6 +19,7 @@ import { } from "@/lib/palettes"; import { cn } from "@/lib/utils"; +import { VISUAL } from "../visualizers/common"; import { CubeVisualSettingsControls } from "./visual/cube"; import { DiffusedRingVisualSettingsControls } from "./visual/diffusedRing"; import { GridVisualSettingsControls } from "./visual/grid"; @@ -64,17 +65,18 @@ const PaletteIcon = ({ const VisualSettingsControls = () => { const { visual } = useVisualContext(); switch (visual) { - case "cube": + case VISUAL.CUBE: return CubeVisualSettingsControls(); - case "grid": + case VISUAL.GRID: return GridVisualSettingsControls(); - case "sphere": + case VISUAL.SPHERE: return SphereVisualSettingsControls(); - case "diffusedRing": + case VISUAL.DIFFUSED_RING: return DiffusedRingVisualSettingsControls(); - case "ribbons": - case "dna": - case "boxes": + case VISUAL.RIBBONS: + case VISUAL.DNA: + case VISUAL.BOXES: + case VISUAL.WALK: return null; default: return visual satisfies never; diff --git a/app/src/components/controls/visualsDock.tsx b/app/src/components/controls/visualsDock.tsx index 435199df..71bc3234 100644 --- a/app/src/components/controls/visualsDock.tsx +++ b/app/src/components/controls/visualsDock.tsx @@ -1,6 +1,7 @@ import { type HTMLAttributes } from "react"; import { AVAILABLE_VISUALS, + VISUAL, type VisualType, } from "@/components/visualizers/common"; import { useVisualContext, useVisualContextSetters } from "@/context/visual"; @@ -9,8 +10,10 @@ import { Boxes, CircleDashed, Dna, + Footprints, Globe, Grid3x3, + HelpCircle, Ribbon, } from "lucide-react"; @@ -18,22 +21,24 @@ import { Dock, DockItem, DockNav } from "./dock"; const VisualIcon = ({ visual }: { visual: VisualType }) => { switch (visual) { - case "grid": + case VISUAL.GRID: return ; - case "cube": + case VISUAL.CUBE: return ; - case "sphere": + case VISUAL.SPHERE: return ; - case "diffusedRing": + case VISUAL.DIFFUSED_RING: return ; - case "dna": + case VISUAL.DNA: return ; - case "boxes": + case VISUAL.BOXES: return ; - case "ribbons": + case VISUAL.RIBBONS: return ; + case VISUAL.WALK: + return ; default: - return visual satisfies never; + return ; } }; diff --git a/app/src/components/visualizers/common.ts b/app/src/components/visualizers/common.ts index afaff8d6..26c30348 100644 --- a/app/src/components/visualizers/common.ts +++ b/app/src/components/visualizers/common.ts @@ -12,16 +12,18 @@ export interface MotionVisualProps { scalarTracker?: IScalarTracker; } -export const AVAILABLE_VISUALS = [ - "grid", - "sphere", - "cube", - "diffusedRing", - "dna", - "boxes", - "ribbons", - // "stencil", - // "swarm", -] as const; +export const VISUAL = { + GRID: "grid", + SPHERE: "sphere", + CUBE: "cube", + DIFFUSED_RING: "diffusedRing", + DNA: "dna", + BOXES: "boxes", + RIBBONS: "ribbons", + WALK: "walk", + // STENCIL: "stencil", + // SWARM: "swarm", +} as const; -export type VisualType = (typeof AVAILABLE_VISUALS)[number]; +export const AVAILABLE_VISUALS = Object.values(VISUAL); +export type VisualType = (typeof VISUAL)[keyof typeof VISUAL]; diff --git a/app/src/components/visualizers/visual.tsx b/app/src/components/visualizers/visual.tsx new file mode 100644 index 00000000..628974e7 --- /dev/null +++ b/app/src/components/visualizers/visual.tsx @@ -0,0 +1,26 @@ +import { Suspense } from "react"; +import { useVisualComponent } from "@/hooks/useVisualComponent"; +import { type ICoordinateMapper } from "@/lib/mappers/coordinateMappers/common"; +import { type IScalarTracker } from "@/lib/mappers/valueTracker/common"; + +import { type VisualType } from "./common"; + +export const Visual = ({ + visual, + coordinateMapper, + scalarTracker, +}: { + visual: VisualType; + coordinateMapper?: ICoordinateMapper; + scalarTracker?: IScalarTracker; +}) => { + const VisualComponent = useVisualComponent(visual); + return ( + + + + ); +}; diff --git a/app/src/components/visualizers/visualizerAudio.tsx b/app/src/components/visualizers/visualizerAudio.tsx index 851d6200..35950ad9 100644 --- a/app/src/components/visualizers/visualizerAudio.tsx +++ b/app/src/components/visualizers/visualizerAudio.tsx @@ -1,10 +1,11 @@ -import { lazy, Suspense, useMemo } from "react"; import { type VisualType } from "@/components/visualizers/common"; import { useFFTAnalyzerContext } from "@/context/fftAnalyzer"; import { useEnergyInfo, useVisualSourceDataX } from "@/lib/appState"; import { CoordinateMapper_Data } from "@/lib/mappers/coordinateMappers/data"; import { EnergyTracker } from "@/lib/mappers/valueTracker/energyTracker"; +import { Visual } from "./visual"; + const AudioVisual = ({ visual }: { visual: VisualType }) => { const freqData = useVisualSourceDataX(); const energyInfo = useEnergyInfo(); @@ -14,22 +15,12 @@ const AudioVisual = ({ visual }: { visual: VisualType }) => { const coordinateMapper = new CoordinateMapper_Data(amplitude, freqData); const energyTracker = new EnergyTracker(energyInfo); - const VisualComponent = useMemo( - () => - lazy( - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - async () => await import(`./${visual}/reactive.tsx`), - ), - [visual], - ); - return ( - - - + ); }; diff --git a/app/src/components/visualizers/visualizerNoise.tsx b/app/src/components/visualizers/visualizerNoise.tsx index 62791033..ace0b68c 100644 --- a/app/src/components/visualizers/visualizerNoise.tsx +++ b/app/src/components/visualizers/visualizerNoise.tsx @@ -1,18 +1,10 @@ -import { lazy, Suspense, useMemo } from "react"; import { type VisualType } from "@/components/visualizers/common"; import { useNoiseGeneratorContext } from "@/context/noiseGenerator"; import { CoordinateMapper_Noise } from "@/lib/mappers/coordinateMappers/noise"; -const NoiseVisual = ({ visual }: { visual: VisualType }) => { - const VisualComponent = useMemo( - () => - lazy( - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - async () => await import(`./${visual}/reactive.tsx`), - ), - [visual], - ); +import { Visual } from "./visual"; +const NoiseVisual = ({ visual }: { visual: VisualType }) => { const { amplitude, spatialScale, timeScale, nIterations } = useNoiseGeneratorContext(); @@ -23,13 +15,7 @@ const NoiseVisual = ({ visual }: { visual: VisualType }) => { nIterations, ); - return ( - <> - - - - - ); + return ; }; export default NoiseVisual; diff --git a/app/src/components/visualizers/visualizerWaveform.tsx b/app/src/components/visualizers/visualizerWaveform.tsx index bfbf8e53..4b333d30 100644 --- a/app/src/components/visualizers/visualizerWaveform.tsx +++ b/app/src/components/visualizers/visualizerWaveform.tsx @@ -1,18 +1,10 @@ -import { lazy, Suspense, useMemo } from "react"; import { type VisualType } from "@/components/visualizers/common"; import { useWaveGeneratorContext } from "@/context/waveGenerator"; import { CoordinateMapper_WaveformSuperposition } from "@/lib/mappers/coordinateMappers/waveform"; -const WaveformVisual = ({ visual }: { visual: VisualType }) => { - const VisualComponent = useMemo( - () => - lazy( - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - async () => await import(`./${visual}/reactive.tsx`), - ), - [visual], - ); +import { Visual } from "./visual"; +const WaveformVisual = ({ visual }: { visual: VisualType }) => { const { maxAmplitude, waveformFrequenciesHz, amplitudeSplitRatio } = useWaveGeneratorContext(); @@ -22,11 +14,7 @@ const WaveformVisual = ({ visual }: { visual: VisualType }) => { amplitudeSplitRatio, ); - return ( - - - - ); + return ; }; export default WaveformVisual; diff --git a/app/src/components/visualizers/walk/horse.png b/app/src/components/visualizers/walk/horse.png new file mode 100644 index 0000000000000000000000000000000000000000..66fb3026932bdd2faf2956e73c708186dd0e63aa GIT binary patch literal 181808 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 literal 0 HcmV?d00001 diff --git a/app/src/components/visualizers/walk/horse.tsx b/app/src/components/visualizers/walk/horse.tsx new file mode 100644 index 00000000..29a1006c --- /dev/null +++ b/app/src/components/visualizers/walk/horse.tsx @@ -0,0 +1,89 @@ +import { useEffect, useMemo, useRef } from "react"; +import { type VisualProps } from "@/components/visualizers/common"; +import { usePalette } from "@/lib/appState"; +import { ColorPalette } from "@/lib/palettes"; +import { useAnimations, useGLTF } from "@react-three/drei"; +import { useFrame } from "@react-three/fiber"; +import { type Group } from "three"; +import { type GLTF } from "three-stdlib"; + +import MODEL_HORSE from "./horse.png"; + +type GLTFResult = GLTF & { + nodes: { + mesh_0: THREE.Mesh; + }; + materials: Record; + animations: GLTFAction[]; +}; + +type ActionName = "horse_A_"; + +interface GLTFAction extends THREE.AnimationClip { + name: ActionName; +} + +const Horse = (_: VisualProps) => { + const group = useRef(null); + const { nodes, animations } = useGLTF(MODEL_HORSE) as GLTFResult; + const palette = usePalette(); + const lut = ColorPalette.getPalette(palette).buildLut(); + + const material = useMemo(() => { + // const mat = nodes.mesh_0.material as MeshStandardMaterial; + return ( + + ); + }, [lut]); + + const { actions } = useAnimations(animations, group); + + useEffect(() => { + actions?.horse_A_?.play(); + }); + + useFrame(({ clock }) => { + const t = clock.getElapsedTime(); + + const rateOfChange = 0.5; + const tScale = (Math.sin(rateOfChange * t) + 1) / 2; + actions?.horse_A_?.setEffectiveTimeScale(tScale); + }); + + return ( + + + + + {material} + + + + ); +}; + +export default Horse; diff --git a/app/src/components/visualizers/walk/reactive.tsx b/app/src/components/visualizers/walk/reactive.tsx new file mode 100644 index 00000000..fcea4ec9 --- /dev/null +++ b/app/src/components/visualizers/walk/reactive.tsx @@ -0,0 +1,15 @@ +import { type VisualProps } from "@/components/visualizers/common"; + +import Horse from "./horse"; +import { Treadmill } from "./treadmill"; + +const WalkVisual = ({ ...props }: VisualProps) => { + return ( + <> + + + + ); +}; + +export default WalkVisual; diff --git a/app/src/components/visualizers/walk/treadmill.tsx b/app/src/components/visualizers/walk/treadmill.tsx new file mode 100644 index 00000000..73c59cef --- /dev/null +++ b/app/src/components/visualizers/walk/treadmill.tsx @@ -0,0 +1,132 @@ +import { useEffect, useMemo, useRef } from "react"; +import { usePalette } from "@/lib/appState"; +import { easeInOut, EASING_FUNCTION } from "@/lib/easing"; +import { COORDINATE_TYPE } from "@/lib/mappers/coordinateMappers/common"; +import { ColorPalette } from "@/lib/palettes"; +import { useFrame } from "@react-three/fiber"; +import { + BoxGeometry, + CatmullRomCurve3, + Matrix4, + MeshStandardMaterial, + Quaternion, + Vector3, + type InstancedMesh, +} from "three"; + +import { type VisualProps } from "../common"; + +const curvePoints = [ + [-1, 1], + [-0.75, -0.1], + [-0.6, 0], + [0, 0], + [0.6, 0], + [0.75, -0.1], + [1, 1], +] as const; + +export const Treadmill = ({ + nStones = 30, + stoneWidth = 5, + stoneHeight = 0.1, + stoneLength = 1, + coordinateMapper, +}: VisualProps & { + nStones?: number; + stoneWidth?: number; + stoneHeight?: number; + stoneLength?: number; +}) => { + const stoneRef = useRef(null); + const [tmpMatrix, tmpVecPosition, tmpQuat, tmpVecScale] = useMemo( + () => [new Matrix4(), new Vector3(), new Quaternion(), new Vector3()], + [], + ); + + const curve = useMemo(() => { + const scale = 10.0; + return new CatmullRomCurve3( + curvePoints.map((v) => new Vector3(0, v[0], v[1]).multiplyScalar(scale)), + false, + "catmullrom", + 0.1, + ); + }, []); + + const palette = usePalette(); + const lut = ColorPalette.getPalette(palette).buildLut(); + useEffect(() => { + if (!stoneRef.current) { + return; + } + for (let instanceIdx = 0; instanceIdx < nStones; instanceIdx++) { + stoneRef.current.setColorAt( + instanceIdx, + lut.getColor(instanceIdx / (nStones - 1)), + ); + } + stoneRef.current.instanceColor!.needsUpdate = true; + }, [stoneRef, lut, nStones]); + + useFrame(({ clock }) => { + if (!stoneRef.current) { + return; + } + const t = clock.getElapsedTime(); + const speed = 0.025; + + const q = 0.5; + // assume v(t) = (sin(q * t) + 1) / 2... integrate to find position + const normPosition = (speed * (t - Math.cos(q * t) / q)) % 1; + + const alphaRaw = normPosition; + const alpha = 1 - easeInOut(alphaRaw, EASING_FUNCTION.LINEAR); + + for (let instanceIdx = 0; instanceIdx < nStones; instanceIdx++) { + const stoneAlpha = (alpha + instanceIdx / nStones) % 1; + const widthScalar = 1 - 2 * Math.abs(stoneAlpha - 0.5); + // const widthScalar = 1; + + const dataAlpha = Math.abs(stoneAlpha - 0.5); + const mappedWidthScalar = + 0.5 + + coordinateMapper.map(COORDINATE_TYPE.CARTESIAN_1D, dataAlpha, t) / 2; + const finalWidthScalar = widthScalar * (1 + mappedWidthScalar); + + // + stoneRef.current.getMatrixAt(instanceIdx, tmpMatrix); + tmpMatrix.decompose(tmpVecPosition, tmpQuat, tmpVecScale); + + curve.getPointAt(stoneAlpha, tmpVecPosition); + tmpVecScale.set(finalWidthScalar, 1, 1); + + tmpMatrix.compose(tmpVecPosition, tmpQuat, tmpVecScale); + stoneRef.current.setMatrixAt(instanceIdx, tmpMatrix); + } + + stoneRef.current.instanceMatrix.needsUpdate = true; + }); + + return ( + <> + + + + + + ); +}; diff --git a/app/src/context/visual.tsx b/app/src/context/visual.tsx index 483e51cc..08ce7ce6 100644 --- a/app/src/context/visual.tsx +++ b/app/src/context/visual.tsx @@ -9,6 +9,7 @@ import { } from "react"; import { AVAILABLE_VISUALS, + VISUAL, type VisualType, } from "@/components/visualizers/common"; import { APPLICATION_MODE } from "@/lib/applicationModes"; @@ -62,7 +63,7 @@ export const VisualContextProvider = ({ useEffect(() => { if (mode === APPLICATION_MODE.WAVE_FORM) { switch (visual) { - case "diffusedRing": + case VISUAL.DIFFUSED_RING: setWaveformFrequenciesHz([2.0, 10.0]); setMaxAmplitude(1.0); break; diff --git a/app/src/hooks/useVisualComponent.ts b/app/src/hooks/useVisualComponent.ts new file mode 100644 index 00000000..cf44c16a --- /dev/null +++ b/app/src/hooks/useVisualComponent.ts @@ -0,0 +1,14 @@ +import { lazy, useMemo } from "react"; +import { type VisualType } from "@/components/visualizers/common"; + +export const useVisualComponent = (visual: VisualType) => { + return useMemo( + () => + lazy( + async () => + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + await import(`@/components/visualizers/${visual}/reactive.tsx`), + ), + [visual], + ); +}; diff --git a/app/vite.config.ts b/app/vite.config.ts index 5e84c4c6..858ab509 100644 --- a/app/vite.config.ts +++ b/app/vite.config.ts @@ -11,4 +11,5 @@ export default defineConfig({ }, }, base: "/r3f-audio-visualizer/", + assetsInclude: ["**/*.glb"], });