From 165a5f86f064461ce3732b80f93ebb4530306673 Mon Sep 17 00:00:00 2001 From: Grimsace Date: Wed, 4 Feb 2026 15:04:00 -0600 Subject: [PATCH] Fixed trees spawning on road --- main.go | 4 ++-- terrain.go | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index bb9222d..ccf4b99 100644 --- a/main.go +++ b/main.go @@ -144,7 +144,7 @@ func main() { } } - treePixels = GenerateTrees(finalImage, allWaterPixels, settings.MinTreeSize, settings.MaxTreeSize, settings.TreeCoverage, settings.TreeClumpiness, settings.Seed) + treePixels = GenerateTrees(finalImage, allWaterPixels, roadPixels, settings.MinTreeSize, settings.MaxTreeSize, settings.TreeCoverage, settings.TreeClumpiness, settings.Seed) darkenedHeightmap := DarkenLakeAreas(noiseImg, allWaterPixels) @@ -451,7 +451,7 @@ func main() { progressBar.SetText(fmt.Sprintf("Step %d/%d: Generating Trees", currentStep, steps)) progressBar.SetValue(float64(currentStep) / float64(steps)) }) - treePixels = GenerateTrees(finalImage, allWaterPixels, settings.MinTreeSize, settings.MaxTreeSize, settings.TreeCoverage, settings.TreeClumpiness, settings.Seed) + treePixels = GenerateTrees(finalImage, allWaterPixels, roadPixels, settings.MinTreeSize, settings.MaxTreeSize, settings.TreeCoverage, settings.TreeClumpiness, settings.Seed) // Step 8: Finalizing Images currentStep++ diff --git a/terrain.go b/terrain.go index deb48af..6698f0a 100644 --- a/terrain.go +++ b/terrain.go @@ -85,7 +85,7 @@ func DarkenLakeAreas(heightmap image.Image, lakePixels []image.Point) image.Imag return composite } -func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTreeSize, treeCoverage, treeClumpiness float64, seed int64) []image.Point { +func GenerateTrees(img *image.RGBA, lakePixels, roadPixels []image.Point, minTreeSize, maxTreeSize, treeCoverage, treeClumpiness float64, seed int64) []image.Point { width := img.Bounds().Dx() height := img.Bounds().Dy() @@ -124,6 +124,11 @@ func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTr isLake[p] = true } + isRoad := make(map[image.Point]bool) + for _, p := range roadPixels { + isRoad[p] = true + } + randSrc := rand.New(rand.NewSource(seed)) // 3. Determine initial clump trees @@ -133,7 +138,7 @@ func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTr for range numClumpTrees { for range 100 { // try 100 times to find a valid spot p := image.Point{X: randSrc.Intn(width), Y: randSrc.Intn(height)} - if treeNoiseMap.GrayAt(p.X, p.Y).Y >= threshold && !isLake[p] { + if treeNoiseMap.GrayAt(p.X, p.Y).Y >= threshold && !isLake[p] && !isRoad[p] { initialPoints = append(initialPoints, p) break } @@ -143,7 +148,7 @@ func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTr // 4. Place remaining trees using Bridson's Algorithm minRadius := minTreeSize allPoints := poissonDiscSampling(width, height, minRadius, 30, initialPoints, func(p image.Point) bool { - return treeNoiseMap.GrayAt(p.X, p.Y).Y >= threshold && !isLake[p] + return treeNoiseMap.GrayAt(p.X, p.Y).Y >= threshold && !isLake[p] && !isRoad[p] }, seed) var treePixels []image.Point @@ -158,7 +163,7 @@ func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTr for y := p.Y - int(r); y <= p.Y+int(r); y++ { for x := p.X - int(r); x <= p.X+int(r); x++ { pt := image.Point{X: x, Y: y} - if !pt.In(img.Bounds()) || isLake[pt] { + if !pt.In(img.Bounds()) || isLake[pt] || isRoad[pt] { continue }