From ebe0663d6151922ff17b27c2284d35f769ce3f6b Mon Sep 17 00:00:00 2001 From: Grimsace Date: Wed, 4 Feb 2026 16:37:50 -0600 Subject: [PATCH] added a separate bridge and river mask --- main.go | 26 ++++++++++++++++---------- roads.go | 24 ++++++++++++++++-------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index 42265bd..a865a12 100644 --- a/main.go +++ b/main.go @@ -52,6 +52,7 @@ func main() { var riverPixels []image.Point var treePixels []image.Point var roadPixels []image.Point + var bridgePixels []image.Point configDir, err := os.UserConfigDir() if err != nil { @@ -134,7 +135,7 @@ func main() { } allWaterPixels := append(flatLakePixels, riverPixels...) - roadPixels, roadImage = GenerateRoads(settings.Width, settings.Height, settings, noiseImg, allWaterPixels, seedProvider.Next()) + roadPixels, bridgePixels, roadImage = GenerateRoads(settings.Width, settings.Height, settings, noiseImg, allWaterPixels, seedProvider.Next()) for y := 0; y < roadImage.Bounds().Max.Y; y++ { for x := 0; x < roadImage.Bounds().Max.X; x++ { r, g, b, a := roadImage.At(x, y).RGBA() @@ -363,7 +364,7 @@ func main() { showSaveDialog(w, heightmapImg.Image, settings) }) exportMasksBtn := widget.NewButton("Export Masks", func() { - showMasksSaveDialog(w, canvasImg.Image, heightmapImg.Image, settings, lakes, riverPixels, treePixels, roadPixels) + showMasksSaveDialog(w, canvasImg.Image, heightmapImg.Image, settings, lakes, riverPixels, treePixels, roadPixels, bridgePixels) }) generateBtn = widget.NewButton("Generate", func() { @@ -422,7 +423,7 @@ func main() { progressBar.SetValue(float64(currentStep) / float64(steps)) }) var roadImage *image.RGBA - roadPixels, roadImage = GenerateRoads(settings.Width, settings.Height, settings, noiseImg, allWaterPixels, seedProvider.Next()) // Draw roadImage over finalImage + roadPixels, bridgePixels, roadImage = GenerateRoads(settings.Width, settings.Height, settings, noiseImg, allWaterPixels, seedProvider.Next()) // Draw roadImage over finalImage for y := 0; y < roadImage.Bounds().Max.Y; y++ { for x := 0; x < roadImage.Bounds().Max.X; x++ { r, g, b, a := roadImage.At(x, y).RGBA() @@ -632,7 +633,7 @@ func getImageData(img image.Image, format string) (*bytes.Buffer, error) { return buf, err } -func showMasksSaveDialog(win fyne.Window, canvasImg, heightmapImg image.Image, settings *Settings, lakes [][]image.Point, riverPixels, treePixels, roadPixels []image.Point) { +func showMasksSaveDialog(win fyne.Window, canvasImg, heightmapImg image.Image, settings *Settings, lakes [][]image.Point, riverPixels, treePixels, roadPixels, bridgePixels []image.Point) { fileNameEntry := widget.NewEntry() fileNameEntry.SetPlaceHolder("masks_folder") @@ -698,14 +699,19 @@ func showMasksSaveDialog(win fyne.Window, canvasImg, heightmapImg image.Image, s for _, p := range roadPixels { roadMask.SetGray(p.X, p.Y, color.Gray{Y: 255}) } + bridgeMask := image.NewGray(bounds) + for _, p := range bridgePixels { + bridgeMask.SetGray(p.X, p.Y, color.Gray{Y: 255}) + } imagesToSave := map[string]image.Image{ - "canvas." + imgFormat: canvasImg, - "heightmap." + imgFormat: heightmapImg, - "lakes_mask." + imgFormat: lakeMask, - "rivers_mask." + imgFormat: riverMask, - "trees_mask." + imgFormat: treeMask, - "roads_mask." + imgFormat: roadMask, + "canvas." + imgFormat: canvasImg, + "heightmap." + imgFormat: heightmapImg, + "lakes_mask." + imgFormat: lakeMask, + "rivers_mask." + imgFormat: riverMask, + "trees_mask." + imgFormat: treeMask, + "roads_mask." + imgFormat: roadMask, + "bridges_mask." + imgFormat: bridgeMask, } switch packageSelect.Selected { diff --git a/roads.go b/roads.go index 48c5285..a735cc6 100644 --- a/roads.go +++ b/roads.go @@ -29,7 +29,7 @@ type Road struct { Importance int } -func GenerateRoads(width, height int, settings *Settings, noiseImg image.Image, allWaterPixels []image.Point, seed int64) ([]image.Point, *image.RGBA) { +func GenerateRoads(width, height int, settings *Settings, noiseImg image.Image, allWaterPixels []image.Point, seed int64) ([]image.Point, []image.Point, *image.RGBA) { img := image.NewRGBA(image.Rect(0, 0, width, height)) // Transparent background for y := 0; y < height; y++ { @@ -44,19 +44,21 @@ func GenerateRoads(width, height int, settings *Settings, noiseImg image.Image, pois := generatePOIs(width, height, settings, allWaterPixels, randSrc) if len(pois) == 0 { - return nil, img + return nil, nil, img } roads := connectPOIs(pois, width, height, settings, randSrc, allWaterPixels) assignRoadWidths(roads, settings) var allRoadPixels []image.Point + var allBridgePixels []image.Point for _, road := range roads { - roadPixels := drawRoad(img, road.Points, roadColor, bridgeColor, road.Width) + roadPixels, bridgePixels := drawRoad(img, road.Points, roadColor, bridgeColor, road.Width) allRoadPixels = append(allRoadPixels, roadPixels...) + allBridgePixels = append(allBridgePixels, bridgePixels...) } - return allRoadPixels, img + return allRoadPixels, allBridgePixels, img } func generatePOIs(width, height int, settings *Settings, allWaterPixels []image.Point, randSrc *rand.Rand) []*PointOfInterest { @@ -262,19 +264,25 @@ func assignRoadWidths(roads []*Road, settings *Settings) { } } -func drawRoad(img *image.RGBA, points []PathPoint, roadColor, bridgeColor color.Color, width int) []image.Point { +func drawRoad(img *image.RGBA, points []PathPoint, roadColor, bridgeColor color.Color, width int) ([]image.Point, []image.Point) { var roadPixels []image.Point + var bridgePixels []image.Point for i := 0; i < len(points)-1; i++ { p1 := points[i] p2 := points[i+1] c := roadColor - if p1.IsBridge && p2.IsBridge { + isBridge := p1.IsBridge && p2.IsBridge + if isBridge { c = bridgeColor } linePoints := drawLine(img, p1.Point.X, p1.Point.Y, p2.Point.X, p2.Point.Y, c, width) - roadPixels = append(roadPixels, linePoints...) + if isBridge { + bridgePixels = append(bridgePixels, linePoints...) + } else { + roadPixels = append(roadPixels, linePoints...) + } } - return roadPixels + return roadPixels, bridgePixels } func bresenhamRoad(path []image.Point) []image.Point {