Now line buildings save/load works

This commit is contained in:
2024-09-24 22:00:24 +03:00
parent 12822d2f65
commit 144b737dc3
4 changed files with 1379 additions and 609 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -17,6 +17,48 @@
ImmediateGeometry *RoadLinesData::debug_im = nullptr; ImmediateGeometry *RoadLinesData::debug_im = nullptr;
static Ref<Material> debug_material; static Ref<Material> debug_material;
RoadLinesData::RoadLinesData() RoadLinesData::RoadLinesData()
{
load_data();
}
RoadLinesData *RoadLinesData::singleton = nullptr;
RoadLinesData *RoadLinesData::get_singleton()
{
if (!singleton)
singleton = memnew(RoadLinesData);
return singleton;
}
RoadLinesData::~RoadLinesData()
{
#if 0
if (debug_im) {
memdelete(debug_im);
debug_im = nullptr;
}
#endif
}
void RoadLinesData::cleanup()
{
memdelete(singleton);
singleton = nullptr;
}
String RoadLinesData::get_road_lines_path()
{
return road_lines_path;
}
void RoadLinesData::get_road_lines_key_list(List<String> *keys)
{
List<String> line_keys;
lines.get_key_list(&line_keys);
List<String>::Element *e = line_keys.front();
keys->clear();
while (e) {
const String &key = e->get();
if (key.ends_with("_road"))
keys->push_back(key);
e = e->next();
}
}
void RoadLinesData::load_data()
{ {
int i; int i;
ConfigFile config; ConfigFile config;
@@ -57,50 +99,19 @@ RoadLinesData::RoadLinesData()
int index = indices[i]; int index = indices[i];
rline.indices[i] = index; rline.indices[i] = index;
} }
Array buildings = entry.get("buildings", Array());
rline.buildings.resize(buildings.size());
for (i = 0; i < (int)buildings.size(); i++) {
struct line_building_data b;
line_building_data::from_dict(&b, buildings[i]);
rline.buildings.push_back(b);
}
// TODO: wtf is flags? // TODO: wtf is flags?
rline.lanes = lanes; rline.lanes = lanes;
lines[key] = rline; lines[key] = rline;
e = e->next(); e = e->next();
} }
} }
RoadLinesData *RoadLinesData::singleton = nullptr;
RoadLinesData *RoadLinesData::get_singleton()
{
if (!singleton)
singleton = memnew(RoadLinesData);
return singleton;
}
RoadLinesData::~RoadLinesData()
{
#if 0
if (debug_im) {
memdelete(debug_im);
debug_im = nullptr;
}
#endif
}
void RoadLinesData::cleanup()
{
memdelete(singleton);
singleton = nullptr;
}
String RoadLinesData::get_road_lines_path()
{
return road_lines_path;
}
void RoadLinesData::get_road_lines_key_list(List<String> *keys)
{
List<String> line_keys;
lines.get_key_list(&line_keys);
List<String>::Element *e = line_keys.front();
keys->clear();
while (e) {
const String &key = e->get();
if (key.ends_with("_road"))
keys->push_back(key);
e = e->next();
}
}
void RoadLinesData::save_data() void RoadLinesData::save_data()
{ {
int i; int i;
@@ -128,6 +139,11 @@ void RoadLinesData::save_data()
pvalues["metadata"] = lines[e->get()].metadata; pvalues["metadata"] = lines[e->get()].metadata;
pvalues["lanes"] = lines[e->get()].lanes; pvalues["lanes"] = lines[e->get()].lanes;
pvalues["pattern"] = lines[e->get()].pattern; pvalues["pattern"] = lines[e->get()].pattern;
Array buildings;
for (i = 0; i < (int)lines[e->get()].buildings.size(); i++)
buildings.push_back(
lines[e->get()].buildings[i].to_dict());
pvalues["buildings"] = buildings;
output[e->get()] = pvalues; output[e->get()] = pvalues;
e = e->next(); e = e->next();
} }
@@ -640,6 +656,7 @@ Vector3 RoadLinesData::get_point_by_offsets(const String &line,
{ {
Vector3 ret; Vector3 ret;
int i; int i;
assert(lines.has(line));
print_verbose("line: " + line + print_verbose("line: " + line +
" line_offset: " + String::num(dir_offset) + " line_offset: " + String::num(dir_offset) +
" normal_offset: " + String::num(normal_offset)); " normal_offset: " + String::num(normal_offset));
@@ -653,8 +670,34 @@ Vector3 RoadLinesData::get_point_by_offsets(const String &line,
} }
n_offset -= segment->length; n_offset -= segment->length;
} }
print_line("offset: " + String::num(n_offset));
ret = lines[line].segments[selected_segment].p1 + ret = lines[line].segments[selected_segment].p1 +
lines[line].segments[selected_segment].dir * n_offset + lines[line].segments[selected_segment].dir * n_offset +
lines[line].segments[selected_segment].tangent * normal_offset; lines[line].segments[selected_segment].tangent * normal_offset;
print_line("data: " + (ret.operator String()));
return ret;
}
void RoadLinesData::line_building_data::from_dict(line_building_data *b,
const Dictionary &from)
{
assert(from.has("building_key"));
assert(from.has("line_offset"));
assert(from.has("normal_offset"));
assert(from.has("y_rotation"));
b->building_key = from.get("building_key", "");
b->building_key_hash = b->building_key.hash64();
b->line_offset = from.get("line_offset", -1.0f);
b->normal_offset = from.get("normal_offset", -1.0f);
b->y_rotation = from.get("y_rotation", Math_NAN);
}
Dictionary RoadLinesData::line_building_data::to_dict() const
{
Dictionary ret;
ret["building_key"] = building_key;
ret["line_offset"] = line_offset;
ret["normal_offset"] = normal_offset;
ret["y_rotation"] = y_rotation;
return ret; return ret;
} }

View File

@@ -20,6 +20,9 @@ public:
float line_offset; float line_offset;
float normal_offset; float normal_offset;
float y_rotation; float y_rotation;
static void from_dict(struct line_building_data *b,
const Dictionary &from);
Dictionary to_dict() const;
}; };
struct line_segment { struct line_segment {
Vector3 p1; Vector3 p1;
@@ -48,6 +51,7 @@ public:
static void cleanup(); static void cleanup();
String get_road_lines_path(); String get_road_lines_path();
void get_road_lines_key_list(List<String> *keys); void get_road_lines_key_list(List<String> *keys);
void load_data();
void save_data(); void save_data();
void process_lines(std::unordered_map<uint32_t, std::vector<Vector3> > void process_lines(std::unordered_map<uint32_t, std::vector<Vector3> >
&road_lines_nodes_hash, &road_lines_nodes_hash,

View File

@@ -657,11 +657,14 @@ void RoadLinesEditor::update_line_geometry()
} }
line_im->end(); line_im->end();
} }
// FIXME: update line segments on load and when line is changed
rld->update_line_segments(current_line);
if (rld->lines[current_line].buildings.size() > 1) { if (rld->lines[current_line].buildings.size() > 1) {
line_im->begin(Mesh::PRIMITIVE_LINES); line_im->begin(Mesh::PRIMITIVE_LINES);
for (i = 0; for (i = 0;
i < (int)rld->lines[current_line].buildings.size(); i < (int)rld->lines[current_line].buildings.size();
i++) { i++) {
print_line("idx: " + itos(i));
const RoadLinesData::line_building_data &b = const RoadLinesData::line_building_data &b =
rld->lines[current_line].buildings[i]; rld->lines[current_line].buildings[i];
Vector3 pt = rld->get_point_by_offsets( Vector3 pt = rld->get_point_by_offsets(
@@ -673,6 +676,7 @@ void RoadLinesEditor::update_line_geometry()
Vector3(0.0f, 5.0f, 0.0f)); Vector3(0.0f, 5.0f, 0.0f));
line_im->add_vertex(pt + line_im->add_vertex(pt +
Vector3(0.0f, 15.0f, 0.0f)); Vector3(0.0f, 15.0f, 0.0f));
print_line("idx: " + itos(i) + " done");
} }
line_im->end(); line_im->end();
} }