Updated godot, voxel module; fixed spawners; added C++ border and radial points calculation
This commit is contained in:
@@ -528,6 +528,7 @@ void RoadGrid::generate_3d_vertices(Ref<Curve> curve, Ref<FastNoiseLite> noise)
|
||||
d = CLAMP(d, 1.0f, 30.0f);
|
||||
diagram_vertex_heights.write[i] = d;
|
||||
}
|
||||
#if 0
|
||||
for (j = 0; j < 3; j++) {
|
||||
for (i = 0; i < map_hedges.size(); i++) {
|
||||
int x1 = map_hedges[i]->a;
|
||||
@@ -538,12 +539,51 @@ void RoadGrid::generate_3d_vertices(Ref<Curve> curve, Ref<FastNoiseLite> noise)
|
||||
diagram_vertex_heights.write[x2] = diagram_vertex_heights[x1] + dh / fabsf(dh) * 0.01f * xd;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
vertices.resize(get_diagram_vertex_count());
|
||||
for (i = 0; i < vertices.size(); i++) {
|
||||
vertices.write()[i].x = diagram_vertices[i].x;
|
||||
vertices.write()[i].y = diagram_vertex_heights[i];
|
||||
vertices.write()[i].z = diagram_vertices[i].y;
|
||||
}
|
||||
smooth_heights();
|
||||
}
|
||||
|
||||
void RoadGrid::smooth_heights()
|
||||
{
|
||||
int i;
|
||||
float ok = true;
|
||||
while (ok) {
|
||||
for (i = 0; i < map_hedges.size(); i++) {
|
||||
int a = map_hedges[i]->a;
|
||||
int b = map_hedges[i]->b;
|
||||
Vector3 p1 = vertices[a];
|
||||
Vector3 p2 = vertices[b];
|
||||
float dst = p1.distance_to(p2);
|
||||
float h = fabsf(p2.y - p1.y);
|
||||
if (dst <= 48.0f && h > 0.0f) {
|
||||
ok = false;
|
||||
float m = (p1.y + p2.y) * 0.5f;
|
||||
m = CLAMP(m, 0.0f, 70.0f);
|
||||
p1.y = m;
|
||||
p2.y = m;
|
||||
} else if (h > 0.0f) {
|
||||
ok = false;
|
||||
float t = h / dst;
|
||||
if (t > 0.35) {
|
||||
ok = false;
|
||||
float m1 = p1.y + (p2.y - p1.y) / 10.0f;
|
||||
float m2 = p2.y + (p1.y - p2.y) / 10.0f;
|
||||
p1.y = m1;
|
||||
p2.y = m2;
|
||||
}
|
||||
}
|
||||
if (!ok) {
|
||||
vertices.write()[map_hedges[i]->a] = p1;
|
||||
vertices.write()[map_hedges[i]->b] = p2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RoadGrid::generate_building_positions()
|
||||
@@ -680,6 +720,7 @@ void RoadGrid::save_json(const String &path)
|
||||
f->close();
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
PoolVector<Vector3> RoadGrid::get_site_border(int site)
|
||||
{
|
||||
const struct map_site &msite = map_sites[site];
|
||||
@@ -716,4 +757,73 @@ PoolVector<Vector3> RoadGrid::get_site_border(int site)
|
||||
assert(msite.polygon_ind.size() == ret.size());
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
PoolVector<Vector3> RoadGrid::get_site_border(int site, float offt)
|
||||
{
|
||||
int k, i;
|
||||
float height = get_site_avg_height(site);
|
||||
PoolVector<Vector3> border;
|
||||
PoolVector<Vector3> poly = get_site_polygon_3d(site);
|
||||
if (poly.size() == 0)
|
||||
return PoolVector<Vector3>();
|
||||
border.resize(poly.size());
|
||||
for (k = 0; k < poly.size(); k++) {
|
||||
i = k - 1;
|
||||
if (i < 0)
|
||||
i += poly.size();
|
||||
Vector3 p1 = poly[i];
|
||||
Vector3 p2 = poly[k];
|
||||
Vector3 p3 = poly[(k + 1) % poly.size()];
|
||||
Vector2 p1x(p1.x, p1.z);
|
||||
Vector2 p2x(p2.x, p2.z);
|
||||
Vector2 p3x(p2.x, p2.z);
|
||||
Vector2 p4x(p3.x, p3.z);
|
||||
Vector2 n1 = (p2x - p1x).tangent().normalized();
|
||||
Vector2 n2 = (p4x - p3x).tangent().normalized();
|
||||
p1x -= n1 * offt;
|
||||
p2x -= n1 * offt;
|
||||
p3x -= n2 * offt;
|
||||
p4x -= n2 * offt;
|
||||
Vector2 xp;
|
||||
if (!Geometry::segment_intersects_segment_2d(p1x, p2x, p3x, p4x, &xp))
|
||||
xp = p2x.linear_interpolate(p3x, 0.5) - (n1 + n2).normalized() * offt;
|
||||
Vector3 tp(xp.x, height, xp.y);
|
||||
border.write()[k] = tp;
|
||||
}
|
||||
return border;
|
||||
}
|
||||
|
||||
PoolVector<Vector3> RoadGrid::get_site_radial_points(int site, float bofft, float offt)
|
||||
{
|
||||
int i;
|
||||
float height = get_site_avg_height(site), max_r = 0.0f;
|
||||
PoolVector<Vector3> poly = get_site_border(site, bofft);
|
||||
PoolVector<Vector3> ret;
|
||||
if (poly.size() == 0)
|
||||
return PoolVector<Vector3>();
|
||||
List<Vector3> rpoints;
|
||||
List<Vector3>::Element *e;
|
||||
Vector3 center;
|
||||
for (i = 0; i < poly.size(); i++)
|
||||
center += poly[i];
|
||||
center /= poly.size();
|
||||
for (i = 0; i < poly.size(); i++) {
|
||||
Vector3 ep1 = poly[i];
|
||||
Vector3 ep2 = poly[(i + 1) % poly.size()];
|
||||
Vector3 d = (ep2 - ep1).normalized();
|
||||
rpoints.push_back(ep1);
|
||||
float dst = ep1.distance_to(ep2);
|
||||
while (dst > offt) {
|
||||
ep1 += d * offt;
|
||||
rpoints.push_back(ep1);
|
||||
dst -= offt;
|
||||
}
|
||||
}
|
||||
ret.resize(rpoints.size());
|
||||
i = 0;
|
||||
for (e = rpoints.front(); e; e = e->next())
|
||||
ret.write()[i++] = e->get();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user