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() $"%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) 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() 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 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 if camera_mode == 3: match editor_mode: 2: check_edit_building() func check_edit_building(): var mode = $"%buildings_edit_mode".selected 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 elif Input.is_action_pressed("mouse1"): # Moving/rotating buildings if mode in [1, 2]: if ((mode == 1 && drag_delay < 0.0) || mode == 2) && !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 if 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 $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() var camera_mode = $WorldEditor.get_camera_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 var camera_mode = $WorldEditor.get_camera_mode() 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(): var camera_mode = $WorldEditor.get_camera_mode() Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if camera_mode == -1: $Camera.global_transform.origin.y = 80.0 $WorldEditor.set_camera_mode(2) $Camera.global_transform.basis = Basis().rotated(Vector3(1, 0, 0), -PI / 4.0) func setup_cam3(): Input.mouse_mode = Input.MOUSE_MODE_VISIBLE $WorldEditor.set_camera_mode(3)