From 8a5e9e0186537f9f91f200a6d8adb357881d811b Mon Sep 17 00:00:00 2001 From: Segey Lapin Date: Sun, 24 Oct 2021 02:20:15 +0300 Subject: [PATCH] Separated setup code --- modules/world/road_grid.cpp | 3 +- modules/world/road_grid.h | 27 +++++++------ modules/world/roads.cpp | 76 ++++++++++++++++++++++++++----------- modules/world/roads.h | 14 +++++-- 4 files changed, 80 insertions(+), 40 deletions(-) diff --git a/modules/world/road_grid.cpp b/modules/world/road_grid.cpp index 96542ca..a9ad6df 100644 --- a/modules/world/road_grid.cpp +++ b/modules/world/road_grid.cpp @@ -624,7 +624,7 @@ static Dictionary map_site2dict(const struct map_site *ms) ret["avg_height"] = ms->avg_height; return ret; } -static Dictionary vshape2dict(const struct RoadGrid::vshape *v) +static Dictionary vshape2dict(const struct vshape *v) { Dictionary ret; ret["area"] = var2str(v->area); @@ -680,4 +680,3 @@ void RoadGrid::save_json(const String &path) } } - diff --git a/modules/world/road_grid.h b/modules/world/road_grid.h index a781131..559a38c 100644 --- a/modules/world/road_grid.h +++ b/modules/world/road_grid.h @@ -69,6 +69,22 @@ struct half_edge { float depth; float length; }; +struct vshape { + AABB area; + int instance; + int e1, e2; + int site; + Vector3 p1, p2, p3; + float depth1, depth2; + + /* filled later */ + float total_width1, + total_width2; + PoolVector parts_list1, + parts_list2; + Ref curve3; + Ref curve3a; +}; class RoadDiagram { protected: List clusters; @@ -128,19 +144,8 @@ protected: Ref rnd; int keep_seed; List clusters; -protected: Rect2 bounds; static void _bind_methods(); -public: - struct vshape { - AABB area; - int instance; - int e1, e2; - int site; - Vector3 p1, p2, p3; - float depth1, depth2; - }; -protected: Vector diagram_vertices; Vector map_sites; Vector map_hedges; diff --git a/modules/world/roads.cpp b/modules/world/roads.cpp index b9c504e..9ec7238 100644 --- a/modules/world/roads.cpp +++ b/modules/world/roads.cpp @@ -131,12 +131,6 @@ void Roads::all_offsets() for (k = mesh_data.next(NULL); k; k = mesh_data.next(k)) offsets[*k] = calculate_offsets(mesh_data[*k]); } -enum { - FLAGS_SIDEWALK = (1 << 0), - FLAGS_INTERSECTION = (1 << 1), - FLAGS_WALL = (1 << 2), -}; - PoolVector Roads::build_item_list(float width, int flags, float sidewalk_width) const { PoolVector ret; @@ -180,7 +174,7 @@ inline float Roads::get_total_width(float width, int flags, float sidewalk_width { int i; float total_width = 0.0f; - PoolVector parts_list = rg->build_item_list(width, flags, sidewalk_width); + PoolVector parts_list = build_item_list(width, flags, sidewalk_width); for (i = 0; i < parts_list.size(); i++) total_width += offsets[parts_list[i]].x; return total_width; @@ -190,22 +184,24 @@ inline Ref Roads::get_curve(const PoolVector &points, float wi { float total_width = get_total_width(width, flags, sidewalk_width); Ref curve = build_curve(points[0], points[1], points[2], total_width); + assert(!curve.is_null()); return curve; } -Array Roads::curve_mesh(const PoolVector &points, Ref curve3, float width1, float width2, int flags, float sidewalk_width) +Array Roads::curve_mesh(const PoolVector &points, + Ref curve3, + float total_width1, + float total_width2, + const PoolVector &parts_list1, + const PoolVector &parts_list2, + int flags, + float sidewalk_width) { - float tx = 0.0f, total_width1 = 0.0f, total_width2 = 0.0f, t = 0.0f, l; + float tx = 0.0f, t = 0.0f, l; int i; Array ret; - all_offsets(); - total_width1 = get_total_width(width1, flags, sidewalk_width); - total_width2 = get_total_width(width2, flags, sidewalk_width); - PoolVector parts_list1 = build_item_list(width1, flags, sidewalk_width); - PoolVector parts_list2 = build_item_list(width2, flags, sidewalk_width); + assert(!curve3.is_null()); assert(total_width1 >= 3.0f && total_width2 >= 3.0f); -// Ref curve3 = build_curve(points[0], points[1], points[2], total_width2); -// Ref curve3 = get_curve(points, width2, flags, sidewalk_width); l = curve3->get_baked_length(); assert(l > 0.0f); PoolVector new_verts, new_normals; @@ -368,9 +364,15 @@ int Roads::make_vmesh(Node *root, Ref mat, Ref mesh, MeshIn { int i; PoolVector points = make_points(data->points); - rg->all_offsets(); - Ref curve3 = get_curve(points, data->width2, data->flags, data->sidewalk_width); - Array rdata = curve_mesh(points, curve3, data->width1, data->width2, data->flags, data->sidewalk_width); +// Ref curve3 = get_curve(points, data->width2, data->flags, data->sidewalk_width); + assert(!data->vshape->curve3.is_null()); + Array rdata = curve_mesh(points, data->vshape->curve3, + data->vshape->total_width1, + data->vshape->total_width2, + data->vshape->parts_list1, + data->vshape->parts_list2, + data->flags, + data->sidewalk_width); Ref mdata = mesh; assert(mdata.is_valid()); mdata->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, rdata); @@ -424,7 +426,7 @@ void Roads::process_vshapes() camarea.grow_by(550.0f); int i; List active_vshapes; - const PoolVector &vshapes = rg->get_vshapes(); + const PoolVector &vshapes = rg->get_vshapes(); for (i = 0; i < vshapes.size(); i++) { if (active_vshapes.size() > 32) break; @@ -446,11 +448,10 @@ void Roads::process_vshapes() List::Element *e; for (e = active_vshapes.front(); e; e = e->next()) { i = e->get(); - struct RoadGrid::vshape &v = rg->get_vshapes().write()[i]; + struct vshape &v = rg->get_vshapes().write()[i]; assert(v.p1.distance_squared_to(v.p2) > 2.0f); assert(v.p2.distance_squared_to(v.p3) > 2.0f); assert(v.p1.distance_squared_to(v.p3) > 2.0f); - float sidewalk_width = 6.0f; if (vshapes[i].instance < 0) { if (thread.thread.is_started()) thread.thread.wait_to_finish(); @@ -467,7 +468,23 @@ void Roads::process_vshapes() } } } -void Roads::create_data(struct RoadGrid::vshape *v, struct RoadMeshData *data, int flags, float sidewalk_width) +void Roads::create_vshape_data(struct vshape *v, int flags, float sidewalk_width) +{ + PoolVector ipoints; + ipoints.resize(3); + ipoints.write()[0] = v->p1; + ipoints.write()[1] = v->p2; + ipoints.write()[2] = v->p3; + v->total_width1 = get_total_width(v->depth1, flags, sidewalk_width); + v->total_width2 = get_total_width(v->depth2, flags, sidewalk_width); + v->parts_list1 = build_item_list(v->depth1, flags, sidewalk_width); + v->parts_list2 = build_item_list(v->depth2, flags, sidewalk_width); + PoolVector points = make_points(ipoints); + v->curve3 = get_curve(points, v->depth2, flags, sidewalk_width); + v->curve3a = get_curve(points, v->depth1, flags, sidewalk_width); + assert(!v->curve3.is_null()); +} +void Roads::create_data(struct vshape *v, struct RoadMeshData *data, int flags, float sidewalk_width) { data->points.resize(3); data->points.write()[0] = v->p1; @@ -480,6 +497,16 @@ void Roads::create_data(struct RoadGrid::vshape *v, struct RoadMeshData *data, i data->vshape = v; } +void Roads::build_vshape_data() +{ + int i; + RoadGrid *rg = RoadsData::get_singleton()->get_road_grid(); + PoolVector &vshapes = rg->get_vshapes(); + for (i = 0; i < vshapes.size(); i++) + create_vshape_data(&(vshapes.write()[i]), FLAGS_SIDEWALK|FLAGS_INTERSECTION, + sidewalk_width); +} + void Roads::_notification(int p_what) { switch(p_what) { @@ -492,6 +519,9 @@ void Roads::_notification(int p_what) counter = 0; set_process(true); add_child(body); + sidewalk_width = 6.0f; + all_offsets(); + build_vshape_data(); break; } } diff --git a/modules/world/roads.h b/modules/world/roads.h index 2f5710e..acccb43 100644 --- a/modules/world/roads.h +++ b/modules/world/roads.h @@ -6,7 +6,7 @@ #include class StaticBody; -struct RoadGrid::vshape; +struct vshape; struct RoadMeshData { PoolVector points; @@ -14,7 +14,7 @@ struct RoadMeshData { float width2; int flags; float sidewalk_width; - struct RoadGrid::vshape *vshape; + struct vshape *vshape; }; class Roads: public MeshInstance { @@ -32,6 +32,7 @@ protected: void _get_property_list(List *p_list) const; static void _bind_methods(); void update_all(); + float sidewalk_width; struct thread_data { Thread thread; Ref mat; @@ -78,15 +79,20 @@ public: PoolVector build_item_list(float width, int flags, float sidewalk_width) const; Ref build_curve(Vector3 p1, Vector3 p2, Vector3 p3, float total_width) const; // Array curve_mesh(PoolVector points, float width1, float width2, int flags, float sidewalk_width); - Array curve_mesh(const PoolVector &points, Ref curve3, float width1, float width2, int flags, float sidewalk_width); + Array curve_mesh(const PoolVector &points, Ref curve3, float total_width1, float total_width2, + const PoolVector &parts_list1, + const PoolVector &parts_list2, + int flags, float sidewalk_width); int make_vmesh(Node *root, Ref mat, Ref mesh, MeshInstance *xmi, RoadMeshData *data); void process_vshapes(); - void create_data(struct RoadGrid::vshape *v, + void create_vshape_data(struct vshape *v, int flags, float sidewalk_width); + void create_data(struct vshape *v, struct RoadMeshData *data, int flags, float sidewalk_width); void add_scene_element(Node *root, Node *xnode, const Vector3 &p2, Ref shape); inline float get_total_width(float width, int flags, float sidewalk_width); inline Ref get_curve(const PoolVector &points, float width, int flags, float sidewalk_width); + void build_vshape_data(); }; class RoadsData: public Object {