Removed script from editor

This commit is contained in:
2024-09-20 16:06:27 +03:00
parent 43c312e371
commit 9ad8bb2620
8 changed files with 336 additions and 97 deletions

View File

@@ -94,6 +94,11 @@ struct RoadLinesProcessing {
}
e = e->next();
}
}
void sort_neighbors()
{
int i;
/* sort neighbors by angle */
for (i = 0; i < (int)nodes.size(); i++) {
std::sort(
edges[i].neighbors.begin(),
@@ -110,6 +115,72 @@ struct RoadLinesProcessing {
});
}
}
/* need to find nodes too close to edge and split them */
void optimize_nodes(float maxdst)
{
int i, j, k;
for (k = 0; k < (int)nodes.size(); k++) {
const Vector3 &p = nodes[k];
Vector3 np;
float dst = Math_INF;
int n1, n2;
for (i = 0; i < (int)nodes.size(); i++) {
if (k == i)
continue;
for (j = 0; j < (int)edges[i].neighbors.size();
j++) {
const Vector3 &p1 = nodes[i];
const Vector3 &p2 =
nodes[edges[i].neighbors[j]];
const Vector3 seg[] = { p1, p2 };
Vector3 tmp = Geometry::
get_closest_point_to_segment(
p, &seg[0]);
if (tmp.is_equal_approx(p1) ||
tmp.is_equal_approx(p2))
/* edges of segment, bad */
continue;
float tmpdst =
p.distance_squared_to(tmp);
if (tmpdst > maxdst * maxdst)
continue;
if (dst > tmpdst) {
dst = tmpdst;
np = tmp;
n1 = i;
n2 = edges[i].neighbors[j];
}
}
}
if (dst <= maxdst * maxdst) {
nodes[k] = np;
edges[n2].neighbors.erase(std::remove(
edges[n2].neighbors.begin(),
edges[n2].neighbors.end(), n1));
edges[n1].neighbors.erase(std::remove(
edges[n1].neighbors.begin(),
edges[n1].neighbors.end(), n2));
if (std::find(edges[k].neighbors.begin(),
edges[k].neighbors.end(),
n1) == edges[k].neighbors.end())
edges[k].neighbors.push_back(n1);
if (std::find(edges[k].neighbors.begin(),
edges[k].neighbors.end(),
n2) == edges[k].neighbors.end())
edges[k].neighbors.push_back(n2);
if (std::find(edges[n1].neighbors.begin(),
edges[n1].neighbors.end(),
k) == edges[n1].neighbors.end())
edges[n1].neighbors.push_back(k);
if (std::find(edges[n2].neighbors.begin(),
edges[n2].neighbors.end(),
k) == edges[n2].neighbors.end())
edges[n2].neighbors.push_back(k);
print_verbose("FIXED: " + itos(k) + ": " +
String::num(dst));
}
}
}
Vector3 tangent(const Vector3 &v)
{
Vector2 rv = Vector2(v.x, v.z).tangent();
@@ -197,6 +268,7 @@ struct RoadLinesProcessing {
}
void road_setup()
{
int i, j;
RoadLinesData *rld = RoadLinesData::get_singleton();
std::vector<Vector3> road_lines_nodes;
std::unordered_map<uint32_t, std::vector<Vector3> >
@@ -207,8 +279,70 @@ struct RoadLinesProcessing {
rld->process_lines(road_lines_nodes_hash, road_lines_nodes);
create_nodes(road_lines_nodes);
create_edges();
optimize_nodes(16.0f);
sort_neighbors();
wedges.clear();
build_wedges(wedges);
ImmediateGeometry *d = rld->get_debug_node();
d->clear();
if (debug_flags & 1) {
d->begin(Mesh::PRIMITIVE_LINES);
for (i = 0; i < (int)nodes.size(); i++) {
d->set_color(Color(0.1f, 0.6f, 0.6f, 1.0f));
d->add_vertex(nodes[i]);
d->set_color(Color(0.1f, 0.6f, 0.6f, 1.0f));
d->add_vertex(nodes[i] +
Vector3(0.0f, 200.0f, 0.0f));
}
d->end();
}
if (debug_flags & 2) {
d->begin(Mesh::PRIMITIVE_LINES);
for (i = 0; i < (int)nodes.size(); i++) {
const struct edgedata &e = edges[i];
for (j = 0; j < (int)e.neighbors.size(); j++) {
int idx1 = i;
int idx2 = e.neighbors[j];
assert(idx1 != idx2);
const Vector3 &p1 =
nodes[idx1] + Vector3(0, 10, 0);
const Vector3 &p2 =
nodes[idx2] + Vector3(0, 10, 0);
d->set_color(
Color(0.1f, 0.6f, 0.6f, 1.0f));
d->add_vertex(p1);
d->set_color(
Color(0.1f, 0.6f, 0.6f, 1.0f));
d->add_vertex(p2);
}
}
d->end();
}
if (debug_flags & 4) {
d->begin(Mesh::PRIMITIVE_LINES);
for (i = 0; i < (int)nodes.size(); i++) {
std::vector<struct wedge> wedge = wedges[i];
for (j = 0; j < (int)wedge.size(); j++) {
struct wedge w = wedge[j];
Vector3 p0 = w.p[0] + Vector3(0, 20, 0);
Vector3 p1 = w.p[1] + Vector3(0, 30, 0);
Vector3 p2 = w.p[2] + Vector3(0, 40, 0);
d->set_color(
Color(0.1f, 0.6f, 0.1f, 1.0f));
d->add_vertex(p0);
d->set_color(
Color(0.1f, 0.6f, 0.1f, 1.0f));
d->add_vertex(p1);
d->set_color(
Color(0.1f, 0.6f, 0.1f, 1.0f));
d->add_vertex(p1);
d->set_color(
Color(0.1f, 0.6f, 0.1f, 1.0f));
d->add_vertex(p2);
}
}
d->end();
}
print_line("ROAD SETUP DONE");
}
};