Removed script from editor
This commit is contained in:
@@ -2,13 +2,13 @@ extends Spatial
|
||||
|
||||
#var camera_mode = -1
|
||||
|
||||
onready var vmode = {
|
||||
2: $"%v_buildings",
|
||||
3: $"%v_navigation",
|
||||
5: $"%v_poi",
|
||||
6: $"%v_road_lines",
|
||||
7: $"%v_npc",
|
||||
}
|
||||
#onready var vmode = {
|
||||
# 2: $"%v_buildings",
|
||||
# 3: $"%v_navigation",
|
||||
# 5: $"%v_poi",
|
||||
# 6: $"%v_road_lines",
|
||||
# 7: $"%v_npc",
|
||||
#}
|
||||
|
||||
#func change_building_type(index):
|
||||
# var item = $"%building_type".get_item_text(index)
|
||||
@@ -38,55 +38,60 @@ func _ready():
|
||||
]:
|
||||
b.connect("pressed", $WorldEditor, "editor_command", [b.name, []])
|
||||
$WorldEditor.connect("editor_event", self, "editor_event")
|
||||
for k in vmode.keys():
|
||||
vmode[k].hide()
|
||||
$"%building_cursor".hide()
|
||||
$"%line_cursor".hide()
|
||||
# for k in vmode.keys():
|
||||
# vmode[k].hide()
|
||||
# $"%building_cursor".hide()
|
||||
# $"%line_cursor".hide()
|
||||
# $"%building_type".connect("item_selected", self, "change_building_type")
|
||||
# $"%NavPanel".connect("gui_input", self, "nav_gui_input")
|
||||
var ignore_events = [
|
||||
"result:get_closest_building",
|
||||
"mouse_drag",
|
||||
"mouse_press",
|
||||
"mouse_drag_on",
|
||||
"mouse_drag_off",
|
||||
"line_cursor_motion",
|
||||
"button:create_building",
|
||||
"lines_select_line",
|
||||
"lines_changed_line"
|
||||
]
|
||||
#var ignore_events = [
|
||||
# "mode_change_pre",
|
||||
# "mode_change_post",
|
||||
# "result:get_closest_building",
|
||||
# "result:get_building_types",
|
||||
# "mouse_drag",
|
||||
# "mouse_press",
|
||||
# "mouse_drag_on",
|
||||
# "mouse_drag_off",
|
||||
# "line_cursor_motion",
|
||||
# "button:create_building",
|
||||
# "lines_select_line",
|
||||
# "lines_changed_line"
|
||||
#]
|
||||
func editor_event(evname: String, args: Array):
|
||||
print(evname, args)
|
||||
if evname == "mode_change_pre":
|
||||
var mode_prev = args[0]
|
||||
if mode_prev == -1:
|
||||
for k in vmode.keys():
|
||||
vmode[k].hide()
|
||||
elif vmode.has(mode_prev):
|
||||
vmode[mode_prev].hide()
|
||||
elif evname == "mode_change_post":
|
||||
var mode_next = args[1]
|
||||
if vmode.has(mode_next):
|
||||
vmode[mode_next].show()
|
||||
if mode_next == 2:
|
||||
$WorldEditor.editor_command("get_building_types", [])
|
||||
elif mode_next == 6:
|
||||
$WorldEditor.editor_command("get_lines_list", [])
|
||||
elif evname == "result:get_building_types":
|
||||
print(evname, args)
|
||||
var btypes = args[0]
|
||||
$"%building_type".clear()
|
||||
for k in btypes.keys():
|
||||
$"%building_type".add_item(k)
|
||||
elif evname == "editor_camera_moved":
|
||||
$Area.global_transform.origin.x = $Camera.global_transform.origin.x
|
||||
$Area.global_transform.origin.z = $Camera.global_transform.origin.z
|
||||
# if evname == "mode_change_pre":
|
||||
# var mode_prev = args[0]
|
||||
# if mode_prev == -1:
|
||||
# for k in vmode.keys():
|
||||
# vmode[k].hide()
|
||||
# elif vmode.has(mode_prev):
|
||||
# vmode[mode_prev].hide()
|
||||
# elif evname == "mode_change_post":
|
||||
# var mode_next = args[1]
|
||||
# if vmode.has(mode_next):
|
||||
# vmode[mode_next].show()
|
||||
# if mode_next == 2:
|
||||
# $WorldEditor.editor_command("get_building_types", [])
|
||||
# elif mode_next == 6:
|
||||
# $WorldEditor.editor_command("get_lines_list", [])
|
||||
# elif evname == "result:get_building_types":
|
||||
# pass
|
||||
# print(evname, args)
|
||||
# var btypes = args[0]
|
||||
# $"%building_type".clear()
|
||||
# for k in btypes.keys():
|
||||
# $"%building_type".add_item(k)
|
||||
# if evname == "editor_camera_moved":
|
||||
# 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":
|
||||
# check_edit_building()
|
||||
elif evname in ignore_events:
|
||||
pass
|
||||
else:
|
||||
breakpoint
|
||||
# elif evname in ignore_events:
|
||||
# pass
|
||||
# else:
|
||||
# breakpoint
|
||||
#func mouse_drag(position):
|
||||
# if $WorldEditor.get_current_mode() != 2:
|
||||
# return
|
||||
@@ -154,7 +159,7 @@ func editor_event(evname: String, args: Array):
|
||||
# selected_building_xform = xform
|
||||
|
||||
#var selected_building
|
||||
var selected_building_xform
|
||||
#var selected_building_xform
|
||||
#func select_building(xform, id, mid):
|
||||
# selected_building = id
|
||||
# selected_building_xform = xform
|
||||
@@ -168,14 +173,14 @@ var selected_building_xform
|
||||
# if !$"%building_cursor".visible:
|
||||
# $"%building_cursor".show()
|
||||
# $"%building_cursor".global_transform.origin = xform.origin
|
||||
func _process(delta):
|
||||
#func _process(delta):
|
||||
# if Input.is_action_just_pressed("editor_cam1"):
|
||||
# setup_cam1()
|
||||
# if Input.is_action_just_pressed("editor_cam2"):
|
||||
# setup_cam2()
|
||||
# if Input.is_action_just_pressed("editor_cam3"):
|
||||
# setup_cam3()
|
||||
var mode = $"%buildings_edit_mode".selected
|
||||
# var mode = $"%buildings_edit_mode".selected
|
||||
# if mode == 2:
|
||||
# $"%building_rot_cursor".global_transform = selected_building_xform
|
||||
# if !$"%building_rot_cursor".visible:
|
||||
@@ -232,10 +237,10 @@ func _process(delta):
|
||||
## drag_delay -= delta
|
||||
#var motion = Vector2()
|
||||
#var old_mouse_pos = Vector2(-1, -1)
|
||||
var rotation_y = 0
|
||||
#var rotation_y = 0
|
||||
#var dragging = false
|
||||
#var drag_delay = 0.2
|
||||
var drag_start = Vector3()
|
||||
#var drag_start = Vector3()
|
||||
#func _unhandled_input(event):
|
||||
# var editor_mode = $WorldEditor.get_current_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])
|
||||
# $building_rot_cursor.global_transform = xform
|
||||
# selected_building_xform = xform
|
||||
func _physics_process(delta):
|
||||
assert($WorldEditor is WorldEditor)
|
||||
#func _physics_process(delta):
|
||||
# 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.png" type="Image" id=3]
|
||||
[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 )
|
||||
|
||||
[node name="editor" type="Spatial"]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="WorldEditor" type="WorldEditor" parent="."]
|
||||
|
||||
@@ -124,7 +122,7 @@ text = "NPC Mode"
|
||||
unique_name_in_owner = true
|
||||
margin_top = 206.0
|
||||
margin_right = 248.0
|
||||
margin_bottom = 374.0
|
||||
margin_bottom = 482.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_buildings"]
|
||||
margin_right = 248.0
|
||||
@@ -184,11 +182,26 @@ margin_right = 248.0
|
||||
margin_bottom = 168.0
|
||||
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"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 378.0
|
||||
margin_top = 486.0
|
||||
margin_right = 248.0
|
||||
margin_bottom = 400.0
|
||||
margin_bottom = 508.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_navigation"]
|
||||
margin_right = 248.0
|
||||
@@ -202,9 +215,9 @@ text = "Navigation mode"
|
||||
|
||||
[node name="v_poi" type="VBoxContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 404.0
|
||||
margin_top = 512.0
|
||||
margin_right = 248.0
|
||||
margin_bottom = 426.0
|
||||
margin_bottom = 534.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_poi"]
|
||||
margin_right = 248.0
|
||||
@@ -218,9 +231,9 @@ text = "POI mode"
|
||||
|
||||
[node name="v_road_lines" type="VBoxContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 430.0
|
||||
margin_top = 538.0
|
||||
margin_right = 248.0
|
||||
margin_bottom = 1080.0
|
||||
margin_bottom = 1188.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_road_lines"]
|
||||
margin_right = 248.0
|
||||
@@ -270,7 +283,7 @@ margin_left = 79.0
|
||||
margin_right = 124.0
|
||||
margin_bottom = 20.0
|
||||
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
|
||||
|
||||
[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"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 1084.0
|
||||
margin_top = 1192.0
|
||||
margin_right = 248.0
|
||||
margin_bottom = 1106.0
|
||||
margin_bottom = 1214.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_npc"]
|
||||
margin_right = 248.0
|
||||
@@ -540,12 +553,13 @@ far = 1000.0
|
||||
[node name="DirectionalLight" type="DirectionalLight" parent="."]
|
||||
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_mask = 32768
|
||||
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 )
|
||||
shape = SubResource( 9 )
|
||||
|
||||
|
||||
@@ -144,6 +144,7 @@ static std::vector<Object *> ui_handlers;
|
||||
BuildingsEditor::BuildingsEditor(WorldEditor *editor)
|
||||
: editor(editor)
|
||||
, selected_building(-1)
|
||||
, active(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -156,6 +157,9 @@ void BuildingsEditor::exit()
|
||||
void BuildingsEditor::activate()
|
||||
{
|
||||
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");
|
||||
Array args;
|
||||
ui_handlers.push_back(memnew(HandleButton(
|
||||
@@ -165,9 +169,24 @@ void BuildingsEditor::activate()
|
||||
int i;
|
||||
for (i = 0; i < (int)ui_handlers.size(); i++)
|
||||
assert(ui_handlers[i]);
|
||||
active = true;
|
||||
/* TODO: make separate function for this */
|
||||
EditorEvent::get_singleton()->event.add_listener(
|
||||
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()
|
||||
@@ -200,6 +219,8 @@ void BuildingsEditor::event_handler(const String &event, const Array &args)
|
||||
get_as_node<Spatial>("%building_rot_cursor")
|
||||
->set_global_transform(selected_building_xform);
|
||||
}
|
||||
} else if (event == "result:get_building_types") {
|
||||
/* TODO: replace with direct data access */
|
||||
}
|
||||
print_line("buildings::" + event);
|
||||
}
|
||||
|
||||
@@ -207,19 +207,18 @@ void RoadLinesData::index_lines(
|
||||
std::vector<Vector3> &road_lines_nodes)
|
||||
{
|
||||
List<String> keys;
|
||||
RoadLinesData *rld = RoadLinesData::get_singleton();
|
||||
rld->get_road_lines_key_list(&keys);
|
||||
get_road_lines_key_list(&keys);
|
||||
List<String>::Element *e = keys.front();
|
||||
while (e) {
|
||||
String rkey = e->get();
|
||||
struct RoadLinesData::road_line &pt = rld->lines[rkey];
|
||||
struct RoadLinesData::road_line &pt = lines[rkey];
|
||||
pt.indices.clear();
|
||||
e = e->next();
|
||||
}
|
||||
e = keys.front();
|
||||
while (e) {
|
||||
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_nodes);
|
||||
e = e->next();
|
||||
@@ -481,28 +480,10 @@ void RoadLinesData::process_lines(
|
||||
&road_lines_nodes_hash,
|
||||
std::vector<Vector3> &road_lines_nodes)
|
||||
{
|
||||
int i;
|
||||
get_debug_node()->clear();
|
||||
index_lines(road_lines_nodes_hash, road_lines_nodes);
|
||||
insert_close_points(road_lines_nodes, 160.0f);
|
||||
update_road_lines_nodes(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)
|
||||
|
||||
@@ -7,7 +7,6 @@ class RoadLinesData {
|
||||
String road_lines_path;
|
||||
uint32_t road_lines_hash(const Vector3 &v);
|
||||
static ImmediateGeometry *debug_im;
|
||||
static ImmediateGeometry *get_debug_node();
|
||||
|
||||
protected:
|
||||
RoadLinesData();
|
||||
@@ -15,6 +14,7 @@ protected:
|
||||
_Signal<void> lines_updated;
|
||||
|
||||
public:
|
||||
static ImmediateGeometry *get_debug_node();
|
||||
struct road_line {
|
||||
std::vector<Transform> points;
|
||||
std::vector<int> indices;
|
||||
@@ -38,6 +38,7 @@ public:
|
||||
int get_debug_flags() const;
|
||||
|
||||
private:
|
||||
void create_segments_from_lines();
|
||||
void index_lines(std::unordered_map<uint32_t, std::vector<Vector3> >
|
||||
&road_lines_nodes_hash,
|
||||
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");
|
||||
if (current_line.ends_with("_road") && update_roads)
|
||||
rebuild_roads();
|
||||
} else if (event == "result:get_building_types") {
|
||||
/* TODO:: implement */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,6 +94,11 @@ struct RoadLinesProcessing {
|
||||
}
|
||||
e = e->next();
|
||||
}
|
||||
}
|
||||
void sort_neighbors()
|
||||
{
|
||||
int i;
|
||||
/* sort neighbors by angle */
|
||||
for (i = 0; i < (int)nodes.size(); i++) {
|
||||
std::sort(
|
||||
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)
|
||||
{
|
||||
Vector2 rv = Vector2(v.x, v.z).tangent();
|
||||
@@ -197,6 +268,7 @@ struct RoadLinesProcessing {
|
||||
}
|
||||
void road_setup()
|
||||
{
|
||||
int i, j;
|
||||
RoadLinesData *rld = RoadLinesData::get_singleton();
|
||||
std::vector<Vector3> road_lines_nodes;
|
||||
std::unordered_map<uint32_t, std::vector<Vector3> >
|
||||
@@ -207,8 +279,70 @@ struct RoadLinesProcessing {
|
||||
rld->process_lines(road_lines_nodes_hash, road_lines_nodes);
|
||||
create_nodes(road_lines_nodes);
|
||||
create_edges();
|
||||
optimize_nodes(16.0f);
|
||||
sort_neighbors();
|
||||
wedges.clear();
|
||||
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");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -51,6 +51,7 @@ WorldEditor::WorldEditor()
|
||||
InputMap::get_singleton()->add_action("mouse1");
|
||||
EditorEvent::get_singleton()->event.add_listener(
|
||||
this, &WorldEditor::event_signal_handler);
|
||||
print_line("constructed");
|
||||
}
|
||||
|
||||
WorldEditor::~WorldEditor()
|
||||
@@ -65,6 +66,7 @@ WorldEditor::~WorldEditor()
|
||||
memdelete(buildings_editor);
|
||||
buildings_editor = nullptr;
|
||||
}
|
||||
print_line("destructed");
|
||||
}
|
||||
|
||||
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_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)
|
||||
{
|
||||
Array change;
|
||||
@@ -166,8 +175,11 @@ void WorldEditor::tools_button(const String &button)
|
||||
print_line("tools_button: " + button);
|
||||
if (modes.find(button) == modes.end())
|
||||
goto end;
|
||||
assert(modes[button] >= 0);
|
||||
if (current_mode == modes[button])
|
||||
goto end;
|
||||
print_line("mode change: " + itos(current_mode) + " " +
|
||||
itos(modes[button]));
|
||||
change[0] = current_mode;
|
||||
change[1] = modes[button];
|
||||
EditorEvent::get_singleton()->event.emit("mode_change_pre", change);
|
||||
@@ -197,7 +209,9 @@ void WorldEditor::tools_button(const String &button)
|
||||
break;
|
||||
}
|
||||
EditorEvent::get_singleton()->event.emit("mode_change_post", change);
|
||||
assert(modes[button] >= 0);
|
||||
current_mode = modes[button];
|
||||
assert(current_mode >= 0);
|
||||
end:;
|
||||
}
|
||||
|
||||
@@ -269,6 +283,50 @@ int WorldEditor::get_current_mode() const
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -287,6 +345,9 @@ void WorldEditor::_notification(int which)
|
||||
{
|
||||
switch (which) {
|
||||
case NOTIFICATION_ENTER_TREE: {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
Node *base = get_parent();
|
||||
int count = base->get_child_count();
|
||||
int i;
|
||||
@@ -303,6 +364,24 @@ void WorldEditor::_notification(int which)
|
||||
"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_physics_process(true);
|
||||
Spatial *cursor = Object::cast_to<Spatial>(
|
||||
@@ -319,6 +398,9 @@ void WorldEditor::_notification(int which)
|
||||
set_process_unhandled_input(false);
|
||||
break;
|
||||
case NOTIFICATION_PHYSICS_PROCESS: {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
if (!is_inside_tree())
|
||||
return;
|
||||
Camera *cam = get_viewport()->get_camera();
|
||||
@@ -359,7 +441,6 @@ void WorldEditor::_notification(int which)
|
||||
buildings_editor->update(delta);
|
||||
break;
|
||||
case MODE_ROAD_LINES:
|
||||
// print_line("current_mode: " + itos(current_mode));
|
||||
road_lines_editor->update(delta);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user