Subsectors can now be properly joined

This commit is contained in:
KP 2024-07-28 16:09:27 -05:00
parent c4620539e1
commit 2f6a6fcbfe
2 changed files with 1005 additions and 121 deletions

File diff suppressed because it is too large Load diff

View file

@ -101,7 +101,7 @@ void Map::BuildFlat(Sector& sector, Flat& flat, bool invert)
invert ^= 1;
std::vector<c2t::Point> steiner_points;
for (const auto& st: flat.steiner_points)
for (const auto& st : flat.steiner_points)
steiner_points.emplace_back(st.x, st.z);
std::vector<std::vector<c2t::Point>> subsector_polygons;
@ -125,9 +125,13 @@ void Map::BuildFlat(Sector& sector, Flat& flat, bool invert)
l.textures[TEX_FRONT] = nullptr;
l.flags = Wall::FLAG_OPENING | Wall::FLAG_SUBSECTOR_OPENING;
l.portal = &sector;
// flat.steiner_points.push_back({ l.start.x, flat.base_height, l.start.y });
//s->floor.steiner_points.push_back({ l.start.x, s->floor.base_height, l.start.y });
//s->ceiling.steiner_points.push_back({ l.start.x, s->ceiling.base_height, l.start.y });
}
if (l.flags & Wall::FLAG_SUBSECTOR_OPENING)
{
steiner_points.push_back({ l.start.x, l.start.y });
// s->floor.steiner_points.push_back({ l.start.x, s->floor.base_height, l.start.y });
// s->ceiling.steiner_points.push_back({ l.start.x, s->ceiling.base_height, l.start.y });
}
}
ss.push_back({l.start.x, l.start.y});
@ -214,6 +218,10 @@ void Map::BuildQuad(Sector& sector, Wall& wall, Flat& flat_top, Flat& flat_botto
if (sector.inverted)
flip ^= 1;
// Debug: remove all triangulated data (no terrain/slope support)
//flat_top.triangulated_data.clear();
//flat_bottom.triangulated_data.clear();
std::vector<Vec2> points;
for (const Vertex3D& v: flat_bottom.triangulated_data)
{
@ -222,9 +230,16 @@ void Map::BuildQuad(Sector& sector, Wall& wall, Flat& flat_top, Flat& flat_botto
Vec2 mpos = {Distance({v.position.x, v.position.z}, {pos_a.x, pos_a.z}), v.position.y};
points.push_back(mpos);
}
// if (!points.empty())
if (!FloatCmp(points.back().x, Distance({ pos_a.x, pos_a.z }, {pos_b.x, pos_b.z}), E))
points.push_back({ Distance({ pos_a.x, pos_a.z }, {pos_b.x, pos_b.z}), flat_bottom.base_height});
if (!points.empty())
{
//if (!FloatCmp(points.back().x, Distance({ pos_a.x, pos_a.z }, { pos_b.x, pos_b.z }), E) && !FloatCmp(points.back().y, flat_bottom.base_height, E))
// points.push_back({ Distance({ pos_a.x, pos_a.z }, {pos_b.x, pos_b.z}), flat_bottom.base_height });
}
else
{
points.push_back({0.0f, flat_bottom.base_height});
points.push_back({Distance({pos_a.x, pos_a.z}, {pos_b.x, pos_b.z}), flat_bottom.base_height});
}
//if (points.empty())
// points.push_back({ 0.0f, flat_bottom.base_height });
std::vector<Vec2> top_points;
@ -235,9 +250,16 @@ void Map::BuildQuad(Sector& sector, Wall& wall, Flat& flat_top, Flat& flat_botto
Vec2 mpos = {Distance({v.position.x, v.position.z}, {pos_a.x, pos_a.z}), v.position.y};
top_points.push_back(mpos);
}
// if (!top_points.empty())
if (!FloatCmp(top_points.back().x, 0.0f, E))
if (!top_points.empty())
{
//if (!FloatCmp(top_points.back().x, 0.0f, E) && !FloatCmp(top_points.back().y, flat_top.base_height, E))
// top_points.push_back({ 0.0f, flat_top.base_height });
}
else
{
top_points.push_back({ Distance({pos_a.x, pos_a.z}, {pos_b.x, pos_b.z}), flat_top.base_height });
top_points.push_back({ 0.0f, flat_top.base_height });
}
// if (top_points.empty())
// top_points.push_back({Distance({0.0f, 0.0f}, {pos_b.x - pos_a.x, pos_b.z - pos_a.x}), flat_top.base_height});
std::sort(points.begin(), points.end(), [&](Vec2 a, Vec2 b) { return a.x < b.x; });