Fixed trees spawning on road

This commit is contained in:
Grimsace
2026-02-04 15:04:00 -06:00
parent a68822ef4e
commit 165a5f86f0
2 changed files with 11 additions and 6 deletions
+2 -2
View File
@@ -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) darkenedHeightmap := DarkenLakeAreas(noiseImg, allWaterPixels)
@@ -451,7 +451,7 @@ func main() {
progressBar.SetText(fmt.Sprintf("Step %d/%d: Generating Trees", currentStep, steps)) progressBar.SetText(fmt.Sprintf("Step %d/%d: Generating Trees", currentStep, steps))
progressBar.SetValue(float64(currentStep) / float64(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 // Step 8: Finalizing Images
currentStep++ currentStep++
+9 -4
View File
@@ -85,7 +85,7 @@ func DarkenLakeAreas(heightmap image.Image, lakePixels []image.Point) image.Imag
return composite 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() width := img.Bounds().Dx()
height := img.Bounds().Dy() height := img.Bounds().Dy()
@@ -124,6 +124,11 @@ func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTr
isLake[p] = true isLake[p] = true
} }
isRoad := make(map[image.Point]bool)
for _, p := range roadPixels {
isRoad[p] = true
}
randSrc := rand.New(rand.NewSource(seed)) randSrc := rand.New(rand.NewSource(seed))
// 3. Determine initial clump trees // 3. Determine initial clump trees
@@ -133,7 +138,7 @@ func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTr
for range numClumpTrees { for range numClumpTrees {
for range 100 { // try 100 times to find a valid spot for range 100 { // try 100 times to find a valid spot
p := image.Point{X: randSrc.Intn(width), Y: randSrc.Intn(height)} 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) initialPoints = append(initialPoints, p)
break break
} }
@@ -143,7 +148,7 @@ func GenerateTrees(img *image.RGBA, lakePixels []image.Point, minTreeSize, maxTr
// 4. Place remaining trees using Bridson's Algorithm // 4. Place remaining trees using Bridson's Algorithm
minRadius := minTreeSize minRadius := minTreeSize
allPoints := poissonDiscSampling(width, height, minRadius, 30, initialPoints, func(p image.Point) bool { 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) }, seed)
var treePixels []image.Point 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 y := p.Y - int(r); y <= p.Y+int(r); y++ {
for x := p.X - int(r); x <= p.X+int(r); x++ { for x := p.X - int(r); x <= p.X+int(r); x++ {
pt := image.Point{X: x, Y: y} pt := image.Point{X: x, Y: y}
if !pt.In(img.Bounds()) || isLake[pt] { if !pt.In(img.Bounds()) || isLake[pt] || isRoad[pt] {
continue continue
} }