Implemented structure relocation
This commit is contained in:
203
godot/main/editor.gd
Normal file
203
godot/main/editor.gd
Normal file
@@ -0,0 +1,203 @@
|
||||
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",
|
||||
}
|
||||
|
||||
func _ready():
|
||||
for b in [
|
||||
$"%select_buildings",
|
||||
$"%select_navigation",
|
||||
$"%select_poi",
|
||||
$"%select_road_lines",
|
||||
$"%select_npc",
|
||||
]:
|
||||
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()
|
||||
|
||||
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()
|
||||
elif evname == "result:get_closest_building":
|
||||
print(evname, args)
|
||||
select_building(args[0], args[3])
|
||||
else:
|
||||
breakpoint
|
||||
var selected_building
|
||||
var selected_building_xform
|
||||
func select_building(xform, id):
|
||||
selected_building = id
|
||||
selected_building_xform = xform
|
||||
print("selected id: ", id)
|
||||
if !$building_cursor.visible:
|
||||
$building_cursor.show()
|
||||
$building_cursor.global_transform.origin = xform.origin
|
||||
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()
|
||||
if dragging:
|
||||
if !Input.is_action_pressed("mouse1"):
|
||||
dragging = false
|
||||
drag_delay = 0.2
|
||||
else:
|
||||
var position = get_viewport().get_mouse_position()
|
||||
var camera = get_viewport().get_camera()
|
||||
var start = camera.project_ray_origin(position)
|
||||
var normal = camera.project_ray_normal(position)
|
||||
var end = start + normal * camera.get_zfar()
|
||||
var space_state = get_world().direct_space_state
|
||||
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
|
||||
if result.has("collider"):
|
||||
var proj = result.position
|
||||
if $"%buildings_edit_mode".selected == 1:
|
||||
print(proj)
|
||||
var newpos = proj
|
||||
newpos.x = stepify(newpos.x, 2.0)
|
||||
newpos.z = stepify(newpos.z, 2.0)
|
||||
var gen: VoxelGeneratorImgMapper = $VoxelLodTerrain.generator
|
||||
var hpos = gen.get_height_full(newpos)
|
||||
newpos.y = hpos
|
||||
$WorldEditor.editor_command("update_building_transform", [selected_building, Transform(selected_building_xform.basis, newpos)])
|
||||
selected_building_xform = Transform(selected_building_xform.basis, newpos)
|
||||
$building_cursor.global_transform.origin = newpos
|
||||
var motion = Vector2()
|
||||
var old_mouse_pos = Vector2(-1, -1)
|
||||
var rotation_y = 0
|
||||
var dragging = false
|
||||
var drag_delay = 0.2
|
||||
var drag_start = Vector3()
|
||||
func _unhandled_input(event):
|
||||
var editor_mode = $WorldEditor.get_current_mode()
|
||||
if camera_mode in [2, 3]:
|
||||
if event is InputEventMouseMotion:
|
||||
motion = event.relative
|
||||
if camera_mode == 3:
|
||||
match editor_mode:
|
||||
2:
|
||||
check_edit_building()
|
||||
func check_edit_building():
|
||||
if Input.is_action_just_pressed("mouse1"):
|
||||
var position = get_viewport().get_mouse_position()
|
||||
# var proj = get_viewport().get_camera().project_position(position, $cam.global_transform.origin.y + position.y * 0.5)
|
||||
# print(position, proj)
|
||||
# proj = get_viewport().get_camera().project_ray_origin(position)
|
||||
# proj.y = 0
|
||||
# proj.x = stepify(proj.x, 100.0)
|
||||
# proj.z = stepify(proj.z, 100.0)
|
||||
# var mouse_pos = get_viewport().get_mouse_position()
|
||||
var camera = get_viewport().get_camera()
|
||||
var start = camera.project_ray_origin(position)
|
||||
var normal = camera.project_ray_normal(position)
|
||||
var end = start + normal * camera.get_zfar()
|
||||
var space_state = get_world().direct_space_state
|
||||
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
|
||||
if result.has("collider"):
|
||||
var proj = result.position
|
||||
if $"%buildings_edit_mode".selected == 0:
|
||||
print("get closest building")
|
||||
$WorldEditor.editor_command("get_closest_building", [Transform(Basis(), proj)])
|
||||
elif Input.is_action_pressed("mouse1"):
|
||||
if $"%buildings_edit_mode".selected == 1:
|
||||
if drag_delay < 0.0:
|
||||
dragging = true
|
||||
var position = get_viewport().get_mouse_position()
|
||||
var camera = get_viewport().get_camera()
|
||||
var start = camera.project_ray_origin(position)
|
||||
var normal = camera.project_ray_normal(position)
|
||||
var end = start + normal * camera.get_zfar()
|
||||
var space_state = get_world().direct_space_state
|
||||
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
|
||||
if result.has("collider"):
|
||||
var proj = result.position
|
||||
if $"%buildings_edit_mode".selected == 1:
|
||||
drag_start = proj
|
||||
else:
|
||||
drag_delay -= get_process_delta_time()
|
||||
else:
|
||||
dragging = false
|
||||
drag_delay = 0.2
|
||||
else:
|
||||
dragging = false
|
||||
drag_delay = 0.2
|
||||
func _physics_process(delta):
|
||||
var editor_mode = $WorldEditor.get_current_mode()
|
||||
if camera_mode == 1:
|
||||
var mouse_pos = get_viewport().get_mouse_position()
|
||||
if old_mouse_pos.x < 0:
|
||||
old_mouse_pos = mouse_pos
|
||||
motion = Vector2()
|
||||
else:
|
||||
motion = mouse_pos - old_mouse_pos
|
||||
old_mouse_pos = mouse_pos
|
||||
var moved = false
|
||||
match camera_mode:
|
||||
1:
|
||||
var xx = Input.get_axis("left", "right")
|
||||
var zz = Input.get_axis("backward", "forward")
|
||||
var hh = Input.get_axis("action2", "action")
|
||||
var h = $Camera.global_transform.origin.y
|
||||
if abs(zz) > 0.1:
|
||||
$Camera.global_transform.origin.z -= abs(h) * zz * delta
|
||||
moved = true
|
||||
if abs(xx) > 0.1:
|
||||
$Camera.global_transform.origin.x += abs(h) * xx * delta
|
||||
moved = true
|
||||
if abs(hh) > 0.1 && abs(xx) < 0.1 && abs(zz) < 0.1:
|
||||
$Camera.global_transform.origin.y += 10 * hh * delta
|
||||
moved = true
|
||||
2:
|
||||
var h = $Camera.global_transform.origin.y
|
||||
var xx = motion.x
|
||||
$Camera.rotate_y(-xx * 0.005)
|
||||
var offset = -$Camera.global_transform.basis.z * 10.0 * delta
|
||||
offset.y = 0
|
||||
var hh = Input.get_axis("action2", "action")
|
||||
if abs(hh) > 0.1:
|
||||
$Camera.global_transform.origin.y += 10 * hh * delta
|
||||
moved = true
|
||||
var zz = Input.get_axis("backward", "forward")
|
||||
if abs(zz) > 0.1:
|
||||
$Camera.global_transform.origin += zz * abs(h) * offset
|
||||
moved = true
|
||||
motion = Vector2()
|
||||
if moved:
|
||||
$Area.global_transform.origin.x = $Camera.global_transform.origin.x
|
||||
$Area.global_transform.origin.z = $Camera.global_transform.origin.z
|
||||
func setup_cam1():
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
camera_mode = 1
|
||||
if camera_mode == -1:
|
||||
$Camera.global_transform.origin.y = 80.0
|
||||
$Camera.global_transform.basis = Basis().rotated(Vector3(1, 0, 0), -PI / 2.0)
|
||||
func setup_cam2():
|
||||
camera_mode = 2
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
if camera_mode == -1:
|
||||
$Camera.global_transform.origin.y = 80.0
|
||||
$Camera.global_transform.basis = Basis().rotated(Vector3(1, 0, 0), -PI / 4.0)
|
||||
func setup_cam3():
|
||||
camera_mode = 3
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
@@ -1,5 +1,244 @@
|
||||
[gd_scene format=2]
|
||||
[gd_scene load_steps=14 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]
|
||||
|
||||
[sub_resource type="VoxelGeneratorImgMapper" id=5]
|
||||
height_start = -150.0
|
||||
height_range = 300.0
|
||||
image_bg = ExtResource( 3 )
|
||||
image_overlay = ExtResource( 4 )
|
||||
image_draw = ExtResource( 2 )
|
||||
|
||||
[sub_resource type="VoxelMesherTransvoxel" id=6]
|
||||
|
||||
[sub_resource type="ORMSpatialMaterial" id=7]
|
||||
albedo_color = Color( 0.254902, 0.886275, 0.101961, 1 )
|
||||
|
||||
[sub_resource type="ProceduralSky" id=4]
|
||||
|
||||
[sub_resource type="Environment" id=8]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 4 )
|
||||
|
||||
[sub_resource type="BoxShape" id=9]
|
||||
extents = Vector3( 550, 0.1, 550 )
|
||||
|
||||
[sub_resource type="CubeMesh" id=10]
|
||||
size = Vector3( 5, 120, 5 )
|
||||
|
||||
[sub_resource type="SpatialMaterial" id=11]
|
||||
flags_transparent = true
|
||||
albedo_color = Color( 0.698039, 0.192157, 0.101961, 0.427451 )
|
||||
emission_enabled = true
|
||||
emission = Color( 0.894118, 0.0980392, 0.0980392, 1 )
|
||||
emission_energy = 1.0
|
||||
emission_operator = 0
|
||||
emission_on_uv2 = false
|
||||
|
||||
[sub_resource type="BoxShape" id=12]
|
||||
extents = Vector3( 50, 1, 50 )
|
||||
|
||||
[node name="editor" type="Spatial"]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="WorldEditor" type="WorldEditor" parent="."]
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
anchor_left = 1.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = -160.0
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="VBoxContainer"]
|
||||
margin_right = 160.0
|
||||
margin_bottom = 30.0
|
||||
rect_min_size = Vector2( 160, 30 )
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 5
|
||||
color = Color( 0.25098, 0.25098, 0.25098, 1 )
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/ColorRect"]
|
||||
margin_left = 39.0
|
||||
margin_top = 8.0
|
||||
margin_right = 118.0
|
||||
margin_bottom = 22.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 7
|
||||
text = "Mode select"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="select_buildings" type="Button" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 34.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 54.0
|
||||
text = "Buildings Mode"
|
||||
|
||||
[node name="select_navigation" type="Button" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 58.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 78.0
|
||||
text = "Navigation Mode"
|
||||
|
||||
[node name="select_poi" type="Button" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 82.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 102.0
|
||||
text = "POI Mode"
|
||||
|
||||
[node name="select_road_lines" type="Button" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 106.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 126.0
|
||||
text = "Road Lines Mode"
|
||||
|
||||
[node name="select_npc" type="Button" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 130.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 150.0
|
||||
text = "NPC Mode"
|
||||
|
||||
[node name="v_buildings" type="VBoxContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 154.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 224.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_buildings"]
|
||||
margin_right = 160.0
|
||||
margin_bottom = 4.0
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/v_buildings"]
|
||||
margin_top = 8.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 22.0
|
||||
text = "Buildings mode"
|
||||
|
||||
[node name="buildings_edit_mode" type="OptionButton" parent="VBoxContainer/v_buildings"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 26.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 46.0
|
||||
text = "Select"
|
||||
items = [ "Select", null, false, 0, null, "Move", null, false, 1, null, "Rotate", null, false, 2, null ]
|
||||
selected = 0
|
||||
|
||||
[node name="building_type" type="OptionButton" parent="VBoxContainer/v_buildings"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 50.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 70.0
|
||||
text = "Building Type"
|
||||
|
||||
[node name="v_navigation" type="VBoxContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 228.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 250.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_navigation"]
|
||||
margin_right = 160.0
|
||||
margin_bottom = 4.0
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/v_navigation"]
|
||||
margin_top = 8.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 22.0
|
||||
text = "Navigation mode"
|
||||
|
||||
[node name="v_poi" type="VBoxContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 254.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 276.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_poi"]
|
||||
margin_right = 160.0
|
||||
margin_bottom = 4.0
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/v_poi"]
|
||||
margin_top = 8.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 22.0
|
||||
text = "POI mode"
|
||||
|
||||
[node name="v_road_lines" type="VBoxContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 280.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 302.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_road_lines"]
|
||||
margin_right = 160.0
|
||||
margin_bottom = 4.0
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/v_road_lines"]
|
||||
margin_top = 8.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 22.0
|
||||
text = "Road Lines mode"
|
||||
|
||||
[node name="v_npc" type="VBoxContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 306.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 328.0
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/v_npc"]
|
||||
margin_right = 160.0
|
||||
margin_bottom = 4.0
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/v_npc"]
|
||||
margin_top = 8.0
|
||||
margin_right = 160.0
|
||||
margin_bottom = 22.0
|
||||
text = "NPC mode"
|
||||
|
||||
[node name="StreamWorld" type="StreamWorld" parent="."]
|
||||
|
||||
[node name="VoxelLodTerrain" type="VoxelLodTerrain" parent="."]
|
||||
generator = SubResource( 5 )
|
||||
mesher = SubResource( 6 )
|
||||
voxel_bounds = AABB( -5.36871e+08, -2048, -5.36871e+08, 1.07374e+09, 4096, 1.07374e+09 )
|
||||
lod_count = 5
|
||||
material = SubResource( 7 )
|
||||
|
||||
[node name="Camera" type="Camera" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0 )
|
||||
environment = SubResource( 8 )
|
||||
far = 1000.0
|
||||
|
||||
[node name="VoxelViewer" type="VoxelViewer" parent="Camera"]
|
||||
|
||||
[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="."]
|
||||
collision_layer = 32768
|
||||
collision_mask = 32768
|
||||
monitoring = false
|
||||
|
||||
[node name="CollisionShape" type="CollisionShape" parent="Area"]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.1, 0 )
|
||||
shape = SubResource( 9 )
|
||||
|
||||
[node name="building_cursor" type="MeshInstance" parent="."]
|
||||
mesh = SubResource( 10 )
|
||||
material/0 = SubResource( 11 )
|
||||
|
||||
[node name="Area" type="Area" parent="building_cursor"]
|
||||
collision_layer = 32768
|
||||
collision_mask = 32768
|
||||
monitoring = false
|
||||
|
||||
[node name="CollisionShape" type="CollisionShape" parent="building_cursor/Area"]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2, 0 )
|
||||
shape = SubResource( 12 )
|
||||
|
||||
Reference in New Issue
Block a user