Removed script from editor
This commit is contained in:
@@ -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");
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user