diff --git a/src/components/World.tsx b/src/components/World.tsx index cd60b12..8cd9fe4 100644 --- a/src/components/World.tsx +++ b/src/components/World.tsx @@ -1,10 +1,17 @@ -import { RepeatWrapping, TextureLoader, Vector2, Vector3 } from "three"; +import { + ClampToEdgeWrapping, + RepeatWrapping, + TextureLoader, + Vector2, + Vector3, +} from "three"; import { ImprovedNoise } from "three/examples/jsm/Addons.js"; export function World(props: { position: Vector2; seed: number }): JSX.Element { const size = 100; const scale = 3; const amplitude = 30; + const overlap = 0.5; // Amount of overlap between chunks const noise = (x: number, y: number): number => { const noise = new ImprovedNoise(); @@ -12,22 +19,29 @@ export function World(props: { position: Vector2; seed: number }): JSX.Element { }; const canvas = document.createElement("canvas"); - canvas.width = size; - canvas.height = size; + canvas.width = size + overlap * 2; + canvas.height = size + overlap * 2; const context = canvas.getContext("2d"); if (!context) throw new Error("Canvas context not found"); - const imageData = context.getImageData(0, 0, size, size); + + const offsetX = -overlap + props.position.x; + const offsetY = -overlap + props.position.y; + + const imageData = context.getImageData( + 0, + 0, + size + overlap * 2, + size + overlap * 2 + ); const data = imageData.data; - for (let x = 0; x < size; x++) { - for (let y = 0; y < size; y++) { + + for (let x = 0; x < size + overlap * 2; x++) { + for (let y = 0; y < size + overlap * 2; y++) { const n = - noise( - (x + props.position.x) / (size / scale), - (y + props.position.y) / (size / scale) - ) * + noise((x + offsetX) / (size / scale), (y + offsetY) / (size / scale)) * 127 + 127; - const id = (x + y * size) * 4; + const id = (x + y * (size + overlap * 2)) * 4; data[id] = n; data[id + 1] = n; data[id + 2] = n; @@ -36,8 +50,7 @@ export function World(props: { position: Vector2; seed: number }): JSX.Element { } context.putImageData(imageData, 0, 0); const displacementMap = new TextureLoader().load(canvas.toDataURL()); - displacementMap.wrapS = displacementMap.wrapT = RepeatWrapping; - displacementMap.wrapT = displacementMap.wrapS = RepeatWrapping; + displacementMap.wrapS = displacementMap.wrapT = ClampToEdgeWrapping; const grassTexture = new TextureLoader().load("./texture_grass.jpg"); grassTexture.wrapS = grassTexture.wrapT = RepeatWrapping; @@ -53,10 +66,9 @@ export function World(props: { position: Vector2; seed: number }): JSX.Element { >