X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2Fshape.cpp;h=4ee5b8f24299c74163c48d5bc3c5c7b46d5ae773;hb=8fdc24f0b3fb287f5d4e1c7d1f85ad85d5ed2414;hp=aeea644431107535c9a687ff2de73d4a69a7c35f;hpb=7bb75960dbf9bfdee9ac865384aca81791b3da5c;p=blank.git diff --git a/src/model/shape.cpp b/src/model/shape.cpp index aeea644..4ee5b8f 100644 --- a/src/model/shape.cpp +++ b/src/model/shape.cpp @@ -59,17 +59,9 @@ void Shape::Vertices( } } -void Shape::Outline( - OutlineModel::Buffer &out, - const OutlineModel::Position &elem_offset, - OutlineModel::Index idx_offset -) const { - for (const auto &pos : out_pos) { - out.vertices.emplace_back(elem_offset + pos); - } - for (auto idx : out_idx) { - out.indices.emplace_back(idx_offset + 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( @@ -403,8 +395,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 +438,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; + } } }