added a separate bridge and river mask
This commit is contained in:
@@ -52,6 +52,7 @@ func main() {
|
|||||||
var riverPixels []image.Point
|
var riverPixels []image.Point
|
||||||
var treePixels []image.Point
|
var treePixels []image.Point
|
||||||
var roadPixels []image.Point
|
var roadPixels []image.Point
|
||||||
|
var bridgePixels []image.Point
|
||||||
|
|
||||||
configDir, err := os.UserConfigDir()
|
configDir, err := os.UserConfigDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -134,7 +135,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
allWaterPixels := append(flatLakePixels, riverPixels...)
|
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 y := 0; y < roadImage.Bounds().Max.Y; y++ {
|
||||||
for x := 0; x < roadImage.Bounds().Max.X; x++ {
|
for x := 0; x < roadImage.Bounds().Max.X; x++ {
|
||||||
r, g, b, a := roadImage.At(x, y).RGBA()
|
r, g, b, a := roadImage.At(x, y).RGBA()
|
||||||
@@ -363,7 +364,7 @@ func main() {
|
|||||||
showSaveDialog(w, heightmapImg.Image, settings)
|
showSaveDialog(w, heightmapImg.Image, settings)
|
||||||
})
|
})
|
||||||
exportMasksBtn := widget.NewButton("Export Masks", func() {
|
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() {
|
generateBtn = widget.NewButton("Generate", func() {
|
||||||
@@ -422,7 +423,7 @@ func main() {
|
|||||||
progressBar.SetValue(float64(currentStep) / float64(steps))
|
progressBar.SetValue(float64(currentStep) / float64(steps))
|
||||||
})
|
})
|
||||||
var roadImage *image.RGBA
|
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 y := 0; y < roadImage.Bounds().Max.Y; y++ {
|
||||||
for x := 0; x < roadImage.Bounds().Max.X; x++ {
|
for x := 0; x < roadImage.Bounds().Max.X; x++ {
|
||||||
r, g, b, a := roadImage.At(x, y).RGBA()
|
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
|
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 := widget.NewEntry()
|
||||||
fileNameEntry.SetPlaceHolder("masks_folder")
|
fileNameEntry.SetPlaceHolder("masks_folder")
|
||||||
|
|
||||||
@@ -698,6 +699,10 @@ func showMasksSaveDialog(win fyne.Window, canvasImg, heightmapImg image.Image, s
|
|||||||
for _, p := range roadPixels {
|
for _, p := range roadPixels {
|
||||||
roadMask.SetGray(p.X, p.Y, color.Gray{Y: 255})
|
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{
|
imagesToSave := map[string]image.Image{
|
||||||
"canvas." + imgFormat: canvasImg,
|
"canvas." + imgFormat: canvasImg,
|
||||||
@@ -706,6 +711,7 @@ func showMasksSaveDialog(win fyne.Window, canvasImg, heightmapImg image.Image, s
|
|||||||
"rivers_mask." + imgFormat: riverMask,
|
"rivers_mask." + imgFormat: riverMask,
|
||||||
"trees_mask." + imgFormat: treeMask,
|
"trees_mask." + imgFormat: treeMask,
|
||||||
"roads_mask." + imgFormat: roadMask,
|
"roads_mask." + imgFormat: roadMask,
|
||||||
|
"bridges_mask." + imgFormat: bridgeMask,
|
||||||
}
|
}
|
||||||
|
|
||||||
switch packageSelect.Selected {
|
switch packageSelect.Selected {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ type Road struct {
|
|||||||
Importance int
|
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))
|
img := image.NewRGBA(image.Rect(0, 0, width, height))
|
||||||
// Transparent background
|
// Transparent background
|
||||||
for y := 0; y < height; y++ {
|
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)
|
pois := generatePOIs(width, height, settings, allWaterPixels, randSrc)
|
||||||
if len(pois) == 0 {
|
if len(pois) == 0 {
|
||||||
return nil, img
|
return nil, nil, img
|
||||||
}
|
}
|
||||||
|
|
||||||
roads := connectPOIs(pois, width, height, settings, randSrc, allWaterPixels)
|
roads := connectPOIs(pois, width, height, settings, randSrc, allWaterPixels)
|
||||||
assignRoadWidths(roads, settings)
|
assignRoadWidths(roads, settings)
|
||||||
|
|
||||||
var allRoadPixels []image.Point
|
var allRoadPixels []image.Point
|
||||||
|
var allBridgePixels []image.Point
|
||||||
for _, road := range roads {
|
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...)
|
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 {
|
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 roadPixels []image.Point
|
||||||
|
var bridgePixels []image.Point
|
||||||
for i := 0; i < len(points)-1; i++ {
|
for i := 0; i < len(points)-1; i++ {
|
||||||
p1 := points[i]
|
p1 := points[i]
|
||||||
p2 := points[i+1]
|
p2 := points[i+1]
|
||||||
c := roadColor
|
c := roadColor
|
||||||
if p1.IsBridge && p2.IsBridge {
|
isBridge := p1.IsBridge && p2.IsBridge
|
||||||
|
if isBridge {
|
||||||
c = bridgeColor
|
c = bridgeColor
|
||||||
}
|
}
|
||||||
linePoints := drawLine(img, p1.Point.X, p1.Point.Y, p2.Point.X, p2.Point.Y, c, width)
|
linePoints := drawLine(img, p1.Point.X, p1.Point.Y, p2.Point.X, p2.Point.Y, c, width)
|
||||||
|
if isBridge {
|
||||||
|
bridgePixels = append(bridgePixels, linePoints...)
|
||||||
|
} else {
|
||||||
roadPixels = append(roadPixels, linePoints...)
|
roadPixels = append(roadPixels, linePoints...)
|
||||||
}
|
}
|
||||||
return roadPixels
|
}
|
||||||
|
return roadPixels, bridgePixels
|
||||||
}
|
}
|
||||||
|
|
||||||
func bresenhamRoad(path []image.Point) []image.Point {
|
func bresenhamRoad(path []image.Point) []image.Point {
|
||||||
|
|||||||
Reference in New Issue
Block a user