219 lines
7.2 KiB
GDScript
219 lines
7.2 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 _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()
|
|
|
|
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 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)
|
|
else:
|
|
breakpoint
|
|
var selected_building
|
|
var selected_building_xform
|
|
func select_building(xform, id, mid):
|
|
selected_building = id
|
|
selected_building_xform = xform
|
|
print("selected id: ", id)
|
|
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()
|
|
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"):
|
|
# Moving buildings
|
|
if $"%buildings_edit_mode".selected == 1:
|
|
if drag_delay < 0.0 && !dragging:
|
|
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
|
|
drag_start = proj
|
|
$WorldEditor.editor_command("buildings_checkpoint", [])
|
|
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
|