Removed script from editor

This commit is contained in:
2024-09-20 16:06:27 +03:00
parent 43c312e371
commit 9ad8bb2620
8 changed files with 336 additions and 97 deletions

View File

@@ -2,13 +2,13 @@ extends Spatial
#var camera_mode = -1 #var camera_mode = -1
onready var vmode = { #onready var vmode = {
2: $"%v_buildings", # 2: $"%v_buildings",
3: $"%v_navigation", # 3: $"%v_navigation",
5: $"%v_poi", # 5: $"%v_poi",
6: $"%v_road_lines", # 6: $"%v_road_lines",
7: $"%v_npc", # 7: $"%v_npc",
} #}
#func change_building_type(index): #func change_building_type(index):
# var item = $"%building_type".get_item_text(index) # var item = $"%building_type".get_item_text(index)
@@ -38,55 +38,60 @@ func _ready():
]: ]:
b.connect("pressed", $WorldEditor, "editor_command", [b.name, []]) b.connect("pressed", $WorldEditor, "editor_command", [b.name, []])
$WorldEditor.connect("editor_event", self, "editor_event") $WorldEditor.connect("editor_event", self, "editor_event")
for k in vmode.keys(): # for k in vmode.keys():
vmode[k].hide() # vmode[k].hide()
$"%building_cursor".hide() # $"%building_cursor".hide()
$"%line_cursor".hide() # $"%line_cursor".hide()
# $"%building_type".connect("item_selected", self, "change_building_type") # $"%building_type".connect("item_selected", self, "change_building_type")
# $"%NavPanel".connect("gui_input", self, "nav_gui_input") # $"%NavPanel".connect("gui_input", self, "nav_gui_input")
var ignore_events = [ #var ignore_events = [
"result:get_closest_building", # "mode_change_pre",
"mouse_drag", # "mode_change_post",
"mouse_press", # "result:get_closest_building",
"mouse_drag_on", # "result:get_building_types",
"mouse_drag_off", # "mouse_drag",
"line_cursor_motion", # "mouse_press",
"button:create_building", # "mouse_drag_on",
"lines_select_line", # "mouse_drag_off",
"lines_changed_line" # "line_cursor_motion",
] # "button:create_building",
# "lines_select_line",
# "lines_changed_line"
#]
func editor_event(evname: String, args: Array): func editor_event(evname: String, args: Array):
print(evname, args) print(evname, args)
if evname == "mode_change_pre": # if evname == "mode_change_pre":
var mode_prev = args[0] # var mode_prev = args[0]
if mode_prev == -1: # if mode_prev == -1:
for k in vmode.keys(): # for k in vmode.keys():
vmode[k].hide() # vmode[k].hide()
elif vmode.has(mode_prev): # elif vmode.has(mode_prev):
vmode[mode_prev].hide() # vmode[mode_prev].hide()
elif evname == "mode_change_post": # elif evname == "mode_change_post":
var mode_next = args[1] # var mode_next = args[1]
if vmode.has(mode_next): # if vmode.has(mode_next):
vmode[mode_next].show() # vmode[mode_next].show()
if mode_next == 2: # if mode_next == 2:
$WorldEditor.editor_command("get_building_types", []) # $WorldEditor.editor_command("get_building_types", [])
elif mode_next == 6: # elif mode_next == 6:
$WorldEditor.editor_command("get_lines_list", []) # $WorldEditor.editor_command("get_lines_list", [])
elif evname == "result:get_building_types": # elif evname == "result:get_building_types":
print(evname, args) # pass
var btypes = args[0] # print(evname, args)
$"%building_type".clear() # var btypes = args[0]
for k in btypes.keys(): # $"%building_type".clear()
$"%building_type".add_item(k) # for k in btypes.keys():
elif evname == "editor_camera_moved": # $"%building_type".add_item(k)
$Area.global_transform.origin.x = $Camera.global_transform.origin.x # if evname == "editor_camera_moved":
$Area.global_transform.origin.z = $Camera.global_transform.origin.z # var cam = get_viewport().get_camera()
# $"%selection_area".global_transform.origin.x = cam.global_transform.origin.x
# $"%selection_area".global_transform.origin.z = cam.global_transform.origin.z
# elif evname == "edit_update_building": # elif evname == "edit_update_building":
# check_edit_building() # check_edit_building()
elif evname in ignore_events: # elif evname in ignore_events:
pass # pass
else: # else:
breakpoint # breakpoint
#func mouse_drag(position): #func mouse_drag(position):
# if $WorldEditor.get_current_mode() != 2: # if $WorldEditor.get_current_mode() != 2:
# return # return
@@ -154,7 +159,7 @@ func editor_event(evname: String, args: Array):
# selected_building_xform = xform # selected_building_xform = xform
#var selected_building #var selected_building
var selected_building_xform #var selected_building_xform
#func select_building(xform, id, mid): #func select_building(xform, id, mid):
# selected_building = id # selected_building = id
# selected_building_xform = xform # selected_building_xform = xform
@@ -168,14 +173,14 @@ var selected_building_xform
# if !$"%building_cursor".visible: # if !$"%building_cursor".visible:
# $"%building_cursor".show() # $"%building_cursor".show()
# $"%building_cursor".global_transform.origin = xform.origin # $"%building_cursor".global_transform.origin = xform.origin
func _process(delta): #func _process(delta):
# if Input.is_action_just_pressed("editor_cam1"): # if Input.is_action_just_pressed("editor_cam1"):
# setup_cam1() # setup_cam1()
# if Input.is_action_just_pressed("editor_cam2"): # if Input.is_action_just_pressed("editor_cam2"):
# setup_cam2() # setup_cam2()
# if Input.is_action_just_pressed("editor_cam3"): # if Input.is_action_just_pressed("editor_cam3"):
# setup_cam3() # setup_cam3()
var mode = $"%buildings_edit_mode".selected # var mode = $"%buildings_edit_mode".selected
# if mode == 2: # if mode == 2:
# $"%building_rot_cursor".global_transform = selected_building_xform # $"%building_rot_cursor".global_transform = selected_building_xform
# if !$"%building_rot_cursor".visible: # if !$"%building_rot_cursor".visible:
@@ -232,10 +237,10 @@ func _process(delta):
## drag_delay -= delta ## drag_delay -= delta
#var motion = Vector2() #var motion = Vector2()
#var old_mouse_pos = Vector2(-1, -1) #var old_mouse_pos = Vector2(-1, -1)
var rotation_y = 0 #var rotation_y = 0
#var dragging = false #var dragging = false
#var drag_delay = 0.2 #var drag_delay = 0.2
var drag_start = Vector3() #var drag_start = Vector3()
#func _unhandled_input(event): #func _unhandled_input(event):
# var editor_mode = $WorldEditor.get_current_mode() # var editor_mode = $WorldEditor.get_current_mode()
# var camera_mode = $WorldEditor.get_camera_mode() # var camera_mode = $WorldEditor.get_camera_mode()
@@ -274,5 +279,5 @@ var drag_start = Vector3()
# $WorldEditor.editor_command("update_building_transform", [selected_building, xform]) # $WorldEditor.editor_command("update_building_transform", [selected_building, xform])
# $building_rot_cursor.global_transform = xform # $building_rot_cursor.global_transform = xform
# selected_building_xform = xform # selected_building_xform = xform
func _physics_process(delta): #func _physics_process(delta):
assert($WorldEditor is WorldEditor) # assert($WorldEditor is WorldEditor)

View File

@@ -1,6 +1,5 @@
[gd_scene load_steps=16 format=2] [gd_scene load_steps=15 format=2]
[ext_resource path="res://main/editor.gd" type="Script" id=1]
[ext_resource path="res://terrain/terrain_draw.png" type="Image" id=2] [ext_resource path="res://terrain/terrain_draw.png" type="Image" id=2]
[ext_resource path="res://terrain/terrain.png" type="Image" id=3] [ext_resource path="res://terrain/terrain.png" type="Image" id=3]
[ext_resource path="res://terrain/terrain_edit.png" type="Image" id=4] [ext_resource path="res://terrain/terrain_edit.png" type="Image" id=4]
@@ -48,7 +47,6 @@ size = Vector3( 4, 4, 120 )
size = Vector3( 3, 60, 3 ) size = Vector3( 3, 60, 3 )
[node name="editor" type="Spatial"] [node name="editor" type="Spatial"]
script = ExtResource( 1 )
[node name="WorldEditor" type="WorldEditor" parent="."] [node name="WorldEditor" type="WorldEditor" parent="."]
@@ -124,7 +122,7 @@ text = "NPC Mode"
unique_name_in_owner = true unique_name_in_owner = true
margin_top = 206.0 margin_top = 206.0
margin_right = 248.0 margin_right = 248.0
margin_bottom = 374.0 margin_bottom = 482.0
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_buildings"] [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_buildings"]
margin_right = 248.0 margin_right = 248.0
@@ -184,11 +182,26 @@ margin_right = 248.0
margin_bottom = 168.0 margin_bottom = 168.0
text = "Save Buildings" text = "Save Buildings"
[node name="lines_list_building" type="ItemList" parent="VBoxContainer/v_buildings"]
unique_name_in_owner = true
margin_top = 172.0
margin_right = 248.0
margin_bottom = 252.0
rect_min_size = Vector2( 0, 80 )
size_flags_horizontal = 3
[node name="buildings_assign_to_line" type="Button" parent="VBoxContainer/v_buildings"]
unique_name_in_owner = true
margin_top = 256.0
margin_right = 248.0
margin_bottom = 276.0
text = "Assign To Line"
[node name="v_navigation" type="VBoxContainer" parent="VBoxContainer"] [node name="v_navigation" type="VBoxContainer" parent="VBoxContainer"]
unique_name_in_owner = true unique_name_in_owner = true
margin_top = 378.0 margin_top = 486.0
margin_right = 248.0 margin_right = 248.0
margin_bottom = 400.0 margin_bottom = 508.0
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_navigation"] [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_navigation"]
margin_right = 248.0 margin_right = 248.0
@@ -202,9 +215,9 @@ text = "Navigation mode"
[node name="v_poi" type="VBoxContainer" parent="VBoxContainer"] [node name="v_poi" type="VBoxContainer" parent="VBoxContainer"]
unique_name_in_owner = true unique_name_in_owner = true
margin_top = 404.0 margin_top = 512.0
margin_right = 248.0 margin_right = 248.0
margin_bottom = 426.0 margin_bottom = 534.0
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_poi"] [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_poi"]
margin_right = 248.0 margin_right = 248.0
@@ -218,9 +231,9 @@ text = "POI mode"
[node name="v_road_lines" type="VBoxContainer" parent="VBoxContainer"] [node name="v_road_lines" type="VBoxContainer" parent="VBoxContainer"]
unique_name_in_owner = true unique_name_in_owner = true
margin_top = 430.0 margin_top = 538.0
margin_right = 248.0 margin_right = 248.0
margin_bottom = 1080.0 margin_bottom = 1188.0
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_road_lines"] [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_road_lines"]
margin_right = 248.0 margin_right = 248.0
@@ -270,7 +283,7 @@ margin_left = 79.0
margin_right = 124.0 margin_right = 124.0
margin_bottom = 20.0 margin_bottom = 20.0
text = "Point" text = "Point"
items = [ "", null, 0, false, false, 0, 0, null, "", true, "Create", null, 0, false, false, 11, 0, null, "", false, "Remove", null, 0, false, false, 12, 0, null, "", false, "", null, 0, false, false, 3, 0, null, "", true, "Point To Cursor", null, 0, false, false, 51, 0, null, "", false, "Cursor To Point", null, 0, false, false, 52, 0, null, "", false, "Item 6", null, 0, false, false, 6, 0, null, "", false, "Item 7", null, 0, false, false, 7, 0, null, "", false ] items = [ "", null, 0, false, false, 0, 0, null, "", true, "Create", null, 0, false, false, 11, 0, null, "", false, "Remove", null, 0, false, false, 12, 0, null, "", false, "", null, 0, false, false, 3, 0, null, "", true, "Point To Cursor", null, 0, false, false, 51, 0, null, "", false, "Cursor To Point", null, 0, false, false, 52, 0, null, "", false, "Item 6", null, 0, false, true, 6, 0, null, "", false, "Item 7", null, 0, false, true, 7, 0, null, "", false ]
switch_on_hover = true switch_on_hover = true
[node name="road_lines_line_menu" type="MenuButton" parent="VBoxContainer/v_road_lines/road_lines_base/VBoxContainer/road_lines_menu_block"] [node name="road_lines_line_menu" type="MenuButton" parent="VBoxContainer/v_road_lines/road_lines_base/VBoxContainer/road_lines_menu_block"]
@@ -506,9 +519,9 @@ margin_bottom = 418.0
[node name="v_npc" type="VBoxContainer" parent="VBoxContainer"] [node name="v_npc" type="VBoxContainer" parent="VBoxContainer"]
unique_name_in_owner = true unique_name_in_owner = true
margin_top = 1084.0 margin_top = 1192.0
margin_right = 248.0 margin_right = 248.0
margin_bottom = 1106.0 margin_bottom = 1214.0
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_npc"] [node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_npc"]
margin_right = 248.0 margin_right = 248.0
@@ -540,12 +553,13 @@ far = 1000.0
[node name="DirectionalLight" type="DirectionalLight" parent="."] [node name="DirectionalLight" type="DirectionalLight" parent="."]
transform = Transform( 1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 2, 0 ) transform = Transform( 1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 2, 0 )
[node name="Area" type="Area" parent="."] [node name="selection_area" type="Area" parent="."]
unique_name_in_owner = true
collision_layer = 32768 collision_layer = 32768
collision_mask = 32768 collision_mask = 32768
monitoring = false monitoring = false
[node name="CollisionShape" type="CollisionShape" parent="Area"] [node name="CollisionShape" type="CollisionShape" parent="selection_area"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.1, 0 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.1, 0 )
shape = SubResource( 9 ) shape = SubResource( 9 )

View File

@@ -144,6 +144,7 @@ static std::vector<Object *> ui_handlers;
BuildingsEditor::BuildingsEditor(WorldEditor *editor) BuildingsEditor::BuildingsEditor(WorldEditor *editor)
: editor(editor) : editor(editor)
, selected_building(-1) , selected_building(-1)
, active(false)
{ {
} }
@@ -156,6 +157,9 @@ void BuildingsEditor::exit()
void BuildingsEditor::activate() void BuildingsEditor::activate()
{ {
assert(!active); assert(!active);
ConfigFile config;
Error result = config.load("res://config/stream.conf");
ERR_FAIL_COND_MSG(result != OK, "Failed to load config");
print_line("BuildingsEditor ACTIVE"); print_line("BuildingsEditor ACTIVE");
Array args; Array args;
ui_handlers.push_back(memnew(HandleButton( ui_handlers.push_back(memnew(HandleButton(
@@ -165,9 +169,24 @@ void BuildingsEditor::activate()
int i; int i;
for (i = 0; i < (int)ui_handlers.size(); i++) for (i = 0; i < (int)ui_handlers.size(); i++)
assert(ui_handlers[i]); assert(ui_handlers[i]);
active = true; /* TODO: make separate function for this */
EditorEvent::get_singleton()->event.add_listener( EditorEvent::get_singleton()->event.add_listener(
this, &BuildingsEditor::event_handler); this, &BuildingsEditor::event_handler);
Dictionary buildings_data =
config.get_value("buildings", "building_data");
OptionButton *building_type =
get_as_node<OptionButton>("%building_type");
building_type->clear();
List<Variant> keys;
buildings_data.get_key_list(&keys);
List<Variant>::Element *e = keys.front();
while (e) {
const String &key = e->get();
print_line("EE::" + key);
building_type->add_item(key);
e = e->next();
}
active = true;
} }
void BuildingsEditor::deactivate() void BuildingsEditor::deactivate()
@@ -200,6 +219,8 @@ void BuildingsEditor::event_handler(const String &event, const Array &args)
get_as_node<Spatial>("%building_rot_cursor") get_as_node<Spatial>("%building_rot_cursor")
->set_global_transform(selected_building_xform); ->set_global_transform(selected_building_xform);
} }
} else if (event == "result:get_building_types") {
/* TODO: replace with direct data access */
} }
print_line("buildings::" + event); print_line("buildings::" + event);
} }

View File

@@ -207,19 +207,18 @@ void RoadLinesData::index_lines(
std::vector<Vector3> &road_lines_nodes) std::vector<Vector3> &road_lines_nodes)
{ {
List<String> keys; List<String> keys;
RoadLinesData *rld = RoadLinesData::get_singleton(); get_road_lines_key_list(&keys);
rld->get_road_lines_key_list(&keys);
List<String>::Element *e = keys.front(); List<String>::Element *e = keys.front();
while (e) { while (e) {
String rkey = e->get(); String rkey = e->get();
struct RoadLinesData::road_line &pt = rld->lines[rkey]; struct RoadLinesData::road_line &pt = lines[rkey];
pt.indices.clear(); pt.indices.clear();
e = e->next(); e = e->next();
} }
e = keys.front(); e = keys.front();
while (e) { while (e) {
String rkey = e->get(); String rkey = e->get();
struct RoadLinesData::road_line &pt = rld->lines[rkey]; struct RoadLinesData::road_line &pt = lines[rkey];
road_lines_curve_index(pt, road_lines_nodes_hash, road_lines_curve_index(pt, road_lines_nodes_hash,
road_lines_nodes); road_lines_nodes);
e = e->next(); e = e->next();
@@ -481,28 +480,10 @@ void RoadLinesData::process_lines(
&road_lines_nodes_hash, &road_lines_nodes_hash,
std::vector<Vector3> &road_lines_nodes) std::vector<Vector3> &road_lines_nodes)
{ {
int i;
get_debug_node()->clear();
index_lines(road_lines_nodes_hash, road_lines_nodes); index_lines(road_lines_nodes_hash, road_lines_nodes);
insert_close_points(road_lines_nodes, 160.0f); insert_close_points(road_lines_nodes, 160.0f);
update_road_lines_nodes(road_lines_nodes); update_road_lines_nodes(road_lines_nodes);
dump_road_lines(road_lines_nodes); dump_road_lines(road_lines_nodes);
if (debug_flags & 1) {
get_debug_node()->begin(Mesh::PRIMITIVE_LINES);
for (i = 0; i < (int)road_lines_nodes.size(); i++) {
print_line("debug_node: " + itos(i) + " " +
(road_lines_nodes[i].operator String()));
get_debug_node()->set_color(
Color(0.1f, 0.6f, 0.6f, 1.0f));
get_debug_node()->add_vertex(road_lines_nodes[i]);
get_debug_node()->set_color(
Color(0.1f, 0.6f, 0.6f, 1.0f));
get_debug_node()->add_vertex(
road_lines_nodes[i] +
Vector3(0.0f, 200.0f, 0.0f));
}
get_debug_node()->end();
}
} }
void RoadLinesData::set_debug_flags(int debug_flags) void RoadLinesData::set_debug_flags(int debug_flags)

View File

@@ -7,7 +7,6 @@ class RoadLinesData {
String road_lines_path; String road_lines_path;
uint32_t road_lines_hash(const Vector3 &v); uint32_t road_lines_hash(const Vector3 &v);
static ImmediateGeometry *debug_im; static ImmediateGeometry *debug_im;
static ImmediateGeometry *get_debug_node();
protected: protected:
RoadLinesData(); RoadLinesData();
@@ -15,6 +14,7 @@ protected:
_Signal<void> lines_updated; _Signal<void> lines_updated;
public: public:
static ImmediateGeometry *get_debug_node();
struct road_line { struct road_line {
std::vector<Transform> points; std::vector<Transform> points;
std::vector<int> indices; std::vector<int> indices;
@@ -38,6 +38,7 @@ public:
int get_debug_flags() const; int get_debug_flags() const;
private: private:
void create_segments_from_lines();
void index_lines(std::unordered_map<uint32_t, std::vector<Vector3> > void index_lines(std::unordered_map<uint32_t, std::vector<Vector3> >
&road_lines_nodes_hash, &road_lines_nodes_hash,
std::vector<Vector3> &road_lines_nodes); std::vector<Vector3> &road_lines_nodes);

View File

@@ -1177,5 +1177,7 @@ void RoadLinesEditor::event_handler(const String &event, const Array &args)
print_line("the line is a road"); print_line("the line is a road");
if (current_line.ends_with("_road") && update_roads) if (current_line.ends_with("_road") && update_roads)
rebuild_roads(); rebuild_roads();
} else if (event == "result:get_building_types") {
/* TODO:: implement */
} }
} }

View File

@@ -94,6 +94,11 @@ struct RoadLinesProcessing {
} }
e = e->next(); e = e->next();
} }
}
void sort_neighbors()
{
int i;
/* sort neighbors by angle */
for (i = 0; i < (int)nodes.size(); i++) { for (i = 0; i < (int)nodes.size(); i++) {
std::sort( std::sort(
edges[i].neighbors.begin(), 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) Vector3 tangent(const Vector3 &v)
{ {
Vector2 rv = Vector2(v.x, v.z).tangent(); Vector2 rv = Vector2(v.x, v.z).tangent();
@@ -197,6 +268,7 @@ struct RoadLinesProcessing {
} }
void road_setup() void road_setup()
{ {
int i, j;
RoadLinesData *rld = RoadLinesData::get_singleton(); RoadLinesData *rld = RoadLinesData::get_singleton();
std::vector<Vector3> road_lines_nodes; std::vector<Vector3> road_lines_nodes;
std::unordered_map<uint32_t, std::vector<Vector3> > std::unordered_map<uint32_t, std::vector<Vector3> >
@@ -207,8 +279,70 @@ struct RoadLinesProcessing {
rld->process_lines(road_lines_nodes_hash, road_lines_nodes); rld->process_lines(road_lines_nodes_hash, road_lines_nodes);
create_nodes(road_lines_nodes); create_nodes(road_lines_nodes);
create_edges(); create_edges();
optimize_nodes(16.0f);
sort_neighbors();
wedges.clear(); wedges.clear();
build_wedges(wedges); 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"); print_line("ROAD SETUP DONE");
} }
}; };

View File

@@ -51,6 +51,7 @@ WorldEditor::WorldEditor()
InputMap::get_singleton()->add_action("mouse1"); InputMap::get_singleton()->add_action("mouse1");
EditorEvent::get_singleton()->event.add_listener( EditorEvent::get_singleton()->event.add_listener(
this, &WorldEditor::event_signal_handler); this, &WorldEditor::event_signal_handler);
print_line("constructed");
} }
WorldEditor::~WorldEditor() WorldEditor::~WorldEditor()
@@ -65,6 +66,7 @@ WorldEditor::~WorldEditor()
memdelete(buildings_editor); memdelete(buildings_editor);
buildings_editor = nullptr; buildings_editor = nullptr;
} }
print_line("destructed");
} }
void WorldEditor::set_camera_mode(int mode) void WorldEditor::set_camera_mode(int mode)
@@ -159,6 +161,13 @@ static std::unordered_map<String, int, StringHasher> modes = {
{ "select_road_lines", WorldEditor::MODE_ROAD_LINES }, { "select_road_lines", WorldEditor::MODE_ROAD_LINES },
{ "select_npc", WorldEditor::MODE_NPC } { "select_npc", WorldEditor::MODE_NPC }
}; };
static std::unordered_map<int, String> vmode = { { 2, "%v_buildings" },
{ 3, "%v_navigation" },
{ 5, "%v_poi" },
{ 6, "%v_road_lines" },
{ 7, "%v_npc" } };
void WorldEditor::tools_button(const String &button) void WorldEditor::tools_button(const String &button)
{ {
Array change; Array change;
@@ -166,8 +175,11 @@ void WorldEditor::tools_button(const String &button)
print_line("tools_button: " + button); print_line("tools_button: " + button);
if (modes.find(button) == modes.end()) if (modes.find(button) == modes.end())
goto end; goto end;
assert(modes[button] >= 0);
if (current_mode == modes[button]) if (current_mode == modes[button])
goto end; goto end;
print_line("mode change: " + itos(current_mode) + " " +
itos(modes[button]));
change[0] = current_mode; change[0] = current_mode;
change[1] = modes[button]; change[1] = modes[button];
EditorEvent::get_singleton()->event.emit("mode_change_pre", change); EditorEvent::get_singleton()->event.emit("mode_change_pre", change);
@@ -197,7 +209,9 @@ void WorldEditor::tools_button(const String &button)
break; break;
} }
EditorEvent::get_singleton()->event.emit("mode_change_post", change); EditorEvent::get_singleton()->event.emit("mode_change_post", change);
assert(modes[button] >= 0);
current_mode = modes[button]; current_mode = modes[button];
assert(current_mode >= 0);
end:; end:;
} }
@@ -269,6 +283,50 @@ int WorldEditor::get_current_mode() const
void WorldEditor::event_signal_handler(const String &event, const Array &args) void WorldEditor::event_signal_handler(const String &event, const Array &args)
{ {
if (event == "mode_change_pre") {
int prev_mode = args[0];
if (prev_mode == -1) {
auto pt = vmode.begin();
while (pt != vmode.end()) {
auto data = *pt;
Control *p = Object::cast_to<Control>(
get_node(NodePath(data.second)));
assert(p);
p->hide();
pt++;
}
} else {
Control *p = Object::cast_to<Control>(
get_node(NodePath(vmode[prev_mode])));
assert(p);
p->hide();
}
} else if (event == "mode_change_post") {
int mode_next = args[1];
Control *p = Object::cast_to<Control>(
get_node(NodePath(vmode[mode_next])));
assert(p);
p->show();
switch (mode_next) {
case 2:
editor_command("get_building_types", Array());
break;
case 6:
editor_command("get_lines_list", Array());
break;
}
} else if (event == "editor_camera_moved") {
Camera *cam = get_viewport()->get_camera();
Spatial *area = Object::cast_to<Spatial>(
get_node(NodePath("%selection_area")));
assert(cam);
assert(area);
Transform area_transform = area->get_global_transform();
const Transform &cam_transform = cam->get_global_transform();
area_transform.origin.x = cam_transform.origin.x;
area_transform.origin.z = cam_transform.origin.z;
area->set_global_transform(area_transform);
}
emit_signal("editor_event", event, args); emit_signal("editor_event", event, args);
} }
@@ -287,6 +345,9 @@ void WorldEditor::_notification(int which)
{ {
switch (which) { switch (which) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
Node *base = get_parent(); Node *base = get_parent();
int count = base->get_child_count(); int count = base->get_child_count();
int i; int i;
@@ -303,6 +364,24 @@ void WorldEditor::_notification(int which)
"world_command_result"); "world_command_result");
} }
} }
auto pt = vmode.begin();
while (pt != vmode.end()) {
auto data = *pt;
Control *p = Object::cast_to<Control>(
get_node(NodePath(data.second)));
assert(p);
p->hide();
pt++;
}
Spatial *building_cursor = Object::cast_to<Spatial>(
get_node(NodePath("%building_cursor")));
assert(building_cursor);
building_cursor->hide();
Spatial *line_cursor = Object::cast_to<Spatial>(
get_node(NodePath("%line_cursor")));
assert(line_cursor);
line_cursor->hide();
set_process_unhandled_input(true); set_process_unhandled_input(true);
set_physics_process(true); set_physics_process(true);
Spatial *cursor = Object::cast_to<Spatial>( Spatial *cursor = Object::cast_to<Spatial>(
@@ -319,6 +398,9 @@ void WorldEditor::_notification(int which)
set_process_unhandled_input(false); set_process_unhandled_input(false);
break; break;
case NOTIFICATION_PHYSICS_PROCESS: { case NOTIFICATION_PHYSICS_PROCESS: {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
if (!is_inside_tree()) if (!is_inside_tree())
return; return;
Camera *cam = get_viewport()->get_camera(); Camera *cam = get_viewport()->get_camera();
@@ -359,7 +441,6 @@ void WorldEditor::_notification(int which)
buildings_editor->update(delta); buildings_editor->update(delta);
break; break;
case MODE_ROAD_LINES: case MODE_ROAD_LINES:
// print_line("current_mode: " + itos(current_mode));
road_lines_editor->update(delta); road_lines_editor->update(delta);
break; break;
} }