X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2Fchunk.cpp;fp=src%2Fworld%2Fchunk.cpp;h=e93966e959ce13d4678dfaa3f5870ffcade50e17;hb=ed3bdc028edc0ecb5835d1c0bf18dbc59b342daf;hp=1d120bb2ebe8d2475a4be2ac1bc4799755b8d25d;hpb=73d4dd2d78eda1e2f8889d1913a97a60cec86876;p=blank.git diff --git a/src/world/chunk.cpp b/src/world/chunk.cpp index 1d120bb..e93966e 100644 --- a/src/world/chunk.cpp +++ b/src/world/chunk.cpp @@ -29,6 +29,7 @@ constexpr int Chunk::size; Chunk::Chunk(const BlockTypeRegistry &types) noexcept : types(&types) , neighbor{0} +, gravity() , blocks{} , light{0} , generated(false) @@ -42,6 +43,7 @@ Chunk::Chunk(const BlockTypeRegistry &types) noexcept Chunk::Chunk(Chunk &&other) noexcept : types(other.types) +, gravity(std::move(other.gravity)) , generated(other.generated) , lighted(other.lighted) , position(other.position) @@ -57,6 +59,7 @@ Chunk::Chunk(Chunk &&other) noexcept Chunk &Chunk::operator =(Chunk &&other) noexcept { types = other.types; std::copy(other.neighbor, other.neighbor + sizeof(neighbor), neighbor); + gravity = std::move(other.gravity); std::copy(other.blocks, other.blocks + sizeof(blocks), blocks); std::copy(other.light, other.light + sizeof(light), light); generated = other.generated; @@ -174,6 +177,12 @@ void Chunk::SetBlock(int index, const Block &block) noexcept { blocks[index] = block; Invalidate(); + if (old_type.gravity && !new_type.gravity) { + gravity.erase(index); + } else if (new_type.gravity && !old_type.gravity) { + gravity.insert(index); + } + if (!lighted || &old_type == &new_type) return; if (new_type.luminosity > old_type.luminosity) { @@ -233,6 +242,15 @@ void Chunk::ScanLights() { lighted = true; } +void Chunk::ScanActive() { + gravity.clear(); + for (int index = 0; index < size; ++index) { + if (Type(index).gravity) { + gravity.insert(gravity.end(), index); + } + } +} + void Chunk::SetNeighbor(Block::Face face, Chunk &other) noexcept { neighbor[face] = &other; other.neighbor[Block::Opposite(face)] = this; @@ -349,6 +367,20 @@ float Chunk::GetVertexLight(const RoughLocation::Fine &pos, const BlockMesh::Pos } +glm::vec3 Chunk::GravityAt(const ExactLocation &coords) const noexcept { + glm::vec3 grav; + for (int index : gravity) { + RoughLocation::Fine block_pos(ToPos(index)); + ExactLocation block_coords(position, ToCoords(block_pos)); + // trust that block type hasn't changed + grav += Type(index).gravity->GetGravity( + coords.Difference(block_coords).Absolute(), + ToTransform(block_pos, index)); + } + return grav; +} + + bool Chunk::IsSurface(const RoughLocation::Fine &pos) const noexcept { const Block &block = BlockAt(pos); if (!Type(block).visible) {