X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2Fshape.cpp;h=7422f899e856297f7ccb2f49bbbf53c2c2fa991a;hb=825f479edf9867938b6789215ad7ae6303596cba;hp=aeea644431107535c9a687ff2de73d4a69a7c35f;hpb=7bb75960dbf9bfdee9ac865384aca81791b3da5c;p=blank.git diff --git a/src/model/shape.cpp b/src/model/shape.cpp index aeea644..7422f89 100644 --- a/src/model/shape.cpp +++ b/src/model/shape.cpp @@ -59,19 +59,22 @@ void Shape::Vertices( } } -void Shape::Outline( - OutlineModel::Buffer &out, - const OutlineModel::Position &elem_offset, - OutlineModel::Index idx_offset +void Shape::Vertices( + SkyBoxModel::Buffer &out ) const { - for (const auto &pos : out_pos) { - out.vertices.emplace_back(elem_offset + pos); + for (const auto &pos : vtx_pos) { + out.vertices.emplace_back(pos); } - for (auto idx : out_idx) { - out.indices.emplace_back(idx_offset + idx); + for (auto idx : vtx_idx) { + out.indices.emplace_back(idx); } } +void Shape::Outline(OutlineModel::Buffer &out) const { + out.vertices.insert(out.vertices.end(), out_pos.begin(), out_pos.end()); + out.indices.insert(out.indices.end(), out_idx.begin(), out_idx.end()); +} + void Shape::SetShape( const EntityModel::Positions &pos, const EntityModel::Normals &nrm, @@ -403,8 +406,6 @@ StairShape::StairShape(const AABB &bb, const glm::vec2 &clip) 8, 9, 9, 11, 11, 10, 10 , 8, // top 0, 8, 4, 10, 2, 6, // verticals, btf 1, 9, 5, 11, 3, 7, - // 5, 8, 7, 10, - // 1, 9, 3, 11, }); } @@ -448,11 +449,34 @@ bool StairShape::Intersects( const glm::mat4 &M, const AABB &box, const glm::mat4 &box_M, - float &depth, + float &dist, glm::vec3 &normal ) const noexcept { - // TODO: this is wrong, but simple. so for now will have to do - return Intersection(bot, M, box, box_M, depth, normal) || Intersection(top, M, box, box_M, depth, normal); + bool top_hit, bot_hit; + float top_dist, bot_dist; + glm::vec3 top_normal, bot_normal; + + top_hit = Intersection(bot, M, box, box_M, top_dist, top_normal); + bot_hit = Intersection(top, M, box, box_M, bot_dist, bot_normal); + + if (top_hit) { + if (bot_hit && bot_dist < top_dist) { + dist = bot_dist; + normal = bot_normal; + return true; + } else { + dist = top_dist; + normal = top_normal; + return true; + } + return true; + } else if (bot_hit) { + dist = bot_dist; + normal = bot_normal; + return true; + } else { + return false; + } } }