refactor: Changed some file names and moved some files around

This commit is contained in:
Nicholas Novak 2023-12-10 19:45:29 -08:00
parent df2a128e1b
commit 2219c34c35
3 changed files with 94 additions and 89 deletions

View File

@ -4,13 +4,55 @@ import (
"github.com/Tnze/go-mc/save" "github.com/Tnze/go-mc/save"
) )
const ChunkSectionCount = 16 const (
// The number of sections per chunk. This determines the total height of the
// chunk
ChunkSectionCount = 16
// The number of blocks in a horizontal slice of a chunk
chunkSliceSize = 16 * 16
)
// `ChunkData` represents the contents of a "chunk", which is a column of voxels
// in world space
type ChunkData struct { type ChunkData struct {
Pos ChunkPos `json:"pos"` Pos ChunkPos `json:"pos"`
Sections [ChunkSectionCount]ChunkSection `json:"sections"` Sections [ChunkSectionCount]ChunkSection `json:"sections"`
} }
// `ChunkSection' is a fixed-size cube that stores the data in a chunk
type ChunkSection struct {
// The count of full blocks in the chunk
BlockCount uint `json:"block_count"`
BlockStates [16 * 16 * 16]BlockID `json:"block_states"`
}
func rem_euclid(a, b int) int {
return (a%b + b) % b
}
func IndexOfBlock(pos BlockPos) int {
baseX := rem_euclid(pos.X, 16)
baseY := rem_euclid(int(pos.Y), 16)
baseZ := rem_euclid(pos.Z, 16)
return (baseY * chunkSliceSize) + (baseZ * 16) + baseX
}
func (cs *ChunkSection) UpdateBlockAtIndex(index int, targetState BlockID) {
// TODO: Keep track of the block count
cs.BlockStates[index] = targetState
}
func (cs *ChunkSection) UpdateBlock(pos BlockPos, targetState BlockID) {
cs.BlockStates[IndexOfBlock(pos)] = targetState
}
func (cs *ChunkSection) FetchBlock(pos BlockPos) BlockID {
return cs.BlockStates[IndexOfBlock(pos)]
}
func (cd *ChunkData) SectionFor(pos BlockPos) *ChunkSection { func (cd *ChunkData) SectionFor(pos BlockPos) *ChunkSection {
return &cd.Sections[pos.Y%ChunkSectionCount] return &cd.Sections[pos.Y%ChunkSectionCount]
} }

View File

@ -1,88 +0,0 @@
package world
import (
"fmt"
"math/rand"
)
const (
// Slice size is the total number of blocks in a horizontal slice of a chunk
sliceSize = 16 * 16
)
type BlockPos struct {
X int `json:"x"`
Y uint `json:"y"`
Z int `json:"z"`
}
func (b BlockPos) String() string {
return fmt.Sprintf("BlockPos { X: %v, Y: %v, Z: %v }", b.X, b.Y, b.Z)
}
func RandomBlockPosWithRange(maxRange float64) BlockPos {
return BlockPos{
X: int(rand.NormFloat64() * maxRange),
Y: uint(rand.NormFloat64() * maxRange),
Z: int(rand.NormFloat64() * maxRange),
}
}
func (b BlockPos) ToChunkPos() ChunkPos {
return ChunkPos{
X: b.X / 16,
Z: b.Z / 16,
}
}
type ChunkPos struct {
X int `json:"x"`
Z int `json:"z"`
}
func (cp ChunkPos) ToFileName() string {
return fmt.Sprintf("p.%d.%d.chunk", cp.X, cp.Z)
}
func (cp ChunkPos) StringCoords() string {
return fmt.Sprintf("%d, %d", cp.X, cp.Z)
}
type ChunkSection struct {
// The count of full blocks in the chunk
BlockCount uint `json:"block_count"`
BlockStates [16 * 16 * 16]BlockID `json:"block_states"`
}
func rem_euclid(a, b int) int {
return (a%b + b) % b
}
func IndexOfBlock(pos BlockPos) int {
baseX := rem_euclid(pos.X, 16)
baseY := rem_euclid(int(pos.Y), 16)
baseZ := rem_euclid(pos.Z, 16)
return (baseY * sliceSize) + (baseZ * 16) + baseX
}
func (cs *ChunkSection) UpdateBlockAtIndex(index int, targetState BlockID) {
// TODO: Keep track of the block count
cs.BlockStates[index] = targetState
}
func (cs *ChunkSection) UpdateBlock(pos BlockPos, targetState BlockID) {
cs.BlockStates[IndexOfBlock(pos)] = targetState
}
func (cs *ChunkSection) FetchBlock(pos BlockPos) BlockID {
return cs.BlockStates[IndexOfBlock(pos)]
}
type BlockID uint8
const (
Empty BlockID = iota
Generic
)

51
world/world_position.go Normal file
View File

@ -0,0 +1,51 @@
package world
import (
"fmt"
"math/rand"
)
type BlockPos struct {
X int `json:"x"`
Y uint `json:"y"`
Z int `json:"z"`
}
func (b BlockPos) String() string {
return fmt.Sprintf("BlockPos { X: %v, Y: %v, Z: %v }", b.X, b.Y, b.Z)
}
func RandomBlockPosWithRange(maxRange float64) BlockPos {
return BlockPos{
X: int(rand.NormFloat64() * maxRange),
Y: uint(rand.NormFloat64() * maxRange),
Z: int(rand.NormFloat64() * maxRange),
}
}
func (b BlockPos) ToChunkPos() ChunkPos {
return ChunkPos{
X: b.X / 16,
Z: b.Z / 16,
}
}
type ChunkPos struct {
X int `json:"x"`
Z int `json:"z"`
}
func (cp ChunkPos) ToFileName() string {
return fmt.Sprintf("p.%d.%d.chunk", cp.X, cp.Z)
}
func (cp ChunkPos) StringCoords() string {
return fmt.Sprintf("%d, %d", cp.X, cp.Z)
}
type BlockID uint8
const (
Empty BlockID = iota
Generic
)