From adf77e26610587831031a9471e17cf4d89847aca Mon Sep 17 00:00:00 2001 From: Tnze Date: Wed, 31 Mar 2021 16:00:15 +0800 Subject: [PATCH] linear palette --- examples/genmaps/genmaps.go | 11 +++-- examples/genmaps/util_funcs.go | 6 --- save/palette.go | 80 ++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 save/palette.go diff --git a/examples/genmaps/genmaps.go b/examples/genmaps/genmaps.go index 1361b17..e275f05 100644 --- a/examples/genmaps/genmaps.go +++ b/examples/genmaps/genmaps.go @@ -19,16 +19,15 @@ import ( ) var colors []color.RGBA64 -var regionWorkerNum = runtime.NumCPU() var sectionWorkerNum = 1 var ( - regionsFold = flag.String("region", filepath.Join(os.Getenv("AppData"), ".minecraft", "saves", "World", "region"), "region directory path") - drawBigPicture = flag.Bool("bigmap", true, "draw the bit map") + regionWorkerNum = flag.Int("workers", runtime.NumCPU(), "worker numbers") + regionsFold = flag.String("region", filepath.Join(os.Getenv("AppData"), ".minecraft", "saves", "World", "region"), "region directory path") + drawBigPicture = flag.Bool("bigmap", true, "draw the big map") ) func main() { - flag.Usage = usage flag.Parse() de, err := os.ReadDir(*regionsFold) @@ -61,7 +60,7 @@ func main() { *region.Region } // Open mca files - var rs = make(chan regions, regionWorkerNum) + var rs = make(chan regions, *regionWorkerNum) go func() { for _, dir := range de { name := dir.Name() @@ -95,7 +94,7 @@ func main() { } c := make(chan task) var wg sync.WaitGroup - for i := 0; i < regionWorkerNum; i++ { + for i := 0; i < *regionWorkerNum; i++ { go func() { var column save.Column for task := range c { diff --git a/examples/genmaps/util_funcs.go b/examples/genmaps/util_funcs.go index b2c4da3..4165ea2 100644 --- a/examples/genmaps/util_funcs.go +++ b/examples/genmaps/util_funcs.go @@ -4,7 +4,6 @@ import ( "bytes" _ "embed" "encoding/gob" - "fmt" "github.com/Tnze/go-mc/data/block" "image" "image/png" @@ -37,11 +36,6 @@ func init() { } } -func usage() { - _, _ = fmt.Fprintf(os.Stderr, "usage: %s [-region ] \n", os.Args[0]) - os.Exit(1) -} - func mkmax(c, n *int) { if *c < *n { *c = *n diff --git a/save/palette.go b/save/palette.go new file mode 100644 index 0000000..3552633 --- /dev/null +++ b/save/palette.go @@ -0,0 +1,80 @@ +package save + +import ( + "github.com/Tnze/go-mc/nbt" + pk "github.com/Tnze/go-mc/net/packet" + "io" +) + +type BlockState interface { +} + +type palette interface { + id(v BlockState) int + value(i int) BlockState + io.ReaderFrom + io.WriterTo + read(r nbt.DecoderReader) (int, error) +} + +type linearPalette struct { + onResize func(n int, v BlockState) int + sToID map[BlockState]int + idTos map[int]BlockState + values []BlockState + bits int +} + +func (l *linearPalette) id(v BlockState) int { + for i, t := range l.values { + if t == v { + return i + } + } + if cap(l.values)-len(l.values) > 0 { + l.values = append(l.values, v) + return len(l.values) - 1 + } + return l.onResize(l.bits+1, v) +} + +func (l *linearPalette) value(i int) BlockState { + if i >= 0 && i < len(l.values) { + return l.values[i] + } + return nil +} + +func (l *linearPalette) ReadFrom(r io.Reader) (n int64, err error) { + var size, value pk.VarInt + if n, err = size.ReadFrom(r); err != nil { + return + } + for i := 0; i < int(size); i++ { + if nn, err := value.ReadFrom(r); err != nil { + return n + nn, err + } else { + n += nn + } + l.values[i] = l.idTos[int(value)] + } + return +} + +func (l *linearPalette) WriteTo(w io.Writer) (n int64, err error) { + if n, err = pk.VarInt(len(l.values)).WriteTo(w); err != nil { + return + } + for _, v := range l.values { + if nn, err := pk.VarInt(l.sToID[v]).WriteTo(w); err != nil { + return n + nn, err + } else { + n += nn + } + } + return +} + +func (l *linearPalette) read(r nbt.DecoderReader) (int, error) { + panic("not implemented yet") +}