diff --git a/modules/world/road_grid.cpp b/modules/world/road_grid.cpp index 0214214..1934529 100644 --- a/modules/world/road_grid.cpp +++ b/modules/world/road_grid.cpp @@ -314,7 +314,7 @@ void RoadGrid::build(Ref curve, Ref noise) if (min_height > y) min_height = y; } - map_sites.write[i].avg_height = min_height * 0.4f + max_height * 0.6f; + map_sites.write[i].avg_height = min_height * 0.7f + max_height * 0.3f; } generate_building_positions(); printf("building 3rd dimention done\n"); diff --git a/modules/world/road_grid.h b/modules/world/road_grid.h index 402030e..a35ce0f 100644 --- a/modules/world/road_grid.h +++ b/modules/world/road_grid.h @@ -272,5 +272,62 @@ public: { return map_sites[site].pos; } + HashMap > polygon_cache_2d; + inline PoolVector get_site_polygon_2d(int site) + { + if (polygon_cache_2d.has(site)) + return polygon_cache_2d[site]; + int count = 0, i; + int psize = map_sites[site].polygon_ind.size(); + PoolVector polygon; + polygon.resize(psize); + int prev = -1; + for (i = 0; i < psize; i++) { + int idx = map_sites[site].polygon_ind[i]; + if (idx == prev) + continue; + polygon.write()[count++] = diagram_vertices[idx]; + prev = idx; + } + polygon.resize(count); + polygon_cache_2d[site] = polygon; + return polygon; + } + HashMap > polygon_cache_3d; + inline PoolVector get_site_polygon_3d(int site) + { + if (polygon_cache_3d.has(site)) + return polygon_cache_3d[site]; + int count = 0, i; + int psize = map_sites[site].polygon_ind.size(); + PoolVector polygon; + polygon.resize(psize); + int prev = -1; + for (i = 0; i < psize; i++) { + int idx = map_sites[site].polygon_ind[i]; + if (idx == prev) + continue; + polygon.write()[count++] = vertices[idx]; + prev = idx; + } + polygon.resize(count); + polygon_cache_3d[site] = polygon; + return polygon; + } + inline PoolVector get_here_sites(const Vector3 &position) + { + PoolVector ret; + int i; + Rect2i xpos; + xpos.position = Vector2i((int)position.x, (int)position.z); + xpos.grow(300); + for (i = 0; i < map_sites.size(); i++) { + if (xpos.intersects(map_sites[i].rect)) + ret.push_back(i); + if (xpos.encloses(map_sites[i].rect)) + ret.push_back(i); + } + return ret; + } }; #endif diff --git a/modules/world/roads.cpp b/modules/world/roads.cpp index 26b29fc..c562662 100644 --- a/modules/world/roads.cpp +++ b/modules/world/roads.cpp @@ -480,6 +480,10 @@ void RoadsData::_bind_methods() ClassDB::bind_method(D_METHOD("get_road_grid"), &RoadsData::get_road_grid); ClassDB::bind_method(D_METHOD("get_sdf", "x", "y", "z"), &RoadsData::get_sdf); ClassDB::bind_method(D_METHOD("get_site_pos", "site"), &RoadsData::get_site_pos); + ClassDB::bind_method(D_METHOD("get_site_polygon_2d", "site"), &RoadsData::get_site_polygon_2d); + ClassDB::bind_method(D_METHOD("get_site_polygon_3d", "site"), &RoadsData::get_site_polygon_3d); + ClassDB::bind_method(D_METHOD("get_here_sites", "site"), &RoadsData::get_here_sites); + ClassDB::bind_method(D_METHOD("get_site_avg_height", "site"), &RoadsData::get_site_avg_height); } void RoadsData::set_noise(Ref noise) { @@ -516,7 +520,7 @@ float RoadsData::get_sdf(int x, int y, int z) int site = rg->get_site_from_point(x, z); // printf("in site %d %d %d\n", site, rg->site_is_town(site), rg->site_is_farm(site)); if (site >= 0 && (rg->site_is_town(site) || rg->site_is_farm(site))) { - ret = y - rg->get_site_avg_height(site); + ret = y - rg->get_site_avg_height(site) - CLAMP(n * 0.1f, -0.5f, 0.5f); goto out; } } @@ -530,3 +534,17 @@ Vector2 RoadsData::get_site_pos(int site) return rg->get_site_pos(site); } +PoolVector RoadsData::get_site_polygon_2d(int site) +{ + return rg->get_site_polygon_2d(site); +} + +PoolVector RoadsData::get_site_polygon_3d(int site) +{ + return rg->get_site_polygon_3d(site); +} + +PoolVector RoadsData::get_here_sites(const Vector3 &position) +{ + return rg->get_here_sites(position); +} diff --git a/modules/world/roads.h b/modules/world/roads.h index 17358b1..a8bb09d 100644 --- a/modules/world/roads.h +++ b/modules/world/roads.h @@ -97,5 +97,12 @@ public: void set_curve(Ref curve); float get_sdf(int x, int y, int z); Vector2 get_site_pos(int site); + PoolVector get_site_polygon_2d(int site); + PoolVector get_site_polygon_3d(int site); + PoolVector get_here_sites(const Vector3 &pos); + inline float get_site_avg_height(int site) + { + return rg->get_site_avg_height(site); + } };