threed-garden
Version:
ThreeD Garden: WebGL 3D Environment Interface for Next.JS React TypeScript Three.JS React-Three Physics, 2D Paper.JS; APIs: Apollo GraphQL, WordPress; CSS: Tailwind, Radix-UI; Libraries: FarmBot 3D; AI: OpenAI, DeepSeek
50 lines (42 loc) • 1.36 kB
text/typescript
import { useMemo } from "react";
import { useSettings } from "../state/useSettings";
import { useFbmNoise } from "./useFbmNoise";
import { useSquareSurface } from "./useSquareSurface";
/**
* Generate a square procedural terrain using a noise function for the relief
*/
export function useProceduralTerrain() {
const { surface, scale } = useSquareSurface();
const waterLevel = useSettings((s) => s.colors.Water.value);
const generationScale = useSettings((s) => s.generation.Scale);
const generationHeight = useSettings((s) => s.generation.Height);
const display = useSettings((s) => s.display);
const getNoiseValue = useFbmNoise();
const dataBlocks = useMemo(
() =>
surface.map((point) => {
const scaledVector = point.clone().multiplyScalar(scale * generationScale);
const realHeight = getNoiseValue(scaledVector) * generationHeight;
let visibleHeight = realHeight;
if (display === "color" && realHeight < waterLevel) {
visibleHeight = waterLevel;
}
return {
x: point.x,
y: point.y,
z: (visibleHeight / scale) * 3,
height: realHeight
};
}),
[
surface,
scale,
generationScale,
generationHeight,
waterLevel,
getNoiseValue,
display
]
);
return { dataBlocks, scale };
}