X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fchunk.cpp;h=ae13aec24c4e6de4de2d6e429dcf662bcb98a9d3;hb=75e72685a7398d2e30d51fadeaacde849518e188;hp=4cabcecf040e17784ac86b2e0d5c869949d63c34;hpb=30d36f3d545617faef76f90c4121d6ed118ba272;p=blank.git diff --git a/src/chunk.cpp b/src/chunk.cpp index 4cabcec..ae13aec 100644 --- a/src/chunk.cpp +++ b/src/chunk.cpp @@ -56,24 +56,14 @@ void Chunk::Draw() { bool Chunk::Intersection( const Ray &ray, const glm::mat4 &M, - int *blkid, - float *dist, - glm::vec3 *normal) const { - { // rough check - if (!blank::Intersection(ray, Bounds(), M)) { - return false; - } - } - - if (!blkid && !dist && !normal) { - return true; - } - + int &blkid, + float &dist, + glm::vec3 &normal +) const { // TODO: should be possible to heavily optimize this int id = 0; - int closest_id = -1; - float closest_dist = std::numeric_limits::infinity(); - glm::vec3 closest_normal(0, 1, 0); + blkid = -1; + dist = std::numeric_limits::infinity(); for (int z = 0; z < Depth(); ++z) { for (int y = 0; y < Height(); ++y) { for (int x = 0; x < Width(); ++x, ++id) { @@ -83,30 +73,22 @@ bool Chunk::Intersection( float cur_dist; glm::vec3 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; - closest_normal = cur_norm; + if (cur_dist < dist) { + blkid = id; + dist = cur_dist; + normal = cur_norm; } } } } } - if (closest_id < 0) { + if (blkid < 0) { return false; + } else { + normal = glm::vec3(BlockAt(blkid).Transform() * glm::vec4(normal, 0.0f)); + return true; } - - if (blkid) { - *blkid = closest_id; - } - if (dist) { - *dist = closest_dist; - } - if (normal) { - *normal = closest_normal; - } - return true; } void Chunk::Position(const Pos &pos) { @@ -154,23 +136,23 @@ bool Chunk::Obstructed(int idx) const { // 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 Block &right = blocks[idx + 1]; + if (!Type(right).FaceFilled(right, Block::FACE_LEFT)) return false; - const BlockType &left = Type(blocks[idx - 1]); - if (!left.fill.right) return false; + const Block &left = blocks[idx - 1]; + if (!Type(left).FaceFilled(left, Block::FACE_RIGHT)) return false; - const BlockType &up = Type(blocks[idx + Width()]); - if (!up.fill.down) return false; + const Block &up = blocks[idx + Width()]; + if (!Type(up).FaceFilled(up, Block::FACE_DOWN)) return false; - const BlockType &down = Type(blocks[idx - Width()]); - if (!down.fill.up) return false; + const Block &down = blocks[idx - Width()]; + if (!Type(down).FaceFilled(down, Block::FACE_UP)) return false; - const BlockType &front = Type(blocks[idx + Width() * Height()]); - if (!front.fill.back) return false; + const Block &front = blocks[idx + Width() * Height()]; + if (!Type(front).FaceFilled(front, Block::FACE_BACK)) return false; - const BlockType &back = Type(blocks[idx - Width() * Height()]); - if (!back.fill.front) return false; + const Block &back = blocks[idx - Width() * Height()]; + if (!Type(back).FaceFilled(back, Block::FACE_FRONT)) return false; return true; }