}
}
}
- work_light();
}
}
if (&old_type == &new_type) return;
- if (new_type.luminosity > 0) {
- if (GetLight(index) < new_type.luminosity) {
- SetLight(index, new_type.luminosity);
- light_queue.emplace(this, ToPos(index));
- work_light();
- }
- } else if (new_type.block_light && GetLight(index) != 0) {
+ if (new_type.luminosity > old_type.luminosity) {
+ // light added
+ SetLight(index, new_type.luminosity);
+ light_queue.emplace(this, ToPos(index));
+ work_light();
+ } else if (new_type.luminosity < old_type.luminosity) {
+ // light removed
+ dark_queue.emplace(this, ToPos(index));
SetLight(index, 0);
+ work_dark();
+ SetLight(index, new_type.luminosity);
+ light_queue.emplace(this, ToPos(index));
+ work_light();
+ } else if (new_type.block_light && !old_type.block_light) {
+ // obstacle added
dark_queue.emplace(this, ToPos(index));
+ SetLight(index, 0);
work_dark();
- } else if (old_type.block_light && !new_type.block_light) {
+ work_light();
+ } else if (!new_type.block_light && old_type.block_light) {
+ // obstacle removed
int level = 0;
for (int face = 0; face < Block::FACE_COUNT; ++face) {
Pos next_pos(ToPos(index) + Block::FaceNormal(Block::Face(face)));
}
+bool Chunk::IsSurface(const Pos &pos) const {
+ const Block &block = BlockAt(pos);
+ if (!Type(block).visible) {
+ return false;
+ }
+ for (int face = 0; face < Block::FACE_COUNT; ++face) {
+ const Block *next = FindNext(pos, Block::Face(face));
+ if (!next || !Type(*next).visible) {
+ return true;
+ }
+ }
+ return false;
+}
+
+
void Chunk::Allocate() {
blocks.resize(Size(), Block(0));
light.resize(Size(), 0);
}
-ChunkLoader::ChunkLoader(const BlockTypeRegistry ®, const Generator &gen)
+ChunkLoader::ChunkLoader(const Config &config, const BlockTypeRegistry ®, const Generator &gen)
: base(0, 0, 0)
, reg(reg)
, gen(gen)
, loaded()
, to_generate()
, to_free()
-, load_dist(4)
-, unload_dist(5) {
+, load_dist(config.load_dist)
+, unload_dist(config.unload_dist) {
}
}
}
// add missing new chunks
+ GenerateSurrounding(base);
+}
+
+void ChunkLoader::GenerateSurrounding(const Chunk::Pos &pos) {
const Chunk::Pos offset(load_dist, load_dist, load_dist);
- Generate(base - offset, base + offset);
+ Generate(pos - offset, pos + offset);
}
void ChunkLoader::Update() {