X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fchunk.cpp;h=14930863ed1c38063fc2e919563dae0f5c7d1a6b;hb=b4995967309bf5570161db2287e27b84ca94ab9a;hp=bed947e3d5fdfff7182056313a30667ad9996edb;hpb=f932e8c0273794bcd954c9f5b504bad6140f7cf4;p=blank.git diff --git a/src/chunk.cpp b/src/chunk.cpp index bed947e..1493086 100644 --- a/src/chunk.cpp +++ b/src/chunk.cpp @@ -82,8 +82,7 @@ bool Chunk::Intersection( } float cur_dist; glm::vec3 cur_norm; - Block::Pos pos(float(x) + 0.5f, float(y) + 0.5f, float(z) + 0.5f); - if (Type(blocks[id]).shape->Intersects(ray, glm::translate(M, pos), cur_dist, cur_norm)) { + if (Type(blocks[id]).shape->Intersects(ray, M * ToTransform(id), cur_dist, cur_norm)) { if (cur_dist < closest_dist) { closest_id = id; closest_dist = cur_dist; @@ -137,8 +136,10 @@ void Chunk::Update() { Model::Index vtx_counter = 0; for (size_t i = 0; i < Size(); ++i) { + if (Obstructed(i)) continue; + const BlockType &type = Type(blocks[i]); - type.FillModel(buf, ToCoords(i), vtx_counter); + type.FillModel(buf, ToTransform(i), vtx_counter); vtx_counter += type.shape->VertexCount(); } @@ -146,6 +147,38 @@ void Chunk::Update() { dirty = false; } +bool Chunk::Obstructed(int idx) const { + if (IsBorder(idx)) return false; + + // not checking neighbor visibility here, so all + // invisible blocks must have their fill set to 6x false + // (the default, so should be okay) + + const BlockType &right = Type(blocks[idx + 1]); + if (!right.fill.left) return false; + + const BlockType &left = Type(blocks[idx - 1]); + if (!left.fill.right) return false; + + const BlockType &top = Type(blocks[idx + Width()]); + if (!top.fill.bottom) return false; + + const BlockType &bottom = Type(blocks[idx - Width()]); + if (!bottom.fill.top) return false; + + const BlockType &front = Type(blocks[idx + Width() * Height()]); + if (!front.fill.back) return false; + + const BlockType &back = Type(blocks[idx - Width() * Height()]); + if (!back.fill.front) return false; + + return true; +} + +glm::mat4 Chunk::ToTransform(int idx) const { + return glm::translate(glm::mat4(1.0f), ToCoords(idx)) * blocks[idx].Transform(); +} + ChunkLoader::ChunkLoader(const BlockTypeRegistry ®, const Generator &gen) : base(0, 0, 0)