Files
streaming_world/godot/main/editor.gd

266 lines
9.3 KiB
GDScript

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 change_building_type(index):
var item = $"%building_type".get_item_text(index)
$WorldEditor.editor_command("change_building_type", [selected_building, item])
func _ready():
for b in [
$"%select_buildings",
$"%select_navigation",
$"%select_poi",
$"%select_road_lines",
$"%select_npc",
$"%buildings_save",
]:
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()
$"%building_type".connect("item_selected", self, "change_building_type")
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_closest_building":
print(evname, args)
select_building(args[0], args[3], args[4])
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
# elif evname == "edit_update_building":
# check_edit_building()
elif evname == "mouse_press":
mouse_press(args[0])
elif evname == "mouse_drag":
mouse_drag(args[0])
elif evname == "mouse_drag_on":
pass
elif evname == "mouse_drag_off":
pass
elif evname == "line_cursor_motion":
pass
else:
breakpoint
func mouse_drag(position):
if $WorldEditor.get_current_mode() != 2:
return
if $WorldEditor.get_camera_mode() != 3:
return
# breakpoint
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
var mode = $"%buildings_edit_mode".selected
if mode == 1:
# move
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
elif mode == 2:
# rotate
var m = proj
m.y = selected_building_xform.origin.y
var xform = selected_building_xform.looking_at(m, Vector3.UP)
$WorldEditor.editor_command("update_building_transform", [selected_building, xform])
$building_rot_cursor.global_transform = xform
selected_building_xform = xform
func mouse_press(position):
if $WorldEditor.get_current_mode() != 2:
return
if $WorldEditor.get_camera_mode() != 3:
return
# breakpoint
# dragging = true
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
drag_start = proj
var mode = $"%buildings_edit_mode".selected
if mode == 0:
print("get closest building")
$WorldEditor.editor_command("get_closest_building", [Transform(Basis(), proj)])
elif mode == 1:
$WorldEditor.editor_command("checkpoint", [])
elif mode == 2:
$WorldEditor.editor_command("checkpoint", [])
var m = proj
m.y = selected_building_xform.origin.y
var xform = selected_building_xform.looking_at(m, Vector3.UP)
$WorldEditor.editor_command("update_building_transform", [selected_building, xform])
$building_rot_cursor.global_transform = xform
selected_building_xform = xform
var selected_building
var selected_building_xform
func select_building(xform, id, mid):
selected_building = id
selected_building_xform = xform
print("selected id: ", id)
$WorldEditor.select_building(xform, id, mid)
# for h in range($"%building_type".get_item_count()):
# var item = $"%building_type".get_item_text(h)
# if item == mid:
# $"%building_type".select(h)
# break
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()
var mode = $"%buildings_edit_mode".selected
if mode == 2:
$building_rot_cursor.global_transform = selected_building_xform
if !$building_rot_cursor.visible:
$building_rot_cursor.show()
else:
if $building_rot_cursor.visible:
$building_rot_cursor.hide()
# 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 mode == 1:
# # move
# 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
# elif mode == 2:
# # rotate
# var m = proj
# m.y = selected_building_xform.origin.y
# var xform = selected_building_xform.looking_at(m, Vector3.UP)
# $WorldEditor.editor_command("update_building_transform", [selected_building, xform])
# $building_rot_cursor.global_transform = xform
# selected_building_xform = xform
## var o = selected_building_xform.origin
## var m = proj
## o.y = 0
## m.y = 0
## var d = m - o
## var rot: float = -0.01 * d.x * delta
## var basis: Basis = selected_building_xform.basis
## var pos: Vector3 = selected_building_xform.origin
## var xform = Transform(basis.rotated(Vector3.UP, rot), pos)
## $WorldEditor.editor_command("update_building_transform", [selected_building, xform])
## selected_building_xform = xform
## if drag_delay >= 0:
## drag_delay -= delta
#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()
# var camera_mode = $WorldEditor.get_camera_mode()
# if camera_mode in [2, 3]:
# if event is InputEventMouseMotion:
# motion = event.relative
#func check_edit_building():
# var mode = $"%buildings_edit_mode".selected
# breakpoint
# 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 mode == 0:
# print("get closest building")
# $WorldEditor.editor_command("get_closest_building", [Transform(Basis(), proj)])
# elif mode == 2:
# var m = proj
# m.y = selected_building_xform.origin.y
# var xform = selected_building_xform.looking_at(m, Vector3.UP)
# $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)