mirror of
				https://bitbucket.org/s_l_teichmann/mtsatellite
				synced 2025-10-31 08:05:27 +01:00 
			
		
		
		
	mtseeder: Make base level generator use the BaseTileCreator, too.
This commit is contained in:
		| @@ -5,11 +5,10 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"image/color" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"strconv" | ||||
| 	"sync" | ||||
|  | ||||
| 	"bitbucket.org/s_l_teichmann/mtredisalize/common" | ||||
| @@ -22,124 +21,20 @@ const ( | ||||
| 	yOrderCapacity = 512 | ||||
| ) | ||||
|  | ||||
| // To scan the whole height in terms of the y coordinate | ||||
| // the database is queried in height units defined in the yRanges table. | ||||
| var yRanges = [][]int16{ | ||||
| 	{1024, 1934}, | ||||
| 	{256, 1023}, | ||||
| 	{128, 255}, | ||||
| 	{64, 127}, | ||||
| 	{32, 63}, | ||||
| 	{16, 31}, | ||||
| 	{8, 15}, | ||||
| 	{4, 7}, | ||||
| 	{2, 3}, | ||||
| 	{0, 1}, | ||||
| 	{-1, 0}, | ||||
| 	{-4, -2}, | ||||
| 	{-8, -5}, | ||||
| 	{-16, -9}, | ||||
| 	{-32, -17}, | ||||
| 	{-64, -33}, | ||||
| 	{-128, -65}, | ||||
| 	{-256, -129}, | ||||
| 	{-1024, -257}, | ||||
| 	{-1936, -1025}} | ||||
|  | ||||
| type blockPos struct { | ||||
| 	x, z int16 | ||||
| 	j, i int | ||||
| } | ||||
|  | ||||
| type baseLevelWorker struct { | ||||
| 	client   *common.RedisClient | ||||
| 	colors   *common.Colors | ||||
| 	renderer *common.Renderer | ||||
| 	yOrder   *common.YOrder | ||||
| 	baseDir  string | ||||
| } | ||||
| func createTiles( | ||||
| 	btc *common.BaseTileCreator, | ||||
| 	jobs chan blockPos, | ||||
| 	done *sync.WaitGroup) { | ||||
|  | ||||
| func newBaseLevelWorker(client *common.RedisClient, | ||||
| 	colors *common.Colors, baseDir string) *baseLevelWorker { | ||||
| 	renderer := common.NewRenderer(width, height) | ||||
| 	return &baseLevelWorker{ | ||||
| 		client:   client, | ||||
| 		colors:   colors, | ||||
| 		baseDir:  baseDir, | ||||
| 		renderer: renderer, | ||||
| 		yOrder:   common.NewYOrder(renderer, yOrderCapacity)} | ||||
| } | ||||
|  | ||||
| func (blw *baseLevelWorker) close() error { | ||||
| 	return blw.client.Close() | ||||
| } | ||||
|  | ||||
| func (blw *baseLevelWorker) createTile(x, z int16, i, j int) { | ||||
| 	blw.renderer.Reset() | ||||
| 	blw.renderer.SetPos(x, z) | ||||
| 	blw.yOrder.Reset() | ||||
|  | ||||
| 	drawBlock := func(block *common.Block) { | ||||
| 		if err := blw.yOrder.RenderBlock(block, blw.colors.NameIndex); err != nil { | ||||
| 			log.Printf("WARN: rendering block failed: %s", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	var c1, c2 common.Coord | ||||
|  | ||||
| 	nareas := make([]common.Area, 0, width*height/2) | ||||
| 	oareas := make([]common.Area, 1, width*height/2) | ||||
|  | ||||
| 	oareas[0] = common.Area{ | ||||
| 		X1: 0, Z1: 0, | ||||
| 		X2: int16(width) - 1, Z2: int16(height) - 1} | ||||
|  | ||||
| 	var err error | ||||
|  | ||||
| 	for _, yRange := range yRanges { | ||||
| 		c1.Y = yRange[0] | ||||
| 		c2.Y = yRange[1] | ||||
|  | ||||
| 		nareas = blw.renderer.UncoveredAreas(nareas, oareas) | ||||
|  | ||||
| 		if len(nareas) == 0 { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		for _, area := range nareas { | ||||
| 			c1.X = area.X1 + x | ||||
| 			c1.Z = area.Z1 + z | ||||
| 			c2.X = area.X2 + x | ||||
| 			c2.Z = area.Z2 + z | ||||
| 			query := common.Cuboid{P1: c1, P2: c2} | ||||
| 			if err = blw.client.QueryCuboid(query, drawBlock); err != nil { | ||||
| 				log.Printf("WARN: query failed: %s", err) | ||||
| 				return | ||||
| 			} | ||||
| 			if err = blw.yOrder.Drain(blw.colors.NameIndex); err != nil { | ||||
| 				log.Printf("WARN: rendering block failed: %s", err) | ||||
| 			} | ||||
| 		} | ||||
| 		oareas, nareas = nareas, oareas[0:0] | ||||
| 	} | ||||
|  | ||||
| 	image := blw.renderer.CreateShadedImage( | ||||
| 		16, 16, (width-2)*16, (height-2)*16, | ||||
| 		blw.colors.Colors, color.RGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff}) | ||||
|  | ||||
| 	path := filepath.Join(blw.baseDir, fmt.Sprintf("%d", i), fmt.Sprintf("%d.png", j)) | ||||
|  | ||||
| 	log.Printf("Writing (%d, %d) (%d, %d)", i, j, x, z) | ||||
|  | ||||
| 	if err = common.SaveAsPNG(path, image); err != nil { | ||||
| 		log.Fatalf("writing image failed: %s", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (blw *baseLevelWorker) run(jobs chan blockPos, done *sync.WaitGroup) { | ||||
| 	defer done.Done() | ||||
| 	defer btc.Close() | ||||
| 	for job := range jobs { | ||||
| 		blw.createTile(job.x-1, job.z-1, job.i, job.j) | ||||
| 		btc.CreateTile(job.x-1, job.z-1, job.i, job.j) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -176,15 +71,14 @@ func createBaseLevel( | ||||
| 			return | ||||
| 		} | ||||
| 		done.Add(1) | ||||
| 		blw := newBaseLevelWorker(client, colors, baseDir) | ||||
| 		defer blw.close() | ||||
| 		go blw.run(jobs, &done) | ||||
| 		btc := common.NewBaseTileCreator(client, colors, baseDir, false) | ||||
| 		go createTiles(btc, jobs, &done) | ||||
| 	} | ||||
|  | ||||
| 	zMin, zMax = order(zMin, zMax) | ||||
|  | ||||
| 	for x, i := int16(xMin), 0; x <= int16(xMax); x += 16 { | ||||
| 		xDir := filepath.Join(baseDir, fmt.Sprintf("%d", i)) | ||||
| 		xDir := filepath.Join(baseDir, strconv.Itoa(i)) | ||||
| 		log.Printf("creating dir: %s", xDir) | ||||
| 		if err = os.MkdirAll(xDir, os.ModePerm); err != nil { | ||||
| 			log.Fatalf("Cannot create directory '%s': %s", xDir, err) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user