flattened heightmap under roads
This commit is contained in:
@@ -148,7 +148,9 @@ func main() {
|
|||||||
|
|
||||||
darkenedHeightmap := DarkenLakeAreas(noiseImg, allWaterPixels)
|
darkenedHeightmap := DarkenLakeAreas(noiseImg, allWaterPixels)
|
||||||
|
|
||||||
compositeImg := ApplyRoughness(darkenedHeightmap, settings.Roughness)
|
flattenedHeightmap := FlattenRoadAreas(darkenedHeightmap, roadPixels)
|
||||||
|
|
||||||
|
compositeImg := ApplyRoughness(flattenedHeightmap, settings.Roughness)
|
||||||
|
|
||||||
heightmapImg.Image = compositeImg
|
heightmapImg.Image = compositeImg
|
||||||
|
|
||||||
@@ -437,6 +439,7 @@ func main() {
|
|||||||
progressBar.SetValue(float64(currentStep) / float64(steps))
|
progressBar.SetValue(float64(currentStep) / float64(steps))
|
||||||
})
|
})
|
||||||
darkenedHeightmap := DarkenLakeAreas(noiseImg, allWaterPixels)
|
darkenedHeightmap := DarkenLakeAreas(noiseImg, allWaterPixels)
|
||||||
|
flattenedHeightmap := FlattenRoadAreas(darkenedHeightmap, roadPixels)
|
||||||
|
|
||||||
// Step 6: Applying Roughness
|
// Step 6: Applying Roughness
|
||||||
currentStep++
|
currentStep++
|
||||||
@@ -444,7 +447,7 @@ func main() {
|
|||||||
progressBar.SetText(fmt.Sprintf("Step %d/%d: Applying Roughness", currentStep, steps))
|
progressBar.SetText(fmt.Sprintf("Step %d/%d: Applying Roughness", currentStep, steps))
|
||||||
progressBar.SetValue(float64(currentStep) / float64(steps))
|
progressBar.SetValue(float64(currentStep) / float64(steps))
|
||||||
})
|
})
|
||||||
compositeImg := ApplyRoughness(darkenedHeightmap, settings.Roughness)
|
compositeImg := ApplyRoughness(flattenedHeightmap, settings.Roughness)
|
||||||
|
|
||||||
// Step 7: Generating Trees
|
// Step 7: Generating Trees
|
||||||
currentStep++
|
currentStep++
|
||||||
|
|||||||
+48
@@ -85,6 +85,54 @@ func DarkenLakeAreas(heightmap image.Image, lakePixels []image.Point) image.Imag
|
|||||||
return composite
|
return composite
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FlattenRoadAreas(heightmap image.Image, roadPixels []image.Point) image.Image {
|
||||||
|
bounds := heightmap.Bounds()
|
||||||
|
width := bounds.Dx()
|
||||||
|
|
||||||
|
// Create a new image with the road pixels drawn on it.
|
||||||
|
roadMask := image.NewGray(bounds)
|
||||||
|
for _, p := range roadPixels {
|
||||||
|
roadMask.SetGray(p.X, p.Y, color.Gray{Y: 255})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blur the road mask.
|
||||||
|
blurRadius := float64(width) * 0.01
|
||||||
|
blurredRoadMask := imaging.Blur(roadMask, blurRadius)
|
||||||
|
|
||||||
|
// Create a new image to store the blurred heightmap.
|
||||||
|
blurredHeightmap := imaging.Blur(heightmap, blurRadius)
|
||||||
|
|
||||||
|
// Create a new composite image.
|
||||||
|
composite := image.NewRGBA(bounds)
|
||||||
|
|
||||||
|
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
|
||||||
|
for x := bounds.Min.X; x < bounds.Max.X; x++ {
|
||||||
|
maskAlpha, _, _, _ := blurredRoadMask.At(x, y).RGBA()
|
||||||
|
if maskAlpha > 0 {
|
||||||
|
// Linearly interpolate between the original and blurred heightmap based on the mask alpha.
|
||||||
|
originalColor := heightmap.At(x, y)
|
||||||
|
blurredColor := blurredHeightmap.At(x, y)
|
||||||
|
|
||||||
|
r1, g1, b1, a1 := originalColor.RGBA()
|
||||||
|
r2, g2, b2, a2 := blurredColor.RGBA()
|
||||||
|
|
||||||
|
alpha := float64(maskAlpha) / 65535.0
|
||||||
|
|
||||||
|
r := uint16(float64(r1)*(1-alpha) + float64(r2)*alpha)
|
||||||
|
g := uint16(float64(g1)*(1-alpha) + float64(g2)*alpha)
|
||||||
|
b := uint16(float64(b1)*(1-alpha) + float64(b2)*alpha)
|
||||||
|
a := uint16(float64(a1)*(1-alpha) + float64(a2)*alpha)
|
||||||
|
|
||||||
|
composite.Set(x, y, color.RGBA64{R: r, G: g, B: b, A: a})
|
||||||
|
} else {
|
||||||
|
composite.Set(x, y, heightmap.At(x, y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return composite
|
||||||
|
}
|
||||||
|
|
||||||
func GenerateTrees(img *image.RGBA, lakePixels, roadPixels []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()
|
||||||
|
|||||||
Reference in New Issue
Block a user