]> git.localhorst.tv Git - blank.git/blobdiff - src/model/shape.cpp
group entity updates in as few packets as possible
[blank.git] / src / model / shape.cpp
index aeea644431107535c9a687ff2de73d4a69a7c35f..4ee5b8f24299c74163c48d5bc3c5c7b46d5ae773 100644 (file)
@@ -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;
+       }
 }
 
 }