Removed script from editor
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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 )
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user